diff options
Diffstat (limited to 'src/mame/drivers/slapshot.c')
-rw-r--r-- | src/mame/drivers/slapshot.c | 751 |
1 files changed, 751 insertions, 0 deletions
diff --git a/src/mame/drivers/slapshot.c b/src/mame/drivers/slapshot.c new file mode 100644 index 00000000000..06ff98bbdf6 --- /dev/null +++ b/src/mame/drivers/slapshot.c @@ -0,0 +1,751 @@ +/*************************************************************************** + +Slapshot (c) Taito 1994 +Operation Wolf 3 (c) Taito 1994 +-------- + +David Graves + +(this is based on the F2 driver by Bryan McPhail, Brad Oliver, Andrew Prime, +Nicola Salmoria.) + + ***** + +Slapshot uses one or two newer Taito custom ics, but the hardware is +very similar to the Taito F2 system, especially F2 games using the same +TC0480SCP tilemap generator (e.g. Metal Black). + +This game has 6 separate layers of graphics - four 32x32 tiled scrolling +zoomable background planes of 16x16 tiles, a text plane with 64x64 8x8 +character tiles with character definitions held in ram, and a sprite +plane with zoomable 16x16 sprites. This sprite system appears to be +identical to the one used in F2 and F3 games. + +Slapshot switches in and out of the double-width tilemap mode of the +TC0480SCP. This is unusual, as most games stick to one width. + +The palette generator is 8 bits per color gun like the Taito F3 system. +Like Metal Black the palette space is doubled, and the first half used +for sprites only so the second half can be devoted to tilemaps. + +The main cpu is a 68000. + +There is a slave Z80 which interfaces with a YM2610B for sound. +Commands are written to it by the 68000 (as in the Taito F2 games). + + +Slapshot custom ics +------------------- + +TC0480SCP (IC61) - known tilemap chip +TC0640FIO (IC83) - new version of TC0510NIO io chip? +TC0650FDA (IC84) - (palette?) +TC0360PRI (IC56) - (common in pri/color combo on F2 boards) +TC0530SYC (IC58) - known sound comm chip +TC0520TBC (IC36) - known object chip +TC0540OBN (IC54) - known object chip + + +TODO +==== + +Some hanging notes (try F2 while music is playing). + +Sprite colors issue: when you do a super-shot, on the cut +screen the man (it's always the American) should be black. + +Col $f8 is used for the man, col $fc for the red/pink +"explosion" under the puck. (Use this to track where they are +in spriteram quickly.) Both of these colors are only set +when the first super-shot happens, so it's clear those +colors are for the super-shot... but screenshot evidence +proves the man should be entirely black. + +Extract common sprite stuff from this and taito_f2 ? + + +Code +---- +$854 marks start of service mode + +----------------- + +Operation Wolf 3 is on almost identical hardware to Slapshot. It uses +far more graphics data and samples than Slapshot. + +Compared to Taito's gun game Under Fire (1993), the hardware here is +obviously underpowered. Large data roms help the 68000 throw around the +gfx (a method used in Dino Rex) but can't disguise that it should have +been done using enhanced Z system or F3 system hardware. + +*************************************************************************** + +Operation Wolf 3 (US Version) - (c) 1994 Taito America Corp. + +Main Board K11E0801A - Not to Scale:-) + + D74 17 Sub Board Connector + D74 20 MC68000P12F D74-05 SW2 + D74 18 D74-06 + D74 16 MK48T08B-10 TCO480SCP 84256A-70L + 84256A-70L +MB8421-90LP D74-02 84256A-70L 26.6860MHz TCO640FIO + D74-03 84256A-70L + D74-04 + TCO540OBN TCO360PRI TCO650FDA + TCO520TBC + 32.0000MHz Y3016-F + D74-01 TCO530SYC D74 19 YM2610B + Z0840004PSC + + + +Sub Board K91X0488A + Basicly a few connectors, Caps, resistors & ADC0809CNN + +Chips: + Main: MC68000P12F +Sound: Z084004PSC, YM2610B, Y3016-F + OSC: 32.000MHz, 26.6860MHz + +Taito Custom: + TCO480SCP + TCO640FIO + TCO650FDA + TCO530SYC + TCO520TBC + TCO540OBN + TCO360PRI + +ST TimeKeeper Ram MK48T08B-10 - Lithuim Batery backed RAM chip +MB8421-90LP - Dual Port SRAM +ADC0809CNN - 8-bit Microprocessor Compatible A/D Converter + With 8-Channel Multiplexer + DataSheet: http://www.national.com/ds/AD/ADC0808.pdf + +Region byte at offset 0x031: + d74_21.1 0x02 World Version + d74_20.1 0x01 US Version + d74_??.1 0x00 Will Produce a Japanese Version, but it's unknown if the + actual sound CPU code is the same as the World version, + US versions or different then both. +***************************************************************************/ + +#include "driver.h" +#include "cpu/m68000/m68000.h" +#include "video/taitoic.h" +#include "audio/taitosnd.h" +#include "sound/2610intf.h" +#include "machine/timekpr.h" + + +VIDEO_EOF( opwolf3_full_buffer_delayed ); +VIDEO_EOF( taito_no_buffer ); +VIDEO_START( slapshot ); +VIDEO_UPDATE( slapshot ); + +static UINT16 *color_ram; + +extern UINT16 *taito_sprite_ext; +extern size_t taito_spriteext_size; + + +/****************************************************** + COLOR +******************************************************/ + +static READ16_HANDLER( color_ram_word_r ) +{ + return color_ram[offset]; +} + +static WRITE16_HANDLER( color_ram_word_w ) +{ + int r,g,b; + COMBINE_DATA(&color_ram[offset]); + + if ((offset % 2) == 1) /* assume words written sequentially */ + { + r = (color_ram[offset-1] &0xff); + g = (color_ram[offset] &0xff00) >> 8; + b = (color_ram[offset] &0xff); + + palette_set_color(Machine,offset/2,MAKE_RGB(r,g,b)); + } +} + + +/*********************************************************** + INTERRUPTS +***********************************************************/ + +static TIMER_CALLBACK( slapshot_interrupt6 ) +{ + cpunum_set_input_line(0,6,HOLD_LINE); +} + + +static INTERRUPT_GEN( slapshot_interrupt ) +{ + timer_set(ATTOTIME_IN_CYCLES(200000-500,0),0, slapshot_interrupt6); + cpunum_set_input_line(0,5,HOLD_LINE); +} + + +/********************************************************** + GAME INPUTS +**********************************************************/ + +static READ16_HANDLER( slapshot_service_input_r ) +{ + switch (offset) + { + case 0x03: + return ((input_port_3_word_r(0,0) & 0xef) | + (input_port_5_word_r(0,0) & 0x10)) << 8; /* IN3 + service switch */ + + default: + return TC0640FIO_r(offset) << 8; + } +} + +static READ16_HANDLER( opwolf3_adc_r ) +{ + return readinputport(6 + offset)<<8; +} + +static WRITE16_HANDLER( opwolf3_adc_req_w ) +{ + /* 4 writes a frame - one for each analogue port */ + cpunum_set_input_line(0,3,HOLD_LINE); +} + +/***************************************************** + SOUND +*****************************************************/ + +static INT32 banknum = -1; + +static void reset_sound_region(void) +{ + memory_set_bankptr( 10, memory_region(REGION_CPU2) + (banknum * 0x4000) + 0x10000 ); +} + +static MACHINE_START( slapshot ) +{ + state_save_register_global(banknum); + state_save_register_func_postload(reset_sound_region); +} + + +static WRITE8_HANDLER( sound_bankswitch_w ) +{ + banknum = (data - 1) & 7; + reset_sound_region(); +} + +static WRITE16_HANDLER( slapshot_msb_sound_w ) +{ + if (offset == 0) + taitosound_port_w (0,(data >> 8) & 0xff); + else if (offset == 1) + taitosound_comm_w (0,(data >> 8) & 0xff); + +#ifdef MAME_DEBUG + if (data & 0xff) + popmessage("taito_msb_sound_w to low byte: %04x",data); +#endif +} + +static READ16_HANDLER( slapshot_msb_sound_r ) +{ + if (offset == 1) + return ((taitosound_comm_r (0) & 0xff) << 8); + else return 0; +} + + +/*********************************************************** + MEMORY STRUCTURES +***********************************************************/ + +static ADDRESS_MAP_START( slapshot_readmem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x0fffff) AM_READ(MRA16_ROM) + AM_RANGE(0x500000, 0x50ffff) AM_READ(MRA16_RAM) /* main RAM */ + AM_RANGE(0x600000, 0x60ffff) AM_READ(MRA16_RAM) /* sprite ram */ + AM_RANGE(0x700000, 0x701fff) AM_READ(MRA16_RAM) /* debugging */ + AM_RANGE(0x800000, 0x80ffff) AM_READ(TC0480SCP_word_r) /* tilemaps */ + AM_RANGE(0x830000, 0x83002f) AM_READ(TC0480SCP_ctrl_word_r) + AM_RANGE(0x900000, 0x907fff) AM_READ(color_ram_word_r) /* 8bpg palette */ + AM_RANGE(0xa00000, 0xa03fff) AM_READ(timekeeper_0_msb16_r) /* nvram (only low bytes used) */ + AM_RANGE(0xc00000, 0xc0000f) AM_READ(TC0640FIO_halfword_byteswap_r) + AM_RANGE(0xc00020, 0xc0002f) AM_READ(slapshot_service_input_r) /* service mirror */ + AM_RANGE(0xd00000, 0xd00003) AM_READ(slapshot_msb_sound_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( slapshot_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x0fffff) AM_WRITE(MWA16_ROM) + AM_RANGE(0x500000, 0x50ffff) AM_WRITE(MWA16_RAM) + AM_RANGE(0x600000, 0x60ffff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) + AM_RANGE(0x700000, 0x701fff) AM_WRITE(MWA16_RAM) AM_BASE(&taito_sprite_ext) AM_SIZE(&taito_spriteext_size) + AM_RANGE(0x800000, 0x80ffff) AM_WRITE(TC0480SCP_word_w) /* tilemaps */ + AM_RANGE(0x830000, 0x83002f) AM_WRITE(TC0480SCP_ctrl_word_w) + AM_RANGE(0x900000, 0x907fff) AM_WRITE(color_ram_word_w) AM_BASE(&color_ram) + AM_RANGE(0xa00000, 0xa03fff) AM_WRITE(timekeeper_0_msb16_w) + AM_RANGE(0xb00000, 0xb0001f) AM_WRITE(TC0360PRI_halfword_swap_w) /* priority chip */ + AM_RANGE(0xc00000, 0xc0000f) AM_WRITE(TC0640FIO_halfword_byteswap_w) + AM_RANGE(0xd00000, 0xd00003) AM_WRITE(slapshot_msb_sound_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( opwolf3_readmem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA16_ROM) + AM_RANGE(0x500000, 0x50ffff) AM_READ(MRA16_RAM) /* main RAM */ + AM_RANGE(0x600000, 0x60ffff) AM_READ(MRA16_RAM) /* sprite ram */ + AM_RANGE(0x700000, 0x701fff) AM_READ(MRA16_RAM) /* debugging */ + AM_RANGE(0x800000, 0x80ffff) AM_READ(TC0480SCP_word_r) /* tilemaps */ + AM_RANGE(0x830000, 0x83002f) AM_READ(TC0480SCP_ctrl_word_r) + AM_RANGE(0x900000, 0x907fff) AM_READ(color_ram_word_r) /* 8bpg palette */ + AM_RANGE(0xa00000, 0xa03fff) AM_READ(timekeeper_0_msb16_r) /* nvram (only low bytes used) */ + AM_RANGE(0xc00000, 0xc0000f) AM_READ(TC0640FIO_halfword_byteswap_r) + AM_RANGE(0xc00020, 0xc0002f) AM_READ(slapshot_service_input_r) /* service mirror */ + AM_RANGE(0xd00000, 0xd00003) AM_READ(slapshot_msb_sound_r) + AM_RANGE(0xe00000, 0xe00007) AM_READ(opwolf3_adc_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( opwolf3_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA16_ROM) + AM_RANGE(0x500000, 0x50ffff) AM_WRITE(MWA16_RAM) + AM_RANGE(0x600000, 0x60ffff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) + AM_RANGE(0x700000, 0x701fff) AM_WRITE(MWA16_RAM) AM_BASE(&taito_sprite_ext) AM_SIZE(&taito_spriteext_size) + AM_RANGE(0x800000, 0x80ffff) AM_WRITE(TC0480SCP_word_w) /* tilemaps */ + AM_RANGE(0x830000, 0x83002f) AM_WRITE(TC0480SCP_ctrl_word_w) + AM_RANGE(0x900000, 0x907fff) AM_WRITE(color_ram_word_w) AM_BASE(&color_ram) + AM_RANGE(0xa00000, 0xa03fff) AM_WRITE(timekeeper_0_msb16_w) + AM_RANGE(0xb00000, 0xb0001f) AM_WRITE(TC0360PRI_halfword_swap_w) /* priority chip */ + AM_RANGE(0xc00000, 0xc0000f) AM_WRITE(TC0640FIO_halfword_byteswap_w) + AM_RANGE(0xd00000, 0xd00003) AM_WRITE(slapshot_msb_sound_w) + AM_RANGE(0xe00000, 0xe00007) AM_WRITE(opwolf3_adc_req_w) +ADDRESS_MAP_END + +/***************************************************************************/ + +static ADDRESS_MAP_START( z80_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK10) + AM_RANGE(0xc000, 0xdfff) AM_READ(MRA8_RAM) + AM_RANGE(0xe000, 0xe000) AM_READ(YM2610_status_port_0_A_r) + AM_RANGE(0xe001, 0xe001) AM_READ(YM2610_read_port_0_r) + AM_RANGE(0xe002, 0xe002) AM_READ(YM2610_status_port_0_B_r) + AM_RANGE(0xe200, 0xe200) AM_READ(MRA8_NOP) + AM_RANGE(0xe201, 0xe201) AM_READ(taitosound_slave_comm_r) + AM_RANGE(0xea00, 0xea00) AM_READ(MRA8_NOP) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( z80_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0xc000, 0xdfff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xe000, 0xe000) AM_WRITE(YM2610_control_port_0_A_w) + AM_RANGE(0xe001, 0xe001) AM_WRITE(YM2610_data_port_0_A_w) + AM_RANGE(0xe002, 0xe002) AM_WRITE(YM2610_control_port_0_B_w) + AM_RANGE(0xe003, 0xe003) AM_WRITE(YM2610_data_port_0_B_w) + AM_RANGE(0xe200, 0xe200) AM_WRITE(taitosound_slave_port_w) + AM_RANGE(0xe201, 0xe201) AM_WRITE(taitosound_slave_comm_w) + AM_RANGE(0xe400, 0xe403) AM_WRITE(MWA8_NOP) /* pan */ + AM_RANGE(0xee00, 0xee00) AM_WRITE(MWA8_NOP) /* ? */ + AM_RANGE(0xf000, 0xf000) AM_WRITE(MWA8_NOP) /* ? */ + AM_RANGE(0xf200, 0xf200) AM_WRITE(sound_bankswitch_w) +ADDRESS_MAP_END + + +/*********************************************************** + INPUT PORTS (DIPs in nvram) +***********************************************************/ + +static INPUT_PORTS_START( slapshot ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) /* bit is service switch at c0002x */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + + PORT_START_TAG("IN5") /* IN5, so we can OR in service switch */ + PORT_SERVICE_NO_TOGGLE(0x10, IP_ACTIVE_LOW) +INPUT_PORTS_END + +static INPUT_PORTS_START( opwolf3 ) + PORT_START_TAG("IN0") /* IN0, all bogus */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN4 ) + + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("1 Player Start/Button3")// also button 3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("2 Player Start/Button3")// also button 3 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* bit is service switch at c0002x */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN5") /* IN5, so we can OR in service switch */ + PORT_SERVICE_NO_TOGGLE(0x10, IP_ACTIVE_LOW) + + PORT_START_TAG("IN6") /* IN 6, P1X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_REVERSE PORT_PLAYER(1) + + PORT_START_TAG("IN7") /* IN 7, P1Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1) + + PORT_START_TAG("IN8") /* IN 8, P2X */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_REVERSE PORT_PLAYER(2) + + PORT_START_TAG("IN9") /* IN 9, P2Y */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x10,0xf0) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(2) +INPUT_PORTS_END + +/*********************************************************** + GFX DECODING + +***********************************************************/ + +static const gfx_layout tilelayout = +{ + 16,16, + RGN_FRAC(1,2), + 6, + { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, 0, 1, 2, 3 }, + { + 4, 0, 12, 8, + 16+4, 16+0, 16+12, 16+8, + 32+4, 32+0, 32+12, 32+8, + 48+4, 48+0, 48+12, 48+8 }, + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, + 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, + 128*8 /* every sprite takes 128 consecutive bytes */ +}; + +static const gfx_layout slapshot_charlayout = +{ + 16,16, /* 16*16 characters */ + RGN_FRAC(1,1), + 4, /* 4 bits per pixel */ + { 0, 1, 2, 3 }, + { 1*4, 0*4, 5*4, 4*4, 3*4, 2*4, 7*4, 6*4, 9*4, 8*4, 13*4, 12*4, 11*4, 10*4, 15*4, 14*4 }, + { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, + 128*8 /* every sprite takes 128 consecutive bytes */ +}; + +static GFXDECODE_START( slapshot ) + GFXDECODE_ENTRY( REGION_GFX2, 0x0, tilelayout, 0, 256 ) /* sprite parts */ + GFXDECODE_ENTRY( REGION_GFX1, 0x0, slapshot_charlayout, 0, 256 ) /* sprites & playfield */ +GFXDECODE_END + + + +/************************************************************** + YM2610B (SOUND) +**************************************************************/ + +/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ +static void irqhandler(int irq) +{ + cpunum_set_input_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE); +} + +static struct YM2610interface ym2610_interface = +{ + irqhandler, + REGION_SOUND2, /* Delta-T */ + REGION_SOUND1 /* ADPCM */ +}; + + +/*********************************************************** + MACHINE DRIVERS +***********************************************************/ + +static MACHINE_DRIVER_START( slapshot ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, 14346000) /* 28.6860 MHz / 2 ??? */ + MDRV_CPU_PROGRAM_MAP(slapshot_readmem,slapshot_writemem) + MDRV_CPU_VBLANK_INT(slapshot_interrupt,1) + + MDRV_CPU_ADD(Z80,32000000/8) + /* audio CPU */ /* 4 MHz */ + MDRV_CPU_PROGRAM_MAP(z80_sound_readmem,z80_sound_writemem) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(10) + + MDRV_MACHINE_START(slapshot) + MDRV_NVRAM_HANDLER(timekeeper_0) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(40*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(slapshot) + MDRV_PALETTE_LENGTH(8192) + + MDRV_VIDEO_START(slapshot) + MDRV_VIDEO_EOF(taito_no_buffer) + MDRV_VIDEO_UPDATE(slapshot) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YM2610B, 16000000/2) + MDRV_SOUND_CONFIG(ym2610_interface) + MDRV_SOUND_ROUTE(0, "left", 0.25) + MDRV_SOUND_ROUTE(0, "right", 0.25) + MDRV_SOUND_ROUTE(1, "left", 1.0) + MDRV_SOUND_ROUTE(2, "right", 1.0) +MACHINE_DRIVER_END + +static MACHINE_DRIVER_START( opwolf3 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, 14346000) /* 28.6860 MHz / 2 ??? */ + MDRV_CPU_PROGRAM_MAP(opwolf3_readmem,opwolf3_writemem) + MDRV_CPU_VBLANK_INT(slapshot_interrupt,1) + + MDRV_CPU_ADD(Z80,32000000/8) + /* audio CPU */ /* 4 MHz */ + MDRV_CPU_PROGRAM_MAP(z80_sound_readmem,z80_sound_writemem) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(10) + + MDRV_NVRAM_HANDLER(timekeeper_0) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(40*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(slapshot) + MDRV_PALETTE_LENGTH(8192) + + MDRV_VIDEO_START(slapshot) + MDRV_VIDEO_EOF(taito_no_buffer) + MDRV_VIDEO_UPDATE(slapshot) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YM2610B, 16000000/2) + MDRV_SOUND_CONFIG(ym2610_interface) + MDRV_SOUND_ROUTE(0, "left", 0.25) + MDRV_SOUND_ROUTE(0, "right", 0.25) + MDRV_SOUND_ROUTE(1, "left", 1.0) + MDRV_SOUND_ROUTE(2, "right", 1.0) +MACHINE_DRIVER_END + +/*************************************************************************** + DRIVERS +***************************************************************************/ + +ROM_START( slapshot ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 1024K for 68000 code */ + ROM_LOAD16_BYTE( "d71-15.3", 0x00000, 0x80000, CRC(1470153f) SHA1(63fd5314fcaafba7326fd9481e3c686901dde65c) ) + ROM_LOAD16_BYTE( "d71-16.1", 0x00001, 0x80000, CRC(f13666e0) SHA1(e8b475163ea7da5ee3f2b900004cc67c684bab75) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* sound cpu */ + ROM_LOAD ( "d71-07.77", 0x00000, 0x4000, CRC(dd5f670c) SHA1(743a9563c40fe40178c9ec8eece71a08380c2239) ) + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + + ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d71-04.79", 0x00000, 0x80000, CRC(b727b81c) SHA1(9f56160e2b3e4d59cfa96b5c013f4e368781666e) ) /* SCR */ + ROM_LOAD16_BYTE( "d71-05.80", 0x00001, 0x80000, CRC(7b0f5d6d) SHA1(a54e4a651dc7cdc160286afb3d38531c7b9396b1) ) + + ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d71-01.23", 0x000000, 0x100000, CRC(0b1e8c27) SHA1(ffa452f7414f3d61edb69bb61b29a0cc8d9176d0) ) /* OBJ 6bpp */ + ROM_LOAD16_BYTE( "d71-02.24", 0x000001, 0x100000, CRC(ccaaea2d) SHA1(71b507f215f37e991abae5523642417a6b23a70d) ) + ROM_LOAD ( "d71-03.25", 0x300000, 0x100000, CRC(dccef9ec) SHA1(ee7a49727b822cf4c1d7acff994b77ea6191c423) ) + ROM_FILL ( 0x200000, 0x100000, 0 ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "d71-06.37", 0x00000, 0x80000, CRC(f3324188) SHA1(70dd724441eae8614218bc7f0f51860bd2462f0c) ) + + /* no Delta-T samples */ + +// Pals (not dumped) +// ROM_LOAD( "d71-08.40", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "d71-09.57", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "d71-10.60", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "d71-11.42", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "d71-12.59", 0x00000, 0x00???, NO_DUMP ) +// ROM_LOAD( "d71-13.8", 0x00000, 0x00???, NO_DUMP ) +ROM_END + +ROM_START( opwolf3 ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) /* 1024K for 68000 code */ + ROM_LOAD16_BYTE( "d74_16.3", 0x000000, 0x80000, CRC(198ff1f6) SHA1(f5b51e39cd73ea56cbf53731d3c885bfcecbd696) ) + ROM_LOAD16_BYTE( "d74_21.1", 0x000001, 0x80000, CRC(c61c558b) SHA1(6340eb83ba4cd8d7c63b22ea738c8367c87c1de1) ) + ROM_LOAD16_BYTE( "d74_18.18", 0x100000, 0x80000, CRC(bd5d7cdb) SHA1(29f1cd7b86bc05f873e93f088194113da87a3b86) ) // data ??? + ROM_LOAD16_BYTE( "d74_17.17", 0x100001, 0x80000, CRC(ac35a672) SHA1(8136bd076443bfaeb3d339971d88951e8b2b59b4) ) // data ??? + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* sound cpu */ + ROM_LOAD ( "d74_22.77", 0x00000, 0x4000, CRC(118374a6) SHA1(cc1d0d28efdf1df3e648e7d932405811854ba4ee) ) + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + + ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d74_05.80", 0x000000, 0x200000, CRC(85ea64cc) SHA1(1960a934191c451df1554323d47f6fc64939b0ce) ) /* SCR */ + ROM_LOAD16_BYTE( "d74_06.81", 0x000001, 0x200000, CRC(2fa1e08d) SHA1(f1f34b308202fe08e73535424b5b4e3d91295224) ) + + ROM_REGION( 0x800000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d74_02.23", 0x000000, 0x200000, CRC(aab86332) SHA1(b9133407504e9ef4fd5ae7d284cdb0c7f78f9a99) ) /* OBJ 6bpp */ + ROM_LOAD16_BYTE( "d74_03.24", 0x000001, 0x200000, CRC(3f398916) SHA1(4b6a3ee0baf5f32e24e5040f233300f1ca347fe7) ) + ROM_LOAD ( "d74_04.25", 0x600000, 0x200000, CRC(2f385638) SHA1(1ba2ec7d9b1c491e1cc6d7e646e09ef2bc063f25) ) + ROM_FILL ( 0x400000, 0x200000, 0 ) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "d74_01.37", 0x000000, 0x200000, CRC(115313e0) SHA1(51a69e7a26960b1328ccefeaec0fb26bdccc39f2) ) + + /* no Delta-T samples */ +ROM_END + +ROM_START( opwolf3u ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) /* 1024K for 68000 code */ + ROM_LOAD16_BYTE( "d74_16.3", 0x000000, 0x80000, CRC(198ff1f6) SHA1(f5b51e39cd73ea56cbf53731d3c885bfcecbd696) ) + ROM_LOAD16_BYTE( "d74_20.1", 0x000001, 0x80000, CRC(960fd892) SHA1(2584a048d29a96b69428fba2b71269ea6ccf9010) ) + ROM_LOAD16_BYTE( "d74_18.18", 0x100000, 0x80000, CRC(bd5d7cdb) SHA1(29f1cd7b86bc05f873e93f088194113da87a3b86) ) // data ??? + ROM_LOAD16_BYTE( "d74_17.17", 0x100001, 0x80000, CRC(ac35a672) SHA1(8136bd076443bfaeb3d339971d88951e8b2b59b4) ) // data ??? + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* sound cpu */ + ROM_LOAD ( "d74_19.77", 0x00000, 0x4000, CRC(05d53f06) SHA1(48b0cd68ad3758f424552a4e3833c5a1c2f1825b) ) + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + + ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d74_05.80", 0x000000, 0x200000, CRC(85ea64cc) SHA1(1960a934191c451df1554323d47f6fc64939b0ce) ) /* SCR */ + ROM_LOAD16_BYTE( "d74_06.81", 0x000001, 0x200000, CRC(2fa1e08d) SHA1(f1f34b308202fe08e73535424b5b4e3d91295224) ) + + ROM_REGION( 0x800000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "d74_02.23", 0x000000, 0x200000, CRC(aab86332) SHA1(b9133407504e9ef4fd5ae7d284cdb0c7f78f9a99) ) /* OBJ 6bpp */ + ROM_LOAD16_BYTE( "d74_03.24", 0x000001, 0x200000, CRC(3f398916) SHA1(4b6a3ee0baf5f32e24e5040f233300f1ca347fe7) ) + ROM_LOAD ( "d74_04.25", 0x600000, 0x200000, CRC(2f385638) SHA1(1ba2ec7d9b1c491e1cc6d7e646e09ef2bc063f25) ) + ROM_FILL ( 0x400000, 0x200000, 0 ) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* ADPCM samples */ + ROM_LOAD( "d74_01.37", 0x000000, 0x200000, CRC(115313e0) SHA1(51a69e7a26960b1328ccefeaec0fb26bdccc39f2) ) + + /* no Delta-T samples */ +ROM_END + + +static DRIVER_INIT( slapshot ) +{ + UINT32 offset,i; + UINT8 *gfx = memory_region(REGION_GFX2); + int size=memory_region_length(REGION_GFX2); + int data; + + timekeeper_init( 0, TIMEKEEPER_MK48T08, NULL ); + + offset = size/2; + for (i = size/2+size/4; i<size; i++) + { + int d1,d2,d3,d4; + + /* Expand 2bits into 4bits format */ + data = gfx[i]; + d1 = (data>>0) & 3; + d2 = (data>>2) & 3; + d3 = (data>>4) & 3; + d4 = (data>>6) & 3; + + gfx[offset] = (d1<<2) | (d2<<6); + offset++; + + gfx[offset] = (d3<<2) | (d4<<6); + offset++; + } +} + +GAME( 1994, slapshot, 0, slapshot, slapshot, slapshot, ROT0, "Taito Corporation", "Slap Shot (Japan)", 0 ) +GAME( 1994, opwolf3, 0, opwolf3, opwolf3, slapshot, ROT0, "Taito Corporation Japan", "Operation Wolf 3 (World)", 0 ) +GAME( 1994, opwolf3u, opwolf3, opwolf3, opwolf3, slapshot, ROT0, "Taito America Corporation", "Operation Wolf 3 (US)", 0 ) |