summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/system18.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/system18.c')
-rw-r--r--src/mame/drivers/system18.c1582
1 files changed, 1582 insertions, 0 deletions
diff --git a/src/mame/drivers/system18.c b/src/mame/drivers/system18.c
new file mode 100644
index 00000000000..a47c988a75f
--- /dev/null
+++ b/src/mame/drivers/system18.c
@@ -0,0 +1,1582 @@
+/* System18 Hardware
+**
+** MC68000 + Z80
+** 2xYM3438 + Custom PCM
+**
+** Alien Storm
+** Bloxeed
+** Clutch Hitter
+** D.D. Crew
+** Laser Ghost
+** Michael Jackson's Moonwalker
+** Shadow Dancer
+** Search Wally
+*/
+
+/*
+
+Changes:
+04/28/04 Charles MacDonald
+- Added MSM5205 sample playback to shdancbl.
+
+03/17/04
+- Added Where's Wally? (wwally) It's encrypted and unplayable.
+- Moved Ace Attacker to system16.c (it's a not a System 18 game)
+- Fixed System 18 sample ROM banking. This doesn't help the current working games, but will support others when/if they are decrypted.
+- Fixed RF5C68A clock (7.15 MHz -> 8.00 MHz).
+- Fixed Z80 clock (8.192 MHz -> 8.00 MHz).
+- Cleaned up shdancbl sound hardware a little.
+
+03/12/04
+- Added preliminary VDP emulation to fix shdancer tile banking and VDP memory tests in other games.
+- Added I/O chip emulation, fixes blanked screen at end of shdancer memory test, coin meter/lockout implemented.
+- Cleaned up shdancer,shdancrj,shdancbl drivers.
+- Added Shadow Dancer (Rev.B) driver (shdancrb).
+- Added sound emulation to shdancbl.
+
+To do:
+- mwalkbl VDP test says IC68 (315-5313) is bad, but the test code seems to print the 'bad' message always, and it
+ doesn't look like that VDP layer is supposed to cover the text (indicating success).
+- astormbl writes to mirrored sprite RAM at $141000.
+- mwalkbl writes to mirrored palette RAM at $841000.
+
+shdancbl:
+- Sampled sound needs to be implemented.
+- ROM test fails. Maybe the original game code was not patched to fix this, rather than the ROMs really being bad.
+- Supporting the screen blanking control at $E4001D causes some problems after coin-up.
+- Player 1 inputs map to player 2.
+- Misplaced tilemap horizontal scrolling in several locations:
+ Level map screen, bonus stage, train level, sewer level, etc.
+- Bad sprites in some specific cases:
+ - Green shield-throwing man, animation when dog attacks enemy, fade-in when ninjas appear, etc.
+- Missing "Shadow Dancer" logo on title screen if you insert a coin instead of watching the intro sequence.
+
+I very carefully checked the sprite ROMs to make sure they are loaded correctly, and it seems that for the bad
+sprites listed above, one of the even/odd pair is correct while the other is not. The correct data isn't present
+in any of the ROMs I think. Maybe they need to be redumped, or it's an actual problem of the bootleg?
+
+Other notes:
+- The sys18_sound_info structure holds the offset to each ROM in the REGION_CPU2 space as well as a mask to be applied
+ to the 8K bank offset into each ROM. For an unused ROM, the mask should be set to zero.
+
+*/
+
+#include "driver.h"
+#include "cpu/z80/z80.h"
+#include "system16.h"
+#include "cpu/m68000/m68000.h"
+#include "machine/fd1094.h"
+#include "sound/msm5205.h"
+#include "sound/2612intf.h"
+#include "sound/rf5c68.h"
+
+void fd1094_machine_init(void);
+void fd1094_driver_init(void (*set_decrypted)(UINT8 *));
+
+/* video/segac2.c */
+extern void update_system18_vdp( mame_bitmap *bitmap, const rectangle *cliprect );
+extern void start_system18_vdp(void);
+extern READ16_HANDLER( segac2_vdp_r );
+extern WRITE16_HANDLER( segac2_vdp_w );
+
+/***************************************************************************/
+
+
+
+
+static WRITE16_HANDLER( sys18_refreshenable_w )
+{
+ if(ACCESSING_LSB)
+ {
+ sys16_refreshenable = data & 0x02;
+ }
+}
+
+static WRITE16_HANDLER( sys18_tilebank_w )
+{
+ if(ACCESSING_LSB)
+ {
+ sys16_tile_bank0 = (data >> 0) & 0x0F;
+ sys16_tile_bank1 = (data >> 4) & 0x0F;
+ }
+}
+
+/***************************************************************************/
+
+static void set_fg_page( int data ){
+ sys16_fg_page[0] = data>>12;
+ sys16_fg_page[1] = (data>>8)&0xf;
+ sys16_fg_page[2] = (data>>4)&0xf;
+ sys16_fg_page[3] = data&0xf;
+}
+
+static void set_bg_page( int data ){
+ sys16_bg_page[0] = data>>12;
+ sys16_bg_page[1] = (data>>8)&0xf;
+ sys16_bg_page[2] = (data>>4)&0xf;
+ sys16_bg_page[3] = data&0xf;
+}
+
+static void set_fg2_page( int data ){
+ sys16_fg2_page[0] = data>>12;
+ sys16_fg2_page[1] = (data>>8)&0xf;
+ sys16_fg2_page[2] = (data>>4)&0xf;
+ sys16_fg2_page[3] = data&0xf;
+}
+
+static void set_bg2_page( int data ){
+ sys16_bg2_page[0] = data>>12;
+ sys16_bg2_page[1] = (data>>8)&0xf;
+ sys16_bg2_page[2] = (data>>4)&0xf;
+ sys16_bg2_page[3] = data&0xf;
+}
+
+/***************************************************************************/
+/*
+ Sound hardware for Shadow Dancer (Datsu bootleg)
+
+ Z80 memory map
+ 0000-7FFF : ROM (fixed)
+ 8000-BFFF : ROM (banked)
+ C000-C007 : ?
+ C400 : Sound command (r/o)
+ C800 : MSM5205 sample data output (w/o)
+ CC00-CC03 : YM3438 #1
+ D000-D003 : YM3438 #2
+ D400 : ROM bank control (w/o)
+ DF00-DFFF : ?
+ E000-FFFF : Work RAM
+
+ The unused memory locations and I/O port access seem to be remnants of the original code that were not patched out:
+
+ - Program accesses RF5C68A channel registes at $C000-$C007
+ - Program clears RF5C68A wave memory at $DF00-$DFFF
+ - Program writes to port $A0 to access sound ROM banking control latch
+ - Program reads port $C0 to access sound command
+
+ Interrupts
+
+ IRQ = Triggered when 68000 writes sound command. Z80 reads from $C400.
+ NMI = Triggered when second nibble of sample data has been output to the MSM5205.
+ Program copies sample data from ROM bank to the MSM5205 sample data buffer at $C800.
+
+ ROM banking seems correct.
+ It doesn't look like there's a way to reset the MSM5205, unless that's related to bit 7 of the
+ ROM bank control register.
+ MSM5205 clock speed hasn't been confirmed.
+*/
+/***************************************************************************/
+
+static int sample_buffer = 0;
+static int sample_select = 0;
+
+static WRITE8_HANDLER( shdancbl_msm5205_data_w )
+{
+ sample_buffer = data;
+}
+
+static void shdancbl_msm5205_callback(int data)
+{
+ MSM5205_data_w(0, sample_buffer & 0x0F);
+ sample_buffer >>= 4;
+ sample_select ^= 1;
+ if(sample_select == 0)
+ cpunum_set_input_line(1, INPUT_LINE_NMI, PULSE_LINE);
+}
+
+static struct MSM5205interface shdancbl_msm5205_interface =
+{
+ shdancbl_msm5205_callback,
+ MSM5205_S48_4B
+};
+
+UINT8* shdancbl_soundbank_ptr = NULL; /* Pointer to currently selected portion of ROM */
+
+static WRITE16_HANDLER( sound_command_irq_w ){
+ if( ACCESSING_LSB ){
+ soundlatch_w( 0,data&0xff );
+ cpunum_set_input_line( 1, 0, HOLD_LINE );
+ }
+}
+
+static READ8_HANDLER( shdancbl_soundbank_r )
+{
+ if(shdancbl_soundbank_ptr) return shdancbl_soundbank_ptr[offset & 0x3FFF];
+ return 0xFF;
+}
+
+static WRITE8_HANDLER( shdancbl_bankctrl_w )
+{
+ UINT8 *mem = memory_region(REGION_CPU2);
+
+ switch(data)
+ {
+ case 0:
+ shdancbl_soundbank_ptr = &mem[0x18000]; /* IC45 8000-BFFF */
+ break;
+ case 1:
+ shdancbl_soundbank_ptr = &mem[0x1C000]; /* IC45 C000-FFFF */
+ break;
+ case 2:
+ shdancbl_soundbank_ptr = &mem[0x20000]; /* IC46 0000-3FFF */
+ break;
+ case 3:
+ shdancbl_soundbank_ptr = &mem[0x24000]; /* IC46 4000-7FFF */
+ break;
+ default:
+ shdancbl_soundbank_ptr = NULL;
+ logerror("Invalid bank setting %02X (%04X)\n", data, activecpu_get_pc());
+ break;
+ }
+}
+
+static ADDRESS_MAP_START( shdancbl_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0xbfff) AM_READ(shdancbl_soundbank_r)
+ AM_RANGE(0xc400, 0xc400) AM_READ(soundlatch_r)
+ AM_RANGE(0xcc00, 0xcc00) AM_READ(YM3438_status_port_0_A_r)
+ AM_RANGE(0xcc01, 0xcc01) AM_READ(YM3438_status_port_0_B_r)
+ AM_RANGE(0xcc02, 0xcc02) AM_READ(YM3438_status_port_0_B_r)
+ AM_RANGE(0xcc03, 0xcc03) AM_READ(YM3438_status_port_0_B_r)
+ AM_RANGE(0xd000, 0xd000) AM_READ(YM3438_status_port_1_A_r)
+ AM_RANGE(0xd001, 0xd001) AM_READ(YM3438_status_port_1_B_r)
+ AM_RANGE(0xd002, 0xd002) AM_READ(YM3438_status_port_1_B_r)
+ AM_RANGE(0xd003, 0xd003) AM_READ(YM3438_status_port_1_B_r)
+ AM_RANGE(0xdf00, 0xdfff) AM_READ(MRA8_NOP)
+ AM_RANGE(0xe000, 0xffff) AM_READ(MRA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(shdancbl_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0xbfff) AM_WRITE(MWA8_NOP) /* ROM bank */
+ AM_RANGE(0xc000, 0xc00f) AM_WRITE(MWA8_NOP)
+ AM_RANGE(0xc800, 0xc800) AM_WRITE(shdancbl_msm5205_data_w)
+ AM_RANGE(0xcc00, 0xcc00) AM_WRITE(YM3438_control_port_0_A_w)
+ AM_RANGE(0xcc01, 0xcc01) AM_WRITE(YM3438_data_port_0_A_w)
+ AM_RANGE(0xcc02, 0xcc02) AM_WRITE(YM3438_control_port_0_B_w)
+ AM_RANGE(0xcc03, 0xcc03) AM_WRITE(YM3438_data_port_0_B_w)
+ AM_RANGE(0xd000, 0xd000) AM_WRITE(YM3438_control_port_1_A_w)
+ AM_RANGE(0xd001, 0xd001) AM_WRITE(YM3438_data_port_1_A_w)
+ AM_RANGE(0xd002, 0xd002) AM_WRITE(YM3438_control_port_1_B_w)
+ AM_RANGE(0xd003, 0xd003) AM_WRITE(YM3438_data_port_1_B_w)
+ AM_RANGE(0xd400, 0xd400) AM_WRITE(shdancbl_bankctrl_w)
+ AM_RANGE(0xdf00, 0xdfff) AM_WRITE(MWA8_NOP)
+ AM_RANGE(0xe000, 0xffff) AM_WRITE(MWA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( shdancbl_sound_readport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0xc0, 0xdf) AM_READ(MRA8_NOP)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( shdancbl_sound_writeport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0xa0, 0xbf) AM_WRITE(MWA8_NOP)
+ADDRESS_MAP_END
+
+/***************************************************************************/
+
+static UINT8 *sys18_SoundMemBank;
+
+static READ8_HANDLER( system18_bank_r )
+{
+ if(sys18_SoundMemBank)
+ return sys18_SoundMemBank[offset];
+ return 0xFF;
+}
+
+static ADDRESS_MAP_START( sound_readmem_18, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x9fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0xa000, 0xbfff) AM_READ(system18_bank_r)
+ /**** D/A register ****/
+ AM_RANGE(0xd000, 0xdfff) AM_READ(RF5C68_r)
+ AM_RANGE(0xe000, 0xffff) AM_READ(MRA8_RAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( sound_writemem_18, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xbfff) AM_WRITE(MWA8_ROM)
+ /**** D/A register ****/
+ AM_RANGE(0xc000, 0xc008) AM_WRITE(RF5C68_reg_w)
+ AM_RANGE(0xd000, 0xdfff) AM_WRITE(RF5C68_w)
+ AM_RANGE(0xe000, 0xffff) AM_WRITE(MWA8_RAM) //??
+ADDRESS_MAP_END
+
+
+static WRITE8_HANDLER( sys18_soundbank_w )
+{
+ UINT8 *mem = memory_region(REGION_CPU2);
+ int rom = (data >> 6) & 3;
+ int bank = (data & 0x3f);
+ int mask = sys18_sound_info[rom*2+0];
+ int offs = sys18_sound_info[rom*2+1];
+ if(mask) sys18_SoundMemBank = &mem[0x10000 + offs + ((bank & mask) << 13)];
+ else sys18_SoundMemBank = NULL;
+}
+
+
+static ADDRESS_MAP_START( sound_readport_18, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x80, 0x80) AM_READ(YM3438_status_port_0_A_r)
+// AM_RANGE(0x82, 0x82) AM_READ(YM3438_status_port_0_B_r)
+// AM_RANGE(0x90, 0x90) AM_READ(YM3438_status_port_1_A_r)
+// AM_RANGE(0x92, 0x92) AM_READ(YM3438_status_port_1_B_r)
+ AM_RANGE(0xc0, 0xc0) AM_READ(soundlatch_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( sound_writeport_18, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x80, 0x80) AM_WRITE(YM3438_control_port_0_A_w)
+ AM_RANGE(0x81, 0x81) AM_WRITE(YM3438_data_port_0_A_w)
+ AM_RANGE(0x82, 0x82) AM_WRITE(YM3438_control_port_0_B_w)
+ AM_RANGE(0x83, 0x83) AM_WRITE(YM3438_data_port_0_B_w)
+ AM_RANGE(0x90, 0x90) AM_WRITE(YM3438_control_port_1_A_w)
+ AM_RANGE(0x91, 0x91) AM_WRITE(YM3438_data_port_1_A_w)
+ AM_RANGE(0x92, 0x92) AM_WRITE(YM3438_control_port_1_B_w)
+ AM_RANGE(0x93, 0x93) AM_WRITE(YM3438_data_port_1_B_w)
+ AM_RANGE(0xa0, 0xa0) AM_WRITE(sys18_soundbank_w)
+ADDRESS_MAP_END
+
+static WRITE16_HANDLER( sound_command_nmi_w ){
+ if( ACCESSING_LSB ){
+ soundlatch_w( 0,data&0xff );
+ cpunum_set_input_line(1, INPUT_LINE_NMI, PULSE_LINE);
+ }
+}
+
+/***************************************************************************/
+
+/*
+ 315-5313 Video Display Processor (VDP) emulation
+*/
+
+static struct {
+ UINT16 vram[0x8000], read_buffer;
+ UINT16 cram[0x40];
+ UINT16 vsram[0x40];
+ UINT8 reg[0x20];
+ int pending, code, addr, addr_latch;
+} vdp;
+
+static WRITE16_HANDLER( vdp_w )
+{
+ switch(offset)
+ {
+ case 0: /* Data port */
+ case 1: /* Data port */
+ vdp.pending = 0;
+ switch(vdp.code & 0x0F)
+ {
+ case 1: /* VRAM */
+ vdp.vram[(vdp.addr >> 1) & 0x7FFF] = data;
+ break;
+ case 3: /* CRAM */
+ vdp.cram[(vdp.addr >> 1) & 0x3F] = data;
+ break;
+ case 5: /* VSRAM */
+ vdp.vsram[(vdp.addr >> 1) & 0x3F] = data;
+ break;
+ }
+ vdp.addr = (vdp.addr + vdp.reg[0x0F]) & 0xFFFF;
+ break;
+
+ case 2: /* Control port */
+ case 3: /* Control port */
+ if(vdp.pending == 0)
+ {
+ if((data & 0xC000) == 0x8000)
+ {
+ int d = (data >> 0) & 0xFF;
+ int r = (data >> 8) & 0x1F;
+ vdp.reg[r] = d;
+ }
+ else
+ {
+ vdp.pending = 1;
+ vdp.code = (vdp.code & 0x3C) | ((data >> 14) & 3);
+ vdp.addr = (vdp.addr_latch & 0xC000) | (data & 0x3FFF);
+ }
+ }
+ else
+ {
+ vdp.pending = 0;
+ vdp.code = (vdp.code & 0x03) | ((data >> 2) & 0x3C);
+ vdp.addr = (vdp.addr & 0x3FFF) | ((data & 3) << 14);
+ vdp.addr_latch = vdp.addr & 0xC000;
+
+ // Read-ahead for VRAM
+ if(vdp.code == 0)
+ {
+ vdp.read_buffer = vdp.vram[(vdp.addr >> 1) & 0x7FFF];
+ vdp.addr = (vdp.addr + vdp.reg[0x0F]) & 0xFFFF;
+ }
+
+ // Check for DMA request
+ if((vdp.reg[1] & 0x20) && (vdp.code & 0x20))
+ {
+ logerror("vdp: DMA disabled in this system.\n");
+ }
+ }
+ break;
+
+ default: /* Unused */
+ logerror("vdp: write %04X to %08X\n", data, offset);
+ break;
+ }
+}
+
+static READ16_HANDLER( vdp_r )
+{
+ UINT16 temp = -1;
+
+ vdp.pending = 0;
+
+ switch(offset)
+ {
+ case 0: /* Data port */
+ case 1: /* Data port */
+ switch(vdp.code & 0x0F)
+ {
+ case 0: /* VRAM */
+ temp = vdp.read_buffer;
+ vdp.read_buffer = vdp.vram[(vdp.addr >> 1) & 0x7FFF];
+ break;
+
+ case 4: /* VSRAM */
+ temp = vdp.vsram[(vdp.addr >> 1) & 0x3F];
+ break;
+
+ case 8: /* CRAM */
+ temp = vdp.cram[(vdp.addr >> 1) & 0x3F];
+ break;
+ }
+ vdp.addr = (vdp.addr + vdp.reg[0x0F]) & 0xFFFF;
+ break;
+
+ case 2: /* Control port */
+ case 3: /* Control port */
+
+ /* VRAM write FIFO is always empty */
+ temp = 0x0200;
+
+ /* Having screen turned off forces V-Blank flag to be set */
+ if((vdp.reg[1] & 0x40) == 0)
+ temp |= 0x80;
+
+ break;
+ }
+
+ return temp;
+}
+
+/***************************************************************************/
+
+/*
+ 315-5296 I/O chip emulation
+*/
+
+static int io_reg[0x10];
+
+static READ16_HANDLER( sys18_io_r )
+{
+ if(ACCESSING_LSB)
+ {
+ switch(offset & 0x3000/2)
+ {
+ case 0x0000/2: /* I/O chip internal locations */
+ case 0x1000/2: /* I/O chip internal locations (mirror) */
+ switch(offset & 0x1F)
+ {
+ case 0x00: /* Port A - 1P controls */
+ if(io_reg[0x0F] & 0x01)
+ return io_reg[0x00];
+ else
+ return readinputport(0);
+ break;
+
+ case 0x01: /* Port B - 2P controls */
+ if(io_reg[0x0F] & 0x02)
+ return io_reg[0x01];
+ else
+ return readinputport(1);
+ break;
+
+ case 0x02: /* Port C - Bidirectional I/O port */
+ if(io_reg[0x0F] & 0x04)
+ return io_reg[0x02];
+ else
+ return -1;
+ break;
+
+ case 0x03: /* Port D - Miscellaneous outputs */
+ if(io_reg[0x0F] & 0x08)
+ return io_reg[0x03];
+ else
+ return -1;
+ break;
+
+ case 0x04: /* Port E - Service / Coin inputs */
+ if(io_reg[0x0F] & 0x10)
+ return io_reg[0x04];
+ else
+ return readinputport(2);
+ break;
+
+ case 0x05: /* Port F - DIP switch #1 */
+ if(io_reg[0x0F] & 0x20)
+ return io_reg[0x05];
+ else
+ return readinputport(3);
+ break;
+
+ case 0x06: /* Port G - DIP switch #2 */
+ if(io_reg[0x0F] & 0x40)
+ return io_reg[0x06];
+ else
+ return readinputport(4);
+ break;
+
+ case 0x07: /* Port H - Tile banking control */
+ if(io_reg[0x0F] & 0x80)
+ return io_reg[0x07];
+ else
+ return -1;
+ break;
+
+ case 0x08: /* Protection #1 */
+ return 'S';
+ case 0x09: /* Protection #2 */
+ return 'E';
+ case 0x0A: /* Protection #3 */
+ return 'G';
+ case 0x0B: /* Protection #4 */
+ return 'A';
+
+ case 0x0C: /* CNT2-0 pin output control (mirror) */
+ case 0x0E: /* CNT2-0 pin output control */
+ return io_reg[0x0E];
+
+ case 0x0D: /* Port direction control (mirror) */
+ case 0x0F: /* Port direction control */
+ return io_reg[0x0F];
+ }
+ return -1;
+
+ case 0x2000/2: /* Unused */
+ logerror("read video control latch %06X (%06X)\n", offset, activecpu_get_pc());
+ return -1;
+
+ case 0x3000/2: /* Expansion connector */
+ logerror("read expansion area %06X (%06X)\n", offset, activecpu_get_pc());
+ return -1;
+ }
+ }
+
+ return -1;
+}
+
+static WRITE16_HANDLER( sys18_io_w )
+{
+ if(ACCESSING_LSB)
+ {
+ switch(offset & 0x3000/2)
+ {
+ case 0x0000/2: /* I/O chip internal locations */
+ case 0x1000/2: /* I/O chip internal locations (mirror) */
+ switch(offset & 0x1F)
+ {
+ case 0x00: /* Port A - 1P controls */
+ io_reg[0x00] = data;
+ break;
+
+ case 0x01: /* Port B - 2P controls */
+ io_reg[0x01] = data;
+ break;
+
+ case 0x02: /* Port C - Bidirectional I/O port */
+ io_reg[0x02] = data;
+ break;
+
+ case 0x03: /* Port D - Miscellaneous outputs */
+ io_reg[0x03] = data;
+ coin_lockout_w(1, data & 8);
+ coin_lockout_w(0, data & 4);
+ coin_counter_w(1, data & 2);
+ coin_counter_w(0, data & 1);
+ break;
+
+ case 0x04: /* Port E - Service / Coin inputs */
+ io_reg[0x04] = data;
+ break;
+
+ case 0x05: /* Port F - DIP switch #1 */
+ io_reg[0x05] = data;
+ break;
+
+ case 0x06: /* Port G - DIP switch #2 */
+ io_reg[0x06] = data;
+ break;
+
+ case 0x07: /* Port H - Tile banking control */
+ io_reg[0x07] = data;
+ sys16_tile_bank0 = (data >> 0) & 0x0F;
+ sys16_tile_bank1 = (data >> 4) & 0x0F;
+ break;
+
+ case 0x0E: /* CNT2-0 pin output control */
+ io_reg[0x0E] = data;
+ sys16_refreshenable = data & 0x02;
+ break;
+
+ case 0x0F: /* Port direction control */
+ io_reg[0x0F] = data;
+ break;
+ }
+ break;
+
+ case 0x2000/2: /* Video control latch */
+ logerror("write video control latch %06X = %04X (%06X)\n", offset, data, activecpu_get_pc());
+ break;
+
+ case 0x3000/2: /* Expansion connector */
+// logerror("write expansion area %06X = %04X (%06X)\n", offset, data, activecpu_get_pc());
+ break;
+ }
+ }
+}
+
+
+
+/***************************************************************************/
+
+
+
+
+
+/***************************************************************************/
+/*
+ Shadow Dancer (Bootleg)
+
+ This seems to be a modified version of shdancer. It has no warning screen, displays English text during the
+ attract sequence, and has a 2P input test. The 'Sega' copyright text was changed to 'Datsu', and their
+ logo is missing.
+
+ Access to the configuration registers, I/O chip, and VDP are done even though it's likely none of this hardware
+ exists in the bootleg. For example:
+
+ - Most I/O port access has been redirected to new addresses.
+ - Z80 sound command has been redirected to a new address.
+ - The tilebank routine which saves the bank value in VDP VRAM has a form of protection has been modified to store
+ the tilebank value directly to $E4001F.
+ - Implementing screen blanking control via $E4001D leaves the screen blanked at the wrong times (after coin-up).
+
+ This is probably due to unmodified parts of the original code accessing these components, which would be ignored
+ on the bootleg hardware. Both the I/O chip and VDP are supported in this driver, just as I don't know for certain
+ how much of either are present on the real board.
+
+ Bootleg specific addresses:
+
+ C40001 = DIP switch #1
+ C40003 = DIP switch #2
+ C40007 = Z80 sound command
+ C41001 = Service input
+ C41003 = Player 1 input
+ C41005 = Player 2 input
+ C44000 = Has 'clr.w' done after setting tile bank in $E4000F.
+ C460xx = Extra video hardware controls
+
+ Here are the I/O chip addresses accessed:
+
+ E40001 = Player 1
+ E40007 = Miscellaneous outputs (coin control, etc.)
+ E4000F = Tile bank
+ E4001D = CNT2-0 pin output state
+ E4001F = I/O chip port direction
+*/
+/***************************************************************************/
+
+static ADDRESS_MAP_START( shdancbl_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x400000, 0x40ffff) AM_READ(SYS16_MRA16_TILERAM)
+ AM_RANGE(0x410000, 0x410fff) AM_READ(SYS16_MRA16_TEXTRAM)
+ AM_RANGE(0x440000, 0x4407ff) AM_READ(SYS16_MRA16_SPRITERAM)
+ AM_RANGE(0x840000, 0x840fff) AM_READ(SYS16_MRA16_PALETTERAM)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_READ(vdp_r)
+ AM_RANGE(0xe40000, 0xe4ffff) AM_READ(sys18_io_r)
+ AM_RANGE(0xc40000, 0xc40001) AM_READ(input_port_3_word_r) // dip1
+ AM_RANGE(0xc40002, 0xc40003) AM_READ(input_port_4_word_r) // dip2
+ AM_RANGE(0xc41002, 0xc41003) AM_READ(input_port_0_word_r) // player1
+ AM_RANGE(0xc41004, 0xc41005) AM_READ(input_port_1_word_r) // player2
+ AM_RANGE(0xc41000, 0xc41001) AM_READ(input_port_2_word_r) // service
+ AM_RANGE(0xffc000, 0xffffff) AM_READ(SYS16_MRA16_WORKINGRAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( shdancbl_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x400000, 0x40ffff) AM_WRITE(SYS16_MWA16_TILERAM) AM_BASE(&sys16_tileram)
+ AM_RANGE(0x410000, 0x410fff) AM_WRITE(SYS16_MWA16_TEXTRAM) AM_BASE(&sys16_textram)
+ AM_RANGE(0x440000, 0x440fff) AM_WRITE(SYS16_MWA16_SPRITERAM) AM_BASE(&sys16_spriteram)
+ AM_RANGE(0x840000, 0x840fff) AM_WRITE(SYS16_MWA16_PALETTERAM) AM_BASE(&paletteram16)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_WRITE(vdp_w)
+ AM_RANGE(0xe4001c, 0xe4001d) AM_WRITE(MWA16_NOP) // to prevent access to screen blanking control below
+ AM_RANGE(0xe40000, 0xe4ffff) AM_WRITE(sys18_io_w)
+ AM_RANGE(0xc40006, 0xc40007) AM_WRITE(sound_command_irq_w)
+ AM_RANGE(0xc44000, 0xc44001) AM_WRITE(MWA16_NOP) // only used via clr.w after tilebank set
+ AM_RANGE(0xc46000, 0xc46fff) AM_WRITE(MWA16_NOP) // bootleg specific video hardware
+ AM_RANGE(0xfe0020, 0xfe003f) AM_WRITE(MWA16_NOP) // config regs
+ AM_RANGE(0xffc000, 0xffffff) AM_WRITE(SYS16_MWA16_WORKINGRAM) AM_BASE(&sys16_workingram)
+ADDRESS_MAP_END
+
+/***************************************************************************/
+
+static void shdancbl_update_proc( void )
+{
+ sys16_fg_scrollx = sys16_textram[0x0e98/2];
+ sys16_bg_scrollx = sys16_textram[0x0e9a/2];
+ sys16_fg_scrolly = sys16_textram[0x0e90/2];
+ sys16_bg_scrolly = sys16_textram[0x0e92/2];
+
+ set_fg_page( sys16_textram[0x0e80/2] );
+ set_bg_page( sys16_textram[0x0e82/2] );
+
+ sys16_fg2_scrollx = sys16_textram[0x0e9c/2];
+ sys16_bg2_scrollx = sys16_textram[0x0e9e/2];
+ sys16_fg2_scrolly = sys16_textram[0x0e94/2];
+ sys16_bg2_scrolly = sys16_textram[0x0e96/2];
+
+ set_fg2_page( sys16_textram[0x0e84/2] );
+ set_bg2_page( sys16_textram[0x0e82/2] );
+
+ sys18_bg2_active=0;
+ sys18_fg2_active=0;
+
+ if(sys16_fg2_scrollx | sys16_fg2_scrolly | sys16_textram[0x0e84/2])
+ sys18_fg2_active=1;
+ if(sys16_bg2_scrollx | sys16_bg2_scrolly | sys16_textram[0x0e86/2])
+ sys18_bg2_active=1;
+}
+
+static MACHINE_RESET( shdancbl )
+{
+ sys16_sprxoffset = -0xbc+0x77;
+ sys16_update_proc = shdancbl_update_proc;
+}
+
+static READ16_HANDLER( shdancbl_skip_r ){
+ if (activecpu_get_pc()==0x2f76) {cpu_spinuntil_int(); return 0xffff;}
+ return sys16_workingram[0];
+}
+
+static DRIVER_INIT( shdancbl )
+{
+ int i;
+ UINT8 *mem;
+
+ /* Invert tile ROM data*/
+ mem = memory_region(REGION_GFX1);
+ for(i = 0; i < 0xc0000; i++)
+ mem[i] ^= 0xFF;
+
+ machine_reset_sys16_onetime(machine);
+ memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0xffc000, 0xffc001, 0, 0, shdancbl_skip_r );
+
+ sys18_splittab_fg_x=&sys16_textram[0x0f80/2];
+ sys18_splittab_bg_x=&sys16_textram[0x0fc0/2];
+ sys16_MaxShadowColors=0;
+
+ /* Copy first 32K of IC45 to Z80 address space */
+ mem = memory_region(REGION_CPU2);
+ memcpy(mem, mem+0x10000, 0x8000);
+}
+
+/***************************************************************************/
+/*
+ Moonwalker (Bootleg)
+*/
+/***************************************************************************/
+
+static READ16_HANDLER( mwalkbl_skip_r ){
+ if (activecpu_get_pc()==0x308a) {cpu_spinuntil_int(); return 0xffff;}
+ return sys16_workingram[0x202c/2];
+}
+
+
+static ADDRESS_MAP_START( mwalkbl_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x400000, 0x40ffff) AM_READ(SYS16_MRA16_TILERAM)
+ AM_RANGE(0x410000, 0x410fff) AM_READ(SYS16_MRA16_TEXTRAM)
+ AM_RANGE(0x440000, 0x440fff) AM_READ(SYS16_MRA16_SPRITERAM)
+ AM_RANGE(0x840000, 0x840fff) AM_READ(SYS16_MRA16_PALETTERAM)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_READ(vdp_r)
+ AM_RANGE(0xc40000, 0xc40001) AM_READ(input_port_3_word_r) // dip1
+ AM_RANGE(0xc40002, 0xc40003) AM_READ(input_port_4_word_r) // dip2
+ AM_RANGE(0xc41002, 0xc41003) AM_READ(input_port_0_word_r) // player1
+ AM_RANGE(0xc41004, 0xc41005) AM_READ(input_port_1_word_r) // player2
+ AM_RANGE(0xc41006, 0xc41007) AM_READ(input_port_5_word_r) // player3
+ AM_RANGE(0xc41008, 0xc41009) AM_READ(MRA16_NOP) // figure this out, extra input for 3p?
+ AM_RANGE(0xc41000, 0xc41001) AM_READ(input_port_2_word_r) // service
+ AM_RANGE(0xe40000, 0xe4ffff) AM_READ(SYS16_MRA16_EXTRAM2)
+ AM_RANGE(0xffe02c, 0xffe02d) AM_READ(mwalkbl_skip_r)
+ AM_RANGE(0xffc000, 0xffffff) AM_READ(SYS16_MRA16_WORKINGRAM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( mwalkbl_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x400000, 0x40ffff) AM_WRITE(SYS16_MWA16_TILERAM) AM_BASE(&sys16_tileram)
+ AM_RANGE(0x410000, 0x410fff) AM_WRITE(SYS16_MWA16_TEXTRAM) AM_BASE(&sys16_textram)
+ AM_RANGE(0x440000, 0x440fff) AM_WRITE(SYS16_MWA16_SPRITERAM) AM_BASE(&sys16_spriteram)
+ AM_RANGE(0x840000, 0x840fff) AM_WRITE(SYS16_MWA16_PALETTERAM) AM_BASE(&paletteram16)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_WRITE(vdp_w)
+ AM_RANGE(0xc40006, 0xc40007) AM_WRITE(sound_command_nmi_w)
+ AM_RANGE(0xc46600, 0xc46601) AM_WRITE(sys18_refreshenable_w)
+ AM_RANGE(0xc46800, 0xc46801) AM_WRITE(sys18_tilebank_w)
+ AM_RANGE(0xe40000, 0xe4ffff) AM_WRITE(SYS16_MWA16_EXTRAM2) AM_BASE(&sys16_extraram2)
+ AM_RANGE(0xfe0020, 0xfe003f) AM_WRITE(MWA16_NOP) // config regs
+ AM_RANGE(0xffc000, 0xffffff) AM_WRITE(SYS16_MWA16_WORKINGRAM) AM_BASE(&sys16_workingram)
+ADDRESS_MAP_END
+
+/***************************************************************************/
+
+static void mwalkbl_update_proc( void ){
+ sys16_fg_scrollx = sys16_textram[0x0e98/2];
+ sys16_bg_scrollx = sys16_textram[0x0e9a/2];
+ sys16_fg_scrolly = sys16_textram[0x0e90/2];
+ sys16_bg_scrolly = sys16_textram[0x0e92/2];
+
+ set_fg_page( sys16_textram[0x0e80/2] );
+ set_bg_page( sys16_textram[0x0e82/2] );
+
+ sys16_fg2_scrollx = sys16_textram[0x0e9c/2];
+ sys16_bg2_scrollx = sys16_textram[0x0e9e/2];
+ sys16_fg2_scrolly = sys16_textram[0x0e94/2];
+ sys16_bg2_scrolly = sys16_textram[0x0e96/2];
+
+ set_fg2_page( sys16_textram[0x0e84/2] );
+ set_bg2_page( sys16_textram[0x0e86/2] );
+
+ if(sys16_fg2_scrollx | sys16_fg2_scrolly | sys16_textram[0x0e84/2])
+ sys18_fg2_active=1;
+ else
+ sys18_fg2_active=0;
+ if(sys16_bg2_scrollx | sys16_bg2_scrolly | sys16_textram[0x0e86/2])
+ sys18_bg2_active=1;
+ else
+ sys18_bg2_active=0;
+}
+
+static MACHINE_RESET( mwalkbl ){
+ sys16_bg_priority_value=0x1000;
+ sys16_sprxoffset = -0x238;
+
+ sys16_patch_code( 0x70116, 0x4e);
+ sys16_patch_code( 0x70117, 0x71);
+
+ sys16_patch_code( 0x314a, 0x46);
+ sys16_patch_code( 0x314b, 0x42);
+
+ sys16_patch_code( 0x311b, 0x3f);
+
+ sys16_patch_code( 0x70103, 0x00);
+ sys16_patch_code( 0x70109, 0x00);
+ sys16_patch_code( 0x07727, 0x00);
+ sys16_patch_code( 0x07729, 0x00);
+ sys16_patch_code( 0x0780d, 0x00);
+ sys16_patch_code( 0x0780f, 0x00);
+ sys16_patch_code( 0x07861, 0x00);
+ sys16_patch_code( 0x07863, 0x00);
+ sys16_patch_code( 0x07d47, 0x00);
+ sys16_patch_code( 0x07863, 0x00);
+ sys16_patch_code( 0x08533, 0x00);
+ sys16_patch_code( 0x08535, 0x00);
+ sys16_patch_code( 0x085bd, 0x00);
+ sys16_patch_code( 0x085bf, 0x00);
+ sys16_patch_code( 0x09a4b, 0x00);
+ sys16_patch_code( 0x09a4d, 0x00);
+ sys16_patch_code( 0x09b2f, 0x00);
+ sys16_patch_code( 0x09b31, 0x00);
+ sys16_patch_code( 0x0a05b, 0x00);
+ sys16_patch_code( 0x0a05d, 0x00);
+ sys16_patch_code( 0x0a23f, 0x00);
+ sys16_patch_code( 0x0a241, 0x00);
+ sys16_patch_code( 0x10159, 0x00);
+ sys16_patch_code( 0x1015b, 0x00);
+ sys16_patch_code( 0x109fb, 0x00);
+ sys16_patch_code( 0x109fd, 0x00);
+
+ // * SEGA mark
+ sys16_patch_code( 0x70212, 0x4e);
+ sys16_patch_code( 0x70213, 0x71);
+
+ sys16_update_proc = mwalkbl_update_proc;
+}
+
+static DRIVER_INIT( mwalkbl ){
+ UINT8 *RAM= memory_region(REGION_CPU2);
+ static const int mwalk_sound_info[] =
+ {
+ 0x0f, 0x00000, // ROM #1 = 128K
+ 0x1f, 0x20000, // ROM #2 = 256K
+ 0x1f, 0x60000, // ROM #3 = 256K
+ 0x1f, 0xA0000 // ROM #4 = 256K
+ };
+
+ machine_reset_sys16_onetime(machine);
+ sys18_splittab_fg_x=&sys16_textram[0x0f80/2];
+ sys18_splittab_bg_x=&sys16_textram[0x0fc0/2];
+
+ memcpy(sys18_sound_info, mwalk_sound_info, sizeof(sys18_sound_info));
+ memcpy(RAM,&RAM[0x10000],0xa000);
+}
+
+/***************************************************************************/
+
+
+
+/* bootleg doesn't have real vdp or i/o */
+
+static ADDRESS_MAP_START( astormbl_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x10ffff) AM_READ(SYS16_MRA16_TILERAM)
+ AM_RANGE(0x110000, 0x110fff) AM_READ(SYS16_MRA16_TEXTRAM)
+ AM_RANGE(0x140000, 0x140fff) AM_READ(SYS16_MRA16_PALETTERAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(SYS16_MRA16_SPRITERAM)
+ AM_RANGE(0xa00000, 0xa00001) AM_READ(input_port_3_word_r) // dip1
+ AM_RANGE(0xa00002, 0xa00003) AM_READ(input_port_4_word_r) // dip2
+ AM_RANGE(0xa01002, 0xa01003) AM_READ(input_port_0_word_r) // player1
+ AM_RANGE(0xa01004, 0xa01005) AM_READ(input_port_1_word_r) // player2
+ AM_RANGE(0xa01006, 0xa01007) AM_READ(input_port_5_word_r) // player3
+ AM_RANGE(0xa01000, 0xa01001) AM_READ(input_port_2_word_r) // service
+ AM_RANGE(0xc00000, 0xc0ffff) AM_READ(vdp_r)
+ AM_RANGE(0xffc000, 0xffffff) AM_READ(SYS16_MRA16_WORKINGRAM)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( astormbl_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x100000, 0x10ffff) AM_WRITE(SYS16_MWA16_TILERAM) AM_BASE(&sys16_tileram)
+ AM_RANGE(0x110000, 0x110fff) AM_WRITE(SYS16_MWA16_TEXTRAM) AM_BASE(&sys16_textram)
+ AM_RANGE(0x140000, 0x140fff) AM_WRITE(SYS16_MWA16_PALETTERAM) AM_BASE(&paletteram16)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(SYS16_MWA16_SPRITERAM) AM_BASE(&sys16_spriteram)
+ AM_RANGE(0xa00006, 0xa00007) AM_WRITE(sound_command_nmi_w)
+ AM_RANGE(0xa0000e, 0xa0000f) AM_WRITE(sys18_tilebank_w)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_WRITE(vdp_w)
+ AM_RANGE(0xc46600, 0xc46601) AM_WRITE(sys18_refreshenable_w)
+ AM_RANGE(0xfe0020, 0xfe003f) AM_WRITE(MWA16_NOP)
+ AM_RANGE(0xffc000, 0xffffff) AM_WRITE(SYS16_MWA16_WORKINGRAM) AM_BASE(&sys16_workingram)
+ADDRESS_MAP_END
+
+
+
+
+
+/***************************************************************************/
+
+
+
+static void astormbl_update_proc( void ){
+ UINT16 data;
+ sys16_fg_scrollx = sys16_textram[0x0e98/2];
+ sys16_bg_scrollx = sys16_textram[0x0e9a/2];
+ sys16_fg_scrolly = sys16_textram[0x0e90/2];
+ sys16_bg_scrolly = sys16_textram[0x0e92/2];
+
+ data = sys16_textram[0x0e80/2];
+ sys16_fg_page[1] = data>>12;
+ sys16_fg_page[3] = (data>>8)&0xf;
+ sys16_fg_page[0] = (data>>4)&0xf;
+ sys16_fg_page[2] = data&0xf;
+
+ data = sys16_textram[0x0e82/2];
+ sys16_bg_page[1] = data>>12;
+ sys16_bg_page[3] = (data>>8)&0xf;
+ sys16_bg_page[0] = (data>>4)&0xf;
+ sys16_bg_page[2] = data&0xf;
+
+ sys16_fg2_scrollx = sys16_textram[0x0e9c/2];
+ sys16_bg2_scrollx = sys16_textram[0x0e9e/2];
+ sys16_fg2_scrolly = sys16_textram[0x0e94/2];
+ sys16_bg2_scrolly = sys16_textram[0x0e96/2];
+
+ data = sys16_textram[0x0e84/2];
+ sys16_fg2_page[1] = data>>12;
+ sys16_fg2_page[3] = (data>>8)&0xf;
+ sys16_fg2_page[0] = (data>>4)&0xf;
+ sys16_fg2_page[2] = data&0xf;
+
+ data = sys16_textram[0x0e86/2];
+ sys16_bg2_page[1] = data>>12;
+ sys16_bg2_page[3] = (data>>8)&0xf;
+ sys16_bg2_page[0] = (data>>4)&0xf;
+ sys16_bg2_page[2] = data&0xf;
+
+// enable regs
+ if(sys16_fg2_scrollx | sys16_fg2_scrolly | sys16_textram[0x0e84/2])
+ sys18_fg2_active=1;
+ else
+ sys18_fg2_active=0;
+ if(sys16_bg2_scrollx | sys16_bg2_scrolly | sys16_textram[0x0e86/2])
+ sys18_bg2_active=1;
+ else
+ sys18_bg2_active=0;
+}
+
+static MACHINE_RESET( astormbl ){
+ sys16_fgxoffset = sys16_bgxoffset = -9;
+
+ sys16_patch_code( 0x2D6E, 0x32 );
+ sys16_patch_code( 0x2D6F, 0x3c );
+ sys16_patch_code( 0x2D70, 0x80 );
+ sys16_patch_code( 0x2D71, 0x00 );
+ sys16_patch_code( 0x2D72, 0x33 );
+ sys16_patch_code( 0x2D73, 0xc1 );
+ sys16_patch_code( 0x2ea2, 0x30 );
+ sys16_patch_code( 0x2ea3, 0x38 );
+ sys16_patch_code( 0x2ea4, 0xec );
+ sys16_patch_code( 0x2ea5, 0xf6 );
+ sys16_patch_code( 0x2ea6, 0x30 );
+ sys16_patch_code( 0x2ea7, 0x80 );
+ sys16_patch_code( 0x2e5c, 0x30 );
+ sys16_patch_code( 0x2e5d, 0x38 );
+ sys16_patch_code( 0x2e5e, 0xec );
+ sys16_patch_code( 0x2e5f, 0xe2 );
+ sys16_patch_code( 0x2e60, 0xc0 );
+ sys16_patch_code( 0x2e61, 0x7c );
+
+ sys16_patch_code( 0x4cd8, 0x02 );
+ sys16_patch_code( 0x4cec, 0x03 );
+ sys16_patch_code( 0x2dc6c, 0xe9 );
+ sys16_patch_code( 0x2dc64, 0x10 );
+ sys16_patch_code( 0x2dc65, 0x10 );
+ sys16_patch_code( 0x3a100, 0x10 );
+ sys16_patch_code( 0x3a101, 0x13 );
+ sys16_patch_code( 0x3a102, 0x90 );
+ sys16_patch_code( 0x3a103, 0x2b );
+ sys16_patch_code( 0x3a104, 0x00 );
+ sys16_patch_code( 0x3a105, 0x01 );
+ sys16_patch_code( 0x3a106, 0x0c );
+ sys16_patch_code( 0x3a107, 0x00 );
+ sys16_patch_code( 0x3a108, 0x00 );
+ sys16_patch_code( 0x3a109, 0x01 );
+ sys16_patch_code( 0x3a10a, 0x66 );
+ sys16_patch_code( 0x3a10b, 0x06 );
+ sys16_patch_code( 0x3a10c, 0x42 );
+ sys16_patch_code( 0x3a10d, 0x40 );
+ sys16_patch_code( 0x3a10e, 0x54 );
+ sys16_patch_code( 0x3a10f, 0x8b );
+ sys16_patch_code( 0x3a110, 0x60 );
+ sys16_patch_code( 0x3a111, 0x02 );
+ sys16_patch_code( 0x3a112, 0x30 );
+ sys16_patch_code( 0x3a113, 0x1b );
+ sys16_patch_code( 0x3a114, 0x34 );
+ sys16_patch_code( 0x3a115, 0xc0 );
+ sys16_patch_code( 0x3a116, 0x34 );
+ sys16_patch_code( 0x3a117, 0xdb );
+ sys16_patch_code( 0x3a118, 0x24 );
+ sys16_patch_code( 0x3a119, 0xdb );
+ sys16_patch_code( 0x3a11a, 0x24 );
+ sys16_patch_code( 0x3a11b, 0xdb );
+ sys16_patch_code( 0x3a11c, 0x4e );
+ sys16_patch_code( 0x3a11d, 0x75 );
+ sys16_patch_code( 0xaf8e, 0x66 );
+
+ /* fix missing credit text */
+ sys16_patch_code( 0x3f9a, 0xec );
+ sys16_patch_code( 0x3f9b, 0x36 );
+
+ sys16_update_proc = astormbl_update_proc;
+}
+
+
+
+
+
+
+static DRIVER_INIT( astormbl ){
+ UINT8 *RAM= memory_region(REGION_CPU2);
+ static const int astormbl_sound_info[] =
+ {
+ 0x0f, 0x00000, // ROM #1 = 128K
+ 0x1f, 0x20000, // ROM #2 = 256K
+ 0x1f, 0x60000, // ROM #3 = 256K
+ 0x1f, 0xA0000 // ROM #4 = 256K
+ };
+
+ machine_reset_sys16_onetime(machine);
+ sys18_splittab_fg_x=&sys16_textram[0x0f80/2];
+ sys18_splittab_bg_x=&sys16_textram[0x0fc0/2];
+ sys16_MaxShadowColors = 0; // doesn't seem to use transparent shadows
+
+ memcpy(sys18_sound_info, astormbl_sound_info, sizeof(sys18_sound_info));
+ memcpy(RAM,&RAM[0x10000],0xa000);
+}
+
+
+
+
+/*****************************************************************************/
+
+static MACHINE_DRIVER_START( system18 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD_TAG("main", M68000, 10000000)
+ MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
+
+ MDRV_CPU_ADD_TAG("sound", Z80, 8000000)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(sound_readmem_18,sound_writemem_18)
+ MDRV_CPU_IO_MAP(sound_readport_18,sound_writeport_18)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ 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(40*8, 28*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1)
+ MDRV_GFXDECODE(sys16)
+ MDRV_PALETTE_LENGTH((2048+2048)*ShadowColorsMultiplier) // 64 extra colours for vdp (but we use 2048 so shadow mask works)
+
+ MDRV_VIDEO_START(system18old)
+ MDRV_VIDEO_UPDATE(system18old)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD_TAG("3438.0", YM3438, 8000000)
+ MDRV_SOUND_ROUTE(0, "left", 0.40)
+ MDRV_SOUND_ROUTE(1, "right", 0.40)
+ MDRV_SOUND_ROUTE(2, "left", 0.40)
+ MDRV_SOUND_ROUTE(3, "right", 0.40)
+
+ MDRV_SOUND_ADD_TAG("3438.1", YM3438, 8000000)
+ MDRV_SOUND_ROUTE(0, "left", 0.40)
+ MDRV_SOUND_ROUTE(1, "right", 0.40)
+ MDRV_SOUND_ROUTE(2, "left", 0.40)
+ MDRV_SOUND_ROUTE(3, "right", 0.40)
+
+ MDRV_SOUND_ADD_TAG("5c68", RF5C68, 8000000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 1.0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 1.0)
+MACHINE_DRIVER_END
+
+
+
+static MACHINE_DRIVER_START( astormbl )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(system18)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(astormbl_readmem,astormbl_writemem)
+
+ MDRV_MACHINE_RESET(astormbl)
+MACHINE_DRIVER_END
+
+
+
+
+static MACHINE_DRIVER_START( mwalkbl )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(system18)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(mwalkbl_readmem,mwalkbl_writemem)
+
+ MDRV_MACHINE_RESET(mwalkbl)
+MACHINE_DRIVER_END
+
+
+
+
+static MACHINE_DRIVER_START( shdancbl )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(system18)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(shdancbl_readmem,shdancbl_writemem)
+
+ MDRV_CPU_MODIFY("sound")
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(shdancbl_sound_readmem,shdancbl_sound_writemem)
+ MDRV_CPU_IO_MAP(shdancbl_sound_readport,shdancbl_sound_writeport)
+ MDRV_SOUND_REMOVE("5c68")
+
+ MDRV_SOUND_ADD_TAG("5205", MSM5205, 200000)
+ MDRV_SOUND_CONFIG(shdancbl_msm5205_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.80)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.80)
+
+ MDRV_MACHINE_RESET(shdancbl)
+MACHINE_DRIVER_END
+
+
+/***************************************************************************/
+
+
+
+static INPUT_PORTS_START( astormbl )
+ PORT_START /* player 1 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_START /* player 2 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START3 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+ SYS16_COINAGE
+ PORT_START /* DSW1 */
+ PORT_DIPNAME( 0x01, 0x01, "2 Credits to Start" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Easiest ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Easier ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x1c, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x14, DEF_STR( Harder ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( Hardest ) )
+ PORT_DIPSETTING( 0x00, "Special" )
+ PORT_DIPNAME( 0x20, 0x20, "Coin Chutes" )
+ PORT_DIPSETTING( 0x20, "3" )
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_START /* player 3 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mwalkbl )
+ PORT_START /* player 1 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_START /* player 2 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_START /* service */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x08, 0x08, IPT_TILT ) PORT_NAME(DEF_STR( Test )) PORT_CODE(KEYCODE_T)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ SYS16_COINAGE
+ PORT_START /* DSW1 */
+ PORT_DIPNAME( 0x01, 0x01, "2 Credits to Start" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x04, "2" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPNAME( 0x08, 0x08, "Player Vitality" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Low ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( High ) )
+ PORT_DIPNAME( 0x10, 0x00, "Play Mode" )
+ PORT_DIPSETTING( 0x10, "2 Players" )
+ PORT_DIPSETTING( 0x00, "3 Players" )
+ PORT_DIPNAME( 0x20, 0x20, "Coin Mode" )
+ PORT_DIPSETTING( 0x20, "Common" )
+ PORT_DIPSETTING( 0x00, "Individual" )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_START /* player 3 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3)
+// PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START3 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
+INPUT_PORTS_END
+
+
+/*****************************************************************************/
+
+
+
+ROM_START( astormbl )
+ ROM_REGION( 0x080000, REGION_CPU1, 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "astorm.a6", 0x000000, 0x40000, CRC(7682ed3e) SHA1(b857352ad9c66488e91f60989472638c483e4ae8) )
+ ROM_LOAD16_BYTE( "astorm.a5", 0x000001, 0x40000, CRC(efe9711e) SHA1(496fd9e30941fde1658fab7292a669ef7964cecb) )
+
+ ROM_REGION( 0xc0000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "epr13073.bin", 0x00000, 0x40000, CRC(df5d0a61) SHA1(79ad71de348f280bad847566c507b7a31f022292) )
+ ROM_LOAD( "epr13074.bin", 0x40000, 0x40000, CRC(787afab8) SHA1(a119042bb2dad54e9733bfba4eaab0ac5fc0f9e7) )
+ ROM_LOAD( "epr13075.bin", 0x80000, 0x40000, CRC(4e01b477) SHA1(4178ce4a87ea427c3b0195e64acef6cddfb3485f) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, 0 ) /* sprites */
+ ROM_LOAD16_BYTE( "mpr13082.bin", 0x000001, 0x40000, CRC(a782b704) SHA1(ba15bdfbc267b8d86f03e5310ce60846ff846de3) )
+ ROM_LOAD16_BYTE( "astorm.a11", 0x000000, 0x40000, CRC(7829c4f3) SHA1(3adb7aa7f70163d3848c98316e18b9783c41d663) )
+ ROM_LOAD16_BYTE( "mpr13081.bin", 0x080001, 0x40000, CRC(eb510228) SHA1(4cd387b160ec7050e1300ebe708853742169e643) )
+ ROM_LOAD16_BYTE( "mpr13088.bin", 0x080000, 0x40000, CRC(3b6b4c55) SHA1(970495c54b3e1893ee8060f6ca1338c2cbbd1074) )
+ ROM_LOAD16_BYTE( "mpr13080.bin", 0x100001, 0x40000, CRC(e668eefb) SHA1(d4a087a238b4d3ac2d23fe148d6a73018e348a89) )
+ ROM_LOAD16_BYTE( "mpr13087.bin", 0x100000, 0x40000, CRC(2293427d) SHA1(4fd07763ff060afd594e3f64fa4750577f56c80e) )
+ ROM_LOAD16_BYTE( "epr13079.bin", 0x180001, 0x40000, CRC(de9221ed) SHA1(5e2e434d1aa547be1e5652fc906d2e18c5122023) )
+ ROM_LOAD16_BYTE( "epr13086.bin", 0x180000, 0x40000, CRC(8c9a71c4) SHA1(40b774765ac888792aad46b6351a24b7ef40d2dc) )
+
+ ROM_REGION( 0x100000, REGION_CPU2, 0 ) /* sound CPU */
+ ROM_LOAD( "epr13083.bin", 0x10000, 0x20000, CRC(5df3af20) SHA1(e49105fcfd5bf37d14bd760f6adca5ce2412883d) )
+ ROM_LOAD( "epr13076.bin", 0x30000, 0x40000, CRC(94e6c76e) SHA1(f99e58a9bf372c41af211bd9b9ea3ac5b924c6ed) )
+ ROM_LOAD( "epr13077.bin", 0x70000, 0x40000, CRC(e2ec0d8d) SHA1(225b0d223b7282cba7710300a877fb4a2c6dbabb) )
+ ROM_LOAD( "epr13078.bin", 0xb0000, 0x40000, CRC(15684dc5) SHA1(595051006de24f791dae937584e502ff2fa31d9c) )
+ROM_END
+
+/*
+
+CPUs:
+on main board:
+
+1x MC68000P10 (main)
+1x Z8400BB1-Z80BCPU (sound)
+1x OKI M6295 (sound)
+1x oscillator 24.000MHz (close to main)
+1x oscillator 8.000MHz (close to sound)
+
+ROMs
+on main board:
+
+9x M27C512 (1,2,3,4,5,6,7,8,10)
+1x TMS27C256 (9)
+21x NM27C010Q (11-31)
+
+----------------------
+
+on roms board:
+6x NM27C010Q (32-37)
+2x N82S123N
+
+*/
+
+ROM_START( astormb2 )
+ ROM_REGION( 0x080000, REGION_CPU1, 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "1.a4", 0x000000, 0x10000, CRC(cca0d0af) SHA1(26fdbbeb8444d05f0ca2056a7c7fb81b0f1f2b5a) )
+ ROM_LOAD16_BYTE( "2.a3", 0x020000, 0x10000, CRC(f95eb883) SHA1(b25d9c0fd46a534e7612f4a3ffa708b73654ae2b) )
+ ROM_LOAD16_BYTE( "3.a2", 0x040000, 0x10000, CRC(4206ecd4) SHA1(45c65d7727cfaf215a7081159f6931185e92b39a) ) // epr13182.bin [3/4] IDENTICAL
+ ROM_LOAD16_BYTE( "4.a1", 0x060000, 0x10000, CRC(23247c95) SHA1(e4d78c453d2cb77946dd1b5266de823968eade77) ) // epr13182.bin [4/4] 98.648071%
+ ROM_LOAD16_BYTE( "5.a9", 0x000001, 0x10000, CRC(6143039e) SHA1(8a5143c1e2c637149e988c423fa30b31e29a1193) )
+ ROM_LOAD16_BYTE( "6.a8", 0x020001, 0x10000, CRC(0fd17bec) SHA1(e9a5dd93394fdf1561a925e4111dfce51b717b14) )
+ ROM_LOAD16_BYTE( "7.a7", 0x040001, 0x10000, CRC(c901e228) SHA1(f459ba819a4e5f5174ff1b3957fb648c93beed53) ) // epr13181.bin [3/4] IDENTICAL
+ ROM_LOAD16_BYTE( "8.a6", 0x060001, 0x10000, CRC(bfb9d607) SHA1(8c3e10c1397fa0807d8df4715c9eb1945c774924) ) // epr13181.bin [4/4] 98.587036%
+
+ ROM_REGION( 0xc0000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "32.01", 0x00000, 0x20000, CRC(d2aeb4ab) SHA1(9338ec5dc48f5d2b20511628a281236fe4646ef4) ) // epr13073.bin [1/2] IDENTICAL
+ ROM_LOAD( "33.011", 0x20000, 0x20000, CRC(2193f0ae) SHA1(84070f74693699c1ffc1a47517a97b5d058d08ec) ) // epr13073.bin [2/2] IDENTICAL
+ ROM_LOAD( "34.02", 0x40000, 0x20000, CRC(849aa725) SHA1(0f949dfe8a6c5796edc86a05339da80a158a95ae) ) // epr13074.bin [1/2] IDENTICAL
+ ROM_LOAD( "35.021", 0x60000, 0x20000, CRC(3f190347) SHA1(131953ccefb95eeef1ea90499ce521c3749f95c1) ) // epr13074.bin [2/2] IDENTICAL
+ ROM_LOAD( "36.03", 0x80000, 0x20000, CRC(c0f9628d) SHA1(aeacf5e409adfa0b9c28c90d4e89eb1f56cd5f4d) ) // epr13075.bin [1/2] IDENTICAL
+ ROM_LOAD( "37.031", 0xa0000, 0x20000, CRC(95af904e) SHA1(6574fa874c355c368109b417aab7d0b05c9d215d) ) // epr13075.bin [2/2] IDENTICAL
+
+ ROM_REGION( 0x200000, REGION_GFX2, 0 ) /* sprites */
+ ROM_LOAD16_BYTE( "17.042", 0x000001, 0x20000, CRC(db08beb5) SHA1(c154d22c69b77637d6a9d0f2bffcfb47e6901ec8) ) // mpr13082.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "16.043", 0x040001, 0x20000, CRC(41f78977) SHA1(9cf9fcf96722d148c4b2cf7aa33425b6efcd0379) ) // mpr13082.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "29.012", 0x000000, 0x20000, CRC(22acf675) SHA1(80fd0d96017bf36d964a79f7e13e73fee7ed370a) ) // mpr13089.bin [1/2] 99.941254%
+ ROM_LOAD16_BYTE( "28.013", 0x040000, 0x20000, CRC(32b37a3a) SHA1(70f268aa99a17739fd9d832b5f1d9e37247747e6) ) // mpr13089.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "19.040", 0x080001, 0x20000, CRC(10c359ac) SHA1(9087cb824242ce5fc8eba45b61cca8b329c576e5) ) // mpr13081.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "18.041", 0x0c0001, 0x20000, CRC(47146c1d) SHA1(cd5d92136f86128a9f304c4f8850f1efd652dd5c) ) // mpr13081.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "31.010", 0x080000, 0x20000, CRC(e88fc39c) SHA1(f19c55c49771625a76e65b639a3b23969db8031d) ) // mpr13088.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "30.011", 0x0c0000, 0x20000, CRC(6fe7e2a2) SHA1(94e5852377f72fd00daae302db4a5f93301213e4) ) // mpr13088.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "21.032", 0x100001, 0x20000, CRC(c9e5a258) SHA1(809a3a3f88efe9c7a9dd9f6439ccb48fffb84df0) ) // mpr13080.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "20.033", 0x140001, 0x20000, CRC(ddf8d00e) SHA1(0a9031063921bb03e7fd57eea369a1ddcfa85431) ) // mpr13080.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "25.022", 0x100000, 0x20000, CRC(af8f3700) SHA1(3787f732eee5c6c9b6550bd4ce5387aff2c4072e) ) // mpr13087.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "24.023", 0x140000, 0x20000, CRC(a092ecb6) SHA1(d7cc85eaea70c7947c497bc1d9743ab12a6fb43e) ) // mpr13087.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "23.030", 0x180001, 0x20000, CRC(adc1b625) SHA1(496a1e92a833dbde37a0426165ff4250848b6ef4) ) // epr13079.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "22.031", 0x1c0001, 0x20000, CRC(27c27f38) SHA1(439502250da4e376d2aa4bd9122455c6991e334d) ) // epr13079.bin [2/2] IDENTICAL
+ ROM_LOAD16_BYTE( "27.020", 0x180000, 0x20000, CRC(6c5312aa) SHA1(94b74c78f318fcc1881a2926cebc98033a7e535d) ) // epr13086.bin [1/2] IDENTICAL
+ ROM_LOAD16_BYTE( "26.021", 0x1c0000, 0x20000, CRC(c67fc986) SHA1(5fac826f9dde45201e3b93582dbe29c584a10229) ) // epr13086.bin [2/2] 99.987030%
+
+ /* Sound HW is very different to the originals */
+ ROM_REGION( 0x210000, REGION_CPU2, ROMREGION_ERASEFF ) /* Z80 sound CPU */
+ ROM_LOAD( "9.a5", 0x10000, 0x08000, CRC(0a4638e9) SHA1(0470e03a194464ff53c7583637193b585f5fd79f) )
+
+ ROM_REGION( 0x40000, REGION_SOUND1, ROMREGION_ERASEFF ) /* Oki6295 Samples - fixed? samples */
+ ROM_LOAD( "11.a10", 0x00000, 0x20000, CRC(7e0f752c) SHA1(a4070c3fa4848b5be223f9b927de4b6926dbb4e6) ) // contains sample table
+ ROM_LOAD( "10.a11", 0x20000, 0x10000, CRC(722e5969) SHA1(9cf891c6533b2e2a5c4741aa4e405038a7bf4e97) )
+ /* 0x30000- 0x3ffff banked? (guess) */
+
+ ROM_REGION( 0xc0000, REGION_SOUND2, ROMREGION_ERASEFF ) /* Oki6295 Samples - banked? samples*/
+ ROM_LOAD( "12.a15", 0x00000, 0x20000, CRC(cb4517db) SHA1(4c93376c2b3e70001bbc283d4485bb55514f6ef9) )
+ ROM_LOAD( "13.a14", 0x20000, 0x20000, CRC(c60d6f18) SHA1(c9610729f19ae8414efd785948a1e6fb079bfe8d) )
+ ROM_LOAD( "14.a13", 0x40000, 0x20000, CRC(07e6b3a5) SHA1(32da2a9aeb840b76e6f0117ac342ff5d612762b4) )
+ ROM_LOAD( "15.a12", 0x60000, 0x20000, CRC(dffde929) SHA1(037b32470747d155385e532ee574b1234b3c2b26) )
+
+ ROM_REGION( 0x0120, REGION_PROMS, 0 )
+ ROM_LOAD( "n82s129n.129", 0x0000, 0x0100, CRC(a7c22d96) SHA1(160deae8053b09c09328325246598b3518c7e20b) )
+ ROM_LOAD( "n82s123n.123", 0x0100, 0x0020, CRC(58bcf8bd) SHA1(e4d3d179b08c0f3424a6bec0f15058fb1b56f8d8) )
+ROM_END
+
+
+ROM_START( mwalkbl )
+ ROM_REGION( 0x080000, REGION_CPU1, 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "mwalkbl.01", 0x000000, 0x10000, CRC(f49cdb16) SHA1(34b7e98d31c3b9db2f0f055d7b249b0e5e5cb746) )
+ ROM_LOAD16_BYTE( "mwalkbl.05", 0x000001, 0x10000, CRC(c483f29f) SHA1(8fdfa764d8e49754844a9dc001400d439f9af9f0) )
+ ROM_LOAD16_BYTE( "mwalkbl.02", 0x020000, 0x10000, CRC(0bde1896) SHA1(42731ae90d56918dc50c0dcb53d092dcfb957159) )
+ ROM_LOAD16_BYTE( "mwalkbl.06", 0x020001, 0x10000, CRC(5b9fc688) SHA1(53d8143c3876548f63b392f0ea16c0e7c30a7917) )
+ ROM_LOAD16_BYTE( "mwalkbl.03", 0x040000, 0x10000, CRC(0c5fe15c) SHA1(626e3f37f019448c3c96bf73b2d2b5fe4b3716c0) )
+ ROM_LOAD16_BYTE( "mwalkbl.07", 0x040001, 0x10000, CRC(9e600704) SHA1(efd3d450b26f81dc2b74f44b4aaf906fa017e437) )
+ ROM_LOAD16_BYTE( "mwalkbl.04", 0x060000, 0x10000, CRC(64692f79) SHA1(ad7f32997b78863e3aa3214018cdd24e3ec9c5cb) )
+ ROM_LOAD16_BYTE( "mwalkbl.08", 0x060001, 0x10000, CRC(546ca530) SHA1(51f74878fdc221fee026e2e6a7ca96f290c8947f) )
+
+ ROM_REGION( 0xc0000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "mpr13216.b1", 0x00000, 0x40000, CRC(862d2c03) SHA1(3c5446d702a639b62a602c6d687f9875d8450218) )
+ ROM_LOAD( "mpr13217.b2", 0x40000, 0x40000, CRC(7d1ac3ec) SHA1(8495357304f1df135bba77ef3b96e79a883b8ff0) )
+ ROM_LOAD( "mpr13218.b3", 0x80000, 0x40000, CRC(56d3393c) SHA1(50a2d065060692c9ecaa56046a781cb21d93e554) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, 0 ) /* sprites */
+ ROM_LOAD16_BYTE( "mpr13224.b11", 0x000001, 0x40000, CRC(c59f107b) SHA1(10fa60fca6e34eda277c483bb1c0e81bb88c8a47) )
+ ROM_LOAD16_BYTE( "mpr13231.a11", 0x000000, 0x40000, CRC(a5e96346) SHA1(a854f4dd5dc16975373255110fdb8ab3d121b1af) )
+ ROM_LOAD16_BYTE( "mpr13223.b10", 0x080001, 0x40000, CRC(364f60ff) SHA1(9ac887ec0b2e32b504b7c6a5f3bb1ce3fe41a15a) )
+ ROM_LOAD16_BYTE( "mpr13230.a10", 0x080000, 0x40000, CRC(9550091f) SHA1(bb6e898f7b540e130fd338c10f74609a7604cef4) )
+ ROM_LOAD16_BYTE( "mpr13222.b9", 0x100001, 0x40000, CRC(523df3ed) SHA1(2e496125e75decd674c3a08404fbdb53791a965d) )
+ ROM_LOAD16_BYTE( "mpr13229.a9", 0x100000, 0x40000, CRC(f40dc45d) SHA1(e9468cef428f52ecdf6837c6d9a9fea934e7676c) )
+ ROM_LOAD16_BYTE( "epr13221.b8", 0x180001, 0x40000, CRC(9ae7546a) SHA1(5413b0131881b0b32bac8de51da9a299835014bb) )
+ ROM_LOAD16_BYTE( "epr13228.a8", 0x180000, 0x40000, CRC(de3786be) SHA1(2279bb390aa3efab9aeee0a643e5cb6a4f5933b6) )
+
+ ROM_REGION( 0x100000, REGION_CPU2, 0 ) /* sound CPU */
+ ROM_LOAD( "epr13225.a4", 0x10000, 0x20000, CRC(56c2e82b) SHA1(d5755a1bb6e889d274dc60e883d4d65f12fdc877) )
+ ROM_LOAD( "mpr13219.b4", 0x30000, 0x40000, CRC(19e2061f) SHA1(2dcf1718a43dab4da53b4f67722664e70ddd2169) )
+ ROM_LOAD( "mpr13220.b5", 0x70000, 0x40000, CRC(58d4d9ce) SHA1(725e73a656845b02702ef131b4c0aa2a73cdd02e) )
+ ROM_LOAD( "mpr13249.b6", 0xb0000, 0x40000, CRC(623edc5d) SHA1(c32d9f818d40f311877fbe6532d9e95b6045c3c4) )
+ROM_END
+
+
+// Shadow Dancer
+ROM_START( shdancbl )
+ ROM_REGION( 0x080000, REGION_CPU1, 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "ic39", 0x000000, 0x10000, CRC(adc1781c) SHA1(b2ca2831a48779df7533e6b2a406ee539e1f650c) )
+ ROM_LOAD16_BYTE( "ic53", 0x000001, 0x10000, CRC(1c1ac463) SHA1(21075f7afae372daef197f04f5f12d14479a8140) )
+ ROM_LOAD16_BYTE( "ic38", 0x020000, 0x10000, CRC(cd6e155b) SHA1(e37b53cc431533091d26b37be9b8e30494de5faf) )
+ ROM_LOAD16_BYTE( "ic52", 0x020001, 0x10000, CRC(bb3c49a4) SHA1(ab01a6de1a6d338d30f9cfea7b3bf80dda67f215) )
+ ROM_LOAD16_BYTE( "ic37", 0x040000, 0x10000, CRC(1bd8d5c3) SHA1(4d663362c059e112ac6c742d80200be98d50d175) )
+ ROM_LOAD16_BYTE( "ic51", 0x040001, 0x10000, CRC(ce2e71b4) SHA1(3e251319cd4c8c63c66e6b92b2eef514d79dba8e) )
+ ROM_LOAD16_BYTE( "ic36", 0x060000, 0x10000, CRC(bb861290) SHA1(62ea8eec74c6b1f5530ee86f97ad821daeac26ad) )
+ ROM_LOAD16_BYTE( "ic50", 0x060001, 0x10000, CRC(7f7b82b1) SHA1(675020b57ce689b2767ff83773e2b828cda5aeed) )
+
+ ROM_REGION( 0xc0000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */
+ ROM_LOAD( "ic4", 0x00000, 0x20000, CRC(f0a016fe) SHA1(1426f3fbf50a04a8c5e998e071ca0e78d15f37a8) )
+ ROM_LOAD( "ic18", 0x20000, 0x20000, CRC(f6bee053) SHA1(39ee5edfcc67bb4855217c7428254f3e8c862ba0) )
+ ROM_LOAD( "ic3", 0x40000, 0x20000, CRC(e07e6b5d) SHA1(bdeb1193415049d0c9261ca261073bdd9e251b88) )
+ ROM_LOAD( "ic17", 0x60000, 0x20000, CRC(f59deba1) SHA1(21188d22fe607281bb7da1e1f418a33d4a315695) )
+ ROM_LOAD( "ic2", 0x80000, 0x20000, CRC(60095070) SHA1(913c2ee51fb6f838f3c6cbd27032bdf754fbadf1) )
+ ROM_LOAD( "ic16", 0xa0000, 0x20000, CRC(0f0d5dd3) SHA1(76812e2f831256a8b6598257dd84a7f07443642e) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, 0 ) /* sprites */
+
+ // 12719
+ ROM_LOAD16_BYTE( "ic73", 0x000001, 0x10000, CRC(59e77c96) SHA1(08da058529ac83352a4528d3792a21edda348f7a) )
+ ROM_LOAD16_BYTE( "ic74", 0x020001, 0x10000, CRC(90ea5407) SHA1(4bdd93c86cb35822517433d491aa8be6857dd36c) )
+ ROM_LOAD16_BYTE( "ic75", 0x040001, 0x10000, CRC(27d2fa61) SHA1(0ba3cd9448e54ce9fc9433f3edd28de9a4e451e9) )
+ ROM_LOAD16_BYTE( "ic76", 0x060001, 0x10000, CRC(f36db688) SHA1(a527298ce9ca1d9f5aa7b9eac93985f34ca8119f) )
+
+ // 12726
+ ROM_LOAD16_BYTE( "ic58", 0x000000, 0x10000, CRC(9cd5c8c7) SHA1(54c2d0a683bda37eb9a75f90f4ca5e620c09c4cf) )
+ ROM_LOAD16_BYTE( "ic59", 0x020000, 0x10000, CRC(ff40e872) SHA1(bd2c4aac427d106a46318f4cb2eb05c34d3c70b6) )
+ ROM_LOAD16_BYTE( "ic60", 0x040000, 0x10000, CRC(826d7245) SHA1(bb3394de058bd63b9939cd05f22c925e0cdc840a) )
+ ROM_LOAD16_BYTE( "ic61", 0x060000, 0x10000, CRC(dcf8068b) SHA1(9c78de224df76fc90fb90f1bbd9b22dad0874f69) )
+
+ // 12718
+ ROM_LOAD16_BYTE( "ic77", 0x080001, 0x10000, CRC(f93470b7) SHA1(1041afa43aa8d0589d6def9743721cdbda617f78) )
+// ROM_LOAD16_BYTE( "ic78", 0x0A0001, 0x10000, CRC(4d523ea3) SHA1(053c30778017127dddeae0783af463aef17bcc9a) ) // corrupt? (bad sprite when dog attacts in attract mode)
+ ROM_LOAD16_BYTE( "sdbl.78", 0x0A0001, 0x10000, CRC(e533be5d) SHA1(926d6ba3f7a3ac289b0ae40d7633c70b2819df4d) )
+ ROM_LOAD16_BYTE( "ic95", 0x0C0001, 0x10000, CRC(828b8294) SHA1(f2cdb882fb0709a909e6ef98f0315aceeb8bf283) )
+// ROM_LOAD16_BYTE( "ic94", 0x0E0001, 0x10000, CRC(542b2d1e) SHA1(1ce91aea6c49e6e365a91c30ca3049682c2162da) )
+ ROM_LOAD16_BYTE( "sdbl.94", 0x0E0001, 0x10000, CRC(e2fa2b41) SHA1(7186107734dac5763dee43addcea7c14fb0d9d74) )
+
+ // 12725
+ ROM_LOAD16_BYTE( "ic62", 0x080000, 0x10000, CRC(50ca8065) SHA1(8c0d6ae34b9da6c376df387e8fc8b1068bcb4dcb) )
+ ROM_LOAD16_BYTE( "ic63", 0x0A0000, 0x10000, CRC(d1866aa9) SHA1(524c82a12a1c484a246b8d49d9f05a774d008108) )
+ ROM_LOAD16_BYTE( "ic90", 0x0C0000, 0x10000, CRC(3602b758) SHA1(d25b6c8420e07d0f2ac3e1d8717f14738466df16) )
+ ROM_LOAD16_BYTE( "ic89", 0x0E0000, 0x10000, CRC(1ba4be93) SHA1(6f4fe2016e375be3df477436f5cde7508a24ecd1) )
+
+ // 12717
+ ROM_LOAD16_BYTE( "ic79", 0x100001, 0x10000, CRC(f22548ee) SHA1(723cb7604784c6715817daa8c86c18c6bcd1388d) )
+ ROM_LOAD16_BYTE( "ic80", 0x120001, 0x10000, CRC(6209f7f9) SHA1(09b33c99d972a62af8ef56dacfa6262f002aba0c) )
+ ROM_LOAD16_BYTE( "ic81", 0x140001, 0x10000, CRC(34692f23) SHA1(56126a81ac279662e3e3423da5205f65a62c4600) )
+ ROM_LOAD16_BYTE( "ic82", 0x160001, 0x10000, CRC(7ae40237) SHA1(fae97cfcfd3cd557da3330158831e4727c438745) )
+
+ // 12724
+ ROM_LOAD16_BYTE( "ic64", 0x100000, 0x10000, CRC(7a8b7bcc) SHA1(00cbbbc4b3db48ca3ac65ff56b02c7d63a1b898a) )
+ ROM_LOAD16_BYTE( "ic65", 0x120000, 0x10000, CRC(90ffca14) SHA1(00962e5309a79ce34c6f420036054bc607595dfe) )
+ ROM_LOAD16_BYTE( "ic66", 0x140000, 0x10000, CRC(5d655517) SHA1(2a1c197dde62bd7946ca7b5f1c2833bdbc2e2e32) )
+ ROM_LOAD16_BYTE( "ic67", 0x160000, 0x10000, CRC(0e5d0855) SHA1(3c15088f7fdda5c2bba9c89d244bbcff022f05fd) )
+
+ // 12716
+ ROM_LOAD16_BYTE( "ic83", 0x180001, 0x10000, CRC(a9040a32) SHA1(7b0b375285f528b2833c50892b55b0d4c550506d) )
+ ROM_LOAD16_BYTE( "ic84", 0x1A0001, 0x10000, CRC(d6810031) SHA1(a82857a9ac442fbe076cdafcf7390765391ed136) )
+ ROM_LOAD16_BYTE( "ic92", 0x1C0001, 0x10000, CRC(b57d5cb5) SHA1(636f1a07a84d37cecbe388a2f585893c4611436c) )
+ ROM_LOAD16_BYTE( "ic91", 0x1E0001, 0x10000, CRC(49def6c8) SHA1(d8b2cc1993f0808553f87bf56fdbe47374576c5a) )
+
+ // 12723
+ ROM_LOAD16_BYTE( "ic68", 0x180000, 0x10000, CRC(8d684e53) SHA1(00e82ddaf875a7452ff978b7b7eb87a1a5a8fb64) )
+ ROM_LOAD16_BYTE( "ic69", 0x1A0000, 0x10000, CRC(c47d32e2) SHA1(92b21f51abdd7950fb09d965b1d71b7bffac31ec) )
+ ROM_LOAD16_BYTE( "ic88", 0x1C0000, 0x10000, CRC(9de140e1) SHA1(f1125e056a898a4fa519b49ae866c5c742e36bf7) )
+ ROM_LOAD16_BYTE( "ic87", 0x1E0000, 0x10000, CRC(8172a991) SHA1(6d12b1533a19cb02613b473cc8ba73ece1f2a2fc) )
+
+ ROM_REGION( 0x30000, REGION_CPU2, 0 ) /* sound CPU */
+ ROM_LOAD( "ic45", 0x10000, 0x10000, CRC(576b3a81) SHA1(b65356a3837ed3875634ab0cbcd61acce44f2bb9) )
+ ROM_LOAD( "ic46", 0x20000, 0x10000, CRC(c84e8c84) SHA1(f57895bedb6152c30733e91e6f4795702a62ac3a) )
+ROM_END
+
+
+/*****************************************************************************/
+
+GAME( 1990, astormbl, astorm, astormbl, astormbl, astormbl, ROT0, "bootleg", "Alien Storm (bootleg, set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1990, astormb2, astorm, astormbl, astormbl, astormbl, ROT0, "bootleg", "Alien Storm (bootleg, set 2)", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND )
+
+GAME( 1990, mwalkbl, mwalk, mwalkbl, mwalkbl, mwalkbl, ROT0, "bootleg", "Michael Jackson's Moonwalker (bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+
+GAME( 1989, shdancbl, shdancer, shdancbl, mwalkbl, shdancbl, ROT0, "bootleg", "Shadow Dancer (bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+