d_tnzs.cpp - fix Kabuki-Z (finally!!), needs bg tile buffering at beginning of frame, sprite buffering at end of frame. Fixed music+dac (banking issue), tweaked PSG volume for Dr.Toppels adventure.
This commit is contained in:
parent
5b5c0ade39
commit
b482448b76
|
@ -35,13 +35,14 @@ static UINT8 *coin_lockout;
|
|||
static UINT8 *soundlatch;
|
||||
static UINT8 *tnzs_bg_flag;
|
||||
|
||||
static INT32 kageki_csport_sel;
|
||||
static INT32 kageki_csport_sel;
|
||||
static double kageki_sample_pos;
|
||||
static INT32 kageki_sample_select;
|
||||
static INT16 *kageki_sample_data[0x30];
|
||||
static INT32 kageki_sample_size[0x30];
|
||||
static double kageki_sample_gain;
|
||||
static INT32 kageki_sample_output_dir;
|
||||
static INT32 game_kabukiz = 0;
|
||||
|
||||
static INT32 cpu1_reset;
|
||||
static INT32 tnzs_banks[3];
|
||||
|
@ -815,32 +816,10 @@ static void kabukiz_sound_bankswitch(UINT32, UINT32 data)
|
|||
if (data != 0xff) {
|
||||
tnzs_banks[2] = data;
|
||||
|
||||
if (ZetGetActive() == -1) return; // fix crash on init
|
||||
// YM2203_postload() eventually gets to code that writes to a port that is mapped to
|
||||
// kabukiz_sound_bankswitch() and at this time, the cpu isn't open
|
||||
// Stack backtrace from crash:
|
||||
/*Program received signal SIGSEGV, Segmentation fault.
|
||||
0x007ffbf3 in ZetMapArea(int, int, int, unsigned char*) ()
|
||||
(gdb) bt
|
||||
#0 0x007ffbf3 in ZetMapArea(int, int, int, unsigned char*) ()
|
||||
#1 0x005fe384 in kabukiz_sound_bankswitch(unsigned int, unsigned int) ()
|
||||
#2 0x00441e4b in _AYWriteReg (n=<optimized out>, r=<optimized out>,
|
||||
v=<optimized out>) at src/burn/snd/ay8910.c:240
|
||||
#3 0x00441ec3 in AYWriteReg (v=0, r=14, chip=0) at src/burn/snd/ay8910.c:282
|
||||
#4 AY8910Write (chip=0, a=1, data=0) at src/burn/snd/ay8910.c:329
|
||||
#5 0x00446285 in YM2203_postload () at src/burn/snd/fm.c:2388
|
||||
#6 0x007c80a9 in BurnStateMAMEScan(int, int*) ()
|
||||
#7 0x007c80dd in BurnAreaScan ()
|
||||
#8 0x00a0592e in BurnStateDecompress(unsigned char*, int, int) ()
|
||||
#9 0x00a05064 in BurnStateLoadEmbed(_iobuf*, int, int, int (*)()) ()
|
||||
#10 0x00a0515b in BurnStateLoad(wchar_t*, int, int (*)()) ()
|
||||
#11 0x009f7043 in StatedLoad(int) ()
|
||||
#12 0x009e1c7d in OnCommand(HWND__*, int, HWND__*, unsigned int) ()
|
||||
#13 0x009e577d in ScrnProc ()
|
||||
#14 0x7e418734 in USER32!GetDC () from C:\WINDOWS.0\system32\user32.dll */
|
||||
|
||||
ZetMapArea(0x8000, 0xbfff, 0, DrvZ80ROM2 + 0x0000 + 0x4000 * (data & 0x07));
|
||||
ZetMapArea(0x8000, 0xbfff, 2, DrvZ80ROM2 + 0x0000 + 0x4000 * (data & 0x07));
|
||||
if (ZetGetActive() == -1) return;
|
||||
|
||||
ZetMapArea(0x8000, 0xbfff, 0, DrvZ80ROM2 + 0x8000 + 0x4000 * (data & 0x07));
|
||||
ZetMapArea(0x8000, 0xbfff, 2, DrvZ80ROM2 + 0x8000 + 0x4000 * (data & 0x07));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1351,7 +1330,7 @@ static INT32 Type1Init(INT32 mcutype)
|
|||
BurnYM2203Init(1, 3000000, NULL, DrvSynchroniseStream, DrvGetTime, 0);
|
||||
BurnYM2203SetAllRoutes(0, 0.30, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
if (mcutype == MCU_EXTRMATN) {
|
||||
if (mcutype == MCU_EXTRMATN || mcutype == MCU_DRTOPPEL) {
|
||||
BurnYM2203SetPSGVolume(0, 0.10);
|
||||
}
|
||||
|
||||
|
@ -1367,7 +1346,7 @@ static INT32 Type1Init(INT32 mcutype)
|
|||
}
|
||||
|
||||
DACInit(0, 0, 1, kabukizSyncDAC); // kabukiz
|
||||
DACSetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
DACSetRoute(0, 0.10, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
@ -1385,6 +1364,8 @@ static INT32 Type2Init()
|
|||
memset(AllMem, 0, nLen);
|
||||
MemIndex();
|
||||
|
||||
game_kabukiz = (strncmp(BurnDrvGetTextA(DRV_NAME), "kabukiz", 7) == 0);
|
||||
|
||||
{
|
||||
if (BurnLoadRom(DrvZ80ROM0 + 0x10000, 0, 1)) return 1;
|
||||
memcpy (DrvZ80ROM0, DrvZ80ROM0 + 0x10000, 0x08000);
|
||||
|
@ -1393,7 +1374,7 @@ static INT32 Type2Init()
|
|||
|
||||
if (BurnLoadRom(DrvZ80ROM2 + 0x00000, 2, 1)) return 1;
|
||||
|
||||
if (strncmp(BurnDrvGetTextA(DRV_NAME), "kabukiz", 7) == 0) {
|
||||
if (game_kabukiz) {
|
||||
if (BurnLoadRom(DrvGfxROM + 0x000000, 3, 1)) return 1;
|
||||
if (BurnLoadRom(DrvGfxROM + 0x080000, 4, 1)) return 1;
|
||||
if (BurnLoadRom(DrvGfxROM + 0x100000, 5, 1)) return 1;
|
||||
|
@ -1423,7 +1404,7 @@ static INT32 Type2Init()
|
|||
ZetMapArea(0xc000, 0xdfff, 1, DrvSprRAM);
|
||||
ZetMapArea(0xc000, 0xdfff, 2, DrvSprRAM);
|
||||
ZetMapArea(0xe000, 0xeeff, 0, DrvShareRAM);
|
||||
if (strncmp(BurnDrvGetTextA(DRV_NAME), "kabukiz", 7) == 0) {
|
||||
if (game_kabukiz) {
|
||||
ZetMapArea(0xef00, 0xefff, 0, DrvShareRAM + 0x0f00);
|
||||
}
|
||||
ZetMapArea(0xe000, 0xefff, 1, DrvShareRAM);
|
||||
|
@ -1472,7 +1453,7 @@ static INT32 Type2Init()
|
|||
BurnTimerAttachZet(6000000);
|
||||
BurnYM2203SetAllRoutes(0, 0.30, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
if (strncmp(BurnDrvGetTextA(DRV_NAME), "kabukiz", 7) == 0 || strncmp(BurnDrvGetTextA(DRV_NAME), "tnzs", 5) == 0) {
|
||||
if (game_kabukiz || strncmp(BurnDrvGetTextA(DRV_NAME), "tnzs", 5) == 0) {
|
||||
BurnYM2203SetRoute(0, BURN_SND_YM2203_YM2203_ROUTE, 2.00, BURN_SND_ROUTE_BOTH);
|
||||
BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_1, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_2, 1.00, BURN_SND_ROUTE_BOTH);
|
||||
|
@ -1480,6 +1461,7 @@ static INT32 Type2Init()
|
|||
}
|
||||
|
||||
DACInit(0, 0, 1, kabukizSyncDAC); // kabukiz
|
||||
DACSetRoute(0, 0.10, BURN_SND_ROUTE_BOTH);
|
||||
|
||||
GenericTilesInit();
|
||||
|
||||
|
@ -1505,6 +1487,7 @@ static INT32 DrvExit()
|
|||
}
|
||||
|
||||
tnzs_mcu_init(0);
|
||||
game_kabukiz = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1710,7 +1693,7 @@ static inline void DrvRecalcPalette()
|
|||
|
||||
static void sprite_buffer(INT32 ctrl)
|
||||
{
|
||||
if (ctrl & 0x20)
|
||||
if (~ctrl & 0x20)
|
||||
{
|
||||
if (ctrl & 0x40) {
|
||||
memcpy (DrvSprRAM + 0x0000, DrvSprRAM + 0x0800, 0x0400);
|
||||
|
@ -1725,6 +1708,15 @@ static void sprite_buffer(INT32 ctrl)
|
|||
}
|
||||
}
|
||||
|
||||
static void bgsprite_buffer_kabukiz(INT32 ctrl)
|
||||
{
|
||||
if (~ctrl & 0x20)
|
||||
{
|
||||
memcpy (DrvSprRAM + 0x0400, DrvSprRAM + 0x0c00, 0x0400);
|
||||
memcpy (DrvSprRAM + 0x1400, DrvSprRAM + 0x1c00, 0x0400);
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 DrvDraw()
|
||||
{
|
||||
DrvRecalcPalette();
|
||||
|
@ -1741,8 +1733,6 @@ static INT32 DrvDraw()
|
|||
|
||||
BurnTransferCopy(DrvPalette);
|
||||
|
||||
sprite_buffer(ctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1770,7 +1760,7 @@ static INT32 DrvFrame()
|
|||
|
||||
assemble_inputs();
|
||||
|
||||
INT32 nInterleave = 100;
|
||||
INT32 nInterleave = 256;
|
||||
if (tnzs_mcu_type() == MCU_NONE_KAGEKI) nInterleave = nBurnSoundLen;
|
||||
INT32 nSoundBufferPos = 0;
|
||||
|
||||
|
@ -1783,22 +1773,22 @@ static INT32 DrvFrame()
|
|||
|
||||
nCyclesDone[0] = nCyclesDone[1] = nCyclesDone[2] = 0;
|
||||
|
||||
INT32 irq_trigger[2] = { nInterleave - 2, nInterleave - 1 };
|
||||
|
||||
for (INT32 i = 0; i < nInterleave; i++) {
|
||||
INT32 nCurrentCPU, nNext;
|
||||
|
||||
if (game_kabukiz && i == 1)
|
||||
bgsprite_buffer_kabukiz(DrvObjCtrl[1]);
|
||||
|
||||
// Run Z80 #0
|
||||
nCurrentCPU = 0;
|
||||
ZetOpen(nCurrentCPU);
|
||||
nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave;
|
||||
nCyclesSegment = nNext - nCyclesDone[nCurrentCPU];
|
||||
nCyclesDone[nCurrentCPU] += ZetRun(nCyclesSegment);
|
||||
if (i == irq_trigger[0]) {
|
||||
if (i == nInterleave - 2) {
|
||||
tnzs_mcu_interrupt();
|
||||
ZetSetIRQLine(0, CPU_IRQSTATUS_ACK);
|
||||
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
|
||||
}
|
||||
if (i == irq_trigger[1]) ZetSetIRQLine(0, CPU_IRQSTATUS_NONE);
|
||||
ZetClose();
|
||||
|
||||
// Run Z80 #1
|
||||
|
@ -1811,8 +1801,8 @@ static INT32 DrvFrame()
|
|||
} else {
|
||||
nCyclesDone[nCurrentCPU] += nCyclesSegment;
|
||||
}
|
||||
if (i == irq_trigger[0]) ZetSetIRQLine(0, CPU_IRQSTATUS_ACK);
|
||||
if (i == irq_trigger[1]) ZetSetIRQLine(0, CPU_IRQSTATUS_NONE);
|
||||
if (i == nInterleave - 2)
|
||||
ZetSetIRQLine(0, CPU_IRQSTATUS_HOLD);
|
||||
ZetClose();
|
||||
|
||||
// Run Z80 #2
|
||||
|
@ -1820,7 +1810,7 @@ static INT32 DrvFrame()
|
|||
{
|
||||
nCurrentCPU = 2;
|
||||
ZetOpen(nCurrentCPU);
|
||||
BurnTimerUpdate(i * (nCyclesTotal[nCurrentCPU] / nInterleave));
|
||||
BurnTimerUpdate((i + 1) * (nCyclesTotal[nCurrentCPU] / nInterleave));
|
||||
ZetClose();
|
||||
}
|
||||
|
||||
|
@ -1872,6 +1862,8 @@ static INT32 DrvFrame()
|
|||
DrvDraw();
|
||||
}
|
||||
|
||||
sprite_buffer(DrvObjCtrl[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2766,7 +2758,7 @@ STD_ROM_FN(kabukiz)
|
|||
|
||||
struct BurnDriverD BurnDrvKabukiz = {
|
||||
"kabukiz", NULL, NULL, NULL, "1988",
|
||||
"Kabuki-Z (World)\0", "Imperfect graphics", "Taito Corporation Japan", "Miscellaneous",
|
||||
"Kabuki-Z (World)\0", NULL, "Taito Corporation Japan", "Miscellaneous",
|
||||
NULL, NULL, NULL, NULL,
|
||||
BDF_GAME_WORKING, 2, HARDWARE_TAITO_MISC, GBF_SCRFIGHT, 0,
|
||||
NULL, kabukizRomInfo, kabukizRomName, NULL, NULL, CommonInputInfo, KabukizDIPInfo,
|
||||
|
@ -2795,7 +2787,7 @@ STD_ROM_FN(kabukizj)
|
|||
|
||||
struct BurnDriverD BurnDrvKabukizj = {
|
||||
"kabukizj", "kabukiz", NULL, NULL, "1988",
|
||||
"Kabuki-Z (Japan)\0", "Imperfect graphics", "Taito Corporation", "Miscellaneous",
|
||||
"Kabuki-Z (Japan)\0", NULL, "Taito Corporation", "Miscellaneous",
|
||||
NULL, NULL, NULL, NULL,
|
||||
BDF_GAME_WORKING | BDF_CLONE, 2, HARDWARE_TAITO_MISC, GBF_SCRFIGHT, 0,
|
||||
NULL, kabukizjRomInfo, kabukizjRomName, NULL, NULL, CommonInputInfo, KabukizjDIPInfo,
|
||||
|
|
Loading…
Reference in New Issue