mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
machine/vsnes.cpp: Simplified nametable mirroring. (#9226)
This commit is contained in:
parent
64c9f31bc7
commit
d41dffbef7
@ -74,10 +74,6 @@ private:
|
|||||||
uint8_t vsnes_in0_1_r();
|
uint8_t vsnes_in0_1_r();
|
||||||
uint8_t vsnes_in1_1_r();
|
uint8_t vsnes_in1_1_r();
|
||||||
uint8_t gun_in0_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 vsnormal_vrom_banking(uint8_t data);
|
||||||
void gun_in0_w(uint8_t data);
|
void gun_in0_w(uint8_t data);
|
||||||
void vskonami_rom_banking(offs_t offset, 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_main(uint8_t data);
|
||||||
void vsdual_vrom_banking_sub(uint8_t data);
|
void vsdual_vrom_banking_sub(uint8_t data);
|
||||||
void vssmbbl_sn_w(offs_t offset, 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_START(vsnes);
|
||||||
DECLARE_MACHINE_RESET(vsnes);
|
DECLARE_MACHINE_RESET(vsnes);
|
||||||
@ -127,7 +122,6 @@ private:
|
|||||||
uint8_t* m_vrom[2];
|
uint8_t* m_vrom[2];
|
||||||
std::unique_ptr<uint8_t[]> m_nt_ram[2];
|
std::unique_ptr<uint8_t[]> m_nt_ram[2];
|
||||||
memory_bank_array_creator<8> m_bank_vrom;
|
memory_bank_array_creator<8> m_bank_vrom;
|
||||||
uint8_t* m_nt_page[2][4];
|
|
||||||
uint32_t m_vrom_size[2];
|
uint32_t m_vrom_size[2];
|
||||||
int m_vrom_banks;
|
int m_vrom_banks;
|
||||||
int m_zapstore;
|
int m_zapstore;
|
||||||
|
@ -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;
|
int i;
|
||||||
|
|
||||||
@ -185,13 +185,9 @@ MACHINE_START_MEMBER(vsnes_state,vsnes)
|
|||||||
|
|
||||||
/* establish nametable ram */
|
/* establish nametable ram */
|
||||||
m_nt_ram[0] = std::make_unique<uint8_t[]>(0x1000);
|
m_nt_ram[0] = std::make_unique<uint8_t[]>(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)
|
if (m_gfx1_rom != nullptr)
|
||||||
{
|
{
|
||||||
@ -234,18 +230,12 @@ MACHINE_START_MEMBER(vsnes_state,vsdual)
|
|||||||
/* establish nametable ram */
|
/* establish nametable ram */
|
||||||
m_nt_ram[0] = std::make_unique<uint8_t[]>(0x1000);
|
m_nt_ram[0] = std::make_unique<uint8_t[]>(0x1000);
|
||||||
m_nt_ram[1] = std::make_unique<uint8_t[]>(0x1000);
|
m_nt_ram[1] = std::make_unique<uint8_t[]>(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_ppu1->space(AS_PROGRAM).install_ram(0x2000, 0x2fff, m_nt_ram[0].get());
|
||||||
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(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!
|
// read only!
|
||||||
m_ppu1->space(AS_PROGRAM).install_read_bank(0x0000, 0x1fff, m_bank_vrom[0]);
|
m_ppu1->space(AS_PROGRAM).install_read_bank(0x0000, 0x1fff, m_bank_vrom[0]);
|
||||||
// read only!
|
// read only!
|
||||||
@ -261,11 +251,11 @@ MACHINE_START_MEMBER(vsnes_state, bootleg)
|
|||||||
address_space &ppu1_space = m_ppu1->space(AS_PROGRAM);
|
address_space &ppu1_space = m_ppu1->space(AS_PROGRAM);
|
||||||
|
|
||||||
/* establish nametable ram */
|
/* establish nametable ram */
|
||||||
m_nt_ram[0] = std::make_unique<uint8_t[]>(0x1000);
|
m_nt_ram[0] = std::make_unique<uint8_t[]>(0x800);
|
||||||
/* set mirroring */
|
|
||||||
v_set_mirroring(0, PPU_MIRROR_VERT);
|
|
||||||
|
|
||||||
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[0] = m_gfx1_rom->base();
|
||||||
m_vrom_size[0] = m_gfx1_rom->bytes();
|
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);
|
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
|
* 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 */
|
case 0: /* mirroring and options */
|
||||||
{
|
{
|
||||||
int mirroring;
|
|
||||||
|
|
||||||
m_vrom4k = m_drmario_shiftreg & 0x10;
|
m_vrom4k = m_drmario_shiftreg & 0x10;
|
||||||
m_size16k = m_drmario_shiftreg & 0x08;
|
m_size16k = m_drmario_shiftreg & 0x08;
|
||||||
m_switchlow = m_drmario_shiftreg & 0x04;
|
m_switchlow = m_drmario_shiftreg & 0x04;
|
||||||
|
// 0x03: mirroring bits unused on VS
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user