last commit freaks me out a bit. let's try something a little safer looking to fix the SA1 hanging opcodes

This commit is contained in:
zeromus 2017-04-05 19:14:38 -05:00
parent 9119e4f4ea
commit 57b1df8487
3 changed files with 13 additions and 2 deletions

View File

@ -72,7 +72,9 @@ void CPU::enter() {
op_irq();
}
op_step();
if(regs.hang == HangType::Wait) this->op_wai();
else if (regs.hang == HangType::Stop) this->op_stp();
else op_step();
}
}

View File

@ -72,18 +72,22 @@ L rd.h = op_readlong(vectorN + 1);
}
void CPUcore::op_stp() {
regs.hang = HangType::Stop;
while(regs.wai = true) {
L op_io();
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
}
regs.hang = HangType::None;
}
void CPUcore::op_wai() {
regs.wai = true;
regs.hang = HangType::Wait;
while(regs.wai) {
L op_io();
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
}
regs.hang = HangType::None;
op_io();
}

View File

@ -1,3 +1,5 @@
enum class HangType: unsigned { None, Wait, Stop };
struct flag_t {
bool n, v, m, x, d, i, z, c;
@ -73,11 +75,14 @@ struct regs_t {
bool irq; //IRQ pin (0 = low, 1 = trigger)
bool wai; //raised during wai, cleared after interrupt triggered
uint8 mdr; //memory data register
uint16 vector; //interrupt vector address
HangType hang;
regs_t():
a(r[0]), x(r[1]), y(r[2]), z(r[3]), s(r[4]), d(r[5]), db(0), e(false), irq(false), wai(false), mdr(0), vector(0) {
a(r[0]), x(r[1]), y(r[2]), z(r[3]), s(r[4]), d(r[5]), db(0), e(false), irq(false), wai(false), mdr(0), vector(0), hang(HangType::None) {
z = 0;
}
};