added tests for SC_SHUTDOWN and SC_WRITE (print)
This commit is contained in:
@ -78,10 +78,7 @@ fn syscall(machine: &Machine) -> Result<MachineOk, MachineError> {
|
||||
// load buffer
|
||||
let mut buffer = "".to_string();
|
||||
for i in 0..size {
|
||||
match char::from_digit(machine.read_memory(1, (address + i) as usize) as u32, 2) {
|
||||
Some(c) => buffer.push(c),
|
||||
None => todo!() // Throw a proper error
|
||||
}
|
||||
buffer.push((machine.read_memory(1, (address + i) as usize)) as u8 as char);
|
||||
}
|
||||
|
||||
if f as u8 == CONSOLE_OUTPUT {
|
||||
@ -121,4 +118,55 @@ fn syscall(machine: &Machine) -> Result<MachineOk, MachineError> {
|
||||
SC_DEBUG => todo!(),
|
||||
_ => todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use crate::kernel::exception::{SC_SHUTDOWN, SC_WRITE};
|
||||
use crate::simulator::instruction::Instruction;
|
||||
use crate::simulator::machine::Machine;
|
||||
|
||||
#[test]
|
||||
fn test_sc_shutdown() {
|
||||
let mut machine = Machine::init_machine();
|
||||
machine.write_int_register(17, SC_SHUTDOWN as i64); // Set type to shutdown
|
||||
let ecall = Instruction::new(0b000000000000_00000_000_00000_1110011);
|
||||
|
||||
machine.write_memory(4, 0, 0b000000000000_00000_000_00000_1110011); // ecall
|
||||
machine.write_memory(4, 4, 0b000000001010_00000_000_00001_0010011); // r1 <- 10
|
||||
|
||||
machine.run();
|
||||
// If the machine was stopped with no error, the shutdown worked
|
||||
assert_ne!(machine.read_int_register(1), 10); // Check if the next instruction was executed
|
||||
}
|
||||
|
||||
// This test print HELLO in the console
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_sc_print() {
|
||||
let mut machine = Machine::init_machine();
|
||||
|
||||
let address = machine.read_int_register(10);
|
||||
// Write string 'HELLO' in memory
|
||||
machine.write_memory(1, 4000, 72);
|
||||
machine.write_memory(1, 4001, 69);
|
||||
machine.write_memory(1, 4002, 76);
|
||||
machine.write_memory(1, 4003, 76);
|
||||
machine.write_memory(1, 4004, 79);
|
||||
|
||||
|
||||
machine.write_int_register(10, 4000); // String address
|
||||
machine.write_int_register(11, 5); // String size
|
||||
machine.write_int_register(12, 1); // Console output
|
||||
|
||||
machine.write_memory(4, 0, 0b000000000000_00000_000_00000_1110011); // ecall
|
||||
machine.write_int_register(17, SC_WRITE as i64); // Set type to write
|
||||
|
||||
machine.write_memory(4, 4, 0b000000000000_00000_000_10001_0010011); // r17 <- SC_SHUTDOWN
|
||||
machine.write_memory(4, 8, 0b000000000000_00000_000_00000_1110011); // ecall
|
||||
|
||||
|
||||
machine.run();
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user