chore(interpreter): fix small bugs

This commit is contained in:
2025-06-17 22:35:42 +09:00
parent 53262f9e3e
commit 6678a1ef4a
4 changed files with 13 additions and 6 deletions

View File

@@ -49,7 +49,7 @@ impl Computer {
let op: fn(Lhs, Rhs) -> ArithmeticResult = |lhs, rhs| lhs + rhs;
let flag_set: fn(&mut Flags, ArithmeticResult, Lhs, Rhs) = |flags, result, lhs, rhs| {
flags.cf = result < rhs;
flags.of = lhs.msb() && rhs.msb() != result.msb();
flags.of = (lhs.msb() && rhs.msb()) && (result.msb() != lhs.msb());
flags.zf = result.zero();
flags.sf = result.msb();
flags.pf = result.parity();

View File

@@ -427,14 +427,21 @@ impl Interpreter {
},
Mnemonic::CALL_p(_) => todo!(),
Mnemonic::CALL_v(offset) => {
// save next instruction onto stack for later RET
if let Some(next_instr) = ip.next() {
self.computer.push_stack(next_instr.start.into())?;
}
// jump to target
Self::ip_jump(&self.instructions, &mut ip, offset);
}
Mnemonic::CALL_Mod(_) => todo!(),
Mnemonic::CALL_Mod(target) => {
if let Some(next_instr) = ip.next() {
self.computer.push_stack(next_instr.start.into())?;
}
Self::ip_jump(
&self.instructions,
&mut ip,
self.computer.read_modrm(target).into(),
);
}
Mnemonic::CALL_Mp(_) => todo!(),
/*

View File

@@ -22,7 +22,7 @@ impl Register {
bx: BX::new(),
cx: CX::new(),
dx: DX::new(),
sp: 0xffff,
sp: 0xffda,
bp: 0,
si: 0,
di: 0,

View File

@@ -151,7 +151,7 @@ impl From<usize> for ImmediateOperand {
impl Into<Word> for ImmediateOperand {
fn into(self) -> u16 {
match self {
ImmediateOperand::Byte(_) => self.sign_extend().into(),
ImmediateOperand::Byte(b) => b as Word,
ImmediateOperand::Word(w) => w,
}
}