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:
parent
9119e4f4ea
commit
57b1df8487
|
@ -72,7 +72,9 @@ void CPU::enter() {
|
||||||
op_irq();
|
op_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
op_step();
|
if(regs.hang == HangType::Wait) this->op_wai();
|
||||||
|
else if (regs.hang == HangType::Stop) this->op_stp();
|
||||||
|
else op_step();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,18 +72,22 @@ L rd.h = op_readlong(vectorN + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPUcore::op_stp() {
|
void CPUcore::op_stp() {
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
regs.hang = HangType::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPUcore::op_wai() {
|
void CPUcore::op_wai() {
|
||||||
regs.wai = true;
|
regs.wai = true;
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
regs.hang = HangType::None;
|
||||||
op_io();
|
op_io();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
enum class HangType: unsigned { None, Wait, Stop };
|
||||||
|
|
||||||
struct flag_t {
|
struct flag_t {
|
||||||
bool n, v, m, x, d, i, z, c;
|
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 irq; //IRQ pin (0 = low, 1 = trigger)
|
||||||
bool wai; //raised during wai, cleared after interrupt triggered
|
bool wai; //raised during wai, cleared after interrupt triggered
|
||||||
|
|
||||||
uint8 mdr; //memory data register
|
uint8 mdr; //memory data register
|
||||||
uint16 vector; //interrupt vector address
|
uint16 vector; //interrupt vector address
|
||||||
|
|
||||||
|
HangType hang;
|
||||||
|
|
||||||
regs_t():
|
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;
|
z = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue