1
0
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:
Thomas Harte
2025-04-29 21:55:17 -04:00
parent f6bb502e87
commit b4535c489d
3 changed files with 40 additions and 4 deletions

View File

@@ -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);
} }
} }

View File

@@ -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;
} }

View File

@@ -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) {