diff options
Diffstat (limited to 'src/mame/drivers/hal21.c')
-rw-r--r-- | src/mame/drivers/hal21.c | 975 |
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 ) |