fix(interpreter): wrong le byte order on pop
This commit is contained in:
@@ -257,5 +257,18 @@ impl fmt::Display for Computer {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
// use super::*;
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_push() {
|
||||||
|
let mut c = Computer::new();
|
||||||
|
let val = ImmediateOperand::Word(0x1234);
|
||||||
|
c.push_stack(val).unwrap();
|
||||||
|
|
||||||
|
let target = PopTarget::Register(crate::register::Register::AX);
|
||||||
|
c.pop_stack(target).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(val, c.regs.read(crate::register::Register::AX))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ impl Memory {
|
|||||||
.get((idx + 1) as usize)
|
.get((idx + 1) as usize)
|
||||||
.ok_or(InterpreterError::MemoryOutOfBound(idx))?
|
.ok_or(InterpreterError::MemoryOutOfBound(idx))?
|
||||||
.to_owned();
|
.to_owned();
|
||||||
Ok(Word::from_be_bytes([b1, b2]))
|
Ok(Word::from_be_bytes([b2, b1]))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write an [`ImmediateOperand`] to a memory location indexed by a [`MemoryIndex`].
|
/// Write an [`ImmediateOperand`] to a memory location indexed by a [`MemoryIndex`].
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ impl Register {
|
|||||||
|
|
||||||
/// Decrement stack pointer
|
/// Decrement stack pointer
|
||||||
pub fn push(&mut self) -> Result<(), InterpreterError> {
|
pub fn push(&mut self) -> Result<(), InterpreterError> {
|
||||||
if self.sp <= 2 {
|
if self.sp < 2 {
|
||||||
return Err(InterpreterError::InvalidRegisterState(*self));
|
return Err(InterpreterError::InvalidRegisterState(*self));
|
||||||
} else {
|
} else {
|
||||||
self.sp -= 2;
|
self.sp -= 2;
|
||||||
@@ -41,7 +41,7 @@ impl Register {
|
|||||||
|
|
||||||
/// Increment stack pointer
|
/// Increment stack pointer
|
||||||
pub fn pop(&mut self) -> Result<(), InterpreterError> {
|
pub fn pop(&mut self) -> Result<(), InterpreterError> {
|
||||||
if self.sp >= 0xffff - 2 {
|
if self.sp > 0xffff - 2 {
|
||||||
return Err(InterpreterError::InvalidRegisterState(*self));
|
return Err(InterpreterError::InvalidRegisterState(*self));
|
||||||
} else {
|
} else {
|
||||||
self.sp += 2;
|
self.sp += 2;
|
||||||
|
|||||||
Reference in New Issue
Block a user