ft(interpreter): use DS and SS sregs as correct segment offsets
This commit is contained in:
@@ -39,12 +39,13 @@ impl Computer {
|
||||
/// Decrement stack pointer and write `val` onto the stack.
|
||||
pub fn push_stack(&mut self, val: ImmediateOperand) -> Result<(), InterpreterError> {
|
||||
self.regs.push()?;
|
||||
self.memory.write_raw(self.regs.sp, val.into())
|
||||
self.memory
|
||||
.write_raw(&self.sregs.ss * 16 + self.regs.sp, val.into())
|
||||
}
|
||||
|
||||
/// Retrieve value from stack and increment stack pointer.
|
||||
pub fn pop_stack(&mut self) -> Result<Word, InterpreterError> {
|
||||
let word = self.memory.read_raw(self.regs.sp)?;
|
||||
let word = self.memory.read_raw(&self.sregs.ss * 16 + self.regs.sp)?;
|
||||
self.regs.pop()?;
|
||||
Ok(word)
|
||||
}
|
||||
@@ -153,7 +154,7 @@ impl Computer {
|
||||
ArithmeticOperand::ModRmTarget(mod_rm_target) => {
|
||||
ArithmeticOperand::Immediate(match mod_rm_target {
|
||||
ModRmTarget::Memory(idx) => {
|
||||
(self.memory.read(&self.regs, idx) + cf as u16).into()
|
||||
(self.memory.read(&self.regs, &self.sregs, idx) + cf as u16).into()
|
||||
}
|
||||
ModRmTarget::Register(reg) => self.regs.read(reg) + cf,
|
||||
})
|
||||
@@ -181,7 +182,7 @@ impl Computer {
|
||||
ArithmeticOperand::ModRmTarget(mod_rm_target) => {
|
||||
ArithmeticOperand::Immediate(match mod_rm_target {
|
||||
ModRmTarget::Memory(idx) => {
|
||||
(self.memory.read(&self.regs, idx) + cf as u16).into()
|
||||
(self.memory.read(&self.regs, &self.sregs, idx) + cf as u16).into()
|
||||
}
|
||||
ModRmTarget::Register(reg) => self.regs.read(reg) + cf,
|
||||
})
|
||||
@@ -228,7 +229,7 @@ impl Computer {
|
||||
/// Write an [`ImmediateOperand`] into [`Self::memory`] or [`Self::regs`].
|
||||
pub fn write_modrm(&mut self, target: ModRmTarget, val: ImmediateOperand) {
|
||||
match target {
|
||||
ModRmTarget::Memory(idx) => self.memory.write(&self.regs, idx, val),
|
||||
ModRmTarget::Memory(idx) => self.memory.write(&self.regs, &self.sregs, idx, val),
|
||||
ModRmTarget::Register(reg) => self.regs.write(reg, val),
|
||||
};
|
||||
}
|
||||
@@ -236,7 +237,7 @@ impl Computer {
|
||||
/// Read an [`ImmediateOperand`] from [`Self::memory`] or [`Self::regs`].
|
||||
pub fn read_modrm(&self, target: ModRmTarget) -> ImmediateOperand {
|
||||
match target {
|
||||
ModRmTarget::Memory(idx) => self.memory.read(&self.regs, idx).into(),
|
||||
ModRmTarget::Memory(idx) => self.memory.read(&self.regs, &self.sregs, idx).into(),
|
||||
ModRmTarget::Register(reg) => self.regs.read(reg),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user