diff options
Diffstat (limited to 'website-emu/src/lib.rs')
| -rw-r--r-- | website-emu/src/lib.rs | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/website-emu/src/lib.rs b/website-emu/src/lib.rs index ffaa677..b29c901 100644 --- a/website-emu/src/lib.rs +++ b/website-emu/src/lib.rs @@ -16,20 +16,20 @@ const CONSOLE_LOAD: u32 = 0x70000000; const INITRD_LOAD: u32 = 0; -#[wasm_bindgen] +#[wasm_bindgen(module = "/src/dev.js")] extern "C" { - #[wasm_bindgen(js_namespace = console)] - fn log(s: &str); + fn uart_push_line(line: &str); } pub struct Uart { pub addr: u32, - pub value: u8 + pub value: u8, + acc: String } impl MemoryDevice for Uart { fn read(&self, address: u32) -> Result<u8, ()> { - if (address == self.addr) { + if address == self.addr { Ok(self.value) } else { Err(()) @@ -37,8 +37,15 @@ impl MemoryDevice for Uart { } fn write(&mut self, address: u32, value: u8) -> Result<(), ()> { - if (address == self.addr) { + if address == self.addr { self.value = value; + + if self.value as char == '\n' { + uart_push_line(self.acc.as_str()); + self.acc = String::new(); + } else { + self.acc.push(self.value as char); + } Ok(()) } else { Err(()) @@ -76,7 +83,8 @@ pub fn boot(image: &[u8], initrd: &[u8], memory: &[u8]) { let uart = Uart { addr: CONSOLE_LOAD, - value: 0 + value: 0, + acc: "".to_string(), }; cpu_memory.register_device( @@ -102,7 +110,7 @@ pub fn boot(image: &[u8], initrd: &[u8], memory: &[u8]) { state.registers[10] = 0; state.registers[2] = DRAM_LOAD + memory_len as u32; - loop { + while state.on { { handle_instruction(&mut state); state.registers[0] = 0; @@ -278,7 +286,8 @@ fn handle_instruction(state: &mut CpuState) { 0 => trap_to_kernel(state), // ecall 258 => return_to_userspace(state), // sret 261 => { - println!("wfi"); + state.on = false; + return; } _ => panic!("Illegal instruction: {:x}", word), } |
