From 1aa7194558671113ed8f9592b6569dc68c696c7b Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Fri, 7 Feb 2014 13:30:33 +0000 Subject: [PATCH] (MESS) nes_mmc5: further cleanups (this time for NT-RAM handling). no visible improvements, but it bothered me that we were saving as NVRAM the external RAM, while it was volatile in real carts. nw. --- src/mess/machine/nes_mmc5.c | 74 +++++++++++++++++++++++++------------ src/mess/machine/nes_mmc5.h | 1 + src/mess/machine/nes_slot.c | 8 ++-- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/mess/machine/nes_mmc5.c b/src/mess/machine/nes_mmc5.c index b20f004056d..6e9d4da0873 100644 --- a/src/mess/machine/nes_mmc5.c +++ b/src/mess/machine/nes_mmc5.c @@ -79,9 +79,6 @@ void nes_exrom_device::device_start() m_exram = auto_alloc_array_clear(machine(), UINT8, 0x400); save_pointer(NAME(m_exram), 0x400); - - m_mapper_sram_size = 0x400; - m_mapper_sram = m_exram; } void nes_exrom_device::pcb_reset() @@ -121,22 +118,6 @@ void nes_exrom_device::pcb_reset() } -READ8_MEMBER(nes_exrom_device::nt_r) -{ - int page = ((offset & 0xc00) >> 10); - - if (m_nt_src[page] == MMC5FILL) - { - if ((offset & 0x3ff) >= 0x3c0) - return m_floodattr; - - return m_floodtile; - } - return m_nt_access[page][offset & 0x3ff]; -} - - - /*------------------------------------------------- mapper specific handlers -------------------------------------------------*/ @@ -348,16 +329,16 @@ void nes_exrom_device::set_mirror(int page, int src) { switch (src) { - case 0: /* CIRAM0 */ + case 0: set_nt_page(page, CIRAM, 0, 1); break; - case 1: /* CIRAM1 */ + case 1: set_nt_page(page, CIRAM, 1, 1); break; - case 2: /* ExRAM */ - set_nt_page(page, EXRAM, 0, 1); // actually only works during rendering. + case 2: + set_nt_page(page, EXRAM, 0, 1); break; - case 3: /* Fill Registers */ + case 3: set_nt_page(page, MMC5FILL, 0, 0); break; default: @@ -366,6 +347,51 @@ void nes_exrom_device::set_mirror(int page, int src) } } + +READ8_MEMBER(nes_exrom_device::nt_r) +{ + int page = ((offset & 0xc00) >> 10); + + switch (m_nt_src[page]) + { + case MMC5FILL: + if ((offset & 0x3ff) >= 0x3c0) + return m_floodattr; + return m_floodtile; + + case EXRAM: + if (!BIT(m_exram_control, 1)) + return m_exram[offset & 0x3ff]; + else + return 0x00; + + case CIRAM: + default: + return m_nt_access[page][offset & 0x3ff]; + } +} + +WRITE8_MEMBER(nes_exrom_device::nt_w) +{ + int page = ((offset & 0xc00) >> 10); + + if (!m_nt_writable[page]) + return; + + switch (m_nt_src[page]) + { + case EXRAM: + m_exram[offset & 0x3ff] = data; + break; + + case CIRAM: + default: + m_nt_access[page][offset & 0x3ff] = data; + break; + } +} + + READ8_MEMBER(nes_exrom_device::read_l) { int value; diff --git a/src/mess/machine/nes_mmc5.h b/src/mess/machine/nes_mmc5.h index e8077fd71c6..bdaf359ae32 100644 --- a/src/mess/machine/nes_mmc5.h +++ b/src/mess/machine/nes_mmc5.h @@ -19,6 +19,7 @@ public: virtual DECLARE_WRITE8_MEMBER(write_l); virtual DECLARE_WRITE8_MEMBER(write_m); virtual DECLARE_READ8_MEMBER(nt_r); + virtual DECLARE_WRITE8_MEMBER(nt_w); virtual void hblank_irq(int scanline, int vblank, int blanked); virtual void pcb_reset(); diff --git a/src/mess/machine/nes_slot.c b/src/mess/machine/nes_slot.c index 98f13cecfeb..e96f3cc3d0a 100644 --- a/src/mess/machine/nes_slot.c +++ b/src/mess/machine/nes_slot.c @@ -503,15 +503,13 @@ void device_nes_cart_interface::set_nt_page(int page, int source, int bank, int case CART_NTRAM: base_ptr = m_ext_ntram; break; - case MMC5FILL: - base_ptr = NULL; - break; case VROM: bank &= ((m_vrom_chunks << 3) - 1); base_ptr = m_vrom; break; case EXRAM: - base_ptr = m_mapper_sram; + case MMC5FILL: + base_ptr = NULL; break; case CIRAM: default: @@ -522,7 +520,7 @@ void device_nes_cart_interface::set_nt_page(int page, int source, int bank, int page &= 3; /* mask down to the 4 logical pages */ m_nt_src[page] = source; - if (base_ptr != NULL) + if (base_ptr) { m_nt_orig[page] = bank * 0x400; m_nt_access[page] = base_ptr + m_nt_orig[page];