/* Meadows Warp Speed Driver by Mariusz Wojcieszek Notes: - Circles drawing does not follow the hardware. Roms which come in pairs four times on the board are used by circle generators. These roms are thought to contain cosine tables, 16 bits wide, with g17 being the MSB and g18 being the LSB - Circles colors are probably not correct - Starfield is wrong. It is done with tilemap fixed in rom, but rom mapping is not correct. Starfield scrolling is missing too - What are unknown roms used for? Hardware registers: 0x00 - 0x1f control register for circles generator (8 bytes each) 0x00, 0x01 circle radius 0x02, 0x03 circle middle point 0x04, 0x05 circle middle point 0x06 circle colour (0-7) 0x07 unused 0x20 ? 0x21 sound (intro screens have bit 1 toggled for click effect) 0x22 ? 0x23 ? 0x24 ? 0x25 ? 0x26 ? 0x27 ? Board etched... MEADOWS 024-0084 MADE IN USA Empty socket at .E3 Z80 processor 6 2102 memory chips 2 2112 memory chips 5Mhz crystal All PROMS are SN74s474 .L18 no sticker .L17 stickered L9, L13 L17, G17 .L15 stickered L10, L15 L18, G18 .L13 stickered L9, L13 L17, G17 .L10 stickered L10, L15 L18, G18 .L9 stickered (damaged) xxx, L13 xxx, G1y .K1 stickered K1 .G2 no sticker K1 .E4 no sticker .E5 stickered M16 PRO 1 .E6 stickered M16 PRO 3 .C3 can't read .C4 stickered M16 PRO 4 .C5 stickered M16 PRO 0 .C6 stickered M16 PRO 2 .E8 stickered E8 .E10 stickered E10 .C12 stickered C12 .G17 stickered L9, L13 L17, G17 .G18 stickered L10, L15 L18, G18 L9, L13, L17 and G17 all read the same L10, L15, L18 and G18 all read the same */ #include "emu.h" #include "cpu/z80/z80.h" class warpspeed_state : public driver_device { public: warpspeed_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } UINT8 *m_videoram; tilemap_t *m_text_tilemap; tilemap_t *m_starfield_tilemap; UINT8 *m_workram; UINT8 m_regs[0x28]; }; static WRITE8_HANDLER( warpspeed_hardware_w ) { warpspeed_state *state = space->machine().driver_data(); state->m_regs[offset] = data; } static TILE_GET_INFO( get_warpspeed_text_tile_info ) { warpspeed_state *state = machine.driver_data(); UINT8 code = state->m_videoram[tile_index] & 0x3f; SET_TILE_INFO(0, code, 0, 0); } static TILE_GET_INFO( get_warpspeed_starfield_tile_info ) { UINT8 code = 0x3f; if ( tile_index & 1 ) { code = machine.region("starfield")->base()[tile_index >> 1] & 0x3f; } SET_TILE_INFO(1, code, 0, 0); } static WRITE8_HANDLER( warpspeed_vidram_w ) { warpspeed_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; tilemap_mark_tile_dirty(state->m_text_tilemap, offset); } static VIDEO_START( warpspeed ) { warpspeed_state *state = machine.driver_data(); state->m_text_tilemap = tilemap_create(machine, get_warpspeed_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); tilemap_set_transparent_pen(state->m_text_tilemap, 0); state->m_starfield_tilemap = tilemap_create(machine, get_warpspeed_starfield_tile_info, tilemap_scan_rows, 8, 8, 32, 32); tilemap_mark_all_tiles_dirty(state->m_starfield_tilemap); } static void draw_circle_line(bitmap_t *bitmap, int x, int y, int l, int color) { if (y >= 0 && y <= bitmap->height - 1) { UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); int h1 = x - l; int h2 = x + l; if (h1 < 0) h1 = 0; if (h2 > bitmap->width - 1) h2 = bitmap->width - 1; for (x = h1; x <= h2; x++) pLine[x] = color; } } static void warpspeed_draw_circle(bitmap_t *bitmap, INT16 cx, INT16 cy, UINT16 radius, UINT8 color ) { /* Bresenham's circle algorithm */ int x = 0; int y = radius; int d = 3 - 2 * radius; while (x <= y) { draw_circle_line(bitmap, cx, cy - x, y, color); draw_circle_line(bitmap, cx, cy + x, y, color); draw_circle_line(bitmap, cx, cy - y, x, color); draw_circle_line(bitmap, cx, cy + y, x, color); x++; if (d < 0) d += 4 * x + 6; else d += 4 * (x - y--) + 10; } } static void warpspeed_draw_circles(bitmap_t *bitmap, warpspeed_state *state) { for (int i = 0; i < 4; i++) { UINT16 radius = state->m_regs[i*8] + state->m_regs[i*8 + 1]*256; radius = 0xffff - radius; radius = sqrt((float)radius); INT16 midx = state->m_regs[i*8 + 2] + state->m_regs[i*8 + 3]*256; midx -= 0xe70; INT16 midy = state->m_regs[i*8 + 4] + state->m_regs[i*8 + 5]*256; midy -= 0xe70; if ( radius == 0 || radius == 0xffff ) { continue; } warpspeed_draw_circle(bitmap, midx + 128 + 16, midy + 128 + 16, radius, (state->m_regs[i*8 + 6] & 0x07) + 2); } } static SCREEN_UPDATE( warpspeed ) { warpspeed_state *state = screen->machine().driver_data(); tilemap_draw(bitmap, cliprect, state->m_starfield_tilemap, 0, 0); warpspeed_draw_circles(bitmap, state); tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); return 0; } static ADDRESS_MAP_START( warpspeed_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0dff) AM_ROM AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE( warpspeed_vidram_w ) AM_BASE_MEMBER(warpspeed_state, m_videoram) AM_RANGE(0x1c00, 0x1cff) AM_RAM AM_BASE_MEMBER(warpspeed_state, m_workram) ADDRESS_MAP_END static ADDRESS_MAP_START ( warpspeed_io_map, AS_IO, 8) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0") AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") AM_RANGE(0x02, 0x02) AM_READ_PORT("DSW") AM_RANGE(0x03, 0x03) AM_READ_PORT("IN2") AM_RANGE(0x00, 0x27) AM_WRITE( warpspeed_hardware_w ) ADDRESS_MAP_END static INPUT_PORTS_START( warpspeed ) PORT_START("IN0") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME( "Accelerate" ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME( "Brake" ) PORT_BIT( 0x3f, 0x20, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x3f) PORT_SENSITIVITY(20) PORT_KEYDELTA(5) PORT_CENTERDELTA(0) PORT_REVERSE PORT_START("IN1") PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x3f, 0x20, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x3f) PORT_SENSITIVITY(20) PORT_KEYDELTA(5) PORT_CENTERDELTA(0) PORT_REVERSE PORT_START("IN2") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x7e, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK ) PORT_START("DSW") PORT_DIPNAME( 0x07, 0x00, "Coin/Time" ) PORT_DIPSETTING( 0x00, "50 sec" ) PORT_DIPSETTING( 0x01, "75 sec" ) PORT_DIPSETTING( 0x02, "100 sec" ) PORT_DIPSETTING( 0x03, "125 sec" ) PORT_DIPSETTING( 0x04, "150 sec" ) PORT_DIPSETTING( 0x05, "175 sec" ) PORT_DIPSETTING( 0x06, "200 sec" ) PORT_DIPSETTING( 0x07, "225 sec" ) PORT_DIPUNKNOWN( 0x08, 0x00 ) PORT_DIPUNKNOWN( 0x10, 0x00 ) PORT_DIPNAME( 0x20, 0x00, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Service_Mode ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_DIPUNUSED( 0x80, 0x00 ) INPUT_PORTS_END static const gfx_layout warpspeed_charlayout = { 8,8, RGN_FRAC(1,1), 1, { 0 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { 7, 6, 5, 4, 3, 2, 1, 0 }, 8*8 }; static GFXDECODE_START( warpspeed ) GFXDECODE_ENTRY( "gfx1", 0, warpspeed_charlayout, 0, 1 ) GFXDECODE_ENTRY( "gfx2", 0, warpspeed_charlayout, 0, 1 ) GFXDECODE_END static PALETTE_INIT( warpspeed ) { // tilemaps palette_set_color(machine,0,RGB_BLACK); /* black */ palette_set_color(machine,1,RGB_WHITE); /* white */ // circles for ( int i = 0; i < 8; i++ ) { palette_set_color_rgb(machine, 2 + i, 0xff*BIT(i,0), 0xff*BIT(i,1), 0xff*BIT(i,2)); } } static MACHINE_CONFIG_START( warpspeed, warpspeed_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_5MHz/2) MCFG_CPU_PROGRAM_MAP(warpspeed_map) MCFG_CPU_IO_MAP(warpspeed_io_map) MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((32)*8, (32)*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 8*8, 32*8-1) MCFG_VIDEO_START(warpspeed) MCFG_SCREEN_UPDATE(warpspeed) MCFG_GFXDECODE(warpspeed) MCFG_PALETTE_LENGTH(2+8) MCFG_PALETTE_INIT(warpspeed) MACHINE_CONFIG_END ROM_START( warpsped ) ROM_REGION(0x1000, "maincpu", 0) ROM_LOAD( "m16 pro 0.c5", 0x0000, 0x0200, CRC(81f33dfb) SHA1(5c4adef88e1e7f1a9f7c156f17b98ba522ddee81) ) ROM_LOAD( "m16 pro 1.e5", 0x0200, 0x0200, CRC(135f7421) SHA1(0cabe9a2590fe4f81976a4d10e9b2a223a2d875e) ) ROM_LOAD( "m16 pro 2.c6", 0x0400, 0x0200, CRC(0a36d152) SHA1(83a2e8f78a36e512da81c44a5ceca7f865bc3508) ) ROM_LOAD( "m16 pro 3.e6", 0x0600, 0x0200, CRC(ba416cca) SHA1(afb831a79a4a4334fa4caf4e2244c2d4e2f25853) ) ROM_LOAD( "m16 pro 4.c4", 0x0800, 0x0200, CRC(fc44f25b) SHA1(185f593f2ec6075fd68869d87ed584908031100a) ) ROM_LOAD( "m16 pro 5.e4", 0x0a00, 0x0200, CRC(7a16bc2b) SHA1(48f58f0c7469da24a3ebee9183b5aae8c676e6ea) ) ROM_LOAD( "m16 pro 6.c3", 0x0c00, 0x0200, CRC(e2e7940f) SHA1(78c9df32580784c278675d09b89095781893d48f) ) ROM_REGION(0x1000, "sprite", 0) ROM_LOAD( "l9 l13 l17 g17.g17", 0x0000, 0x0200, CRC(7449aae9) SHA1(1f49dad6f60103da6093592efa2087bc24dc0283) ) ROM_LOAD( "l10 l15 l18 g18.g18", 0x0200, 0x0200, CRC(5829699c) SHA1(20ffa7b81a0de159408d2668005b9ee8a2e588d1) ) ROM_LOAD( "l9 l13 l17 g17.l9", 0x0400, 0x0200, CRC(7449aae9) SHA1(1f49dad6f60103da6093592efa2087bc24dc0283) ) ROM_LOAD( "l10 l15 l18 g18.l10", 0x0600, 0x0200, CRC(5829699c) SHA1(20ffa7b81a0de159408d2668005b9ee8a2e588d1) ) ROM_LOAD( "l9 l13 l17 g17.l13", 0x0800, 0x0200, CRC(7449aae9) SHA1(1f49dad6f60103da6093592efa2087bc24dc0283) ) ROM_LOAD( "l10 l15 l18 g18.l15", 0x0a00, 0x0200, CRC(5829699c) SHA1(20ffa7b81a0de159408d2668005b9ee8a2e588d1) ) ROM_LOAD( "l9 l13 l17 g17.l17", 0x0c00, 0x0200, CRC(7449aae9) SHA1(1f49dad6f60103da6093592efa2087bc24dc0283) ) ROM_LOAD( "l10 l15 l18 g18.l18", 0x0e00, 0x0200, CRC(5829699c) SHA1(20ffa7b81a0de159408d2668005b9ee8a2e588d1) ) ROM_REGION(0x200, "starfield", 0) ROM_LOAD( "e10.e10", 0x0000, 0x0200, CRC(e0d4b72c) SHA1(ae5fae0df9e0bfc67f586649474ff8a69abd7579) ) ROM_REGION(0x400, "unknown", 0) ROM_LOAD( "c12.c12", 0x0000, 0x0200, CRC(88a8db15) SHA1(3fdf4e23cf75cf5dd4d3bad08e9e71c0268f8d79) ) ROM_LOAD( "e8.e8", 0x0200, 0x0200, CRC(3ef3a576) SHA1(905f9b8d3cabab944a0f6f0736c5c26d0e36107f) ) ROM_REGION(0x0200, "gfx1", 0) ROM_LOAD( "k1.g1", 0x0000, 0x0200, CRC(63d4fa84) SHA1(3465ce27497e2d4fcae994c022480e37e1345686) ) ROM_REGION(0x0200, "gfx2", 0) ROM_LOAD( "k1.k1", 0x0000, 0x0200, CRC(76b10d47) SHA1(e644a50df06535fe1fbfb8754cfc7b4a49fcb05e) ) ROM_END static DRIVER_INIT( warpspeed ) { } GAME( 197?, warpsped, 0, warpspeed, warpspeed, warpspeed, ROT0, "Meadows Games, Inc.", "Warp Speed (prototype)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_NO_SOUND )