diff options
author | 2022-03-20 19:09:55 -0800 | |
---|---|---|
committer | 2022-03-20 23:09:55 -0400 | |
commit | c783127ce8bc274aa175508c049aa1f327016424 (patch) | |
tree | 2171de9482c297fe125568a7307e88f9b7cf2590 | |
parent | eb998780803c1ae7327aa8311fe7b0cebc5c1516 (diff) |
bus/nes: Improved support for some Waixing pirate Chinese translations. (#9358)
* bus/nes: Improved support for some Waixing pirate Chinese translations.
Software list items promoted to working (nes.xml)
---------------------------------------
Qīlóngzhū (China)
Sàiyǎrén Mièjué Jìhuà (China)
Sānguózhì III (China)
Sānguózhì (Asia, decrypted SmyNES)
Shénhuà Jiàn Yún III (China)
* bootleg.cpp: Properly acknowledge IRQs in bootleg Dragon Ninja.
nes_slot.cpp: Removed hold_line_irq() helper function once and for all.
-rw-r--r-- | hash/nes.xml | 58 | ||||
-rw-r--r-- | src/devices/bus/nes/bootleg.cpp | 3 | ||||
-rw-r--r-- | src/devices/bus/nes/henggedianzi.cpp | 132 | ||||
-rw-r--r-- | src/devices/bus/nes/henggedianzi.h | 30 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_ines.hxx | 4 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.cpp | 7 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.h | 1 | ||||
-rw-r--r-- | src/devices/bus/nes/vrc_clones.cpp | 83 | ||||
-rw-r--r-- | src/devices/bus/nes/vrc_clones.h | 36 | ||||
-rw-r--r-- | src/devices/bus/nes/waixing.cpp | 106 | ||||
-rw-r--r-- | src/devices/bus/nes/waixing.h | 25 |
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><unknown></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) |