diff --git a/hash/nes.xml b/hash/nes.xml index 87cc9b41538..7d6f3fdaeeb 100644 --- a/hash/nes.xml +++ b/hash/nes.xml @@ -1701,7 +1701,7 @@ - + Aoki Ookami to Shiroki Mejika - Genchou Hishi (Jpn) 1993 Koei @@ -1718,8 +1718,7 @@ - - + @@ -2756,7 +2755,7 @@ - + Bandit Kings of Ancient China (USA) 1990 Koei @@ -2773,7 +2772,6 @@ - @@ -7638,7 +7636,6 @@ - @@ -14040,7 +14037,6 @@ - @@ -18022,7 +18018,6 @@ - @@ -19000,7 +18995,6 @@ - @@ -20918,7 +20912,6 @@ - @@ -20947,7 +20940,6 @@ - @@ -26680,7 +26672,6 @@ - @@ -26706,7 +26697,6 @@ - @@ -26787,7 +26777,6 @@ - @@ -31162,7 +31151,6 @@ - @@ -31933,7 +31921,6 @@ - @@ -31959,7 +31946,6 @@ - @@ -32957,7 +32943,6 @@ - @@ -35507,7 +35492,7 @@ - + Suikoden - Tenmei no Chikai (Jpn) 1990 Koei @@ -35525,7 +35510,6 @@ - @@ -40364,7 +40348,6 @@ - @@ -43324,7 +43307,6 @@ We should eventually add it to MESS as a separate driver with a NES CPU and a GB - @@ -47858,7 +47840,6 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - diff --git a/src/emu/bus/nes/mmc5.c b/src/emu/bus/nes/mmc5.c index d4d485dcf86..dc99a7d0934 100644 --- a/src/emu/bus/nes/mmc5.c +++ b/src/emu/bus/nes/mmc5.c @@ -83,6 +83,8 @@ void nes_exrom_device::device_start() save_item(NAME(m_split_bank)); save_item(NAME(m_vcount)); save_item(NAME(m_exram)); + save_item(NAME(m_ram_hi_banks)); + } void nes_exrom_device::pcb_reset() @@ -129,6 +131,11 @@ void nes_exrom_device::pcb_reset() m_prg_ram_mapped[1] = 0; m_prg_ram_mapped[2] = 0; m_prg_ram_mapped[3] = 0; + + m_ram_hi_banks[0] = 0; + m_ram_hi_banks[1] = 0; + m_ram_hi_banks[2] = 0; + m_ram_hi_banks[3] = 0; } @@ -144,29 +151,10 @@ void nes_exrom_device::pcb_reset() iNES: mapper 5 - MESS status: Mostly Unsupported + MESS status: Partially supported -------------------------------------------------*/ -/* MMC5 can map PRG RAM to 0x8000-0xdfff */ -void nes_exrom_device::prgram_bank8_x(int start, int bank) -{ - assert(start < 4); - assert(bank >= 0); - assert(m_prgram.count() + m_battery.count()); - - // currently we use 4x8k BWRAM + 4x8k WRAM banks, independently from the actual PRG-RAM size - // mirroring of the actual size is taken care of at bank setup (even if no known commercial game relies on it!) - //bank &= (m_prgram.count() / 0x2000) - 1; - if (!m_prgram.count() || !m_battery.count()) - bank &= 3; - - // PRG RAM is mapped after PRG ROM - m_prg_bank[start] = m_prg_chunks + bank; - m_prg_bank_mem[start]->set_entry(m_prg_bank[start]); -} - - void nes_exrom_device::update_prg() { int bank0, bank1, bank2, bank3; @@ -184,8 +172,8 @@ void nes_exrom_device::update_prg() if (m_prg_ram_mapped[1]) { - prgram_bank8_x(0, ((bank1 << 1) & 0x07)); - prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1); + m_ram_hi_banks[0] = ((bank1 << 1) & 0x07); + m_ram_hi_banks[1] = ((bank1 << 1) & 0x07) | 1; } else prg16_89ab(bank1); @@ -200,14 +188,14 @@ void nes_exrom_device::update_prg() if (m_prg_ram_mapped[1]) { - prgram_bank8_x(0, ((bank1 << 1) & 0x07)); - prgram_bank8_x(1, ((bank1 << 1) & 0x07) | 1); + m_ram_hi_banks[0] = ((bank1 << 1) & 0x07); + m_ram_hi_banks[1] = ((bank1 << 1) & 0x07) | 1; } else prg16_89ab(bank1); if (m_prg_ram_mapped[2]) - prgram_bank8_x(2, bank2 & 0x07); + m_ram_hi_banks[2] = (bank2 & 0x07); else prg8_cd(bank2); @@ -221,17 +209,17 @@ void nes_exrom_device::update_prg() bank3 = m_prg_regs[3]; if (m_prg_ram_mapped[0]) - prgram_bank8_x(0, bank0 & 0x07); + m_ram_hi_banks[0] = (bank0 & 0x07); else prg8_89(bank0); if (m_prg_ram_mapped[1]) - prgram_bank8_x(1, bank1 & 0x07); + m_ram_hi_banks[1] = (bank1 & 0x07); else prg8_ab(bank1); if (m_prg_ram_mapped[2]) - prgram_bank8_x(2, bank2 & 0x07); + m_ram_hi_banks[2] = (bank2 & 0x07); else prg8_cd(bank2); @@ -631,10 +619,10 @@ WRITE8_MEMBER(nes_exrom_device::write_l) // 3bits are used to access the "WRAM" banks // bit3 select the chip (2 of them can be accessed, each up to 32KB) // bit1 & bit2 select the 8KB banks inside the chip -// same mechanism is used also when "WRAM" is mapped in higher banks, but there we setup the bank map in a smart -// way so to access the correct bank as if the 3 bits were directly selecting the bank in a 64KB RAM area +// same mechanism is used also when "WRAM" is mapped in higher banks READ8_MEMBER(nes_exrom_device::read_m) { + LOG_MMC(("exrom read_m, offset: %04x\n", offset)); if (m_battery && m_prgram) // 2 chips present: first is BWRAM, second is WRAM { if (m_wram_base & 0x04) @@ -652,6 +640,7 @@ READ8_MEMBER(nes_exrom_device::read_m) WRITE8_MEMBER(nes_exrom_device::write_m) { + LOG_MMC(("exrom write_m, offset: %04x, data: %02x\n", offset, data)); if (m_wram_protect_1 != 0x02 || m_wram_protect_2 != 0x01) return; @@ -662,16 +651,31 @@ WRITE8_MEMBER(nes_exrom_device::write_m) } // some games (e.g. Bandit Kings of Ancient China) write to PRG-RAM through 0x8000-0xdfff -// it does not work well yet! +READ8_MEMBER(nes_exrom_device::read_h) +{ + LOG_MMC(("exrom read_h, offset: %04x\n", offset)); + int bank = offset / 0x2000; + + if (bank < 3 && offset >= bank * 0x2000 && offset < (bank + 1) * 0x2000 && m_prg_ram_mapped[bank]) + { + if (m_battery && m_ram_hi_banks[bank] < 4) + return m_battery[((m_ram_hi_banks[bank] * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)]; + else if (m_prgram) + return m_prgram[(((m_ram_hi_banks[bank] & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)]; + } + + return hi_access_rom(offset); +} + WRITE8_MEMBER(nes_exrom_device::write_h) { + LOG_MMC(("exrom write_h, offset: %04x, data: %02x\n", offset, data)); int bank = offset / 0x2000; if (m_wram_protect_1 != 0x02 || m_wram_protect_2 != 0x01 || bank == 3 || !m_prg_ram_mapped[bank]) return; - bank = m_prg_bank[bank] - m_prg_chunks; - if (m_battery && m_prg_bank[bank] < m_prg_chunks + 4) - m_battery[((bank * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)] = data; + if (m_battery && m_ram_hi_banks[bank] < 4) + m_battery[((m_ram_hi_banks[bank] * 0x2000) + (offset & 0x1fff)) & (m_battery.count() - 1)] = data; else if (m_prgram) - m_prgram[(((bank & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)] = data; + m_prgram[(((m_ram_hi_banks[bank] & 3) * 0x2000) + (offset & 0x1fff)) & (m_prgram.count() - 1)] = data; } diff --git a/src/emu/bus/nes/mmc5.h b/src/emu/bus/nes/mmc5.h index dbd4988d839..d507429b58a 100644 --- a/src/emu/bus/nes/mmc5.h +++ b/src/emu/bus/nes/mmc5.h @@ -16,6 +16,7 @@ public: virtual void device_start(); virtual DECLARE_READ8_MEMBER(read_l); virtual DECLARE_READ8_MEMBER(read_m); + virtual DECLARE_READ8_MEMBER(read_h); virtual DECLARE_WRITE8_MEMBER(write_l); virtual DECLARE_WRITE8_MEMBER(write_m); virtual DECLARE_WRITE8_MEMBER(write_h); @@ -29,7 +30,6 @@ public: protected: void set_mirror(int page, int src); - void prgram_bank8_x(int start, int bank); void update_render_mode(); void update_prg(); @@ -78,6 +78,8 @@ protected: // MMC-5 contains 1K of internal ram UINT8 m_exram[0x400]; + + UINT8 m_ram_hi_banks[4]; // int m_nes_vram_sprite[8]; }; diff --git a/src/emu/bus/nes/nes_slot.c b/src/emu/bus/nes/nes_slot.c index 97bea9dd9f3..58b8345cf29 100644 --- a/src/emu/bus/nes/nes_slot.c +++ b/src/emu/bus/nes/nes_slot.c @@ -672,52 +672,7 @@ void device_nes_cart_interface::pcb_start(running_machine &machine, UINT8 *ciram m_prg_bank_mem[3] = machine.root_device().membank("prg3"); for (int i = 0; i < 4; i++) { - int next_bank = m_prg.count() / 0x2000; m_prg_bank_mem[i]->configure_entries(0, m_prg.count() / 0x2000, m_prg, 0x2000); - // MMC5 (and a few other PCBs) can also map WRAM/BWRAM in these banks, so we add here 4x8K banks for each RAM chip - // No boards with 64Kb of WRAM/BWRAM has been found so far, otherwise the code has to be updated! - if (m_battery) - { - if (m_battery.count() / 0x2000 == 4) - { - m_prg_bank_mem[i]->configure_entries(next_bank, 4, m_battery, 0x2000); - } - if (m_battery.count() / 0x2000 == 2) - { - m_prg_bank_mem[i]->configure_entries(next_bank + 0, 2, m_battery, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 2, 2, m_battery, 0x2000); - } - if (m_battery.count() / 0x2000 == 1) - { - m_prg_bank_mem[i]->configure_entries(next_bank + 0, 1, m_battery, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 1, 1, m_battery, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 2, 1, m_battery, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 3, 1, m_battery, 0x2000); - } - next_bank += 4; - } - if (m_prgram) - { - if (m_prgram.count() / 0x2000 == 4) - { - m_prg_bank_mem[i]->configure_entries(next_bank, 4, m_prgram, 0x2000); - } - if (m_prgram.count() / 0x2000 == 2) - { - m_prg_bank_mem[i]->configure_entries(next_bank + 0, 2, m_prgram, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 2, 2, m_prgram, 0x2000); - } - if (m_prgram.count() / 0x2000 == 1) - { - m_prg_bank_mem[i]->configure_entries(next_bank + 0, 1, m_prgram, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 1, 1, m_prgram, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 2, 1, m_prgram, 0x2000); - m_prg_bank_mem[i]->configure_entries(next_bank + 3, 1, m_prgram, 0x2000); - } - next_bank += 4; - } - - // ...but we always map the banks to PRG at start m_prg_bank_mem[i]->set_entry(i); m_prg_bank[i] = i; } diff --git a/src/mess/machine/nes.c b/src/mess/machine/nes.c index 1eeca495fff..f0a299cb3e1 100644 --- a/src/mess/machine/nes.c +++ b/src/mess/machine/nes.c @@ -158,7 +158,8 @@ void nes_state::machine_start() m_ppu->set_latch(ppu2c0x_latch_delegate(FUNC(device_nes_cart_interface::ppu_latch),m_cartslot->m_cart)); // install additional handlers (read_h, read_ex, write_ex) - if (m_cartslot->get_pcb_id() == STD_NROM368 || m_cartslot->get_pcb_id() == GG_NROM || m_cartslot->get_pcb_id() == CAMERICA_ALADDIN || m_cartslot->get_pcb_id() == SUNSOFT_DCS + if (m_cartslot->get_pcb_id() == STD_EXROM || m_cartslot->get_pcb_id() == STD_NROM368 + || 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() == BTL_2A03_PURITANS || 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() == BMC_VT5201 || m_cartslot->get_pcb_id() == UNL_LH32 || m_cartslot->get_pcb_id() == UNL_LH10 || m_cartslot->get_pcb_id() == UNL_2708