|
|
@ -2,6 +2,7 @@ use std::fmt; |
|
|
use std::fs::File; |
|
|
use std::fs::File; |
|
|
use std::path::Path; |
|
|
use std::path::Path; |
|
|
use std::io::prelude::*; |
|
|
use std::io::prelude::*; |
|
|
|
|
|
use std::io; |
|
|
use super::*; |
|
|
use super::*; |
|
|
|
|
|
|
|
|
pub struct Cpu { |
|
|
pub struct Cpu { |
|
|
@ -10,6 +11,7 @@ pub struct Cpu { |
|
|
reg: Vec<u16>, |
|
|
reg: Vec<u16>, |
|
|
pc: u16, |
|
|
pc: u16, |
|
|
alu: Alu, |
|
|
alu: Alu, |
|
|
|
|
|
inline: String, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
impl fmt::Debug for Cpu { |
|
|
impl fmt::Debug for Cpu { |
|
|
@ -39,6 +41,7 @@ impl Cpu { |
|
|
reg: vec![0; 8], |
|
|
reg: vec![0; 8], |
|
|
pc: 0, |
|
|
pc: 0, |
|
|
alu: Alu::new(), |
|
|
alu: Alu::new(), |
|
|
|
|
|
inline: String::new(), |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -280,7 +283,11 @@ impl Cpu { |
|
|
if DEBUG { |
|
|
if DEBUG { |
|
|
println!("{}: in {}", self.pc, self.mem[(self.pc + 1) as usize]); |
|
|
println!("{}: in {}", self.pc, self.mem[(self.pc + 1) as usize]); |
|
|
} |
|
|
} |
|
|
running = false; |
|
|
self.inc_pc(); |
|
|
|
|
|
let reg = self.readmem(self.pc).unwrap(); |
|
|
|
|
|
let val = self.input() as u16; |
|
|
|
|
|
self.write(reg, val)?; |
|
|
|
|
|
self.inc_pc(); |
|
|
}, |
|
|
}, |
|
|
21 => { //noop: no operation
|
|
|
21 => { //noop: no operation
|
|
|
if DEBUG { |
|
|
if DEBUG { |
|
|
@ -367,4 +374,12 @@ impl Cpu { |
|
|
self.pc += 1; |
|
|
self.pc += 1; |
|
|
self.pc %= 32768; |
|
|
self.pc %= 32768; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fn input(&mut self) -> u8 { |
|
|
|
|
|
if self.inline.is_empty() { |
|
|
|
|
|
let stdin = io::stdin(); |
|
|
|
|
|
stdin.read_line(&mut self.inline); |
|
|
|
|
|
} |
|
|
|
|
|
self.inline.remove(0) as u8 |
|
|
|
|
|
} |
|
|
} |
|
|
} |