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 "deprecat.h"
#include "cpu/m6809/m6809.h"
#include "video/vector.h"
#include "video/avgdvg.h"
@ -40,7 +39,9 @@ UINT8 starwars_is_esb;
/* Local variables */
static UINT8 *slapstic_source;
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 */
slapstic_reset();
current_bank = slapstic_bank();
memcpy(slapstic_base, &slapstic_source[current_bank * 0x2000], 0x2000);
slapstic_current_bank = slapstic_bank();
memcpy(slapstic_base, &slapstic_source[slapstic_current_bank * 0x2000], 0x2000);
/* reset all the banks */
starwars_out_w(machine, 4, 0);
@ -78,7 +79,7 @@ static MACHINE_RESET( starwars )
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);
/* update for the new bank */
if (new_bank != current_bank)
if (new_bank != slapstic_current_bank)
{
current_bank = new_bank;
memcpy(slapstic_base, &slapstic_source[current_bank * 0x2000], 0x2000);
slapstic_current_bank = new_bank;
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;
}
static WRITE8_HANDLER( esb_slapstic_w )
{
int new_bank = 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);
}
esb_slapstic_tweak(offset);
}
@ -126,34 +126,29 @@ static WRITE8_HANDLER( esb_slapstic_w )
static OPBASE_HANDLER( esb_setopbase )
{
int prevpc = activecpu_get_previouspc();
/*
* 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 we are in the slapstic region, process it */
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 */
catch_nextBranch();
return -1;
/* filter out duplicates; we get these because the handler gets called for
multiple reasons:
1. Because we have read/write handlers backing the current address
2. Because the CPU core executed a jump to a new address
*/
if (pc != slapstic_last_pc || address != slapstic_last_address)
{
slapstic_last_pc = pc;
slapstic_last_address = address;
esb_slapstic_tweak(address & 0x1fff);
}
return ~0;
}
/* if we're jumping out of the slapstic region, tweak the previous PC */
else if ((prevpc & 0xe000) == 0x8000)
{
if (prevpc != 0x8080 && prevpc != 0x8090 && prevpc != 0x80a0 && prevpc != 0x80b0)
esb_slapstic_r(machine, prevpc & 0x1fff);
}
return address;
}
/*************************************
*
* Main CPU memory handlers
@ -598,6 +593,11 @@ static DRIVER_INIT( esb )
memory_set_bank(1, 0);
memory_configure_bank(2, 0, 2, memory_region(REGION_CPU1) + 0xa000, 0x1c000 - 0xa000);
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 */
{ 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 */
{ 0x1fcf,0x0080 }, /* 4th mask/value in sequence */
0, /* shift to get bank from 3rd */
@ -904,6 +904,7 @@ static int alt2_kludge(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 */
if (offset == 0x0000)
{