fix: align pointer parsing with spec

Previously pointer parsing was completely wrong.
Now split into Pointer32 for immediates with
segment;offset and Pointer16 for short jumps, which
use DS or ES as segment and the Pointer16 value
as offset.
This commit is contained in:
2025-05-28 13:28:35 +09:00
parent 0893969f4e
commit c396d33f76
3 changed files with 71 additions and 37 deletions

View File

@@ -1,7 +1,7 @@
//! Internal abstraction of the 8086 instructions.
use crate::{
operands::{Byte, MemoryIndex, ModRmTarget, Pointer, Word},
operands::{Byte, MemoryIndex, ModRmTarget, Pointer16, Pointer32, Word},
register::{Register, SegmentRegister},
};
use core::fmt;
@@ -202,16 +202,16 @@ pub enum Mnemonic {
CBW,
CWD,
// CALL
CALL_p(Pointer),
CALL_p(Pointer32),
CALL_v(isize),
CALL_Mod(ModRmTarget),
CALL_Mp(ModRmTarget, Pointer),
CALL_Mp(Pointer16),
// JUMP
JMP_p(Pointer),
JMP_p(Pointer32),
JMP_b(isize), // parses IByte, but stores as isize
JMP_v(isize), // parwses IWord, but stores as isize
JMP_Mod(ModRmTarget),
JMP_Mp(ModRmTarget, Pointer),
JMP_Mp(Pointer16),
// WAIT
WAIT,
// Push/Pop Flags
@@ -237,8 +237,8 @@ pub enum Mnemonic {
RETF,
IRET,
// Load ES/DS Register
LES(ModRmTarget, Pointer),
LDS(ModRmTarget, Pointer),
LES(Register, Pointer16),
LDS(Register, Pointer16),
// NOT
NOT(ModRmTarget),
// NEG
@@ -444,13 +444,13 @@ impl fmt::Display for Mnemonic {
Self::CALL_p(ptr) => write!(f, "call {ptr}"),
Self::CALL_v(word) => write!(f, "call {word:#04x}"),
Self::CALL_Mod(target) => write!(f, "call {target}"),
Self::CALL_Mp(target, ptr) => write!(f, "call {target}, {ptr}"),
Self::CALL_Mp(ptr) => write!(f, "call {ptr}"),
Self::JMP_p(ptr) => write!(f, "jmp {ptr}"),
Self::JMP_b(byte) => write!(f, "jmp {byte:#04x}"),
Self::JMP_v(word) => write!(f, "jmp {word:#04x}"),
Self::JMP_Mod(target) => write!(f, "jmp {target}"),
Self::JMP_Mp(target, ptr) => write!(f, "jmp {target}, {ptr}"),
Self::JMP_Mp(ptr) => write!(f, "jmp {ptr}"),
Self::WAIT => write!(f, "wait"),
@@ -476,8 +476,8 @@ impl fmt::Display for Mnemonic {
Self::RETF => write!(f, "retf"),
Self::IRET => write!(f, "iret"),
Self::LES(target, ptr) => write!(f, "les {target}, {ptr}"),
Self::LDS(target, ptr) => write!(f, "lds {target}, {ptr}"),
Self::LES(reg, mem) => write!(f, "les {reg}, ptr {mem}"),
Self::LDS(reg, mem) => write!(f, "lds {reg}, ptr {mem}"),
Self::NOT(target) => write!(f, "not {target}"),
Self::NEG(target) => write!(f, "neg {target}"),