Inufukme? No! Inufuku!

This commit is contained in:
iq_132 2020-03-16 23:11:48 -04:00
parent 49329e83d3
commit de84abbdcd
2 changed files with 748 additions and 2 deletions

View File

@ -74,8 +74,8 @@ 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_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_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_galpanic.o d_galspnbl.o d_glass.o d_go2000.o \
d_gotcha.o d_gumbo.o d_hyperpac.o d_itech32.o d_jchan.o d_kaneko16.o d_legionna.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_gotcha.o d_gumbo.o d_hyperpac.o d_itech32.o d_inufuku.o d_jchan.o d_kaneko16.o d_legionna.o d_lordgun.o d_macrossp.o d_mcatadv.o d_metro.o d_midas.o d_mirage.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_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 \ 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 \
d_shadfrce.o d_silkroad.o d_silvmil.o d_speedspn.o d_ssv.o d_suna16.o d_supduck.o d_suprnova.o d_taotaido.o d_targeth.o d_tecmo16.o d_tecmosys.o \ d_shadfrce.o d_silkroad.o d_silvmil.o d_speedspn.o d_ssv.o d_suna16.o d_supduck.o d_suprnova.o d_taotaido.o d_targeth.o d_tecmo16.o d_tecmosys.o \
d_tetrisp2.o d_thoop2.o d_tumbleb.o d_unico.o d_vmetal.o d_welltris.o d_wrally.o d_wwfwfest.o d_xorworld.o d_yunsun16.o d_yunsung8.o d_zerozone.o \ d_tetrisp2.o d_thoop2.o d_tumbleb.o d_unico.o d_vmetal.o d_welltris.o d_wrally.o d_wwfwfest.o d_xorworld.o d_yunsun16.o d_yunsung8.o d_zerozone.o \

View File

@ -0,0 +1,746 @@
// FinalBurn Neo Quiz & Variety Sukusuku Inufuku and 3 On 3 Dunk Madness driver module
// Based on MAME driver by Takahiro Nogi
#include "tiles_generic.h"
#include "m68000_intf.h"
#include "z80_intf.h"
#include "burn_ym2610.h"
#include "eeprom.h"
static UINT8 *AllMem;
static UINT8 *AllRam;
static UINT8 *RamEnd;
static UINT8 *MemEnd;
static UINT8 *Drv68KROM;
static UINT8 *DrvZ80ROM;
static UINT8 *DrvGfxROM[3];
static UINT8 *DrvSndROM[2];
static UINT8 *DrvZ80RAM;
static UINT8 *DrvLineRAM;
static UINT8 *DrvSprRAM[3];
static UINT8 *DrvSprBuf;
static UINT8 *DrvPalRAM;
static UINT8 *DrvBgRAM;
static UINT8 *DrvFgRAM;
static UINT8 *Drv68KRAM;
static UINT32 *DrvPalette;
static UINT8 DrvRecalc;
static INT32 bg_palettebank;
static INT32 fg_palettebank;
static INT32 bg_scrollx;
static INT32 bg_scrolly;
static INT32 fg_scrolly;
static INT32 fg_scrollx;
static INT32 linescroll_enable;
static INT32 soundlatch;
static INT32 sound_flag;
static INT32 bankdata;
static UINT8 DrvJoy1[16];
static UINT8 DrvJoy2[16];
static UINT8 DrvJoy3[16];
static UINT8 DrvJoy4[16];
static UINT8 DrvJoy5[16];
static UINT8 DrvJoy6[16];
static UINT8 DrvDips[2];
static UINT16 DrvInputs[6];
static UINT8 DrvReset;
static struct BurnInputInfo InufukuInputList[] = {
{"P1 Coin", BIT_DIGITAL, DrvJoy3 + 0, "p1 coin" },
{"P1 Start", BIT_DIGITAL, DrvJoy3 + 2, "p1 start" },
{"P1 Up", BIT_DIGITAL, DrvJoy1 + 0, "p1 up" },
{"P1 Down", BIT_DIGITAL, DrvJoy1 + 1, "p1 down" },
{"P1 Left", BIT_DIGITAL, DrvJoy1 + 2, "p1 left" },
{"P1 Right", BIT_DIGITAL, DrvJoy1 + 3, "p1 right" },
{"P1 Button 1", BIT_DIGITAL, DrvJoy1 + 4, "p1 fire 1" },
{"P1 Button 2", BIT_DIGITAL, DrvJoy1 + 5, "p1 fire 2" },
{"P1 Button 3", BIT_DIGITAL, DrvJoy1 + 6, "p1 fire 3" },
{"P1 Button 4", BIT_DIGITAL, DrvJoy1 + 7, "p1 fire 4" },
{"P2 Coin", BIT_DIGITAL, DrvJoy3 + 1, "p2 coin" },
{"P2 Start", BIT_DIGITAL, DrvJoy3 + 3, "p2 start" },
{"P2 Up", BIT_DIGITAL, DrvJoy2 + 0, "p2 up" },
{"P2 Down", BIT_DIGITAL, DrvJoy2 + 1, "p2 down" },
{"P2 Left", BIT_DIGITAL, DrvJoy2 + 2, "p2 left" },
{"P2 Right", BIT_DIGITAL, DrvJoy2 + 3, "p2 right" },
{"P2 Button 1", BIT_DIGITAL, DrvJoy2 + 4, "p2 fire 1" },
{"P2 Button 2", BIT_DIGITAL, DrvJoy2 + 5, "p2 fire 2" },
{"P2 Button 3", BIT_DIGITAL, DrvJoy2 + 6, "p2 fire 3" },
{"P2 Button 4", BIT_DIGITAL, DrvJoy2 + 7, "p2 fire 4" },
{"P3 Coin", BIT_DIGITAL, DrvJoy5 + 0, "p3 coin" },
{"P3 Start", BIT_DIGITAL, DrvJoy5 + 2, "p3 start" },
{"P3 Up", BIT_DIGITAL, DrvJoy6 + 0, "p3 up" },
{"P3 Down", BIT_DIGITAL, DrvJoy6 + 1, "p3 down" },
{"P3 Left", BIT_DIGITAL, DrvJoy6 + 2, "p3 left" },
{"P3 Right", BIT_DIGITAL, DrvJoy6 + 3, "p3 right" },
{"P3 Button 1", BIT_DIGITAL, DrvJoy6 + 4, "p3 fire 1" },
{"P3 Button 2", BIT_DIGITAL, DrvJoy6 + 5, "p3 fire 2" },
{"P3 Button 3", BIT_DIGITAL, DrvJoy6 + 6, "p3 fire 3" },
{"P3 Button 4", BIT_DIGITAL, DrvJoy6 + 7, "p3 fire 4" },
{"P4 Coin", BIT_DIGITAL, DrvJoy5 + 1, "p4 coin" },
{"P4 Start", BIT_DIGITAL, DrvJoy5 + 3, "p4 start" },
{"P4 Up", BIT_DIGITAL, DrvJoy4 + 0, "p4 up" },
{"P4 Down", BIT_DIGITAL, DrvJoy4 + 1, "p4 down" },
{"P4 Left", BIT_DIGITAL, DrvJoy4 + 2, "p4 left" },
{"P4 Right", BIT_DIGITAL, DrvJoy4 + 3, "p4 right" },
{"P4 Button 1", BIT_DIGITAL, DrvJoy4 + 4, "p4 fire 1" },
{"P4 Button 2", BIT_DIGITAL, DrvJoy4 + 5, "p4 fire 2" },
{"P4 Button 3", BIT_DIGITAL, DrvJoy4 + 6, "p4 fire 3" },
{"P4 Button 4", BIT_DIGITAL, DrvJoy4 + 7, "p4 fire 4" },
{"Reset", BIT_DIGITAL, &DrvReset, "reset" },
{"Service", BIT_DIGITAL, DrvJoy3 + 4, "service" },
{"Tilt", BIT_DIGITAL, DrvJoy3 + 5, "tilt" },
{"Dip A", BIT_DIPSWITCH, DrvDips + 0, "dip" },
};
STDINPUTINFO(Inufuku)
static struct BurnDIPInfo InufukuDIPList[]=
{
{0x2b, 0xff, 0xff, 0x10, NULL },
{0 , 0xfe, 0 , 2, "3P/4P" },
{0x2b, 0x01, 0x10, 0x10, "Off" },
{0x2b, 0x01, 0x10, 0x00, "On" },
};
STDDIPINFO(Inufuku)
static void __fastcall inufuku_main_write_word(UINT32 address, UINT16 data)
{
switch (address)
{
case 0x200000:
EEPROMWriteBit((data & 0x0800) ? EEPROM_ASSERT_LINE : EEPROM_CLEAR_LINE);
EEPROMSetClockLine((data & 0x1000) ? EEPROM_ASSERT_LINE : EEPROM_CLEAR_LINE);
EEPROMSetCSLine((data & 0x2000) ? EEPROM_ASSERT_LINE : EEPROM_CLEAR_LINE);
return;
case 0x280000:
soundlatch = data;
sound_flag = 1;
ZetNmi();
return;
case 0x780004:
bg_palettebank = data >> 12;
return;
case 0x780006:
fg_palettebank = data >> 12;
return;
case 0x7a0000:
bg_scrollx = data + 1;
return;
case 0x7a0002:
bg_scrolly = data + 0;
return;
case 0x7a0004:
fg_scrollx = data - 3;
return;
case 0x7a0006:
fg_scrolly = data + 1;
return;
case 0x7a0008:
linescroll_enable = ((data & 0x0200) >> 9) ^ 1;
return;
}
}
static UINT16 __fastcall inufuku_main_read_word(UINT32 address)
{
switch (address)
{
case 0x180000:
case 0x180002:
case 0x180004:
case 0x180006:
case 0x18000a:
return DrvInputs[(address / 2) & 7];
case 0x180008:
{
UINT16 ret = (DrvInputs[4] & 0xff2f) | (DrvDips[0] & 0x10);
ret |= EEPROMRead() ? 0x40 : 0;
ret |= sound_flag ? 0 : 0x80;
return ret;
}
}
return 0;
}
static UINT8 __fastcall inufuku_main_read_byte(UINT32 address)
{
switch (address)
{
case 0x180008:
return 0xff;
}
return 0;
}
static void bankswitch(INT32 data)
{
bankdata = data & 3;
ZetMapMemory(DrvZ80ROM + (bankdata * 0x8000), 0x8000, 0xffff, MAP_ROM);
}
static void __fastcall inufuku_sound_write_port(UINT16 port, UINT8 data)
{
switch (port & 0xff)
{
case 0x00:
bankswitch(data);
return;
case 0x04:
sound_flag = 0;
return;
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
BurnYM2610Write(port & 3, data);
return;
}
}
static UINT8 __fastcall inufuku_sound_read_port(UINT16 port)
{
switch (port & 0xff)
{
case 0x04:
return soundlatch;
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
return BurnYM2610Read(port & 3);
}
return 0;
}
static void DrvFMIRQHandler(INT32, INT32 nStatus)
{
if (ZetGetActive() == -1) return;
ZetSetIRQLine(0, nStatus ? CPU_IRQSTATUS_ACK : CPU_IRQSTATUS_NONE);
}
static tilemap_callback( bg )
{
UINT16 code = *((UINT16*)(DrvBgRAM + offs * 2));
TILE_SET_INFO(0, code, bg_palettebank, 0);
}
static tilemap_callback( fg )
{
UINT16 code = *((UINT16*)(DrvFgRAM + offs * 2));
TILE_SET_INFO(1, code, fg_palettebank, 0);
}
static INT32 DrvDoReset()
{
memset (AllRam, 0, RamEnd - AllRam);
SekOpen(0);
SekReset();
SekClose();
ZetOpen(0);
ZetReset();
BurnYM2610Reset();
bankswitch(0);
ZetClose();
EEPROMReset();
bg_palettebank = 0;
fg_palettebank = 0;
bg_scrollx = 0;
bg_scrolly = 0;
fg_scrolly = 0;
fg_scrollx = 0;
linescroll_enable = 0;
soundlatch = 0;
sound_flag = 0;
return 0;
}
static INT32 MemIndex(INT32 gfx1len, INT32 gfx2len, INT32 snd0len, INT32 snd1len)
{
UINT8 *Next; Next = AllMem;
Drv68KROM = Next; Next += 0x500000;
DrvZ80ROM = Next; Next += 0x020000;
DrvGfxROM[0] = Next; Next += 0x400000;
DrvGfxROM[1] = Next; Next += gfx1len;
DrvGfxROM[2] = Next; Next += gfx2len;
DrvSndROM[1] = Next; Next += snd1len;
DrvSndROM[0] = Next; Next += snd0len;
DrvPalette = (UINT32*)Next; Next += 0x10010 * sizeof(UINT32);
AllRam = Next;
DrvZ80RAM = Next; Next += 0x0008000;
DrvLineRAM = Next; Next += 0x0004000;
DrvSprRAM[0] = Next; Next += 0x0020000;
DrvSprRAM[1] = Next; Next += 0x0200000;
DrvSprRAM[2] = Next; Next += 0x0020000;
DrvSprBuf = Next; Next += 0x0020000;
DrvPalRAM = Next; Next += 0x0020000;
DrvBgRAM = Next; Next += 0x0020000;
DrvFgRAM = Next; Next += 0x00e0000;
Drv68KRAM = Next; Next += 0x0100000;
RamEnd = Next;
MemEnd = Next;
return 0;
}
static INT32 DrvInit(INT32 select)
{
AllMem = NULL;
MemIndex(select ? 0x200000 : 0x400000, select ? 0x4000000 : 0x1800000, select ? 0x100000 : 0x400000, select ? 0x300000 : 0);
INT32 nLen = MemEnd - (UINT8 *)0;
if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;
memset(AllMem, 0, nLen);
MemIndex(select ? 0x200000 : 0x400000, select ? 0x4000000 : 0x1800000, select ? 0x100000 : 0x400000, select ? 0x300000 : 0);
INT32 k = 0;
if (select == 0)
{
if (BurnLoadRom(Drv68KROM + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(Drv68KROM + 0x0080000, k++, 1)) return 1;
if (BurnLoadRom(Drv68KROM + 0x0100000, k++, 1)) return 1;
if (BurnLoadRom(DrvZ80ROM + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0400000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0800000, k++, 1)) return 1;
if (BurnLoadRom(DrvSndROM[0] + 0x0000000, k++, 1)) return 1;
}
else
{
if (BurnLoadRom(Drv68KROM + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(Drv68KROM + 0x0080000, k++, 1)) return 1;
if (BurnLoadRom(Drv68KROM + 0x0100000, k++, 1)) return 1;
if (BurnLoadRom(DrvZ80ROM + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[0] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[1] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0400000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0800000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x0c00000, k++, 1)) return 1;
if (BurnLoadRom(DrvGfxROM[2] + 0x1000000, k++, 1)) return 1;
if (BurnLoadRom(DrvSndROM[0] + 0x0000000, k++, 1)) return 1;
if (BurnLoadRom(DrvSndROM[1] + 0x0000000, k++, 1)) return 1;
}
BurnNibbleExpand(DrvGfxROM[2], NULL, select ? 0x2000000 : 0xc00000, select, 0);
SekInit(0, 0x68000);
SekOpen(0);
SekMapMemory(Drv68KROM, 0x000000, 0x0fffff, MAP_ROM);
SekMapMemory(DrvPalRAM, 0x300000, 0x301fff, MAP_RAM);
SekMapMemory(DrvLineRAM, 0x380000, 0x3803ff, MAP_WRITE); // 0-1ff
SekMapMemory(DrvBgRAM, 0x400000, 0x401fff, MAP_RAM);
SekMapMemory(DrvFgRAM, 0x402000, 0x40ffff, MAP_RAM);
SekMapMemory(DrvSprRAM[0], 0x580000, 0x581fff, MAP_RAM);
SekMapMemory(DrvSprRAM[1], 0x600000, 0x61ffff, MAP_RAM);
SekMapMemory(Drv68KROM + 0x100000, 0x800000, 0xbfffff, MAP_ROM);
SekMapMemory(Drv68KRAM, 0xfd0000, 0xfdffff, MAP_RAM);
SekSetWriteWordHandler(0, inufuku_main_write_word);
SekSetReadWordHandler(0, inufuku_main_read_word);
SekSetReadByteHandler(0, inufuku_main_read_byte);
SekClose();
ZetInit(0);
ZetOpen(0);
ZetMapMemory(DrvZ80ROM, 0x0000, 0x77ff, MAP_ROM);
ZetMapMemory(DrvZ80RAM, 0x7800, 0x7fff, MAP_RAM);
ZetSetOutHandler(inufuku_sound_write_port);
ZetSetInHandler(inufuku_sound_read_port);
ZetClose();
EEPROMInit(&eeprom_interface_93C46);
INT32 DrvSndROM0Len = select ? 0x100000 : 0x400000, DrvSndROM1Len = select ? 0x300000 : 0;
BurnYM2610Init(8000000, DrvSndROM[0], &DrvSndROM0Len, DrvSndROM[1], &DrvSndROM1Len, &DrvFMIRQHandler, 0);
BurnTimerAttach(&ZetConfig, 8000000);
BurnYM2610SetRoute(BURN_SND_YM2610_YM2610_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
BurnYM2610SetRoute(BURN_SND_YM2610_YM2610_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
BurnYM2610SetRoute(BURN_SND_YM2610_AY8910_ROUTE, 0.25, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
GenericTilemapInit(0, TILEMAP_SCAN_ROWS, bg_map_callback, 8, 8, 64, 64);
GenericTilemapInit(1, TILEMAP_SCAN_ROWS, fg_map_callback, 8, 8, 64, 64);
GenericTilemapSetGfx(0, DrvGfxROM[0], 8, 8, 8, 0x400000, 0, 0x0f);
GenericTilemapSetGfx(1, DrvGfxROM[1], 8, 8, 8, select ? 0x200000 : 0x400000, 0, 0x0f);
GenericTilemapSetGfx(2, DrvGfxROM[2], 4, 16, 16, select ? 0x4000000 : 0x1800000, 0, 0x3f);
GenericTilemapSetTransparent(0, 0xff);
GenericTilemapSetTransparent(1, 0xff);
// GenericTilemapSetOffsets(TMAP_GLOBAL, 0, 0);
DrvDoReset();
return 0;
}
static INT32 DrvExit()
{
GenericTilesExit();
EEPROMExit();
BurnYM2610Exit();
ZetExit();
SekExit();
BurnFree (AllMem);
return 0;
}
static void DrvPaletteUpdate()
{
UINT16 *p = (UINT16*)DrvPalRAM;
for (INT32 i = 0; i < 0x2000/2; i++)
{
UINT8 r = (p[i] >> 0) & 0x1f;
UINT8 b = (p[i] >> 5) & 0x1f;
UINT8 g = (p[i] >> 10) & 0x1f;
r = (r << 3) | (r >> 2);
g = (g << 3) | (b >> 2);
b = (b << 3) | (b >> 2);
DrvPalette[i] = BurnHighCol(r,g,b,0);
}
DrvPalette[0x1000] = 0; // black
}
static void draw_sprites()
{
INT32 offs;
UINT16 *spriteram = (UINT16*)DrvSprRAM[2];
UINT16 *spritetable = (UINT16*)DrvSprRAM[1];
GenericTilesGfx *gfx = &GenericGfxData[2];
INT32 priority_table[4] = { 0, 0xf0, 0xfc, 0xfe };
for (offs = 0; offs < (0x2000 / 16); offs++)
{
if (spriteram[offs] & 0x4000) break;
}
offs--;
while (offs != -1)
{
if ((spriteram[offs] & 0x8000) == 0x0000)
{
INT32 attr_start = (spriteram[offs] & 0x03ff) * 4;
UINT16 *ram = &spriteram[attr_start];
INT32 oy = (ram[0] & 0x01ff) + 1;
INT32 ysize = (ram[0] & 0x0e00) >> 9;
INT32 zoomy = 32 - ((ram[0] & 0xf000) >> 12);
INT32 ox = (ram[1] & 0x01ff) + 0;
INT32 xsize = (ram[1] & 0x0e00) >> 9;
INT32 zoomx = 32 - ((ram[1] & 0xf000) >> 12);
INT32 flipx = (ram[2] & 0x4000);
INT32 flipy = (ram[2] & 0x8000);
INT32 color =((ram[2] & 0x3f00) >> 8) << gfx->depth;
INT32 pri = (ram[2] & 0x3000) >> 12;
INT32 map = (ram[3] & 0xffff) | (ram[2] & 0x0001) << 16;
INT32 priority_mask = priority_table[pri];
INT32 ystart, yend, yinc;
if (!flipy) { ystart = 0; yend = ysize+1; yinc = 1; }
else { ystart = ysize; yend = -1; yinc = -1; }
INT32 ycnt = ystart;
while (ycnt != yend)
{
INT32 xstart, xend, xinc;
if (!flipx) { xstart = 0; xend = xsize+1; xinc = 1; }
else { xstart = xsize; xend = -1; xinc = -1; }
INT32 xcnt = xstart;
while (xcnt != xend)
{
INT32 startno = (((spritetable[map*2] & 0x0007) << 16) + spritetable[(map*2)+ 1]) % gfx->code_mask;
RenderZoomedPrioSprite(pTransDraw, gfx->gfxbase, startno, color, 0xf, ox + xcnt * zoomx/2, oy + ycnt * zoomy/2, flipx, flipy, 16, 16, zoomx << 11, zoomy << 11, priority_mask);
RenderZoomedPrioSprite(pTransDraw, gfx->gfxbase, startno, color, 0xf, -0x200+ox + xcnt * zoomx/2, oy + ycnt * zoomy/2, flipx, flipy, 16, 16, zoomx << 11, zoomy << 11, priority_mask);
RenderZoomedPrioSprite(pTransDraw, gfx->gfxbase, startno, color, 0xf, ox + xcnt * zoomx/2, -0x200+oy + ycnt * zoomy/2, flipx, flipy, 16, 16, zoomx << 11, zoomy << 11, priority_mask);
RenderZoomedPrioSprite(pTransDraw, gfx->gfxbase, startno, color, 0xf, -0x200+ox + xcnt * zoomx/2, -0x200+oy + ycnt * zoomy/2, flipx, flipy, 16, 16, zoomx << 11, zoomy << 11, priority_mask);
xcnt+=xinc;
map++;
}
ycnt+=yinc;
}
}
offs-=1;
}
}
static INT32 DrvDraw()
{
if (DrvRecalc) {
DrvPaletteUpdate();
DrvRecalc = 1;
}
BurnTransferClear(0x1000);
if (linescroll_enable) {
UINT16 *scroll = (UINT16*)DrvLineRAM;
GenericTilemapSetScrollRows(0, 512);
for (INT32 i = 0; i < 256; i++) {
GenericTilemapSetScrollRow(0, (bg_scrolly + i) & 0x1ff, bg_scrollx + scroll[i]);
}
} else {
GenericTilemapSetScrollRows(0, 1);
GenericTilemapSetScrollX(0, bg_scrollx);
}
GenericTilemapSetScrollY(0, bg_scrolly);
GenericTilemapSetScrollX(1, fg_scrollx);
GenericTilemapSetScrollY(1, fg_scrolly);
if (nBurnLayer & 1) GenericTilemapDraw(0, pTransDraw, 0);
if (nBurnLayer & 2) GenericTilemapDraw(1, pTransDraw, 4);
if (nSpriteEnable & 1) draw_sprites();
BurnTransferCopy(DrvPalette);
return 0;
}
static INT32 DrvFrame()
{
if (DrvReset) {
DrvDoReset();
}
ZetNewFrame();
{
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;
DrvInputs[3] ^= (DrvJoy4[i] & 1) << i;
DrvInputs[4] ^= (DrvJoy5[i] & 1) << i;
DrvInputs[5] ^= (DrvJoy6[i] & 1) << i;
}
}
INT32 nInterleave = 256;
INT32 nCyclesTotal[2] = { 16000000 / 60, 8000000 / 60 };
INT32 nCyclesDone[2] = { 0, 0 };
SekOpen(0);
ZetOpen(0);
for (INT32 i = 0; i < nInterleave; i++)
{
nCyclesDone[0] += SekRun(nCyclesTotal[0] / nInterleave);
if (i == nInterleave-1) SekSetIRQLine(1, CPU_IRQSTATUS_AUTO);
BurnTimerUpdate((nCyclesTotal[1] * (i + 1)) / nInterleave);
}
BurnTimerEndFrame(nCyclesTotal[1]);
if (pBurnSoundOut) {
BurnYM2610Update(pBurnSoundOut, nBurnSoundLen);
}
ZetClose();
SekClose();
if (pBurnDraw) {
BurnDrvRedraw();
}
memcpy (DrvSprRAM[2], DrvSprRAM[0], 0x2000);
return 0;
}
static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin != NULL) {
*pnMin = 0x029702;
}
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);
ZetScan(nAction);
EEPROMScan(nAction, pnMin);
BurnYM2610Scan(nAction, pnMin);
SCAN_VAR(bg_palettebank);
SCAN_VAR(fg_palettebank);
SCAN_VAR(bg_scrollx);
SCAN_VAR(bg_scrolly);
SCAN_VAR(fg_scrolly);
SCAN_VAR(fg_scrollx);
SCAN_VAR(linescroll_enable);
SCAN_VAR(soundlatch);
SCAN_VAR(sound_flag);
SCAN_VAR(bankdata);
}
if (nAction & ACB_WRITE) {
ZetOpen(0);
bankswitch(bankdata);
ZetClose();
}
return 0;
}
// Quiz & Variety Sukusuku Inufuku (Japan)
static struct BurnRomInfo inufukuRomDesc[] = {
{ "u147.bin", 0x080000, 0xab72398c, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "u146.bin", 0x080000, 0xe05e9bd4, 1 | BRF_PRG | BRF_ESS }, // 1
{ "lhmn5l28.148", 0x400000, 0x802d17e7, 1 | BRF_PRG | BRF_ESS }, // 2
{ "u107.bin", 0x020000, 0x1744ef90, 2 | BRF_PRG | BRF_ESS }, // 3 Z80 Code
{ "lhmn5ku8.u40", 0x400000, 0x8cbca80a, 3 | BRF_GRA }, // 4 Background Tiles
{ "lhmn5ku7.u8", 0x400000, 0xa6c0f07f, 4 | BRF_GRA }, // 5 Foreground Tiles
{ "lhmn5kub.u34", 0x400000, 0x7753a7b6, 5 | BRF_GRA }, // 6 Sprites
{ "lhmn5kua.u36", 0x400000, 0x1ac4402a, 5 | BRF_GRA }, // 7
{ "lhmn5ku9.u38", 0x400000, 0xe4e9b1b6, 5 | BRF_GRA }, // 8
{ "lhmn5ku6.u53", 0x400000, 0xb320c5c9, 6 | BRF_SND }, // 9 YM2610 ADPCM
};
STD_ROM_PICK(inufuku)
STD_ROM_FN(inufuku)
static INT32 InufukuInit()
{
return DrvInit(0);
}
struct BurnDriver BurnDrvInufuku = {
"inufuku", NULL, NULL, NULL, "1998",
"Quiz & Variety Sukusuku Inufuku (Japan)\0", NULL, "Video System Co.", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_MISC_POST90S, GBF_QUIZ, 0,
NULL, inufukuRomInfo, inufukuRomName, NULL, NULL, NULL, NULL, InufukuInputInfo, InufukuDIPInfo,
InufukuInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x2000,
320, 224, 4, 3
};
// 3 On 3 Dunk Madness (US, prototype? 1997/02/04)
static struct BurnRomInfo dunk3on3RomDesc[] = {
{ "prog0_2_4_usa.u147", 0x080000, 0x957924ab, 1 | BRF_PRG | BRF_ESS }, // 0 68K Code
{ "prog1_2_4_usa.u146", 0x080000, 0x2479e236, 1 | BRF_PRG | BRF_ESS }, // 1
{ "lh535l5y.u148", 0x400000, 0xaa33e02a, 1 | BRF_PRG | BRF_ESS }, // 2
{ "sound_prog_97_1_13.u107", 0x020000, 0xd9d42805, 2 | BRF_PRG | BRF_ESS }, // 3 Z80 Code
{ "lh525kwy.u40", 0x400000, 0xaaa426d1, 3 | BRF_GRA }, // 4 Background Tiles
{ "lh537nn4.u8", 0x200000, 0x2b7be1d8, 4 | BRF_GRA }, // 5 Foreground Tiles
{ "lh535kwz.u34", 0x400000, 0x7372ce78, 5 | BRF_GRA }, // 6 Sprites
{ "lh535kv0.u36", 0x400000, 0x247e5741, 5 | BRF_GRA }, // 7
{ "lh535kv2.u38", 0x400000, 0x76449b1e, 5 | BRF_GRA }, // 8
{ "lh537nn5.u20", 0x200000, 0xf457cd3b, 5 | BRF_GRA }, // 9
{ "lh536pnm.u32", 0x400000, 0xbc39e449, 5 | BRF_GRA }, // 10
{ "lh5388r1.u53", 0x100000, 0x765d892f, 6 | BRF_SND }, // 11 YM2610 ADPCM
{ "lh536pkl.u51", 0x300000, 0xe4919abf, 7 | BRF_SND }, // 12 YM2610 Speech
};
STD_ROM_PICK(dunk3on3)
STD_ROM_FN(dunk3on3)
static INT32 Dunk3on3Init()
{
return DrvInit(1);
}
struct BurnDriver BurnDrvDunk3on3 = {
"3on3dunk", NULL, NULL, NULL, "1996",
"3 On 3 Dunk Madness (US, prototype? 1997/02/04)\0", NULL, "Video System Co.", "Miscellaneous",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_PROTOTYPE, 2, HARDWARE_MISC_POST90S, GBF_SPORTSMISC, 0,
NULL, dunk3on3RomInfo, dunk3on3RomName, NULL, NULL, NULL, NULL, InufukuInputInfo, InufukuDIPInfo,
Dunk3on3Init, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x2000,
320, 224, 4, 3
};