chore(interpreter): improve debug output
This commit is contained in:
@@ -39,9 +39,11 @@ impl Computer {
|
|||||||
flags: Flags::new(),
|
flags: Flags::new(),
|
||||||
memory: Memory::new(),
|
memory: Memory::new(),
|
||||||
};
|
};
|
||||||
|
log::info!("Initializing stack...");
|
||||||
computer.init_stack().unwrap();
|
computer.init_stack().unwrap();
|
||||||
|
|
||||||
// Copy static data to 0x0000;
|
// Copy static data to 0x0000;
|
||||||
|
log::info!("Initializing static data...");
|
||||||
for (addr, b) in data.iter().enumerate() {
|
for (addr, b) in data.iter().enumerate() {
|
||||||
let val = ImmediateOperand::Byte(*b);
|
let val = ImmediateOperand::Byte(*b);
|
||||||
computer.write(val, (addr as Word).into()).unwrap();
|
computer.write(val, (addr as Word).into()).unwrap();
|
||||||
@@ -80,7 +82,6 @@ impl Computer {
|
|||||||
for env in envs.iter() {
|
for env in envs.iter() {
|
||||||
log::debug!("Adding env {env} to stack");
|
log::debug!("Adding env {env} to stack");
|
||||||
for b in env.chars().rev() {
|
for b in env.chars().rev() {
|
||||||
log::debug!("{}", b);
|
|
||||||
self.push_stack(ImmediateOperand::Byte(b as u8))?;
|
self.push_stack(ImmediateOperand::Byte(b as u8))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,11 +89,10 @@ impl Computer {
|
|||||||
|
|
||||||
// write 0-terminated argv's
|
// write 0-terminated argv's
|
||||||
let mut argv_ptrs = Vec::new();
|
let mut argv_ptrs = Vec::new();
|
||||||
for arg in argv.iter() {
|
for arg in argv.iter().rev() {
|
||||||
log::debug!("Adding arg {arg} to stack");
|
log::debug!("Adding arg {arg} to stack");
|
||||||
self.push_stack(ImmediateOperand::Byte(0))?;
|
self.push_stack(ImmediateOperand::Byte(0))?;
|
||||||
for b in arg.chars().rev() {
|
for b in arg.chars().rev() {
|
||||||
log::debug!("{}", b);
|
|
||||||
self.push_stack(ImmediateOperand::Byte(b as u8))?;
|
self.push_stack(ImmediateOperand::Byte(b as u8))?;
|
||||||
}
|
}
|
||||||
argv_ptrs.push(self.regs.sp);
|
argv_ptrs.push(self.regs.sp);
|
||||||
@@ -127,7 +127,25 @@ impl Computer {
|
|||||||
ImmediateOperand::Byte(_) => 1,
|
ImmediateOperand::Byte(_) => 1,
|
||||||
ImmediateOperand::Word(_) => 2,
|
ImmediateOperand::Word(_) => 2,
|
||||||
});
|
});
|
||||||
log::debug!("writing at sp: {:#04x}", self.regs.sp);
|
match val {
|
||||||
|
ImmediateOperand::Byte(b) => {
|
||||||
|
log::debug!(
|
||||||
|
"writing byte {b:#04x} ({}) at sp: {:#04x}",
|
||||||
|
b as char,
|
||||||
|
self.regs.sp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
ImmediateOperand::Word(v) => {
|
||||||
|
let [low, high] = v.to_le_bytes();
|
||||||
|
log::debug!(
|
||||||
|
"writing word {v:#04x} ({}) ({}) at sp: {:#04x} and {:#04x}",
|
||||||
|
low as char,
|
||||||
|
high as char,
|
||||||
|
self.regs.sp,
|
||||||
|
self.regs.sp + 1
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
self.memory.write_raw(
|
self.memory.write_raw(
|
||||||
self.mem_addr(
|
self.mem_addr(
|
||||||
ImmediateOperand::from(self.regs.sp).into(),
|
ImmediateOperand::from(self.regs.sp).into(),
|
||||||
@@ -430,7 +448,6 @@ impl Computer {
|
|||||||
target: ModRmTarget,
|
target: ModRmTarget,
|
||||||
val: ImmediateOperand,
|
val: ImmediateOperand,
|
||||||
) -> Result<(), InterpreterError> {
|
) -> Result<(), InterpreterError> {
|
||||||
log::debug!("Writing {val} into {target}");
|
|
||||||
match target {
|
match target {
|
||||||
ModRmTarget::Memory(idx) => self.write(val.into(), idx)?,
|
ModRmTarget::Memory(idx) => self.write(val.into(), idx)?,
|
||||||
ModRmTarget::Register(reg) => self.regs.write(reg, val),
|
ModRmTarget::Register(reg) => self.regs.write(reg, val),
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ impl Interpreter {
|
|||||||
|
|
||||||
pub fn interpret(&mut self) -> Result<(), InterpreterError> {
|
pub fn interpret(&mut self) -> Result<(), InterpreterError> {
|
||||||
while self.ip < self.text.len() {
|
while self.ip < self.text.len() {
|
||||||
|
log::debug!("=============== Fetching next instruction... ===============");
|
||||||
self.disassembler.offset = self.ip;
|
self.disassembler.offset = self.ip;
|
||||||
self.disassembler
|
self.disassembler
|
||||||
.decode_instruction()
|
.decode_instruction()
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ impl Memory {
|
|||||||
return Err(InterpreterError::MemoryOutOfBound(addr));
|
return Err(InterpreterError::MemoryOutOfBound(addr));
|
||||||
} else {
|
} else {
|
||||||
self.raw[addr as usize] = b;
|
self.raw[addr as usize] = b;
|
||||||
|
log::debug!("Wrote raw byte {b:#04x} at addr {addr:#04x}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImmediateOperand::Word(w) => {
|
ImmediateOperand::Word(w) => {
|
||||||
@@ -35,6 +36,9 @@ impl Memory {
|
|||||||
let [low, high] = w.to_le_bytes();
|
let [low, high] = w.to_le_bytes();
|
||||||
self.raw[addr as usize] = low;
|
self.raw[addr as usize] = low;
|
||||||
self.raw[(addr + 1) as usize] = high;
|
self.raw[(addr + 1) as usize] = high;
|
||||||
|
log::debug!(
|
||||||
|
"Wrote raw byte {low:#04x} and {high:#04x}, starting at addr {addr:#04x}"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,6 +58,7 @@ impl Memory {
|
|||||||
.get((addr + 1) as usize)
|
.get((addr + 1) as usize)
|
||||||
.ok_or(InterpreterError::MemoryOutOfBound(addr))?
|
.ok_or(InterpreterError::MemoryOutOfBound(addr))?
|
||||||
.to_owned();
|
.to_owned();
|
||||||
|
log::debug!("Read raw byte {b1:#04x} and {b2:#04x}, starting at addr {addr:#04x}");
|
||||||
Ok(Word::from_be_bytes([b2, b1]))
|
Ok(Word::from_be_bytes([b2, b1]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user