summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--hash/nes.xml58
-rw-r--r--src/devices/bus/nes/bootleg.cpp3
-rw-r--r--src/devices/bus/nes/henggedianzi.cpp132
-rw-r--r--src/devices/bus/nes/henggedianzi.h30
-rw-r--r--src/devices/bus/nes/nes_ines.hxx4
-rw-r--r--src/devices/bus/nes/nes_slot.cpp7
-rw-r--r--src/devices/bus/nes/nes_slot.h1
-rw-r--r--src/devices/bus/nes/vrc_clones.cpp83
-rw-r--r--src/devices/bus/nes/vrc_clones.h36
-rw-r--r--src/devices/bus/nes/waixing.cpp106
-rw-r--r--src/devices/bus/nes/waixing.h25
11 files changed, 158 insertions, 327 deletions
diff --git a/hash/nes.xml b/hash/nes.xml
index f84a9fdec25..462f286e7fe 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -56051,8 +56051,8 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<!-- ES-1001 San Guo Zhi - Ying Jie Zhan - Chinese translation and slight hack of Destiny of an Emperor, see below -->
- <software name="sanguo" cloneof="sangochu" supported="no">
- <description>San Guo Zhi - Zhong Yuan Ba Zhe (Chi)</description>
+ <software name="sanguo" cloneof="sangochu" supported="partial">
+ <description>Sānguózhì III (China)</description>
<year>19??</year>
<publisher>Waixing</publisher>
<info name="serial" value="ES-1002"/>
@@ -56066,6 +56066,9 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
<dataarea name="prg" size="262144">
<rom name="san guo zhi (ch).prg" size="262144" crc="d03b3051" sha1="78bb9c5f509dd20d493fdb4458c0bf70afb4ec8e" offset="00000" status="baddump" />
</dataarea>
+ <!-- 8k VRAM on cartridge? -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
<!-- 8k WRAM on cartridge, battery backed up -->
<dataarea name="bwram" size="8192">
<rom value="0x00" size="8192" offset="0" loadflag="fill" />
@@ -57055,26 +57058,27 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
</part>
</software>
- <software name="qlz" supported="no">
- <description>Qi Long Zhu (Chi)</description>
- <year>19??</year>
+ <software name="qlz" cloneof="dbz" supported="partial">
+ <description>Qīlóngzhū (China)</description>
+ <year>1997</year>
<publisher>Waixing</publisher>
<info name="serial" value="ES-1064"/>
<info name="alt_title" value="七龙珠 (Dragonball) "/>
<part name="cart" interface="nes_cart">
<feature name="slot" value="hengg_shjy3" />
- <feature name="pcb" value="UNL-SHJY3" /> <!-- Chinese dump uses Mapper 253, another image found uses Mapper 251 -->
+ <feature name="pcb" value="UNL-SHJY3" /> <!-- Chinese dump uses Mapper 253, another image found uses Mapper 251? -->
<dataarea name="chr" size="524288">
<rom name="[es-1064] qi long zhu (c).chr" size="524288" crc="b1f61f87" sha1="7a9bc6692782be6e3e7861587e036a27ef20f29b" offset="00000" status="baddump" />
</dataarea>
<dataarea name="prg" size="262144">
<rom name="[es-1064] qi long zhu (c).prg" size="262144" crc="5bc582fd" sha1="06741d2f717c837c99aefbc481bab150f4983b2d" offset="00000" status="baddump" />
</dataarea>
- <!-- 8k VRAM on cartridge -->
+ <!-- 8k VRAM on cartridge? -->
<dataarea name="vram" size="8192">
</dataarea>
- <!-- 8k WRAM on cartridge -->
- <dataarea name="wram" size="8192">
+ <!-- 8k WRAM on cartridge, battery backed up -->
+ <dataarea name="bwram" size="8192">
+ <rom value="0x00" size="8192" offset="0" loadflag="fill" />
</dataarea>
</part>
</software>
@@ -65775,19 +65779,27 @@ We don't include these hacks because they were not burned into real carts nor so
</part>
</software>
- <software name="saiyaren" supported="no">
- <description>Sai Ya Ren Mei Jue Ji Hua (Chi)</description>
+ <software name="saiyaren" cloneof="dbzgaidn" supported="partial">
+ <description>Sàiyǎrén Mièjué Jìhuà (China)</description>
<year>199?</year>
<publisher>CoolBoy</publisher>
+ <info name="alt_title" value="賽亞人灭绝计划"/>
<part name="cart" interface="nes_cart">
- <feature name="slot" value="unknown" />
- <feature name="pcb" value="UNKNOWN" /> <!-- mapper 253?!? -->
+ <feature name="slot" value="hengg_shjy3" />
+ <feature name="pcb" value="UNL-SHJY3" />
<dataarea name="chr" size="524288">
<rom name="[cb] sai ya ren mei jue ji hua (c).chr" size="524288" crc="a2d1912c" sha1="373a1eb059debed926ecfcc496449c72e7d34929" offset="00000" status="baddump" />
</dataarea>
<dataarea name="prg" size="262144">
<rom name="[cb] sai ya ren mei jue ji hua (c).prg" size="262144" crc="f385988b" sha1="6513c8be52f85fdc40498bd44fefdaa3af07a63a" offset="00000" status="baddump" />
</dataarea>
+ <!-- 8k VRAM on cartridge? -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ <!-- 8k WRAM on cartridge, battery backed up -->
+ <dataarea name="bwram" size="8192">
+ <rom value="0x00" size="8192" offset="0" loadflag="fill" />
+ </dataarea>
</part>
</software>
@@ -68177,9 +68189,9 @@ All musics were removed in this game.
</part>
</software>
- <software name="shenhjy3" supported="no">
- <description>Shen Hua Jian Yun III (Chi)</description>
- <year>19??</year>
+ <software name="shenhjy3" cloneof="dbz2" supported="partial">
+ <description>Shénhuà Jiàn Yún III (China)</description>
+ <year>199?</year>
<publisher>HengGedianzi</publisher>
<info name="alt_title" value="神话剑云Ⅲ"/>
<part name="cart" interface="nes_cart">
@@ -68191,11 +68203,12 @@ All musics were removed in this game.
<dataarea name="prg" size="262144">
<rom name="shen hua jian yun iii (ch).prg" size="262144" crc="0530b26e" sha1="d92480475c2b6d50288c89685c0fcc3641342779" offset="00000" status="baddump" />
</dataarea>
- <!-- 8k VRAM on cartridge -->
+ <!-- 8k VRAM on cartridge? -->
<dataarea name="vram" size="8192">
</dataarea>
- <!-- 8k WRAM on cartridge -->
- <dataarea name="wram" size="8192">
+ <!-- 8k WRAM on cartridge, battery backed up -->
+ <dataarea name="bwram" size="8192">
+ <rom value="0x00" size="8192" offset="0" loadflag="fill" />
</dataarea>
</part>
</software>
@@ -77967,8 +77980,8 @@ be better to redump them properly. -->
</part>
</software>
- <software name="sanguoa" cloneof="sangochu" supported="no">
- <description>San Guo Zhi (Asia, Decrypted SmyNES)</description>
+ <software name="sanguoa" cloneof="sangochu" supported="partial">
+ <description>Sānguózhì (Asia, decrypted SmyNES)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="nes_cart">
@@ -77980,6 +77993,9 @@ be better to redump them properly. -->
<dataarea name="prg" size="262144">
<rom name="san guo zhi (as) [decrypted].prg" size="262144" crc="d03b3051" sha1="78bb9c5f509dd20d493fdb4458c0bf70afb4ec8e" offset="00000" status="baddump" />
</dataarea>
+ <!-- 8k VRAM on cartridge? -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
<!-- 8k WRAM on cartridge, battery backed up -->
<dataarea name="bwram" size="8192">
<rom value="0x00" size="8192" offset="0" loadflag="fill" />
diff --git a/src/devices/bus/nes/bootleg.cpp b/src/devices/bus/nes/bootleg.cpp
index 17f2d97685f..fdbdf497dd0 100644
--- a/src/devices/bus/nes/bootleg.cpp
+++ b/src/devices/bus/nes/bootleg.cpp
@@ -992,7 +992,7 @@ void nes_btl_dn_device::hblank_irq(int scanline, int vblank, int blanked )
return;
m_irq_count = 0;
- hold_irq_line();
+ set_irq_line(ASSERT_LINE);
}
void nes_btl_dn_device::write_h(offs_t offset, uint8_t data)
@@ -1024,6 +1024,7 @@ void nes_btl_dn_device::write_h(offs_t offset, uint8_t data)
break;
case 0x7000:
m_irq_count = data;
+ set_irq_line(CLEAR_LINE);
break;
}
}
diff --git a/src/devices/bus/nes/henggedianzi.cpp b/src/devices/bus/nes/henggedianzi.cpp
index 0f9acd05d45..1e1942e5477 100644
--- a/src/devices/bus/nes/henggedianzi.cpp
+++ b/src/devices/bus/nes/henggedianzi.cpp
@@ -10,7 +10,6 @@
* Henggedianzi Super Rich [mapper 177]
* Henggedianzi Xing He Zhan Shi [mapper 179]
- * Henggedianzi Shen Hua Jian Yun III
TODO:
@@ -38,7 +37,6 @@
DEFINE_DEVICE_TYPE(NES_HENGG_SRICH, nes_hengg_srich_device, "nes_hengg_srich", "NES Cart Henggedianzi Super Rich PCB")
DEFINE_DEVICE_TYPE(NES_HENGG_XHZS, nes_hengg_xhzs_device, "nes_hengg_xhzs", "NES Cart Henggedianzi Xing He Zhan Shi PCB")
-DEFINE_DEVICE_TYPE(NES_HENGG_SHJY3, nes_hengg_shjy3_device, "nes_hengg_shjy3", "NES Cart Henggedianzi Shen Hua Jian Yun III PCB")
nes_hengg_srich_device::nes_hengg_srich_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@@ -51,11 +49,6 @@ nes_hengg_xhzs_device::nes_hengg_xhzs_device(const machine_config &mconfig, cons
{
}
-nes_hengg_shjy3_device::nes_hengg_shjy3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_HENGG_SHJY3, tag, owner, clock), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), m_chr_mode(0)
-{
-}
-
@@ -83,34 +76,6 @@ void nes_hengg_xhzs_device::pcb_reset()
chr8(0, m_chr_source);
}
-void nes_hengg_shjy3_device::device_start()
-{
- common_start();
- save_item(NAME(m_irq_count));
- save_item(NAME(m_irq_count_latch));
- save_item(NAME(m_irq_enable));
- save_item(NAME(m_chr_mode));
- save_item(NAME(m_mmc_prg_bank));
- save_item(NAME(m_mmc_vrom_bank));
- save_item(NAME(m_mmc_extra_bank));
-}
-
-void nes_hengg_shjy3_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_enable = 0;
- m_irq_count = m_irq_count_latch = 0;
-
- m_chr_mode = 0;
- memset(m_mmc_prg_bank, 0, sizeof(m_mmc_prg_bank));
- memset(m_mmc_vrom_bank, 0, sizeof(m_mmc_vrom_bank));
- memset(m_mmc_extra_bank, 0, sizeof(m_mmc_extra_bank));
-}
-
@@ -177,100 +142,3 @@ void nes_hengg_xhzs_device::write_h(offs_t offset, uint8_t data)
set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
-
-/*-------------------------------------------------
-
- UNL-SHJY3
-
- -------------------------------------------------*/
-
-/* I think the IRQ should only get fired if enough CPU cycles have passed, but we don't implement (yet) this part */
-void nes_hengg_shjy3_device::hblank_irq(int scanline, int vblank, int blanked)
-{
- if (m_irq_enable & 0x02)
- {
- if (m_irq_count == 0xff)
- {
- m_irq_count = m_irq_count_latch;
- m_irq_enable = m_irq_enable | ((m_irq_enable & 0x01) << 1);
- hold_irq_line();
- }
- else
- m_irq_count++;
- }
-}
-
-void nes_hengg_shjy3_device::update_banks()
-{
- prg8_89(m_mmc_prg_bank[0]);
- prg8_ab(m_mmc_prg_bank[1]);
-
- for (int i = 0; i < 8; i++)
- {
- uint8_t chr_bank = m_mmc_vrom_bank[i] | (m_mmc_extra_bank[i] << 4);
- if (m_mmc_vrom_bank[i] == 0xc8)
- {
- m_chr_mode = 0;
- continue;
- }
- else if (m_mmc_vrom_bank[i] == 0x88)
- {
- m_chr_mode = 1;
- continue;
- }
- if ((m_mmc_vrom_bank[i] == 4 || m_mmc_vrom_bank[i] == 5) && !m_chr_mode)
- chr1_x(i, chr_bank & 1, CHRRAM);
- else
- chr1_x(i, chr_bank, CHRROM);
- }
-}
-
-void nes_hengg_shjy3_device::write_h(offs_t offset, uint8_t data)
-{
- LOG_MMC(("shjy3 write_h, offset: %04x, data: %02x\n", offset, data));
-
- if (offset >= 0x3000 && offset <= 0x600c)
- {
- uint8_t shift = offset & 4;
- uint8_t mmc_helper = ((offset & 8) | (offset >> 8)) >> 3;
- mmc_helper += 2;
- mmc_helper &= 7;
-
- m_mmc_vrom_bank[mmc_helper] = (m_mmc_vrom_bank[mmc_helper] & (0xf0 >> shift)) | ((data & 0x0f) << shift);
- if (shift)
- m_mmc_extra_bank[mmc_helper] = data >> 4;
- }
- else
- {
- switch (offset)
- {
- case 0x0010:
- m_mmc_prg_bank[0] = data;
- break;
- case 0x2010:
- m_mmc_prg_bank[1] = data;
- break;
- case 0x1400:
- switch (data & 0x03)
- {
- case 0: set_nt_mirroring(PPU_MIRROR_VERT); break;
- case 1: set_nt_mirroring(PPU_MIRROR_HORZ); break;
- case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
- case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
- }
- break;
- case 0x7000:
- m_irq_count_latch = (m_irq_count_latch & 0xf0) | (data & 0x0f);
- break;
- case 0x7004:
- m_irq_count_latch = (m_irq_count_latch & 0x0f) | ((data & 0x0f) << 4);
- break;
- case 0x7008:
- m_irq_enable = data & 0x03;
- if (m_irq_enable & 0x02)
- m_irq_count = m_irq_count_latch;
- break;
- }
- }
- update_banks();
-}
diff --git a/src/devices/bus/nes/henggedianzi.h b/src/devices/bus/nes/henggedianzi.h
index 0bf0b2faebc..5b61880bf53 100644
--- a/src/devices/bus/nes/henggedianzi.h
+++ b/src/devices/bus/nes/henggedianzi.h
@@ -45,38 +45,8 @@ protected:
};
-// ======================> nes_hengg_shjy3_device
-
-class nes_hengg_shjy3_device : public nes_nrom_device
-{
-public:
- // construction/destruction
- nes_hengg_shjy3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void hblank_irq(int scanline, int vblank, int blanked) override;
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
-private:
- void update_banks();
-
- uint16_t m_irq_count, m_irq_count_latch;
- int m_irq_enable;
-
- int m_chr_mode;
- uint8_t m_mmc_prg_bank[2];
- uint8_t m_mmc_vrom_bank[8];
- uint8_t m_mmc_extra_bank[8];
-};
-
// device type definition
DECLARE_DEVICE_TYPE(NES_HENGG_SRICH, nes_hengg_srich_device)
DECLARE_DEVICE_TYPE(NES_HENGG_XHZS, nes_hengg_xhzs_device)
-DECLARE_DEVICE_TYPE(NES_HENGG_SHJY3, nes_hengg_shjy3_device)
#endif // MAME_BUS_NES_HENGGEDIANZI_H
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 4512d02dede..cefbd4259e9 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -284,9 +284,9 @@ static const nes_mmc mmc_list[] =
// 248 Unused
{ 249, WAIXING_SECURITY },
{ 250, NITRA_TDA },
- // 251 Shen Hua Jian Yun III?? - Unsupported
+ // 251 Unused
{ 252, WAIXING_SGZ },
- // 253 Super 8-in-1 99 King Fighter?? - Unsupported
+ { 253, HENGG_SHJY3 },
{ 254, BTL_PIKACHUY2K },
{ 255, BMC_72IN1 }, // duplicate of mapper 225
diff --git a/src/devices/bus/nes/nes_slot.cpp b/src/devices/bus/nes/nes_slot.cpp
index aee85bbb2a5..3d14ed3ad0d 100644
--- a/src/devices/bus/nes/nes_slot.cpp
+++ b/src/devices/bus/nes/nes_slot.cpp
@@ -473,18 +473,11 @@ void device_nes_cart_interface::set_nt_mirroring(int mirroring)
DECLARE_WRITE_LINE_MEMBER(device_nes_cart_interface::set_irq_line)
{
- // use hold_irq_line for HOLD_LINE semantics (not recommended)
assert(state == ASSERT_LINE || state == CLEAR_LINE);
m_maincpu->set_input_line(m6502_device::IRQ_LINE, state);
}
-void device_nes_cart_interface::hold_irq_line()
-{
- // hack which requires the CPU object
- m_maincpu->set_input_line(m6502_device::IRQ_LINE, HOLD_LINE);
-}
-
void device_nes_cart_interface::reset_cpu()
{
// another hack
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index e397d102fed..e3e0a6cbe03 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -266,7 +266,6 @@ protected:
device_nes_cart_interface(const machine_config &mconfig, device_t &device);
DECLARE_WRITE_LINE_MEMBER(set_irq_line);
- [[deprecated("IRQs should be cleared explicitly")]] void hold_irq_line();
void reset_cpu();
// internal state
diff --git a/src/devices/bus/nes/vrc_clones.cpp b/src/devices/bus/nes/vrc_clones.cpp
index cde4a50c711..a8c709313f1 100644
--- a/src/devices/bus/nes/vrc_clones.cpp
+++ b/src/devices/bus/nes/vrc_clones.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders: kmg, Fabio Priuli
+// copyright-holders:kmg
/***********************************************************************************************************
@@ -38,6 +38,8 @@ DEFINE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device, "nes_shuiguan", "
DEFINE_DEVICE_TYPE(NES_T230, nes_t230_device, "nes_t230", "NES Cart T-230 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_WAIXING_SGZ, nes_waixing_sgz_device, "nes_waixing_sgz", "NES Cart Waixing San Guo Zhi PCB")
+DEFINE_DEVICE_TYPE(NES_HENGG_SHJY3, nes_hengg_shjy3_device, "nes_hengg_shjy3", "NES Cart Henggedianzi Shen Hua Jian Yun III PCB")
nes_2yudb_device::nes_2yudb_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
@@ -90,6 +92,21 @@ nes_th21311_device::nes_th21311_device(const machine_config &mconfig, const char
{
}
+nes_waixing_sgz_device::nes_waixing_sgz_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 chr_match)
+ : nes_konami_vrc4_device(mconfig, type, tag, owner, clock), m_chr_match(chr_match)
+{
+}
+
+nes_waixing_sgz_device::nes_waixing_sgz_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_waixing_sgz_device(mconfig, NES_WAIXING_SGZ, tag, owner, clock, 0x06)
+{
+}
+
+nes_hengg_shjy3_device::nes_hengg_shjy3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_waixing_sgz_device(mconfig, NES_HENGG_SHJY3, tag, owner, clock, 0x04)
+{
+}
+
void nes_2yudb_device::device_start()
@@ -229,6 +246,19 @@ void nes_th21311_device::pcb_reset()
m_irq_latch = 0;
}
+void nes_waixing_sgz_device::device_start()
+{
+ nes_konami_vrc4_device::device_start();
+ save_item(NAME(m_chr_mask));
+ save_item(NAME(m_chr_match));
+
+ m_chr_mask = 0xfe;
+
+ // VRC4 pins 3 and 4
+ m_vrc_ls_prg_a = 3; // A3
+ m_vrc_ls_prg_b = 2; // A2
+}
+
/*-------------------------------------------------
@@ -548,6 +578,57 @@ void nes_th21311_device::write_h(offs_t offset, u8 data)
nes_konami_vrc2_device::write_h(offset, data);
}
+/*-------------------------------------------------
+
+ Waixing San Guo Zhi Board, Henggedianzi UNL-SHJY3
+
+ Games: San Guo Zhi (mapper 252), several Chinese
+ hacks of Dragon Ball games (mapper 253)
+
+ VRC4 clones that substitute 2K of CHRRAM in place for
+ two of the standard 1K CHRROM pages. Unusually this is
+ done by a GAL looking at certain address bits of the
+ PPU's address space, as the PPU writes pattern tables.
+
+ iNES: mapper 252 and mapper 253
+
+ In MAME: Supported.
+
+ TODO: Why does Sanguozhi flicker every second or two?
+
+ -------------------------------------------------*/
+
+void nes_waixing_sgz_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("waixing_sgz write_h, offset: %04x, data: %02x\n", offset, data));
+
+ nes_konami_vrc4_device::write_h(offset, data);
+
+ for (int bank = 0; bank < 8; bank++)
+ if ((m_mmc_vrom_bank[bank] & m_chr_mask) == m_chr_match)
+ chr1_x(bank, m_mmc_vrom_bank[bank] & 1, CHRRAM);
+}
+
+void nes_waixing_sgz_device::chr_w(offs_t offset, u8 data)
+{
+ device_nes_cart_interface::chr_w(offset, data);
+
+ switch (m_mmc_vrom_bank[BIT(offset, 10, 3)])
+ {
+ case 0x88:
+ m_chr_mask = 0xfc;
+ m_chr_match = 0x4c;
+ break;
+ case 0xc2:
+ m_chr_mask = 0xfe;
+ m_chr_match = 0x7c;
+ break;
+ case 0xc8:
+ m_chr_mask = 0xfe;
+ m_chr_match = 0x04;
+ break;
+ }
+}
/*-------------------------------------------------
diff --git a/src/devices/bus/nes/vrc_clones.h b/src/devices/bus/nes/vrc_clones.h
index 921d9cd72b5..780dc6ae0cb 100644
--- a/src/devices/bus/nes/vrc_clones.h
+++ b/src/devices/bus/nes/vrc_clones.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders: kmg, Fabio Priuli
+// copyright-holders:kmg
#ifndef MAME_BUS_NES_VRC_CLONES_H
#define MAME_BUS_NES_VRC_CLONES_H
@@ -211,6 +211,38 @@ private:
};
+// ======================> nes_waixing_sgz_device
+
+class nes_waixing_sgz_device : public nes_konami_vrc4_device
+{
+public:
+ // construction/destruction
+ nes_waixing_sgz_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 chr_w(offs_t offset, u8 data) override;
+
+protected:
+ // construction/destruction
+ nes_waixing_sgz_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 chr_match);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ u8 m_chr_mask, m_chr_match;
+};
+
+// ======================> nes_hengg_shjy3_device
+
+class nes_hengg_shjy3_device : public nes_waixing_sgz_device
+{
+public:
+ // construction/destruction
+ nes_hengg_shjy3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+
// device type definition
DECLARE_DEVICE_TYPE(NES_2YUDB, nes_2yudb_device)
DECLARE_DEVICE_TYPE(NES_900218, nes_900218_device)
@@ -218,9 +250,11 @@ 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_HENGG_SHJY3, nes_hengg_shjy3_device)
DECLARE_DEVICE_TYPE(NES_SHUIGUAN, nes_shuiguan_device)
DECLARE_DEVICE_TYPE(NES_T230, nes_t230_device)
DECLARE_DEVICE_TYPE(NES_TF1201, nes_tf1201_device)
DECLARE_DEVICE_TYPE(NES_TH21311, nes_th21311_device)
+DECLARE_DEVICE_TYPE(NES_WAIXING_SGZ, nes_waixing_sgz_device)
#endif // MAME_BUS_NES_VRC_CLONES_H
diff --git a/src/devices/bus/nes/waixing.cpp b/src/devices/bus/nes/waixing.cpp
index 2020c4ddc80..2f5f8b5faef 100644
--- a/src/devices/bus/nes/waixing.cpp
+++ b/src/devices/bus/nes/waixing.cpp
@@ -45,7 +45,6 @@ DEFINE_DEVICE_TYPE(NES_WAIXING_I, nes_waixing_i_device, "nes_waixing_i",
DEFINE_DEVICE_TYPE(NES_WAIXING_J, nes_waixing_j_device, "nes_waixing_j", "NES Cart Waixing Type J PCB")
DEFINE_DEVICE_TYPE(NES_WAIXING_SH2, nes_waixing_sh2_device, "nes_waixing_sh2", "NES Cart Waixing SH2 PCB")
DEFINE_DEVICE_TYPE(NES_WAIXING_SEC, nes_waixing_sec_device, "nes_waixing_sec", "NES Cart Waixing Security Chip PCB")
-DEFINE_DEVICE_TYPE(NES_WAIXING_SGZ, nes_waixing_sgz_device, "nes_waixing_sgz", "NES Cart Waixing San Guo Zhi PCB")
DEFINE_DEVICE_TYPE(NES_WAIXING_SGZLZ, nes_waixing_sgzlz_device, "nes_waixing_sgzlz", "NES Cart Waixing San Guo Zhong Lie Zhuan PCB")
DEFINE_DEVICE_TYPE(NES_WAIXING_FFV, nes_waixing_ffv_device, "nes_waixing_ffv", "NES Cart Waixing Final Fantasy V PCB")
DEFINE_DEVICE_TYPE(NES_WAIXING_WXZS, nes_waixing_wxzs_device, "nes_waixing_wxzs", "NES Cart Waixing Wai Xing Zhan Shi PCB")
@@ -134,11 +133,6 @@ nes_waixing_sec_device::nes_waixing_sec_device(const machine_config &mconfig, co
{
}
-nes_waixing_sgz_device::nes_waixing_sgz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_nrom_device(mconfig, NES_WAIXING_SGZ, tag, owner, clock), m_irq_count(0), m_irq_count_latch(0), m_irq_enable(0), m_irq_enable_latch(0)
-{
-}
-
nes_waixing_sgzlz_device::nes_waixing_sgzlz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_WAIXING_SGZLZ, tag, owner, clock), m_reg{ 0, 0, 0, 0 }
{
@@ -265,31 +259,6 @@ void nes_waixing_sec_device::pcb_reset()
mmc3_common_initialize(0xff, 0xff, 0);
}
-void nes_waixing_sgz_device::device_start()
-{
- common_start();
- save_item(NAME(m_irq_enable));
- save_item(NAME(m_irq_enable_latch));
- save_item(NAME(m_irq_count));
- save_item(NAME(m_irq_count_latch));
- save_item(NAME(m_mmc_vrom_bank));
-}
-
-void nes_waixing_sgz_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_enable = 0;
- m_irq_enable_latch = 0;
- m_irq_count = 0;
- m_irq_count_latch = 0;
-
- std::fill(std::begin(m_mmc_vrom_bank), std::end(m_mmc_vrom_bank), 0x00);
-}
-
void nes_waixing_sgzlz_device::device_start()
{
common_start();
@@ -957,81 +926,6 @@ void nes_waixing_sec_device::write_l(offs_t offset, uint8_t data)
/*-------------------------------------------------
- Waixing San Guo Zhi Board
-
- Games: San Guo Zhi
-
- This board uses Konami IRQ
-
- iNES: mapper 252
-
- In MESS: Unsupported.
-
- -------------------------------------------------*/
-
-// same as Konami IRQ
-void nes_waixing_sgz_device::hblank_irq(int scanline, int vblank, int blanked)
-{
- /* Increment & check the IRQ scanline counter */
- if (m_irq_enable && (++m_irq_count == 0x100))
- {
- m_irq_count = m_irq_count_latch;
- m_irq_enable = m_irq_enable_latch;
- hold_irq_line();
- }
-}
-
-void nes_waixing_sgz_device::write_h(offs_t offset, uint8_t data)
-{
- uint8_t helper, bank;
- LOG_MMC(("waixing_sgz write_h, offset: %04x, data: %02x\n", offset, data));
-
- switch (offset & 0x7000)
- {
- case 0x0000:
- prg8_89(data);
- break;
- case 0x2000:
- prg8_ab(data);
- break;
- case 0x3000:
- case 0x4000:
- case 0x5000:
- case 0x6000:
- bank = ((offset & 0x7000) - 0x3000) / 0x0800 + ((offset & 0x0008) >> 3);
- helper = offset & 0x04;
- if (helper)
- m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x0f) << 4);
- else
- m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
- chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
- break;
- case 0x7000:
- switch (offset & 0x0c)
- {
- case 0x00:
- m_irq_count_latch = (m_irq_count_latch & 0xf0) | (data & 0x0f);
- break;
- case 0x04:
- m_irq_count_latch = (m_irq_count_latch & 0x0f) | ((data & 0x0f) << 4);
- break;
- case 0x08:
- m_irq_enable = data & 0x02;
- m_irq_count_latch = data & 0x01;
- if (data & 0x02)
- m_irq_count = m_irq_count_latch;
- break;
- case 0x0c:
- m_irq_enable = m_irq_enable_latch;
- break;
- }
- break;
- }
-}
-
-
-/*-------------------------------------------------
-
Waixing San Guo Zhong Lie Zhuan Board
Games: Fan Kong Jing Ying, San Guo Zhong Lie Zhuan, Xing
diff --git a/src/devices/bus/nes/waixing.h b/src/devices/bus/nes/waixing.h
index bb6fcaf831a..b438605eb09 100644
--- a/src/devices/bus/nes/waixing.h
+++ b/src/devices/bus/nes/waixing.h
@@ -249,30 +249,6 @@ protected:
};
-// ======================> nes_waixing_sgz_device
-
-class nes_waixing_sgz_device : public nes_nrom_device
-{
-public:
- // construction/destruction
- nes_waixing_sgz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void write_h(offs_t offset, uint8_t data) override;
-
- virtual void hblank_irq(int scanline, int vblank, int blanked) override;
- virtual void pcb_reset() override;
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
- uint16_t m_irq_count, m_irq_count_latch;
- int m_irq_enable, m_irq_enable_latch;
-
- uint8_t m_mmc_vrom_bank[8];
-};
-
-
// ======================> nes_waixing_sgzlz_device
class nes_waixing_sgzlz_device : public nes_nrom_device
@@ -402,7 +378,6 @@ DECLARE_DEVICE_TYPE(NES_WAIXING_I, nes_waixing_i_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_J, nes_waixing_j_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_SH2, nes_waixing_sh2_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_SEC, nes_waixing_sec_device)
-DECLARE_DEVICE_TYPE(NES_WAIXING_SGZ, nes_waixing_sgz_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_SGZLZ, nes_waixing_sgzlz_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_FFV, nes_waixing_ffv_device)
DECLARE_DEVICE_TYPE(NES_WAIXING_WXZS, nes_waixing_wxzs_device)