summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/ace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/ace.c')
-rw-r--r--src/mame/drivers/ace.c363
1 files changed, 363 insertions, 0 deletions
diff --git a/src/mame/drivers/ace.c b/src/mame/drivers/ace.c
new file mode 100644
index 00000000000..09243a0d34c
--- /dev/null
+++ b/src/mame/drivers/ace.c
@@ -0,0 +1,363 @@
+/****************************************************************************
+
+Ace by Allied Leisure
+
+Driver by Jarek Burczynski
+2002.09.19
+
+
+
+Allied Leisure 1976
+"MAJOR MFG. INC. SUNNYVALE, CA" in PCB etch
+
+18MHz
+ 5MHz
+
+8080
+
+
+2101
+2101
+
+
+A5 3106 3106 3106
+A4
+A3 3622.K4
+A2 2101
+A1 2101 2101
+
+ [ RANGE ] [ TIME ]
+ (two 0-9 thumbwheel switches)
+
+
+5x2101 - SRAM 256x4
+3x3106 - SRAM 256x1
+1x3622 - ROM 512x4
+
+
+****************************************************************************/
+
+#include "driver.h"
+
+
+static UINT8 *ace_scoreram;
+static UINT8 *ace_ram2;
+static UINT8 *ace_characterram;
+
+
+static int objpos[8];
+
+static WRITE8_HANDLER( ace_objpos_w )
+{
+ objpos[offset]=data;
+}
+
+#if 0
+static READ8_HANDLER( ace_objpos_r )
+{
+ return objpos[offset];
+}
+#endif
+
+static VIDEO_UPDATE( ace )
+{
+ int offs;
+
+ decodechar(machine->gfx[1], 0, ace_characterram, machine->drv->gfxdecodeinfo[1].gfxlayout);
+ decodechar(machine->gfx[2], 0, ace_characterram, machine->drv->gfxdecodeinfo[2].gfxlayout);
+ decodechar(machine->gfx[3], 0, ace_characterram, machine->drv->gfxdecodeinfo[3].gfxlayout);
+
+ for (offs = 0; offs < 8; offs++)
+ {
+ decodechar(machine->gfx[4], offs, ace_scoreram, machine->drv->gfxdecodeinfo[4].gfxlayout);
+ }
+
+ /* first of all, fill the screen with the background color */
+ fillbitmap(bitmap, machine->pens[0], cliprect);
+
+
+ drawgfx(bitmap,machine->gfx[1],
+ 0,
+ 0,
+ 0,0,
+ objpos[0],objpos[1],
+ cliprect,TRANSPARENCY_NONE,0);
+
+ drawgfx(bitmap,machine->gfx[2],
+ 0,
+ 0,
+ 0,0,
+ objpos[2],objpos[3],
+ cliprect,TRANSPARENCY_NONE,0);
+
+ drawgfx(bitmap,machine->gfx[3],
+ 0,
+ 0,
+ 0,0,
+ objpos[4],objpos[5],
+ cliprect,TRANSPARENCY_NONE,0);
+
+ for (offs = 0; offs < 8; offs++)
+ {
+ drawgfx(bitmap,machine->gfx[4],
+ offs,
+ 0,
+ 0,0,
+ 10*8+offs*16,256-16, /* ?? */
+ cliprect,TRANSPARENCY_NONE,0);
+ }
+ return 0;
+}
+
+
+static PALETTE_INIT( ace )
+{
+ palette_set_color(machine,0,MAKE_RGB(0x10,0x20,0xd0)); /* light bluish */
+ palette_set_color(machine,1,MAKE_RGB(0xff,0xff,0xff)); /* white */
+}
+
+
+static READ8_HANDLER( ace_characterram_r )
+{
+ return ace_characterram[offset];
+}
+
+static WRITE8_HANDLER( ace_characterram_w )
+{
+ if (ace_characterram[offset] != data)
+ {
+ if (data&(~0x07))
+ {
+ logerror("write to %04x data=%02x\n", 0x8000+offset, data);
+ popmessage("write to %04x data=%02x\n", 0x8000+offset, data);
+ }
+ ace_characterram[offset] = data;
+ }
+}
+
+
+static READ8_HANDLER( unk_r )
+{
+ return mame_rand(Machine)&0xff;
+}
+
+
+static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 )
+
+ AM_RANGE(0x0000, 0x09ff) AM_READ(MRA8_ROM)
+
+ AM_RANGE(0x2000, 0x20ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x8300, 0x83ff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x8000, 0x80ff) AM_READ(ace_characterram_r)
+
+ /* players inputs */
+ AM_RANGE(0xc008, 0xc008) AM_READ(input_port_0_r)
+ AM_RANGE(0xc009, 0xc009) AM_READ(input_port_1_r)
+ AM_RANGE(0xc00a, 0xc00a) AM_READ(input_port_2_r)
+ AM_RANGE(0xc00b, 0xc00b) AM_READ(input_port_3_r)
+ AM_RANGE(0xc00c, 0xc00c) AM_READ(input_port_4_r)
+ AM_RANGE(0xc00d, 0xc00d) AM_READ(input_port_5_r)
+ AM_RANGE(0xc00e, 0xc00e) AM_READ(input_port_6_r)
+ AM_RANGE(0xc00f, 0xc00f) AM_READ(input_port_7_r)
+ AM_RANGE(0xc010, 0xc010) AM_READ(input_port_8_r)
+ AM_RANGE(0xc011, 0xc011) AM_READ(input_port_9_r)
+
+ AM_RANGE(0xc012, 0xc012) AM_READ(unk_r)
+
+ /* vblank */
+ AM_RANGE(0xc014, 0xc014) AM_READ(input_port_10_r)
+
+ /* coin */
+ AM_RANGE(0xc015, 0xc015) AM_READ(input_port_11_r)
+
+ /* start (must read 1 at least once to make the game run) */
+ AM_RANGE(0xc016, 0xc016) AM_READ(input_port_12_r)
+
+ AM_RANGE(0xc017, 0xc017) AM_READ(unk_r)
+ AM_RANGE(0xc018, 0xc018) AM_READ(unk_r)
+ AM_RANGE(0xc019, 0xc019) AM_READ(unk_r)
+
+ AM_RANGE(0xc020, 0xc020) AM_READ(unk_r)
+ AM_RANGE(0xc021, 0xc021) AM_READ(unk_r)
+ AM_RANGE(0xc022, 0xc022) AM_READ(unk_r)
+ AM_RANGE(0xc023, 0xc023) AM_READ(unk_r)
+ AM_RANGE(0xc024, 0xc024) AM_READ(unk_r)
+ AM_RANGE(0xc025, 0xc025) AM_READ(unk_r)
+ AM_RANGE(0xc026, 0xc026) AM_READ(unk_r)
+
+ADDRESS_MAP_END
+
+/* 5x2101 - SRAM 256x4 */
+/* 3x3106 - SRAM 256x1 */
+/* 1x3622 - ROM 512x4 - doesn't seem to be used ????????????*/
+
+static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x09ff) AM_WRITE(MWA8_ROM)
+
+ AM_RANGE(0x2000, 0x20ff) AM_WRITE(MWA8_RAM) AM_BASE(&ace_scoreram) /* 2x2101 */
+ AM_RANGE(0x8300, 0x83ff) AM_WRITE(MWA8_RAM) AM_BASE(&ace_ram2) /* 2x2101 */
+ AM_RANGE(0x8000, 0x80ff) AM_WRITE(ace_characterram_w) AM_BASE(&ace_characterram) /* 3x3101 (3bits: 0, 1, 2) */
+
+ AM_RANGE(0xc000, 0xc005) AM_WRITE(ace_objpos_w)
+ADDRESS_MAP_END
+
+
+static INPUT_PORTS_START( ace )
+
+ PORT_START_TAG("c008") /* player thrust */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("P1 Thrust")
+
+ PORT_START_TAG("c009") /* player slowdown */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("P1 Slowdown")
+
+ PORT_START_TAG("c00a") /* player left */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+
+ PORT_START_TAG("c00b") /* player right */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+
+ PORT_START_TAG("c00c") /* player fire */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Fire")
+
+ PORT_START_TAG("c00d") /* enemy thrust */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_NAME("P2 Thrust")
+
+ PORT_START_TAG("c00e") /* enemy slowdown */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_NAME("P2 Slowdown")
+
+ PORT_START_TAG("c00f") /* enemy left */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+
+ PORT_START_TAG("c010") /* enemy right */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+
+ PORT_START_TAG("c011") /* enemy fire */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fire")
+
+//c012
+
+
+ PORT_START_TAG("c014") /* VBLANK??? */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK )
+
+ PORT_START_TAG("c015") /* coin input */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+
+ PORT_START_TAG("c016") /* game start */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
+
+INPUT_PORTS_END
+
+
+static const gfx_layout charlayout =
+{
+ 16,16, /* 16*16 chars */
+ 8, /* 8 characters */
+ 1, /* 1 bit per pixel */
+ { 4 }, /* character rom is 512x4 bits (3622 type)*/
+ { 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3, 16+0, 16+1, 16+2, 16+3, 24+0, 24+1, 24+2, 24+3 },
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
+ 64*8 /* every char takes 64 consecutive bytes */
+};
+
+static const gfx_layout charlayout0 =
+{
+ 16,16, /* 16*16 chars */
+ 1, /* 1 characters */
+ 1, /* 1 bit per pixel */
+ { 7 }, /* bit 0 in character ram */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
+ { 0*128, 1*128, 2*128, 3*128, 4*128, 5*128, 6*128, 7*128, 8*128, 9*128, 10*128, 11*128, 12*128, 13*128, 14*128, 15*128 },
+ 256*8 /* every char takes 256 consecutive bytes */
+};
+
+static const gfx_layout charlayout1 =
+{
+ 16,16, /* 16*16 chars */
+ 1, /* 1 characters */
+ 1, /* 1 bit per pixel */
+ { 6 }, /* bit 1 in character ram */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
+ { 0*128, 1*128, 2*128, 3*128, 4*128, 5*128, 6*128, 7*128, 8*128, 9*128, 10*128, 11*128, 12*128, 13*128, 14*128, 15*128 },
+ 256*8 /* every char takes 256 consecutive bytes */
+};
+
+static const gfx_layout charlayout2 =
+{
+ 16,16, /* 16*16 chars */
+ 1, /* 1 characters */
+ 1, /* 1 bit per pixel */
+ { 5 }, /* bit 2 in character ram */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
+ { 0*128, 1*128, 2*128, 3*128, 4*128, 5*128, 6*128, 7*128, 8*128, 9*128, 10*128, 11*128, 12*128, 13*128, 14*128, 15*128 },
+ 256*8 /* every char takes 256 consecutive bytes */
+};
+
+static const gfx_layout scorelayout =
+{
+ 16,16, /* 16*16 chars */
+ 8, /* 8 characters */
+ 1, /* 1 bit per pixel */
+ { 0 }, /* */
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 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 },
+ 32*8 /* every char takes 32 consecutive bytes */
+};
+
+static GFXDECODE_START( ace )
+ GFXDECODE_ENTRY( REGION_GFX1, 0 , charlayout, 0, 2 )
+ GFXDECODE_ENTRY( 0 , 0x8000, charlayout0, 0, 2 ) /* the game dynamically modifies this */
+ GFXDECODE_ENTRY( 0 , 0x8000, charlayout1, 0, 2 ) /* the game dynamically modifies this */
+ GFXDECODE_ENTRY( 0 , 0x8000, charlayout2, 0, 2 ) /* the game dynamically modifies this */
+ GFXDECODE_ENTRY( 0 , 0x8000, scorelayout, 0, 2 ) /* the game dynamically modifies this */
+GFXDECODE_END
+
+
+
+static MACHINE_DRIVER_START( ace )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(8080, 18000000 / 9) /* 2 MHz ? */
+ MDRV_CPU_PROGRAM_MAP(readmem,writemem)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 2*8, 32*8-1)
+ MDRV_GFXDECODE(ace)
+ MDRV_PALETTE_LENGTH(2)
+ MDRV_COLORTABLE_LENGTH(2*2)
+
+ MDRV_PALETTE_INIT(ace)
+ MDRV_VIDEO_UPDATE(ace)
+
+ /* sound hardware */
+ /* ???? */
+
+MACHINE_DRIVER_END
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( ace )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "ace.a1", 0x0000, 0x0200, CRC(16811834) SHA1(5502812dd161908eea3fa8851d7e5c1e22b0f8ff) )
+ ROM_LOAD( "ace.a2", 0x0200, 0x0200, CRC(f9eae80e) SHA1(8865b86c7b5d57c76312c16f8a614bf35ffaf532) )
+ ROM_LOAD( "ace.a3", 0x0400, 0x0200, CRC(c5c63b8c) SHA1(2079dd12ff0c4aafec19aeb9baa70fc9b6788356) )
+ ROM_LOAD( "ace.a4", 0x0600, 0x0200, CRC(ea4503aa) SHA1(fea610124b9f7ea18d29b4e4599253ba1ee067e1) )
+ ROM_LOAD( "ace.a5", 0x0800, 0x0200, CRC(623c58e7) SHA1(a92418bc323a1ae76eae8e094e4d6ebd1e8da14e) )
+
+ /* not used - I couldn't guess when this should be displayed */
+ ROM_REGION( 0x0200, REGION_GFX1, 0 )
+ ROM_LOAD( "ace.k4", 0x0000, 0x0200, CRC(daa05ec6) SHA1(8b71ffb802293dc93f6b492ff128a704e676a5fd) )
+
+ROM_END
+
+GAME( 1976, ace, 0, ace, ace, 0, ROT0, "Allied Leisure", "Ace", GAME_NO_SOUND | GAME_IMPERFECT_COLORS )