summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hal21.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/hal21.c')
-rw-r--r--src/mame/drivers/hal21.c975
1 files changed, 975 insertions, 0 deletions
diff --git a/src/mame/drivers/hal21.c b/src/mame/drivers/hal21.c
new file mode 100644
index 00000000000..a12d7cad1a3
--- /dev/null
+++ b/src/mame/drivers/hal21.c
@@ -0,0 +1,975 @@
+/*
+ Hal21
+ ASO
+ Alpha Mission
+
+
+Change Log
+----------
+
+AT08XX03:
+
+[Common]
+ - cleaned and consolidated VIDEO_UPDATE()
+ - added shadows and highlights
+
+ * A.S.O and HAL21 do a lot of palette cycling therefore
+ conversion to tilemaps may be disadvantageous.
+ Cocktail mode involves changing tile offsets and sprite
+ coordinates and is still unsupported.
+
+ * Manuals show both boards have noise filters to smooth out
+ rings and scratches which are especially audible in HAL21.
+
+[HAL21]
+ - installed NMI scheduler to prevent music trashing
+
+[ASO]
+ - fixed music and sound effects being cut short
+ - fixed service mode(hold P1 start during ROM test)
+ - improved scrolling and color
+
+ * Stage 5 boss' sky and the first half of stage 6's background
+ appear to have consistent color as shown in Beep! magazine:
+
+ http://qtq.hp.infoseek.co.jp/kouryaku/aso/aso2.jpg
+ http://qtq.hp.infoseek.co.jp/kouryaku/aso/aso3.png
+
+ Compared to MAME these areas are blacked out under pens
+ 0xf0-0xff. On the other hand pens 0x170-0x17f suit them
+ perfectly but they are never used in the first two loops.
+ (I played through the game and logged pen usage. Only four
+ color codes have blue pen15 so it's not difficult to tell.)
+
+ There are unknown bits embedded in RGB triplets and the whole
+ upper half of the palette is simply unused. The fact that ASO's
+ color PROMs are identical in every set dismissed bad dumps but
+ increased the likelyhood of proprietary logic which is quite
+ obvious in Touchdown Fever and HAL21.
+
+[TODO]
+ - find out what "really" messes up ASO's scrolling
+ - verify color effects in both games
+*/
+
+#include "driver.h"
+#include "cpu/z80/z80.h"
+#include "snk.h"
+#include "sound/ay8910.h"
+#include "sound/3812intf.h"
+
+static UINT8 *hal21_vreg, *hal21_sndfifo;
+static UINT8 *textram;
+static UINT8 *aso_scroll_sync;
+
+/**************************************************************************/
+// Test Handlers
+
+static WRITE8_HANDLER( aso_scroll_sync_w )
+{
+ if (data == 0x7f && (program_read_byte(0xdcd2) & 1)) data++;
+ aso_scroll_sync[offset] = data;
+}
+
+static void hal21_sound_scheduler(int mode, int data)
+{
+ static int busy, hold, ffcount, ffhead, fftail;
+
+ switch (mode)
+ {
+ case 0: // init
+ fftail = ffhead = ffcount = hold = busy = 0;
+ return;
+
+ case 1: // cut-through or capture
+ if (data & ~0x1f) busy = 1; else
+ if (data && busy)
+ {
+ if (ffcount < 16)
+ {
+ ffcount++;
+ hal21_sndfifo[ffhead] = data;
+ ffhead = (ffhead + 1) & 15;
+ }
+ return;
+ }
+ break;
+
+ case 2: // acknowledge
+ if (busy) { busy = 0; hold = 4; }
+ return;
+
+ case 3: // release
+ if (!busy)
+ {
+ if (hold) hold--; else
+ if (ffcount)
+ {
+ ffcount--;
+ data = hal21_sndfifo[fftail];
+ fftail = (fftail + 1) & 15;
+ break;
+ }
+ }
+ return;
+ }
+
+ snk_sound_busy_bit = 0x20;
+ soundlatch_w(0, data);
+ cpunum_set_input_line(2, INPUT_LINE_NMI, PULSE_LINE);
+}
+
+/**************************************************************************/
+
+static WRITE8_HANDLER( hal21_vreg0_w ){ hal21_vreg[0] = data; }
+static WRITE8_HANDLER( hal21_vreg1_w ){ hal21_vreg[1] = data; }
+static WRITE8_HANDLER( hal21_vreg2_w ){ hal21_vreg[2] = data; }
+static WRITE8_HANDLER( hal21_vreg3_w ){ hal21_vreg[3] = data; }
+static WRITE8_HANDLER( hal21_vreg4_w ){ hal21_vreg[4] = data; }
+static WRITE8_HANDLER( hal21_vreg5_w ){ hal21_vreg[5] = data; }
+static WRITE8_HANDLER( hal21_vreg6_w ){ hal21_vreg[6] = data; }
+static WRITE8_HANDLER( hal21_vreg7_w ){ hal21_vreg[7] = data; }
+
+
+PALETTE_INIT( aso )
+{
+ int i;
+ int num_colors = 1024;
+
+ /*
+ palette format is RRRG GGBB B??? the three unknown bits are used but
+ I'm not sure how, I'm currently using them as least significant bit but
+ that's most likely wrong.
+ */
+ for( i=0; i<num_colors; i++ )
+ {
+ int bit0=0,bit1,bit2,bit3,r,g,b;
+
+ bit0 = (color_prom[i + 2*num_colors] >> 2) & 0x01;
+ bit1 = (color_prom[i] >> 1) & 0x01;
+ bit2 = (color_prom[i] >> 2) & 0x01;
+ bit3 = (color_prom[i] >> 3) & 0x01;
+ r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
+
+ bit0 = (color_prom[i + 2*num_colors] >> 1) & 0x01;
+ bit1 = (color_prom[i + num_colors] >> 2) & 0x01;
+ bit2 = (color_prom[i + num_colors] >> 3) & 0x01;
+ bit3 = (color_prom[i] >> 0) & 0x01;
+ g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
+
+ bit0 = (color_prom[i + 2*num_colors] >> 0) & 0x01;
+ bit1 = (color_prom[i + 2*num_colors] >> 3) & 0x01;
+ bit2 = (color_prom[i + num_colors] >> 0) & 0x01;
+ bit3 = (color_prom[i + num_colors] >> 1) & 0x01;
+ b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+ }
+
+ /* prepare shadow draw table */
+ for (i=0; i<=5; i++) gfx_drawmode_table[i] = DRAWMODE_SOURCE;
+
+ gfx_drawmode_table[6] = DRAWMODE_SHADOW;
+ gfx_drawmode_table[7] = DRAWMODE_NONE;
+}
+
+static VIDEO_START( aso )
+{
+ snk_blink_parity = 0;
+}
+
+
+static void hal21_draw_background(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int scrollx, int scrolly, int attrs,
+ const gfx_element *gfx )
+{
+ static int color[2] = {8, 8};
+ int bankbase, c, x, y, offsx, offsy, dx, dy, sx, sy, offs, tile_number;
+
+ bankbase = attrs<<3 & 0x100;
+ c = attrs & 0x0f;
+ if (c > 11) { fillbitmap(bitmap,machine->pens[(c<<4)+8], cliprect); return; }
+ if (c<8 || color[0]<14 || bankbase)
+ {
+ c ^= 0x08;
+ color[0] = c;
+ color[1] = (c & 0x08) ? c : 8;
+ }
+
+ offsx = ((scrollx>>3) + 0) & 0x3f;
+ dx = -(scrollx & 7) + 0;
+ offsy = ((scrolly>>3) + 0) & 0x3f;
+ dy = -(scrolly & 7) + 0;
+
+ for (x=2; x<35; x++)
+ for (y=0; y<28; y++)
+ {
+ offs = (((offsx+x)&0x3f)<<6) + ((offsy+y)&0x3f);
+ sx = (x<<3) + dx;
+ sy = (y<<3) + dy;
+ tile_number = bankbase + videoram[offs];
+ c = (tile_number & ~0x3f) ? color[0] : color[1];
+
+ drawgfx(bitmap, gfx,
+ tile_number, c,
+ 0, 0,
+ sx, sy,
+ cliprect, TRANSPARENCY_NONE, 0);
+ }
+}
+
+static void hal21_draw_sprites(mame_bitmap *bitmap, const rectangle *cliprect, int scrollx, int scrolly,
+ const gfx_element *gfx )
+{
+ UINT8 *sprptr, *endptr;
+ int attrs, tile, x, y, color, fy;
+
+ sprptr = spriteram;
+ endptr = spriteram + 0x100;
+
+ for (; sprptr<endptr; sprptr+=4)
+ {
+ if (*(UINT32*)sprptr == 0 || *(UINT32*)sprptr == -1) continue;
+
+ attrs = sprptr[3];
+ tile = sprptr[1] + (attrs<<2 & 0x100);
+ color = attrs & 0x0f;
+ fy = attrs & 0x20;
+ y = (sprptr[0] + (attrs<<4 & 0x100) - scrolly) & 0x1ff;
+ x = (0x100 - (sprptr[2] + (attrs<<1 & 0x100) - scrollx)) & 0x1ff;
+ if (y > 512-16) y -= 512;
+ if (x > 512-16) x -= 512;
+
+ drawgfx(bitmap, gfx,
+ tile, color,
+ 0, fy,
+ x, y,
+ cliprect, TRANSPARENCY_PEN, 7);
+ }
+}
+
+static void aso_draw_background(mame_bitmap *bitmap, const rectangle *cliprect, int scrollx, int scrolly, int attrs,
+ const gfx_element *gfx )
+{
+ int bankbase, c, x, y, offsx, offsy, dx, dy, sx, sy, offs, tile_number;
+
+ bankbase = attrs<<4 & 0x300;
+ c = attrs & 0x0f;
+ if (c == 7) c = 15;
+
+ offsx = ((scrollx>>3) + 0) & 0x3f;
+ dx = -(scrollx & 7) + 0;
+ offsy = ((scrolly>>3) + 0) & 0x3f;
+ dy = -(scrolly & 7) + 0;
+
+ for (x=2; x<35; x++)
+ for (y=0; y<28; y++)
+ {
+ offs = (((offsx+x)&0x3f)<<6) + ((offsy+y)&0x3f);
+ sx = (x<<3) + dx;
+ sy = (y<<3) + dy;
+ tile_number = bankbase + videoram[offs];
+
+ drawgfx(bitmap, gfx,
+ tile_number, c,
+ 0, 0,
+ sx, sy,
+ cliprect, TRANSPARENCY_NONE, 0);
+ }
+}
+
+static void aso_draw_sprites(mame_bitmap *bitmap, const rectangle *cliprect, int scrollx, int scrolly,
+ const gfx_element *gfx )
+{
+ UINT8 *sprptr, *endptr;
+ int attrs, tile, x, y, color;
+
+ sprptr = spriteram;
+ endptr = spriteram + 0x100;
+
+ for (; sprptr<endptr; sprptr+=4)
+ {
+ if (*(UINT32*)sprptr == 0 || *(UINT32*)sprptr == -1) continue;
+
+ attrs = sprptr[3]; /* YBBX.CCCC */
+ tile = sprptr[1] + (attrs<<2 & 0x100) + (~attrs<<4 & 0x200);
+ color = attrs & 0x0f;
+ y = (sprptr[0] + (attrs<<4 & 0x100) - scrolly) & 0x1ff;
+ x = (0x100 - (sprptr[2] + (attrs<<1 & 0x100) - scrollx)) & 0x1ff;
+ if (y > 512-16) y -= 512;
+ if (x > 512-16) x -= 512;
+
+ drawgfx(bitmap, gfx,
+ tile, color,
+ 0, 0,
+ x, y,
+ cliprect, TRANSPARENCY_PEN_TABLE, 7);
+ }
+}
+
+static VIDEO_UPDATE( aso )
+{
+ int attr, msbs, spsy, spsx, bgsy, bgsx, bank, i;
+
+ attr = (int)hal21_vreg[0];
+ msbs = (int)hal21_vreg[1];
+ spsy = (int)hal21_vreg[2] + (msbs<<5 & 0x100) + 9;
+ spsx = (int)hal21_vreg[3] + (msbs<<8 & 0x100) + 30;
+ bgsy = (int)hal21_vreg[4] + (msbs<<4 & 0x100) - 8;
+ bgsx = (int)hal21_vreg[5] - 16;
+
+ if (snk_gamegroup)
+ {
+ hal21_draw_background(machine, bitmap, cliprect, bgsx+(msbs<<7 & 0x100), bgsy, attr, machine->gfx[1]);
+
+ attr = snk_blink_parity;
+ snk_blink_parity ^= 0xdf;
+ for (i=6; i<0x80; i+=8) { palette_set_color(machine, i, MAKE_RGB(attr, attr, attr)); }
+
+ hal21_draw_sprites(bitmap, cliprect, spsx, spsy, machine->gfx[2]);
+ }
+ else
+ {
+ aso_draw_background(bitmap, cliprect, bgsx+(~msbs<<7 & 0x100), bgsy, attr, machine->gfx[1]);
+ aso_draw_sprites(bitmap, cliprect, spsx, spsy, machine->gfx[2]);
+ }
+
+ bank = msbs>>6 & 1;
+ tnk3_draw_text(machine, bitmap, cliprect, bank, &textram[0]);
+ tnk3_draw_status(machine, bitmap, cliprect, bank, &textram[0x400]);
+ return 0;
+}
+
+
+static INPUT_PORTS_START( hal21 )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("IN1") /* P1 controls */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("IN2") /* P2 controls */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0xc0, "20000 60000" )
+ PORT_DIPSETTING( 0x80, "40000 90000" )
+ PORT_DIPSETTING( 0x40, "50000 120000" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+
+ PORT_START_TAG("DSW2")
+ PORT_DIPNAME( 0x01, 0x01, "Bonus Type" )
+ PORT_DIPSETTING( 0x01, "Every Bonus Set" )
+ PORT_DIPSETTING( 0x00, "Second Bonus Set" )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x04, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x18, 0x18, "Special" )
+ PORT_DIPSETTING( 0x18, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Demo_Sounds) )
+ PORT_DIPSETTING( 0x08, "Infinite Lives" )
+ PORT_DIPSETTING( 0x00, "Freeze" )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) // 0x20 -> fe65
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ 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 ) )
+INPUT_PORTS_END
+
+/**************************************************************************/
+
+static INPUT_PORTS_START( aso )
+ PORT_START_TAG("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("DSW0")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C) )
+ PORT_DIPSETTING( 0x28, DEF_STR( 3C_1C) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 2C_1C) )
+ PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 1C_2C) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_3C) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_4C) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C) )
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0xc0, "50k 100k" )
+ PORT_DIPSETTING( 0x80, "60k 120k" )
+ PORT_DIPSETTING( 0x40, "100k 200k" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+
+ PORT_START_TAG("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, "Bonus Occurrence" )
+ PORT_DIPSETTING( 0x01, "1st & every 2nd" )
+ PORT_DIPSETTING( 0x00, "1st & 2nd only" )
+ PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Effect of some kind (Cheat)")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0xc0, 0xc0, "Start Area" )
+ PORT_DIPSETTING( 0xc0, "1" )
+ PORT_DIPSETTING( 0x80, "2" )
+ PORT_DIPSETTING( 0x40, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+INPUT_PORTS_END
+
+
+/**************************************************************************/
+
+static const gfx_layout char256 = {
+ 8,8,
+ 0x100,
+ 4,
+ { 0, 1, 2, 3 },
+ { 4, 0, 12, 8, 20, 16, 28, 24},
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
+ 256
+};
+
+static const gfx_layout char1024 = {
+ 8,8,
+ 0x400,
+ 4,
+ { 0, 1, 2, 3 },
+ { 4, 0, 12, 8, 20, 16, 28, 24},
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
+ 256
+};
+
+static const gfx_layout sprite1024 = {
+ 16,16,
+ 0x400,
+ 3,
+ { 2*1024*256,1*1024*256,0*1024*256 },
+ {
+ 7,6,5,4,3,2,1,0,
+ 15,14,13,12,11,10,9,8
+ },
+ {
+ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
+ 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16
+ },
+ 256
+};
+
+static GFXDECODE_START( aso )
+ /* colors 512-1023 are currently unused, I think they are a second bank */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, char256, 128*3, 8 ) /* colors 384..511 */
+ GFXDECODE_ENTRY( REGION_GFX2, 0, char1024, 128*1, 16 ) /* colors 128..383 */
+ GFXDECODE_ENTRY( REGION_GFX3, 0, sprite1024, 128*0, 16 ) /* colors 0..127 */
+GFXDECODE_END
+
+/**************************************************************************/
+
+static READ8_HANDLER( CPUC_ready_r ) { snk_sound_busy_bit = 0; return 0; }
+
+static READ8_HANDLER( hal21_input_port_0_r ) { return input_port_0_r(0) | snk_sound_busy_bit; }
+
+static WRITE8_HANDLER( hal21_soundcommand_w ) { hal21_sound_scheduler(1, data); }
+static WRITE8_HANDLER( hal21_soundack_w ) { hal21_sound_scheduler(2, data); }
+
+static READ8_HANDLER( hal21_soundcommand_r )
+{
+ int data = soundlatch_r(0);
+ soundlatch_clear_w(0, 0);
+ return data;
+}
+
+static WRITE8_HANDLER( aso_soundcommand_w )
+{
+ snk_sound_busy_bit = 0x20;
+ soundlatch_w(0, data);
+ cpunum_set_input_line( 2, 0, HOLD_LINE );
+}
+
+static INTERRUPT_GEN( hal21_sound_interrupt )
+{
+ hal21_sound_scheduler(3, 0);
+}
+
+/**************************************************************************/
+
+static ADDRESS_MAP_START( aso_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xbfff) AM_ROM
+ AM_RANGE(0xc000, 0xc7ff) AM_RAM
+ AM_RANGE(0xd000, 0xd000) AM_READ(hal21_soundcommand_r)
+ AM_RANGE(0xe000, 0xe000) AM_READ(CPUC_ready_r)
+ AM_RANGE(0xf000, 0xf000) AM_READWRITE(YM3526_status_port_0_r, YM3526_control_port_0_w) /* YM3526 #1 control port? */
+ AM_RANGE(0xf001, 0xf001) AM_WRITE(YM3526_write_port_0_w) /* YM3526 #1 write port? */
+ AM_RANGE(0xf002, 0xf002) AM_READNOP // unknown read
+ AM_RANGE(0xf004, 0xf004) AM_READNOP // unknown read
+ AM_RANGE(0xf006, 0xf006) AM_READNOP // unknown read
+ADDRESS_MAP_END
+
+/**************************************************************************/
+
+static ADDRESS_MAP_START( hal21_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_ROM
+ AM_RANGE(0x8000, 0x87ff) AM_RAM
+ AM_RANGE(0xa000, 0xa000) AM_READ(hal21_soundcommand_r)
+ AM_RANGE(0xc000, 0xc000) AM_READ(CPUC_ready_r)
+ AM_RANGE(0xe000, 0xe000) AM_WRITE(AY8910_control_port_0_w)
+ AM_RANGE(0xe001, 0xe001) AM_WRITE(AY8910_write_port_0_w)
+ AM_RANGE(0xe002, 0xe002) AM_WRITE(hal21_soundack_w) // bitfielded(0-5) acknowledge write, details unknown
+ AM_RANGE(0xe008, 0xe008) AM_WRITE(AY8910_control_port_1_w)
+ AM_RANGE(0xe009, 0xe009) AM_WRITE(AY8910_write_port_1_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( hal21_sound_portmap, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x0000, 0x0000) AM_NOP // external sound ROM detection?
+ADDRESS_MAP_END
+
+/**************************** ASO/Alpha Mission *************************/
+
+static ADDRESS_MAP_START( aso_cpuA_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xbfff) AM_ROM
+ AM_RANGE(0xc000, 0xc000) AM_READ(hal21_input_port_0_r) /* coin, start */
+ AM_RANGE(0xc100, 0xc100) AM_READ(input_port_1_r) /* P1 */
+ AM_RANGE(0xc200, 0xc200) AM_READ(input_port_2_r) /* P2 */
+ AM_RANGE(0xc400, 0xc400) AM_WRITE(aso_soundcommand_w)
+ AM_RANGE(0xc500, 0xc500) AM_READ(input_port_3_r) /* DSW1 */
+ AM_RANGE(0xc600, 0xc600) AM_READ(input_port_4_r) /* DSW2 */
+ AM_RANGE(0xc700, 0xc700) AM_READWRITE(snk_cpuB_nmi_trigger_r, snk_cpuA_nmi_ack_w)
+ AM_RANGE(0xc800, 0xc800) AM_WRITE(hal21_vreg1_w)
+ AM_RANGE(0xc900, 0xc900) AM_WRITE(hal21_vreg2_w)
+ AM_RANGE(0xca00, 0xca00) AM_WRITE(hal21_vreg3_w)
+ AM_RANGE(0xcb00, 0xcb00) AM_WRITE(hal21_vreg4_w)
+ AM_RANGE(0xcc00, 0xcc00) AM_WRITE(hal21_vreg5_w)
+ AM_RANGE(0xcd00, 0xcd00) AM_WRITE(hal21_vreg6_w)
+ AM_RANGE(0xce00, 0xce00) AM_WRITE(hal21_vreg7_w)
+ AM_RANGE(0xcf00, 0xcf00) AM_WRITE(hal21_vreg0_w)
+ AM_RANGE(0xdcf8, 0xdcf8) AM_WRITE(aso_scroll_sync_w) AM_BASE(&aso_scroll_sync)
+ AM_RANGE(0xd800, 0xe7ff) AM_RAM AM_SHARE(2)
+ AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE(&spriteram)
+ AM_RANGE(0xe800, 0xf7ff) AM_RAM AM_SHARE(3) AM_BASE(&videoram)
+ AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE(1) AM_BASE(&textram)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( aso_cpuB_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xbfff) AM_ROM
+ AM_RANGE(0xc000, 0xc000) AM_READWRITE(snk_cpuA_nmi_trigger_r, snk_cpuB_nmi_ack_w)
+ AM_RANGE(0xc800, 0xd7ff) AM_RAM AM_SHARE(2)
+ AM_RANGE(0xd800, 0xe7ff) AM_RAM AM_SHARE(3)
+ AM_RANGE(0xe800, 0xf7ff) AM_RAM
+ AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE(1)
+ADDRESS_MAP_END
+
+/**************************** HAL21 *************************/
+
+static ADDRESS_MAP_START( hal21_cpuA_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0xc000, 0xc000) AM_READ(hal21_input_port_0_r) /* coin, start */
+ AM_RANGE(0xc100, 0xc100) AM_READ(input_port_1_r) /* P1 */
+ AM_RANGE(0xc200, 0xc200) AM_READ(input_port_2_r) /* P2 */
+ AM_RANGE(0xc300, 0xc300) AM_WRITE(hal21_soundcommand_w)
+ AM_RANGE(0xc400, 0xc400) AM_READ(input_port_3_r) /* DSW1 */
+ AM_RANGE(0xc500, 0xc500) AM_READ(input_port_4_r) /* DSW2 */
+ AM_RANGE(0xc600, 0xc600) AM_WRITE(hal21_vreg0_w)
+ AM_RANGE(0xc700, 0xc700) AM_READWRITE(snk_cpuB_nmi_trigger_r, snk_cpuA_nmi_ack_w)
+ AM_RANGE(0xd300, 0xd300) AM_WRITE(hal21_vreg1_w)
+ AM_RANGE(0xd400, 0xd400) AM_WRITE(hal21_vreg2_w)
+ AM_RANGE(0xd500, 0xd500) AM_WRITE(hal21_vreg3_w)
+ AM_RANGE(0xd600, 0xd600) AM_WRITE(hal21_vreg4_w)
+ AM_RANGE(0xd700, 0xd700) AM_WRITE(hal21_vreg5_w)
+ AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE(2) AM_BASE(&spriteram)
+ AM_RANGE(0xf000, 0xffff) AM_RAM AM_SHARE(1)
+ AM_RANGE(0xf800, 0xffff) AM_RAM AM_BASE(&textram)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( hal21_cpuB_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x9fff) AM_ROM
+ AM_RANGE(0xa000, 0xa000) AM_WRITE(snk_cpuB_nmi_ack_w)
+ AM_RANGE(0xc000, 0xcfff) AM_RAM AM_SHARE(2)
+ AM_RANGE(0xd000, 0xdfff) AM_RAM AM_BASE(&videoram)
+ AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE(1)
+ADDRESS_MAP_END
+
+/**************************************************************************/
+
+static DRIVER_INIT( aso )
+{
+ hal21_vreg = auto_malloc(16);
+ snk_gamegroup = 0;
+}
+
+static DRIVER_INIT( hal21 )
+{
+ hal21_vreg = auto_malloc(24);
+ hal21_sndfifo = hal21_vreg + 8;
+ snk_gamegroup = 1;
+}
+
+static MACHINE_RESET( aso )
+{
+ memset(hal21_vreg, 0, 8);
+ hal21_sound_scheduler(0, 0);
+ snk_sound_busy_bit = 0;
+}
+
+static MACHINE_DRIVER_START( aso )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(aso_cpuA_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(aso_cpuB_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(aso_sound_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(100)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(36*8, 28*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1)
+ MDRV_GFXDECODE(aso)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_MACHINE_RESET(aso)
+
+ MDRV_PALETTE_INIT(aso)
+ MDRV_VIDEO_START(aso)
+ MDRV_VIDEO_UPDATE(aso)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM3526, 4000000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( hal21 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(hal21_cpuA_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(hal21_cpuB_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ /* audio CPU */
+ MDRV_CPU_PROGRAM_MAP(hal21_sound_map,0)
+ MDRV_CPU_IO_MAP(hal21_sound_portmap,0)
+ MDRV_CPU_VBLANK_INT(hal21_sound_interrupt,1)
+ MDRV_CPU_PERIODIC_INT(irq0_line_hold, 220) // music tempo, hand tuned
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(100)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_HIGHLIGHTS)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(36*8, 28*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1)
+ MDRV_GFXDECODE(aso)
+ MDRV_PALETTE_LENGTH(1024)
+
+ MDRV_MACHINE_RESET(aso)
+
+ MDRV_PALETTE_INIT(aso)
+ MDRV_VIDEO_START(aso)
+ MDRV_VIDEO_UPDATE(aso)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(AY8910, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MDRV_SOUND_ADD(AY8910, 1500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
+MACHINE_DRIVER_END
+
+/**************************************************************************/
+
+ROM_START( hal21 )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for CPUA code */
+ ROM_LOAD( "hal21p1.bin", 0x0000, 0x2000, CRC(9d193830) SHA1(8e4e9c8bc774d7c7c0b68a5fa5cabdc6b5cfa41b) )
+ ROM_LOAD( "hal21p2.bin", 0x2000, 0x2000, CRC(c1f00350) SHA1(8709455a980931565ccca60162a04c6c3133099b) )
+ ROM_LOAD( "hal21p3.bin", 0x4000, 0x2000, CRC(881d22a6) SHA1(4b2a65dc18620f7f77532f791212fccfe1f0b245) )
+ ROM_LOAD( "hal21p4.bin", 0x6000, 0x2000, CRC(ce692534) SHA1(e1d8e6948578ec9d0b6dc2aff17ad23b8ce46d6a) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for CPUB code */
+ ROM_LOAD( "hal21p5.bin", 0x0000, 0x2000, CRC(3ce0684a) SHA1(5e76770a3252d5565a8f11a79ac3a9a6c31a43e2) )
+ ROM_LOAD( "hal21p6.bin", 0x2000, 0x2000, CRC(878ef798) SHA1(0aae152947c9c6733b77dd1ac14f2f6d6bfabeaa) )
+ ROM_LOAD( "hal21p7.bin", 0x4000, 0x2000, CRC(72ebbe95) SHA1(b1f7dc535e7670647500391d21dfa971d5e342a2) )
+ ROM_LOAD( "hal21p8.bin", 0x6000, 0x2000, CRC(17e22ad3) SHA1(0e10a3c0f2e2ec284f4e0f1055397a8ccd1ff0f7) )
+ ROM_LOAD( "hal21p9.bin", 0x8000, 0x2000, CRC(b146f891) SHA1(0b2db3e14b0401a7914002c6f7c26933a1cba162) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 64k for sound code */
+ ROM_LOAD( "hal21p10.bin", 0x0000, 0x4000, CRC(916f7ba0) SHA1(7b8bcd59d768c4cd226de96895d3b9755bb3ba79) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "hal21p12.bin", 0x0000, 0x2000, CRC(9839a7cd) SHA1(d3f9d964263a64aa3648faf5eb2e4fa532ae7852) ) /* char */
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) /* background tiles */
+ ROM_LOAD( "hal21p11.bin", 0x0000, 0x4000, CRC(24abc57e) SHA1(1d7557a62adc059fb3fe20a09be18c2f40441581) )
+
+ ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) /* 16x16 sprites */
+ ROM_LOAD( "hal21p13.bin", 0x00000, 0x4000, CRC(052b4f4f) SHA1(032eb5771d33defce86e222f3e7aa22bc37db6db) )
+ ROM_RELOAD( 0x04000, 0x4000 )
+ ROM_LOAD( "hal21p14.bin", 0x08000, 0x4000, CRC(da0cb670) SHA1(1083bdd3488dfaa5094a2ef52cfc4206f35c9612) )
+ ROM_RELOAD( 0x0c000, 0x4000 )
+ ROM_LOAD( "hal21p15.bin", 0x10000, 0x4000, CRC(5c5ea945) SHA1(f9ce206cab4fad1f6478d731d4b096ec33e7b99f) )
+ ROM_RELOAD( 0x14000, 0x4000 )
+
+ ROM_REGION( 0x0c00, REGION_PROMS, 0 )
+ ROM_LOAD( "hal21_3.prm", 0x000, 0x400, CRC(605afff8) SHA1(94e80ebd574b1580dac4a2aebd57e3e767890c0d) )
+ ROM_LOAD( "hal21_2.prm", 0x400, 0x400, CRC(c5d84225) SHA1(cc2cd32f81ed7c1bcdd68e91d00f8081cb706ce7) )
+ ROM_LOAD( "hal21_1.prm", 0x800, 0x400, CRC(195768fc) SHA1(c88bc9552d57d52fb4b030d118f48fedccf563f4) )
+ROM_END
+
+ROM_START( hal21j )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for CPUA code */
+ ROM_LOAD( "hal21p1.bin", 0x0000, 0x2000, CRC(9d193830) SHA1(8e4e9c8bc774d7c7c0b68a5fa5cabdc6b5cfa41b) )
+ ROM_LOAD( "hal21p2.bin", 0x2000, 0x2000, CRC(c1f00350) SHA1(8709455a980931565ccca60162a04c6c3133099b) )
+ ROM_LOAD( "hal21p3.bin", 0x4000, 0x2000, CRC(881d22a6) SHA1(4b2a65dc18620f7f77532f791212fccfe1f0b245) )
+ ROM_LOAD( "hal21p4.bin", 0x6000, 0x2000, CRC(ce692534) SHA1(e1d8e6948578ec9d0b6dc2aff17ad23b8ce46d6a) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for CPUB code */
+ ROM_LOAD( "hal21p5.bin", 0x0000, 0x2000, CRC(3ce0684a) SHA1(5e76770a3252d5565a8f11a79ac3a9a6c31a43e2) )
+ ROM_LOAD( "hal21p6.bin", 0x2000, 0x2000, CRC(878ef798) SHA1(0aae152947c9c6733b77dd1ac14f2f6d6bfabeaa) )
+ ROM_LOAD( "hal21p7.bin", 0x4000, 0x2000, CRC(72ebbe95) SHA1(b1f7dc535e7670647500391d21dfa971d5e342a2) )
+ ROM_LOAD( "hal21p8.bin", 0x6000, 0x2000, CRC(17e22ad3) SHA1(0e10a3c0f2e2ec284f4e0f1055397a8ccd1ff0f7) )
+ ROM_LOAD( "hal21p9.bin", 0x8000, 0x2000, CRC(b146f891) SHA1(0b2db3e14b0401a7914002c6f7c26933a1cba162) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 64k for sound code */
+ ROM_LOAD( "hal21-10.bin", 0x0000, 0x4000, CRC(a182b3f0) SHA1(b76eff97a58a96467e9f3a74125a0a770e7678f8) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "hal21p12.bin", 0x0000, 0x2000, CRC(9839a7cd) SHA1(d3f9d964263a64aa3648faf5eb2e4fa532ae7852) ) /* char */
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) /* background tiles */
+ ROM_LOAD( "hal21p11.bin", 0x0000, 0x4000, CRC(24abc57e) SHA1(1d7557a62adc059fb3fe20a09be18c2f40441581) )
+
+ ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) /* 16x16 sprites */
+ ROM_LOAD( "hal21p13.bin", 0x00000, 0x4000, CRC(052b4f4f) SHA1(032eb5771d33defce86e222f3e7aa22bc37db6db) )
+ ROM_RELOAD( 0x04000, 0x4000 )
+ ROM_LOAD( "hal21p14.bin", 0x08000, 0x4000, CRC(da0cb670) SHA1(1083bdd3488dfaa5094a2ef52cfc4206f35c9612) )
+ ROM_RELOAD( 0x0c000, 0x4000 )
+ ROM_LOAD( "hal21p15.bin", 0x10000, 0x4000, CRC(5c5ea945) SHA1(f9ce206cab4fad1f6478d731d4b096ec33e7b99f) )
+ ROM_RELOAD( 0x14000, 0x4000 )
+
+ ROM_REGION( 0x0c00, REGION_PROMS, 0 )
+ ROM_LOAD( "hal21_3.prm", 0x000, 0x400, CRC(605afff8) SHA1(94e80ebd574b1580dac4a2aebd57e3e767890c0d) )
+ ROM_LOAD( "hal21_2.prm", 0x400, 0x400, CRC(c5d84225) SHA1(cc2cd32f81ed7c1bcdd68e91d00f8081cb706ce7) )
+ ROM_LOAD( "hal21_1.prm", 0x800, 0x400, CRC(195768fc) SHA1(c88bc9552d57d52fb4b030d118f48fedccf563f4) )
+ROM_END
+
+ROM_START( aso )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for cpuA code */
+ ROM_LOAD( "p1.bin", 0x0000, 0x8000, CRC(3fc9d5e4) SHA1(1318904d3d896affd5affd8e475ac9ee6929b955) )
+ ROM_LOAD( "p3.bin", 0x8000, 0x4000, CRC(39a666d2) SHA1(b5426520eb600d44bc5566d742d7b88194076494) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for cpuB code */
+ ROM_LOAD( "p4.bin", 0x0000, 0x8000, CRC(2429792b) SHA1(674e81880f359f7e8d34d0ad9074267360afadbf) )
+ ROM_LOAD( "p6.bin", 0x8000, 0x4000, CRC(c0bfdf1f) SHA1(65b15ce9c2e78df79cb603c58639421d29701633) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 64k for sound code */
+ ROM_LOAD( "p7.bin", 0x0000, 0x8000, CRC(49258162) SHA1(c265b79d012be1e065389f910f7b4ce61f5b27ce) ) /* YM3526 */
+ ROM_LOAD( "p9.bin", 0x8000, 0x4000, CRC(aef5a4f4) SHA1(e908e79e27ff892fe75d1ba5cb0bc9dc6b7b4268) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) /* characters */
+ ROM_LOAD( "p14.bin", 0x0000, 0x2000, CRC(8baa2253) SHA1(e6e4a5aa005e89744c4e2a19a080cf322edc6b52) )
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) /* background tiles */
+ ROM_LOAD( "p10.bin", 0x0000, 0x8000, CRC(00dff996) SHA1(4f6ce4c0f2da0d2a711bcbf9aa998b4e31d0d9bf) )
+
+ ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) /* 16x16 sprites */
+ ROM_LOAD( "p11.bin", 0x00000, 0x8000, CRC(7feac86c) SHA1(13b81f006ec587583416c1e7432da4c3f0375924) )
+ ROM_LOAD( "p12.bin", 0x08000, 0x8000, CRC(6895990b) SHA1(e84554cae9a768021c3dc7183bc3d28e2dd768ee) )
+ ROM_LOAD( "p13.bin", 0x10000, 0x8000, CRC(87a81ce1) SHA1(28c1069e6c08ecd579f99620c1cb6df01ad1aa74) )
+
+ ROM_REGION( 0x0c00, REGION_PROMS, 0 )
+ ROM_LOAD( "mb7122h.f12", 0x000, 0x00400, CRC(5b0a0059) SHA1(f61e17c8959f1cd6cc12b38f2fb7c6190ebd0e0c) )
+ ROM_LOAD( "mb7122h.f13", 0x400, 0x00400, CRC(37e28dd8) SHA1(681726e490872a574dd0295823a44d64ef3a7b45) )
+ ROM_LOAD( "mb7122h.f14", 0x800, 0x00400, CRC(c3fd1dd3) SHA1(c48030cc458f0bebea0ffccf3d3c43260da6a7fb) )
+
+ ROM_REGION( 0x0600, REGION_PLDS, ROMREGION_DISPOSE )
+ ROM_LOAD( "pal16l8a-1.bin", 0x0000, 0x0104, CRC(4e3f9e0d) SHA1(de448d50c0d1cdef159a8c4028846142210eba0b) )
+ ROM_LOAD( "pal16l8a-2.bin", 0x0200, 0x0104, CRC(2a681f9e) SHA1(b26eb631d3e4fa6850a109a9a63d377cf86923bc) )
+ ROM_LOAD( "pal16r6a.bin", 0x0400, 0x0104, CRC(59c03681) SHA1(d21090b35596c28d44862782386e84dfc1feff0c) )
+ROM_END
+
+ROM_START( alphamis )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for cpuA code */
+ ROM_LOAD( "p1.rom", 0x0000, 0x4000, CRC(69af874b) SHA1(11a13574614e7e3b9e33c2b2827571946a805376) )
+ ROM_LOAD( "p2.rom", 0x4000, 0x4000, CRC(7707bfe3) SHA1(fb1f4ef862f6762d2479e537fc67a819d11ace76) )
+ ROM_LOAD( "p3.rom", 0x8000, 0x4000, CRC(b970d642) SHA1(d3a8045f05f001e5e2fae8ef7900cf87ab17fc74) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for cpuB code */
+ ROM_LOAD( "p4.rom", 0x0000, 0x4000, CRC(91a89d3c) SHA1(46ef8718c81aac2f09dd1884538750edf9662760) )
+ ROM_LOAD( "p5.rom", 0x4000, 0x4000, CRC(9879e506) SHA1(0bce5fcb9d05ce77cd8e9ad1cac04ef617928db0) )
+ ROM_LOAD( "p6.bin", 0x8000, 0x4000, CRC(c0bfdf1f) SHA1(65b15ce9c2e78df79cb603c58639421d29701633) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 64k for sound code */
+ ROM_LOAD( "p7.rom", 0x0000, 0x4000, CRC(dbc19736) SHA1(fe365d70ead8243374979d2162c395fed9870405) ) /* YM3526 */
+ ROM_LOAD( "p8.rom", 0x4000, 0x4000, CRC(537726a9) SHA1(ddf66946be71d2e6ab2cc53150e3b36d45dde2eb) )
+ ROM_LOAD( "p9.bin", 0x8000, 0x4000, CRC(aef5a4f4) SHA1(e908e79e27ff892fe75d1ba5cb0bc9dc6b7b4268) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) /* characters */
+ ROM_LOAD( "p14.rom", 0x0000, 0x2000, CRC(acbe29b2) SHA1(e304c6d30888fa7549d25e6329ba94d5088bd8b7) )
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) /* background tiles */
+ ROM_LOAD( "p10.bin", 0x0000, 0x8000, CRC(00dff996) SHA1(4f6ce4c0f2da0d2a711bcbf9aa998b4e31d0d9bf) )
+
+ ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) /* 16x16 sprites */
+ ROM_LOAD( "p11.bin", 0x00000, 0x8000, CRC(7feac86c) SHA1(13b81f006ec587583416c1e7432da4c3f0375924) )
+ ROM_LOAD( "p12.bin", 0x08000, 0x8000, CRC(6895990b) SHA1(e84554cae9a768021c3dc7183bc3d28e2dd768ee) )
+ ROM_LOAD( "p13.bin", 0x10000, 0x8000, CRC(87a81ce1) SHA1(28c1069e6c08ecd579f99620c1cb6df01ad1aa74) )
+
+ ROM_REGION( 0x0c00, REGION_PROMS, 0 )
+ ROM_LOAD( "mb7122h.f12", 0x000, 0x00400, CRC(5b0a0059) SHA1(f61e17c8959f1cd6cc12b38f2fb7c6190ebd0e0c) )
+ ROM_LOAD( "mb7122h.f13", 0x400, 0x00400, CRC(37e28dd8) SHA1(681726e490872a574dd0295823a44d64ef3a7b45) )
+ ROM_LOAD( "mb7122h.f14", 0x800, 0x00400, CRC(c3fd1dd3) SHA1(c48030cc458f0bebea0ffccf3d3c43260da6a7fb) )
+
+ ROM_REGION( 0x0600, REGION_PLDS, ROMREGION_DISPOSE )
+ ROM_LOAD( "pal16l8a-1.bin", 0x0000, 0x0104, CRC(4e3f9e0d) SHA1(de448d50c0d1cdef159a8c4028846142210eba0b) )
+ ROM_LOAD( "pal16l8a-2.bin", 0x0200, 0x0104, CRC(2a681f9e) SHA1(b26eb631d3e4fa6850a109a9a63d377cf86923bc) )
+ ROM_LOAD( "pal16r6a.bin", 0x0400, 0x0104, CRC(59c03681) SHA1(d21090b35596c28d44862782386e84dfc1feff0c) )
+ROM_END
+
+ROM_START( arian )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for cpuA code */
+ ROM_LOAD( "p1.d8", 0x0000, 0x4000, CRC(0ca89307) SHA1(d0ecb97b1e147a4001a4383fd5709394e2358a45) ) /* roms that differ from above sets all had a red stripe on the label */
+ ROM_LOAD( "p2.d7", 0x4000, 0x4000, CRC(724518c3) SHA1(debbfe2a485af5f452d208a04705dbd48d47d90f) ) /* IE: P1 through P4 and P14 */
+ ROM_LOAD( "p3.d6", 0x8000, 0x4000, CRC(4d8db650) SHA1(184141847d38077737ee7140861d94832018e2e2) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for cpuB code */
+ ROM_LOAD( "p4.d3", 0x0000, 0x4000, CRC(47baf1db) SHA1(3947a679745811e5499d690f2b73b4f28b1d47f9) )
+ ROM_LOAD( "p5.rom", 0x4000, 0x4000, CRC(9879e506) SHA1(0bce5fcb9d05ce77cd8e9ad1cac04ef617928db0) )
+ ROM_LOAD( "p6.bin", 0x8000, 0x4000, CRC(c0bfdf1f) SHA1(65b15ce9c2e78df79cb603c58639421d29701633) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* 64k for sound code */
+ ROM_LOAD( "p7.rom", 0x0000, 0x4000, CRC(dbc19736) SHA1(fe365d70ead8243374979d2162c395fed9870405) ) /* YM3526 */
+ ROM_LOAD( "p8.rom", 0x4000, 0x4000, CRC(537726a9) SHA1(ddf66946be71d2e6ab2cc53150e3b36d45dde2eb) )
+ ROM_LOAD( "p9.bin", 0x8000, 0x4000, CRC(aef5a4f4) SHA1(e908e79e27ff892fe75d1ba5cb0bc9dc6b7b4268) )
+
+ ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) /* characters */
+ ROM_LOAD( "p14.h1", 0x0000, 0x2000, CRC(e599bd30) SHA1(bf70aae9a15d548bb532ca1fc8d7220dfa150d6e) )
+
+ ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) /* background tiles */
+ ROM_LOAD( "p10.bin", 0x0000, 0x8000, CRC(00dff996) SHA1(4f6ce4c0f2da0d2a711bcbf9aa998b4e31d0d9bf) )
+
+ ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) /* 16x16 sprites */
+ ROM_LOAD( "p11.bin", 0x00000, 0x8000, CRC(7feac86c) SHA1(13b81f006ec587583416c1e7432da4c3f0375924) )
+ ROM_LOAD( "p12.bin", 0x08000, 0x8000, CRC(6895990b) SHA1(e84554cae9a768021c3dc7183bc3d28e2dd768ee) )
+ ROM_LOAD( "p13.bin", 0x10000, 0x8000, CRC(87a81ce1) SHA1(28c1069e6c08ecd579f99620c1cb6df01ad1aa74) )
+
+ ROM_REGION( 0x0c00, REGION_PROMS, 0 )
+ ROM_LOAD( "mb7122h.f12", 0x000, 0x00400, CRC(5b0a0059) SHA1(f61e17c8959f1cd6cc12b38f2fb7c6190ebd0e0c) )
+ ROM_LOAD( "mb7122h.f13", 0x400, 0x00400, CRC(37e28dd8) SHA1(681726e490872a574dd0295823a44d64ef3a7b45) )
+ ROM_LOAD( "mb7122h.f14", 0x800, 0x00400, CRC(c3fd1dd3) SHA1(c48030cc458f0bebea0ffccf3d3c43260da6a7fb) )
+
+ ROM_REGION( 0x0600, REGION_PLDS, ROMREGION_DISPOSE )
+ ROM_LOAD( "pal16l8a-1.bin", 0x0000, 0x0104, CRC(4e3f9e0d) SHA1(de448d50c0d1cdef159a8c4028846142210eba0b) )
+ ROM_LOAD( "pal16l8a-2.bin", 0x0200, 0x0104, CRC(2a681f9e) SHA1(b26eb631d3e4fa6850a109a9a63d377cf86923bc) )
+ ROM_LOAD( "pal16r6a.bin", 0x0400, 0x0104, CRC(59c03681) SHA1(d21090b35596c28d44862782386e84dfc1feff0c) )
+ROM_END
+
+GAME( 1985, aso, 0, aso, aso, aso, ROT270, "SNK", "ASO - Armored Scrum Object", GAME_NO_COCKTAIL )
+GAME( 1985, alphamis, aso, aso, aso, aso, ROT270, "SNK", "Alpha Mission", GAME_NO_COCKTAIL )
+GAME( 1985, arian, aso, aso, aso, aso, ROT270, "SNK", "Arian Mission", GAME_NO_COCKTAIL )
+GAME( 1985, hal21, 0, hal21, hal21, hal21, ROT270, "SNK", "HAL21", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )
+GAME( 1985, hal21j, hal21, hal21, hal21, hal21, ROT270, "SNK", "HAL21 (Japan)", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )