mirror of
https://github.com/libretro/FBNeo.git
synced 2025-02-01 14:43:02 +00:00
Add Warp Speed driver - needs analog inputs hooked up! Marked BurnDriverD for now
This commit is contained in:
parent
3f1bb9ef7f
commit
94216c97d7
@ -56,8 +56,8 @@ drvsrc = d_dodonpachi.o d_donpachi.o d_esprade.o d_feversos.o d_gaia.o d_guwang
|
||||
d_pengadvb.o d_phoenix.o d_pitnrun.o d_pkunwar.o d_popeye.o d_popper.o d_prehisle.o d_psychic5.o d_pturn.o d_punchout.o d_qbert.o d_quizo.o d_rallyx.o d_renegade.o \
|
||||
d_route16.o d_rpunch.o d_safarir.o d_sauro.o d_scregg.o d_seicross.o d_sf.o d_sidearms.o d_skyarmy.o d_skyfox.o d_skykid.o d_snk.o d_snk6502.o \
|
||||
d_snk68.o d_solomon.o d_sonson.o d_sprcros2.o d_srumbler.o d_ssozumo.o d_sstrangr.o d_sub.o d_suna8.o d_tail2nose.o d_tbowl.o d_tecmo.o d_terracre.o d_thedeep.o d_thepit.o \
|
||||
d_tigeroad.o d_timelimt.o d_toki.o d_toypop.o d_travrusa.o d_tsamurai.o d_twincobr.o d_usgames.o d_vastar.o d_vball.o d_vicdual.o d_vulgus.o d_wallc.o d_warpwarp.o d_wc90.o \
|
||||
d_wc90b.o d_wiping.o d_wiz.o d_wrally.o d_wwfsstar.o d_xain.o d_xxmissio.o d_xyonix.o d_zodiack.o \
|
||||
d_tigeroad.o d_timelimt.o d_toki.o d_toypop.o d_travrusa.o d_tsamurai.o d_twincobr.o d_usgames.o d_vastar.o d_vball.o d_vicdual.o d_vulgus.o d_wallc.o d_warpwarp.o d_warpsped.o \
|
||||
d_wc90.o d_wc90b.o d_wiping.o d_wiz.o d_wrally.o d_wwfsstar.o d_xain.o d_xxmissio.o d_xyonix.o d_zodiack.o \
|
||||
\
|
||||
d_3x3puzzl.o d_1945kiii.o d_20pacgal.o d_aerofgt.o d_airbustr.o d_aquarium.o d_bestleag.o d_bigstrkb.o d_blmbycar.o d_bloodbro.o d_crospang.o d_crshrace.o d_cultures.o \
|
||||
d_dcon.o d_ddragon3.o d_deniam.o d_diverboy.o d_dooyong.o d_dreamwld.o d_drgnmst.o d_drtomy.o d_egghunt.o d_esd16.o d_f1gp.o d_funybubl.o d_fuukifg2.o \
|
||||
|
446
src/burn/drv/pre90s/d_warpsped.cpp
Normal file
446
src/burn/drv/pre90s/d_warpsped.cpp
Normal file
@ -0,0 +1,446 @@
|
||||
// FB Alpha Warp Speed driver module
|
||||
// Based on MAME driver by Mariusz Wojcieszek
|
||||
|
||||
// to do:
|
||||
// hook up analog inputs
|
||||
|
||||
#include "tiles_generic.h"
|
||||
#include "z80_intf.h"
|
||||
#include "math.h"
|
||||
|
||||
static UINT8 *AllMem;
|
||||
static UINT8 *AllRam;
|
||||
static UINT8 *RamEnd;
|
||||
static UINT8 *MemEnd;
|
||||
static UINT8 *DrvZ80ROM;
|
||||
static UINT8 *DrvGfxROM0;
|
||||
static UINT8 *DrvGfxROM1;
|
||||
static UINT8 *DrvStarROM;
|
||||
static UINT8 *DrvVidRAM;
|
||||
static UINT8 *DrvZ80RAM;
|
||||
static UINT8 *vidregs;
|
||||
|
||||
static UINT32 *DrvPalette;
|
||||
static UINT8 DrvRecalc;
|
||||
|
||||
static INT32 vblank;
|
||||
|
||||
static UINT8 DrvJoy1[8];
|
||||
static UINT8 DrvJoy2[8];
|
||||
static UINT8 DrvJoy3[8];
|
||||
static UINT8 DrvDips[1];
|
||||
static UINT8 DrvInputs[3];
|
||||
static UINT8 DrvReset;
|
||||
|
||||
static struct BurnInputInfo WarpspeedInputList[] = {
|
||||
{"P1 Coin", BIT_DIGITAL, DrvJoy3 + 7, "p1 coin" },
|
||||
{"P1 Accelerate", BIT_DIGITAL, DrvJoy1 + 7, "p1 fire 1" },
|
||||
{"P1 Brake", BIT_DIGITAL, DrvJoy1 + 6, "p1 fire 2" },
|
||||
// analog placeholders
|
||||
{"P1 Button 3", BIT_DIGITAL, DrvJoy1 + 0, "p1 fire 3" },
|
||||
{"P1 Button 4", BIT_DIGITAL, DrvJoy2 + 0, "p1 fire 4" },
|
||||
|
||||
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
|
||||
{"Dips", BIT_DIPSWITCH, DrvDips + 0, "dip" },
|
||||
};
|
||||
|
||||
STDINPUTINFO(Warpspeed)
|
||||
|
||||
static struct BurnDIPInfo WarpspeedDIPList[]=
|
||||
{
|
||||
{0x06, 0xff, 0xff, 0x00, NULL },
|
||||
|
||||
{0 , 0xfe, 0 , 8, "Coin/Time" },
|
||||
{0x06, 0x01, 0x07, 0x00, "50 sec" },
|
||||
{0x06, 0x01, 0x07, 0x01, "75 sec" },
|
||||
{0x06, 0x01, 0x07, 0x02, "100 sec" },
|
||||
{0x06, 0x01, 0x07, 0x03, "125 sec" },
|
||||
{0x06, 0x01, 0x07, 0x04, "150 sec" },
|
||||
{0x06, 0x01, 0x07, 0x05, "175 sec" },
|
||||
{0x06, 0x01, 0x07, 0x06, "200 sec" },
|
||||
{0x06, 0x01, 0x07, 0x07, "225 sec" },
|
||||
|
||||
{0 , 0xfe, 0 , 2, "Coinage" },
|
||||
{0x06, 0x01, 0x20, 0x20, "2 Coins 1 Credits" },
|
||||
{0x06, 0x01, 0x20, 0x00, "1 Coin 1 Credits" },
|
||||
|
||||
{0 , 0xfe, 0 , 2, "Service Mode" },
|
||||
{0x06, 0x01, 0x40, 0x00, "Off" },
|
||||
{0x06, 0x01, 0x40, 0x40, "On" },
|
||||
};
|
||||
|
||||
STDDIPINFO(Warpspeed)
|
||||
|
||||
static void __fastcall warpspeed_write_port(UINT16 port, UINT8 data)
|
||||
{
|
||||
if ((port & 0xff) <= 0x27) {
|
||||
vidregs[port & 0xff] = data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static UINT8 __fastcall warpspeed_read_port(UINT16 port)
|
||||
{
|
||||
switch (port & 0xff)
|
||||
{
|
||||
case 0x00:
|
||||
return ((DrvInputs[0] & 0xc0) ^ 0xc0) | 0; // analog x
|
||||
|
||||
case 0x01:
|
||||
return (DrvInputs[1] & 0xc0) | 0; // analog y
|
||||
|
||||
case 0x02:
|
||||
return DrvDips[0];
|
||||
|
||||
case 0x03:
|
||||
return (DrvInputs[2] & 0xfe) | (vblank ? 0x01 : 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static tilemap_callback( text )
|
||||
{
|
||||
TILE_SET_INFO(0, DrvVidRAM[offs], 0, 0);
|
||||
}
|
||||
|
||||
static tilemap_callback( star )
|
||||
{
|
||||
UINT8 code = 0xff;
|
||||
|
||||
if (offs & 1)
|
||||
{
|
||||
code = DrvStarROM[offs / 2];
|
||||
}
|
||||
|
||||
TILE_SET_INFO(1, code, 0, 0);
|
||||
}
|
||||
|
||||
static INT32 DrvDoReset()
|
||||
{
|
||||
memset (AllRam, 0, RamEnd - AllRam);
|
||||
|
||||
ZetOpen(0);
|
||||
ZetReset();
|
||||
ZetClose();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 MemIndex()
|
||||
{
|
||||
UINT8 *Next; Next = AllMem;
|
||||
|
||||
DrvZ80ROM = Next; Next += 0x000e00;
|
||||
|
||||
DrvStarROM = Next; Next += 0x000200;
|
||||
|
||||
DrvGfxROM0 = Next; Next += 0x001000;
|
||||
DrvGfxROM1 = Next; Next += 0x001000;
|
||||
|
||||
DrvPalette = (UINT32*)Next; Next += 0x000a * sizeof(UINT32);
|
||||
|
||||
AllRam = Next;
|
||||
|
||||
DrvVidRAM = Next; Next += 0x000400;
|
||||
DrvZ80RAM = Next; Next += 0x000100;
|
||||
|
||||
vidregs = Next; Next += 0x000028;
|
||||
|
||||
RamEnd = Next;
|
||||
|
||||
MemEnd = Next;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 DrvGfxDecode()
|
||||
{
|
||||
INT32 Plane[1] = { 0 };
|
||||
INT32 XOffs[8] = { STEP8(0,8) };
|
||||
INT32 YOffs[8] = { STEP8(7,-1) };
|
||||
|
||||
UINT8 *tmp = (UINT8*)BurnMalloc(0x200);
|
||||
if (tmp == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
memcpy (tmp, DrvGfxROM0, 0x200);
|
||||
|
||||
GfxDecode(0x0040, 1, 8, 8, Plane, XOffs, YOffs, 0x040, tmp, DrvGfxROM0);
|
||||
|
||||
memcpy (tmp, DrvGfxROM1, 0x200);
|
||||
|
||||
GfxDecode(0x0040, 1, 8, 8, Plane, XOffs, YOffs, 0x040, tmp, DrvGfxROM1);
|
||||
|
||||
BurnFree(tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 DrvInit()
|
||||
{
|
||||
AllMem = NULL;
|
||||
MemIndex();
|
||||
INT32 nLen = MemEnd - (UINT8 *)0;
|
||||
if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;
|
||||
memset(AllMem, 0, nLen);
|
||||
MemIndex();
|
||||
|
||||
{
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0000, 0, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0200, 1, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0400, 2, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0600, 3, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0800, 4, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0a00, 5, 1)) return 1;
|
||||
if (BurnLoadRom(DrvZ80ROM + 0x0c00, 6, 1)) return 1;
|
||||
|
||||
if (BurnLoadRom(DrvStarROM + 0x0000, 7, 1)) return 1;
|
||||
|
||||
if (BurnLoadRom(DrvGfxROM0 + 0x0000, 8, 1)) return 1;
|
||||
|
||||
if (BurnLoadRom(DrvGfxROM1 + 0x0000, 9, 1)) return 1;
|
||||
|
||||
// sprites and unknown?
|
||||
|
||||
DrvGfxDecode();
|
||||
}
|
||||
|
||||
ZetInit(0);
|
||||
ZetOpen(0);
|
||||
ZetMapMemory(DrvZ80ROM, 0x0000, 0x0dff, MAP_ROM);
|
||||
ZetMapMemory(DrvVidRAM, 0x1800, 0x1bff, MAP_RAM);
|
||||
ZetMapMemory(DrvZ80RAM, 0x1c00, 0x1cff, MAP_RAM);
|
||||
ZetSetOutHandler(warpspeed_write_port);
|
||||
ZetSetInHandler(warpspeed_read_port);
|
||||
ZetClose();
|
||||
|
||||
GenericTilesInit();
|
||||
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, text_map_callback, 8, 8, 32, 32);
|
||||
GenericTilemapInit(1, TILEMAP_SCAN_ROWS, star_map_callback, 8, 8, 32, 32);
|
||||
GenericTilemapSetGfx(0, DrvGfxROM0, 1, 8, 8, 0x01000, 0, 0);
|
||||
GenericTilemapSetGfx(1, DrvGfxROM1, 1, 8, 8, 0x01000, 0, 0);
|
||||
GenericTilemapSetTransparent(0, 0);
|
||||
GenericTilemapSetOffsets(TMAP_GLOBAL, -32, -64);
|
||||
|
||||
DrvDoReset();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 DrvExit()
|
||||
{
|
||||
GenericTilesExit();
|
||||
|
||||
ZetExit();
|
||||
|
||||
BurnFree(AllMem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void DrvPaletteInit()
|
||||
{
|
||||
DrvPalette[0] = 0;
|
||||
DrvPalette[1] = ~0;
|
||||
|
||||
for (INT32 i = 0; i < 8; i++) {
|
||||
DrvPalette[i+2] = BurnHighCol((i&1)?0xff:0, (i&2)?0xff:0, (i&4)?0xff:0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_circle_line(INT32 x, INT32 y, INT32 l, INT32 color)
|
||||
{
|
||||
if (y >= 64 && y < 256) // 32, 256, 64, 256
|
||||
{
|
||||
UINT16 *pLine = pTransDraw + ((y - 64) * nScreenWidth) - 32;
|
||||
|
||||
int h1 = x - l;
|
||||
int h2 = x + l;
|
||||
|
||||
if (h1 < 32) h1 = 32;
|
||||
if (h2 > 255) h2 = 255;
|
||||
|
||||
for (x = h1; x <= h2; x++) {
|
||||
|
||||
pLine[x] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_circle(INT16 cx, INT16 cy, UINT16 radius, UINT8 color)
|
||||
{
|
||||
int x = 0;
|
||||
int y = radius;
|
||||
|
||||
int d = 3 - 2 * radius;
|
||||
|
||||
while (x <= y)
|
||||
{
|
||||
draw_circle_line(cx, cy - x, y, color);
|
||||
draw_circle_line(cx, cy + x, y, color);
|
||||
draw_circle_line(cx, cy - y, x, color);
|
||||
draw_circle_line(cx, cy + y, x, color);
|
||||
|
||||
x++;
|
||||
|
||||
if (d < 0)
|
||||
d += 4 * x + 6;
|
||||
else
|
||||
d += 4 * (x - y--) + 10;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_circles()
|
||||
{
|
||||
for (INT32 i = 0; i < 4; i++)
|
||||
{
|
||||
UINT16 radius = vidregs[i * 8] + vidregs[i * 8 + 1] * 256;
|
||||
radius = (UINT16)sqrt((float)(0xffff - radius));
|
||||
|
||||
INT16 midx = (vidregs[i * 8 + 2] + vidregs[i * 8 + 3] * 256) - 0xe70;
|
||||
INT16 midy = (vidregs[i * 8 + 4] + vidregs[i * 8 + 5] * 256) - 0xe70;
|
||||
|
||||
if (radius == 0 || radius == 0xffff)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
draw_circle(midx + 128 + 16, midy + 128 + 16, radius, (vidregs[i*8 + 6] & 0x07) + 2);
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 DrvDraw()
|
||||
{
|
||||
if (DrvRecalc) {
|
||||
DrvPaletteInit();
|
||||
DrvRecalc = 0;
|
||||
}
|
||||
|
||||
GenericTilemapDraw(1, pTransDraw, 0);
|
||||
|
||||
draw_circles();
|
||||
|
||||
GenericTilemapDraw(0, pTransDraw, 0);
|
||||
|
||||
BurnTransferCopy(DrvPalette);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 DrvFrame()
|
||||
{
|
||||
if (DrvReset) {
|
||||
DrvDoReset();
|
||||
}
|
||||
|
||||
{
|
||||
memset (DrvInputs, 0, 3);
|
||||
|
||||
for (INT32 i = 0; i < 8; i++) {
|
||||
DrvInputs[0] ^= (DrvJoy1[i] & 1) << i;
|
||||
DrvInputs[1] ^= (DrvJoy2[i] & 1) << i;
|
||||
DrvInputs[2] ^= (DrvJoy3[i] & 1) << i;
|
||||
}
|
||||
}
|
||||
|
||||
INT32 nInterleave = 256/8;
|
||||
INT32 nCyclesTotal[1] = { 2500000 / 60 };
|
||||
INT32 nCyclesDone[1] = { 0 };
|
||||
|
||||
ZetOpen(0);
|
||||
|
||||
vblank = 0;
|
||||
|
||||
for (INT32 i = 0; i < nInterleave; i++)
|
||||
{
|
||||
nCyclesDone[0] += ZetRun(nCyclesTotal[0] / nInterleave);
|
||||
|
||||
if (i == (240/8)) {
|
||||
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
|
||||
vblank = 1;
|
||||
}
|
||||
}
|
||||
|
||||
ZetClose();
|
||||
|
||||
if (pBurnSoundOut) {
|
||||
|
||||
}
|
||||
|
||||
if (pBurnDraw) {
|
||||
BurnDrvRedraw();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
{
|
||||
struct BurnArea ba;
|
||||
|
||||
if (pnMin) {
|
||||
*pnMin = 0x029702;
|
||||
}
|
||||
|
||||
if (nAction & ACB_VOLATILE) {
|
||||
memset(&ba, 0, sizeof(ba));
|
||||
|
||||
ba.Data = AllRam;
|
||||
ba.nLen = RamEnd - AllRam;
|
||||
ba.szName = "All Ram";
|
||||
BurnAcb(&ba);
|
||||
|
||||
ZetScan(nAction);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// Warp Speed (prototype)
|
||||
|
||||
static struct BurnRomInfo warpspedRomDesc[] = {
|
||||
{ "m16 pro 0.c5", 0x0200, 0x81f33dfb, 1 | BRF_PRG | BRF_ESS }, // 0 Z80 Code
|
||||
{ "m16 pro 1.e5", 0x0200, 0x135f7421, 1 | BRF_PRG | BRF_ESS }, // 1
|
||||
{ "m16 pro 2.c6", 0x0200, 0x0a36d152, 1 | BRF_PRG | BRF_ESS }, // 2
|
||||
{ "m16 pro 3.e6", 0x0200, 0xba416cca, 1 | BRF_PRG | BRF_ESS }, // 3
|
||||
{ "m16 pro 4.c4", 0x0200, 0xfc44f25b, 1 | BRF_PRG | BRF_ESS }, // 4
|
||||
{ "m16 pro 5.e4", 0x0200, 0x7a16bc2b, 1 | BRF_PRG | BRF_ESS }, // 5
|
||||
{ "m16 pro 6.c3", 0x0200, 0xe2e7940f, 1 | BRF_PRG | BRF_ESS }, // 6
|
||||
|
||||
{ "e10.e10", 0x0200, 0xe0d4b72c, 2 | BRF_GRA }, // 7 Starfield Layout
|
||||
|
||||
{ "k1.g1", 0x0200, 0x63d4fa84, 3 | BRF_GRA }, // 8 Text Tiles
|
||||
|
||||
{ "k1.k1", 0x0200, 0x76b10d47, 4 | BRF_GRA }, // 9 Star Tiles
|
||||
|
||||
{ "l9 l13 l17 g17.g17", 0x0200, 0x7449aae9, 5 | BRF_GRA }, // 10 Sprite (not used?)
|
||||
{ "l10 l15 l18 g18.g18", 0x0200, 0x5829699c, 5 | BRF_GRA }, // 11
|
||||
{ "l9 l13 l17 g17.l9", 0x0200, 0x7449aae9, 5 | BRF_GRA }, // 12
|
||||
{ "l10 l15 l18 g18.l10", 0x0200, 0x5829699c, 5 | BRF_GRA }, // 13
|
||||
{ "l9 l13 l17 g17.l13", 0x0200, 0x7449aae9, 5 | BRF_GRA }, // 14
|
||||
{ "l10 l15 l18 g18.l15", 0x0200, 0x5829699c, 5 | BRF_GRA }, // 15
|
||||
{ "l9 l13 l17 g17.l17", 0x0200, 0x7449aae9, 5 | BRF_GRA }, // 16
|
||||
{ "l10 l15 l18 g18.l18", 0x0200, 0x5829699c, 5 | BRF_GRA }, // 17
|
||||
|
||||
{ "c12.c12", 0x0200, 0x88a8db15, 6 | BRF_GRA }, // 18 Unknown
|
||||
{ "e8.e8", 0x0200, 0x3ef3a576, 6 | BRF_GRA }, // 19
|
||||
};
|
||||
|
||||
STD_ROM_PICK(warpsped)
|
||||
STD_ROM_FN(warpsped)
|
||||
|
||||
struct BurnDriverD BurnDrvWarpsped = {
|
||||
"warpsped", NULL, NULL, NULL, "1979",
|
||||
"Warp Speed (prototype)\0", "No sound, bad colors", "Meadows Games, Inc.", "Miscellaneous",
|
||||
NULL, NULL, NULL, NULL,
|
||||
BDF_GAME_WORKING, 2, HARDWARE_MISC_PRE90S, GBF_MISC, 0,
|
||||
NULL, warpspedRomInfo, warpspedRomName, NULL, NULL, WarpspeedInputInfo, WarpspeedDIPInfo,
|
||||
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 10,
|
||||
224, 192, 4, 3
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user