add driver Gal's Panic 3 [iq_132 vs dink]

This commit is contained in:
dinkc64 2020-04-17 09:21:49 -04:00
parent f3e41efd5e
commit d8fd5c0545
2 changed files with 897 additions and 1 deletions

View File

@ -73,7 +73,7 @@ drvsrc = d_akkaarrh.o d_arcadecl.o d_atarig1.o d_badlands.o d_batman.o d_blstro
\
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_blackt96.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 d_fuukifg3.o d_gaelco.o d_gaelco2.o d_gaiden.o d_galpanic.o d_galspnbl.o d_glass.o d_go2000.o \
d_esd16.o d_f1gp.o d_funybubl.o d_fuukifg2.o d_fuukifg3.o d_gaelco.o d_gaelco2.o d_gaiden.o d_galpani3.o d_galpanic.o d_galspnbl.o d_glass.o d_go2000.o \
d_gotcha.o d_gstream.o d_gumbo.o d_hyperpac.o d_itech32.o d_inufuku.o d_jchan.o d_kaneko16.o d_kickgoal.o d_legionna.o d_limenko.o d_lordgun.o d_macrossp.o d_mcatadv.o d_metro.o d_midas.o d_mirage.o \
d_missb2.o d_mosaic.o d_mugsmash.o d_mwarr.o d_namcos2.o d_news.o d_nmg5.o d_nmk16.o d_ohmygod.o d_oneshot.o d_onetwo.o d_pass.o d_patapata.o \
d_pipedrm.o d_pirates.o d_pkscram.o d_playmark.o d_powerins.o d_ppmast93.o d_pushman.o d_rabbit.o d_raiden.o d_raiden2.o d_sandscrp.o d_seta.o d_seta2.o \

View File

@ -0,0 +1,896 @@
// FinalBurn Neo Kaneko Gals Panic 3 driver module
// Based on MAME driver by David Haywood
// Tofix/Todo:
// Game crashes in while changing settings if the processor is 68000.
// Currently set to 68ec020 to avoid this.
#include "tiles_generic.h"
#include "m68000_intf.h"
#include "sknsspr.h"
#include "ymz280b.h"
#include "watchdog.h"
#include "burn_pal.h"
static UINT8 *AllMem;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *MemEnd;
static UINT8 *Drv68KROM;
static UINT8 *Drv68KRAM;
static UINT8 *DrvMCUROM;
static UINT8 *DrvGfxROM;
static UINT8 *DrvSndROM;
static UINT8 *DrvSprROM;
static UINT8 *DrvPalRAM;
static UINT8 *DrvSprRAM;
static UINT8 *DrvSprRegs;
static UINT8 *DrvMCURAM;
static UINT8 *DrvNVRAM;
static UINT16 *DrvPrioBuffer;
static UINT16 *DrvFrameBuffer[3];
static UINT32 *DrvPalette;
static UINT8 DrvRecalc;
static INT32 scrollx[3];
static INT32 scrolly[3];
static INT32 enable[3];
static INT32 fbbright1[3];
static INT32 fbbright2[3];
static INT32 regs1_address[4][2];
static INT32 prio_scrollx;
static INT32 prio_scrolly;
static INT32 regs1[3];
static UINT16 toybox_mcu_com[4];
static UINT8 DrvJoy1[16];
static UINT8 DrvJoy2[16];
static UINT8 DrvJoy3[16];
static UINT8 DrvDips[2];
static UINT8 DrvReset;
static UINT16 DrvInputs[3];
static struct BurnInputInfo Galpani3InputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy3 + 10, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy3 + 8, "p1 start" },
{"P1 Up", BIT_DIGITAL, DrvJoy1 + 8, "p1 up" },
{"P1 Down", BIT_DIGITAL, DrvJoy1 + 9, "p1 down" },
{"P1 Left", BIT_DIGITAL, DrvJoy1 + 10, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy1 + 11, "p1 right" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 12, "p1 fire 1" },
{"P2 Coin", BIT_DIGITAL, DrvJoy3 + 11, "p2 coin" },
{"P2 Start", BIT_DIGITAL, DrvJoy3 + 9, "p2 start" },
{"P2 Up", BIT_DIGITAL, DrvJoy2 + 8, "p2 up" },
{"P2 Down", BIT_DIGITAL, DrvJoy2 + 9, "p2 down" },
{"P2 Left", BIT_DIGITAL, DrvJoy2 + 10, "p2 left" },
{"P2 Right", BIT_DIGITAL, DrvJoy2 + 11, "p2 right" },
{"P2 Button 1", BIT_DIGITAL, DrvJoy2 + 12, "p2 fire 1" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Service", BIT_DIGITAL, DrvJoy3 + 14, "service" },
{"Service Mode", BIT_DIGITAL, DrvJoy3 + 12, "diag" },
{"Tilt", BIT_DIGITAL, DrvJoy3 + 13, "tilt" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
};
STDINPUTINFO(Galpani3)
static struct BurnDIPInfo Galpani3DIPList[]=
{
{0x12, 0xff, 0xff, 0xff, NULL },
{0 , 0xfe, 0 , 2, "Test Mode" },
{0x12, 0x01, 0x01, 0x01, "Off" },
{0x12, 0x01, 0x01, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Flip Screen" },
{0x12, 0x01, 0x02, 0x02, "Off" },
{0x12, 0x01, 0x02, 0x00, "On" },
{0 , 0xfe, 0 , 2, "Demo Sounds" },
{0x12, 0x01, 0x04, 0x00, "Off" },
{0x12, 0x01, 0x04, 0x04, "On" },
};
STDDIPINFO(Galpani3)
static void toybox_handle_04_subcommand(UINT8 mcu_subcmd, UINT16* mcu_ram)
{
UINT8 *src = DrvMCUROM+0x10000;
INT32 offs = (mcu_subcmd&0x3f)*8;
UINT16 romstart = src[offs+2] | (src[offs+3]<<8);
UINT16 romlength = src[offs+4] | (src[offs+5]<<8);
UINT16 ramdest = BURN_ENDIAN_SWAP_INT16(mcu_ram[0x0012/2]);
memcpy (DrvMCURAM + ramdest, src + romstart, romlength);
}
static void toybox_mcu_run()
{
UINT16 *kaneko16_mcu_ram = (UINT16*)DrvMCURAM;
UINT16 mcu_command = BURN_ENDIAN_SWAP_INT16(kaneko16_mcu_ram[0x0010/2]);
UINT16 mcu_offset = BURN_ENDIAN_SWAP_INT16(kaneko16_mcu_ram[0x0012/2]) / 2;
UINT16 mcu_data = BURN_ENDIAN_SWAP_INT16(kaneko16_mcu_ram[0x0014/2]);
switch (mcu_command >> 8)
{
case 0x02:
memcpy (kaneko16_mcu_ram + mcu_offset, DrvNVRAM, 0x80);
break;
case 0x42:
memcpy (DrvNVRAM, kaneko16_mcu_ram + mcu_offset, 0x80);
break;
case 0x03: // DSW
kaneko16_mcu_ram[mcu_offset] = (DrvDips[0] << 8) | 0;
break;
case 0x04: // Protection
toybox_handle_04_subcommand(mcu_data, kaneko16_mcu_ram);
break;
}
}
static void toybox_mcu_com_write(UINT16 data, INT32 select)
{
toybox_mcu_com[select] = data;
if (toybox_mcu_com[0] != 0xffff) return;
if (toybox_mcu_com[1] != 0xffff) return;
if (toybox_mcu_com[2] != 0xffff) return;
if (toybox_mcu_com[3] != 0xffff) return;
memset (toybox_mcu_com, 0, sizeof(toybox_mcu_com));
toybox_mcu_run();
}
static void do_rle(INT32 which)
{
INT32 rle_count = 0;
INT32 normal_count = 0;
UINT32 dstaddress = 0;
UINT8 thebyte;
UINT32 address = regs1_address[which][1] | (regs1_address[which][0]<<16);
UINT16 *framebuffer = DrvFrameBuffer[which];
while (dstaddress<0x40000)
{
if (rle_count==0 && normal_count==0)
{
thebyte = DrvGfxROM[address & 0xffffff];
if (thebyte & 0x80)
{
normal_count = (thebyte & 0x7f)+1;
address++;
}
else
{
rle_count = (thebyte & 0x7f)+1;
address++;
}
}
else if (rle_count)
{
thebyte = DrvGfxROM[address & 0xffffff];
framebuffer[dstaddress] = thebyte;
dstaddress++;
rle_count--;
if (rle_count==0)
{
address++;
}
}
else if (normal_count)
{
thebyte = DrvGfxROM[address & 0xffffff];
framebuffer[dstaddress] = thebyte;
dstaddress++;
normal_count--;
address++;
}
}
}
static void __fastcall galpani3_write_word(UINT32 address, UINT16 data)
{
switch (address)
{
case 0x580000:
toybox_mcu_com_write(data, 0);
return;
case 0x600000:
toybox_mcu_com_write(data, 1);
return;
case 0x680000:
toybox_mcu_com_write(data, 2);
return;
case 0x700000:
toybox_mcu_com_write(data, 3);
return;
case 0x800400:
case 0xa00400:
case 0xc00400:
scrollx[(address / 0x200000) & 3] = data;
return;
case 0x800c00:
case 0xa00c00:
case 0xc00c00:
scrolly[(address / 0x200000) & 3] = data;
return;
case 0x800c02:
case 0xa00c02:
case 0xc00c02:
enable[(address / 0x200000) & 3] = data;
return;
case 0x800c06:
case 0xa00c06:
case 0xc00c06:
*((UINT16*)(DrvPalRAM + 0x8600 + ((address / 0x200000) & 3) * 2)) = data;
return;
case 0x800c10:
case 0xa00c10:
case 0xc00c10:
fbbright1[(address / 0x200000) & 3] = data;
return;
case 0x800c12:
case 0xa00c12:
case 0xc00c12:
fbbright2[(address / 0x200000) & 3] = data;
return;
case 0x800c18:
case 0x800c1a:
case 0xa00c18:
case 0xa00c1a:
case 0xc00c18:
case 0xc00c1a:
regs1_address[(address / 0x200000) & 3][(address / 2) & 1] = data;
return;
case 0x800c1e:
case 0xa00c1e:
case 0xc00c1e:
if ((data & 0xefff) == 0x2000) do_rle((address / 0x200000) & 3);
return;
case 0xe80000:
prio_scrollx = data;
return;
case 0xe80002:
prio_scrolly = data;
return;
case 0xf00020:
YMZ280BSelectRegister(data & 0xff);
return;
case 0xf00022:
YMZ280BWriteRegister(data & 0xff);
return;
case 0xf00040:
BurnWatchdogWrite();
return;
}
}
static void __fastcall galpani3_write_byte(UINT32 address, UINT8 data)
{
switch (address)
{
case 0xf00021:
YMZ280BSelectRegister(data);
return;
case 0xf00023:
YMZ280BWriteRegister(data);
return;
}
}
static UINT16 __fastcall galpani3_read_word(UINT32 address)
{
switch (address)
{
case 0x780000:
return 0; // mcu status
case 0x800c02:
case 0xa00c04:
case 0xc00c04:
return enable[(address / 0x200000) & 3];
case 0x800c10:
case 0xa00c10:
case 0xc00c10:
return fbbright1[(address / 0x200000) & 3];
case 0x800c12:
case 0xa00c12:
case 0xc00c12:
return fbbright2[(address / 0x200000) & 3];
case 0x800c16:
case 0xa00c16:
case 0xc00c16:
regs1[(address / 0x200000) & 3] ^= 1;
return 0xffff ^ regs1[(address / 0x200000) & 3];
case 0xf00010:
return DrvInputs[0];
case 0xf00012:
return DrvInputs[1];
case 0xf00014:
return DrvInputs[2];
case 0xf00040:
return BurnWatchdogRead();
}
return 0xff;
}
static UINT8 __fastcall galpani3_read_byte(UINT32 address)
{
return SekReadWord(address & ~1) >> ((~address & 1) * 8);
}
static INT32 DrvDoReset(INT32 clear_mem)
{
if (clear_mem) {
memset (AllRam, 0, RamEnd - AllRam);
}
SekOpen(0);
SekReset();
SekClose();
YMZ280BReset();
BurnWatchdogReset();
memset (scrollx, 0, sizeof(scrollx));
memset (scrolly, 0, sizeof(scrolly));
memset (enable, 0, sizeof(enable));
memset (fbbright1, 0, sizeof(fbbright1));
memset (fbbright2, 0, sizeof(fbbright2));
memset (regs1_address, 0, sizeof(regs1_address));
memset (regs1, 0, sizeof(regs1));
memset (toybox_mcu_com, 0, sizeof(toybox_mcu_com));
prio_scrollx = 0;
prio_scrolly = 0;
return 0;
}
static INT32 MemIndex()
{
UINT8 *Next; Next = AllMem;
Drv68KROM = Next; Next += 0x100000;
DrvMCUROM = Next; Next += 0x020000;
DrvGfxROM = Next; Next += 0x1000000;
DrvSprROM = Next; Next += 0x200000;
YMZ280BROM = Next;
DrvSndROM = Next; Next += 0x300000;
DrvPalette = (UINT32*)Next; Next += 0x4304 * sizeof(UINT32);
DrvNVRAM = Next; Next += 0x000080;
AllRam = Next;
Drv68KRAM = Next; Next += 0x010000;
DrvPalRAM = Next; Next += 0x008800;
DrvSprRAM = Next; Next += 0x004000;
DrvSprRegs = Next; Next += 0x000400;
DrvMCURAM = Next; Next += 0x010000;
DrvPrioBuffer = (UINT16*)Next; Next += 0x080000;
DrvFrameBuffer[0] = (UINT16*)Next; Next += 0x080000;
DrvFrameBuffer[1] = (UINT16*)Next; Next += 0x080000;
DrvFrameBuffer[2] = (UINT16*)Next; Next += 0x080000;
RamEnd = Next;
MemEnd = Next;
return 0;
}
static void toybox_decrypt_rom()
{
static const UINT8 toybox_mcu_decryption_table[0x100] = {
0x7b, 0x82, 0xf0, 0xbc, 0x7f, 0x1d, 0xa2, 0xc5, 0x2a, 0xfa, 0x55, 0xee, 0x1a, 0xd0, 0x59, 0x76,
0x5e, 0x75, 0x79, 0x16, 0xa5, 0xf6, 0x84, 0xed, 0x0f, 0x2e, 0xf2, 0x36, 0x61, 0xac, 0xcd, 0xab,
0x01, 0x3b, 0x01, 0x87, 0x73, 0xab, 0xce, 0x5d, 0xd4, 0x1d, 0x68, 0x2a, 0x35, 0xea, 0x13, 0x27,
0x00, 0xaa, 0x46, 0x36, 0x6e, 0x65, 0x80, 0x7e, 0x19, 0xe2, 0x96, 0xab, 0xac, 0xa5, 0x6c, 0x63,
0x4a, 0x6f, 0x87, 0xf6, 0x6a, 0xac, 0x38, 0xe2, 0x1f, 0x87, 0xf9, 0xaa, 0xf5, 0x41, 0x60, 0xa6,
0x42, 0xb9, 0x30, 0xf2, 0xc3, 0x1c, 0x4e, 0x4b, 0x08, 0x10, 0x42, 0x32, 0xbf, 0xb2, 0xc5, 0x0f,
0x7a, 0xab, 0x97, 0xf6, 0xe7, 0xb3, 0x46, 0xf8, 0xec, 0x2b, 0x7d, 0x5f, 0xb1, 0x10, 0x03, 0xe4,
0x0f, 0x22, 0xdf, 0x8d, 0x10, 0x66, 0xa7, 0x7e, 0x96, 0xbd, 0x5a, 0xaf, 0xaa, 0x43, 0xdf, 0x10,
0x7c, 0x04, 0xe2, 0x9d, 0x66, 0xd7, 0xf0, 0x02, 0x58, 0x8a, 0x55, 0x17, 0x16, 0xe2, 0xe2, 0x52,
0xaf, 0xd9, 0xf9, 0x0d, 0x59, 0x70, 0x86, 0x3c, 0x05, 0xd1, 0x52, 0xa7, 0xf0, 0xbf, 0x17, 0xd0,
0x23, 0x15, 0xfe, 0x23, 0xf2, 0x80, 0x60, 0x6f, 0x95, 0x89, 0x67, 0x65, 0xc9, 0x0e, 0xfc, 0x16,
0xd6, 0x8a, 0x9f, 0x25, 0x2c, 0x0f, 0x2d, 0xe4, 0x51, 0xb2, 0xa8, 0x18, 0x3a, 0x5d, 0x66, 0xa0,
0x9f, 0xb0, 0x58, 0xea, 0x78, 0x72, 0x08, 0x6a, 0x90, 0xb6, 0xa4, 0xf5, 0x08, 0x19, 0x60, 0x4e,
0x92, 0xbd, 0xf1, 0x05, 0x67, 0x4f, 0x24, 0x99, 0x69, 0x1d, 0x0c, 0x6d, 0xe7, 0x74, 0x88, 0x22,
0x2d, 0x15, 0x7a, 0xa2, 0x37, 0xa9, 0xa0, 0xb0, 0x2c, 0xfb, 0x27, 0xe5, 0x4f, 0xb6, 0xcd, 0x75,
0xdc, 0x39, 0xce, 0x6f, 0x1f, 0xfe, 0xcc, 0xb5, 0xe6, 0xda, 0xd8, 0xee, 0x85, 0xee, 0x2f, 0x04,
};
for (INT32 i = 0; i < 0x20000; i++) {
DrvMCUROM[i] = DrvMCUROM[i] + toybox_mcu_decryption_table[(i ^ 1) & 0xff];
}
}
static INT32 DrvInit()
{
BurnAllocMemIndex();
{
INT32 k = 0;
if (BurnLoadRom(Drv68KROM + 0x000001, k++, 2)) return 1;
if (BurnLoadRom(Drv68KROM + 0x000000, k++, 2)) return 1;
if (BurnLoadRom(DrvSprROM + 0x000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM + 0x000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM + 0x200000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM + 0x400000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM + 0x600000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM + 0xe00000, k++, 2)) return 1;
if (BurnLoadRom(DrvGfxROM + 0xe00001, k++, 2)) return 1;
if (BurnLoadRom(DrvSndROM + 0x000000, k++, 1)) return 1;
if (BurnLoadRom(DrvSndROM + 0x200000, k++, 1)) return 1;
if (BurnLoadRom(DrvMCUROM + 0x000000, k++, 1)) return 1;
BurnByteswap (DrvMCUROM, 0x20000);
toybox_decrypt_rom();
}
SekInit(0, 0x68ec020); // really a 68000, but game settings crashes with 68000?
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x17ffff, MAP_ROM);
SekMapMemory(Drv68KRAM, 0x200000, 0x20ffff, MAP_RAM);
SekMapMemory(DrvPalRAM, 0x280000, 0x287fff, MAP_RAM);
SekMapMemory(DrvSprRAM, 0x300000, 0x303fff, MAP_RAM);
SekMapMemory(DrvSprRegs, 0x380000, 0x38003f | 0x3ff, MAP_RAM); // page size is 3ff
SekMapMemory(DrvMCURAM, 0x400000, 0x40ffff, MAP_RAM);
SekMapMemory(DrvPalRAM + 0x8000, 0x880000, 0x8803ff, MAP_RAM); // 0-1ff
SekMapMemory((UINT8*)DrvFrameBuffer[0], 0x900000, 0x97ffff, MAP_RAM);
SekMapMemory(DrvPalRAM + 0x8200, 0xa80000, 0xa803ff, MAP_RAM); // 0-1ff
SekMapMemory((UINT8*)DrvFrameBuffer[1], 0xb00000, 0xb7ffff, MAP_RAM);
SekMapMemory(DrvPalRAM + 0x8400, 0xc80000, 0xc803ff, MAP_RAM); // 0-1ff
SekMapMemory((UINT8*)DrvFrameBuffer[2], 0xd00000, 0xd7ffff, MAP_RAM);
SekMapMemory((UINT8*)DrvPrioBuffer, 0xe00000, 0xe7ffff, MAP_RAM);
SekSetWriteWordHandler(0, galpani3_write_word);
SekSetWriteByteHandler(0, galpani3_write_byte);
SekSetReadWordHandler(0, galpani3_read_word);
SekSetReadByteHandler(0, galpani3_read_byte);
SekClose();
skns_init();
memset(DrvNVRAM, 0xff, 0x80);
BurnWatchdogInit(DrvDoReset, 180);
YMZ280BInit(33333000/2, NULL, 0x300000);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 0.80, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 0.80, BURN_SND_ROUTE_RIGHT);
GenericTilesInit();
BurnBitmapAllocate(1, nScreenWidth, nScreenHeight, 0);
DrvDoReset(1);
return 0;
}
static INT32 DrvExit()
{
GenericTilesExit();
YMZ280BExit();
YMZ280BROM = NULL;
skns_exit();
SekExit();
BurnFreeMemIndex();
return 0;
}
static void DrvPaletteUpdate()
{
UINT16 *p = (UINT16*)DrvPalRAM;
for (INT32 i = 0; i < 0x8608/2; i++)
{
UINT8 g = pal5bit(p[i] >> 10);
UINT8 r = pal5bit(p[i] >> 5);
UINT8 b = pal5bit(p[i] >> 0);
DrvPalette[i] = (r << 16) | (g << 8) | b; // 32-bit!!
}
}
static inline UINT32 alpha_blend(UINT32 d, UINT32 s, UINT32 p)
{
if (p == 0) return d;
INT32 a = 255 - p;
return (((((s & 0xff00ff) * p) + ((d & 0xff00ff) * a)) & 0xff00ff00) |
((((s & 0x00ff00) * p) + ((d & 0x00ff00) * a)) & 0x00ff0000)) >> 8;
}
#define COPY_SPRITE_PIXEL(prio) \
if ((sprpri == (prio)) && sprdat) dst = DrvPalette[sprline[drawx] & 0x3fff]
#define DRAW_BLIT_PIXEL(dat,fb) \
{ \
UINT16 pen = dat; \
UINT32 pal = DrvPalette[pen]; \
INT32 alpha = 0xff; \
if (*((UINT16*)(DrvPalRAM + pen * 2)) >> 15) { \
alpha = fbbright2[fb] & 0xff; \
} else { \
alpha = fbbright1[fb] & 0xff; \
} \
if (alpha != 0xff) \
{ \
dst = alpha_blend(dst, pal, alpha); \
} \
else \
{ \
dst = pal; \
} \
}
#define DRAW_BLITLAYER1() DRAW_BLIT_PIXEL(dat1+0x4000,0)
#define DRAW_BLITLAYER2() DRAW_BLIT_PIXEL(dat2+0x4100,1)
#define DRAW_BLITLAYER3() DRAW_BLIT_PIXEL(dat3+0x4200,2)
static INT32 DrvDraw()
{
DrvPaletteUpdate();
// Clear sknsspr bitmap register (assumed only used by galpani3)
UINT32 *sprite_regs = (UINT32*)DrvSprRegs;
if (~sprite_regs[0x04/4] & 0x04) {
BurnBitmapFill(1, 0);
}
skns_draw_sprites(BurnBitmapGetBitmap(1), (UINT32*)DrvSprRAM, 0x4000, DrvSprROM, 0x200000, (UINT32*)DrvSprRegs, 0);
for (INT32 drawy = 0; drawy < nScreenHeight; drawy++)
{
UINT16 *srcline1 = DrvFrameBuffer[0] + ((drawy+scrolly[0]+11)&0x1ff) * 0x200;
UINT16 *srcline2 = DrvFrameBuffer[1] + ((drawy+scrolly[1]+11)&0x1ff) * 0x200;
UINT16 *srcline3 = DrvFrameBuffer[2] + ((drawy+scrolly[2]+11)&0x1ff) * 0x200;
UINT16 *priline = DrvPrioBuffer + ((drawy+prio_scrolly+11)&0x1ff) * 0x200;
UINT16 *sprline = BurnBitmapGetPosition(1, 0, drawy);
UINT8 *bmp = pBurnDraw + drawy * nScreenWidth * nBurnBpp;
for (INT32 drawx = 0; drawx < nScreenWidth; drawx++)
{
INT32 prioffs = (drawx+prio_scrollx+66) & 0x1ff;
UINT8 dat1 = srcline1[(scrollx[0]+drawx+67)&0x1ff];
UINT8 dat2 = srcline2[(scrollx[1]+drawx+67)&0x1ff];
UINT8 dat3 = srcline3[(scrollx[2]+drawx+67)&0x1ff];
UINT8 pridat = priline[prioffs];
INT32 sprdat = sprline[drawx] & 0xff;
INT32 sprpri = sprline[drawx] & 0xc000;
UINT32 dst = 0;
if (pridat==0x0f)
{
COPY_SPRITE_PIXEL(0x0000);
if (enable[2]) DRAW_BLITLAYER3()
COPY_SPRITE_PIXEL(0x4000);
if (dat1 && enable[0]) DRAW_BLITLAYER1()
COPY_SPRITE_PIXEL(0x8000);
if (dat2 && enable[1]) DRAW_BLITLAYER2()
COPY_SPRITE_PIXEL(0xc000);
}
else if (pridat==0xcf)
{
COPY_SPRITE_PIXEL(0x0000);
if (nBurnLayer & 1 && enable[0]) DRAW_BLIT_PIXEL(0x4300, 0)
COPY_SPRITE_PIXEL(0x4000);
if (nBurnLayer & 2 && enable[1]) DRAW_BLIT_PIXEL(0x4301, 1)
COPY_SPRITE_PIXEL(0x8000);
if (dat3 && enable[2]) DRAW_BLITLAYER3()
COPY_SPRITE_PIXEL(0xc000);
}
else if (pridat==0x30)
{
COPY_SPRITE_PIXEL(0x0000);
if (enable[1]) DRAW_BLITLAYER2()
COPY_SPRITE_PIXEL(0x4000);
if (dat1 && enable[0]) DRAW_BLITLAYER1()
COPY_SPRITE_PIXEL(0x8000);
if (dat3 && enable[1]) DRAW_BLITLAYER3()
COPY_SPRITE_PIXEL(0xc000);
}
else
{
// Usually pridat = 0x00. Used @
// Bootup
// Minigame: Girl with ice-cubes infront - april 16, 2020 (dink)
COPY_SPRITE_PIXEL(0x0000);
if (enable[0]) DRAW_BLITLAYER1()
if (dat2 && enable[1]) DRAW_BLITLAYER2()
COPY_SPRITE_PIXEL(0x4000);
COPY_SPRITE_PIXEL(0x8000);
if (dat3 && enable[2]) DRAW_BLITLAYER3()
COPY_SPRITE_PIXEL(0xc000);
}
PutPix(bmp + drawx * nBurnBpp, BurnHighCol((dst >> 16) & 0xff, (dst >> 8) & 0xff, dst & 0xff, 0));
}
}
return 0;
}
static INT32 DrvFrame()
{
BurnWatchdogUpdate();
if (DrvReset) {
DrvDoReset(1);
}
{
memset (DrvInputs, 0xff, sizeof(DrvInputs));
for (INT32 i = 0; i < 16; i++) {
DrvInputs[0] ^= (DrvJoy1[i] & 1) << i;
DrvInputs[1] ^= (DrvJoy2[i] & 1) << i;
DrvInputs[2] ^= (DrvJoy3[i] & 1) << i;
}
}
INT32 nInterleave = 256;
INT32 nCyclesTotal[1] = { 14318181 / 60 };
INT32 nCyclesDone[1] = { 0 };
SekOpen(0);
for (INT32 i = 0; i < nInterleave; i++)
{
CPU_RUN(0, Sek);
if (i == 0) SekSetIRQLine(3, CPU_IRQSTATUS_AUTO);
if (i == 128) SekSetIRQLine(5, CPU_IRQSTATUS_AUTO);
if (i == 240) {
if (pBurnDraw) {
BurnDrvRedraw();
}
SekSetIRQLine(2, CPU_IRQSTATUS_AUTO);
}
}
if (pBurnSoundOut) {
YMZ280BRender(pBurnSoundOut, nBurnSoundLen);
}
SekClose();
return 0;
}
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin) {
*pnMin = 0x029698;
}
if (nAction & ACB_VOLATILE) {
memset(&ba, 0, sizeof(ba));
ba.Data = AllRam;
ba.nLen = RamEnd - AllRam;
ba.szName = "All RAM";
BurnAcb(&ba);
SekScan(nAction);
YMZ280BScan(nAction, pnMin);
SCAN_VAR(scrollx);
SCAN_VAR(scrolly);
SCAN_VAR(enable);
SCAN_VAR(fbbright1);
SCAN_VAR(fbbright2);
SCAN_VAR(regs1_address);
SCAN_VAR(prio_scrollx);
SCAN_VAR(prio_scrolly);
SCAN_VAR(regs1);
SCAN_VAR(toybox_mcu_com);
}
if (nAction & ACB_NVRAM) {
memset(&ba, 0, sizeof(ba));
ba.Data = DrvNVRAM;
ba.nLen = 0x80;
ba.szName = "NV RAM";
BurnAcb(&ba);
}
return 0;
}
// Gals Panic 3 (Euro)
static struct BurnRomInfo galpani3RomDesc[] = {
{ "g3p0e0.u71", 0x080000, 0xfa681118, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "g3p1e0.u102", 0x080000, 0xf1150f1b, 1 | BRF_PRG | BRF_ESS }, // 1
{ "gp320000.1", 0x200000, 0xa0112827, 2 | BRF_GRA }, // 2 Sprites
{ "gp340000.123", 0x200000, 0xa58a26b1, 3 | BRF_GRA }, // 3 Backgrounds
{ "gp340100.122", 0x200000, 0x746fe4a8, 3 | BRF_GRA }, // 4
{ "gp340200.121", 0x200000, 0xe9bc15c8, 3 | BRF_GRA }, // 5
{ "gp340300.120", 0x200000, 0x59062eef, 3 | BRF_GRA }, // 6
{ "g3g0j0.101", 0x040000, 0xfbb1e0dc, 3 | BRF_GRA }, // 7
{ "g3g1j0.100", 0x040000, 0x18edb5f0, 3 | BRF_GRA }, // 8
{ "gp310100.40", 0x200000, 0x6a0b1d12, 4 | BRF_SND }, // 9 Samples
{ "gp310000.41", 0x100000, 0x641062ef, 4 | BRF_SND }, // 10
{ "g3d0x0.134", 0x020000, 0x4ace10f9, 5 | BRF_PRG | BRF_ESS }, // 11 MCU Data
};
STD_ROM_PICK(galpani3)
STD_ROM_FN(galpani3)
struct BurnDriver BurnDrvGalpani3 = {
"galpani3", NULL, NULL, NULL, "1995",
"Gals Panic 3 (Euro)\0", NULL, "Kaneko", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, galpani3RomInfo, galpani3RomName, NULL, NULL, NULL, NULL, Galpani3InputInfo, Galpani3DIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x4300,
240, 320, 3, 4
};
// Gals Panic 3 (Hong Kong)
static struct BurnRomInfo galpani3hkRomDesc[] = {
{ "gp3_hk.u71", 0x080000, 0xb8fc7826, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "gp3_hk.u102", 0x080000, 0x658f5fe8, 1 | BRF_PRG | BRF_ESS }, // 1
{ "gp320000.1", 0x200000, 0xa0112827, 2 | BRF_GRA }, // 2 Sprites
{ "gp340000.123", 0x200000, 0xa58a26b1, 3 | BRF_GRA }, // 3 Backgrounds
{ "gp340100.122", 0x200000, 0x746fe4a8, 3 | BRF_GRA }, // 4
{ "gp340200.121", 0x200000, 0xe9bc15c8, 3 | BRF_GRA }, // 5
{ "gp340300.120", 0x200000, 0x59062eef, 3 | BRF_GRA }, // 6
{ "g3g0h0.101", 0x040000, 0xdca3109a, 3 | BRF_GRA }, // 7
{ "g3g1h0.100", 0x040000, 0x2ebe6ed0, 3 | BRF_GRA }, // 8
{ "gp310100.40", 0x200000, 0x6a0b1d12, 4 | BRF_SND }, // 9 Samples
{ "gp310000.41", 0x100000, 0x641062ef, 4 | BRF_SND }, // 10
{ "g3d0x0.134", 0x020000, 0x4ace10f9, 5 | BRF_PRG | BRF_ESS }, // 11 MCU Data
};
STD_ROM_PICK(galpani3hk)
STD_ROM_FN(galpani3hk)
struct BurnDriver BurnDrvGalpani3hk = {
"galpani3hk", "galpani3", NULL, NULL, "1995",
"Gals Panic 3 (Hong Kong)\0", NULL, "Kaneko", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, galpani3hkRomInfo, galpani3hkRomName, NULL, NULL, NULL, NULL, Galpani3InputInfo, Galpani3DIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x4300,
240, 320, 3, 4
};
// Gals Panic 3 (Japan)
static struct BurnRomInfo galpani3jRomDesc[] = {
{ "g3p0j1.71", 0x080000, 0x52893326, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "g3p1j1.102", 0x080000, 0x05f935b4, 1 | BRF_PRG | BRF_ESS }, // 1
{ "gp320000.1", 0x200000, 0xa0112827, 2 | BRF_GRA }, // 2 Sprites
{ "gp340000.123", 0x200000, 0xa58a26b1, 3 | BRF_GRA }, // 3 Backgrounds
{ "gp340100.122", 0x200000, 0x746fe4a8, 3 | BRF_GRA }, // 4
{ "gp340200.121", 0x200000, 0xe9bc15c8, 3 | BRF_GRA }, // 5
{ "gp340300.120", 0x200000, 0x59062eef, 3 | BRF_GRA }, // 6
{ "g3g0j0.101", 0x040000, 0xfbb1e0dc, 3 | BRF_GRA }, // 7
{ "g3g1j0.100", 0x040000, 0x18edb5f0, 3 | BRF_GRA }, // 8
{ "gp310100.40", 0x200000, 0x6a0b1d12, 4 | BRF_SND }, // 9 Samples
{ "gp310000.41", 0x100000, 0x641062ef, 4 | BRF_SND }, // 10
{ "g3d0x0.134", 0x020000, 0x4ace10f9, 5 | BRF_PRG | BRF_ESS }, // 11 MCU Data
};
STD_ROM_PICK(galpani3j)
STD_ROM_FN(galpani3j)
struct BurnDriver BurnDrvGalpani3j = {
"galpani3j", "galpani3", NULL, NULL, "1995",
"Gals Panic 3 (Japan)\0", NULL, "Kaneko", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, galpani3jRomInfo, galpani3jRomName, NULL, NULL, NULL, NULL, Galpani3InputInfo, Galpani3DIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x4300,
240, 320, 3, 4
};
// Gals Panic 3 (Korea)
static struct BurnRomInfo galpani3kRomDesc[] = {
{ "g3p0k0.71", 0x080000, 0x98147760, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "g3p1k0.102", 0x080000, 0x27416b22, 1 | BRF_PRG | BRF_ESS }, // 1
{ "gp320000.1", 0x200000, 0xa0112827, 2 | BRF_GRA }, // 2 Sprites
{ "gp340000.123", 0x200000, 0xa58a26b1, 3 | BRF_GRA }, // 3 Backgrounds
{ "gp340100.122", 0x200000, 0x746fe4a8, 3 | BRF_GRA }, // 4
{ "gp340200.121", 0x200000, 0xe9bc15c8, 3 | BRF_GRA }, // 5
{ "gp340300.120", 0x200000, 0x59062eef, 3 | BRF_GRA }, // 6
{ "g3g0k0.101", 0x080000, 0x23d895b0, 3 | BRF_GRA }, // 7
{ "g3g1k0.100", 0x080000, 0x9b1eac6d, 3 | BRF_GRA }, // 8
{ "gp310100.40", 0x200000, 0x6a0b1d12, 4 | BRF_SND }, // 9 Samples
{ "gp310000.41", 0x100000, 0x641062ef, 4 | BRF_SND }, // 10
{ "g3d0x0.134", 0x020000, 0x4ace10f9, 5 | BRF_PRG | BRF_ESS }, // 11 MCU Data
};
STD_ROM_PICK(galpani3k)
STD_ROM_FN(galpani3k)
struct BurnDriver BurnDrvGalpani3k = {
"galpani3k", "galpani3", NULL, NULL, "1995",
"Gals Panic 3 (Korea)\0", NULL, "Kaneko", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_CLONE | BDF_ORIENTATION_VERTICAL | BDF_ORIENTATION_FLIPPED, 2, HARDWARE_MISC_POST90S, GBF_PUZZLE, 0,
NULL, galpani3kRomInfo, galpani3kRomName, NULL, NULL, NULL, NULL, Galpani3InputInfo, Galpani3DIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x4300,
240, 320, 3, 4
};