(MESS) nes: added support for Multi-Discrete PCB (aka Mapper 28) used

by Action 53 - Function 16 - Volume ONE - "Streemerz Bundle" homebrew
multicart. [Fabio Priuli]
This commit is contained in:
Fabio Priuli 2014-02-06 17:44:32 +00:00
parent d04e52ebcc
commit 63dd624665
9 changed files with 251 additions and 1 deletions

2
.gitattributes vendored
View File

@ -8126,6 +8126,8 @@ src/mess/machine/ne1000.h svneol=native#text/plain
src/mess/machine/ne2000.c svneol=native#text/plain
src/mess/machine/ne2000.h svneol=native#text/plain
src/mess/machine/nes.c svneol=native#text/plain
src/mess/machine/nes_act53.c svneol=native#text/plain
src/mess/machine/nes_act53.h svneol=native#text/plain
src/mess/machine/nes_ave.c svneol=native#text/plain
src/mess/machine/nes_ave.h svneol=native#text/plain
src/mess/machine/nes_bandai.c svneol=native#text/plain

View File

@ -1016,6 +1016,7 @@ SLOT_INTERFACE_START(nes_cart)
SLOT_INTERFACE_INTERNAL("bmc_830118c", NES_BMC_830118C)
SLOT_INTERFACE_INTERNAL("pjoy84", NES_PJOY84)
SLOT_INTERFACE_INTERNAL("nocash_nochr", NES_NOCHR)
SLOT_INTERFACE_INTERNAL("nes_action53", NES_ACTION53)
// other unsupported...
SLOT_INTERFACE_INTERNAL("ninjaryu", NES_NROM) // mapper 111 - UNSUPPORTED
SLOT_INTERFACE_INTERNAL("unl_dance", NES_NROM) // UNSUPPORTED

View File

@ -33,6 +33,7 @@
#include "machine/nes_sunsoft_dcs.h"
#include "machine/nes_taito.h"
// unlicensed/bootleg/pirate PCBs
#include "machine/nes_act53.h"
#include "machine/nes_ave.h"
#include "machine/nes_benshieng.h"
#include "machine/nes_camerica.h"

View File

@ -0,0 +1,207 @@
/***********************************************************************************************************
NES/Famicom cartridge emulation for Action 53
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
Here we emulate the Multi-Discrete PCB designed by Tepples for
this homebew multicart [mapper 28]
***********************************************************************************************************/
#include "emu.h"
#include "machine/nes_act53.h"
#ifdef NES_PCB_DEBUG
#define VERBOSE 1
#else
#define VERBOSE 0
#endif
#define LOG_MMC(x) do { if (VERBOSE) logerror x; } while (0)
//-------------------------------------------------
// constructor
//-------------------------------------------------
const device_type NES_ACTION53 = &device_creator<nes_action53_device>;
nes_action53_device::nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: nes_nrom_device(mconfig, NES_ACTION53, "NES Cart Action 53 PCB", tag, owner, clock, "nes_action53", __FILE__)
{
}
void nes_action53_device::device_start()
{
common_start();
save_item(NAME(m_sel));
save_item(NAME(m_reg));
m_reg[0] = 0x00;
m_reg[1] = 0x0f;
m_reg[2] = 0x00;
m_reg[3] = 0x3f;
}
void nes_action53_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
// register content is not touched by reset
update_prg();
}
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
/*-------------------------------------------------
Board ACTION 53
In MESS: *VERY* preliminary support.
This board uses 4 registers (reg is selected by writes to 0x5xxx)
Info from nesdev wiki
R:$00: [...M ..CC]
C = CHR Reg
M = Mirroring
This bit overwrites bit 0 of R:$80, but only if bit 1 of
R:$80 is clear
R:$01: [...M PPPP]
P = PRG Reg
M = Mirroring
This bit overwrites bit 0 of R:$80, but only if bit 1 of
R:$80 is clear
R:$80: [..GG PSMM]
G = Game Size (0=32K, 1=64K, 2=128K, 3=256K)
P = PRG Size (0=32k mode, 1=16k mode)
S = Slot select:
0 = $C000 swappable, $8000 fixed to bottom of 32K outer bank
1 = $8000 swappable, $C000 fixed to top of 32K outer bank
This bit is ignored when 'P' is clear (32k mode)
M = Mirroring control:
%00 = 1ScA
%01 = 1ScB
%10 = Vert
%11 = Horz
R:$81: [..BB BBBB]
Outer PRG Reg
-------------------------------------------------*/
void nes_action53_device::update_prg()
{
UINT8 prg_lo = 0, prg_hi = 0, helper = 0;
UINT8 out = (m_reg[3] & 0x3f) << 1; // Outer PRG reg
UINT8 size = (m_reg[2] & 0x30) >> 4; // Game size
UINT8 mask = (1 << (size + 1)) - 1; // Bits to be taken from PRG reg
if (!BIT(m_reg[2], 3))
{
helper = (out & ~mask) | ((m_reg[1] << 1) & mask);
//32K mode
prg_lo = (helper & 0xfe);
prg_hi = (helper | 0x01);
}
else
{
helper = (out & ~mask) | (m_reg[1] & mask);
if (BIT(m_reg[2], 2))
{
//16K mode with fixed HI
prg_lo = helper;
prg_hi = (out | 0x01);
}
else
{
//16K mode with fixed LO
prg_lo = (out & 0xfe);
prg_hi = helper;
}
}
// printf("banks : 0x%2X - 0x%2X\n", prg_lo, prg_hi);
prg16_89ab(prg_lo);
prg16_cdef(prg_hi);
}
void nes_action53_device::update_mirr()
{
switch (m_reg[2] & 0x03)
{
case 0:
set_nt_mirroring(PPU_MIRROR_LOW);
break;
case 1:
set_nt_mirroring(PPU_MIRROR_HIGH);
break;
case 2:
set_nt_mirroring(PPU_MIRROR_VERT);
break;
case 3:
set_nt_mirroring(PPU_MIRROR_HORZ);
break;
}
}
WRITE8_MEMBER(nes_action53_device::write_l)
{
LOG_MMC(("action 53 write_l, offset: %04x, data: %02x\n", offset, data));
offset += 0x100;
if (offset >= 0x1000)
m_sel = BIT(data, 0) | (BIT(data, 7) << 1);
}
WRITE8_MEMBER(nes_action53_device::write_h)
{
LOG_MMC(("action 53 write_h, offset: %04x, data: %02x\n", offset, data));
if (m_reg[m_sel] != data)
{
m_reg[m_sel] = data;
switch (m_sel)
{
case 0:
if (!BIT(m_reg[2],1))
{
m_reg[2] &= 0xfe;
m_reg[2] |= BIT(data,4);
update_mirr();
}
chr8(m_reg[0] & 0x03, m_chr_source);
break;
case 1:
if (!BIT(m_reg[2],1))
{
m_reg[2] &= 0xfe;
m_reg[2] |= BIT(data,4);
update_mirr();
}
update_prg();
break;
case 2:
update_prg();
update_mirr();
break;
case 3:
update_prg();
break;
}
}
}

View File

@ -0,0 +1,36 @@
#ifndef __NES_ACTION53_H
#define __NES_ACTION53_H
#include "machine/nes_nxrom.h"
// ======================> nes_racermate_device
class nes_action53_device : public nes_nrom_device
{
public:
// construction/destruction
nes_action53_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start();
virtual DECLARE_WRITE8_MEMBER(write_l);
virtual DECLARE_WRITE8_MEMBER(write_h);
virtual void pcb_reset();
private:
void update_prg();
void update_mirr();
UINT8 m_sel;
UINT8 m_reg[4];
};
// device type definition
extern const device_type NES_ACTION53;
#endif

View File

@ -57,7 +57,7 @@ static const nes_mmc mmc_list[] =
{ 25, KONAMI_VRC4 },
{ 26, KONAMI_VRC6 },
{ 27, UNL_WORLDHERO }, // 27 World Hero board - Unsupported
// 28 Unused
{ 28, BTL_ACTION53 }, // 28 - Multi-discrete PCB designed by Tepples for Action 53
// 29 Unused
// 30 Unused
// 31 Unused

View File

@ -300,6 +300,7 @@ static const nes_pcb pcb_list[] =
{ "tf1201", UNL_TF1201 },
{ "unl_cfight", UNL_CITYFIGHT },
{ "nocash_nochr", NOCASH_NOCHR },
{ "nes_action53", BTL_ACTION53 },
{ "ffe3", FFE3_BOARD },
{ "ffe4", FFE4_BOARD },
{ "ffe8", FFE8_BOARD },

View File

@ -120,6 +120,7 @@ enum
KAY_BOARD, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD,
WHIRLWIND_2706,
NOCASH_NOCHR, // homebrew PCB design which uses NTRAM for CHRRAM
BTL_ACTION53, // homebrew PCB for homebrew multicarts
/* FFE boards, for mappers 6, 8, 17 */
FFE3_BOARD, FFE4_BOARD, FFE8_BOARD, TEST_BOARD,
/* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */

View File

@ -1535,6 +1535,7 @@ $(MESSOBJ)/nintendo.a: \
$(MESS_MACHINE)/nes_mmc3.o \
$(MESS_MACHINE)/nes_mmc3_clones.o \
$(MESS_MACHINE)/nes_mmc5.o \
$(MESS_MACHINE)/nes_act53.o \
$(MESS_MACHINE)/nes_ave.o \
$(MESS_MACHINE)/nes_bandai.o \
$(MESS_MACHINE)/nes_benshieng.o \