From 9cadcbf829909dd2cf462b7d7cd5080eb12e81fd Mon Sep 17 00:00:00 2001 From: Tauwasser Date: Tue, 24 May 2016 12:40:58 +0200 Subject: [PATCH] Gameboy: add correct M161 implementation Signed-off-by: Tauwasser --- hash/gameboy.xml | 2 +- src/devices/bus/gameboy/mbc.cpp | 22 +++++++++++++--------- src/devices/bus/gameboy/mbc.h | 1 + 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/hash/gameboy.xml b/hash/gameboy.xml index 934c60a4541..2f46487a1c0 100644 --- a/hash/gameboy.xml +++ b/hash/gameboy.xml @@ -11917,7 +11917,7 @@ - + Mani 4 in 1 (Chi, DMG-601 CHN) 19?? Mani diff --git a/src/devices/bus/gameboy/mbc.cpp b/src/devices/bus/gameboy/mbc.cpp index 1f0b137be9f..64501b1e765 100644 --- a/src/devices/bus/gameboy/mbc.cpp +++ b/src/devices/bus/gameboy/mbc.cpp @@ -88,7 +88,7 @@ gb_rom_mbc7_device::gb_rom_mbc7_device(const machine_config &mconfig, const char } gb_rom_m161_device::gb_rom_m161_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : gb_rom_mbc_device(mconfig, GB_ROM_M161, "GB M161 Carts", tag, owner, clock, "gb_rom_m161", __FILE__), m_base_bank(0) + : gb_rom_mbc_device(mconfig, GB_ROM_M161, "GB M161 Carts", tag, owner, clock, "gb_rom_m161", __FILE__), m_base_bank(0), m_load_disable(0) { } @@ -217,12 +217,14 @@ void gb_rom_m161_device::device_start() { shared_start(); save_item(NAME(m_base_bank)); + save_item(NAME(m_load_disable)); } void gb_rom_m161_device::device_reset() { shared_reset(); m_base_bank = 0; + m_load_disable = 0; } void gb_rom_mmm01_device::device_start() @@ -668,20 +670,22 @@ WRITE8_MEMBER(gb_rom_mbc7_device::write_ram) READ8_MEMBER(gb_rom_m161_device::read_rom) { - if (offset < 0x4000) - return m_rom[rom_bank_map[m_base_bank] * 0x4000 + offset]; - else - return m_rom[rom_bank_map[m_base_bank] * 0x4000 + (offset & 0x3fff)]; + return m_rom[rom_bank_map[m_base_bank] * 0x4000 + (offset & 0x7fff)]; } WRITE8_MEMBER(gb_rom_m161_device::write_bank) { - switch (offset & 0xe000) + // the mapper (74HC161A) only has data lines D2..D0 + data &= 0x07; + + // A15 is connected to #LOAD and overwritten by QD (m_load_disable) + switch (offset & 0x8000) { - case 0x4000: // Base Bank Register - m_base_bank = data << 1; + case 0x0000: // Base Bank Register + if (!m_load_disable) + m_base_bank = data << 1; + m_load_disable = 0x01; break; - case 0x2000: // Tetris writes 1 here when selected... default: break; } diff --git a/src/devices/bus/gameboy/mbc.h b/src/devices/bus/gameboy/mbc.h index 13f10cef3ed..48baceca42d 100644 --- a/src/devices/bus/gameboy/mbc.h +++ b/src/devices/bus/gameboy/mbc.h @@ -172,6 +172,7 @@ public: virtual DECLARE_WRITE8_MEMBER(write_ram) override { } UINT8 m_base_bank; + UINT8 m_load_disable; }; // ======================> gb_rom_mmm01_device