Add TAS Callback to sek, hookup in Megadrive driver (Gargoyles and Ex Mutants are now working)

This commit is contained in:
Barry Harris 2014-11-09 18:11:01 +00:00
parent 84c3fe7220
commit 6c9aeb128f
4 changed files with 34 additions and 2 deletions

View File

@ -2941,6 +2941,11 @@ static void MegadriveSetupSRAM()
}
}
static INT32 __fastcall MegadriveTAScallback(void)
{
return 0; // disable
}
INT32 MegadriveInit()
{
Mem = NULL;
@ -2992,6 +2997,7 @@ INT32 MegadriveInit()
SekSetWriteWordHandler(4, MegadriveIOWriteWord);
SekSetIrqCallback( MegadriveIrqCallback );
SekSetTASCallback(MegadriveTAScallback);
SekClose();
}

View File

@ -761,6 +761,15 @@ extern "C" void M68KcmpildCallback(UINT32 val, INT32 reg)
pSekExt->CmpCallback(val, reg);
}
}
extern "C" INT32 M68KTASCallback()
{
if (pSekExt->TASCallback) {
return pSekExt->TASCallback();
}
return 1; // enable by default
}
#endif
// ----------------------------------------------------------------------------
@ -1602,6 +1611,18 @@ INT32 SekSetCmpCallback(pSekCmpCallback pCallback)
return 0;
}
INT32 SekSetTASCallback(pSekTASCallback pCallback)
{
#if defined FBA_DEBUG
if (!DebugCPU_SekInitted) bprintf(PRINT_ERROR, _T("SekSetTASCallback called without init\n"));
if (nSekActive == -1) bprintf(PRINT_ERROR, _T("SekSetTASCallback called when no CPU open\n"));
#endif
pSekExt->TASCallback = pCallback;
return 0;
}
// Set handlers
INT32 SekSetReadByteHandler(INT32 i, pSekReadByteHandler pHandler)
{
@ -1981,6 +2002,7 @@ struct m68ki_cpu_core_pointerblock
void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */
void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */
void (*instr_hook_callback)(void); /* Called every instruction cycle prior to execution */
int (*tas_instr_callback)(void); /* Called when a TAS instruction is encountered */
};

View File

@ -75,6 +75,7 @@ typedef INT32 (__fastcall *pSekResetCallback)();
typedef INT32 (__fastcall *pSekRTECallback)();
typedef INT32 (__fastcall *pSekIrqCallback)(INT32 irq);
typedef INT32 (__fastcall *pSekCmpCallback)(UINT32 val, INT32 reg);
typedef INT32 (__fastcall *pSekTASCallback)();
extern INT32 nSekCycles[SEK_MAX], nSekCPUType[SEK_MAX];
@ -96,6 +97,7 @@ struct SekExt {
pSekRTECallback RTECallback;
pSekIrqCallback IrqCallback;
pSekCmpCallback CmpCallback;
pSekTASCallback TASCallback;
};
#define SEK_DEF_READ_WORD(i, a) { UINT16 d; d = (UINT16)(pSekExt->ReadByte[i](a) << 8); d |= (UINT16)(pSekExt->ReadByte[i]((a) + 1)); return d; }
@ -226,6 +228,7 @@ INT32 SekSetResetCallback(pSekResetCallback pCallback);
INT32 SekSetRTECallback(pSekRTECallback pCallback);
INT32 SekSetIrqCallback(pSekIrqCallback pCallback);
INT32 SekSetCmpCallback(pSekCmpCallback pCallback);
INT32 SekSetTASCallback(pSekTASCallback pCallback);
// Get a CPU's PC
UINT32 SekGetPC(INT32 n);

View File

@ -126,8 +126,8 @@
/* If ON, CPU will call the callback when it encounters a tas
* instruction.
*/
#define M68K_TAS_HAS_CALLBACK OPT_ON
#define M68K_TAS_CALLBACK() your_tas_handler_function()
#define M68K_TAS_HAS_CALLBACK OPT_SPECIFY_HANDLER
#define M68K_TAS_CALLBACK() M68KTASCallback()
/* If ON, CPU will call the set fc callback on every memory access to
@ -217,6 +217,7 @@ void M68KResetCallback(void);
int M68KIRQAcknowledge(int nIRQ);
void M68KRTECallback(void);
void M68KcmpildCallback(unsigned int val, int reg);
int M68KTASCallback(void);
unsigned int __fastcall M68KFetchByte(unsigned int a);
unsigned int __fastcall M68KFetchWord(unsigned int a);