summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2021-08-11 12:53:07 -0800
committer GitHub <noreply@github.com>2021-08-11 16:53:07 -0400
commit2d412c74d22b8839d51eef78af45c2ba31a3c800 (patch)
treecef600205a4158ae0785dbe9daf89927438fff23 /src/devices/bus
parent1a01c98fa2376917e3cf008c70f42aeb1354dffd (diff)
bus/nes: Fixed bugs in Game Star type "A" boards. (#8425)
- Corrects certain games not loading or loading with corrupt graphics in different multicarts.
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/nes/multigame.cpp45
-rw-r--r--src/devices/bus/nes/multigame.h7
2 files changed, 24 insertions, 28 deletions
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);
- }
-
- set_nt_mirroring((m_latch2 & 0x08) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ u8 bank = m_reg[1] >> 5;
+ u8 mode = BIT(m_reg[1], 4);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
- 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];
};