From c5268b2af5629d23bec13327cc323c3ef82a002e Mon Sep 17 00:00:00 2001 From: Wilbert Pol Date: Thu, 27 Dec 2012 20:47:12 +0000 Subject: [PATCH] (MESS) a2600.c: Fixed supercharger regression. (nw) --- src/emu/cpu/m6502/m6502.h | 1 + src/mess/drivers/a2600.c | 57 +++++++++++++++------------------------ 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/src/emu/cpu/m6502/m6502.h b/src/emu/cpu/m6502/m6502.h index 7314282618f..be346723834 100644 --- a/src/emu/cpu/m6502/m6502.h +++ b/src/emu/cpu/m6502/m6502.h @@ -57,6 +57,7 @@ public: UINT64 get_cycle(); bool get_sync() const { return sync; } + void disable_direct() { direct_disabled = true; } protected: class memory_interface { diff --git a/src/mess/drivers/a2600.c b/src/mess/drivers/a2600.c index 0826c1b2a20..2b090693964 100644 --- a/src/mess/drivers/a2600.c +++ b/src/mess/drivers/a2600.c @@ -72,6 +72,7 @@ public: unsigned m_modeSS_write_enabled; unsigned m_modeSS_high_ram_enabled; unsigned m_modeSS_diff_adjust; + UINT16 m_modeSS_last_address; unsigned m_FVlocked; UINT16 m_current_screen_height; int m_FETimer; @@ -79,7 +80,6 @@ public: direct_update_delegate m_FE_old_opbase_handler; DECLARE_DIRECT_UPDATE_MEMBER(modeF6_opbase); - DECLARE_DIRECT_UPDATE_MEMBER(modeSS_opbase); DECLARE_DIRECT_UPDATE_MEMBER(modeDPC_opbase_handler); DECLARE_DIRECT_UPDATE_MEMBER(modeFE_opbase_handler); DECLARE_READ8_MEMBER(modeF8_switch_r); @@ -888,30 +888,16 @@ DIRECT_UPDATE_MEMBER(a2600_state::modeF6_opbase) return address; } -DIRECT_UPDATE_MEMBER(a2600_state::modeSS_opbase) -{ - if ( address & 0x1000 ) - { - if ( ! direct.space().debugger_access() ) - { - if ( address & 0x800 ) - { - direct.explicit_configure(( address & 0xf800 ), ( address & 0xf800 ) | 0x7ff, 0x7ff, m_bank_base[2]); - } - else - { - direct.explicit_configure(( address & 0xf800 ), ( address & 0xf800 ) | 0x7ff, 0x7ff, m_bank_base[1]); - } - return ~0; - } - } - return address; -} READ8_MEMBER(a2600_state::modeSS_r) { UINT8 data = ( offset & 0x800 ) ? m_bank_base[2][offset & 0x7FF] : m_bank_base[1][offset]; + if ( space.debugger_access() ) + { + return data; + } + //logerror("%04X: read from modeSS area offset = %04X\n", machine().device("maincpu")->safe_pc(), offset); /* Check for control register "write" */ if ( offset == 0xFF8 ) @@ -964,6 +950,8 @@ READ8_MEMBER(a2600_state::modeSS_r) } membank("bank1")->set_base(m_bank_base[1] ); membank("bank2")->set_base(m_bank_base[2] ); + // Make sure we do not trigger a spurious RAM write + m_modeSS_byte_started -= 5; } else if ( offset == 0xFF9 ) { @@ -978,12 +966,20 @@ READ8_MEMBER(a2600_state::modeSS_r) { data = 0x01; } + // Make sure we do not trigger a spurious RAM write + m_modeSS_byte_started -= 5; } else { /* Possible RAM write */ if ( m_modeSS_write_enabled ) { + /* Check for dummy read from same address */ + if ( m_modeSS_last_address == offset ) + { + m_modeSS_diff_adjust += 1; + } + int diff = machine().device("maincpu")->total_cycles() - m_modeSS_byte_started; //logerror("%04X: offset = %04X, %d\n", machine().device("maincpu")->safe_pc(), offset, diff); if ( diff - m_modeSS_diff_adjust == 5 ) @@ -1007,29 +1003,18 @@ READ8_MEMBER(a2600_state::modeSS_r) { m_modeSS_byte = offset; m_modeSS_byte_started = machine().device("maincpu")->total_cycles(); - } - /* Check for dummy read from same address */ - if ( diff == 2 ) - { - m_modeSS_diff_adjust = 1; - } - else - { m_modeSS_diff_adjust = 0; } + m_modeSS_last_address = offset; } else if ( offset < 0x0100 ) { m_modeSS_byte = offset; m_modeSS_byte_started = machine().device("maincpu")->total_cycles(); + m_modeSS_last_address = offset; + m_modeSS_diff_adjust = 0; } } - /* Because the mame core caches opcode data and doesn't perform reads like normal */ - /* we have to put in this little hack here to get Suicide Mission to work. */ - if ( offset != 0xFF8 && ( machine().device("maincpu")->safe_pc() & 0x1FFF ) == 0x1FF8 ) - { - modeSS_r( space, 0xFF8 ); - } return data; } @@ -1481,6 +1466,7 @@ MACHINE_START_MEMBER(a2600_state,a2600) m_current_reset_bank_counter = 0xFF; m_dpc.oscillator = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(a2600_state::modeDPC_timer_callback),this)); m_cart = CART_MEMBER; + m_modeSS_last_address = 0; } @@ -1835,7 +1821,6 @@ void a2600_state::machine_reset() membank("bank2")->set_base(m_bank_base[2] ); m_modeSS_write_enabled = 0; m_modeSS_byte_started = 0; - space.set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeSS_opbase), this)); /* The Supercharger has no motor control so just enable it */ machine().device(CASSETTE_TAG)->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MOTOR_DISABLED ); break; @@ -1949,6 +1934,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_START( a2600, a2600_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK_NTSC / 3) /* actually M6507 */ + MCFG_M6502_DISABLE_DIRECT() MCFG_CPU_PROGRAM_MAP(a2600_mem) MCFG_MACHINE_START_OVERRIDE(a2600_state,a2600) @@ -1986,6 +1972,7 @@ static MACHINE_CONFIG_START( a2600p, a2600_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK_PAL / 3) /* actually M6507 */ MCFG_CPU_PROGRAM_MAP(a2600_mem) + MCFG_M6502_DISABLE_DIRECT() MCFG_MACHINE_START_OVERRIDE(a2600_state,a2600)