dont look at this, it doesnt work

This commit is contained in:
zeromus 2017-04-05 19:46:11 -05:00
parent 57b1df8487
commit a7b6a9af4d
4 changed files with 45 additions and 28 deletions

View File

@ -60,21 +60,24 @@ void CPU::enter() {
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
} }
if(status.nmi_pending) { if (regs.hang == HangType::Wait) this->op_wai();
status.nmi_pending = false;
regs.vector = (regs.e == false ? 0xffea : 0xfffa);
op_irq();
}
if(status.irq_pending) {
status.irq_pending = false;
regs.vector = (regs.e == false ? 0xffee : 0xfffe);
op_irq();
}
if(regs.hang == HangType::Wait) this->op_wai();
else if (regs.hang == HangType::Stop) this->op_stp(); else if (regs.hang == HangType::Stop) this->op_stp();
else op_step(); else
{
if(status.nmi_pending) {
status.nmi_pending = false;
regs.vector = (regs.e == false ? 0xffea : 0xfffa);
op_irq();
}
if(status.irq_pending) {
status.irq_pending = false;
regs.vector = (regs.e == false ? 0xffee : 0xfffe);
op_irq();
}
op_step();
}
} }
} }

View File

@ -19,20 +19,25 @@ void SA1::enter() {
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
} }
if(mmio.sa1_rdyb || mmio.sa1_resb) { if (regs.hang == HangType::Wait) this->op_wai();
//SA-1 co-processor is asleep else if (regs.hang == HangType::Stop) this->op_stp();
tick(); else
synchronize_cpu(); {
continue; if(mmio.sa1_rdyb || mmio.sa1_resb) {
} //SA-1 co-processor is asleep
tick();
synchronize_cpu();
continue;
}
if(status.interrupt_pending) { if(status.interrupt_pending) {
status.interrupt_pending = false; status.interrupt_pending = false;
op_irq(); op_irq();
continue; continue;
} }
(this->*opcode_table[op_readpc()])(); (this->*opcode_table[op_readpc()])();
}
} }
} }

View File

@ -72,21 +72,29 @@ L rd.h = op_readlong(vectorN + 1);
} }
void CPUcore::op_stp() { void CPUcore::op_stp() {
if(regs.hang == HangType::Stop)
goto SKIP;
regs.hang = HangType::Stop; regs.hang = HangType::Stop;
while(regs.wai = true) { while(regs.wai = true) {
L op_io(); L op_io();
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
} if (scheduler.exit_reason.value == Scheduler::ExitReason::SynchronizeEvent) return;
SKIP: ;
}
regs.hang = HangType::None; regs.hang = HangType::None;
} }
void CPUcore::op_wai() { void CPUcore::op_wai() {
if (regs.hang == HangType::Wait)
goto SKIP;
regs.wai = true; regs.wai = true;
regs.hang = HangType::Wait; regs.hang = HangType::Wait;
while(regs.wai) { while(regs.wai) {
L op_io(); L op_io();
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent); scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
} if(scheduler.exit_reason.value == Scheduler::ExitReason::SynchronizeEvent) return;
SKIP: ;
}
regs.hang = HangType::None; regs.hang = HangType::None;
op_io(); op_io();
} }

View File

@ -25,6 +25,7 @@ void CPUcore::core_serialize(serializer &s) {
s.integer(regs.wai); s.integer(regs.wai);
s.integer(regs.mdr); s.integer(regs.mdr);
s.integer(regs.vector); s.integer(regs.vector);
s.integer((unsigned)regs.hang);
s.integer(aa.d); s.integer(aa.d);
s.integer(rd.d); s.integer(rd.d);