bus/nes: Continued work on VRC4 and clone boards. (#8713)

- Tweaked VRC4 class to make it easier to extend for clones and multicarts. The main new pieces are: a centralized and more flexible function for PRG banking and an overridable IRQ acknowledge function.
- Added support for 830506C board.
- Added support for unknown board for Yu Yu Hakusho/Dragon Ball Z 2-in-1.
- Made a small simplification to TF1201 using new IRQ function.

New working software list additions (nes.xml)
-----------------------------------
1994 Super HiK 4 in 1 (JY-005) [famiac, NewRisingSun]

Software list items promoted to working (nes.xml)
---------------------------------------
2 in 1 - Yu Yu + Dragonball Z
This commit is contained in:
0kmg 2021-10-17 07:45:09 -08:00 committed by GitHub
parent 7ed0317ddc
commit 317b122ecb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 257 additions and 101 deletions

View File

@ -51806,6 +51806,21 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
<software name="mc_4jy5">
<description>1994 Super HiK 4 in 1 (JY-005)</description>
<year>1994</year>
<publisher>J.Y. Company</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_830506c" />
<dataarea name="prg" size="524288">
<rom name="1994 super hik 4-in-1 (jy-005).prg" size="524288" crc="1dbfc8f0" sha1="52c89d70d7e6f122fa5daff07b93ffb3c9b0de57" status="baddump" />
</dataarea>
<dataarea name="chr" size="524288">
<rom name="1994 super hik 4-in-1 (jy-005).chr" size="524288" crc="6043ee99" sha1="314eb5cb09ebca1c2190e4916262bacc9ab32085" status="baddump" />
</dataarea>
</part>
</software>
<software name="mc_3jy7">
<description>1994 Super HiK 3 in 1 (JY-007)</description>
<year>1994</year>
@ -62295,14 +62310,12 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
<!-- FIXME: which board should this game use?? -->
<software name="2yudb" supported="no">
<software name="2yudb">
<description>2 in 1 - Yu Yu + Dragonball Z</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="unknown" />
<feature name="pcb" value="UNKNOWN" /> <!-- The iNES file uses Mapper 23?? -->
<feature name="slot" value="btl_2yudb" />
<dataarea name="prg" size="524288">
<rom name="2-in-1 - yuu yuu + dragonball z.prg" size="524288" crc="592175b3" sha1="4097d5a814308e39d592466b60b64862699cc22a" offset="00000" status="baddump" />
</dataarea>
@ -62746,6 +62759,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
<!-- This bootleg has various slowdown and flickering issues on real hardware and in MAME. -->
<software name="batmandy" cloneof="batman">
<description>Batman - The Video Game (Brazil, pirate)</description>
<year>1992?</year>

View File

@ -70,12 +70,12 @@ nes_konami_vrc3_device::nes_konami_vrc3_device(const machine_config &mconfig, co
{
}
nes_konami_vrc4_device::nes_konami_vrc4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, type, tag, owner, clock), m_latch(0), m_mmc_prg_bank(0), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), m_irq_enable_latch(0), m_irq_mode(0), m_irq_prescale(0), irq_timer(nullptr)
nes_konami_vrc4_device::nes_konami_vrc4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, type, tag, owner, clock), m_prg_flip(0), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), m_irq_enable_latch(0), m_irq_mode(0), m_irq_prescale(0), irq_timer(nullptr)
{
}
nes_konami_vrc4_device::nes_konami_vrc4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
nes_konami_vrc4_device::nes_konami_vrc4_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_konami_vrc4_device(mconfig, NES_VRC4, tag, owner, clock)
{
}
@ -166,7 +166,7 @@ void nes_konami_vrc4_device::device_start()
save_item(NAME(m_irq_enable_latch));
save_item(NAME(m_irq_count));
save_item(NAME(m_irq_count_latch));
save_item(NAME(m_latch));
save_item(NAME(m_prg_flip));
save_item(NAME(m_mmc_prg_bank));
save_item(NAME(m_mmc_vrom_bank));
}
@ -174,8 +174,6 @@ void nes_konami_vrc4_device::device_start()
void nes_konami_vrc4_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg16_89ab(0);
prg16_cdef(m_prg_chunks - 1);
chr8(0, m_chr_source);
m_irq_mode = 0;
@ -185,9 +183,11 @@ void nes_konami_vrc4_device::pcb_reset()
m_irq_count = 0;
m_irq_count_latch = 0;
m_latch = 0;
m_mmc_prg_bank = 0;
memset(m_mmc_vrom_bank, 0, sizeof(m_mmc_vrom_bank));
m_prg_flip = 0;
m_mmc_prg_bank[0] = 0;
m_mmc_prg_bank[1] = 0;
set_prg();
std::fill(std::begin(m_mmc_vrom_bank), std::end(m_mmc_vrom_bank), 0x00);
}
void nes_konami_vrc6_device::device_start()
@ -427,7 +427,7 @@ void nes_konami_vrc3_device::write_h(offs_t offset, uint8_t data)
Konami VRC-4
In MESS: Supported
In MAME: Supported
-------------------------------------------------*/
@ -467,7 +467,13 @@ void nes_konami_vrc4_device::device_timer(emu_timer &timer, device_timer_id id,
}
}
void nes_konami_vrc4_device::irq_ctrl_w(uint8_t data)
void nes_konami_vrc4_device::irq_ack_w()
{
m_irq_enable = m_irq_enable_latch;
set_irq_line(CLEAR_LINE);
}
void nes_konami_vrc4_device::irq_ctrl_w(u8 data)
{
m_irq_mode = data & 0x04;
m_irq_enable = data & 0x02;
@ -480,51 +486,46 @@ void nes_konami_vrc4_device::irq_ctrl_w(uint8_t data)
set_irq_line(CLEAR_LINE);
}
void nes_konami_vrc4_device::set_prg()
void nes_konami_vrc4_device::set_mirror(u8 data)
{
if (m_latch & 0x02)
switch (data & 0x03)
{
prg8_89(0xfe);
prg8_cd(m_mmc_prg_bank);
}
else
{
prg8_89(m_mmc_prg_bank);
prg8_cd(0xfe);
case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
}
}
void nes_konami_vrc4_device::write_h(offs_t offset, uint8_t data)
void nes_konami_vrc4_device::set_prg(int prg_base, int prg_mask)
{
prg8_x(0 ^ m_prg_flip, prg_base | (m_mmc_prg_bank[0] & prg_mask));
prg8_x(1, prg_base | (m_mmc_prg_bank[1] & prg_mask));
prg8_x(2 ^ m_prg_flip, prg_base | (prg_mask & ~1));
prg8_x(3, prg_base | prg_mask);
}
void nes_konami_vrc4_device::write_h(offs_t offset, u8 data)
{
int bank, shift, mask;
uint16_t add_lines = ((offset << (9 - m_vrc_ls_prg_a)) & 0x200) | ((offset << (8 - m_vrc_ls_prg_b)) & 0x100);
u16 add_lines = ((offset << (9 - m_vrc_ls_prg_a)) & 0x200) | ((offset << (8 - m_vrc_ls_prg_b)) & 0x100);
LOG_MMC(("VRC-4 write_h, offset: %04x, data: %02x\n", offset, data));
switch (offset & 0x7000)
{
case 0x0000:
m_mmc_prg_bank = data;
set_prg();
break;
case 0x2000:
prg8_ab(data);
m_mmc_prg_bank[BIT(offset, 13)] = data;
set_prg();
break;
case 0x1000:
if (add_lines & 0x200)
{
m_latch = data & 0x02;
m_prg_flip = data & 0x02;
set_prg();
}
else
{
switch (data & 0x03)
{
case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
}
}
set_mirror(data);
break;
case 0x3000:
case 0x4000:
@ -534,7 +535,7 @@ void nes_konami_vrc4_device::write_h(offs_t offset, uint8_t data)
shift = BIT(add_lines, 8) * 4;
mask = shift ? 0x1f0 : 0x0f;
m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & ~mask) | ((data << shift) & mask);
chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
chr1_x(bank, m_mmc_vrom_bank[bank], m_chr_source);
break;
case 0x7000:
switch (add_lines)
@ -549,8 +550,7 @@ void nes_konami_vrc4_device::write_h(offs_t offset, uint8_t data)
irq_ctrl_w(data);
break;
case 0x300:
m_irq_enable = m_irq_enable_latch;
set_irq_line(CLEAR_LINE);
irq_ack_w();
break;
}
break;
@ -591,15 +591,7 @@ void nes_konami_vrc6_device::write_h(offs_t offset, uint8_t data)
break;
case 0x3000:
if (add_lines == 0x300)
{
switch (data & 0x0c)
{
case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
case 0x04: set_nt_mirroring(PPU_MIRROR_HORZ); break;
case 0x08: set_nt_mirroring(PPU_MIRROR_LOW); break;
case 0x0c: set_nt_mirroring(PPU_MIRROR_HIGH); break;
}
}
set_mirror(data >> 2);
else // saw
m_vrc6snd->write((add_lines>>8) | 0x200, data);
break;
@ -618,8 +610,7 @@ void nes_konami_vrc6_device::write_h(offs_t offset, uint8_t data)
irq_ctrl_w(data);
break;
case 0x200:
m_irq_enable = m_irq_enable_latch;
set_irq_line(CLEAR_LINE);
irq_ack_w();
break;
default:
logerror("VRC-6 write_h uncaught write, addr: %04x value: %02x\n", ((offset & 0x7000) | add_lines) + 0x8000, data);
@ -709,13 +700,7 @@ void nes_konami_vrc7_device::write_h(offs_t offset, uint8_t data)
break;
case 0x6000:
switch (data & 0x03)
{
case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
}
set_mirror(data);
break;
case 0x6008: case 0x6010: case 0x6018:
m_irq_count_latch = data;
@ -724,8 +709,7 @@ void nes_konami_vrc7_device::write_h(offs_t offset, uint8_t data)
irq_ctrl_w(data);
break;
case 0x7008: case 0x7010: case 0x7018:
m_irq_enable = m_irq_enable_latch;
set_irq_line(CLEAR_LINE);
irq_ack_w();
break;
default:

View File

@ -92,28 +92,32 @@ class nes_konami_vrc4_device : public nes_nrom_device
{
public:
// construction/destruction
nes_konami_vrc4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
nes_konami_vrc4_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, uint8_t data) override;
virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
static constexpr device_timer_id TIMER_IRQ = 0;
nes_konami_vrc4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
nes_konami_vrc4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-level overrides
virtual void device_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
void set_prg();
uint16_t m_mmc_vrom_bank[8];
uint8_t m_latch, m_mmc_prg_bank;
void set_mirror(u8 data);
void set_prg(int prg_base, int prg_mask);
virtual void set_prg() { set_prg(0x00, 0x1f); }
u16 m_mmc_vrom_bank[8];
u8 m_mmc_prg_bank[2];
u8 m_prg_flip;
void irq_tick();
void irq_ctrl_w(uint8_t data);
uint8_t m_irq_count, m_irq_count_latch;
virtual void irq_ack_w();
void irq_ctrl_w(u8 data);
u8 m_irq_count, m_irq_count_latch;
int m_irq_enable, m_irq_enable_latch;
int m_irq_mode;
int m_irq_prescale;

View File

@ -315,6 +315,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("smb2jb", NES_SMB2JB);
device.option_add_internal("yung08", NES_YUNG08);
device.option_add_internal("btl_0353", NES_0353); // used by Lucky (Roger) Rabbit FDS conversion
device.option_add_internal("btl_2yudb", NES_2YUDB);
device.option_add_internal("btl_900218", NES_900218);
device.option_add_internal("09034a", NES_09034A);
device.option_add_internal("l001", NES_L001);
@ -380,8 +381,9 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_60311c", NES_BMC_60311C);
device.option_add_internal("bmc_80013b", NES_BMC_80013B);
device.option_add_internal("bmc_810544c", NES_BMC_810544C);
device.option_add_internal("bmc_830928c", NES_BMC_830928C);
device.option_add_internal("bmc_830425c", NES_BMC_830425C);
device.option_add_internal("bmc_830506c", NES_BMC_830506C);
device.option_add_internal("bmc_830928c", NES_BMC_830928C);
device.option_add_internal("bmc_850437c", NES_BMC_850437C);
device.option_add_internal("bmc_970630c", NES_BMC_970630C);
device.option_add_internal("bmc_jy820845c", NES_BMC_JY820845C);

View File

@ -397,7 +397,7 @@ static const nes_mmc mmc_list[] =
// 359 BMC-SB-5013 multicarts
// 360 Bit Corp 31-in-1 (ID 3150) (has five accessible DIP switches!)
{ 361, BMC_YY841101C },
// 362 JY-005 multicart
{ 362, BMC_830506C },
// 363 variant of mapper 358?
{ 364, BMC_830832C },
// 365 is this asderp95 in nes.xml?
@ -483,7 +483,7 @@ static const nes_mmc mmc_list[] =
// 517 another Korean karaoke cart with mic
// 518 Subor UNL-DANCE2000 and a few others
{ 519, UNL_EH8813A }, // Dr Mario II Chinese pirate
// { 520, UNKNOWN }, this is probably 2yudb
{ 520, BTL_2YUDB },
{ 521, DREAMTECH_BOARD }, // Korean Igo
{ 522, UNL_LH10 }, // Fuuun Shaolin Kyo FDS conversion
// { 523, UNKNOWN }, likely fengshnb or a clone not yet in nes.xml

View File

@ -217,6 +217,7 @@ static const nes_pcb pcb_list[] =
{ "smb2jb", BTL_SMB2JB },
{ "yung08", BTL_YUNG08 },
{ "btl_0353", BTL_0353 },
{ "btl_2yudb", BTL_2YUDB },
{ "btl_900218", BTL_900218 }, // pirate The Lord of King
{ "09034a", BTL_09034A },
{ "l001", BTL_L001 },
@ -261,6 +262,7 @@ static const nes_pcb pcb_list[] =
{ "bmc_80013b", BMC_80013B },
{ "bmc_810544c", BMC_810544C },
{ "bmc_830425c", BMC_830425C },
{ "bmc_830506c", BMC_830506C },
{ "bmc_830928c", BMC_830928C },
{ "bmc_850437c", BMC_850437C },
{ "bmc_970630c", BMC_970630C },

View File

@ -97,7 +97,7 @@ enum
BMC_GKA, BMC_GKB, BMC_GKCXIN1, BMC_GN91B,
BMC_HP898F, BMC_VT5201, BMC_BENSHIENG,
BMC_60311C, BMC_80013B, BMC_810544C, BMC_830425C,
BMC_830928C, BMC_850437C, BMC_970630C,
BMC_830506C, BMC_830928C, BMC_850437C, BMC_970630C,
BMC_N32_4IN1, BMC_NC20MB, BMC_NT639, BMC_NTD_03, BMC_SRPG_5IN1,
BMC_EL860947C, BMC_EL861121C, BMC_FK23C, BMC_FK23CA, BMC_JY820845C,
BMC_PJOY84, BMC_TH22913, BMC_11160, BMC_G146,
@ -111,14 +111,14 @@ enum
// Unlicensed
UNL_8237, UNL_8237A, UNL_CC21, UNL_AX40G, UNL_AX5705, UNL_KN42,
UNL_KOF97, UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE,
UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6,
UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6,
UNL_SF3, UNL_RACERMATE, UNL_EDU2K,
UNL_STUDYNGAME, UNL_603_5052, UNL_H2288, UNL_158B, UNL_2708,
UNL_MALISB, UNL_AC08, UNL_A9746, UNL_43272, UNL_TF1201, UNL_TH21311,
UNL_CITYFIGHT, UNL_NINJARYU, UNL_EH8813A, UNL_RT01,
// Bootleg boards
BTL_0353, BTL_09034A, BTL_900218, BTL_AISENSHINICOL, BTL_BATMANFS,
BTL_CONTRAJ, BTL_DRAGONNINJA, BTL_L001, BTL_MARIOBABY,
BTL_0353, BTL_09034A, BTL_2YUDB, BTL_900218, BTL_AISENSHINICOL,
BTL_BATMANFS, BTL_CONTRAJ, BTL_DRAGONNINJA, BTL_L001, BTL_MARIOBABY,
BTL_PALTHENA, BTL_PIKACHUY2K, BTL_SBROS11, BTL_SHUIGUAN,
BTL_SMB2JA, BTL_SMB2JB, BTL_SMB3, BTL_TOBIDASE, BTL_YUNG08,
// Shenzhen Jncota

View File

@ -28,15 +28,22 @@
// constructor
//-------------------------------------------------
DEFINE_DEVICE_TYPE(NES_900218, nes_900218_device, "nes_900218", "NES Cart 900218 PCB")
DEFINE_DEVICE_TYPE(NES_AX40G, nes_ax40g_device, "nes_ax40g", "NES Cart UNL-AX-40G PCB")
DEFINE_DEVICE_TYPE(NES_AX5705, nes_ax5705_device, "nes_ax5705", "NES Cart AX5705 PCB")
DEFINE_DEVICE_TYPE(NES_CITYFIGHT, nes_cityfight_device, "nes_cityfight", "NES Cart City Fighter PCB")
DEFINE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device, "nes_shuiguan", "NES Cart Shui Guan Pipe Pirate PCB")
DEFINE_DEVICE_TYPE(NES_TF1201, nes_tf1201_device, "nes_tf1201", "NES Cart UNL-TF1201 PCB")
DEFINE_DEVICE_TYPE(NES_TH21311, nes_th21311_device, "nes_th21311", "NES Cart UNL-TH2131-1 PCB")
DEFINE_DEVICE_TYPE(NES_2YUDB, nes_2yudb_device, "nes_2yudb", "NES Cart Yu Yu Hakusho - Dragon Ball Z 2 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_900218, nes_900218_device, "nes_900218", "NES Cart 900218 PCB")
DEFINE_DEVICE_TYPE(NES_AX40G, nes_ax40g_device, "nes_ax40g", "NES Cart UNL-AX-40G PCB")
DEFINE_DEVICE_TYPE(NES_AX5705, nes_ax5705_device, "nes_ax5705", "NES Cart AX5705 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_830506C, nes_bmc_830506c_device, "nes_bmc_830506c", "NES Cart BMC 830506C PCB")
DEFINE_DEVICE_TYPE(NES_CITYFIGHT, nes_cityfight_device, "nes_cityfight", "NES Cart City Fighter PCB")
DEFINE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device, "nes_shuiguan", "NES Cart Shui Guan Pipe Pirate PCB")
DEFINE_DEVICE_TYPE(NES_TF1201, nes_tf1201_device, "nes_tf1201", "NES Cart UNL-TF1201 PCB")
DEFINE_DEVICE_TYPE(NES_TH21311, nes_th21311_device, "nes_th21311", "NES Cart UNL-TH2131-1 PCB")
nes_2yudb_device::nes_2yudb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_konami_vrc4_device(mconfig, NES_2YUDB, tag, owner, clock), m_outer(0)
{
}
nes_900218_device::nes_900218_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_konami_vrc2_device(mconfig, NES_900218, tag, owner, clock), m_irq_count(0), m_irq_enable(0), irq_timer(nullptr)
{
@ -52,6 +59,11 @@ nes_ax5705_device::nes_ax5705_device(const machine_config &mconfig, const char *
{
}
nes_bmc_830506c_device::nes_bmc_830506c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_konami_vrc4_device(mconfig, NES_BMC_830506C, tag, owner, clock), m_outer(0)
{
}
nes_cityfight_device::nes_cityfight_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_konami_vrc4_device(mconfig, NES_CITYFIGHT, tag, owner, clock)
{
@ -74,6 +86,22 @@ nes_th21311_device::nes_th21311_device(const machine_config &mconfig, const char
void nes_2yudb_device::device_start()
{
nes_konami_vrc4_device::device_start();
save_item(NAME(m_outer));
// VRC4 pins 3 and 4
m_vrc_ls_prg_a = 3; // A3
m_vrc_ls_prg_b = 2; // A2
}
void nes_2yudb_device::pcb_reset()
{
m_outer = 0;
nes_konami_vrc4_device::pcb_reset();
}
void nes_900218_device::device_start()
{
nes_konami_vrc2_device::device_start();
@ -113,6 +141,22 @@ void nes_ax5705_device::device_start()
m_vrc_ls_prg_b = 0; // A0
}
void nes_bmc_830506c_device::device_start()
{
nes_konami_vrc4_device::device_start();
save_item(NAME(m_outer));
// VRC4 pins 3 and 4
m_vrc_ls_prg_a = 1; // A1
m_vrc_ls_prg_b = 0; // A0
}
void nes_bmc_830506c_device::pcb_reset()
{
m_outer = 0;
nes_konami_vrc4_device::pcb_reset();
}
void nes_cityfight_device::device_start()
{
nes_konami_vrc4_device::device_start();
@ -391,14 +435,9 @@ void nes_shuiguan_device::write_h(offs_t offset, u8 data)
-------------------------------------------------*/
void nes_tf1201_device::write_h(offs_t offset, u8 data)
void nes_tf1201_device::irq_ack_w()
{
LOG_MMC(("unl_tf1201 write_h, offset: %04x, data: %02x\n", offset, data));
if ((offset & 0x7003) == 0x7003)
set_irq_line(CLEAR_LINE);
else
nes_konami_vrc4_device::write_h(offset, data);
set_irq_line(CLEAR_LINE);
}
/*-------------------------------------------------
@ -463,3 +502,65 @@ void nes_th21311_device::write_h(offs_t offset, u8 data)
MULTIGAME CARTS BASED ON VRC
-------------------------------------------------*/
/*-------------------------------------------------
Board BTL-2YUDB
Games: 2 in 1 Datach Yu Yu Hakusho + Dragon Ball Z
VRC4 clone that uses CHRRAM instead of the usual
CHRROM and has a bit for selecting the outer PRG bank.
NES 2.0: mapper 520
In MAME: Supported.
-------------------------------------------------*/
void nes_2yudb_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("2yudb write_h, offset: %04x, data: %02x\n", offset, data));
nes_konami_vrc4_device::write_h(offset, data);
if (offset >= 0x3000 && offset < 0x7000 && !BIT(offset, m_vrc_ls_prg_b))
{
u8 bank = ((offset >> 12) - 3) * 2 + BIT(offset, m_vrc_ls_prg_a);
m_outer = (m_mmc_vrom_bank[bank] & 0x08) << 2;
set_prg();
}
}
/*-------------------------------------------------
Board BMC-830506C
Games: 1995 Super HiK 4 in 1 (JY-005)
VRC4 clone with banking for multicart menu.
NES 2.0: mapper 362
In MAME: Supported.
-------------------------------------------------*/
void nes_bmc_830506c_device::irq_ack_w()
{
set_irq_line(CLEAR_LINE);
}
void nes_bmc_830506c_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("bmc_830506c write_h, offset: %04x, data: %02x\n", offset, data));
nes_konami_vrc4_device::write_h(offset, data);
if (offset >= 0x3000 && offset < 0x7000 && BIT(offset, m_vrc_ls_prg_b))
{
u8 bank = ((offset >> 12) - 3) * 2 + BIT(offset, m_vrc_ls_prg_a);
m_outer = (m_mmc_vrom_bank[bank] & 0x180) >> 3;
set_prg();
}
}

View File

@ -8,6 +8,29 @@
#include "konami.h"
// ======================> nes_2yudb_device
class nes_2yudb_device : public nes_konami_vrc4_device
{
public:
// construction/destruction
nes_2yudb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void set_prg() override { nes_konami_vrc4_device::set_prg(m_outer, 0x1f); }
private:
u8 m_outer;
};
// ======================> nes_900218_device
class nes_900218_device : public nes_konami_vrc2_device
@ -66,6 +89,30 @@ protected:
};
// ======================> nes_bmc_830506c_device
class nes_bmc_830506c_device : public nes_konami_vrc4_device
{
public:
// construction/destruction
nes_bmc_830506c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void irq_ack_w() override;
virtual void set_prg() override { nes_konami_vrc4_device::set_prg(m_outer, 0x0f); }
private:
u8 m_outer;
};
// ======================> nes_cityfight_device
class nes_cityfight_device : public nes_konami_vrc4_device
@ -113,11 +160,11 @@ public:
// construction/destruction
nes_tf1201_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, u8 data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void irq_ack_w() override;
};
@ -149,12 +196,14 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(NES_900218, nes_900218_device)
DECLARE_DEVICE_TYPE(NES_AX40G, nes_ax40g_device)
DECLARE_DEVICE_TYPE(NES_AX5705, nes_ax5705_device)
DECLARE_DEVICE_TYPE(NES_CITYFIGHT, nes_cityfight_device)
DECLARE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device)
DECLARE_DEVICE_TYPE(NES_TF1201, nes_tf1201_device)
DECLARE_DEVICE_TYPE(NES_TH21311, nes_th21311_device)
DECLARE_DEVICE_TYPE(NES_2YUDB, nes_2yudb_device)
DECLARE_DEVICE_TYPE(NES_900218, nes_900218_device)
DECLARE_DEVICE_TYPE(NES_AX40G, nes_ax40g_device)
DECLARE_DEVICE_TYPE(NES_AX5705, nes_ax5705_device)
DECLARE_DEVICE_TYPE(NES_BMC_830506C, nes_bmc_830506c_device)
DECLARE_DEVICE_TYPE(NES_CITYFIGHT, nes_cityfight_device)
DECLARE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device)
DECLARE_DEVICE_TYPE(NES_TF1201, nes_tf1201_device)
DECLARE_DEVICE_TYPE(NES_TH21311, nes_th21311_device)
#endif // MAME_BUS_NES_VRC_CLONES_H