Fixed 01436 (esb: Insert a coin, start a game and it will reset by itself after few seconds).
This commit is contained in:
parent
9626c879db
commit
6454c32b9f
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user