diff --git a/hash/nes.xml b/hash/nes.xml index 43551a3342f..83a0a301856 100644 --- a/hash/nes.xml +++ b/hash/nes.xml @@ -66705,7 +66705,7 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t Kaiser - + @@ -75441,18 +75441,14 @@ be better to redump them properly. --> 1993 <unknown> - - + + - - - - @@ -75461,8 +75457,8 @@ be better to redump them properly. --> 1993 <unknown> - - + + diff --git a/src/devices/bus/nes/kaiser.cpp b/src/devices/bus/nes/kaiser.cpp index eb0dcd9c150..be1e728c74e 100644 --- a/src/devices/bus/nes/kaiser.cpp +++ b/src/devices/bus/nes/kaiser.cpp @@ -17,11 +17,9 @@ * Kaiser KS7031 * Kaiser KS7032 * Kaiser KS7037 + * Kaiser KS7057 * Kaiser KS7058 - The Kaiser KS7057 bootleg board is emulated in nes_mmc3_clones.cpp - - TODO: - FCEUmm lists more Kaiser PCBs: * KS7030 (for Yume Koujou Doki Doki Panic by Kaiser?) @@ -57,6 +55,7 @@ DEFINE_DEVICE_TYPE(NES_KS7013B, nes_ks7013b_device, "nes_ks7013b", "NES Cart Kai DEFINE_DEVICE_TYPE(NES_KS7031, nes_ks7031_device, "nes_ks7031", "NES Cart Kaiser KS-7031 PCB") DEFINE_DEVICE_TYPE(NES_KS7016, nes_ks7016_device, "nes_ks7016", "NES Cart Kaiser KS-7016 PCB") DEFINE_DEVICE_TYPE(NES_KS7037, nes_ks7037_device, "nes_ks7037", "NES Cart Kaiser KS-7037 PCB") +DEFINE_DEVICE_TYPE(NES_KS7057, nes_ks7057_device, "nes_ks7057", "NES Cart Kaiser KS-7057 PCB") nes_ks7058_device::nes_ks7058_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) @@ -114,6 +113,11 @@ nes_ks7037_device::nes_ks7037_device(const machine_config &mconfig, const char * { } +nes_ks7057_device::nes_ks7057_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_nrom_device(mconfig, NES_KS7057, tag, owner, clock) +{ +} + @@ -274,6 +278,21 @@ void nes_ks7037_device::pcb_reset() m_latch = 0; } +void nes_ks7057_device::device_start() +{ + common_start(); + save_item(NAME(m_reg)); +} + +void nes_ks7057_device::pcb_reset() +{ + prg8_ab(0x0d); + prg16_cdef(0x07); + chr8(0, CHRRAM); + + std::fill(std::begin(m_reg), std::end(m_reg), 0x00); +} + /*------------------------------------------------- @@ -739,3 +758,54 @@ void nes_ks7037_device::write_h(offs_t offset, uint8_t data) } } } + +/*------------------------------------------------- + + Kaiser Board KS7057 + + Games: Gyruss + + This PCB has fixed banks after 0xa000 and 8x2K + swappable banks in 0x6000-0x9fff. Pairs of nibble + registers (we store joined as bytes) control the banks, + with $B000/$B001, $B002/$B003, $C000/$C001, $C002/$C003 + selecting 4 banks in 0x8000-0x9fff, and $D000/$D001, + $D002/$D003, $E000/$E001, $E002/$E003 selecting the + remaining 4 banks in 0x6000-0x7fff. + + NES 2.0: mapper 302 + + In MAME: Supported. + + -------------------------------------------------*/ + +u8 nes_ks7057_device::read_m(offs_t offset) +{ +// LOG_MMC(("ks7057 read_m, offset: %04x\n", offset)); + return m_prg[0x800 * m_reg[((offset >> 11) & 0x03) + 4] + (offset & 0x7ff)]; +} + +u8 nes_ks7057_device::read_h(offs_t offset) +{ +// LOG_MMC(("ks7057 read_h, offset: %04x\n", offset)); + if (offset < 0x2000) + return m_prg[0x800 * m_reg[(offset >> 11) & 0x03] + (offset & 0x7ff)]; + + return hi_access_rom(offset); +} + +void nes_ks7057_device::write_h(offs_t offset, u8 data) +{ + LOG_MMC(("ks7057 write_h, offset: %04x, data: %02x\n", offset, data)); + + if (offset < 0x2000) + set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); + else if (offset >= 0x3000 && offset < 0x6004) + { + u8 reg = (((offset >> 11) & 0x0e) | BIT(offset, 1)) - 6; + if (BIT(offset, 0)) + m_reg[reg] = (m_reg[reg] & 0x0f) | ((data & 0x03) << 4); + else + m_reg[reg] = (m_reg[reg] & 0xf0) | (data & 0x0f); + } +} diff --git a/src/devices/bus/nes/kaiser.h b/src/devices/bus/nes/kaiser.h index e0e31658cdb..8b57957e501 100644 --- a/src/devices/bus/nes/kaiser.h +++ b/src/devices/bus/nes/kaiser.h @@ -233,6 +233,29 @@ private: }; +// ======================> nes_ks7057_device + +class nes_ks7057_device : public nes_nrom_device +{ +public: + // construction/destruction + nes_ks7057_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual u8 read_m(offs_t offset) override; + virtual u8 read_h(offs_t offset) override; + virtual void write_h(offs_t offset, u8 data) override; + + virtual void pcb_reset() override; + +protected: + // device-level overrides + virtual void device_start() override; + +private: + u8 m_reg[8]; +}; + + // device type definition DECLARE_DEVICE_TYPE(NES_KS7058, nes_ks7058_device) DECLARE_DEVICE_TYPE(NES_KS7022, nes_ks7022_device) @@ -244,5 +267,6 @@ DECLARE_DEVICE_TYPE(NES_KS7013B, nes_ks7013b_device) DECLARE_DEVICE_TYPE(NES_KS7031, nes_ks7031_device) DECLARE_DEVICE_TYPE(NES_KS7016, nes_ks7016_device) DECLARE_DEVICE_TYPE(NES_KS7037, nes_ks7037_device) +DECLARE_DEVICE_TYPE(NES_KS7057, nes_ks7057_device) #endif // MAME_BUS_NES_KAISER_H diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp index 7a1aad34e41..ac35e998231 100644 --- a/src/devices/bus/nes/mmc3_clones.cpp +++ b/src/devices/bus/nes/mmc3_clones.cpp @@ -29,7 +29,7 @@ //------------------------------------------------- DEFINE_DEVICE_TYPE(NES_NITRA, nes_nitra_device, "nes_nitra", "NES Cart Nitra PCB") -DEFINE_DEVICE_TYPE(NES_KS7057, nes_ks7057_device, "nes_ks7057", "NES Cart KS-7057 PCB") +DEFINE_DEVICE_TYPE(NES_FS6, nes_fs6_device, "nes_fs6", "NES Cart Fight Street VI PCB") DEFINE_DEVICE_TYPE(NES_SBROS11, nes_sbros11_device, "nes_smb11", "NES Cart SMB 11 PCB") DEFINE_DEVICE_TYPE(NES_MALISB, nes_malisb_device, "nes_malisb", "NES Cart Mali Spash Bomb PCB") DEFINE_DEVICE_TYPE(NES_FAMILY4646, nes_family4646_device, "nes_family4646", "NES Cart BMC-FAMILY04646 PCB") @@ -71,8 +71,8 @@ nes_nitra_device::nes_nitra_device(const machine_config &mconfig, const char *ta { } -nes_ks7057_device::nes_ks7057_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nes_txrom_device(mconfig, NES_KS7057, tag, owner, clock) +nes_fs6_device::nes_fs6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : nes_txrom_device(mconfig, NES_FS6, tag, owner, clock) { } @@ -646,21 +646,21 @@ void nes_nitra_device::write_h(offs_t offset, uint8_t data) /*------------------------------------------------- - Board UNL-KS7057 + Board UNL-FS6 Games: Street Fighter VI / Fight Street VI MMC3 clone (identical, but for switched address lines) - NES 2.0: mapper 302 + iNES: mapper 196 alt? In MAME: Supported. -------------------------------------------------*/ -void nes_ks7057_device::write_h(offs_t offset, uint8_t data) +void nes_fs6_device::write_h(offs_t offset, uint8_t data) { - LOG_MMC(("ks7057 write_h, offset: %04x, data: %02x\n", offset, data)); + LOG_MMC(("fs6 write_h, offset: %04x, data: %02x\n", offset, data)); offset = (BIT(offset, 0) << 1) | BIT(offset, 1) | (offset & ~0x03); txrom_write(offset, data); diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h index 680e86b4c9c..b22c55b3b4a 100644 --- a/src/devices/bus/nes/mmc3_clones.h +++ b/src/devices/bus/nes/mmc3_clones.h @@ -21,13 +21,13 @@ public: }; -// ======================> nes_ks7057_device +// ======================> nes_fs6_device -class nes_ks7057_device : public nes_txrom_device +class nes_fs6_device : public nes_txrom_device { public: // construction/destruction - nes_ks7057_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + nes_fs6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // device-level overrides virtual void write_h(offs_t offset, uint8_t data) override; @@ -718,7 +718,7 @@ private: // device type definition DECLARE_DEVICE_TYPE(NES_NITRA, nes_nitra_device) -DECLARE_DEVICE_TYPE(NES_KS7057, nes_ks7057_device) +DECLARE_DEVICE_TYPE(NES_FS6, nes_fs6_device) DECLARE_DEVICE_TYPE(NES_SBROS11, nes_sbros11_device) DECLARE_DEVICE_TYPE(NES_MALISB, nes_malisb_device) DECLARE_DEVICE_TYPE(NES_FAMILY4646, nes_family4646_device) diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp index df62482ef5f..0f12e24391c 100644 --- a/src/devices/bus/nes/nes_carts.cpp +++ b/src/devices/bus/nes/nes_carts.cpp @@ -259,6 +259,7 @@ void nes_cart(device_slot_interface &device) device.option_add_internal("ks7031", NES_KS7031); // used in Dracula II (FDS Conversion); device.option_add_internal("ks7016", NES_KS7016); // used in Exciting Basket (FDS Conversion); device.option_add_internal("ks7037", NES_KS7037); // used in Metroid (FDS Conversion); + device.option_add_internal("ks7057", NES_KS7057); // used in Gyruss (FDS Conversion); device.option_add_internal("gs2015", NES_GS2015); device.option_add_internal("gs2004", NES_GS2004); device.option_add_internal("gs2013", NES_GS2013); @@ -311,7 +312,7 @@ void nes_cart(device_slot_interface &device) device.option_add_internal("sl1632", NES_REX_SL1632); device.option_add_internal("somari", NES_SOMARI); // mapper 116 device.option_add_internal("nitra", NES_NITRA); - device.option_add_internal("ks7057", NES_KS7057); // mapper 196 alt (for Street Fighter VI / Fight Street VI); + device.option_add_internal("fs6", NES_FS6); // mapper 196 alt? (for Street Fighter VI / Fight Street VI); device.option_add_internal("sbros11", NES_SBROS11); device.option_add_internal("unl_malisb", NES_MALISB); // used by Super Mali Splash Bomb device.option_add_internal("family4646", NES_FAMILY4646); diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx index 81d60a9eb64..17493d35370 100644 --- a/src/devices/bus/nes/nes_pcb.hxx +++ b/src/devices/bus/nes/nes_pcb.hxx @@ -171,6 +171,7 @@ static const nes_pcb pcb_list[] = { "ks7013b", KAISER_KS7013B }, // used in Highway Star (FDS Conversion) { "ks7016", KAISER_KS7016 }, // used in Exciting Basketball (FDS Conversion) { "ks7037", KAISER_KS7037 }, // Metroid FDS Chinese + { "ks7057", KAISER_KS7057 }, // Gyruss (FDS Conversion) { "gs2015", RCM_GS2015 }, { "gs2004", RCM_GS2004 }, { "gs2013", RCM_GS2013 }, @@ -209,7 +210,7 @@ static const nes_pcb pcb_list[] = { "sl1632", REXSOFT_SL1632 }, { "somari", SOMARI_SL12 }, // mapper 116 { "nitra", NITRA_TDA }, - { "ks7057", UNL_KS7057 }, // mapper 196 alt (for Street Fighter VI / Fight Street VI }, + { "fs6", UNL_FS6 }, // mapper 196 alt? (for Street Fighter VI / Fight Street VI }, { "sbros11", BTL_SBROS11 }, { "family4646", BMC_FAMILY_4646 }, { "pikay2k", BTL_PIKACHUY2K }, // mapper 254 diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h index 5f810e3c6fe..7cc5f1b247b 100644 --- a/src/devices/bus/nes/nes_slot.h +++ b/src/devices/bus/nes/nes_slot.h @@ -101,9 +101,9 @@ enum BMC_411120C, BMC_GOLD150, BMC_GOLD260, BMC_CH001, BMC_SUPER22, BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET, /* Unlicensed */ - UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97, UNL_KS7057, + UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97, UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE, - UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, + UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6, UNL_SF3, UNL_RACERMATE, UNL_EDU2K, UNL_LH53, UNL_LH32, UNL_LH10, UNL_STUDYNGAME, UNL_603_5052, UNL_H2288, UNL_2708, UNL_MALISB, UNL_BB, UNL_AC08, UNL_A9746, UNL_WORLDHERO, @@ -118,7 +118,7 @@ enum HENGG_SRICH, HENGG_XHZS, HENGG_SHJY3, SUBOR_TYPE0, SUBOR_TYPE1, SUBOR_TYPE2, KAISER_KS7058, KAISER_KS7032, KAISER_KS7022, KAISER_KS7017, KAISER_KS7012, KAISER_KS7013B, KAISER_KS202, KAISER_KS7031, - KAISER_KS7016, KAISER_KS7037, + KAISER_KS7016, KAISER_KS7037, KAISER_KS7057, CNE_DECATHLON, CNE_FSB, CNE_SHLZ, CONY_BOARD, YOKO_BOARD, RCM_GS2015, RCM_GS2004, RCM_GS2013, RCM_TF9IN1, RCM_3DBLOCK, WAIXING_TYPE_A, WAIXING_TYPE_A1, WAIXING_TYPE_B, WAIXING_TYPE_C, WAIXING_TYPE_D, diff --git a/src/mame/machine/nes.cpp b/src/mame/machine/nes.cpp index 43f55e607d0..a545f60b272 100644 --- a/src/mame/machine/nes.cpp +++ b/src/mame/machine/nes.cpp @@ -73,7 +73,7 @@ void nes_state::machine_start() if (m_cartslot->get_pcb_id() == STD_EXROM || m_cartslot->get_pcb_id() == STD_NROM368 || m_cartslot->get_pcb_id() == STD_DISKSYS || m_cartslot->get_pcb_id() == GG_NROM || m_cartslot->get_pcb_id() == CAMERICA_ALADDIN || m_cartslot->get_pcb_id() == SUNSOFT_DCS || m_cartslot->get_pcb_id() == BANDAI_DATACH || m_cartslot->get_pcb_id() == BANDAI_KARAOKE || m_cartslot->get_pcb_id() == UNL_2A03PURITANS || m_cartslot->get_pcb_id() == AVE_MAXI15 - || m_cartslot->get_pcb_id() == KAISER_KS7022 || m_cartslot->get_pcb_id() == KAISER_KS7031 || m_cartslot->get_pcb_id() == KAISER_KS7037 || m_cartslot->get_pcb_id() == BMC_VT5201 + || m_cartslot->get_pcb_id() == KAISER_KS7022 || m_cartslot->get_pcb_id() == KAISER_KS7031 || m_cartslot->get_pcb_id() == KAISER_KS7037 || m_cartslot->get_pcb_id() == KAISER_KS7057 || m_cartslot->get_pcb_id() == BMC_VT5201 || m_cartslot->get_pcb_id() == UNL_LH32 || m_cartslot->get_pcb_id() == UNL_LH10 || m_cartslot->get_pcb_id() == UNL_2708 || m_cartslot->get_pcb_id() == UNL_RT01 || m_cartslot->get_pcb_id() == UNL_43272 || m_cartslot->get_pcb_id() == BMC_G63IN1 || m_cartslot->get_pcb_id() == BMC_8157 || m_cartslot->get_pcb_id() == BMC_GOLD150 || m_cartslot->get_pcb_id() == BMC_CH001