(MESS) bbc.c: Some tagmap lookup reduction. (nw)

This commit is contained in:
Wilbert Pol 2013-02-08 22:25:26 +00:00
parent 6aa08128f4
commit 8ef69c8d4c
2 changed files with 74 additions and 66 deletions

View File

@ -24,14 +24,17 @@ class bbc_state : public driver_device
{ {
public: public:
bbc_state(const machine_config &mconfig, device_type type, const char *tag) bbc_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_sn(*this, "sn76489"), , m_sn(*this, "sn76489")
m_trom(*this, "saa505x"), , m_trom(*this, "saa505x")
m_ACCCON_IRR(CLEAR_LINE), , m_ACCCON_IRR(CLEAR_LINE)
m_via_system_irq(CLEAR_LINE), , m_via_system_irq(CLEAR_LINE)
m_via_user_irq(CLEAR_LINE), , m_via_user_irq(CLEAR_LINE)
m_acia_irq(CLEAR_LINE) , m_acia_irq(CLEAR_LINE)
, m_region_maincpu(*this, "maincpu")
, m_region_user1(*this, "user1")
, m_region_user2(*this, "user2")
{ } { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
@ -306,6 +309,11 @@ public:
DECLARE_WRITE_LINE_MEMBER(bbc_vsync); DECLARE_WRITE_LINE_MEMBER(bbc_vsync);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart ); DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart );
protected:
required_memory_region m_region_maincpu;
required_memory_region m_region_user1;
optional_memory_region m_region_user2;
}; };

View File

@ -37,13 +37,13 @@ Model A memory handling functions
/* for the model A just address the 4 on board ROM sockets */ /* for the model A just address the 4 on board ROM sockets */
WRITE8_MEMBER(bbc_state::bbc_page_selecta_w) WRITE8_MEMBER(bbc_state::bbc_page_selecta_w)
{ {
membank("bank4")->set_base(machine().root_device().memregion("user1")->base()+((data&0x03)<<14)); membank("bank4")->set_base(m_region_user1->base()+((data&0x03)<<14));
} }
WRITE8_MEMBER(bbc_state::bbc_memorya1_w) WRITE8_MEMBER(bbc_state::bbc_memorya1_w)
{ {
memregion("maincpu")->base()[offset]=data; m_region_maincpu->base()[offset]=data;
} }
/************************* /*************************
@ -57,11 +57,11 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectb_w)
m_rombank=data&0x0f; m_rombank=data&0x0f;
if (m_rombank!=1) if (m_rombank!=1)
{ {
membank("bank4")->set_base(machine().root_device().memregion("user1")->base() + (m_rombank << 14)); membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
} }
else else
{ {
membank("bank4")->set_base(machine().root_device().memregion("user2")->base() + ((m_DFSType) << 14)); membank("bank4")->set_base(m_region_user2->base() + ((m_DFSType) << 14));
} }
} }
@ -70,11 +70,11 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb3_w)
{ {
if (m_RAMSize) if (m_RAMSize)
{ {
memregion("maincpu")->base()[offset + 0x4000] = data; m_region_maincpu->base()[offset + 0x4000] = data;
} }
else else
{ {
memregion("maincpu")->base()[offset] = data; m_region_maincpu->base()[offset] = data;
} }
} }
@ -94,14 +94,14 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb4_w)
if (m_rombank == 1) if (m_rombank == 1)
{ {
// special DFS case for Acorn DFS E00 Hack that can write to the DFS RAM Bank; // special DFS case for Acorn DFS E00 Hack that can write to the DFS RAM Bank;
if (m_DFSType == 3) memregion("user2")->base()[((m_DFSType) << 14) + offset] = data; if (m_DFSType == 3) m_region_user2->base()[((m_DFSType) << 14) + offset] = data;
} else } else
{ {
switch (m_SWRAMtype) switch (m_SWRAMtype)
{ {
case 1: if (bbc_SWRAMtype1[m_userport]) memregion("user1")->base()[(m_userport << 14) + offset] = data; case 1: if (bbc_SWRAMtype1[m_userport]) m_region_user1->base()[(m_userport << 14) + offset] = data;
case 2: if (bbc_SWRAMtype2[m_rombank]) memregion("user1")->base()[(m_rombank << 14) + offset] = data; case 2: if (bbc_SWRAMtype2[m_rombank]) m_region_user1->base()[(m_rombank << 14) + offset] = data;
case 3: if (bbc_SWRAMtype3[m_rombank]) memregion("user1")->base()[(m_rombank << 14) + offset] = data; case 3: if (bbc_SWRAMtype3[m_rombank]) m_region_user1->base()[(m_rombank << 14) + offset] = data;
} }
} }
} }
@ -138,12 +138,12 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
if (m_pagedRAM) if (m_pagedRAM)
{ {
/* if paged ram then set 8000 to afff to read from the ram 8000 to afff */ /* if paged ram then set 8000 to afff to read from the ram 8000 to afff */
membank("bank4")->set_base(machine().root_device().memregion("maincpu")->base() + 0x8000); membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
} }
else else
{ {
/* if paged rom then set the rom to be read from 8000 to afff */ /* if paged rom then set the rom to be read from 8000 to afff */
membank("bank4")->set_base(machine().root_device().memregion("user1")->base() + (m_rombank << 14)); membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
}; };
/* set the rom to be read from b000 to bfff */ /* set the rom to be read from b000 to bfff */
@ -155,7 +155,7 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
m_vdusel=(data>>7)&0x01; m_vdusel=(data>>7)&0x01;
bbcbp_setvideoshadow(machine(), m_vdusel); bbcbp_setvideoshadow(machine(), m_vdusel);
//need to make the video display do a full screen refresh for the new memory area //need to make the video display do a full screen refresh for the new memory area
membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base()+0x3000); membank("bank2")->set_base(m_region_maincpu->base()+0x3000);
} }
} }
@ -166,7 +166,7 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
WRITE8_MEMBER(bbc_state::bbc_memorybp1_w) WRITE8_MEMBER(bbc_state::bbc_memorybp1_w)
{ {
memregion("maincpu")->base()[offset]=data; m_region_maincpu->base()[offset]=data;
} }
@ -182,7 +182,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp1_w)
DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler) DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler)
{ {
UINT8 *ram = memregion("maincpu")->base(); UINT8 *ram = m_region_maincpu->base();
if (m_vdusel == 0) if (m_vdusel == 0)
{ {
// not in shadow ram mode so just read normal ram // not in shadow ram mode so just read normal ram
@ -207,7 +207,7 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler)
WRITE8_MEMBER(bbc_state::bbc_memorybp2_w) WRITE8_MEMBER(bbc_state::bbc_memorybp2_w)
{ {
UINT8 *ram = memregion("maincpu")->base(); UINT8 *ram = m_region_maincpu->base();
if (m_vdusel==0) if (m_vdusel==0)
{ {
// not in shadow ram mode so just write to normal ram // not in shadow ram mode so just write to normal ram
@ -235,7 +235,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp4_w)
{ {
if (m_pagedRAM) if (m_pagedRAM)
{ {
memregion("maincpu")->base()[offset+0x8000]=data; m_region_maincpu->base()[offset+0x8000]=data;
} }
} }
@ -255,13 +255,13 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp4_128_w)
{ {
if (m_pagedRAM) if (m_pagedRAM)
{ {
memregion("maincpu")->base()[offset+0x8000]=data; m_region_maincpu->base()[offset+0x8000]=data;
} }
else else
{ {
if (bbc_b_plus_sideways_ram_banks[m_rombank]) if (bbc_b_plus_sideways_ram_banks[m_rombank])
{ {
memregion("user1")->base()[offset+(m_rombank<<14)]=data; m_region_user1->base()[offset+(m_rombank<<14)]=data;
} }
} }
} }
@ -270,7 +270,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp6_128_w)
{ {
if (bbc_b_plus_sideways_ram_banks[m_rombank]) if (bbc_b_plus_sideways_ram_banks[m_rombank])
{ {
memregion("user1")->base()[offset+(m_rombank<<14)+0x3000]=data; m_region_user1->base()[offset+(m_rombank<<14)+0x3000]=data;
} }
} }
@ -360,11 +360,11 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
if (m_ACCCON_Y) if (m_ACCCON_Y)
{ {
membank("bank7")->set_base(machine().root_device().memregion("maincpu")->base() + 0x9000); membank("bank7")->set_base(m_region_maincpu->base() + 0x9000);
} }
else else
{ {
membank("bank7")->set_base(machine().root_device().memregion("user1")->base() + 0x40000); membank("bank7")->set_base(m_region_user1->base() + 0x40000);
} }
bbcbp_setvideoshadow(machine(), m_ACCCON_D); bbcbp_setvideoshadow(machine(), m_ACCCON_D);
@ -372,11 +372,11 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
if (m_ACCCON_X) if (m_ACCCON_X)
{ {
membank("bank2")->set_base(machine().root_device().memregion( "maincpu" )->base() + 0xb000 ); membank("bank2")->set_base(m_region_maincpu->base() + 0xb000 );
} }
else else
{ {
membank("bank2")->set_base(machine().root_device().memregion( "maincpu" )->base() + 0x3000 ); membank("bank2")->set_base(m_region_maincpu->base() + 0x3000 );
} }
/* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */ /* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */
@ -384,7 +384,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
/* if 1 the the ROM is paged in for reads but writes still go to I/O */ /* if 1 the the ROM is paged in for reads but writes still go to I/O */
if (m_ACCCON_TST) if (m_ACCCON_TST)
{ {
membank("bank8")->set_base(machine().root_device().memregion("user1")->base()+0x43c00); membank("bank8")->set_base(m_region_user1->base()+0x43c00);
space.install_read_bank(0xFC00,0xFEFF,"bank8"); space.install_read_bank(0xFC00,0xFEFF,"bank8");
} }
else else
@ -410,12 +410,12 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w)
if (m_pagedRAM) if (m_pagedRAM)
{ {
membank("bank4")->set_base(machine().root_device().memregion("maincpu")->base() + 0x8000); membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
membank("bank5")->set_entry(m_rombank); membank("bank5")->set_entry(m_rombank);
} }
else else
{ {
membank("bank4")->set_base(machine().root_device().memregion("user1")->base() + ((m_rombank) << 14)); membank("bank4")->set_base(m_region_user1->base() + ((m_rombank) << 14));
membank("bank5")->set_entry(m_rombank); membank("bank5")->set_entry(m_rombank);
} }
} }
@ -424,7 +424,7 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w)
WRITE8_MEMBER(bbc_state::bbc_memorybm1_w) WRITE8_MEMBER(bbc_state::bbc_memorybm1_w)
{ {
memregion("maincpu")->base()[offset] = data; m_region_maincpu->base()[offset] = data;
} }
@ -432,17 +432,17 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler)
{ {
if (m_ACCCON_X) if (m_ACCCON_X)
{ {
membank( "bank2" )->set_base( memregion( "maincpu" )->base() + 0xb000 ); membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
} }
else else
{ {
if (m_ACCCON_E && bbcm_vdudriverset(machine())) if (m_ACCCON_E && bbcm_vdudriverset(machine()))
{ {
membank( "bank2" )->set_base( machine().root_device().memregion( "maincpu" )->base() + 0xb000 ); membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
} }
else else
{ {
membank( "bank2" )->set_base( machine().root_device().memregion( "maincpu" )->base() + 0x3000 ); membank( "bank2" )->set_base( m_region_maincpu->base() + 0x3000 );
} }
} }
@ -453,7 +453,7 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler)
WRITE8_MEMBER(bbc_state::bbc_memorybm2_w) WRITE8_MEMBER(bbc_state::bbc_memorybm2_w)
{ {
UINT8 *ram = memregion("maincpu")->base(); UINT8 *ram = m_region_maincpu->base();
if (m_ACCCON_X) if (m_ACCCON_X)
{ {
ram[offset + 0xb000] = data; ram[offset + 0xb000] = data;
@ -481,13 +481,13 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm4_w)
{ {
if (m_pagedRAM) if (m_pagedRAM)
{ {
memregion("maincpu")->base()[offset+0x8000]=data; m_region_maincpu->base()[offset+0x8000]=data;
} }
else else
{ {
if (bbc_master_sideways_ram_banks[m_rombank]) if (bbc_master_sideways_ram_banks[m_rombank])
{ {
memregion("user1")->base()[offset+(m_rombank<<14)]=data; m_region_user1->base()[offset+(m_rombank<<14)]=data;
} }
} }
} }
@ -497,7 +497,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm5_w)
{ {
if (bbc_master_sideways_ram_banks[m_rombank]) if (bbc_master_sideways_ram_banks[m_rombank])
{ {
memregion("user1")->base()[offset+(m_rombank<<14)+0x1000]=data; m_region_user1->base()[offset+(m_rombank<<14)+0x1000]=data;
} }
} }
@ -506,7 +506,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w)
{ {
if (m_ACCCON_Y) if (m_ACCCON_Y)
{ {
memregion("maincpu")->base()[offset+0x9000]=data; m_region_maincpu->base()[offset+0x9000]=data;
} }
} }
@ -541,7 +541,7 @@ long myo;
/* Now handled in bbcm_ACCCON_write PHS - 2008-10-11 */ /* Now handled in bbcm_ACCCON_write PHS - 2008-10-11 */
// if ( m_ACCCON_TST ) // if ( m_ACCCON_TST )
// { // {
// return memregion("user1")->base()[offset+0x43c00]; // return m_region_user1->base()[offset+0x43c00];
// }; // };
if (offset<=0x0ff) /* FRED */ if (offset<=0x0ff) /* FRED */
@ -1915,7 +1915,7 @@ WRITE8_MEMBER(bbc_state::bbc_disc_w)
***************************************/ ***************************************/
DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcb_cart ) DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcb_cart )
{ {
UINT8 *mem = machine().root_device().memregion("user1")->base(); UINT8 *mem = m_region_user1->base();
int size, read_; int size, read_;
int addr = 0; int addr = 0;
int index = 0; int index = 0;
@ -1991,13 +1991,13 @@ MACHINE_START_MEMBER(bbc_state,bbca)
MACHINE_RESET_MEMBER(bbc_state,bbca) MACHINE_RESET_MEMBER(bbc_state,bbca)
{ {
UINT8 *ram = machine().root_device().memregion("maincpu")->base(); UINT8 *ram = m_region_maincpu->base();
m_RAMSize = 1; m_RAMSize = 1;
membank("bank1")->set_base(ram); membank("bank1")->set_base(ram);
membank("bank3")->set_base(ram); membank("bank3")->set_base(ram);
membank("bank4")->set_base(machine().root_device().memregion("user1")->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
membank("bank7")->set_base(memregion("user1")->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */ membank("bank7")->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this); bbcb_IC32_initialise(this);
} }
@ -2024,7 +2024,7 @@ MACHINE_START_MEMBER(bbc_state,bbcb)
MACHINE_RESET_MEMBER(bbc_state,bbcb) MACHINE_RESET_MEMBER(bbc_state,bbcb)
{ {
UINT8 *ram = memregion("maincpu")->base(); UINT8 *ram = m_region_maincpu->base();
m_DFSType= (machine().root_device().ioport("BBCCONFIG")->read() >> 0) & 0x07; m_DFSType= (machine().root_device().ioport("BBCCONFIG")->read() >> 0) & 0x07;
m_SWRAMtype = (machine().root_device().ioport("BBCCONFIG")->read() >> 3) & 0x03; m_SWRAMtype = (machine().root_device().ioport("BBCCONFIG")->read() >> 3) & 0x03;
m_RAMSize= (machine().root_device().ioport("BBCCONFIG")->read() >> 5) & 0x01; m_RAMSize= (machine().root_device().ioport("BBCCONFIG")->read() >> 5) & 0x01;
@ -2043,8 +2043,8 @@ MACHINE_RESET_MEMBER(bbc_state,bbcb)
m_memorySize=16; m_memorySize=16;
} }
membank("bank4")->set_base(machine().root_device().memregion("user1")->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
membank("bank7")->set_base(machine().root_device().memregion("user1")->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */ membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this); bbcb_IC32_initialise(this);
@ -2064,19 +2064,19 @@ MACHINE_START_MEMBER(bbc_state,bbcbp)
{ {
m_mc6850_clock = 0; m_mc6850_clock = 0;
machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this)); m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this));
/* bank 6 is the paged ROMs from b000 to bfff */ /* bank 6 is the paged ROMs from b000 to bfff */
membank("bank6")->configure_entries(0, 16, memregion("user1")->base() + 0x3000, 1<<14); membank("bank6")->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14);
} }
MACHINE_RESET_MEMBER(bbc_state,bbcbp) MACHINE_RESET_MEMBER(bbc_state,bbcbp)
{ {
membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); membank("bank1")->set_base(m_region_maincpu->base());
membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */ membank("bank2")->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */
membank("bank4")->set_base(machine().root_device().memregion("user1")->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */ membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */
membank("bank6")->set_entry(0); membank("bank6")->set_entry(0);
membank("bank7")->set_base(memregion("user1")->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */ membank("bank7")->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this); bbcb_IC32_initialise(this);
@ -2090,23 +2090,23 @@ MACHINE_START_MEMBER(bbc_state,bbcm)
{ {
m_mc6850_clock = 0; m_mc6850_clock = 0;
machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this)); m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this));
/* bank 5 is the paged ROMs from 9000 to bfff */ /* bank 5 is the paged ROMs from 9000 to bfff */
membank("bank5")->configure_entries(0, 16, machine().root_device().memregion("user1")->base()+0x01000, 1<<14); membank("bank5")->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
/* Set ROM/IO bank to point to rom */ /* Set ROM/IO bank to point to rom */
membank( "bank8" )->set_base( memregion("user1")->base()+0x43c00); membank( "bank8" )->set_base( m_region_user1->base()+0x43c00);
machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8"); m_maincpu->space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8");
} }
MACHINE_RESET_MEMBER(bbc_state,bbcm) MACHINE_RESET_MEMBER(bbc_state,bbcm)
{ {
membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); /* bank 1 regular lower ram from 0000 to 2fff */ membank("bank1")->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */
membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */ membank("bank2")->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */
membank("bank4")->set_base(machine().root_device().memregion("user1")->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */ membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */
membank("bank5")->set_entry(0); membank("bank5")->set_entry(0);
membank("bank7")->set_base(memregion("user1")->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */ membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */
bbcb_IC32_initialise(this); bbcb_IC32_initialise(this);