mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
protection emulation should be crashproof now
This commit is contained in:
parent
118b344adc
commit
5391b74d56
@ -130,6 +130,15 @@ Stephh's notes (based on the games M6809 code and some tests) :
|
||||
#include "sound/3526intf.h"
|
||||
#include "includes/sidepckt.h"
|
||||
|
||||
// protection tables
|
||||
static const UINT8 sidepckt_prot_table_1[0x10]={0x05,0x03,0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
|
||||
static const UINT8 sidepckt_prot_table_2[0x10]={0x8e,0x42,0xad,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa2,0xff};
|
||||
static const UINT8 sidepckt_prot_table_3[0x10]={0xbd,0x73,0x80,0xbd,0x73,0xa7,0xbd,0x73,0xe0,0x7e,0x72,0x56,0xff,0xff,0xff,0xff};
|
||||
|
||||
static const UINT8 sidepcktj_prot_table_1[0x10]={0x05,0x03,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
|
||||
static const UINT8 sidepcktj_prot_table_2[0x10]={0x8e,0x42,0xb2,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa7,0xff};
|
||||
static const UINT8 sidepcktj_prot_table_3[0x10]={0xbd,0x71,0xc8,0xbd,0x71,0xef,0xbd,0x72,0x28,0x7e,0x70,0x9e,0xff,0xff,0xff,0xff};
|
||||
|
||||
|
||||
WRITE8_MEMBER(sidepckt_state::sound_cpu_command_w)
|
||||
{
|
||||
@ -144,88 +153,38 @@ READ8_MEMBER(sidepckt_state::sidepckt_i8751_r)
|
||||
|
||||
WRITE8_MEMBER(sidepckt_state::sidepckt_i8751_w)
|
||||
{
|
||||
static const int table_1[]={5,3,2};
|
||||
static const int table_2[]={0x8e,0x42,0xad,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa2,0xff};
|
||||
static const int table_3[]={0xbd,0x73,0x80,0xbd,0x73,0xa7,0xbd,0x73,0xe0,0x7e,0x72,0x56,0xff,0xff,0xff,0xff};
|
||||
|
||||
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); /* i8751 triggers FIRQ on main cpu */
|
||||
|
||||
/* This function takes multiple parameters */
|
||||
if (m_in_math==1) {
|
||||
m_in_math=2;
|
||||
m_i8751_return=m_math_param=data;
|
||||
if (m_in_math == 1)
|
||||
{
|
||||
m_in_math = 2;
|
||||
m_math_param = data;
|
||||
m_i8751_return = m_math_param;
|
||||
}
|
||||
else if (m_in_math==2) {
|
||||
m_in_math=0;
|
||||
m_i8751_return=m_math_param/data;
|
||||
else if (m_in_math == 2)
|
||||
{
|
||||
m_in_math = 0;
|
||||
m_i8751_return = (data) ? (m_math_param / data) : 0;
|
||||
}
|
||||
else switch (data) {
|
||||
else switch (data)
|
||||
{
|
||||
case 1: /* ID Check */
|
||||
m_current_table=1; m_current_ptr=0; m_i8751_return=table_1[m_current_ptr++]; break;
|
||||
|
||||
case 2: /* Protection data (executable code) */
|
||||
m_current_table=2; m_current_ptr=0; m_i8751_return=table_2[m_current_ptr++]; break;
|
||||
|
||||
case 3: /* Protection data (executable code) */
|
||||
m_current_table=3; m_current_ptr=0; m_i8751_return=table_3[m_current_ptr++]; break;
|
||||
m_current_table = data - 1;
|
||||
m_current_ptr = 0;
|
||||
case 6: /* Read table data */
|
||||
m_i8751_return = m_prot_table[m_current_table][m_current_ptr];
|
||||
m_current_ptr = (m_current_ptr + 1) & 0x0f;
|
||||
break;
|
||||
|
||||
case 4: /* Divide function - multiple parameters */
|
||||
m_in_math=1;
|
||||
m_i8751_return=4;
|
||||
m_in_math = 1;
|
||||
m_i8751_return = 4;
|
||||
break;
|
||||
|
||||
case 6: /* Read table data */
|
||||
if (m_current_table==1)
|
||||
{
|
||||
assert(m_current_ptr >= 0 && m_current_ptr < ARRAY_LENGTH(table_1));
|
||||
m_i8751_return=table_1[m_current_ptr++];
|
||||
}
|
||||
if (m_current_table==2) m_i8751_return=table_2[m_current_ptr++];
|
||||
if (m_current_table==3) m_i8751_return=table_3[m_current_ptr++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(sidepckt_state::sidepctj_i8751_w)
|
||||
{
|
||||
static const int table_1[]={5,3,0};
|
||||
static const int table_2[]={0x8e,0x42,0xb2,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa7,0xff};
|
||||
static const int table_3[]={0xbd,0x71,0xc8,0xbd,0x71,0xef,0xbd,0x72,0x28,0x7e,0x70,0x9e,0xff,0xff,0xff,0xff};
|
||||
|
||||
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); /* i8751 triggers FIRQ on main cpu */
|
||||
|
||||
/* This function takes multiple parameters */
|
||||
if (m_in_math==1) {
|
||||
m_in_math=2;
|
||||
m_i8751_return=m_math_param=data;
|
||||
}
|
||||
else if (m_in_math==2) {
|
||||
m_in_math=0;
|
||||
m_i8751_return=m_math_param/data;
|
||||
}
|
||||
else switch (data) {
|
||||
case 1: /* ID Check */
|
||||
m_current_table=1; m_current_ptr=0; m_i8751_return=table_1[m_current_ptr++]; break;
|
||||
|
||||
case 2: /* Protection data (executable code) */
|
||||
m_current_table=2; m_current_ptr=0; m_i8751_return=table_2[m_current_ptr++]; break;
|
||||
|
||||
case 3: /* Protection data (executable code) */
|
||||
m_current_table=3; m_current_ptr=0; m_i8751_return=table_3[m_current_ptr++]; break;
|
||||
|
||||
case 4: /* Divide function - multiple parameters */
|
||||
m_in_math=1;
|
||||
m_i8751_return=4;
|
||||
break;
|
||||
|
||||
case 6: /* Read table data */
|
||||
if (m_current_table==1)
|
||||
{
|
||||
assert(m_current_ptr >= 0 && m_current_ptr < ARRAY_LENGTH(table_1));
|
||||
m_i8751_return=table_1[m_current_ptr++];
|
||||
}
|
||||
if (m_current_table==2) m_i8751_return=table_2[m_current_ptr++];
|
||||
if (m_current_table==3) m_i8751_return=table_3[m_current_ptr++];
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -246,11 +205,18 @@ static ADDRESS_MAP_START( sidepckt_map, AS_PROGRAM, 8, sidepckt_state )
|
||||
AM_RANGE(0x3003, 0x3003) AM_READ_PORT("DSW2")
|
||||
AM_RANGE(0x3004, 0x3004) AM_WRITE(sound_cpu_command_w)
|
||||
AM_RANGE(0x300c, 0x300c) AM_READNOP AM_WRITE(sidepckt_flipscreen_w)
|
||||
// AM_RANGE(0x3014, 0x3014) //i8751 read
|
||||
// AM_RANGE(0x3018, 0x3018) //i8751 write
|
||||
AM_RANGE(0x3014, 0x3014) AM_READ(sidepckt_i8751_r)
|
||||
AM_RANGE(0x3018, 0x3018) AM_WRITE(sidepckt_i8751_w)
|
||||
AM_RANGE(0x4000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( sidepcktb_map, AS_PROGRAM, 8, sidepckt_state )
|
||||
AM_RANGE(0x3014, 0x3014) AM_READNOP
|
||||
AM_RANGE(0x3018, 0x3018) AM_WRITENOP
|
||||
AM_IMPORT_FROM( sidepckt_map )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, sidepckt_state )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_RAM
|
||||
AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ym1", ym2203_device, write)
|
||||
@ -386,22 +352,29 @@ static GFXDECODE_START( sidepckt )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
void sidepckt_state::machine_reset()
|
||||
{
|
||||
m_i8751_return = 0;
|
||||
m_current_ptr = 0;
|
||||
m_current_table = 0;
|
||||
m_in_math = 0;
|
||||
m_math_param = 0;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( sidepckt, sidepckt_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M6809, 2000000) /* 2 MHz */
|
||||
MCFG_CPU_ADD("maincpu", M6809, 2000000) /* 2 MHz */
|
||||
MCFG_CPU_PROGRAM_MAP(sidepckt_map)
|
||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", sidepckt_state, nmi_line_pulse)
|
||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", sidepckt_state, nmi_line_pulse)
|
||||
|
||||
MCFG_CPU_ADD("audiocpu", M6502, 1500000) /* 1.5 MHz */
|
||||
MCFG_CPU_ADD("audiocpu", M6502, 1500000) /* 1.5 MHz */
|
||||
MCFG_CPU_PROGRAM_MAP(sound_map)
|
||||
/* NMIs are triggered by the main cpu */
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(58)
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* VERIFY: May be 55 or 56 */)
|
||||
MCFG_SCREEN_REFRESH_RATE(58) /* VERIFY: May be 55 or 56 */
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ )
|
||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(sidepckt_state, screen_update_sidepckt)
|
||||
@ -409,7 +382,6 @@ static MACHINE_CONFIG_START( sidepckt, sidepckt_state )
|
||||
MCFG_GFXDECODE(sidepckt)
|
||||
MCFG_PALETTE_LENGTH(256)
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
@ -421,6 +393,13 @@ static MACHINE_CONFIG_START( sidepckt, sidepckt_state )
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( sidepcktb, sidepckt )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(sidepcktb_map)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -504,17 +483,19 @@ ROM_END
|
||||
|
||||
DRIVER_INIT_MEMBER(sidepckt_state,sidepckt)
|
||||
{
|
||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x3014, 0x3014, read8_delegate(FUNC(sidepckt_state::sidepckt_i8751_r),this));
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0x3018, 0x3018, write8_delegate(FUNC(sidepckt_state::sidepckt_i8751_w),this));
|
||||
m_prot_table[0] = sidepckt_prot_table_1;
|
||||
m_prot_table[1] = sidepckt_prot_table_2;
|
||||
m_prot_table[2] = sidepckt_prot_table_3;
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER(sidepckt_state,sidepctj)
|
||||
DRIVER_INIT_MEMBER(sidepckt_state,sidepcktj)
|
||||
{
|
||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x3014, 0x3014, read8_delegate(FUNC(sidepckt_state::sidepckt_i8751_r),this));
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0x3018, 0x3018, write8_delegate(FUNC(sidepckt_state::sidepctj_i8751_w),this));
|
||||
m_prot_table[0] = sidepcktj_prot_table_1;
|
||||
m_prot_table[1] = sidepcktj_prot_table_2;
|
||||
m_prot_table[2] = sidepcktj_prot_table_3;
|
||||
}
|
||||
|
||||
|
||||
GAME( 1986, sidepckt, 0, sidepckt, sidepckt, sidepckt_state, sidepckt, ROT0, "Data East Corporation", "Side Pocket (World)", GAME_NO_COCKTAIL )
|
||||
GAME( 1986, sidepcktj, sidepckt, sidepckt, sidepcktj, sidepckt_state, sidepctj, ROT0, "Data East Corporation", "Side Pocket (Japan)", GAME_NO_COCKTAIL )
|
||||
GAME( 1986, sidepcktb, sidepckt, sidepckt, sidepcktb, driver_device, 0, ROT0, "bootleg", "Side Pocket (bootleg)", GAME_NO_COCKTAIL )
|
||||
GAME( 1986, sidepckt, 0, sidepckt, sidepckt, sidepckt_state, sidepckt, ROT0, "Data East Corporation", "Side Pocket (World)", GAME_NO_COCKTAIL )
|
||||
GAME( 1986, sidepcktj, sidepckt, sidepckt, sidepcktj, sidepckt_state, sidepcktj, ROT0, "Data East Corporation", "Side Pocket (Japan)", GAME_NO_COCKTAIL )
|
||||
GAME( 1986, sidepcktb, sidepckt, sidepcktb, sidepcktb, driver_device, 0, ROT0, "bootleg", "Side Pocket (bootleg)", GAME_NO_COCKTAIL )
|
||||
|
@ -1,23 +1,35 @@
|
||||
/******************************************************************************
|
||||
|
||||
Data East Side Pocket hardware
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
class sidepckt_state : public driver_device
|
||||
{
|
||||
public:
|
||||
sidepckt_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_colorram(*this, "colorram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_audiocpu(*this, "audiocpu") { }
|
||||
m_spriteram(*this, "spriteram")
|
||||
{ }
|
||||
|
||||
tilemap_t *m_bg_tilemap;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_shared_ptr<UINT8> m_videoram;
|
||||
required_shared_ptr<UINT8> m_colorram;
|
||||
required_shared_ptr<UINT8> m_spriteram;
|
||||
int m_i8751_return;
|
||||
int m_current_ptr;
|
||||
int m_current_table;
|
||||
int m_in_math;
|
||||
int m_math_param;
|
||||
|
||||
const UINT8* m_prot_table[3];
|
||||
UINT8 m_i8751_return;
|
||||
UINT8 m_current_ptr;
|
||||
UINT8 m_current_table;
|
||||
UINT8 m_in_math;
|
||||
UINT8 m_math_param;
|
||||
|
||||
DECLARE_WRITE8_MEMBER(sound_cpu_command_w);
|
||||
DECLARE_READ8_MEMBER(sidepckt_i8751_r);
|
||||
DECLARE_WRITE8_MEMBER(sidepckt_i8751_w);
|
||||
@ -26,12 +38,11 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(sidepckt_colorram_w);
|
||||
DECLARE_WRITE8_MEMBER(sidepckt_flipscreen_w);
|
||||
DECLARE_DRIVER_INIT(sidepckt);
|
||||
DECLARE_DRIVER_INIT(sidepctj);
|
||||
DECLARE_DRIVER_INIT(sidepcktj);
|
||||
TILE_GET_INFO_MEMBER(get_tile_info);
|
||||
virtual void machine_reset();
|
||||
virtual void video_start();
|
||||
virtual void palette_init();
|
||||
UINT32 screen_update_sidepckt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
};
|
||||
|
@ -1,3 +1,11 @@
|
||||
/******************************************************************************
|
||||
|
||||
Data East Side Pocket hardware
|
||||
|
||||
Functions to emulate the video hardware
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/sidepckt.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user