From 2d412c74d22b8839d51eef78af45c2ba31a3c800 Mon Sep 17 00:00:00 2001 From: 0kmg <9137159+0kmg@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:53:07 -0800 Subject: [PATCH] bus/nes: Fixed bugs in Game Star type "A" boards. (#8425) - Corrects certain games not loading or loading with corrupt graphics in different multicarts. --- hash/nes.xml | 8 +++--- src/devices/bus/nes/multigame.cpp | 45 ++++++++++++++----------------- src/devices/bus/nes/multigame.h | 7 ++--- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/hash/nes.xml b/hash/nes.xml index 6e175b88eb0..417330c226b 100644 --- a/hash/nes.xml +++ b/hash/nes.xml @@ -79799,7 +79799,7 @@ be better to redump them properly. --> - + 6 in 1 (GK-L01A) 19?? Game Star @@ -79821,7 +79821,7 @@ be better to redump them properly. --> - + 6 in 1 (SuperGK-L02A) 19?? Game Star? @@ -80013,13 +80013,13 @@ be better to redump them properly. --> + 68 in 1 19?? <unknown> - - + diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp index 38123976175..02bac0698bc 100644 --- a/src/devices/bus/nes/multigame.cpp +++ b/src/devices/bus/nes/multigame.cpp @@ -182,8 +182,8 @@ nes_bmc_gb63_device::nes_bmc_gb63_device(const machine_config &mconfig, const ch { } -nes_bmc_gka_device::nes_bmc_gka_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nes_nrom_device(mconfig, NES_BMC_GKA, tag, owner, clock), m_latch1(0), m_latch2(0) +nes_bmc_gka_device::nes_bmc_gka_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_nrom_device(mconfig, NES_BMC_GKA, tag, owner, clock) { } @@ -661,19 +661,16 @@ void nes_bmc_gb63_device::pcb_reset() void nes_bmc_gka_device::device_start() { common_start(); - save_item(NAME(m_latch1)); - save_item(NAME(m_latch2)); + save_item(NAME(m_reg)); } void nes_bmc_gka_device::pcb_reset() { - m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; prg16_89ab(0); prg16_cdef(0); - chr8(0, m_chr_source); + chr8(0, CHRROM); - m_latch1 = 0; - m_latch2 = 0; + m_reg[0] = m_reg[1] = 0; } void nes_bmc_gkb_device::device_start() @@ -1772,33 +1769,31 @@ uint8_t nes_bmc_gb63_device::read_h(offs_t offset) iNES: mapper 57 - In MESS: Supported. + In MAME: Supported. -------------------------------------------------*/ -void nes_bmc_gka_device::write_h(offs_t offset, uint8_t data) +u8 nes_bmc_gka_device::read_m(offs_t offset) +{ + LOG_MMC(("bmc_gka read_m, offset: %04x\n", offset)); + return 0; // TODO: menus differ by jumper/DIP settings readable at 0x6000. +} + +void nes_bmc_gka_device::write_h(offs_t offset, u8 data) { LOG_MMC(("bmc_gka write_h, offset: %04x, data: %02x\n", offset, data)); - if (offset & 0x0800) - m_latch2 = data; - else - m_latch1 = data; + m_reg[BIT(offset, 11)] = data; - if (m_latch2 & 0x80) - prg32(2 | (m_latch2 >> 6)); - else - { - prg16_89ab((m_latch2 >> 5) & 0x03); - prg16_cdef((m_latch2 >> 5) & 0x03); - } + u8 bank = m_reg[1] >> 5; + u8 mode = BIT(m_reg[1], 4); + prg16_89ab(bank & ~mode); + prg16_cdef(bank | mode); - set_nt_mirroring((m_latch2 & 0x08) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); - - chr8((m_latch1 & 0x03) | (m_latch2 & 0x07) | ((m_latch2 & 0x10) >> 1), CHRROM); + chr8((m_reg[0] & 0x40) >> 3 | (m_reg[1] & 0x04) | (m_reg[BIT(m_reg[0], 7)] & 0x03), CHRROM); + set_nt_mirroring(BIT(m_reg[1], 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); } - /*------------------------------------------------- Board BMC-GKB diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h index bb8f80642e4..b6d8fe3c5b6 100644 --- a/src/devices/bus/nes/multigame.h +++ b/src/devices/bus/nes/multigame.h @@ -396,9 +396,10 @@ class nes_bmc_gka_device : public nes_nrom_device { public: // construction/destruction - nes_bmc_gka_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + nes_bmc_gka_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 u8 read_m(offs_t offset) override; + virtual void write_h(offs_t offset, u8 data) override; virtual void pcb_reset() override; @@ -407,7 +408,7 @@ protected: virtual void device_start() override; private: - uint8_t m_latch1, m_latch2; + u8 m_reg[2]; };