1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-09-29 16:55:59 +00:00

Support HLT.

This commit is contained in:
Thomas Harte 2023-12-01 13:15:01 -05:00
parent 365b62b4a7
commit 33a0c40c02

View File

@ -46,6 +46,9 @@
namespace PCCompatible {
//bool log = false;
//std::string previous;
class DMA {
public:
i8237 controller;
@ -108,7 +111,6 @@ class FloppyController {
if(!hold_reset && hold_reset_) {
// TODO: add a delay mechanism.
reset();
// log = true;
}
hold_reset_ = hold_reset;
if(hold_reset_) {
@ -133,6 +135,7 @@ class FloppyController {
case Command::ReadData: {
printf("FDC: Read %d:%d at %d/%d\n", decoder_.target().drive, decoder_.target().head, decoder_.geometry().cylinder, decoder_.geometry().head);
// log = true;
status_.begin(decoder_);
@ -939,8 +942,12 @@ class FlowController {
registers_.ip() = address;
}
void halt() {}
void wait() {}
void halt() {
halted_ = true;
}
void wait() {
printf("WAIT ????\n");
}
void repeat_last() {
should_repeat_ = true;
@ -954,10 +961,18 @@ class FlowController {
return should_repeat_;
}
void unhalt() {
halted_ = false;
}
bool halted() const {
return halted_;
}
private:
Registers &registers_;
Segments &segments_;
bool should_repeat_ = false;
bool halted_ = false;
};
class ConcreteMachine:
@ -1058,12 +1073,18 @@ class ConcreteMachine:
}
// Signal interrupt.
context.flow_controller.unhalt();
InstructionSet::x86::interrupt(
pic_.acknowledge(),
context
);
}
// Do nothing if halted.
if(context.flow_controller.halted()) {
continue;
}
// Get the next thing to execute.
if(!context.flow_controller.should_repeat()) {
// Decode from the current IP.
@ -1079,8 +1100,6 @@ class ConcreteMachine:
}
context.registers.ip() += decoded.first;
// log |= decoded.second.operation() == InstructionSet::x86::Operation::STI;
} else {
context.flow_controller.begin_instruction();
}
@ -1088,7 +1107,7 @@ class ConcreteMachine:
// if(log) {
// const auto next = to_string(decoded, InstructionSet::x86::Model::i8086);
// if(next != previous) {
// std::cout << next << std::endl;
// std::cout << decoded_ip_ << " " << next << std::endl;
// previous = next;
// }
// }