diff --git a/makefile.burn_rules b/makefile.burn_rules index edd14d2e2..ff3226b7f 100644 --- a/makefile.burn_rules +++ b/makefile.burn_rules @@ -14,7 +14,7 @@ drvsrc = d_dodonpachi.o d_donpachi.o d_esprade.o d_feversos.o d_gaia.o d_guwang d_cps3.o \ \ d_actfancr.o d_backfire.o d_boogwing.o d_bwing.o d_cbuster.o d_chanbara.o d_cninja.o d_darkseal.o d_dassault.o d_dblewing.o d_dec0.o d_decocass.o \ - d_deco156.o d_deco32.o d_decomlc.o d_dec8.o d_dietgogo.o d_dreambal.o d_funkyjet.o d_karnov.o d_kchamp.o d_lemmings.o d_metlclsh.o d_pktgaldx.o d_rohga.o \ + d_deco156.o d_deco32.o d_decomlc.o d_dec8.o d_dietgogo.o d_dreambal.o d_funkyjet.o d_karnov.o d_kchamp.o d_lemmings.o d_metlclsh.o d_pktgaldx.o d_progolf.o d_rohga.o \ d_shootout.o d_sidepckt.o d_simpl156.o d_supbtime.o d_tumblep.o d_vaportra.o \ \ d_galaxian.o \ diff --git a/src/burn/drv/dataeast/d_progolf.cpp b/src/burn/drv/dataeast/d_progolf.cpp new file mode 100644 index 000000000..4a2dad777 --- /dev/null +++ b/src/burn/drv/dataeast/d_progolf.cpp @@ -0,0 +1,619 @@ +// FB Alpha 18 Holes Pro Golf driver module +// Based on MAME driver by Angelo Salese and Roberto Zandona' + +#include "tiles_generic.h" +#include "m6502_intf.h" +#include "ay8910.h" + +static UINT8 *AllMem; +static UINT8 *MemEnd; +static UINT8 *AllRam; +static UINT8 *RamEnd; +static UINT8 *DrvMainROM; +static UINT8 *DrvSoundROM; +static UINT8 *DrvGfxROM0; +static UINT8 *DrvGfxROM1; +static UINT8 *DrvColPROM; +static UINT8 *DrvMainRAM; +static UINT8 *DrvCharRAM; +static UINT8 *DrvVidRAM; +static UINT8 *DrvSoundRAM; +static UINT8 *DrvFgBuffer; + +static UINT32 *DrvPalette; +static UINT8 DrvRecalc; + +static UINT8 char_pen; +static UINT8 gfx_bank; +static UINT8 scrollx; +static UINT8 flipscreen; +static UINT8 soundlatch; + +static INT32 vblank; + +static UINT8 DrvJoy1[8]; +static UINT8 DrvJoy2[8]; +static UINT8 DrvJoy3[8]; +static UINT8 DrvJoy4[8]; +static UINT8 DrvDips[2]; +static UINT8 DrvInputs[4]; +static UINT8 DrvReset; + +static struct BurnInputInfo ProgolfInputList[] = { + {"P1 Coin", BIT_DIGITAL, DrvJoy3 + 6, "p1 coin" }, + {"P1 Start", BIT_DIGITAL, DrvJoy1 + 7, "p1 start" }, + {"P1 Up", BIT_DIGITAL, DrvJoy1 + 2, "p1 up" }, + {"P1 Down", BIT_DIGITAL, DrvJoy1 + 3, "p1 down" }, + {"P1 Left", BIT_DIGITAL, DrvJoy1 + 0, "p1 left" }, + {"P1 Right", BIT_DIGITAL, DrvJoy1 + 1, "p1 right" }, + {"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 4, "p1 fire 1" }, + + {"P2 Coin", BIT_DIGITAL, DrvJoy3 + 7, "p2 coin" }, + {"P2 Start", BIT_DIGITAL, DrvJoy2 + 7, "p2 start" }, + {"P2 Up", BIT_DIGITAL, DrvJoy2 + 3, "p2 up" }, + {"P2 Down", BIT_DIGITAL, DrvJoy2 + 2, "p2 down" }, + {"P2 Left", BIT_DIGITAL, DrvJoy2 + 1, "p2 left" }, + {"P2 Right", BIT_DIGITAL, DrvJoy2 + 0, "p2 right" }, + {"P2 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p2 fire 1" }, + + {"Reset", BIT_DIGITAL, &DrvReset, "reset" }, + {"Service", BIT_DIGITAL, DrvJoy4 + 6, "service" }, + {"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" }, + {"Dip B", BIT_DIPSWITCH, DrvDips + 1, "dip" }, +}; + +STDINPUTINFO(Progolf) + +static struct BurnDIPInfo ProgolfDIPList[]= +{ + {0x10, 0xff, 0xff, 0x10, NULL }, + {0x11, 0xff, 0xff, 0x00, NULL }, + + {0 , 0xfe, 0 , 5, "Coin B" }, + {0x10, 0x01, 0x03, 0x03, "2 Coins 1 Credits" }, + {0x10, 0x01, 0x03, 0x00, "1 Coin 1 Credits" }, + {0x10, 0x01, 0x03, 0x01, "1 Coin 2 Credits" }, + {0x10, 0x01, 0x03, 0x02, "1 Coin 3 Credits" }, + {0x10, 0x01, 0x03, 0x02, "1 Coin 6 Credits" }, + + {0 , 0xfe, 0 , 5, "Coin A" }, + {0x10, 0x01, 0x0c, 0x0c, "2 Coins 1 Credits" }, + {0x10, 0x01, 0x0c, 0x00, "1 Coin 1 Credits" }, + {0x10, 0x01, 0x0c, 0x04, "1 Coin 2 Credits" }, + {0x10, 0x01, 0x0c, 0x08, "1 Coin 3 Credits" }, + {0x10, 0x01, 0x0c, 0x08, "1 Coin 6 Credits" }, + + {0 , 0xfe, 0 , 2, "Cabinet" }, + {0x10, 0x01, 0x10, 0x10, "Upright" }, + {0x10, 0x01, 0x10, 0x00, "Cocktail" }, + + {0 , 0xfe, 0 , 2, "Lives" }, + {0x11, 0x01, 0x01, 0x00, "1" }, + {0x11, 0x01, 0x01, 0x01, "2" }, + + {0 , 0xfe, 0 , 4, "Bonus Life" }, + {0x11, 0x01, 0x06, 0x00, "10000" }, + {0x11, 0x01, 0x06, 0x02, "30000" }, + {0x11, 0x01, 0x06, 0x04, "50000" }, + {0x11, 0x01, 0x06, 0x06, "None" }, + + {0 , 0xfe, 0 , 2, "Difficulty" }, + {0x11, 0x01, 0x08, 0x00, "Easy" }, + {0x11, 0x01, 0x08, 0x08, "Hard" }, + + {0 , 0xfe, 0 , 2, "Display Strength and Position" }, + {0x11, 0x01, 0x10, 0x10, "No" }, + {0x11, 0x01, 0x10, 0x00, "Yes" }, + + {0 , 0xfe, 0 , 2, "Force Coinage = A 1C/3C - B 1C/8C" }, + {0x11, 0x01, 0x20, 0x00, "No" }, + {0x11, 0x01, 0x20, 0x20, "Yes" }, + + {0 , 0xfe, 0 , 2, "Coin Mode" }, + {0x11, 0x01, 0x40, 0x00, "Mode 1" }, + {0x11, 0x01, 0x40, 0x40, "Mode 2" }, +}; + +STDDIPINFO(Progolf) + +static void charram_write(INT32 offset, UINT8 data) // to do - simplify this so that it's written in as a bitmap not 8x8 tiles +{ + if (char_pen == 7) + { + for (INT32 i = 0; i < 8; i++) + DrvFgBuffer[offset + i] = 0; + } + else + { + for(INT32 i = 0; i < 8; i++) + { + if (DrvFgBuffer[offset + i] == char_pen) + DrvFgBuffer[offset + i] = data & (1<<(7-i)) ? char_pen : 0; + else + DrvFgBuffer[offset + i] = data & (1<<(7-i)) ? (DrvFgBuffer[offset + i] | char_pen) : DrvFgBuffer[offset + i]; + } + } +} + +static void bankswitch() +{ + M6502MapMemory(DrvVidRAM, 0x8000, 0x8fff, MAP_RAM); + + if ((gfx_bank & 8) || (gfx_bank & 3) == 0) return; + + INT32 offs0 = ((gfx_bank & 4) * 0x200); + INT32 offs1 = (((gfx_bank - 1) & 3) * 0x1000) + offs0; + + M6502MapMemory(DrvGfxROM0 + offs1, 0x8000 + offs0, 0x87ff + offs0, MAP_ROM); +} + +static void progolf_main_write(UINT16 address, UINT8 data) +{ + if ((address & 0xe000) == 0x6000) { + DrvCharRAM[address & 0x1fff] = data; + charram_write((address & 0x1fff) * 8, data); + return; + } + + switch (address) + { + case 0x9000: + char_pen = data & 0x07; + gfx_bank = data >> 4; + bankswitch(); + return; + + case 0x9200: + scrollx = (scrollx & 0x00ff) + (data * 256); + return; + + case 0x9400: + scrollx = (scrollx & 0xff00) + (data); + return; + + case 0x9600: + flipscreen = data & 0x01; + return; + + case 0x9800: + // mc6845 address_w + return; + + case 0x9801: + // mc6845 register_w + return; + + case 0x9a00: + soundlatch = data; + M6502Close(); + M6502Open(1); + M6502SetIRQLine(0, CPU_IRQSTATUS_ACK); + M6502Close(); + M6502Open(0); + return; + + case 0x9e00: + // nop + return; + } +} + +static UINT8 progolf_main_read(UINT16 address) +{ + switch (address) + { + case 0x9000: + return DrvInputs[2] ^ 0xc0; + + case 0x9200: + return DrvInputs[0]; + + case 0x9400: + return DrvInputs[1]; + + case 0x9600: + return vblank; + + case 0x9800: + return (DrvDips[0] & 0x1f) | (DrvInputs[3] & 0xc0); + + case 0x9a00: + return DrvDips[1]; + } + + return 0; +} + +static void progolf_sound_write(UINT16 address, UINT8 data) +{ + switch (address >> 12) + { + case 0x4: + case 0x5: + case 0x6: + case 0x7: + AY8910Write((address >> 13) & 1, (~address >> 12) & 1, data); + return; + + case 0x8: + M6502SetIRQLine(0, CPU_IRQSTATUS_NONE); + return; + } +} + +static UINT8 progolf_sound_read(UINT16 address) +{ + switch (address >> 12) + { + case 0x4: + case 0x6: + return AY8910Read((address >> 13) & 1); + + case 0x8: + return soundlatch; + } + + return 0; +} + +static tilemap_callback( bg ) +{ + TILE_SET_INFO(0, DrvVidRAM[offs^0x1f], 0, TILE_FLIPX|TILE_FLIPY); +} + +static tilemap_callback( fg ) +{ + TILE_SET_INFO(1, offs, 0, TILE_FLIPX); +} + +static INT32 DrvDoReset() +{ + memset (AllRam, 0, RamEnd - AllRam); + + M6502Open(0); + M6502Reset(); + M6502Close(); + + M6502Open(1); + M6502Reset(); + M6502Close(); + + AY8910Reset(0); + AY8910Reset(1); + + char_pen = 0; + gfx_bank = 0; + scrollx = 0; + flipscreen = 0; + soundlatch = 0; + + return 0; +} + +static INT32 MemIndex() +{ + UINT8 *Next; Next = AllMem; + + DrvMainROM = Next; Next += 0x005000; + DrvSoundROM = Next; Next += 0x001000; + + DrvGfxROM0 = Next; Next += 0x003000; + DrvGfxROM1 = Next; Next += 0x004000; + + DrvColPROM = Next; Next += 0x000020; + + DrvPalette = (UINT32*)Next; Next += 0x0010 * sizeof(UINT32); + + AllRam = Next; + + DrvMainRAM = Next; Next += 0x006000; + DrvCharRAM = Next; Next += 0x002000; + DrvVidRAM = Next; Next += 0x002000; + + DrvSoundRAM = Next; Next += 0x006000; + + DrvFgBuffer = Next; Next += 0x010000; + + RamEnd = Next; + + MemEnd = Next; + + return 0; +} + +static void DrvGfxDecode() +{ + INT32 Plane[3] = { 0x1000*2*8, 0x1000*1*8, 0x1000*0*8 }; + INT32 XOffs[8] = { STEP8(0,1) }; + INT32 YOffs[8] = { STEP8(0,8) }; + + GfxDecode(0x0100, 3, 8, 8, Plane, XOffs, YOffs, 0x040, DrvGfxROM0, DrvGfxROM1); +} + +static INT32 DrvInit(INT32 cputype) +{ + if (cputype == 1) return 1; // deco CPU6 not supported + + BurnSetRefreshRate(57.00); + + AllMem = NULL; + MemIndex(); + INT32 nLen = MemEnd - (UINT8 *)0; + if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1; + memset(AllMem, 0, nLen); + MemIndex(); + + { + if (BurnLoadRom(DrvMainROM + 0x0000, 0, 1)) return 1; + if (BurnLoadRom(DrvMainROM + 0x1000, 1, 1)) return 1; + if (BurnLoadRom(DrvMainROM + 0x2000, 2, 1)) return 1; + if (BurnLoadRom(DrvMainROM + 0x3000, 3, 1)) return 1; + if (BurnLoadRom(DrvMainROM + 0x4000, 4, 1)) return 1; + + if (BurnLoadRom(DrvSoundROM + 0x0000, 5, 1)) return 1; + + if (BurnLoadRom(DrvGfxROM0 + 0x0000, 6, 1)) return 1; + if (BurnLoadRom(DrvGfxROM0 + 0x1000, 7, 1)) return 1; + if (BurnLoadRom(DrvGfxROM0 + 0x2000, 8, 1)) return 1; + + if (BurnLoadRom(DrvColPROM + 0x0000, 9, 1)) return 1; + // if (BurnLoadRom(DrvColPROM + 0x0020, 10, 1)) return 1; + // if (BurnLoadRom(DrvColPROM + 0x0040, 11, 1)) return 1; + + DrvGfxDecode(); + } + + M6502Init(0, TYPE_DECO222); + M6502Open(0); + M6502MapMemory(DrvMainRAM, 0x0000, 0x5fff, MAP_RAM); + M6502MapMemory(DrvCharRAM, 0x6000, 0x7fff, MAP_ROM); + M6502MapMemory(DrvVidRAM, 0x8000, 0x8fff, MAP_WRITE); + M6502MapMemory(DrvMainROM, 0xb000, 0xffff, MAP_ROM); + M6502SetWriteHandler(progolf_main_write); + M6502SetReadHandler(progolf_main_read); + M6502Close(); + + M6502Init(1, TYPE_M6502); + M6502Open(1); + M6502MapMemory(DrvSoundRAM, 0x0000, 0x0fff, MAP_RAM); + M6502MapMemory(DrvSoundROM, 0xf000, 0xffff, MAP_ROM); + M6502SetWriteHandler(progolf_sound_write); + M6502SetReadHandler(progolf_sound_read); + M6502Close(); + + AY8910Init(0, 1500000, 0); + AY8910Init(1, 1500000, 1); + AY8910SetAllRoutes(0, 0.23, BURN_SND_ROUTE_BOTH); + AY8910SetAllRoutes(1, 0.23, BURN_SND_ROUTE_BOTH); + + GenericTilesInit(); + GenericTilemapInit(0, TILEMAP_SCAN_COLS, bg_map_callback, 8, 8, 128, 32); + GenericTilemapInit(1, TILEMAP_SCAN_COLS, fg_map_callback, 8, 8, 32, 32); + GenericTilemapSetGfx(0, DrvGfxROM1, 3, 8, 8, 0x04000, 8, 0); + GenericTilemapSetGfx(1, DrvFgBuffer, 3, 8, 8, 0x10000, 0, 0); + GenericTilemapSetTransparent(1, 0); + + DrvDoReset(); + + return 0; +} + +static INT32 DrvExit() +{ + GenericTilesExit(); + + M6502Exit(); + + AY8910Exit(0); + AY8910Exit(1); + + BurnFree(AllMem); + + return 0; +} + +static void DrvPaletteInit() +{ + for (INT32 i = 0; i < 0x10; i++) + { + INT32 bit0 = (DrvColPROM[i] >> 0) & 0x01; + INT32 bit1 = (DrvColPROM[i] >> 1) & 0x01; + INT32 bit2 = (DrvColPROM[i] >> 2) & 0x01; + INT32 r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + bit0 = (DrvColPROM[i] >> 3) & 0x01; + bit1 = (DrvColPROM[i] >> 4) & 0x01; + bit2 = (DrvColPROM[i] >> 5) & 0x01; + INT32 g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + bit0 = 0; + bit1 = (DrvColPROM[i] >> 6) & 0x01; + bit2 = (DrvColPROM[i] >> 7) & 0x01; + INT32 b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + DrvPalette[i] = BurnHighCol(r,g,b,0); + } +} + +static INT32 DrvDraw() +{ + if (DrvRecalc) { + DrvPaletteInit(); + DrvRecalc = 0; + } + + GenericTilemapSetScrollX(0, scrollx); + + GenericTilemapSetFlip(1, TMAP_FLIPY); + + GenericTilemapDraw(0, pTransDraw, 0); + GenericTilemapDraw(1, pTransDraw, 0); + + BurnTransferCopy(DrvPalette); + + return 0; +} + +static INT32 DrvFrame() +{ + if (DrvReset) { + DrvDoReset(); + } + + { + UINT8 prev_coin = (DrvInputs[3] | DrvInputs[2]) & 0xc0; + + memset (DrvInputs, 0, 4); + + 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; + DrvInputs[3] ^= (DrvJoy4[i] & 1) << i; + } + + if (prev_coin == 0 && ((DrvInputs[2] | DrvInputs[3]) & 0xc0) != 0) { + M6502Open(0); + M6502SetIRQLine(0x20, CPU_IRQSTATUS_AUTO); + M6502Close(); + } + } + + vblank = 0x00; + + INT32 nInterleave = 272/8; + INT32 nCyclesTotal[2] = { 1500000 / 57, 500000 / 57 }; + INT32 nCyclesDone[2] = { 0, 0 }; + + for (INT32 i = 0; i < nInterleave; i++) + { + M6502Open(0); + nCyclesDone[0] += M6502Run(nCyclesTotal[0] / nInterleave); + M6502Close(); + + M6502Open(1); + nCyclesDone[1] += M6502Run(nCyclesTotal[1] / nInterleave); + M6502Close(); + + if (i == 248/8) vblank = 0x00; + if (i == 8/8) vblank = 0x80; + } + + if (pBurnSoundOut) { + AY8910Render(pBurnSoundOut, nBurnSoundLen); + } + + if (pBurnDraw) { + DrvDraw(); + } + + 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); + + M6502Scan(nAction); + AY8910Scan(nAction, pnMin); + + SCAN_VAR(soundlatch); + SCAN_VAR(char_pen); + SCAN_VAR(gfx_bank); + SCAN_VAR(scrollx); + SCAN_VAR(flipscreen); + SCAN_VAR(soundlatch); + } + + return 0; +} + + +// 18 Holes Pro Golf (set 1) + +static struct BurnRomInfo progolfRomDesc[] = { + { "g4-m.2a", 0x1000, 0x8f06ebc0, 1 | BRF_PRG | BRF_ESS }, // 0 DECO222 Code (Encrypted M6502) + { "g3-m.4a", 0x1000, 0x8101b231, 1 | BRF_PRG | BRF_ESS }, // 1 + { "g2-m.6a", 0x1000, 0xa4a0d8dc, 1 | BRF_PRG | BRF_ESS }, // 2 + { "g1-m.8a", 0x1000, 0x749032eb, 1 | BRF_PRG | BRF_ESS }, // 3 + { "g0-m.9a", 0x1000, 0x8f8b1e8e, 1 | BRF_PRG | BRF_ESS }, // 4 + + { "g6-m.1b", 0x1000, 0x0c6fadf5, 2 | BRF_PRG | BRF_ESS }, // 5 M6502 Code + + { "g7-m.7a", 0x1000, 0x16b42975, 3 | BRF_GRA }, // 6 Graphics + { "g8-m.9a", 0x1000, 0xcf3f35da, 3 | BRF_GRA }, // 7 + { "g9-m.10a", 0x1000, 0x7712e248, 3 | BRF_GRA }, // 8 + + { "gcm.a14", 0x0020, 0x8259e7db, 4 | BRF_GRA }, // 9 Color data + { "gbm.k4", 0x0020, 0x1ea3319f, 4 | BRF_GRA }, // 10 + { "gam.k11", 0x0020, 0xb9665de3, 4 | BRF_GRA }, // 11 +}; + +STD_ROM_PICK(progolf) +STD_ROM_FN(progolf) + +static INT32 ProgolfInit() +{ + return DrvInit(0); +} + +struct BurnDriver BurnDrvProgolf = { + "progolf", NULL, NULL, NULL, "1981", + "18 Holes Pro Golf (set 1)\0", NULL, "Data East Corporation", "Miscellaneous", + NULL, NULL, NULL, NULL, + BDF_GAME_WORKING | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_PREFIX_DATAEAST, GBF_SPORTSMISC, 0, + NULL, progolfRomInfo, progolfRomName, NULL, NULL, ProgolfInputInfo, ProgolfDIPInfo, + ProgolfInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x10, + 256, 256, 3, 4 +}; + + +// 18 Holes Pro Golf (set 2) + +static struct BurnRomInfo progolfaRomDesc[] = { + { "g4-m.a3", 0x1000, 0x015a08d9, 1 | BRF_PRG | BRF_ESS }, // 0 DECO CPU6 Code (Encrypted M6502) + { "g3-m.a4", 0x1000, 0xc1339da5, 1 | BRF_PRG | BRF_ESS }, // 1 + { "g2-m.a6", 0x1000, 0xfafec36e, 1 | BRF_PRG | BRF_ESS }, // 2 + { "g1-m.a8", 0x1000, 0x749032eb, 1 | BRF_PRG | BRF_ESS }, // 3 + { "g0-m.a9", 0x1000, 0xa03c533f, 1 | BRF_PRG | BRF_ESS }, // 4 + + { "g5-m.b1", 0x1000, 0x0c6fadf5, 2 | BRF_PRG | BRF_ESS }, // 5 M6502 Code + + { "g7-m.a8", 0x1000, 0x16b42975, 3 | BRF_GRA }, // 6 Graphics + { "g8-m.a9", 0x1000, 0xcf3f35da, 3 | BRF_GRA }, // 7 + { "g9-m.a10", 0x1000, 0x7712e248, 3 | BRF_GRA }, // 8 + + { "gcm.a14", 0x0020, 0x8259e7db, 4 | BRF_GRA }, // 9 Color data + { "gbm.k4", 0x0020, 0x1ea3319f, 4 | BRF_GRA }, // 10 + { "gam.k11", 0x0020, 0xb9665de3, 4 | BRF_GRA }, // 11 +}; + +STD_ROM_PICK(progolfa) +STD_ROM_FN(progolfa) + +static INT32 ProgolfaInit() +{ + return DrvInit(1); +} + +struct BurnDriverD BurnDrvProgolfa = { + "progolfa", "progolf", NULL, NULL, "1981", + "18 Holes Pro Golf (set 2)\0", NULL, "Data East Corporation", "Miscellaneous", + NULL, NULL, NULL, NULL, + BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_PREFIX_DATAEAST, GBF_SPORTSMISC, 0, + NULL, progolfaRomInfo, progolfaRomName, NULL, NULL, ProgolfInputInfo, ProgolfDIPInfo, + ProgolfaInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x10, + 256, 256, 3, 4 +};