summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/skyarmy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/skyarmy.c')
-rw-r--r--src/mame/drivers/skyarmy.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/src/mame/drivers/skyarmy.c b/src/mame/drivers/skyarmy.c
new file mode 100644
index 00000000000..1da31536e7f
--- /dev/null
+++ b/src/mame/drivers/skyarmy.c
@@ -0,0 +1,311 @@
+/*
+ 05/01/2003 MooglyGuy/Ryan Holtz
+ - Corrected second AY (shouldn't have been there)
+ - Added first AY's status read
+ - Added coinage DIP
+ - What the hell are those unmapped port writes!? Not AY...
+
+ 2003.01.01. Tomasz Slanina
+
+ changes :
+ - nmi generation ( incorrect freq probably)
+ - music/sfx (partially)
+ - more sprite tiles (twice than before)
+ - fixed sprites flips
+ - scrolling (2nd game level)
+ - better colors (weird 'hack' .. but works in most cases ( comparing with screens from emustatus ))
+ - dips - lives
+ - visible area .. a bit smaller (at least bg 'generation' is not visible for scrolling levels )
+ - cpu clock .. now 4 mhz
+*/
+
+
+#include "driver.h"
+#include "sound/ay8910.h"
+
+static UINT8 *skyarmy_videoram;
+static UINT8 *skyarmy_colorram;
+static UINT8 *skyarmy_scrollram;
+static tilemap* skyarmy_tilemap;
+
+static TILE_GET_INFO( get_skyarmy_tile_info )
+{
+ int code = skyarmy_videoram[tile_index];
+ int attr = skyarmy_colorram[tile_index];
+
+ /* bit 0 <-> bit 2 ????? */
+ switch(attr)
+ {
+ case 1: attr=4; break;
+ case 3: attr=6; break;
+ case 4: attr=1; break;
+ case 6: attr=3; break;
+ }
+
+ SET_TILE_INFO( 0, code, attr, 0);
+}
+
+static WRITE8_HANDLER( skyarmy_videoram_w )
+{
+ skyarmy_videoram[offset] = data;
+ tilemap_mark_tile_dirty(skyarmy_tilemap,offset);
+}
+
+static WRITE8_HANDLER( skyarmy_colorram_w )
+{
+ skyarmy_colorram[offset] = data;
+ tilemap_mark_tile_dirty(skyarmy_tilemap,offset);
+}
+
+static WRITE8_HANDLER( skyarmy_scrollram_w )
+{
+ skyarmy_scrollram[offset] = data;
+}
+
+
+static READ8_HANDLER( skyarmy_scrollram_r )
+{
+ return skyarmy_scrollram[offset];
+}
+
+
+static PALETTE_INIT( skyarmy )
+{
+ int i;
+
+ for (i = 0;i < 32;i++)
+ {
+ int bit0,bit1,bit2,r,g,b;
+
+ bit0 = (*color_prom >> 0) & 0x01;
+ bit1 = (*color_prom >> 1) & 0x01;
+ bit2 = (*color_prom >> 2) & 0x01;
+ r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ bit0 = (*color_prom >> 3) & 0x01;
+ bit1 = (*color_prom >> 4) & 0x01;
+ bit2 = (*color_prom >> 5) & 0x01;
+ g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ bit0=0;
+ bit1 = (*color_prom >> 6) & 0x01;
+ bit2 = (*color_prom >> 7) & 0x01;
+ b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+ color_prom++;
+ }
+}
+
+static VIDEO_START( skyarmy )
+{
+ skyarmy_tilemap = tilemap_create(get_skyarmy_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32);
+ tilemap_set_scroll_cols(skyarmy_tilemap,32);
+}
+
+
+static VIDEO_UPDATE( skyarmy )
+{
+ int sx, sy, flipx, flipy, offs,pal;
+ int i;
+ for(i=0;i<0x20;i++)tilemap_set_scrolly( skyarmy_tilemap,i,skyarmy_scrollram[i]);
+
+ tilemap_draw(bitmap,cliprect,skyarmy_tilemap,0,0);
+
+ for (offs = 0 ; offs < 0x40; offs+=4)
+ {
+
+ pal=spriteram[offs+2]&0x7;
+
+ switch(pal)
+ {
+ case 1: pal=4; break;
+ case 2: pal=2; break;
+ case 3: pal=6; break;
+ case 4: pal=1; break;
+ case 6: pal=3; break;
+ }
+ sx = spriteram[offs+3];
+ sy = 242-spriteram[offs];
+ flipy = (spriteram[offs+1]&0x80)>>7;
+ flipx = (spriteram[offs+1]&0x40)>>6;
+ drawgfx(bitmap,machine->gfx[1],
+ spriteram[offs+1]&0x3f,
+ pal,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+ return 0;
+}
+
+static int skyarmy_nmi=0;
+
+static INTERRUPT_GEN( skyarmy_nmi_source )
+{
+ if(skyarmy_nmi) cpunum_set_input_line(0,INPUT_LINE_NMI, PULSE_LINE) ;
+}
+
+
+static WRITE8_HANDLER( nmi_enable_w )
+{
+ skyarmy_nmi=data&1;
+}
+
+
+static ADDRESS_MAP_START( skyarmy_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7FFF) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0x87FF) AM_READ(MRA8_RAM)
+ AM_RANGE(0x8800, 0x93FF) AM_READ(MRA8_RAM) /* Video RAM */
+ AM_RANGE(0x9800, 0x983F) AM_READ(MRA8_RAM) /* Sprites */
+ AM_RANGE(0x9840, 0x985F) AM_READ(skyarmy_scrollram_r) /* Sroll RAM */
+ AM_RANGE(0xA000, 0xA000) AM_READ(input_port_0_r)
+ AM_RANGE(0xA001, 0xA001) AM_READ(input_port_1_r)
+ AM_RANGE(0xA002, 0xA002) AM_READ(input_port_2_r)
+ AM_RANGE(0xA003, 0xA003) AM_READ(input_port_3_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( skyarmy_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7FFF) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x87FF) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x8800, 0x8BFF) AM_WRITE(skyarmy_videoram_w) AM_BASE(&skyarmy_videoram) /* Video RAM */
+ AM_RANGE(0x9000, 0x93FF) AM_WRITE(skyarmy_colorram_w) AM_BASE(&skyarmy_colorram) /* Color RAM */
+ AM_RANGE(0x9800, 0x983F) AM_WRITE(spriteram_w) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) /* Sprites */
+ AM_RANGE(0x9840, 0x985F) AM_WRITE(skyarmy_scrollram_w) AM_BASE(&skyarmy_scrollram) /* Sprites */
+ AM_RANGE(0xa004, 0xa004) AM_WRITE(nmi_enable_w) // ???
+ AM_RANGE(0xa005, 0xa005) AM_WRITE(MWA8_NOP)
+ AM_RANGE(0xa006, 0xa006) AM_WRITE(MWA8_NOP)
+ AM_RANGE(0xa007, 0xa007) AM_WRITE(MWA8_NOP)
+ADDRESS_MAP_END
+
+static INPUT_PORTS_START( skyarmy )
+ PORT_START
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "2" )
+ PORT_DIPSETTING( 0x01, "3" )
+ PORT_DIPSETTING( 0x02, "4" )
+ PORT_DIPSETTING( 0x03, DEF_STR (Free_Play ))
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
+ /* coinage - bits 4-7 ? */
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0xC0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0xC0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON6 )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON7 )
+
+INPUT_PORTS_END
+
+static const gfx_layout charlayout =
+{
+ 8,8,
+ 256,
+ 2,
+ { 0, 256*8*8 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16,
+ 32*2,
+ 2,
+ { 0, 256*8*8 },
+ { 0, 1, 2, 3, 4, 5, 6, 7,
+ 8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
+ 16*8,17*8,18*8,19*8,20*8,21*8,22*8,23*8 },
+ 32*8
+};
+
+static GFXDECODE_START( skyarmy )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 32 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, spritelayout, 0, 32 )
+GFXDECODE_END
+
+static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x06, 0x06) AM_READ(AY8910_read_port_0_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
+ AM_RANGE(0x04, 0x04) AM_WRITE(AY8910_control_port_0_w)
+ AM_RANGE(0x05, 0x05) AM_WRITE(AY8910_write_port_0_w)
+ADDRESS_MAP_END
+
+static MACHINE_DRIVER_START( skyarmy )
+ MDRV_CPU_ADD(Z80,4000000)
+ MDRV_CPU_PROGRAM_MAP(skyarmy_readmem,skyarmy_writemem)
+ MDRV_CPU_IO_MAP(readport,writeport)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+ MDRV_CPU_PERIODIC_INT(skyarmy_nmi_source,650) /* Hz */
+
+ /* video hardware */
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8,32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8,32*8-1,1*8,31*8-1)
+ MDRV_GFXDECODE(skyarmy)
+ MDRV_PALETTE_LENGTH(32)
+
+ MDRV_PALETTE_INIT(skyarmy)
+ MDRV_VIDEO_START(skyarmy)
+ MDRV_VIDEO_UPDATE(skyarmy)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+ MDRV_SOUND_ADD(AY8910, 2500000)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
+MACHINE_DRIVER_END
+
+
+ROM_START( skyarmy )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "a1h.bin", 0x0000, 0x2000, CRC(e3fb9d70) SHA1(b8e3a6d7d6ef30c1397f9b741132c5257c16be2d) )
+ ROM_LOAD( "a2h.bin", 0x2000, 0x2000, CRC(0417653e) SHA1(4f6ad7335b5b7e85b4e16cce3c127488c02401b2) )
+ ROM_LOAD( "a3h.bin", 0x4000, 0x2000, CRC(95485e56) SHA1(c4cbcd31ba68769d2d0d0875e2a92982265339ae) )
+ ROM_LOAD( "j4.bin", 0x6000, 0x2000, CRC(843783df) SHA1(256d8375a8af7de080d456dbc6290a22473d011b) )
+
+ ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "13b.bin", 0x0000, 0x0800, CRC(3b0e0f7c) SHA1(2bbba10121d3e745146f50c14dc6df97de40fb96) )
+ ROM_LOAD( "15b.bin", 0x0800, 0x0800, CRC(5ccfd782) SHA1(408406ae068e5578b8a742abed1c37dcd3720fe5) )
+
+ ROM_REGION( 0x1000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "8b.bin", 0x0000, 0x0800, CRC(6ac6bd98) SHA1(e653d80ec1b0f8e07821ea781942dae3de7d238d) )
+ ROM_LOAD( "10b.bin", 0x0800, 0x0800, CRC(cada7682) SHA1(83ce8336274cb8006a445ac17a179d9ffd4d6809) )
+
+ ROM_REGION( 0x0020, REGION_PROMS, 0 )
+ ROM_LOAD( "a6.bin", 0x0000, 0x0020, CRC(c721220b) SHA1(61b3320fb616c0600d56840cb6438616c7e0c6eb) )
+ROM_END
+
+GAME( 1982, skyarmy, 0, skyarmy, skyarmy, 0, ROT90, "Shoei", "Sky Army", GAME_WRONG_COLORS )