From efea5eb36f550489451ae8bb60f29870bb4ad496 Mon Sep 17 00:00:00 2001 From: Wilbert Pol Date: Fri, 14 Aug 2015 16:28:46 +0200 Subject: [PATCH] vicdual.c: reduce tagmap lookups (nw) --- src/mame/drivers/vicdual.c | 68 ++++++++++++++++++------------------- src/mame/includes/vicdual.h | 17 +++++++++- src/mame/video/vicdual.c | 2 +- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/src/mame/drivers/vicdual.c b/src/mame/drivers/vicdual.c index ebe685ad277..f327a895cb2 100644 --- a/src/mame/drivers/vicdual.c +++ b/src/mame/drivers/vicdual.c @@ -186,7 +186,7 @@ CUSTOM_INPUT_MEMBER(vicdual_state::get_timer_value) int vicdual_state::is_cabinet_color() { - return (ioport(COLOR_BW_PORT_TAG)->read_safe(0) & 1) ? 0 : 1; + return ((m_color_bw ? m_color_bw->read() : 0) & 1) ? 0 : 1; } @@ -266,8 +266,8 @@ READ8_MEMBER(vicdual_state::depthch_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x08) ret = ioport("IN1")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x08) ret = m_in1->read(); return ret; } @@ -347,8 +347,8 @@ READ8_MEMBER(vicdual_state::safari_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x08) ret = ioport("IN1")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x08) ret = m_in1->read(); return ret; } @@ -430,8 +430,8 @@ READ8_MEMBER(vicdual_state::frogs_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x08) ret = ioport("IN1")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x08) ret = m_in1->read(); return ret; } @@ -541,8 +541,8 @@ READ8_MEMBER(vicdual_state::headon_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x08) ret = ioport("IN1")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x08) ret = m_in1->read(); return ret; } @@ -552,9 +552,9 @@ READ8_MEMBER(vicdual_state::sspaceat_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x04) ret = ioport("IN1")->read(); - if (offset & 0x08) ret = ioport("IN2")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x04) ret = m_in1->read(); + if (offset & 0x08) ret = m_in2->read(); return ret; } @@ -800,10 +800,10 @@ READ8_MEMBER(vicdual_state::headon2_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); + if (offset & 0x01) ret = m_in0->read(); if (offset & 0x02) { /* schematics show this as in input port, but never read from */ } - if (offset & 0x04) ret = ioport("IN1")->read(); - if (offset & 0x08) ret = ioport("IN2")->read(); + if (offset & 0x04) ret = m_in1->read(); + if (offset & 0x08) ret = m_in2->read(); if (offset & 0x12) logerror("********* Read from port %x\n", offset); return ret; @@ -1289,14 +1289,12 @@ ADDRESS_MAP_END /* several of the games' lives DIPs are spread across two input ports */ CUSTOM_INPUT_MEMBER(vicdual_state::fake_lives_r) { - static const char *const portnames[] = { "FAKE_LIVES1", "FAKE_LIVES2" }; - /* use the low byte for the bitmask */ UINT8 bit_mask = ((FPTR)param) & 0xff; /* and use d8 for the port */ int port = ((FPTR)param) >> 8 & 1; - return (ioport(portnames[port])->read_safe(0) & bit_mask) ? 0 : 1; + return ((m_fake_lives[port] ? m_fake_lives[port]->read() : 0) & bit_mask) ? 0 : 1; } @@ -1341,7 +1339,7 @@ static INPUT_PORTS_START( invho2 ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x01, "Head On 2 Lives" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x01, "3" ) @@ -1353,7 +1351,7 @@ static INPUT_PORTS_START( invho2 ) reads IN3 bit 3 instead of bit 2. Note that the manual only lists setting it to 3 or 4. */ - PORT_START("FAKE_LIVES2") + PORT_START("FAKE_LIVES.1") PORT_DIPNAME( 0x03, 0x03, "Invinco Lives" ) PORT_DIPLOCATION("SW1:3,4") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) @@ -1404,14 +1402,14 @@ static INPUT_PORTS_START( carhntds ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x01, "Car Hunt Lives" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x03, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "4" ) - PORT_START("FAKE_LIVES2") + PORT_START("FAKE_LIVES.1") PORT_DIPNAME( 0x03, 0x03, "Deep Scan Lives" ) PORT_DIPLOCATION("SW1:3,4") PORT_DIPSETTING( 0x02, "1" ) PORT_DIPSETTING( 0x01, "2" ) @@ -1462,14 +1460,14 @@ static INPUT_PORTS_START( invds ) PORT_COIN_DEFAULT // SW1 @ C1, 6-pos (where are 5 & 6?) - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x03, "Invinco Lives" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "6" ) - PORT_START("FAKE_LIVES2") + PORT_START("FAKE_LIVES.1") PORT_DIPNAME( 0x03, 0x01, "Deep Scan Lives" ) PORT_DIPLOCATION("SW1:3,4") PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) @@ -1523,7 +1521,7 @@ static INPUT_PORTS_START( sspacaho ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x03, "Space Attack Lives" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) @@ -1763,7 +1761,7 @@ static INPUT_PORTS_START( brdrline ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x07, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2,3") PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x02, "4" ) @@ -1838,7 +1836,7 @@ static INPUT_PORTS_START( pulsar ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x02, "3" ) @@ -1943,7 +1941,7 @@ static INPUT_PORTS_START( alphaho ) PORT_COIN_DEFAULT - PORT_START("FAKE_LIVES1") + PORT_START("FAKE_LIVES.0") PORT_DIPNAME( 0x03, 0x03, "Alpha Fighter Lives" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) @@ -2230,8 +2228,8 @@ READ8_MEMBER(vicdual_state::nsub_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x08) ret = ioport("IN1")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x08) ret = m_in1->read(); return ret; } @@ -2279,7 +2277,7 @@ INPUT_CHANGED_MEMBER(vicdual_state::nsub_coin_in) if (newval) { int which = (int)(FPTR)param; - int coinage = ioport("COINAGE")->read(); + int coinage = m_coinage->read(); switch (which) { @@ -2377,7 +2375,7 @@ MACHINE_START_MEMBER(vicdual_state,nsub) MACHINE_RESET_MEMBER(vicdual_state,nsub) { - m_nsub_coin_counter = ioport("COINAGE")->read() & 7; + m_nsub_coin_counter = m_coinage->read() & 7; machine_reset(); } @@ -2411,9 +2409,9 @@ READ8_MEMBER(vicdual_state::invinco_io_r) { UINT8 ret = 0; - if (offset & 0x01) ret = ioport("IN0")->read(); - if (offset & 0x02) ret = ioport("IN1")->read(); - if (offset & 0x08) ret = ioport("IN2")->read(); + if (offset & 0x01) ret = m_in0->read(); + if (offset & 0x02) ret = m_in1->read(); + if (offset & 0x08) ret = m_in2->read(); return ret; } diff --git a/src/mame/includes/vicdual.h b/src/mame/includes/vicdual.h index 4c2fe9801a2..140e27b9486 100644 --- a/src/mame/includes/vicdual.h +++ b/src/mame/includes/vicdual.h @@ -24,8 +24,15 @@ public: m_coinstate_timer(*this, "coinstate"), m_nsub_coinage_timer(*this, "nsub_coin"), m_screen(*this, "screen"), + m_proms(*this, "proms"), m_videoram(*this, "videoram"), - m_characterram(*this, "characterram") + m_characterram(*this, "characterram"), + m_in0(*this, "IN0"), + m_in1(*this, "IN1"), + m_in2(*this, "IN2"), + m_coinage(*this, "COINAGE"), + m_color_bw(*this, "COLOR_BW"), + m_fake_lives(*this, "FAKE_LIVES") { } required_device m_maincpu; @@ -36,10 +43,18 @@ public: required_device m_coinstate_timer; optional_device m_nsub_coinage_timer; required_device m_screen; + optional_memory_region m_proms; required_shared_ptr m_videoram; required_shared_ptr m_characterram; + required_ioport m_in0; + required_ioport m_in1; + optional_ioport m_in2; + optional_ioport m_coinage; + optional_ioport m_color_bw; + optional_ioport_array<2> m_fake_lives; + UINT8 m_coin_status; UINT8 m_palette_bank; UINT8 m_samurai_protection_data; diff --git a/src/mame/video/vicdual.c b/src/mame/video/vicdual.c index 6b79523fdee..f1e0dee5a70 100644 --- a/src/mame/video/vicdual.c +++ b/src/mame/video/vicdual.c @@ -82,7 +82,7 @@ UINT32 vicdual_state::screen_update_bw(screen_device &screen, bitmap_rgb32 &bitm UINT32 vicdual_state::screen_update_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - UINT8 *color_prom = (UINT8 *)memregion("proms")->base(); + UINT8 *color_prom = (UINT8 *)m_proms->base(); UINT8 x = 0; UINT8 y = cliprect.min_y; UINT8 video_data = 0;