added rp5c01 and rp5h01 devices to spnchout

This commit is contained in:
Michaël Banaan Ananas 2014-08-05 18:15:08 +00:00
parent b0320975c4
commit ac43d2ae70
2 changed files with 152 additions and 221 deletions

View File

@ -7,17 +7,13 @@ The most significant changes are that Punchout has a larger bottom tilemap,
with scrolling, while Arm Wrestling has an additional FG tilemap displayed on
the bottom screen.
- money bag placement might not be 100% correct in Arm Wrestling, however
the more serious part of armwrest35b9yel (unplayable bonus round after rounds
5 and 9) is now fixed.
driver by Nicola Salmoria
TODO:
- add useless driver config to choose between pink and white color proms
- Finish emulation of RP5C01 and RP5H01 for spnchout. The RP5C01 features don't
seem to be used at all except for very basic protection e.g. relying on the
masking done by the internal registers.
- video raw params - pixel clock is derived from 20.16mhz xtal
- finish spnchout protection emulation
- money bag placement might not be 100% correct in Arm Wrestling
main CPU:
@ -126,11 +122,13 @@ DIP locations verified for:
#include "includes/punchout.h"
CUSTOM_INPUT_MEMBER(punchout_state::punchout_vlm5030_busy_r)
{
/* bit 4 of DSW1 is busy pin level */
return (m_vlm->bsy()) ? 0x00 : 0x01;
}
/***************************************************************************
I/O, Memory Maps
***************************************************************************/
// Z80 (main)
WRITE8_MEMBER(punchout_state::punchout_speech_reset_w)
{
@ -155,169 +153,11 @@ WRITE8_MEMBER(punchout_state::punchout_2a03_reset_w)
m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
}
READ8_MEMBER(punchout_state::spunchout_rp5c01_r)
WRITE8_MEMBER(punchout_state::nmi_mask_w)
{
logerror("%04x: prot_r %x\n", space.device().safe_pcbase(), offset);
if (offset <= 0x0c)
{
switch (m_rp5c01_mode_sel & 3)
{
case 0: // time
switch ( offset )
{
case 0x00: // 1-second counter
return m_rp5c01_mem[0x00];
case 0x01: // 10-second counter
return m_rp5c01_mem[0x01] & 0x7;
case 0x02: // 1-minute counter
return m_rp5c01_mem[0x02];
case 0x03: // 10-minute counter
return m_rp5c01_mem[0x03] & 0x07;
case 0x04: // 1-hour counter
return m_rp5c01_mem[0x04];
case 0x05: // 10-hour counter
return m_rp5c01_mem[0x05] & 0x03;
case 0x06: // day-of-the-week counter
return m_rp5c01_mem[0x06] & 0x07;
case 0x07: // 1-day counter
return m_rp5c01_mem[0x07];
case 0x08: // 10-day counter
return m_rp5c01_mem[0x08] & 0x03;
case 0x09: // 1-month counter
return m_rp5c01_mem[0x09];
case 0x0a: // 10-month counter
return m_rp5c01_mem[0x0a] & 0x01;
case 0x0b: // 1-year counter
return m_rp5c01_mem[0x0b];
case 0x0c: // 10-year counter
return m_rp5c01_mem[0x0c];
}
break;
case 1: // alarm
switch ( offset )
{
case 0x00: // n/a
return 0x00;
case 0x01: // n/a
return 0x00;
case 0x02: // 1-minute alarm register
return m_rp5c01_mem[0x12];
case 0x03: // 10-minute alarm register
return m_rp5c01_mem[0x13] & 0x07;
case 0x04: // 1-hour alarm register
return m_rp5c01_mem[0x14];
case 0x05: // 10-hour alarm register
return m_rp5c01_mem[0x15] & 0x03;
case 0x06: // day-of-the-week alarm register
return m_rp5c01_mem[0x16] & 0x07;
case 0x07: // 1-day alarm register
return m_rp5c01_mem[0x17];
case 0x08: // 10-day alarm register
return m_rp5c01_mem[0x18] & 0x03;
case 0x09: // n/a
return 0x00;
case 0x0a: // /12/24 select register
return m_rp5c01_mem[0x1a] & 0x01;
case 0x0b: // leap year count
return m_rp5c01_mem[0x1b] & 0x03;
case 0x0c: // n/a
return 0x00;
}
break;
case 2: // RAM BLOCK 10
case 3: // RAM BLOCK 11
return m_rp5c01_mem[0x10 * (m_rp5c01_mode_sel & 3) + offset];
}
}
else if (offset == 0x0d)
{
return m_rp5c01_mode_sel;
}
logerror("Read from unknown protection? port %02x ( selector = %02x )\n", offset, m_rp5c01_mode_sel );
return 0;
m_nmi_mask = data & 1;
}
WRITE8_MEMBER(punchout_state::spunchout_rp5c01_w)
{
data &= 0x0f;
logerror("%04x: prot_w %x = %02x\n",space.device().safe_pcbase(),offset,data);
if (offset <= 0x0c)
{
m_rp5c01_mem[0x10 * (m_rp5c01_mode_sel & 3) + offset] = data;
}
else if (offset == 0x0d)
{
m_rp5c01_mode_sel = data;
logerror("MODE: Timer EN = %d Alarm EN = %d MODE %d\n",BIT(data,3),BIT(data,2),data&3);
}
else if (offset == 0x0e)
{
logerror("TEST = %d",data);
}
else if (offset == 0x0f)
{
logerror("RESET: /1Hz = %d /16Hz = %d Timer = %d Timer = %d\n",BIT(data,3),BIT(data,2),BIT(data,1),BIT(data,0));
}
}
READ8_MEMBER(punchout_state::spunchout_exp_r)
{
// bit 7 = DATA OUT from RP5H01
// bit 6 = COUNTER OUT from RP5H01
// bit 5 = /ALARM from RP5C01
// bit 4 = n.c.
// bits 3-0 = D3-D0 from RP5C01
UINT8 ret = spunchout_rp5c01_r( space, offset >> 4 );
// FIXME hack
/* PC = 0x0313 */
/* (ret or 0x10) -> (D7DF),(D7A0) - (D7DF),(D7A0) = 0d0h(ret nc) */
if (space.device().safe_pcbase() == 0x0313)
ret |= 0xc0;
return ret;
}
WRITE8_MEMBER(punchout_state::spunchout_exp_w)
{
spunchout_rp5c01_w( space, offset >> 4, data );
}
static ADDRESS_MAP_START( punchout_map, AS_PROGRAM, 8, punchout_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_SHARE("nvram")
@ -346,10 +186,6 @@ static ADDRESS_MAP_START( armwrest_map, AS_PROGRAM, 8, punchout_state )
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(punchout_bg_top_videoram_w) AM_SHARE("bg_top_videoram")
ADDRESS_MAP_END
WRITE8_MEMBER(punchout_state::nmi_mask_w)
{
m_nmi_mask = data & 1;
}
static ADDRESS_MAP_START( punchout_io_map, AS_IO, 8, punchout_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
@ -369,11 +205,56 @@ static ADDRESS_MAP_START( punchout_io_map, AS_IO, 8, punchout_state )
AM_RANGE(0x0d, 0x0d) AM_WRITE(punchout_speech_st_w) /* VLM5030 */
AM_RANGE(0x0e, 0x0e) AM_WRITE(punchout_speech_vcu_w) /* VLM5030 */
AM_RANGE(0x0f, 0x0f) AM_WRITENOP /* enable NVRAM ? */
/* protection ports - Super Punchout only (move to install handler?) */
AM_RANGE(0x07, 0x07) AM_MIRROR(0xf0) AM_MASK(0xf0) AM_READWRITE(spunchout_exp_r, spunchout_exp_w)
ADDRESS_MAP_END
// Super Punch-Out!! comes with an extra security PCB that plugs into the Z80 socket
// CHS1-01-EXP, has Z80 CPU, RP5C01, RP5H01
// The RP5C01 features don't seem to be used at all except for very basic protection
// e.g. relying on the masking done by the internal registers.
READ8_MEMBER(punchout_state::spunchout_exp_r)
{
// d0-d3: D0-D3 from RP5C01
// d4: N/C
// d5: /ALARM from RP5C01
// d6: COUNTER OUT from RP5H01
// d7: DATA OUT from RP5H01
UINT8 ret = m_rtc->read(space, offset >> 4 & 0xf) & 0xf;
ret |= 0x10;
ret |= m_rtc->alarm_r() ? 0x00 : 0x20;
ret |= m_rp5h01->counter_r() ? 0x40 : 0x00;
ret |= m_rp5h01->data_r() ? 0x80 : 0x00;
// FIXME - hack d6/d7 state until we have a dump of RP5H01 and know the connections for spunchout_exp_w
/* PC = 0x0313 */
/* (ret or 0x10) -> (D7DF),(D7A0) - (D7DF),(D7A0) = 0d0h(ret nc) */
ret &= 0x3f;
if (space.device().safe_pcbase() == 0x0313)
{
ret |= 0xc0;
}
return ret;
}
WRITE8_MEMBER(punchout_state::spunchout_exp_w)
{
// d0-d3: D0-D3 to RP5C01
// d4-d7: ? to RP5H01?
m_rtc->write(space, offset >> 4 & 0xf, data & 0xf);
}
static ADDRESS_MAP_START( spnchout_io_map, AS_IO, 8, punchout_state )
AM_RANGE(0x07, 0x07) AM_MIRROR(0xf0) AM_MASK(0xf0) AM_READWRITE(spunchout_exp_r, spunchout_exp_w) /* protection ports */
AM_IMPORT_FROM( punchout_io_map )
ADDRESS_MAP_END
// 2A03 (sound)
static ADDRESS_MAP_START( punchout_sound_map, AS_PROGRAM, 8, punchout_state )
AM_RANGE(0x0000, 0x07ff) AM_RAM
AM_RANGE(0x4016, 0x4016) AM_READ(soundlatch_byte_r)
@ -384,6 +265,18 @@ ADDRESS_MAP_END
/***************************************************************************
Inputs
***************************************************************************/
CUSTOM_INPUT_MEMBER(punchout_state::punchout_vlm5030_busy_r)
{
/* bit 4 of DSW1 is vlm busy pin level */
return (m_vlm->bsy()) ? 0x00 : 0x01;
}
static INPUT_PORTS_START( punchout )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
@ -432,12 +325,12 @@ static INPUT_PORTS_START( punchout )
PORT_DIPSETTING( 0x0c, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) /* Not documented */
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) /* dupe, Not documented */
PORT_DIPSETTING( 0x08, "1 Coin/2 Credits (2 Credits/1 Play)" ) /* Not documented */
PORT_DIPSETTING( 0x0d, "1 Coin/3 Credits (2 Credits/1 Play)" ) /* Not documented */
PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
// PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) /* Not documented */
// PORT_DIPSETTING( 0x09, DEF_STR( 1C_2C ) ) /* Not documented */
PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C ) ) /* dupe, Not documented */
PORT_DIPSETTING( 0x09, DEF_STR( 1C_2C ) ) /* dupe, Not documented */
PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x06, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_5C ) )
@ -463,11 +356,11 @@ static INPUT_PORTS_START( spnchout )
PORT_DIPSETTING( 0x08, DEF_STR( 6C_1C ) ) /* Not documented */
PORT_DIPSETTING( 0x04, DEF_STR( 5C_1C ) ) /* Not documented */
PORT_DIPSETTING( 0x03, DEF_STR( 4C_1C ) ) /* Not documented */
// PORT_DIPSETTING( 0x09, DEF_STR( 4C_1C ) ) /* Not documented */
PORT_DIPSETTING( 0x09, DEF_STR( 4C_1C ) ) /* dupe, Not documented */
PORT_DIPSETTING( 0x0c, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x0e, DEF_STR( 1C_1C ) ) /* Not documented */
PORT_DIPSETTING( 0x0e, DEF_STR( 1C_1C ) ) /* dupe, Not documented */
PORT_DIPSETTING( 0x0d, "1 Coin/3 Credits (2 Credits/1 Play)" ) /* Not documented */
PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0b, "1 Coin/2 Credits (3 Credits/1 Play)" ) /* Not documented */
@ -882,6 +775,13 @@ bit 3210 5432 L R C
INPUT_PORTS_END
/***************************************************************************
Machine Configs
***************************************************************************/
static const gfx_layout charlayout_2bpp =
{
8,8,
@ -919,31 +819,34 @@ static GFXDECODE_START( armwrest )
GFXDECODE_END
void punchout_state::machine_reset()
{
m_rp5c01_mode_sel = 0;
memset(m_rp5c01_mem, 0, sizeof(m_rp5c01_mem));
}
INTERRUPT_GEN_MEMBER(punchout_state::vblank_irq)
{
if(m_nmi_mask)
if (m_nmi_mask)
device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
MACHINE_RESET_MEMBER(punchout_state, spnchout)
{
/* reset the security chip */
m_rp5h01->enable_w(1);
m_rp5h01->enable_w(0);
m_rp5h01->reset_w(0);
m_rp5h01->reset_w(1);
}
static MACHINE_CONFIG_START( punchout, punchout_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, 8000000/2) /* 4 MHz */
MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz/2)
MCFG_CPU_PROGRAM_MAP(punchout_map)
MCFG_CPU_IO_MAP(punchout_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("top", punchout_state, vblank_irq)
MCFG_CPU_VBLANK_INT_DRIVER("top", punchout_state, vblank_irq)
MCFG_CPU_ADD("audiocpu", N2A03, N2A03_DEFAULTCLOCK)
MCFG_CPU_ADD("audiocpu", N2A03, XTAL_21_4772MHz/12)
MCFG_CPU_PROGRAM_MAP(punchout_sound_map)
MCFG_CPU_VBLANK_INT_DRIVER("top", punchout_state, nmi_line_pulse)
MCFG_CPU_VBLANK_INT_DRIVER("top", punchout_state, nmi_line_pulse)
MCFG_NVRAM_ADD_0FILL("nvram")
@ -968,30 +871,41 @@ static MACHINE_CONFIG_START( punchout, punchout_state )
MCFG_SCREEN_UPDATE_DRIVER(punchout_state, screen_update_punchout_bottom)
MCFG_SCREEN_PALETTE("palette")
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("nesapu", NES_APU, N2A03_DEFAULTCLOCK)
MCFG_SOUND_ADD("nesapu", NES_APU, XTAL_21_4772MHz/12)
MCFG_NES_APU_CPU("audiocpu")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SOUND_ADD("vlm", VLM5030, 3580000)
MCFG_SOUND_ADD("vlm", VLM5030, XTAL_21_4772MHz/6)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( spnchout, punchout )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(spnchout_io_map)
MCFG_DEVICE_ADD("rtc", RP5C01, XTAL_32_768kHz) // frequency guessed
MCFG_RP5H01_ADD("rp5h01")
MCFG_MACHINE_RESET_OVERRIDE(punchout_state, spnchout)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( armwrest, punchout )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(armwrest_map)
/* video hardware */
MCFG_GFXDECODE_MODIFY("gfxdecode", armwrest)
MCFG_VIDEO_START_OVERRIDE(punchout_state,armwrest)
MCFG_VIDEO_START_OVERRIDE(punchout_state, armwrest)
MCFG_SCREEN_MODIFY("top")
MCFG_SCREEN_UPDATE_DRIVER(punchout_state, screen_update_armwrest_top)
MCFG_SCREEN_MODIFY("bottom")
@ -1002,7 +916,7 @@ MACHINE_CONFIG_END
/***************************************************************************
Game driver(s)
Game drivers
***************************************************************************/
@ -1417,6 +1331,9 @@ ROM_START( spnchout )
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for the VLM5030 data */
ROM_LOAD( "chs1-c.6p", 0x0000, 0x4000, CRC(ad8b64b8) SHA1(0f1232a10faf71b782f9f6653cca8570243c17e0) )
ROM_REGION( 0x10, "rp5h01", ROMREGION_ERASE00 ) // security prom on daughterboard
ROM_LOAD( "rp5h01.exp", 0x00, 0x10, NO_DUMP )
ROM_END
ROM_START( spnchouta )
@ -1481,6 +1398,9 @@ ROM_START( spnchouta )
ROM_REGION( 0x4000, "vlm", 0 ) /* 16k for the VLM5030 data */
ROM_LOAD( "chs1-c.6p", 0x0000, 0x4000, CRC(ad8b64b8) SHA1(0f1232a10faf71b782f9f6653cca8570243c17e0) )
ROM_REGION( 0x10, "rp5h01", ROMREGION_ERASE00 ) // security prom on daughterboard
ROM_LOAD( "rp5h01.exp", 0x00, 0x10, NO_DUMP )
ROM_END
ROM_START( spnchoutj )
@ -1563,6 +1483,9 @@ ROM_START( spnchoutj )
ROM_REGION( 0x10000, "vlm", 0 ) /* 64k for the VLM5030 data */
ROM_LOAD( "chs1c6pa.bin", 0x0000, 0x4000, CRC(d05fb730) SHA1(9f4c4c7e5113739312558eff4d3d3e42d513aa31) )
ROM_REGION( 0x10, "rp5h01", ROMREGION_ERASE00 ) // security prom on daughterboard
ROM_LOAD( "rp5h01.exp", 0x00, 0x10, NO_DUMP )
ROM_END
ROM_START( armwrest )
@ -1627,7 +1550,7 @@ GAME( 1984, punchout, 0, punchout, punchout, driver_device, 0, ROT0, "Ni
GAME( 1984, punchouta, punchout, punchout, punchout, driver_device, 0, ROT0, "Nintendo", "Punch-Out!! (Rev A)", 0 ) /* CHP1-01 boards */
GAME( 1984, punchoutj, punchout, punchout, punchout, driver_device, 0, ROT0, "Nintendo", "Punch-Out!! (Japan)", 0 )
GAME( 1984, punchita, punchout, punchout, punchout, driver_device, 0, ROT0, "bootleg", "Punch-Out!! (Italian bootleg)", 0 )
GAME( 1984, spnchout, 0, punchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Rev B)", 0 ) /* CHP1-02 boards */
GAME( 1984, spnchouta, spnchout, punchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Rev A)", 0 ) /* CHP1-01 boards */
GAME( 1984, spnchoutj, spnchout, punchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Japan)", 0 )
GAME( 1984, spnchout, 0, spnchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Rev B)", 0 ) /* CHP1-02 boards */
GAME( 1984, spnchouta, spnchout, spnchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Rev A)", 0 ) /* CHP1-01 boards */
GAME( 1984, spnchoutj, spnchout, spnchout, spnchout, driver_device, 0, ROT0, "Nintendo", "Super Punch-Out!! (Japan)", 0 )
GAME( 1985, armwrest, 0, armwrest, armwrest, driver_device, 0, ROT0, "Nintendo", "Arm Wrestling", 0 )

View File

@ -1,3 +1,11 @@
/***************************************************************************
Punch Out / Super Punch Out / Arm Wrestling
***************************************************************************/
#include "machine/rp5c01.h"
#include "machine/rp5h01.h"
#include "sound/vlm5030.h"
class punchout_state : public driver_device
@ -5,6 +13,13 @@ class punchout_state : public driver_device
public:
punchout_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_rtc(*this, "rtc"),
m_rp5h01(*this, "rp5h01"),
m_vlm(*this, "vlm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_bg_top_videoram(*this, "bg_top_videoram"),
m_spr1_ctrlram(*this, "spr1_ctrlram"),
m_spr2_ctrlram(*this, "spr2_ctrlram"),
@ -12,16 +27,17 @@ public:
m_spr1_videoram(*this, "spr1_videoram"),
m_spr2_videoram(*this, "spr2_videoram"),
m_bg_bot_videoram(*this, "bg_bot_videoram"),
m_armwrest_fg_videoram(*this, "armwrest_fgram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_vlm(*this, "vlm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
m_armwrest_fg_videoram(*this, "armwrest_fgram")
{ }
int m_rp5c01_mode_sel;
int m_rp5c01_mem[16*4];
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<rp5c01_device> m_rtc;
optional_device<rp5h01_device> m_rp5h01;
required_device<vlm5030_device> m_vlm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_bg_top_videoram;
required_shared_ptr<UINT8> m_spr1_ctrlram;
required_shared_ptr<UINT8> m_spr2_ctrlram;
@ -31,12 +47,6 @@ public:
required_shared_ptr<UINT8> m_bg_bot_videoram;
optional_shared_ptr<UINT8> m_armwrest_fg_videoram;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<vlm5030_device> m_vlm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
tilemap_t *m_bg_top_tilemap;
tilemap_t *m_bg_bot_tilemap;
tilemap_t *m_fg_tilemap;
@ -46,8 +56,6 @@ public:
UINT8 m_nmi_mask;
DECLARE_WRITE8_MEMBER(punchout_2a03_reset_w);
DECLARE_READ8_MEMBER(spunchout_rp5c01_r);
DECLARE_WRITE8_MEMBER(spunchout_rp5c01_w);
DECLARE_READ8_MEMBER(spunchout_exp_r);
DECLARE_WRITE8_MEMBER(spunchout_exp_w);
DECLARE_WRITE8_MEMBER(nmi_mask_w);
@ -69,9 +77,9 @@ public:
TILE_GET_INFO_MEMBER(armwrest_fg_get_info);
TILEMAP_MAPPER_MEMBER(armwrest_bs1_scan);
TILEMAP_MAPPER_MEMBER(armwrest_bs1_scan_flipx);
virtual void machine_reset();
virtual void video_start();
DECLARE_VIDEO_START(armwrest);
DECLARE_MACHINE_RESET(spnchout);
UINT32 screen_update_punchout_top(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_punchout_bottom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_armwrest_top(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);