mirror of
https://github.com/TomHarte/CLK.git
synced 2025-11-24 13:17:41 +00:00
Wrangle test for segments interface.
This commit is contained in:
@@ -96,8 +96,6 @@ void lmsw(
|
|||||||
context.registers.set_msw(source);
|
context.registers.set_msw(source);
|
||||||
if(source & MachineStatus::ProtectedModeEnable) {
|
if(source & MachineStatus::ProtectedModeEnable) {
|
||||||
context.cpu_control.set_mode(Mode::Protected286);
|
context.cpu_control.set_mode(Mode::Protected286);
|
||||||
// context.memory.set_mode(Mode::Protected286);
|
|
||||||
// context.segments.set_mode(Mode::Protected286);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,8 +47,16 @@ static constexpr bool has_mode(const Model model, const Mode mode) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr bool uses_8086_exceptions(const Model model) {
|
static constexpr bool uses_8086_exceptions(const Model model) {
|
||||||
return model <= Model::i80186;
|
return model <= Model::i80186;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <Model model>
|
||||||
|
concept has_descriptor_tables = model >= Model::i80286;
|
||||||
|
|
||||||
|
template <Model model>
|
||||||
|
concept has_32bit_instructions = model >= Model::i80386;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,33 @@
|
|||||||
|
|
||||||
namespace InstructionSet::x86 {
|
namespace InstructionSet::x86 {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register interface requirements.
|
||||||
|
//
|
||||||
template <typename RegistersT, Model model>
|
template <typename RegistersT, Model model>
|
||||||
concept is_registers = true;
|
concept is_registers = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Segment/descriptor interface requirements.
|
||||||
|
//
|
||||||
template <typename SegmentsT, Model model>
|
template <typename SegmentsT, Model model>
|
||||||
concept is_segments = true;
|
concept has_segment_update = requires(SegmentsT segments) {
|
||||||
|
segments.did_update(Source{});
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SegmentsT, Model model>
|
||||||
|
concept has_descriptor_table_update = requires(SegmentsT segments) {
|
||||||
|
segments.did_update(DescriptorTable{});
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename SegmentsT, Model model>
|
||||||
|
concept is_segments =
|
||||||
|
has_segment_update<SegmentsT, model> &&
|
||||||
|
(!has_descriptor_tables<model> || has_descriptor_table_update<SegmentsT, model>);
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
template <typename LinearMemoryT, Model model>
|
template <typename LinearMemoryT, Model model>
|
||||||
concept is_linear_memory = true;
|
concept is_linear_memory = true;
|
||||||
|
|
||||||
@@ -29,10 +50,19 @@ template <typename SegmentedMemoryT, Model model>
|
|||||||
concept is_segmented_memory = true;
|
concept is_segmented_memory = true;
|
||||||
|
|
||||||
template <typename FlowControllerT, Model model>
|
template <typename FlowControllerT, Model model>
|
||||||
concept is_flow_controller = true;
|
concept is_flow_controller = requires(FlowControllerT controller) {
|
||||||
|
controller.template jump<uint16_t>(uint16_t{});
|
||||||
|
controller.template jump<uint16_t>(uint16_t{}, uint16_t{});
|
||||||
|
controller.halt();
|
||||||
|
controller.wait();
|
||||||
|
controller.repeat_last();
|
||||||
|
|
||||||
|
// TODO: if 32-bit, check for jump<uint32_t>, Somehow?
|
||||||
|
};
|
||||||
|
|
||||||
template <typename CPUControlT, Model model>
|
template <typename CPUControlT, Model model>
|
||||||
concept is_cpu_control = true;
|
concept is_cpu_control = true;
|
||||||
|
// TODO: if 286 or better, cpu_control.set_mode(Mode{});
|
||||||
|
|
||||||
template <typename ContextT>
|
template <typename ContextT>
|
||||||
concept is_context = requires(ContextT context) {
|
concept is_context = requires(ContextT context) {
|
||||||
|
|||||||
Reference in New Issue
Block a user