mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-08 14:25:05 +00:00
Decodes 8e.
This commit is contained in:
@@ -176,7 +176,7 @@ Instruction Decoder::decode(const uint8_t *source, size_t length) {
|
|||||||
case 0x8b: MemRegReg(MOV, Reg_MemReg, 2); break;
|
case 0x8b: MemRegReg(MOV, Reg_MemReg, 2); break;
|
||||||
// 0x8c: not used.
|
// 0x8c: not used.
|
||||||
case 0x8d: MemRegReg(LEA, Reg_MemReg, 2); break;
|
case 0x8d: MemRegReg(LEA, Reg_MemReg, 2); break;
|
||||||
// case 0x84: MemRegReg(0x8e, MOV, SegReg_MemReg, 1); // TODO: SegReg_MemReg
|
case 0x8e: MemRegReg(MOV, SegReg, 2); break;
|
||||||
case 0x8f: MemRegReg(POP, MemRegPOP, 2); break;
|
case 0x8f: MemRegReg(POP, MemRegPOP, 2); break;
|
||||||
|
|
||||||
case 0x90: Complete(NOP, None, None, 0); break; // Or XCHG AX, AX?
|
case 0x90: Complete(NOP, None, None, 0); break; // Or XCHG AX, AX?
|
||||||
@@ -309,7 +309,6 @@ Instruction Decoder::decode(const uint8_t *source, size_t length) {
|
|||||||
/*
|
/*
|
||||||
Unimplemented (but should be):
|
Unimplemented (but should be):
|
||||||
|
|
||||||
0x8e,
|
|
||||||
0xfe, 0xff
|
0xfe, 0xff
|
||||||
|
|
||||||
[and consider which others are unused but seem to be
|
[and consider which others are unused but seem to be
|
||||||
@@ -411,6 +410,22 @@ Instruction Decoder::decode(const uint8_t *source, size_t length) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ModRegRMFormat::SegReg: {
|
||||||
|
source_ = memreg;
|
||||||
|
|
||||||
|
constexpr Source seg_table[4] = {
|
||||||
|
Source::ES, Source::CS,
|
||||||
|
Source::SS, Source::DS,
|
||||||
|
};
|
||||||
|
|
||||||
|
if(reg & 4) {
|
||||||
|
reset_parsing();
|
||||||
|
return Instruction(consumed_);
|
||||||
|
}
|
||||||
|
|
||||||
|
destination_ = seg_table[reg];
|
||||||
|
} break;
|
||||||
|
|
||||||
case ModRegRMFormat::MemRegROL_to_SAR:
|
case ModRegRMFormat::MemRegROL_to_SAR:
|
||||||
destination_ = memreg;
|
destination_ = memreg;
|
||||||
|
|
||||||
|
@@ -205,6 +205,11 @@ struct Decoder {
|
|||||||
// to pick an operation from the ROL/ROR/RCL/RCR/SAL/SHR/SAR group.
|
// to pick an operation from the ROL/ROR/RCL/RCR/SAL/SHR/SAR group.
|
||||||
MemRegROL_to_SAR,
|
MemRegROL_to_SAR,
|
||||||
|
|
||||||
|
// Parse for mode and register/memory fields, populating the
|
||||||
|
// source_ field with the result. Fills destination_ with a segment
|
||||||
|
// register based on the reg field.
|
||||||
|
SegReg,
|
||||||
|
|
||||||
} modregrm_format_ = ModRegRMFormat::MemReg_Reg;
|
} modregrm_format_ = ModRegRMFormat::MemReg_Reg;
|
||||||
|
|
||||||
// Ephemeral decoding state.
|
// Ephemeral decoding state.
|
||||||
|
Reference in New Issue
Block a user