diff options
author | Wilbert Pol <wilbert@jdg.info> | 2013-02-09 14:22:52 +0000 |
---|---|---|
committer | Wilbert Pol <wilbert@jdg.info> | 2013-02-09 14:22:52 +0000 |
commit | 70ec4cf07acf053d3cfccbef067878c9a6f8917b (patch) | |
tree | 052592452309a630b6c94586906ddf1e7d3a8260 /src | |
parent | db87b1118ecf0b722ca4ff556e1a3ef4935e76e5 (diff) |
(MESS) pk8000.c: Reduce tagmap lookups (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/mess/drivers/pk8000.c | 112 |
1 files changed, 73 insertions, 39 deletions
diff --git a/src/mess/drivers/pk8000.c b/src/mess/drivers/pk8000.c index af20a0ccdba..4901ca5da75 100644 --- a/src/mess/drivers/pk8000.c +++ b/src/mess/drivers/pk8000.c @@ -22,11 +22,26 @@ class pk8000_state : public driver_device { public: pk8000_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_cassette(*this, CASSETTE_TAG) + , m_ram(*this, RAM_TAG) + , m_speaker(*this, SPEAKER_TAG) + , m_region_maincpu(*this, "maincpu") + , 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") + { } UINT8 m_keyboard_line; DECLARE_READ8_MEMBER(pk8000_joy_1_r); DECLARE_READ8_MEMBER(pk8000_joy_2_r); + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); UINT32 screen_update_pk8000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -38,20 +53,32 @@ public: DECLARE_WRITE8_MEMBER(pk8000_84_porta_w); DECLARE_WRITE8_MEMBER(pk8000_84_portc_w); IRQ_CALLBACK_MEMBER(pk8000_irq_callback); -}; +protected: + required_device<cpu_device> m_maincpu; + required_device<cassette_image_device> m_cassette; + required_device<ram_device> m_ram; + required_device<device_t> m_speaker; + required_memory_region m_region_maincpu; + required_memory_bank m_bank1; + required_memory_bank m_bank2; + required_memory_bank m_bank3; + required_memory_bank m_bank4; + required_memory_bank m_bank5; + required_memory_bank m_bank6; + required_memory_bank m_bank7; + required_memory_bank m_bank8; + ioport_port *m_io_port[10]; + + void pk8000_set_bank(UINT8 data); +}; -static cassette_image_device *cassette_device_image(running_machine &machine) -{ - return machine.device<cassette_image_device>(CASSETTE_TAG); -} -static void pk8000_set_bank(running_machine &machine,UINT8 data) +void pk8000_state::pk8000_set_bank(UINT8 data) { - pk8000_state *state = machine.driver_data<pk8000_state>(); - UINT8 *rom = machine.root_device().memregion("maincpu")->base(); - UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); + UINT8 *rom = m_region_maincpu->base(); + UINT8 *ram = m_ram->pointer(); UINT8 block1 = data & 3; UINT8 block2 = (data >> 2) & 3; UINT8 block3 = (data >> 4) & 3; @@ -59,78 +86,75 @@ static void pk8000_set_bank(running_machine &machine,UINT8 data) switch(block1) { case 0: - state->membank("bank1")->set_base(rom + 0x10000); - state->membank("bank5")->set_base(ram); + m_bank1->set_base(rom + 0x10000); + m_bank5->set_base(ram); break; case 1: break; case 2: break; case 3: - state->membank("bank1")->set_base(ram); - state->membank("bank5")->set_base(ram); + m_bank1->set_base(ram); + m_bank5->set_base(ram); break; } switch(block2) { case 0: - state->membank("bank2")->set_base(rom + 0x14000); - state->membank("bank6")->set_base(ram + 0x4000); + m_bank2->set_base(rom + 0x14000); + m_bank6->set_base(ram + 0x4000); break; case 1: break; case 2: break; case 3: - state->membank("bank2")->set_base(ram + 0x4000); - state->membank("bank6")->set_base(ram + 0x4000); + m_bank2->set_base(ram + 0x4000); + m_bank6->set_base(ram + 0x4000); break; } switch(block3) { case 0: - state->membank("bank3")->set_base(rom + 0x18000); - state->membank("bank7")->set_base(ram + 0x8000); + m_bank3->set_base(rom + 0x18000); + m_bank7->set_base(ram + 0x8000); break; case 1: break; case 2: break; case 3: - state->membank("bank3")->set_base(ram + 0x8000); - state->membank("bank7")->set_base(ram + 0x8000); + m_bank3->set_base(ram + 0x8000); + m_bank7->set_base(ram + 0x8000); break; } switch(block4) { case 0: - state->membank("bank4")->set_base(rom + 0x1c000); - state->membank("bank8")->set_base(ram + 0xc000); + m_bank4->set_base(rom + 0x1c000); + m_bank8->set_base(ram + 0xc000); break; case 1: break; case 2: break; case 3: - state->membank("bank4")->set_base(ram + 0xc000); - state->membank("bank8")->set_base(ram + 0xc000); + m_bank4->set_base(ram + 0xc000); + m_bank8->set_base(ram + 0xc000); break; } } WRITE8_MEMBER(pk8000_state::pk8000_80_porta_w) { - pk8000_set_bank(machine(),data); + pk8000_set_bank(data); } READ8_MEMBER(pk8000_state::pk8000_80_portb_r) { - static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" }; if(m_keyboard_line>9) { return 0xff; } - return machine().root_device().ioport(keynames[m_keyboard_line])->read(); + return m_io_port[m_keyboard_line]->read(); } WRITE8_MEMBER(pk8000_state::pk8000_80_portc_w) { m_keyboard_line = data & 0x0f; - speaker_level_w(machine().device(SPEAKER_TAG), BIT(data,7)); + speaker_level_w(m_speaker, BIT(data,7)); - cassette_device_image(machine())->change_state( - (BIT(data,4)) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, - CASSETTE_MASK_MOTOR); - cassette_device_image(machine())->output((BIT(data,6)) ? +1.0 : 0.0); + m_cassette->change_state( (BIT(data,4)) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); + m_cassette->output((BIT(data,6)) ? +1.0 : 0.0); } static I8255_INTERFACE( pk8000_ppi8255_interface_1 ) @@ -169,13 +193,13 @@ static I8255_INTERFACE( pk8000_ppi8255_interface_2 ) READ8_MEMBER(pk8000_state::pk8000_joy_1_r) { - UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0); + UINT8 retVal = (m_cassette->input() > 0.0038 ? 0x80 : 0); retVal |= ioport("JOY1")->read() & 0x7f; return retVal; } READ8_MEMBER(pk8000_state::pk8000_joy_2_r) { - UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0); + UINT8 retVal = (m_cassette->input() > 0.0038 ? 0x80 : 0); retVal |= ioport("JOY2")->read() & 0x7f; return retVal; } @@ -325,10 +349,20 @@ IRQ_CALLBACK_MEMBER(pk8000_state::pk8000_irq_callback) } +void pk8000_state::machine_start() +{ + static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" }; + + for ( int i = 0; i < 10; i++ ) + { + m_io_port[i] = ioport(keynames[i]); + } +} + void pk8000_state::machine_reset() { - pk8000_set_bank(machine(),0); - machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pk8000_state::pk8000_irq_callback),this)); + pk8000_set_bank(0); + m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pk8000_state::pk8000_irq_callback),this)); } void pk8000_state::video_start() @@ -337,7 +371,7 @@ void pk8000_state::video_start() UINT32 pk8000_state::screen_update_pk8000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - return pk8000_video_update(screen, bitmap, cliprect, machine().device<ram_device>(RAM_TAG)->pointer()); + return pk8000_video_update(screen, bitmap, cliprect, m_ram->pointer()); } /* Machine driver */ |