summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/sslam.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/sslam.c')
-rw-r--r--src/mame/drivers/sslam.c973
1 files changed, 973 insertions, 0 deletions
diff --git a/src/mame/drivers/sslam.c b/src/mame/drivers/sslam.c
new file mode 100644
index 00000000000..076679a2aa6
--- /dev/null
+++ b/src/mame/drivers/sslam.c
@@ -0,0 +1,973 @@
+/* Super Slam (c)1993 Playmark */
+
+/*
+
+Still some unknown reads / writes (it writes all over the place ...)
+Inputs / DSW's need finishing / verifying.
+
+The 87C751 MCU for sound has not had its internal program ROM dumped.
+So the sound MCU is simulated here - and therefore not 100% correct.
+
+Update 12/03/2005 - Pierpaolo Prazzoli
+- Fixed sprites
+- Fixed text tilemap colors
+- Fixed text tilemap scrolls
+- Fixed VSync
+- Fixed middle tilemap removing wraparound in the title screen (24/03/2005)
+
+ Sound command 29h is fired when the game is completed successfully. It requires
+ a melody from bank one to be playing, the real MCU doesn't set the bank though.
+ Consequently, the "Game, Set and Match" vocal is not played.
+*/
+
+/*
+
+Here's the info about this dump:
+
+Name: Super Slam
+Manufacturer: PlayMark
+Year: 1993
+Date Dumped: 18-07-2002
+
+CPU: ST TS68000CP12, Signetics 87C751
+SOUND: OKIM6295
+GFX: TI TPC1020AFN-084C
+CRYSTALS: 12MHz, 26MHz
+DIPSW: Two 8-Way
+Country: Italy
+
+About the game:
+
+This is a Tennis game :) You can play with some boys and girls, an old man,
+a small kid and even with a dog! And remember, Winners don't use Drugs ;)
+
+
+
+PCB Layout
+----------
+
+----------------------------------------------------
+| 6295 3 62256 4 |
+| 87C751 62256 |
+| 1MHz 5 |
+| 6116 |
+| 6116 6 |
+| DSW1(8) |
+|J 7 |
+|A TPC1020 |
+|M DSW2(8) 8 |
+|M |
+|A 9 |
+| |
+| 10 |
+| |
+| 11 |
+|12MHz 2018 2018 |
+| 68000P12 62256 |
+| 2 2018 2018 |
+| 62256 |
+| 1 26MHz |
+----------------------------------------------------
+
+Notes:
+ 68k clock: 12MHz
+ VSync: 58Hz
+ HSync: 14.62kHz
+ 87C751 clock: 12MHz (87C751 is 8051 based DIP24 MCU with)
+ (2Kx8 OTP EPROM and 64Kx8 SRAM)
+ (unfortunately, it's protected)
+*/
+
+
+
+#include "driver.h"
+#include "cpu/i8051/i8051.h"
+#include "sound/okim6295.h"
+
+
+#define oki_time_base 0x08
+
+static emu_timer *music_timer;
+
+static int sslam_sound;
+static int sslam_melody;
+static int sslam_bar;
+static int sslam_track;
+static int sslam_snd_bank;
+UINT16 *sslam_bg_tileram, *sslam_tx_tileram, *sslam_md_tileram;
+UINT16 *sslam_spriteram, *sslam_regs;
+
+static UINT8 playmark_oki_control = 0, playmark_oki_command = 0;
+
+
+
+/**************************************************************************
+ This table converts commands sent from the main CPU, into sample numbers
+ played back by the sound processor (the 87C751).
+ Values of 0xff indicate unused commands.
+ Note, that some samples such as 60, 61 and 62 are sequenced to form a
+ music track. Ditto for samples 65, 66, 67 and 68, and also 6A and 6B.
+ The sequencing of the music tracks are handled in the second table below.
+*/
+
+static const UINT8 sslam_snd_cmd[64] =
+{
+/*00*/ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+/*08*/ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x70, 0x71,
+/*10*/ 0x72, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
+/*18*/ 0x15, 0x16, 0x17, 0x18, 0x19, 0x73, 0x74, 0x75,
+/*20*/ 0x76, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x63,
+/*28*/ 0x64, 0x6b, 0xff, 0xff, 0x60, 0x20, 0x6c, 0x65,
+/*30*/ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
+/*38*/ 0x29, 0x2a, 0x2b, 0xff, 0x69, 0xff, 0x20, 0xff
+};
+
+
+/**************************************************************************
+ Music Sequencing:
+ The first column indicates the number of bars (plus 1) in the track to sequence
+ The second column onwards indicates which samples to play in the tracks sequence
+ The first row is always zero to indicate that music has/should stop
+ The second row onwards are the various music tracks
+ The last byte shown in each row (track) is a flag to indicate what to do at the end of the sequence:
+ If the last byte is 0x00, the track should not be repeated
+ If the last byte is 0xff, the track should loop by restarting at the first sample in the second column
+*/
+
+static const UINT8 sslam_snd_loop[8][20] =
+{
+/*NA*/ { 0, 0x00, 0x00 }, /* Not a loop - just a park position */
+/*60*/ { 9, 0x60, 0x60, 0x61, 0x61, 0x60, 0x60, 0x61, 0x62, 0xff },
+/*63*/ { 2, 0x63, 0x00 },
+/*64*/ { 2, 0x64, 0x00 },
+/*65*/ { 20, 0x65, 0x65, 0x66, 0x66, 0x65, 0x65, 0x66, 0x67, 0x67, 0x68, 0x65, 0x65, 0x67, 0x65, 0x66, 0x66, 0x67, 0x68, 0xff },
+/*69*/ { 2, 0x69, 0xff },
+/*6B*/ { 6, 0x6b, 0x6a, 0x6a, 0x6b, 0x6a, 0xff },
+/*6C*/ { 2, 0x6c, 0xff }
+};
+
+
+
+
+/* Sound numbers in the Super Slam sample ROM
+01 "Out"
+02 "Fault"
+03 "Deuce"
+04 "Let"
+05 "Net"
+06 "Let's Play"
+07 "Play"
+08 "Love"
+09 "All"
+0a "15"
+0b "30"
+0c "40"
+0d "Change Court"
+0e "Game"
+0f "0"
+10 "1"
+11 "2"
+12 "3"
+13 "4"
+14 "5"
+15 "6"
+16 "7"
+17 "8"
+18 "9"
+19 "10"
+1a Ball Hit
+1b Ball Hit
+1c Ball Bounce
+1d Swing
+1e Crowd Cheer
+1f Crowd Clap
+20 Horns
+21 Ball Smash
+22 Ball Hit
+23 "Oww!"
+24 "Ooh"
+25 "Set Point"
+26 "Match Point"
+27 Boy "Ouch"
+28 Girl "Ouch"
+29 Synth
+2a Three step rising synth
+2b Ball Hit
+
+60 Melody A1 -------------
+61 Melody A2
+62 Melody A3 Bank 0
+63 Pattern B
+64 Pattern C ------------
+
+65 Melody D1 -------------
+66 Melody D2 Bank 1
+67 Melody D3
+68 Melody D4 -------------
+
+69 Melody E --------------
+6a Melody F1 Bank 2
+6b Melody F2
+6c Melody G --------------
+
+70 "Tie Break" -------------
+71 "Advantage Server"
+72 "Advantage Receiver"
+73 "Game and First Set" Bank 1
+74 "Game and Second Set"
+75 "Game and Third Set"
+76 "Game Set and Match" -------------
+*/
+
+
+
+
+
+/* video/playmark.c */
+WRITE16_HANDLER( bigtwin_paletteram_w );
+
+/* video/sslam.c */
+WRITE16_HANDLER( sslam_tx_tileram_w );
+WRITE16_HANDLER( sslam_md_tileram_w );
+WRITE16_HANDLER( sslam_bg_tileram_w );
+WRITE16_HANDLER( powerbls_bg_tileram_w );
+VIDEO_START(sslam);
+VIDEO_START(powerbls);
+VIDEO_UPDATE(sslam);
+VIDEO_UPDATE(powerbls);
+
+
+
+static TIMER_CALLBACK( music_playback )
+{
+ int pattern = 0;
+
+ if ((OKIM6295_status_0_r(0) & 0x08) == 0)
+ {
+ if (sslam_bar != 0) {
+ sslam_bar += 1;
+ if (sslam_bar >= (sslam_snd_loop[sslam_melody][0] + 1))
+ sslam_bar = 1;
+ }
+ pattern = sslam_snd_loop[sslam_melody][sslam_bar];
+
+ if (pattern == 0xff) { /* Restart track from first bar */
+ sslam_bar = 1;
+ pattern = sslam_snd_loop[sslam_melody][sslam_bar];
+ }
+ if (pattern == 0x00) { /* Non-looped track. Stop playing it */
+ sslam_track = 0;
+ sslam_melody = 0;
+ sslam_bar = 0;
+ timer_enable(music_timer,0);
+ }
+ if (pattern) {
+ logerror("Changing bar in music track to pattern %02x\n",pattern);
+ OKIM6295_data_0_w(0,(0x80 | pattern));
+ OKIM6295_data_0_w(0,0x81);
+ }
+ }
+// {
+// pattern = sslam_snd_loop[sslam_melody][sslam_bar];
+// popmessage("Music track: %02x, Melody: %02x, Pattern: %02x, Bar:%02d",sslam_track,sslam_melody,pattern,sslam_bar);
+// }
+}
+
+
+static void sslam_play(int track, int data)
+{
+ int status = OKIM6295_status_0_r(0);
+
+ if (data < 0x80) {
+ if (track) {
+ if (sslam_track != data) {
+ sslam_track = data;
+ sslam_bar = 1;
+ if (status & 0x08)
+ OKIM6295_data_0_w(0,0x40);
+ OKIM6295_data_0_w(0,(0x80 | data));
+ OKIM6295_data_0_w(0,0x81);
+ timer_adjust(music_timer, ATTOTIME_IN_MSEC(4), 0, ATTOTIME_IN_HZ(250)); /* 250Hz for smooth sequencing */
+ }
+ }
+ else {
+ if ((status & 0x01) == 0) {
+ OKIM6295_data_0_w(0,(0x80 | data));
+ OKIM6295_data_0_w(0,0x11);
+ }
+ else if ((status & 0x02) == 0) {
+ OKIM6295_data_0_w(0,(0x80 | data));
+ OKIM6295_data_0_w(0,0x21);
+ }
+ else if ((status & 0x04) == 0) {
+ OKIM6295_data_0_w(0,(0x80 | data));
+ OKIM6295_data_0_w(0,0x41);
+ }
+ }
+ }
+ else { /* use above 0x80 to turn off channels */
+ if (track) {
+ timer_enable(music_timer,0);
+ sslam_track = 0;
+ sslam_melody = 0;
+ sslam_bar = 0;
+ }
+ data &= 0x7f;
+ OKIM6295_data_0_w(0,data);
+ }
+}
+
+static WRITE16_HANDLER( sslam_snd_w )
+{
+ if (ACCESSING_LSB)
+ {
+ logerror("PC:%06x Writing %04x to Sound CPU\n",activecpu_get_previouspc(),data);
+ if (data >= 0x40) {
+ if (data == 0xfe) {
+ /* This should reset the sound MCU and stop audio playback, but here, it */
+ /* chops the first coin insert. So let's only stop any playing melodies. */
+ sslam_play(1, (0x80 | 0x40)); /* Stop playing the melody */
+ }
+ else {
+ logerror("Unknown command (%02x) sent to the Sound controller\n",data);
+ popmessage("Unknown command (%02x) sent to the Sound controller",data);
+ }
+ }
+ else if (data == 0) {
+ sslam_bar = 0; /* Complete any current bars then stop sequencing */
+ sslam_melody = 0;
+ }
+ else {
+ sslam_sound = sslam_snd_cmd[data];
+
+ if (sslam_sound == 0xff) {
+ popmessage("Unmapped sound command %02x on Bank %02x",data,sslam_snd_bank);
+ }
+ else if (sslam_sound >= 0x70) {
+ /* These vocals are in bank 1, but a bug in the actual MCU doesn't set the bank */
+// if (sslam_snd_bank != 1)
+// OKIM6295_set_bank_base(0, (1 * 0x40000));
+// sslam_snd_bank = 1;
+ sslam_play(0, sslam_sound);
+ }
+ else if (sslam_sound >= 0x69) {
+ if (sslam_snd_bank != 2)
+ OKIM6295_set_bank_base(0, (2 * 0x40000));
+ sslam_snd_bank = 2;
+ switch (sslam_sound)
+ {
+ case 0x69: sslam_melody = 5; break;
+ case 0x6b: sslam_melody = 6; break;
+ case 0x6c: sslam_melody = 7; break;
+ default: sslam_melody = 0; sslam_bar = 0; break; /* Invalid */
+ }
+ sslam_play(sslam_melody, sslam_sound);
+ }
+ else if (sslam_sound >= 0x65) {
+ if (sslam_snd_bank != 1)
+ OKIM6295_set_bank_base(0, (1 * 0x40000));
+ sslam_snd_bank = 1;
+ sslam_melody = 4;
+ sslam_play(sslam_melody, sslam_sound);
+ }
+ else if (sslam_sound >= 0x60) {
+ sslam_snd_bank = 0;
+ OKIM6295_set_bank_base(0, (0 * 0x40000));
+ sslam_snd_bank = 0;
+ switch (sslam_sound)
+ {
+ case 0x60: sslam_melody = 1; break;
+ case 0x63: sslam_melody = 2; break;
+ case 0x64: sslam_melody = 3; break;
+ default: sslam_melody = 0; sslam_bar = 0; break; /* Invalid */
+ }
+ sslam_play(sslam_melody, sslam_sound);
+ }
+ else {
+ sslam_play(0, sslam_sound);
+ }
+ }
+ }
+}
+
+
+
+static WRITE16_HANDLER( powerbls_sound_w )
+{
+ soundlatch_w(0,data & 0xff);
+ cpunum_set_input_line(1,I8051_INT1_LINE,PULSE_LINE);
+}
+
+/* Memory Maps */
+
+/* these will need verifying .. the game writes all over the place ... */
+
+static ADDRESS_MAP_START( sslam_program_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000400, 0x07ffff) AM_RAM
+ AM_RANGE(0x100000, 0x103fff) AM_READWRITE(MRA16_RAM, sslam_bg_tileram_w) AM_BASE(&sslam_bg_tileram)
+ AM_RANGE(0x104000, 0x107fff) AM_READWRITE(MRA16_RAM, sslam_md_tileram_w) AM_BASE(&sslam_md_tileram)
+ AM_RANGE(0x108000, 0x10ffff) AM_READWRITE(MRA16_RAM, sslam_tx_tileram_w) AM_BASE(&sslam_tx_tileram)
+ AM_RANGE(0x110000, 0x11000d) AM_RAM AM_BASE(&sslam_regs)
+ AM_RANGE(0x200000, 0x200001) AM_WRITENOP
+ AM_RANGE(0x280000, 0x280fff) AM_READWRITE(MRA16_RAM, bigtwin_paletteram_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x201000, 0x201fff) AM_RAM AM_BASE(&sslam_spriteram)
+ AM_RANGE(0x304000, 0x304001) AM_WRITENOP
+ AM_RANGE(0x300010, 0x300011) AM_READ_PORT("IN0")
+ AM_RANGE(0x300012, 0x300013) AM_READ_PORT("IN1")
+ AM_RANGE(0x300014, 0x300015) AM_READ_PORT("IN2")
+ AM_RANGE(0x300016, 0x300017) AM_READ_PORT("IN3")
+ AM_RANGE(0x300018, 0x300019) AM_READ_PORT("IN4")
+ AM_RANGE(0x30001a, 0x30001b) AM_READ_PORT("DSW1")
+ AM_RANGE(0x30001c, 0x30001d) AM_READ_PORT("DSW2")
+ AM_RANGE(0x30001e, 0x30001f) AM_WRITE(sslam_snd_w)
+ AM_RANGE(0xf00000, 0xffffff) AM_RAM /* Main RAM */
+
+ AM_RANGE(0x000000, 0xffffff) AM_ROM /* I don't honestly know where the rom is mirrored .. so all unmapped reads / writes go to rom */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( powerbls_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+ AM_RANGE(0x100000, 0x103fff) AM_READWRITE(MRA16_RAM, powerbls_bg_tileram_w) AM_BASE(&sslam_bg_tileram)
+ AM_RANGE(0x104000, 0x107fff) AM_RAM // not used
+ AM_RANGE(0x110000, 0x11000d) AM_RAM AM_BASE(&sslam_regs)
+ AM_RANGE(0x200000, 0x200001) AM_WRITENOP
+ AM_RANGE(0x201000, 0x201fff) AM_RAM AM_BASE(&sslam_spriteram)
+ AM_RANGE(0x280000, 0x2803ff) AM_READWRITE(MRA16_RAM, bigtwin_paletteram_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x300010, 0x300011) AM_READ_PORT("IN0")
+ AM_RANGE(0x300012, 0x300013) AM_READ_PORT("IN1")
+ AM_RANGE(0x300014, 0x300015) AM_READ_PORT("IN2")
+ AM_RANGE(0x30001a, 0x30001b) AM_READ_PORT("DSW1")
+ AM_RANGE(0x30001c, 0x30001d) AM_READ_PORT("DSW2")
+ AM_RANGE(0x30001e, 0x30001f) AM_WRITE(powerbls_sound_w)
+ AM_RANGE(0x304000, 0x304001) AM_WRITENOP
+ AM_RANGE(0xff0000, 0xffffff) AM_RAM /* Main RAM */
+ADDRESS_MAP_END
+
+
+/*
+ Sound MCU mapping
+*/
+
+static READ8_HANDLER( playmark_snd_command_r )
+{
+ UINT8 data = 0;
+
+ if ((playmark_oki_control & 0x38) == 0x30) {
+ data = soundlatch_r(0);
+ }
+ else if ((playmark_oki_control & 0x38) == 0x28) {
+ data = (OKIM6295_status_0_r(0) & 0x0f);
+ }
+
+ return data;
+}
+
+static WRITE8_HANDLER( playmark_oki_w )
+{
+ playmark_oki_command = data;
+}
+
+static WRITE8_HANDLER( playmark_snd_control_w )
+{
+ static int oki_old_bank = -1;
+
+ playmark_oki_control = data;
+
+ if(data & 3)
+ {
+ if(oki_old_bank != (data & 3))
+ {
+ oki_old_bank = data & 3;
+ OKIM6295_set_bank_base(0, 0x40000 * (oki_old_bank - 1));
+ }
+ }
+
+ if ((data & 0x38) == 0x18)
+ {
+ OKIM6295_data_0_w(0, playmark_oki_command);
+ }
+
+// !(data & 0x80) -> sound enable
+// (data & 0x40) -> always set
+}
+
+static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x07ff) AM_ROM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( sound_io_map, ADDRESS_SPACE_IO, 8 )
+ AM_RANGE(0x0001, 0x0001) AM_WRITE(playmark_snd_control_w)
+ AM_RANGE(0x0003, 0x0003) AM_READWRITE(playmark_snd_command_r, playmark_oki_w)
+ADDRESS_MAP_END
+
+/* Input Ports */
+
+static INPUT_PORTS_START( sslam )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ 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("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ 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_START2 )
+
+ PORT_START_TAG("IN3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START3 )
+
+ PORT_START_TAG("IN4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START4 )
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x07, 0x07, "Coin(s) per Player" ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING( 0x07, "1" )
+ PORT_DIPSETTING( 0x06, "2" )
+ PORT_DIPSETTING( 0x05, "3" )
+ PORT_DIPSETTING( 0x04, "4" )
+ PORT_DIPSETTING( 0x03, "5" )
+ PORT_DIPSETTING( 0x02, "6" )
+ PORT_DIPSETTING( 0x01, "7" )
+ PORT_DIPSETTING( 0x00, "8" )
+ PORT_DIPNAME( 0x38, 0x38, "Coin Multiplicator" ) PORT_DIPLOCATION("SW2:4,5,6")
+ PORT_DIPSETTING( 0x38, "*1" )
+ PORT_DIPSETTING( 0x30, "*2" )
+ PORT_DIPSETTING( 0x28, "*3" )
+ PORT_DIPSETTING( 0x20, "*4" )
+ PORT_DIPSETTING( 0x18, "*5" )
+ PORT_DIPSETTING( 0x10, "*6" )
+ PORT_DIPSETTING( 0x08, "*7" )
+ PORT_DIPSETTING( 0x00, "*8" )
+ PORT_DIPNAME( 0x40, 0x40, "On Time Up" ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x00, "End After Point" )
+ PORT_DIPSETTING( 0x40, "End After Game" )
+ PORT_DIPNAME( 0x80, 0x80, "Coin Slots" ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, "Common" )
+ PORT_DIPSETTING( 0x00, "Individual" )
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1,2") // 0x000522 = 0x00400e
+ PORT_DIPSETTING( 0x03, "0" )
+ PORT_DIPSETTING( 0x02, "1" )
+ PORT_DIPSETTING( 0x01, "2" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPNAME( 0x04, 0x04, "Singles Game Time" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING( 0x04, "180 Seconds" )
+ PORT_DIPSETTING( 0x00, "120 Seconds" )
+ PORT_DIPNAME( 0x08, 0x08, "Doubles Game Time" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x08, "180 Seconds" )
+ PORT_DIPSETTING( 0x00, "120 Seconds" )
+ PORT_DIPNAME( 0x30, 0x30, "Starting Score" ) PORT_DIPLOCATION("SW1:5,6")
+ PORT_DIPSETTING( 0x30, "4-4" )
+ PORT_DIPSETTING( 0x20, "3-4" )
+ PORT_DIPSETTING( 0x10, "3-3" )
+ PORT_DIPSETTING( 0x00, "0-0" )
+ PORT_DIPNAME( 0x40, 0x40, "Play Mode" ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x00, "2 Players" )
+ PORT_DIPSETTING( 0x40, "4 Players" )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( powerbls )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ 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_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Easy ) )
+ PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:3,4")
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x04, "2" )
+ PORT_DIPSETTING( 0x08, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Language ) ) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPSETTING( 0x10, DEF_STR( English ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Italian ) )
+ PORT_DIPNAME( 0x20, 0x00, "Weapon" ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 3C_4C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:4,5,6")
+ PORT_DIPSETTING( 0x10, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x28, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_3C ) )
+ PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+/* GFX Decodes */
+
+static const gfx_layout tiles8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,4),
+ 4,
+ { 0, RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+static const gfx_layout tiles16x16_layout =
+{
+ 16,16,
+ RGN_FRAC(1,4),
+ 4,
+ { 0, RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
+ { 0, 1, 2, 3, 4, 5, 6, 7,
+ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
+ 16*16
+};
+
+static GFXDECODE_START( sslam )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, tiles8x8_layout, 0x300, 16 ) /* spr */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles16x16_layout, 0, 16 ) /* bg */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles16x16_layout, 0x100, 16 ) /* mid */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles8x8_layout, 0x200, 16 ) /* tx */
+GFXDECODE_END
+
+static GFXDECODE_START( powerbls )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, tiles8x8_layout, 0x100, 16 ) /* spr */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tiles8x8_layout, 0, 16 ) /* bg */
+GFXDECODE_END
+
+
+/* Machine Driver */
+
+static MACHINE_DRIVER_START( sslam )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz */
+ MDRV_CPU_PROGRAM_MAP(sslam_program_map, 0)
+ MDRV_CPU_VBLANK_INT(irq2_line_hold,1)
+
+ MDRV_CPU_ADD(I8051, 12000000)
+ MDRV_CPU_FLAGS(CPU_DISABLE) /* Internal code is not dumped - 2 boards were protected */
+ MDRV_CPU_PROGRAM_MAP(sound_map,0)
+ MDRV_CPU_IO_MAP(0,0)
+
+ MDRV_SCREEN_REFRESH_RATE(58)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 1*8, 31*8-1)
+ MDRV_GFXDECODE(sslam)
+ MDRV_PALETTE_LENGTH(0x800)
+
+ MDRV_VIDEO_START(sslam)
+ MDRV_VIDEO_UPDATE(sslam)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(OKIM6295, 1000000)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( powerbls )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 12000000) /* 12 MHz */
+ MDRV_CPU_PROGRAM_MAP(powerbls_map, 0)
+ MDRV_CPU_VBLANK_INT(irq2_line_hold,1)
+
+ MDRV_CPU_ADD(I8051, 12000000)
+ MDRV_CPU_PROGRAM_MAP(sound_map,0)
+ MDRV_CPU_IO_MAP(sound_io_map,0)
+
+ MDRV_SCREEN_REFRESH_RATE(58)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
+ MDRV_GFXDECODE(powerbls)
+ MDRV_PALETTE_LENGTH(0x200)
+
+ MDRV_VIDEO_START(powerbls)
+ MDRV_VIDEO_UPDATE(powerbls)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(OKIM6295, 1000000) /* verified on original PCB */
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
+MACHINE_DRIVER_END
+
+/* maybe one dump is bad .. which? -> 2nd set was verified good from 2 pcbs */
+
+ROM_START( sslam )
+ ROM_REGION( 0x1000000, REGION_CPU1, ROMREGION_ERASE00 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "2.u67", 0x00000, 0x80000, CRC(1ce52917) SHA1(b9b1d14ea44c248ce6e615c5c553c0d485c1302b) )
+ ROM_RELOAD ( 0x100000, 0x80000 )
+ ROM_RELOAD ( 0x200000, 0x80000 )
+ ROM_RELOAD ( 0x300000, 0x80000 )
+ ROM_RELOAD ( 0x400000, 0x80000 )
+ ROM_RELOAD ( 0x500000, 0x80000 )
+ ROM_RELOAD ( 0x600000, 0x80000 )
+ ROM_RELOAD ( 0x700000, 0x80000 )
+ ROM_RELOAD ( 0x800000, 0x80000 )
+ ROM_RELOAD ( 0x900000, 0x80000 )
+ ROM_RELOAD ( 0xa00000, 0x80000 )
+ ROM_RELOAD ( 0xb00000, 0x80000 )
+ ROM_RELOAD ( 0xc00000, 0x80000 )
+ ROM_RELOAD ( 0xd00000, 0x80000 )
+ ROM_RELOAD ( 0xe00000, 0x80000 )
+ ROM_RELOAD ( 0xf00000, 0x80000 )
+ ROM_LOAD16_BYTE( "it_22.bin", 0x00001, 0x80000, CRC(51c56828) SHA1(d71d64b0268c156456bed64b4c13b98181fa3e0f) )
+ ROM_RELOAD ( 0x100001, 0x80000 )
+ ROM_RELOAD ( 0x200001, 0x80000 )
+ ROM_RELOAD ( 0x300001, 0x80000 )
+ ROM_RELOAD ( 0x400001, 0x80000 )
+ ROM_RELOAD ( 0x500001, 0x80000 )
+ ROM_RELOAD ( 0x600001, 0x80000 )
+ ROM_RELOAD ( 0x700001, 0x80000 )
+ ROM_RELOAD ( 0x800001, 0x80000 )
+ ROM_RELOAD ( 0x900001, 0x80000 )
+ ROM_RELOAD ( 0xa00001, 0x80000 )
+ ROM_RELOAD ( 0xb00001, 0x80000 )
+ ROM_RELOAD ( 0xc00001, 0x80000 )
+ ROM_RELOAD ( 0xd00001, 0x80000 )
+ ROM_RELOAD ( 0xe00001, 0x80000 )
+ ROM_RELOAD ( 0xf00001, 0x80000 )
+
+ ROM_REGION( 0x0800, REGION_CPU2, 0 )
+ ROM_LOAD( "s87c751.bin", 0x0000, 0x0800, NO_DUMP )
+
+ ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE ) /* Bg */
+ ROM_LOAD( "7.u45", 0x000000, 0x80000, CRC(64ecdde9) SHA1(576ba1169d90970622249e532baa4209bf12de5a) )
+ ROM_LOAD( "6.u39", 0x080000, 0x80000, CRC(6928065c) SHA1(ad5b1889bebf0358df0295d6041b798ac53ac625) )
+ ROM_LOAD( "5.u42", 0x100000, 0x80000, CRC(8d18bdc6) SHA1(cacc4f475f85438a00ead4911730202e995983a7) )
+ ROM_LOAD( "4.u36", 0x180000, 0x80000, CRC(8e15fb9d) SHA1(47917d8aac1bce2e15f36904f5c2534e5b80236b) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */
+ ROM_LOAD( "8.u83", 0x000000, 0x80000, CRC(19bb89dd) SHA1(c2a0c32d350a193d366b5086502998281fd0bec4) )
+ ROM_LOAD( "9.u84", 0x080000, 0x80000, CRC(d50d86c7) SHA1(7ecbcc03851a8174610f7f5ad889e40543da928e) )
+ ROM_LOAD( "10.u85", 0x100000, 0x80000, CRC(681b8ac8) SHA1(ebfeffc091f53af246311574b9c5d83d2716a7be) )
+ ROM_LOAD( "11.u86", 0x180000, 0x80000, CRC(e41f89e3) SHA1(e4b39411a4cea6aa6c01564f74bb8e432d382a73) )
+
+ /* $00000-$20000 stays the same in all sound banks, */
+ /* the second half of the bank is the area that gets switched */
+ ROM_REGION( 0xc0000, REGION_SOUND1, 0 ) /* OKI Samples */
+ ROM_LOAD( "3.u13", 0x00000, 0x40000, CRC(d0a9245f) SHA1(2e840cdd7bdfe7c6f986daf88576de0559597499) )
+ ROM_CONTINUE( 0x60000, 0x20000 )
+ ROM_CONTINUE( 0xa0000, 0x20000 )
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x40000, 0x20000)
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x80000, 0x20000)
+ROM_END
+
+ROM_START( sslama )
+ ROM_REGION( 0x1000000, REGION_CPU1, ROMREGION_ERASE00 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "2.u67", 0x00000, 0x80000, CRC(1ce52917) SHA1(b9b1d14ea44c248ce6e615c5c553c0d485c1302b) )
+ ROM_RELOAD ( 0x100000, 0x80000 )
+ ROM_RELOAD ( 0x200000, 0x80000 )
+ ROM_RELOAD ( 0x300000, 0x80000 )
+ ROM_RELOAD ( 0x400000, 0x80000 )
+ ROM_RELOAD ( 0x500000, 0x80000 )
+ ROM_RELOAD ( 0x600000, 0x80000 )
+ ROM_RELOAD ( 0x700000, 0x80000 )
+ ROM_RELOAD ( 0x800000, 0x80000 )
+ ROM_RELOAD ( 0x900000, 0x80000 )
+ ROM_RELOAD ( 0xa00000, 0x80000 )
+ ROM_RELOAD ( 0xb00000, 0x80000 )
+ ROM_RELOAD ( 0xc00000, 0x80000 )
+ ROM_RELOAD ( 0xd00000, 0x80000 )
+ ROM_RELOAD ( 0xe00000, 0x80000 )
+ ROM_RELOAD ( 0xf00000, 0x80000 )
+ ROM_LOAD16_BYTE( "1.u56", 0x00001, 0x80000, CRC(59bec8ae) SHA1(2d53213a1d335184384b2138d18d496b602dc3fb) )
+ ROM_RELOAD ( 0x100001, 0x80000 )
+ ROM_RELOAD ( 0x200001, 0x80000 )
+ ROM_RELOAD ( 0x300001, 0x80000 )
+ ROM_RELOAD ( 0x400001, 0x80000 )
+ ROM_RELOAD ( 0x500001, 0x80000 )
+ ROM_RELOAD ( 0x600001, 0x80000 )
+ ROM_RELOAD ( 0x700001, 0x80000 )
+ ROM_RELOAD ( 0x800001, 0x80000 )
+ ROM_RELOAD ( 0x900001, 0x80000 )
+ ROM_RELOAD ( 0xa00001, 0x80000 )
+ ROM_RELOAD ( 0xb00001, 0x80000 )
+ ROM_RELOAD ( 0xc00001, 0x80000 )
+ ROM_RELOAD ( 0xd00001, 0x80000 )
+ ROM_RELOAD ( 0xe00001, 0x80000 )
+ ROM_RELOAD ( 0xf00001, 0x80000 )
+
+ ROM_REGION( 0x0800, REGION_CPU2, 0 )
+ ROM_LOAD( "s87c751.bin", 0x0000, 0x0800, NO_DUMP )
+
+ ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE ) /* Bg */
+ ROM_LOAD( "7.u45", 0x000000, 0x80000, CRC(64ecdde9) SHA1(576ba1169d90970622249e532baa4209bf12de5a) )
+ ROM_LOAD( "6.u39", 0x080000, 0x80000, CRC(6928065c) SHA1(ad5b1889bebf0358df0295d6041b798ac53ac625) )
+ ROM_LOAD( "5.u42", 0x100000, 0x80000, CRC(8d18bdc6) SHA1(cacc4f475f85438a00ead4911730202e995983a7) )
+ ROM_LOAD( "4.u36", 0x180000, 0x80000, CRC(8e15fb9d) SHA1(47917d8aac1bce2e15f36904f5c2534e5b80236b) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */
+ ROM_LOAD( "8.u83", 0x000000, 0x80000, CRC(19bb89dd) SHA1(c2a0c32d350a193d366b5086502998281fd0bec4) )
+ ROM_LOAD( "9.u84", 0x080000, 0x80000, CRC(d50d86c7) SHA1(7ecbcc03851a8174610f7f5ad889e40543da928e) )
+ ROM_LOAD( "10.u85", 0x100000, 0x80000, CRC(681b8ac8) SHA1(ebfeffc091f53af246311574b9c5d83d2716a7be) )
+ ROM_LOAD( "11.u86", 0x180000, 0x80000, CRC(e41f89e3) SHA1(e4b39411a4cea6aa6c01564f74bb8e432d382a73) )
+
+ /* $00000-$20000 stays the same in all sound banks, */
+ /* the second half of the bank is the area that gets switched */
+ ROM_REGION( 0xc0000, REGION_SOUND1, 0 ) /* OKI Samples */
+ ROM_LOAD( "3.u13", 0x00000, 0x40000, CRC(d0a9245f) SHA1(2e840cdd7bdfe7c6f986daf88576de0559597499) )
+ ROM_CONTINUE( 0x60000, 0x20000 )
+ ROM_CONTINUE( 0xa0000, 0x20000 )
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x40000, 0x20000)
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x80000, 0x20000)
+ROM_END
+
+// it's a conversion for a sslam pcb
+ROM_START( powerbls )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "21.u67", 0x00000, 0x40000, CRC(4e302381) SHA1(5685d15fd3137866093ff13b95a7df2265a8bc64) )
+ ROM_LOAD16_BYTE( "22.u66", 0x00001, 0x40000, CRC(89b70599) SHA1(57a5d71e4d8ca62fffe2e81116c5236d2194ae11) )
+
+ ROM_REGION( 0x0800, REGION_CPU2, 0 )
+ ROM_LOAD( "s87c751.bin", 0x0000, 0x0800, CRC(5b8b2d3a) SHA1(c3409243dfc0ca959a80f6890c87b4ce9eb0741d) )
+
+ ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE ) /* Bg */
+ ROM_LOAD( "26.u45", 0x000000, 0x80000, CRC(fc9d25c7) SHA1(057702753eddffb9e7bff76311c5e8891343174b) )
+ ROM_LOAD( "25.u39", 0x080000, 0x80000, CRC(f20ea774) SHA1(fd284a5ee2cd9d1b5db53225bdfb31dc5bd3f581) )
+ ROM_LOAD( "24.u42", 0x100000, 0x80000, CRC(e1829809) SHA1(2fdf0b5580609bff0040c909d2e1ff9fae7dcc9c) )
+ ROM_LOAD( "23.u36", 0x180000, 0x80000, CRC(7805275e) SHA1(f0499cf4c84704a6de93a2a1a229af6068ad8771) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */
+ ROM_LOAD( "27.u83", 0x000000, 0x80000, CRC(92d7d40a) SHA1(81879945790feb9aeb45750e9b5ded3356571503) )
+ ROM_LOAD( "28.u84", 0x080000, 0x80000, CRC(90412135) SHA1(499619c72613a1dd63a6504e39b159a18a71f4fa) )
+ ROM_LOAD( "29.u85", 0x100000, 0x80000, CRC(e7bcd2e7) SHA1(01a5e5ac5da2fd79a0c9088f775096b9915bae92) )
+ ROM_LOAD( "30.u86", 0x180000, 0x80000, CRC(4130694c) SHA1(581d0035ce1624568f635bd79290be6c587a2533) )
+
+ /* $00000-$20000 stays the same in all sound banks, */
+ /* the second half of the bank is the area that gets switched */
+ ROM_REGION( 0xc0000, REGION_SOUND1, 0 ) /* OKI Samples */
+ ROM_LOAD( "20.i013", 0x00000, 0x40000, CRC(12776dbc) SHA1(9ab9930fd581296642834d2cb4ba65264a588af3) )
+ ROM_CONTINUE( 0x60000, 0x20000 )
+ ROM_CONTINUE( 0xa0000, 0x20000 )
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x40000, 0x20000)
+ ROM_COPY( REGION_SOUND1, 0x00000, 0x80000, 0x20000)
+ROM_END
+
+static DRIVER_INIT( sslam )
+{
+ sslam_track = 0;
+ sslam_melody = 0;
+ sslam_bar = 0;
+
+ state_save_register_global(sslam_track);
+ state_save_register_global(sslam_melody);
+ state_save_register_global(sslam_bar);
+ state_save_register_global(sslam_snd_bank);
+
+ music_timer = timer_alloc(music_playback);
+}
+
+static DRIVER_INIT( powerbls )
+{
+ state_save_register_global(playmark_oki_control);
+ state_save_register_global(playmark_oki_command);
+}
+
+
+GAME( 1993, sslam, 0, sslam, sslam, sslam, ROT0, "Playmark", "Super Slam (set 1)", GAME_SUPPORTS_SAVE )
+GAME( 1993, sslama, sslam, sslam, sslam, sslam, ROT0, "Playmark", "Super Slam (set 2)", GAME_SUPPORTS_SAVE )
+GAME( 1994, powerbls, powerbal, powerbls, powerbls, powerbls, ROT0, "Playmark", "Power Balls (Super Slam conversion)", GAME_SUPPORTS_SAVE )