diff options
author | Wilbert Pol <wilbert@jdg.info> | 2013-02-10 10:42:55 +0000 |
---|---|---|
committer | Wilbert Pol <wilbert@jdg.info> | 2013-02-10 10:42:55 +0000 |
commit | 28055f6806dd4e80b205e65050247970f14e4bd3 (patch) | |
tree | 5657d6975f69b555668a46a67e99f0de370b526d /src | |
parent | 21ff7a696650988bc76f27d217eaa6bf54cc52ac (diff) |
(MESS) bbc.c: Reduce tagmap lookups (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/mess/includes/bbc.h | 29 | ||||
-rw-r--r-- | src/mess/machine/bbc.c | 92 | ||||
-rw-r--r-- | src/mess/video/bbc.c | 114 |
3 files changed, 108 insertions, 127 deletions
diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h index da3cc032632..4c9af1986ed 100644 --- a/src/mess/includes/bbc.h +++ b/src/mess/includes/bbc.h @@ -26,6 +26,7 @@ public: bbc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_mc6845(*this, "mc6845") , m_sn(*this, "sn76489") , m_trom(*this, "saa505x") , m_ACCCON_IRR(CLEAR_LINE) @@ -35,9 +36,18 @@ public: , m_region_maincpu(*this, "maincpu") , m_region_user1(*this, "user1") , m_region_user2(*this, "user2") + , m_bank1(*this, "bank1") + , m_bank2(*this, "bank2") + , m_bank3(*this, "bank3") + , m_bank4(*this, "bank4") + , m_bank5(*this, "bank5") + , m_bank6(*this, "bank6") + , m_bank7(*this, "bank7") + , m_bank8(*this, "bank8") { } required_device<cpu_device> m_maincpu; + required_device<mc6845_device> m_mc6845; optional_device<sn76489_device> m_sn; required_device<saa5050_device> m_trom; @@ -314,6 +324,18 @@ protected: required_memory_region m_region_maincpu; required_memory_region m_region_user1; optional_memory_region m_region_user2; + required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm + optional_memory_bank m_bank3; // bbca bbcb + required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank5; // bbcm + optional_memory_bank m_bank6; // bbcbp bbcbp128 + required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm + optional_memory_bank m_bank8; // bbcm + + void bbcbp_setvideoshadow(int vdusel); + void common_init(int memorySize); + void set_pixel_lookup(); }; @@ -329,14 +351,7 @@ extern const wd17xx_interface bbc_wd17xx_interface; /* tape support */ - extern const i8271_interface bbc_i8271_interface; extern const uPD7002_interface bbc_uPD7002; -/*----------- defined in video/bbc.c -----------*/ - -void bbc_set_video_memory_lookups(running_machine &machine, int ramsize); -void bbc_setscreenstart(running_machine &machine, int b4, int b5); -void bbcbp_setvideoshadow(running_machine &machine, int vdusel); - #endif /* BBC_H_ */ diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c index 5b86c3308a1..a01df1820f8 100644 --- a/src/mess/machine/bbc.c +++ b/src/mess/machine/bbc.c @@ -37,7 +37,7 @@ Model A memory handling functions /* for the model A just address the 4 on board ROM sockets */ WRITE8_MEMBER(bbc_state::bbc_page_selecta_w) { - membank("bank4")->set_base(m_region_user1->base()+((data&0x03)<<14)); + m_bank4->set_base(m_region_user1->base()+((data&0x03)<<14)); } @@ -57,11 +57,11 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectb_w) m_rombank=data&0x0f; if (m_rombank!=1) { - membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14)); + m_bank4->set_base(m_region_user1->base() + (m_rombank << 14)); } else { - membank("bank4")->set_base(m_region_user2->base() + ((m_DFSType) << 14)); + m_bank4->set_base(m_region_user2->base() + ((m_DFSType) << 14)); } } @@ -138,24 +138,24 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w) if (m_pagedRAM) { /* if paged ram then set 8000 to afff to read from the ram 8000 to afff */ - membank("bank4")->set_base(m_region_maincpu->base() + 0x8000); + m_bank4->set_base(m_region_maincpu->base() + 0x8000); } else { /* if paged rom then set the rom to be read from 8000 to afff */ - membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14)); + m_bank4->set_base(m_region_user1->base() + (m_rombank << 14)); }; /* set the rom to be read from b000 to bfff */ - membank("bank6")->set_entry(m_rombank); + m_bank6->set_entry(m_rombank); } else { //the video display should now use this flag to display the shadow ram memory m_vdusel=(data>>7)&0x01; - bbcbp_setvideoshadow(machine(), m_vdusel); + bbcbp_setvideoshadow(m_vdusel); //need to make the video display do a full screen refresh for the new memory area - membank("bank2")->set_base(m_region_maincpu->base()+0x3000); + m_bank2->set_base(m_region_maincpu->base()+0x3000); } } @@ -186,19 +186,19 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler) if (m_vdusel == 0) { // not in shadow ram mode so just read normal ram - membank("bank2")->set_base(ram + 0x3000); + m_bank2->set_base(ram + 0x3000); } else { if (vdudriverset(machine())) { // if VDUDriver set then read from shadow ram - membank("bank2")->set_base(ram + 0xb000); + m_bank2->set_base(ram + 0xb000); } else { // else read from normal ram - membank("bank2")->set_base(ram + 0x3000); + m_bank2->set_base(ram + 0x3000); } } return address; @@ -360,23 +360,23 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) if (m_ACCCON_Y) { - membank("bank7")->set_base(m_region_maincpu->base() + 0x9000); + m_bank7->set_base(m_region_maincpu->base() + 0x9000); } else { - membank("bank7")->set_base(m_region_user1->base() + 0x40000); + m_bank7->set_base(m_region_user1->base() + 0x40000); } - bbcbp_setvideoshadow(machine(), m_ACCCON_D); + bbcbp_setvideoshadow(m_ACCCON_D); if (m_ACCCON_X) { - membank("bank2")->set_base(m_region_maincpu->base() + 0xb000 ); + m_bank2->set_base(m_region_maincpu->base() + 0xb000 ); } else { - membank("bank2")->set_base(m_region_maincpu->base() + 0x3000 ); + m_bank2->set_base(m_region_maincpu->base() + 0x3000 ); } /* 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 (m_ACCCON_TST) { - membank("bank8")->set_base(m_region_user1->base()+0x43c00); + m_bank8->set_base(m_region_user1->base()+0x43c00); space.install_read_bank(0xFC00,0xFEFF,"bank8"); } else @@ -410,13 +410,13 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w) if (m_pagedRAM) { - membank("bank4")->set_base(m_region_maincpu->base() + 0x8000); - membank("bank5")->set_entry(m_rombank); + m_bank4->set_base(m_region_maincpu->base() + 0x8000); + m_bank5->set_entry(m_rombank); } else { - membank("bank4")->set_base(m_region_user1->base() + ((m_rombank) << 14)); - membank("bank5")->set_entry(m_rombank); + m_bank4->set_base(m_region_user1->base() + ((m_rombank) << 14)); + m_bank5->set_entry(m_rombank); } } @@ -432,17 +432,17 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler) { if (m_ACCCON_X) { - membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 ); + m_bank2->set_base( m_region_maincpu->base() + 0xb000 ); } else { if (m_ACCCON_E && bbcm_vdudriverset(machine())) { - membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 ); + m_bank2->set_base( m_region_maincpu->base() + 0xb000 ); } else { - membank( "bank2" )->set_base( m_region_maincpu->base() + 0x3000 ); + m_bank2->set_base( m_region_maincpu->base() + 0x3000 ); } } @@ -1993,11 +1993,11 @@ MACHINE_RESET_MEMBER(bbc_state,bbca) { UINT8 *ram = m_region_maincpu->base(); m_RAMSize = 1; - membank("bank1")->set_base(ram); - membank("bank3")->set_base(ram); + m_bank1->set_base(ram); + m_bank3->set_base(ram); - membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ - membank("bank7")->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ + m_bank7->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */ bbcb_IC32_initialise(this); } @@ -2029,22 +2029,22 @@ MACHINE_RESET_MEMBER(bbc_state,bbcb) m_SWRAMtype = (machine().root_device().ioport("BBCCONFIG")->read() >> 3) & 0x03; m_RAMSize= (machine().root_device().ioport("BBCCONFIG")->read() >> 5) & 0x01; - membank("bank1")->set_base(ram); + m_bank1->set_base(ram); if (m_RAMSize) { /* 32K Model B */ - membank("bank3")->set_base(ram + 0x4000); + m_bank3->set_base(ram + 0x4000); m_memorySize=32; } else { /* 16K just repeat the lower 16K*/ - membank("bank3")->set_base(ram); + m_bank3->set_base(ram); m_memorySize=16; } - membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ - membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ + m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */ bbcb_IC32_initialise(this); @@ -2067,16 +2067,16 @@ MACHINE_START_MEMBER(bbc_state,bbcbp) 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 */ - membank("bank6")->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14); + m_bank6->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14); } MACHINE_RESET_MEMBER(bbc_state,bbcbp) { - membank("bank1")->set_base(m_region_maincpu->base()); - membank("bank2")->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */ - 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("bank7")->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */ + m_bank1->set_base(m_region_maincpu->base()); + m_bank2->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */ + m_bank6->set_entry(0); + m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */ bbcb_IC32_initialise(this); @@ -2093,20 +2093,20 @@ MACHINE_START_MEMBER(bbc_state,bbcm) 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 */ - membank("bank5")->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14); + m_bank5->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14); /* Set ROM/IO bank to point to rom */ - membank( "bank8" )->set_base( m_region_user1->base()+0x43c00); + m_bank8->set_base( m_region_user1->base()+0x43c00); m_maincpu->space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8"); } MACHINE_RESET_MEMBER(bbc_state,bbcm) { - membank("bank1")->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */ - membank("bank2")->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */ - 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("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */ + m_bank1->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */ + m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */ + m_bank5->set_entry(0); + m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */ bbcb_IC32_initialise(this); diff --git a/src/mess/video/bbc.c b/src/mess/video/bbc.c index 99289035552..7637d666baf 100644 --- a/src/mess/video/bbc.c +++ b/src/mess/video/bbc.c @@ -97,12 +97,12 @@ static const int width_of_cursor_set[8]={ 0,0,1,2,1,0,2,4 }; /* this is a quick lookup array that puts bits 0,2,4,6 into bits 0,1,2,3 this is used by the pallette lookup in the video ULA */ -static void set_pixel_lookup(bbc_state *state) +void bbc_state::set_pixel_lookup() { int i; for (i=0; i<256; i++) { - state->m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0); + m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0); } } @@ -143,12 +143,11 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w) } else { m_pixels_per_byte=pixels_per_byte_set[m_videoULA_characters_per_line|(m_videoULA_6845_clock_rate<<2)]; } - mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845"); - mc6845->set_hpixels_per_column(m_pixels_per_byte); + m_mc6845->set_hpixels_per_column(m_pixels_per_byte); if (m_videoULA_6845_clock_rate) - mc6845->set_clock(2000000); + m_mc6845->set_clock(2000000); else - mc6845->set_clock(1000000); + m_mc6845->set_clock(1000000); } break; // Set a pallet register in the Video ULA @@ -305,14 +304,13 @@ MC6845_INTERFACE( bbc_mc6845_intf ) WRITE8_MEMBER(bbc_state::bbc_6845_w) { - mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845"); switch(offset & 1) { case 0 : - mc6845->address_w(space,0,data); + m_mc6845->address_w(space,0,data); break; case 1 : - mc6845->register_w(space,0,data); + m_mc6845->register_w(space,0,data); break; } return; @@ -320,12 +318,10 @@ WRITE8_MEMBER(bbc_state::bbc_6845_w) READ8_MEMBER(bbc_state::bbc_6845_r) { - mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845"); - switch (offset&1) { - case 0: return mc6845->status_r(space,0); - case 1: return mc6845->register_r(space,0); + case 0: return m_mc6845->status_r(space,0); + case 1: return m_mc6845->register_r(space,0); } return 0; } @@ -336,14 +332,13 @@ READ8_MEMBER(bbc_state::bbc_6845_r) /**** BBC B+ Shadow Ram change ****/ -void bbcbp_setvideoshadow(running_machine &machine, int vdusel) +void bbc_state::bbcbp_setvideoshadow(int vdusel) { - bbc_state *state = machine.driver_data<bbc_state>(); if (vdusel) { - state->m_BBC_Video_RAM= state->memregion("maincpu")->base()+0x8000; + m_BBC_Video_RAM= m_region_maincpu->base()+0x8000; } else { - state->m_BBC_Video_RAM= machine.root_device().memregion("maincpu")->base(); + m_BBC_Video_RAM= m_region_maincpu->base(); } } @@ -352,39 +347,38 @@ void bbcbp_setvideoshadow(running_machine &machine, int vdusel) * Initialize the BBC video emulation ************************************************************************/ -static void common_init(running_machine &machine, int memorySize) +void bbc_state::common_init(int memorySize) { - bbc_state *state = machine.driver_data<bbc_state>(); - state->m_emulation_cursor_size = 1; + m_emulation_cursor_size = 1; - state->m_VideoULA_CR = 7; - state->m_VideoULA_CR_counter = 0; + m_VideoULA_CR = 7; + m_VideoULA_CR_counter = 0; - set_pixel_lookup(state); + set_pixel_lookup(); - state->m_BBC_Video_RAM = state->memregion("maincpu")->base(); - state->m_memorySize=memorySize; + m_BBC_Video_RAM = m_region_maincpu->base(); + m_memorySize=memorySize; } VIDEO_START_MEMBER(bbc_state,bbca) { - common_init(machine(),16); + common_init(16); } VIDEO_START_MEMBER(bbc_state,bbcb) { - common_init(machine(),32); + common_init(32); } VIDEO_START_MEMBER(bbc_state,bbcbp) { - common_init(machine(),32); + common_init(32); } VIDEO_START_MEMBER(bbc_state,bbcm) { - common_init(machine(),32); + common_init(32); } @@ -582,53 +576,26 @@ static void BBC_Set_CRE(running_machine &machine, int offset, int data) WRITE8_MEMBER(bbc_state::bbc_6845_w) { - mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845"); - switch(offset & 1) - { - case 0 : - mc6845->address_w(space,0,data); - break; - case 1 : - mc6845->register_w(space,0,data); - break; - } - return; - - switch (offset&1) - { - case 0: - m6845_address_w(0,data); - break; - case 1: - m6845_register_w(0,data); - break; - } - + switch(offset & 1) + { + case 0 : + m_mc6845->address_w(space,0,data); + break; + case 1 : + m_mc6845->register_w(space,0,data); + break; + } } + READ8_HANDLER (bbc_6845_r) { - - mc6845_device *mc6845 = space.machine().device<mc6845_device>("mc6845"); - - switch (offset&1) - { - case 0: return mc6845->status_r(space,0); break; - case 1: return mc6845->register_r(space,0); break; - } - return 0; - - int retval=0; - - switch (offset&1) - { - case 0: - break; - case 1: - retval=m6845_register_r(0); - break; - } - return retval; + switch (offset&1) + { + case 0: return m_mc6845->status_r(space,0); break; + case 1: return m_mc6845->register_r(space,0); break; + } + return 0; } @@ -638,8 +605,7 @@ WRITE8_MEMBER(bbc_state::bbc_6845_w) UINT32 bbc_state::screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845"); - mc6845->update( bitmap, cliprect); + m_mc6845->update( bitmap, cliprect); return 0; |