summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
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
commit70ec4cf07acf053d3cfccbef067878c9a6f8917b (patch)
tree052592452309a630b6c94586906ddf1e7d3a8260 /src
parentdb87b1118ecf0b722ca4ff556e1a3ef4935e76e5 (diff)
(MESS) pk8000.c: Reduce tagmap lookups (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/pk8000.c112
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 */