68000: interrupt support.
gen: fire vertical interrupt, now some games show sega logo before immediately crashing!
This commit is contained in:
parent
18a3f3f87a
commit
ccea71e74d
|
@ -15,7 +15,6 @@ namespace BizHawk.Emulation.CPUs.M68K
|
||||||
|
|
||||||
// Status Registers
|
// Status Registers
|
||||||
int InterruptMaskLevel;
|
int InterruptMaskLevel;
|
||||||
|
|
||||||
bool s, m;
|
bool s, m;
|
||||||
int usp, ssp;
|
int usp, ssp;
|
||||||
|
|
||||||
|
@ -83,6 +82,8 @@ namespace BizHawk.Emulation.CPUs.M68K
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int Interrupt { get; set; }
|
||||||
|
|
||||||
// Memory Access
|
// Memory Access
|
||||||
public Func<int, sbyte> ReadByte;
|
public Func<int, sbyte> ReadByte;
|
||||||
public Func<int, short> ReadWord;
|
public Func<int, short> ReadWord;
|
||||||
|
@ -124,6 +125,19 @@ namespace BizHawk.Emulation.CPUs.M68K
|
||||||
PendingCycles += cycles;
|
PendingCycles += cycles;
|
||||||
while (PendingCycles > 0)
|
while (PendingCycles > 0)
|
||||||
{
|
{
|
||||||
|
if (Interrupt > 0 && (Interrupt > InterruptMaskLevel || Interrupt > 7))
|
||||||
|
{
|
||||||
|
Log.Error("CPU","****** ENTER INTERRUPT {0} *******", Interrupt);
|
||||||
|
int sr = SR; // capture current SR.
|
||||||
|
S = true; // switch to supervisor mode, if not already in it.
|
||||||
|
A[7].s32 -= 4; // Push PC on stack
|
||||||
|
WriteLong(A[7].s32, PC);
|
||||||
|
A[7].s32 -= 2; // Push SR on stack
|
||||||
|
WriteLong(A[7].s32, sr);
|
||||||
|
PC = ReadLong((24 + Interrupt) * 4); // Jump to interrupt vector
|
||||||
|
Interrupt = 0; // "ack" interrupt. Note: this is wrong.
|
||||||
|
}
|
||||||
|
|
||||||
int prevCycles = PendingCycles;
|
int prevCycles = PendingCycles;
|
||||||
Log.Note("CPU", State());
|
Log.Note("CPU", State());
|
||||||
op = (ushort)ReadWord(PC);
|
op = (ushort)ReadWord(PC);
|
||||||
|
@ -137,9 +151,10 @@ namespace BizHawk.Emulation.CPUs.M68K
|
||||||
public string State()
|
public string State()
|
||||||
{
|
{
|
||||||
string a = Disassemble(PC).ToString().PadRight(64);
|
string a = Disassemble(PC).ToString().PadRight(64);
|
||||||
|
//string a = string.Format("{0:X6}: {1:X4}", PC, ReadWord(PC)).PadRight(64);
|
||||||
string b = string.Format("D0:{0:X8} D1:{1:X8} D2:{2:X8} D3:{3:X8} D4:{4:X8} D5:{5:X8} D6:{6:X8} D7:{7:X8} ", D[0].u32, D[1].u32, D[2].u32, D[3].u32, D[4].u32, D[5].u32, D[6].u32, D[7].u32);
|
string b = string.Format("D0:{0:X8} D1:{1:X8} D2:{2:X8} D3:{3:X8} D4:{4:X8} D5:{5:X8} D6:{6:X8} D7:{7:X8} ", D[0].u32, D[1].u32, D[2].u32, D[3].u32, D[4].u32, D[5].u32, D[6].u32, D[7].u32);
|
||||||
string c = string.Format("A0:{0:X8} A1:{1:X8} A2:{2:X8} A3:{3:X8} A4:{4:X8} A5:{5:X8} A6:{6:X8} A7:{7:X8} ", A[0].u32, A[1].u32, A[2].u32, A[3].u32, A[4].u32, A[5].u32, A[6].u32, A[7].u32);
|
string c = string.Format("A0:{0:X8} A1:{1:X8} A2:{2:X8} A3:{3:X8} A4:{4:X8} A5:{5:X8} A6:{6:X8} A7:{7:X8} ", A[0].u32, A[1].u32, A[2].u32, A[3].u32, A[4].u32, A[5].u32, A[6].u32, A[7].u32);
|
||||||
string d = string.Format("SR:{0:X4} Pending {1} Cycles {2}", SR, PendingCycles, TotalExecutedCycles);
|
string d = string.Format("SR:{0:X4} Pending {1}", SR, PendingCycles);
|
||||||
return a + b + c + d;
|
return a + b + c + d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,8 +107,8 @@ namespace BizHawk.Emulation.Consoles.Sega
|
||||||
{
|
{
|
||||||
MainCPU.ExecuteCycles(16);// stupid crap to sync with genesis plus for log testing
|
MainCPU.ExecuteCycles(16);// stupid crap to sync with genesis plus for log testing
|
||||||
// End-frame stuff
|
// End-frame stuff
|
||||||
/*if (VDP.VInterruptEnabled)
|
if (VDP.VInterruptEnabled)
|
||||||
MainCPU.Interrupt(6);*/
|
MainCPU.Interrupt = 6;
|
||||||
|
|
||||||
if (Z80Runnable)
|
if (Z80Runnable)
|
||||||
SoundCPU.Interrupt = true;
|
SoundCPU.Interrupt = true;
|
||||||
|
|
Loading…
Reference in New Issue