diff --git a/src/burn/drv/pre90s/d_suna8.cpp b/src/burn/drv/pre90s/d_suna8.cpp index 5ba1829b7..b8ae5978a 100644 --- a/src/burn/drv/pre90s/d_suna8.cpp +++ b/src/burn/drv/pre90s/d_suna8.cpp @@ -14,6 +14,8 @@ extern "C" { Needs cleaned. Badly. Missing Brick Zone + Bugs: + Star Fighter (v1) - the first boss has some broken tiles */ static UINT8 *AllMem; @@ -57,9 +59,11 @@ static UINT8 m_palettebank = 0; static UINT8 m_spritebank = 0; static UINT8 m_spritebank_latch = 0; static UINT8 m_rombank_latch = 0; +static UINT8 m_rambank = 0; static UINT8 disable_mainram_write = 0; static UINT8 protection_val = 0; static UINT8 hardhead_ip = 0; +static UINT8 Sparkman = 0, Hardhead2 = 0; static UINT8 DrvJoy1[8]; static UINT8 DrvJoy2[8]; @@ -640,7 +644,8 @@ static void __fastcall hardhea2_write(UINT16 address, UINT8 data) switch (address) { case 0xc200: - ZetMapMemory(DrvSprRAM + ((data & 0x02) ? 0x2000 : 0), 0xe000, 0xffff, ZET_RAM); + m_spritebank = ((data & 0x02) ? 1 : 0); + ZetMapMemory(DrvSprRAM + (m_spritebank * 0x2000), 0xe000, 0xffff, ZET_RAM); return; case 0xc280: @@ -669,22 +674,26 @@ static void __fastcall hardhea2_write(UINT16 address, UINT8 data) return; case 0xc508: + m_spritebank = 0; ZetMapMemory(DrvSprRAM + 0x0000, 0xe000, 0xffff, ZET_RAM); return; case 0xc50f: + m_spritebank = 1; ZetMapMemory(DrvSprRAM + 0x2000, 0xe000, 0xffff, ZET_RAM); return; case 0xc507: case 0xc556: case 0xc560: + m_rambank = 1; ZetMapMemory(DrvZ80RAM0 + 0x1800, 0xc800, 0xdfff, ZET_RAM); return; case 0xc522: case 0xc528: case 0xc533: + m_rambank = 0; ZetMapMemory(DrvZ80RAM0 + 0x0000, 0xc800, 0xdfff, ZET_RAM); return; } @@ -1274,6 +1283,7 @@ static void CommonDoReset(INT32 clear_ram) m_spritebank = 0; m_spritebank_latch = 0; m_rombank_latch = 0; + m_rambank = 0; disable_mainram_write = 0; protection_val = 0; hardhead_ip = 0; @@ -1439,6 +1449,8 @@ static INT32 SparkmanInit() HardheadDoReset(); + Sparkman = 1; + return 0; } @@ -1605,6 +1617,8 @@ static INT32 HardheadExit() BurnFree(AllMem); + Sparkman = 0; + return 0; } @@ -1758,6 +1772,7 @@ static INT32 Hardhea2Init() ZetMapArea(0x0000, 0x7fff, 0, DrvZ80ROM0); ZetMapArea(0x0000, 0x7fff, 2, DrvZ80Decrypted, DrvZ80ROM0); bankswitch(0); // ? + m_rambank = 0; ZetMapMemory(DrvPalRAM, 0xc600, 0xc7ff, ZET_ROM); ZetMapMemory(DrvZ80RAM0, 0xc800, 0xdfff, ZET_RAM); ZetMapMemory(DrvSprRAM, 0xe000, 0xffff, ZET_RAM); @@ -1800,6 +1815,8 @@ static INT32 Hardhea2Init() Hardhea2DoReset(); + Hardhead2 = 1; + return 0; } @@ -1813,6 +1830,8 @@ static INT32 Hardhea2Exit() BurnFree(AllMem); + Hardhead2 = 0; + return 0; } @@ -2310,7 +2329,7 @@ static INT32 SparkmanFrame() // & starfigh INT32 nCyclesSegment; INT32 nInterleave = 256; - INT32 nCyclesTotal[2] = { 6000000 / 60, 6000000 / 60 }; + INT32 nCyclesTotal[2] = { (Sparkman ? 6000000 : 9000000) / 60, 6000000 / 60 }; INT32 nCyclesDone[2] = { 0, 0 }; vblank = 0; @@ -2321,7 +2340,12 @@ static INT32 SparkmanFrame() // & starfigh nCyclesSegment = nCyclesTotal[0] / nInterleave; nCyclesDone[0] += ZetRun(nCyclesSegment); if (i == 112 && *nmi_enable) ZetNmi(); - if (i == 240) { vblank = 1; ZetSetIRQLine(0, ZET_IRQSTATUS_AUTO); } + if (i == (Sparkman ? 250 : 255)) { // any other value and the sprites glitch (MAME uses 240 here, hmmm) + vblank = 1; + ZetSetIRQLine(0, ZET_IRQSTATUS_ACK); + ZetRun(100); + ZetSetIRQLine(0, ZET_IRQSTATUS_NONE); + } ZetClose(); ZetOpen(1); @@ -2371,7 +2395,7 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin) if (nAction & ACB_DRIVER_DATA) { ZetScan(nAction); // Scan Z80 - if (strstr(BurnDrvGetTextA(DRV_NAME), "hardhea2")) { + if (Hardhead2) { DACScan(nAction, pnMin); } @@ -2388,15 +2412,26 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin) SCAN_VAR(m_spritebank); SCAN_VAR(m_spritebank_latch); SCAN_VAR(m_rombank_latch); + SCAN_VAR(m_rambank); SCAN_VAR(disable_mainram_write); SCAN_VAR(protection_val); SCAN_VAR(hardhead_ip); } if (nAction & ACB_WRITE) { - // todo: set banks here. (hardhead2, sparkman) ZetOpen(0); bankswitch(*mainbank); + ZetMapMemory(DrvSprRAM + (m_spritebank * 0x2000), 0xe000, 0xffff, ZET_RAM); + if (Sparkman) { + if (disable_mainram_write) { + ZetUnmapMemory(0xc800,0xdfff, ZET_WRITE); + } else { + ZetMapMemory(DrvZ80RAM0,0xc800,0xdfff, ZET_WRITE); + } + } + if (Hardhead2) { + ZetMapMemory(DrvZ80RAM0 + (m_rambank * 0x1800), 0xc800, 0xdfff, ZET_RAM); + } ZetClose(); } @@ -2505,7 +2540,7 @@ STD_ROM_FN(hardhea2) struct BurnDriver BurnDrvHardhea2 = { "hardhea2", NULL, NULL, NULL, "1991", - "Hard Head 2 (v2.0)\0", "Savestates may fail.", "SunA", "Miscellaneous", + "Hard Head 2 (v2.0)\0", NULL, "SunA", "Miscellaneous", NULL, NULL, NULL, NULL, BDF_GAME_WORKING, 2, HARDWARE_MISC_POST90S, GBF_MISC, 0, NULL, hardhea2RomInfo, hardhea2RomName, NULL, NULL, DrvInputInfo, Hardhea2DIPInfo, @@ -2544,7 +2579,7 @@ STD_ROM_FN(sparkman) struct BurnDriver BurnDrvSparkman = { "sparkman", NULL, NULL, NULL, "1989", - "Spark Man (v2.0, set 1)\0", "Savestates may fail.", "SunA", "Miscellaneous", + "Spark Man (v2.0, set 1)\0", NULL, "SunA", "Miscellaneous", NULL, NULL, NULL, NULL, BDF_GAME_WORKING, 2, HARDWARE_MISC_PRE90S, GBF_MISC, 0, NULL, sparkmanRomInfo, sparkmanRomName, NULL, NULL, SparkmanInputInfo, SparkmanDIPInfo,