/**************************************************************************** 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 )