Implement VIP, fix interrupts
This commit is contained in:
+5
-3
@@ -376,7 +376,7 @@ static uint32_t cpuSetSystemRegister(VB*sim,
|
||||
case VB_FEPSW: return sim->cpu.fepsw = value & 0x000FF3FF;
|
||||
case VB_PIR : return 0x00005346;
|
||||
case VB_PSW :
|
||||
sim->cpu.psw.i = value >> 16 & 0xF;
|
||||
sim->cpu.psw.i = value >> 16 & 15;
|
||||
sim->cpu.psw.np = value >> 15 & 1;
|
||||
sim->cpu.psw.ep = value >> 14 & 1;
|
||||
sim->cpu.psw.ae = value >> 13 & 1;
|
||||
@@ -414,7 +414,7 @@ static int cpuIRQ(VB *sim) {
|
||||
if (sim->cpu.psw.id | sim->cpu.psw.ep | sim->cpu.psw.np)
|
||||
return 0;
|
||||
level = IRQ_LEVELS[sim->cpu.irq];
|
||||
if (level == -1 || level > sim->cpu.psw.i)
|
||||
if (level < sim->cpu.psw.i)
|
||||
return 0;
|
||||
cpuThrow(sim, 0xFE00 | level << 4);
|
||||
return 1;
|
||||
@@ -476,6 +476,9 @@ static int cpuException(VB *sim) {
|
||||
/* Regular exception */
|
||||
else {
|
||||
|
||||
/* All exceptions */
|
||||
sim->cpu.eipsw = cpuGetSystemRegister(sim, VB_PSW);
|
||||
|
||||
/* Interrupts only */
|
||||
if ((cause & 0xFF00) == 0xFE00) {
|
||||
sim->cpu.psw.i = (cause >> 4 & 7) + 1;
|
||||
@@ -487,7 +490,6 @@ static int cpuException(VB *sim) {
|
||||
|
||||
/* All exceptions */
|
||||
sim->cpu.ecr.eicc = cause;
|
||||
sim->cpu.eipsw = cpuGetSystemRegister(sim, VB_PSW);
|
||||
sim->cpu.eipc = sim->cpu.pc;
|
||||
sim->cpu.psw.ep = 1;
|
||||
sim->cpu.nextPC = 0xFFFF0000 |
|
||||
|
||||
Reference in New Issue
Block a user