From d41dffbef78fca9af8dd4c2780eb6d7e3fc315e2 Mon Sep 17 00:00:00 2001 From: 0kmg <9137159+0kmg@users.noreply.github.com> Date: Tue, 1 Feb 2022 10:38:06 -0900 Subject: [PATCH] machine/vsnes.cpp: Simplified nametable mirroring. (#9226) --- src/mame/includes/vsnes.h | 6 -- src/mame/machine/vsnes.cpp | 123 ++++--------------------------------- 2 files changed, 13 insertions(+), 116 deletions(-) diff --git a/src/mame/includes/vsnes.h b/src/mame/includes/vsnes.h index 7ff39c0ac48..749914e8694 100644 --- a/src/mame/includes/vsnes.h +++ b/src/mame/includes/vsnes.h @@ -74,10 +74,6 @@ private: uint8_t vsnes_in0_1_r(); uint8_t vsnes_in1_1_r(); uint8_t gun_in0_r(); - void vsnes_nt0_w(offs_t offset, uint8_t data); - void vsnes_nt1_w(offs_t offset, uint8_t data); - uint8_t vsnes_nt0_r(offs_t offset); - uint8_t vsnes_nt1_r(offs_t offset); void vsnormal_vrom_banking(uint8_t data); void gun_in0_w(uint8_t data); void vskonami_rom_banking(offs_t offset, uint8_t data); @@ -97,7 +93,6 @@ private: void vsdual_vrom_banking_main(uint8_t data); void vsdual_vrom_banking_sub(uint8_t data); void vssmbbl_sn_w(offs_t offset, uint8_t data); - void v_set_mirroring(int ppu, int mirroring); DECLARE_MACHINE_START(vsnes); DECLARE_MACHINE_RESET(vsnes); @@ -127,7 +122,6 @@ private: uint8_t* m_vrom[2]; std::unique_ptr m_nt_ram[2]; memory_bank_array_creator<8> m_bank_vrom; - uint8_t* m_nt_page[2][4]; uint32_t m_vrom_size[2]; int m_vrom_banks; int m_zapstore; diff --git a/src/mame/machine/vsnes.cpp b/src/mame/machine/vsnes.cpp index e888ab973a4..ab5d478a59b 100644 --- a/src/mame/machine/vsnes.cpp +++ b/src/mame/machine/vsnes.cpp @@ -161,7 +161,7 @@ MACHINE_RESET_MEMBER(vsnes_state,vsdual) * *************************************/ -void vsnes_state::v_set_videorom_bank( int start, int count, int vrom_start_bank ) +void vsnes_state::v_set_videorom_bank(int start, int count, int vrom_start_bank) { int i; @@ -185,13 +185,9 @@ MACHINE_START_MEMBER(vsnes_state,vsnes) /* establish nametable ram */ m_nt_ram[0] = std::make_unique(0x1000); - /* set mirroring */ - m_nt_page[0][0] = m_nt_ram[0].get(); - m_nt_page[0][1] = m_nt_ram[0].get() + 0x400; - m_nt_page[0][2] = m_nt_ram[0].get() + 0x800; - m_nt_page[0][3] = m_nt_ram[0].get() + 0xc00; - ppu1_space.install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_r)), write8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_w))); + ppu1_space.install_ram(0x2000, 0x2fff, m_nt_ram[0].get()); + ppu1_space.install_ram(0x3000, 0x3eff, m_nt_ram[0].get()); if (m_gfx1_rom != nullptr) { @@ -234,18 +230,12 @@ MACHINE_START_MEMBER(vsnes_state,vsdual) /* establish nametable ram */ m_nt_ram[0] = std::make_unique(0x1000); m_nt_ram[1] = std::make_unique(0x1000); - /* set mirroring */ - m_nt_page[0][0] = m_nt_ram[0].get(); - m_nt_page[0][1] = m_nt_ram[0].get() + 0x400; - m_nt_page[0][2] = m_nt_ram[0].get() + 0x800; - m_nt_page[0][3] = m_nt_ram[0].get() + 0xc00; - m_nt_page[1][0] = m_nt_ram[1].get(); - m_nt_page[1][1] = m_nt_ram[1].get() + 0x400; - m_nt_page[1][2] = m_nt_ram[1].get() + 0x800; - m_nt_page[1][3] = m_nt_ram[1].get() + 0xc00; - m_ppu1->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_r)), write8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_w))); - m_ppu2->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt1_r)), write8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt1_w))); + m_ppu1->space(AS_PROGRAM).install_ram(0x2000, 0x2fff, m_nt_ram[0].get()); + m_ppu1->space(AS_PROGRAM).install_ram(0x3000, 0x3eff, m_nt_ram[0].get()); + m_ppu2->space(AS_PROGRAM).install_ram(0x2000, 0x2fff, m_nt_ram[1].get()); + m_ppu2->space(AS_PROGRAM).install_ram(0x3000, 0x3eff, m_nt_ram[1].get()); + // read only! m_ppu1->space(AS_PROGRAM).install_read_bank(0x0000, 0x1fff, m_bank_vrom[0]); // read only! @@ -261,11 +251,11 @@ MACHINE_START_MEMBER(vsnes_state, bootleg) address_space &ppu1_space = m_ppu1->space(AS_PROGRAM); /* establish nametable ram */ - m_nt_ram[0] = std::make_unique(0x1000); - /* set mirroring */ - v_set_mirroring(0, PPU_MIRROR_VERT); + m_nt_ram[0] = std::make_unique(0x800); - ppu1_space.install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_r)), write8sm_delegate(*this, FUNC(vsnes_state::vsnes_nt0_w))); + ppu1_space.install_ram(0x2000, 0x27ff, 0x800, m_nt_ram[0].get()); + ppu1_space.install_ram(0x3000, 0x37ff, m_nt_ram[0].get()); + ppu1_space.install_ram(0x3800, 0x3eff, m_nt_ram[0].get()); m_vrom[0] = m_gfx1_rom->base(); m_vrom_size[0] = m_gfx1_rom->bytes(); @@ -277,69 +267,6 @@ MACHINE_START_MEMBER(vsnes_state, bootleg) m_bank_vrom[0]->set_entry(0); } -/************************************* - * - * External mappings for PPU bus - * - *************************************/ - -void vsnes_state::vsnes_nt0_w(offs_t offset, uint8_t data) -{ - int page = ((offset & 0xc00) >> 10); - m_nt_page[0][page][offset & 0x3ff] = data; -} - -void vsnes_state::vsnes_nt1_w(offs_t offset, uint8_t data) -{ - int page = ((offset & 0xc00) >> 10); - m_nt_page[1][page][offset & 0x3ff] = data; -} - -uint8_t vsnes_state::vsnes_nt0_r(offs_t offset) -{ - int page = ((offset&0xc00) >> 10); - return m_nt_page[0][page][offset & 0x3ff]; -} - -uint8_t vsnes_state::vsnes_nt1_r(offs_t offset) -{ - int page = ((offset & 0xc00) >> 10); - return m_nt_page[1][page][offset & 0x3ff]; -} - -void vsnes_state::v_set_mirroring(int ppu, int mirroring) -{ - switch (mirroring) - { - case PPU_MIRROR_LOW: - m_nt_page[ppu][0] = m_nt_page[ppu][1] = m_nt_page[ppu][2] = m_nt_page[ppu][3] = m_nt_ram[ppu].get(); - break; - case PPU_MIRROR_HIGH: - m_nt_page[ppu][0] = m_nt_page[ppu][1] = m_nt_page[ppu][2] = m_nt_page[ppu][3] = m_nt_ram[ppu].get() + 0x400; - break; - case PPU_MIRROR_HORZ: - m_nt_page[ppu][0] = m_nt_ram[ppu].get(); - m_nt_page[ppu][1] = m_nt_ram[ppu].get(); - m_nt_page[ppu][2] = m_nt_ram[ppu].get() + 0x400; - m_nt_page[ppu][3] = m_nt_ram[ppu].get() + 0x400; - break; - case PPU_MIRROR_VERT: - m_nt_page[ppu][0] = m_nt_ram[ppu].get(); - m_nt_page[ppu][1] = m_nt_ram[ppu].get() + 0x400; - m_nt_page[ppu][2] = m_nt_ram[ppu].get(); - m_nt_page[ppu][3] = m_nt_ram[ppu].get() + 0x400; - break; - case PPU_MIRROR_NONE: - default: - m_nt_page[ppu][0] = m_nt_ram[ppu].get(); - m_nt_page[ppu][1] = m_nt_ram[ppu].get() + 0x400; - m_nt_page[ppu][2] = m_nt_ram[ppu].get() + 0x800; - m_nt_page[ppu][3] = m_nt_ram[ppu].get() + 0xc00; - break; - } - -} - /********************************************************************************** * * Game and Board-specific initialization @@ -561,34 +488,10 @@ void vsnes_state::drmario_rom_banking(offs_t offset, uint8_t data) { case 0: /* mirroring and options */ { - int mirroring; - m_vrom4k = m_drmario_shiftreg & 0x10; m_size16k = m_drmario_shiftreg & 0x08; m_switchlow = m_drmario_shiftreg & 0x04; - - switch (m_drmario_shiftreg & 3) - { - case 0: - mirroring = PPU_MIRROR_LOW; - break; - - case 1: - mirroring = PPU_MIRROR_HIGH; - break; - - case 2: - mirroring = PPU_MIRROR_VERT; - break; - - default: - case 3: - mirroring = PPU_MIRROR_HORZ; - break; - } - - /* apply mirroring */ - v_set_mirroring(1, mirroring); + // 0x03: mirroring bits unused on VS } break;