fetch execute loop
This commit is contained in:
parent
017350d6e7
commit
0531db1641
36
src/main.rs
36
src/main.rs
@ -109,15 +109,10 @@ impl Registers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum State {
|
|
||||||
Stopped = 0,
|
|
||||||
Running,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct VM {
|
struct VM {
|
||||||
memory: Memory,
|
memory: Memory,
|
||||||
registers: Registers,
|
registers: Registers,
|
||||||
state: State,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VM {
|
impl VM {
|
||||||
@ -125,7 +120,32 @@ impl VM {
|
|||||||
VM{
|
VM{
|
||||||
memory: Memory::new(),
|
memory: Memory::new(),
|
||||||
registers: Registers::new(),
|
registers: Registers::new(),
|
||||||
state: State::Stopped,
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn execute(&mut self) {
|
||||||
|
while self.registers.pc < 0x3010 {
|
||||||
|
let instruction = self.memory.get(self.registers.pc);
|
||||||
|
match instruction >> 12 {
|
||||||
|
0 => println!("opcode BR at address {:#x}", self.registers.pc),
|
||||||
|
1 => println!("opcode ADD at address {:#x}", self.registers.pc),
|
||||||
|
2 => println!("opcode LD at address {:#x}", self.registers.pc),
|
||||||
|
3 => println!("opcode ST at address {:#x}", self.registers.pc),
|
||||||
|
4 => println!("opcode JSR/JSRR at address {:#x}", self.registers.pc),
|
||||||
|
5 => println!("opcode AND at address {:#x}", self.registers.pc),
|
||||||
|
6 => println!("opcode LDR at address {:#x}", self.registers.pc),
|
||||||
|
7 => println!("opcode STR at address {:#x}", self.registers.pc),
|
||||||
|
8 => println!("opcode RTI at address {:#x}", self.registers.pc),
|
||||||
|
9 => println!("opcode NOT at address {:#x}", self.registers.pc),
|
||||||
|
10 => println!("opcode LDI at address {:#x}", self.registers.pc),
|
||||||
|
11 => println!("opcode STI at address {:#x}", self.registers.pc),
|
||||||
|
12 => println!("opcode RET at address {:#x}", self.registers.pc),
|
||||||
|
13 => println!("reserved opcode at address {:#x}", self.registers.pc),
|
||||||
|
14 => println!("opcode LEA at address {:#x}", self.registers.pc),
|
||||||
|
15 => println!("opcode TRAP at address {:#x}", self.registers.pc),
|
||||||
|
_ => println!("this is a no op at address {:#x}", self.registers.pc),
|
||||||
|
}
|
||||||
|
self.registers.pc += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,7 +157,5 @@ fn main() {
|
|||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
let path = args.get(1).expect("a file must be specified");
|
let path = args.get(1).expect("a file must be specified");
|
||||||
lc3.memory.read(path.to_string());
|
lc3.memory.read(path.to_string());
|
||||||
for addr in 0x3000..0x3007 {
|
lc3.execute();
|
||||||
println!("the instruction is {:#b} at address {:#x}", lc3.memory.data[addr], addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,11 @@ impl Memory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn set(&mut self, addr: u16, value: u16) {
|
pub fn set(&mut self, addr: u16, value: u16) {
|
||||||
self.data[addr as usize] = value;
|
self.data[addr as usize] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(&mut self, addr: u16) {
|
pub fn get(&mut self, addr: u16) -> u16 {
|
||||||
self.data[addr as usize];
|
self.data[addr as usize]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&mut self, path: String) {
|
pub fn read(&mut self, path: String) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user