zwack attack

This commit is contained in:
dinkc64 2022-10-07 00:46:50 -04:00
parent 9b8914b73b
commit f0974cfd8e
2 changed files with 785 additions and 1 deletions

View File

@ -71,7 +71,7 @@ drvsrc = d_akkaarrh.o d_arcadecl.o d_atarig1.o d_badlands.o d_batman.o d_blstro
d_srumbler.o d_ssozumo.o d_sstrangr.o d_starwars.o d_stfight.o d_stuntair.o d_sub.o d_suna8.o d_tagteam.o d_tankbust.o d_taxidriv.o d_tail2nose.o d_tbowl.o d_tceptor.o \
d_tecmo.o d_tempest.o d_terracre.o d_thedeep.o d_thepit.o d_thief.o d_tigeroad.o d_timelimt.o d_toki.o d_toypop.o d_travrusa.o d_tsamurai.o d_tubep.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_williams.o d_wiping.o d_wiz.o d_wwfsstar.o \
d_xain.o d_xxmissio.o d_xyonix.o d_zodiack.o \
d_xain.o d_xxmissio.o d_xyonix.o d_zodiack.o d_zwackery.o \
\
d_3x3puzzl.o d_1945kiii.o d_20pacgal.o d_aerofgt.o d_airbustr.o d_aquarium.o d_artmagic.o d_bestleag.o d_bigstrkb.o d_blackt96.o d_blmbycar.o d_bloodbro.o d_bloodbro_ms.o d_btoads.o \
d_cischeat.o d_crospang.o d_crshrace.o d_cultures.o d_dcon.o d_ddragon3.o d_deniam.o d_discoboy.o d_diverboy.o d_dooyong.o d_dreamwld.o d_drgnmst.o d_drtomy.o d_egghunt.o d_eolith.o d_eolith16.o \

View File

@ -0,0 +1,784 @@
// FB Neo Midway 68k-based driver module
// Based on MAME driver by Aaron Giles, Bryan McPhail
#include "tiles_generic.h"
#include "m68000_intf.h"
#include "midcsd.h"
#include "dac.h"
#include "6821pia.h"
#include "6840ptm.h"
#include "watchdog.h"
#include "burn_gun.h" // dial
static UINT8 *AllMem;
static UINT8 *MemEnd;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *Drv68KROM;
static UINT8 *DrvSndROM;
static UINT8 *DrvGfxROM0;
static UINT8 *DrvGfxROM1;
static UINT8 *DrvGfxROM2;
static UINT8 *DrvGfxROM3;
static UINT8 *Drv68KRAMA;
static UINT8 *Drv68KRAMB;
static UINT8 *DrvVidRAM;
static UINT8 *DrvPalRAM;
static UINT8 *DrvSprRAM;
static UINT8 *DrvSndRAM;
static UINT32 *DrvPalette;
static UINT8 DrvRecalc;
static UINT8 sound_data;
static UINT8 DrvJoy1[8];
static UINT8 DrvJoy2[8];
static UINT8 DrvJoy3[8];
static UINT8 DrvDips[2];
static UINT8 DrvInputs[4];
static UINT8 DrvReset;
static ButtonToggle Diag;
static INT16 Analog[1];
static INT32 nCyclesExtra[2];
#define A(a, b, c, d) {a, b, (UINT8*)(c), d}
static struct BurnInputInfo ZwackeryInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy1 + 2, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy1 + 0, "p1 start" },
{"P1 Up", BIT_DIGITAL, DrvJoy2 + 3, "p1 up" },
{"P1 Down", BIT_DIGITAL, DrvJoy2 + 2, "p1 down" },
{"P1 Left", BIT_DIGITAL, DrvJoy2 + 0, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy2 + 1, "p1 right" },
A("P1 Spinner", BIT_ANALOG_REL, &Analog[0], "p1 x-axis"),
{"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 7, "p1 fire 1" },
{"P1 Button 2", BIT_DIGITAL, DrvJoy3 + 6, "p1 fire 2" },
{"P1 Button 3", BIT_DIGITAL, DrvJoy3 + 0, "p1 fire 3" },
{"P1 Button 4", BIT_DIGITAL, DrvJoy3 + 7, "p1 fire 4" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Service", BIT_DIGITAL, DrvJoy1 + 5, "service" },
{"Service Mode", BIT_DIGITAL, DrvJoy1 + 4, "diag" },
{"Tilt", BIT_DIGITAL, DrvJoy1 + 6, "tilt" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
};
STDINPUTINFO(Zwackery)
static struct BurnDIPInfo ZwackeryDIPList[]=
{
DIP_OFFSET(0x0f)
{0x00, 0xff, 0xff, 0x00, NULL },
{0 , 0xfe, 0 , 8, "Coinage" },
{0x00, 0x01, 0x07, 0x05, "6 Coins 1 Credits" },
{0x00, 0x01, 0x07, 0x04, "5 Coins 1 Credits" },
{0x00, 0x01, 0x07, 0x03, "4 Coins 1 Credits" },
{0x00, 0x01, 0x07, 0x02, "3 Coins 1 Credits" },
{0x00, 0x01, 0x07, 0x01, "2 Coins 1 Credits" },
{0x00, 0x01, 0x07, 0x00, "1 Coin 1 Credits" },
{0x00, 0x01, 0x07, 0x06, "1 Coin 2 Credits" },
{0x00, 0x01, 0x07, 0x07, "Free Play" },
{0 , 0xfe, 0 , 8, "Buy-in" },
{0x00, 0x01, 0x38, 0x00, "1 coin" },
{0x00, 0x01, 0x38, 0x08, "2 coins" },
{0x00, 0x01, 0x38, 0x10, "3 coins" },
{0x00, 0x01, 0x38, 0x18, "4 coins" },
{0x00, 0x01, 0x38, 0x20, "5 coins" },
{0x00, 0x01, 0x38, 0x28, "6 coins" },
{0x00, 0x01, 0x38, 0x30, "7 coins" },
{0x00, 0x01, 0x38, 0x38, "None" },
{0 , 0xfe, 0 , 4, "Difficulty" },
{0x00, 0x01, 0xc0, 0xc0, "Easier" },
{0x00, 0x01, 0xc0, 0x00, "Normal" },
{0x00, 0x01, 0xc0, 0x40, "Harder" },
{0x00, 0x01, 0xc0, 0x80, "Hardest" },
};
STDDIPINFO(Zwackery)
static void sync_ptm()
{
INT32 cyc = (SekTotalCycles() / 10) - ptm6840TotalCycles();
if (cyc > 0) {
ptm6840Run(cyc);
}
}
static void sync_csd()
{
INT32 cyc = ((INT64)SekTotalCycles(0) * 8000000 / 7652400) - SekTotalCycles(1);
if (cyc > 0) {
SekRun(1, cyc);
}
}
static void __fastcall zwackery_main_write_word(UINT32 address, UINT16 data)
{
if ((address & 0xfff000) == 0xc00000) {
*((UINT16*)(DrvSprRAM + (address & 0xffe))) = data | 0xff00;
return;
}
if ((address & 0xfffff0) == 0x100000) {
sync_ptm();
ptm6840_write((address & 0xf) >> 1, (data >> 8) & 0xff);
return;
}
if ((address & 0xfffff8) == 0x104000) {
pia_write(0, (address / 2) & 0x03, data >> 8);
return;
}
if ((address & 0xfffff8) == 0x108000) {
pia_write(1, (address / 2) & 0x03, data & 0xff);
return;
}
if ((address & 0xfffff8) == 0x10c000) {
pia_write(2, (address / 2) & 0x03, data & 0xff);
return;
}
if (address < 0x80000 || address == 0x804000) return; // bad writes?
bprintf(0, _T("mww %x %x\n"), address, data);
}
static void __fastcall zwackery_main_write_byte(UINT32 address, UINT8 data)
{
if ((address & 0xfff000) == 0xc00000) {
*((UINT16*)(DrvSprRAM + (address & 0xffe))) = data | 0xff00;
return;
}
if ((address & 0xfffff0) == 0x100000) {
sync_ptm();
ptm6840_write((address & 0xf) >> 1, data & 0xff);
return;
}
if ((address & 0xfffff8) == 0x104000) {
pia_write(0, (address / 2) & 0x03, data);
return;
}
if ((address & 0xfffff8) == 0x108000) {
pia_write(1, (address / 2) & 0x03, data);
return;
}
if ((address & 0xfffff8) == 0x10c000) {
pia_write(2, (address / 2) & 0x03, data);
return;
}
bprintf(0, _T("mwb %x %x\n"), address, data);
}
static UINT16 __fastcall zwackery_main_read_word(UINT32 address)
{
if ((address & 0xfffff0) == 0x100000) {
sync_ptm();
SekCyclesBurnRun(14);
return (ptm6840_read((address & 0xf) >> 1) << 8) | 0x00ff;
}
if ((address & 0xfffff8) == 0x104000) {
UINT16 ret = pia_read(0, (address / 2) & 0x03);
return ret | (ret << 8);
}
if ((address & 0xfffff8) == 0x108000) {
UINT16 ret = pia_read(1, (address / 2) & 0x03);
return ret | (ret << 8);
}
if ((address & 0xfffff8) == 0x10c000) {
UINT16 ret = pia_read(2, (address / 2) & 0x03);
return ret | (ret << 8);
}
bprintf(0, _T("mrw %x\n"), address);
return 0xffff;
}
static UINT8 __fastcall zwackery_main_read_byte(UINT32 address)
{
if ((address & 0xfffff0) == 0x100000) {
sync_ptm();
SekCyclesBurnRun(14); // pass timer test
return ptm6840_read((address & 0xf) >> 1);
}
if ((address & 0xfffff8) == 0x104000) {
return pia_read(0, (address / 2) & 0x03);
}
if ((address & 0xfffff8) == 0x108000) {
return pia_read(1, (address / 2) & 0x03);
}
if ((address & 0xfffff8) == 0x10c000) {
return pia_read(2, (address / 2) & 0x03);
}
bprintf(0, _T("mrb %x\n"), address);
return 0xff;
}
static UINT8 pia0_read_b(UINT16 )
{
return DrvInputs[0];
}
static void pia0_out_a(UINT16 offset, UINT8 data)
{
if (~data & 0x80) BurnWatchdogReset();
}
static void pia0_irq(int state)
{
state = pia_get_irq_a_state(0) | pia_get_irq_b_state(0);
SekSetIRQLine(5, (state) ? CPU_IRQSTATUS_ACK : CPU_IRQSTATUS_NONE);
}
static UINT8 pia1_read_a(UINT16 )
{
return DrvInputs[1];
}
static UINT8 pia1_read_b(UINT16 )
{
return (DrvInputs[2] & ~0x3e) | ((BurnTrackballRead(0, 0) >> 2) & 0x3e);
}
static void pia1_out_a(UINT16 offset, UINT8 data)
{
sound_data = data >> 4;
}
static void pia1_out_ca2(UINT16 offset, UINT8 data)
{
sync_csd();
csd_data_write((data << 4) | sound_data);
}
static UINT8 pia2_read_a(UINT16 )
{
return DrvInputs[3];
}
static UINT8 pia2_read_b(UINT16 )
{
return DrvDips[0];
}
static const pia6821_interface pia_0 = {
NULL, pia0_read_b, // in_a, in_b
NULL, NULL, NULL, NULL, // in_ca1, in_cb1, in_ca2, in_cb2
pia0_out_a, NULL, NULL, NULL, // out_a, out_b, out_ca2, out_cb2
pia0_irq, pia0_irq // irq_a, irq_b
};
static const pia6821_interface pia_1 = {
pia1_read_a, pia1_read_b, // in_a, in_b
NULL, NULL, NULL, NULL, // in_ca1, in_cb1, in_ca2, in_cb2
pia1_out_a, NULL, pia1_out_ca2, NULL, // out_a, out_b, out_ca2, out_cb2
NULL, NULL // irq_a, irq_b
};
static const pia6821_interface pia_2 = {
pia2_read_a, pia2_read_b, // in_a, in_b
NULL, NULL, NULL, NULL, // in_ca1, in_cb1, in_ca2, in_cb2
NULL, NULL, NULL, NULL, // out_a, out_b, out_ca2, out_cb2
NULL, NULL // irq_a, irq_b
};
static tilemap_callback( bg )
{
UINT16 attr = *((UINT16*)(DrvVidRAM + offs * 2));
TILE_SET_INFO(0, attr, attr >> 13, TILE_FLIPYX(attr >> 11));
}
static tilemap_callback( fg )
{
UINT16 attr = *((UINT16*)(DrvVidRAM + offs * 2));
INT32 color = (attr >> 13) & 7;
TILE_SET_INFO(1, attr, color, TILE_FLIPYX(attr >> 11) | TILE_GROUP(color ? 1 : 0));
}
static INT32 DrvDoReset()
{
memset (AllRam, 0, RamEnd - AllRam);
sound_data = 0;
SekOpen(0);
SekReset();
SekClose();
pia_reset();
csd_reset();
memset(nCyclesExtra, 0, sizeof(nCyclesExtra));
return 0;
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
Drv68KROM = Next; Next += 0x040000;
DrvSndROM = Next; Next += 0x008000;
DrvGfxROM0 = Next; Next += 0x040000;
DrvGfxROM1 = Next; Next += 0x040000;
DrvGfxROM2 = Next; Next += 0x040000; // sprites
DrvGfxROM3 = Next; Next += 0x008000; // color maps
DrvPalette = (UINT32*)Next; Next += 0x1000 * sizeof(UINT32);
AllRam = Next;
Drv68KRAMA = Next; Next += 0x001000;
Drv68KRAMB = Next; Next += 0x001000;
DrvVidRAM = Next; Next += 0x001000;
DrvPalRAM = Next; Next += 0x002000;
DrvSprRAM = Next; Next += 0x001000;
DrvSndRAM = Next; Next += 0x001000;
RamEnd = Next;
MemEnd = Next;
return 0;
}
static INT32 DrvGfxDecode()
{
INT32 Plane0[8] = { STEP8(0,0) };
INT32 XOffs0[16] = { STEP4(8*0+3,-1), STEP4(8*1+3,-1), STEP4(8*2+3,-1), STEP4(8*3+3,-1) };
INT32 YOffs0[16] = { 4, 0x4000*8+4, 0, 0x4000*8+0, 36, 0x4000*8+36, 32, 0x4000*8+32, 68, 0x4000*8+68, 64, 0x4000*8+64, 100, 0x4000*8+100, 96, 0x4000*8+96 };
INT32 L = (0x20000/4)*8;
INT32 Plane1[4] = { STEP4(0,1) };
INT32 XOffs1[32] = {
L*0+0, L*0+4, L*1+0, L*1+4, L*2+0, L*2+4, L*3+0, L*3+4,
L*0+0+8, L*0+4+8, L*1+0+8, L*1+4+8, L*2+0+8, L*2+4+8, L*3+0+8, L*3+4+8,
L*0+0+16, L*0+4+16, L*1+0+16, L*1+4+16, L*2+0+16, L*2+4+16, L*3+0+16, L*3+4+16,
L*0+0+24, L*0+4+24, L*1+0+24, L*1+4+24, L*2+0+24, L*2+4+24, L*3+0+24, L*3+4+24
};
INT32 YOffs1[32] = { STEP32(0,32) };
UINT8 *tmp = (UINT8*)BurnMalloc(0x20000);
if (tmp == NULL) {
return 1;
}
memcpy (tmp, DrvGfxROM0, 0x08000);
GfxDecode((0x08000 * 8) / (16 * 16), 8, 16, 16, Plane0, XOffs0, YOffs0, 0x080, tmp, DrvGfxROM0);
memcpy (tmp, DrvGfxROM2, 0x20000);
GfxDecode((0x20000 * 2) / (32 * 32), 4, 32, 32, Plane1, XOffs1, YOffs1, 0x400, tmp, DrvGfxROM2);
BurnFree(tmp);
return 0;
}
static void DrvGfxColorMix() // after decode
{
UINT8 *gfxdata0 = DrvGfxROM0;
UINT8 *gfxdata1 = DrvGfxROM1;
for (INT32 code = 0; code < 0x400; code++)
{
const UINT8 *coldata = DrvGfxROM3 + (code * 32);
for (INT32 y = 0; y < 16; y++)
{
for (INT32 x = 0; x < 16; x++, gfxdata0++, gfxdata1++)
{
INT32 coloffs = ((y & 0x0c) | ((x >> 2) & 0x03)) * 2;
INT32 pen0 = coldata[coloffs + 0];
INT32 pen1 = coldata[coloffs + 1];
INT32 tp0 = (pen0 & 0x80) ? pen0 : 0;
INT32 tp1 = (pen1 & 0x80) ? pen1 : 0;
*gfxdata1 = *gfxdata0 ? tp0 : tp1;
*gfxdata0 = *gfxdata0 ? pen0 : pen1;
}
}
}
}
static void zwackery_irq_cb(INT32 state)
{
SekSetIRQLine(6, (state) ? CPU_IRQSTATUS_ACK : CPU_IRQSTATUS_NONE);
}
static INT32 DrvInit()
{
BurnSetRefreshRate(30.00);
BurnAllocMemIndex();
{
INT32 k = 0;
if (BurnLoadRom(Drv68KROM + 0x000001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x000000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x008001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x008000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x010001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x010000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x018001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x018000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x020001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x020000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x028001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x028000, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x030001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x030000, k++, 2)) return 1;
if (BurnLoadRom(DrvSndROM + 0x000001, k++, 2)) return 1;
if (BurnLoadRom(DrvSndROM + 0x000000, k++, 2)) return 1;
if (BurnLoadRom(DrvSndROM + 0x004001, k++, 2)) return 1;
if (BurnLoadRom(DrvSndROM + 0x004000, k++, 2)) return 1;
if (BurnLoadRom(DrvGfxROM0 + 0x000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM0 + 0x004000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x004000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x008000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x00c000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x010000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x014000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x018000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM2 + 0x01c000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM3 + 0x000000, k++, 2)) return 1;
if (BurnLoadRom(DrvGfxROM3 + 0x000001, k++, 2)) return 1;
DrvGfxDecode();
DrvGfxColorMix();
}
SekInit(0, 0x68000);
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x037fff, MAP_ROM);
SekMapMemory(Drv68KRAMA, 0x080000, 0x080fff, MAP_RAM);
SekMapMemory(Drv68KRAMB, 0x084000, 0x084fff, MAP_RAM);
SekMapMemory(DrvVidRAM, 0x800000, 0x800fff, MAP_RAM);
SekMapMemory(DrvPalRAM, 0x802000, 0x803fff, MAP_RAM);
SekMapMemory(DrvSprRAM, 0xc00000, 0xc00fff, MAP_ROM);
SekSetWriteWordHandler(0, zwackery_main_write_word);
SekSetWriteByteHandler(0, zwackery_main_write_byte);
SekSetReadWordHandler(0, zwackery_main_read_word);
SekSetReadByteHandler(0, zwackery_main_read_byte);
SekClose();
// pias
pia_init();
pia_config(0, 0, &pia_0);
pia_config(1, 0, &pia_1);
pia_config(2, 0, &pia_2);
// sound
csd_init(1, 3, DrvSndROM, DrvSndRAM); // initializes sek #1, pia #3
// ptm
ptm6840_init(7652400 / 10);
ptm6840_set_irqcb(zwackery_irq_cb);
// dial
BurnTrackballInit(1);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, bg_map_callback, 16, 16, 32, 32);
GenericTilemapInit(1, TILEMAP_SCAN_ROWS, fg_map_callback, 16, 16, 32, 32);
GenericTilemapSetGfx(0, DrvGfxROM0, 8, 16, 16, 0x40000, 0, 7);
GenericTilemapSetGfx(1, DrvGfxROM1, 8, 16, 16, 0x40000, 0, 7);
GenericTilemapSetTransparent(1, 0);
DrvDoReset();
return 0;
}
static INT32 DrvExit()
{
GenericTilesExit();
SekExit();
csd_exit();
pia_exit();
BurnTrackballExit();
BurnFreeMemIndex();
return 0;
}
static void DrvPaletteUpdate()
{
UINT16 *p = (UINT16*)DrvPalRAM;
for (INT32 i = 0; i < 0x2000/2; i++)
{
UINT16 d = p[i] ^ 0xffff;
UINT8 r = ((d >> 10) & 0x1f);
UINT8 g = ((d >> 0) & 0x1f);
UINT8 b = ((d >> 5) & 0x1f);
r = (r << 3) | (r >> 2);
g = (g << 3) | (g >> 2);
b = (b << 3) | (b >> 2);
DrvPalette[i] = BurnHighCol(r,g,b,0);
}
}
static void draw_sprites(INT32 priority)
{
UINT16 *spriteram = (UINT16*)DrvSprRAM;
memset (pPrioDraw, 1, nScreenWidth * nScreenHeight);
for (INT32 offs = 0x1000 / 2 - 4; offs >= 0; offs -= 4)
{
INT32 code = spriteram[offs + 2] & 0xff;
if (code == 0) continue;
INT32 flags = spriteram[offs + 1] & 0xff;
INT32 color = ((~flags >> 2) & 0x0f) | ((flags & 0x02) << 3);
if (priority == 0 && color == 7) continue;
else if (priority == 1 && color != 7) continue;
INT32 flipx = ~flags & 0x40;
INT32 flipy = flags & 0x80;
INT32 sx = (231 - (spriteram[offs + 3] & 0xff)) * 2;
INT32 sy = (241 - (spriteram[offs] & 0xff)) * 2;
if (sx <= -32) sx += 512;
RenderPrioTransmaskSprite(pTransDraw, DrvGfxROM2, code, (color * 16) | 0x800, 0x0101, sx, sy, flipx, flipy, 32, 32, 0);
RenderPrioTransmaskSprite(pTransDraw, DrvGfxROM2, code, (color * 16) | 0x800, 0xfeff, sx, sy, flipx, flipy, 32, 32, 0);
}
}
static INT32 DrvDraw()
{
DrvPaletteUpdate();
BurnTransferClear();
if (nBurnLayer & 1) GenericTilemapDraw(0, pTransDraw, 0);
if (nSpriteEnable & 1) draw_sprites(0);
if (nBurnLayer & 2) GenericTilemapDraw(1, pTransDraw, TMAP_SET_GROUP(1));
if (nSpriteEnable & 2) draw_sprites(1);
BurnTransferCopy(DrvPalette);
return 0;
}
static INT32 DrvFrame()
{
SekNewFrame();
ptm6840NewFrame();
if (DrvReset) {
DrvDoReset();
}
{
Diag.Toggle(DrvJoy1[4]);
DrvInputs[0] = 0xff;
DrvInputs[1] = 0xff;
DrvInputs[2] = 0xff;
DrvInputs[3] = 0xff;
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;
}
BurnTrackballConfig(0, AXIS_REVERSED, AXIS_REVERSED);
BurnTrackballFrame(0, Analog[0] * 2, 0, 0x01, 0x7f);
BurnTrackballUpdate(0);
}
INT32 nInterleave = 512;
INT32 nCyclesTotal[2] = { 7652400 / 30, 8000000 / 30 };
INT32 nCyclesDone[2] = { 0, 0 };
SekIdle(0, nCyclesExtra[0]); // when CPU_RUN_SYNCINT is used, we have to Idle extra cycles. (overflow from previous frame)
ptm6840Idle(nCyclesExtra[0]);
for (INT32 i = 0; i < nInterleave; i++)
{
SekOpen(0);
if (i == 493) { // vsync
ptm6840_set_c1(0);
ptm6840_set_c1(1);
pia_set_input_ca1(0, 1);
}
if (i == 494) pia_set_input_ca1(0, 0);
// hsync
ptm6840_set_c3(0);
ptm6840_set_c3(1);
CPU_RUN_SYNCINT(0, Sek);
sync_ptm();
SekClose();
SekOpen(1);
CPU_RUN_SYNCINT(1, Sek);
SekClose();
}
nCyclesExtra[0] = SekTotalCycles(0) - nCyclesTotal[0];
if (pBurnSoundOut) {
BurnSoundClear();
DACUpdate(pBurnSoundOut, nBurnSoundLen);
BurnSoundDCFilter();
}
if (pBurnDraw) {
BurnDrvRedraw();
}
return 0;
}
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin != NULL) {
*pnMin = 0x029698;
}
if (nAction & ACB_MEMORY_RAM) {
memset(&ba, 0, sizeof(ba));
ba.Data = AllRam;
ba.nLen = RamEnd-AllRam;
ba.szName = "All Ram";
BurnAcb(&ba);
}
if (nAction & ACB_DRIVER_DATA) {
SekScan(nAction);
pia_scan(nAction, pnMin);
ptm6840_scan(nAction);
csd_scan(nAction, pnMin);
BurnTrackballScan();
BurnWatchdogScan(nAction);
Diag.Scan();
SCAN_VAR(sound_data);
SCAN_VAR(nCyclesExtra);
}
return 0;
}
// Zwackery
static struct BurnRomInfo zwackeryRomDesc[] = {
{ "385a-42aae-jxrd.a6", 0x4000, 0x6fb9731c, 1 | BRF_PRG | BRF_ESS }, // 0 Main 68K Code
{ "385a-42aae-kxrd.b6", 0x4000, 0x84b92555, 1 | BRF_PRG | BRF_ESS }, // 1
{ "385a-42aae-lxrd.a7", 0x4000, 0xe6977a2a, 1 | BRF_PRG | BRF_ESS }, // 2
{ "385a-42aae-mxrd.b7", 0x4000, 0xf5d0a60e, 1 | BRF_PRG | BRF_ESS }, // 3
{ "385a-42aae-nxrd.a8", 0x4000, 0xec5841d9, 1 | BRF_PRG | BRF_ESS }, // 4
{ "385a-42aae-pxrd.b8", 0x4000, 0xd7d99ce0, 1 | BRF_PRG | BRF_ESS }, // 5
{ "385a-42aae-rxrd.a9", 0x4000, 0xb9fe7bf5, 1 | BRF_PRG | BRF_ESS }, // 6
{ "385a-42aae-txrd.b9", 0x4000, 0x5e261b3b, 1 | BRF_PRG | BRF_ESS }, // 7
{ "385a-42aae-uxrd.a10", 0x4000, 0x55e380a5, 1 | BRF_PRG | BRF_ESS }, // 8
{ "385a-42aae-vxrd.b10", 0x4000, 0x12249dca, 1 | BRF_PRG | BRF_ESS }, // 9
{ "385a-42aae-wxrd.a11", 0x4000, 0x6a39a8ca, 1 | BRF_PRG | BRF_ESS }, // 10
{ "385a-42aae-yxrd.b11", 0x4000, 0xad6b45bc, 1 | BRF_PRG | BRF_ESS }, // 11
{ "385a-42aae-zxrd.a12", 0x4000, 0xe2d25e1f, 1 | BRF_PRG | BRF_ESS }, // 12
{ "385a-42aae-1xrd.b12", 0x4000, 0xe131f9b8, 1 | BRF_PRG | BRF_ESS }, // 13
{ "385a-22aae-aamd.u7", 0x2000, 0x5501f54b, 2 | BRF_PRG | BRF_ESS }, // 14 Cheap Squeak Deluxe 68K Code
{ "385a-22aae-bamd.u17", 0x2000, 0x2e482580, 2 | BRF_PRG | BRF_ESS }, // 15
{ "385a-22aae-camd.u8", 0x2000, 0x13366575, 2 | BRF_PRG | BRF_ESS }, // 16
{ "385a-22aae-damd.u18", 0x2000, 0xbcfe5820, 2 | BRF_PRG | BRF_ESS }, // 17
{ "385a-42aae-2xrd.1h", 0x4000, 0xa7237eb1, 3 | BRF_GRA }, // 18 Background/Foreground Tiles
{ "385a-42aae-3xrd.1g", 0x4000, 0x626cc69b, 3 | BRF_GRA }, // 19
{ "385a-42aae-axrd.6h", 0x4000, 0xa51158dc, 4 | BRF_GRA }, // 20 Sprites
{ "385a-42aae-exrd.7h", 0x4000, 0x941feecf, 4 | BRF_GRA }, // 21
{ "385a-42aae-bxrd.6j", 0x4000, 0xf3eef316, 4 | BRF_GRA }, // 22
{ "385a-42aae-fxrd.7j", 0x4000, 0xa8a34033, 4 | BRF_GRA }, // 23
{ "385a-42aae-cxrd.10h", 0x4000, 0xa99daea6, 4 | BRF_GRA }, // 24
{ "385a-42aae-gxrd.11h", 0x4000, 0xc1a767fb, 4 | BRF_GRA }, // 25
{ "385a-42aae-dxrd.10j", 0x4000, 0x4dd04376, 4 | BRF_GRA }, // 26
{ "385a-42aae-hxrd.11j", 0x4000, 0xe8c6a880, 4 | BRF_GRA }, // 27
{ "385a-42aae-5xrd.1f", 0x4000, 0xa0dfcd7e, 5 | BRF_GRA }, // 28 Background Color Look-up Tables
{ "385a-42aae-4xrd.1e", 0x4000, 0xab504dc8, 5 | BRF_GRA }, // 29
{ "pal.d5", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 30 PLDs
{ "pal.d2", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 31
{ "pal.d4", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 32
{ "pal.d3", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 33
{ "pal.e6", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 34
{ "pal.f8", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 35
{ "pal.a5", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 36
{ "pal.1f", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 37
{ "pal.1d", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 38
{ "pal.1c", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 39
{ "pal.5c", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 40
{ "pal.5j", 0x0001, 0x00000000, 6 | BRF_NODUMP | BRF_OPT }, // 41
};
STD_ROM_PICK(zwackery)
STD_ROM_FN(zwackery)
struct BurnDriver BurnDrvZwackery = {
"zwackery", NULL, NULL, NULL, "1984",
"Zwackery\0", NULL, "Bally Midway", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_MISC_PRE90S, GBF_PLATFORM, 0,
NULL, zwackeryRomInfo, zwackeryRomName, NULL, NULL, NULL, NULL, ZwackeryInputInfo, ZwackeryDIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x1000,
512, 480, 4, 3
};