Fixed 01436 (esb: Insert a coin, start a game and it will reset by itself after few seconds).

This commit is contained in:
Aaron Giles 2008-03-12 15:01:53 +00:00
parent 9626c879db
commit 6454c32b9f
2 changed files with 41 additions and 40 deletions

View File

@ -23,7 +23,6 @@
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "deprecat.h"
#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h"
#include "video/vector.h" #include "video/vector.h"
#include "video/avgdvg.h" #include "video/avgdvg.h"
@ -40,7 +39,9 @@ UINT8 starwars_is_esb;
/* Local variables */ /* Local variables */
static UINT8 *slapstic_source; static UINT8 *slapstic_source;
static UINT8 *slapstic_base; static UINT8 *slapstic_base;
static UINT8 current_bank; static UINT8 slapstic_current_bank;
static offs_t slapstic_last_pc;
static offs_t slapstic_last_address;
@ -57,8 +58,8 @@ static MACHINE_RESET( starwars )
{ {
/* reset the slapstic */ /* reset the slapstic */
slapstic_reset(); slapstic_reset();
current_bank = slapstic_bank(); slapstic_current_bank = slapstic_bank();
memcpy(slapstic_base, &slapstic_source[current_bank * 0x2000], 0x2000); memcpy(slapstic_base, &slapstic_source[slapstic_current_bank * 0x2000], 0x2000);
/* reset all the banks */ /* reset all the banks */
starwars_out_w(machine, 4, 0); starwars_out_w(machine, 4, 0);
@ -78,7 +79,7 @@ static MACHINE_RESET( starwars )
static WRITE8_HANDLER( irq_ack_w ) static WRITE8_HANDLER( irq_ack_w )
{ {
cpunum_set_input_line(Machine, 0, M6809_IRQ_LINE, CLEAR_LINE); cpunum_set_input_line(machine, 0, M6809_IRQ_LINE, CLEAR_LINE);
} }
@ -89,31 +90,30 @@ static WRITE8_HANDLER( irq_ack_w )
* *
*************************************/ *************************************/
static READ8_HANDLER( esb_slapstic_r ) static void esb_slapstic_tweak(offs_t offset)
{ {
int result = slapstic_base[offset];
int new_bank = slapstic_tweak(offset); int new_bank = slapstic_tweak(offset);
/* update for the new bank */ /* update for the new bank */
if (new_bank != current_bank) if (new_bank != slapstic_current_bank)
{ {
current_bank = new_bank; slapstic_current_bank = new_bank;
memcpy(slapstic_base, &slapstic_source[current_bank * 0x2000], 0x2000); memcpy(slapstic_base, &slapstic_source[slapstic_current_bank * 0x2000], 0x2000);
} }
}
static READ8_HANDLER( esb_slapstic_r )
{
int result = slapstic_base[offset];
esb_slapstic_tweak(offset);
return result; return result;
} }
static WRITE8_HANDLER( esb_slapstic_w ) static WRITE8_HANDLER( esb_slapstic_w )
{ {
int new_bank = slapstic_tweak(offset); esb_slapstic_tweak(offset);
/* update for the new bank */
if (new_bank != current_bank)
{
current_bank = new_bank;
memcpy(slapstic_base, &slapstic_source[current_bank * 0x2000], 0x2000);
}
} }
@ -126,34 +126,29 @@ static WRITE8_HANDLER( esb_slapstic_w )
static OPBASE_HANDLER( esb_setopbase ) static OPBASE_HANDLER( esb_setopbase )
{ {
int prevpc = activecpu_get_previouspc(); /* if we are in the slapstic region, process it */
/*
* This is a slightly ugly kludge for Empire Strikes Back because it jumps
* directly to code in the slapstic.
*/
/* if we're jumping into the slapstic region, tweak the new PC */
if ((address & 0xe000) == 0x8000) if ((address & 0xe000) == 0x8000)
{ {
esb_slapstic_r(machine, address & 0x1fff); offs_t pc = activecpu_get_pc();
/* make sure we catch the next branch as well */ /* filter out duplicates; we get these because the handler gets called for
catch_nextBranch(); multiple reasons:
return -1; 1. Because we have read/write handlers backing the current address
} 2. Because the CPU core executed a jump to a new address
*/
/* if we're jumping out of the slapstic region, tweak the previous PC */ if (pc != slapstic_last_pc || address != slapstic_last_address)
else if ((prevpc & 0xe000) == 0x8000)
{ {
if (prevpc != 0x8080 && prevpc != 0x8090 && prevpc != 0x80a0 && prevpc != 0x80b0) slapstic_last_pc = pc;
esb_slapstic_r(machine, prevpc & 0x1fff); slapstic_last_address = address;
esb_slapstic_tweak(address & 0x1fff);
}
return ~0;
} }
return address; return address;
} }
/************************************* /*************************************
* *
* Main CPU memory handlers * Main CPU memory handlers
@ -598,6 +593,11 @@ static DRIVER_INIT( esb )
memory_set_bank(1, 0); memory_set_bank(1, 0);
memory_configure_bank(2, 0, 2, memory_region(REGION_CPU1) + 0xa000, 0x1c000 - 0xa000); memory_configure_bank(2, 0, 2, memory_region(REGION_CPU1) + 0xa000, 0x1c000 - 0xa000);
memory_set_bank(2, 0); memory_set_bank(2, 0);
/* additional globals for state saving */
state_save_register_global(slapstic_current_bank);
state_save_register_global(slapstic_last_pc);
state_save_register_global(slapstic_last_address);
} }

View File

@ -287,7 +287,7 @@ static const struct slapstic_data slapstic101 =
/* alternate banking */ /* alternate banking */
{ 0x007f,UNKNOWN }, /* 1st mask/value in sequence */ { 0x007f,UNKNOWN }, /* 1st mask/value in sequence */
{ 0x1fff,0x1dfe }, /* 2nd mask/value in sequence */ { 0x1fff,0x1dff }, /* 2nd mask/value in sequence */
{ 0x1ffc,0x1b5c }, /* 3rd mask/value in sequence */ { 0x1ffc,0x1b5c }, /* 3rd mask/value in sequence */
{ 0x1fcf,0x0080 }, /* 4th mask/value in sequence */ { 0x1fcf,0x0080 }, /* 4th mask/value in sequence */
0, /* shift to get bank from 3rd */ 0, /* shift to get bank from 3rd */
@ -904,6 +904,7 @@ static int alt2_kludge(offs_t offset)
int slapstic_tweak(offs_t offset) int slapstic_tweak(offs_t offset)
{ {
//logerror("PC=%04X touch=%04X state=%d\n", activecpu_get_pc(), offset, state);
/* reset is universal */ /* reset is universal */
if (offset == 0x0000) if (offset == 0x0000)
{ {