diff --git a/src/cpu.rs b/src/cpu.rs index ceef8a3..96ede96 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -18,7 +18,7 @@ pub struct CPU{ } impl CPU { - pub fn inc_cp(&mut self) { + pub fn inc_pc(&mut self) { self.pc += 1; } @@ -27,8 +27,8 @@ impl CPU { } pub fn mov(&mut self, mem: &mut Memory) { - let reg = mem.read(self.pc); self.inc_cp(); - let val = mem.read(self.pc); self.inc_cp(); + let reg = mem.read(self.pc); self.inc_pc(); + let val = mem.read(self.pc); self.inc_pc(); match reg { 0 => self.a = val, @@ -132,4 +132,25 @@ impl CPU { self.carry = borrow; } + pub fn jmp(&mut self, mem: &mut Memory) { + let low = mem.read(self.pc) as u16; self.inc_pc(); + let high = mem.read(self.pc) as u16; self.inc_pc(); + + let addrs = (high << 8) | low; + + self.pc = addrs; + } + + pub fn jz(&mut self, mem: &mut Memory) { + let low = mem.read(self.pc) as u16; self.inc_pc(); + let high = mem.read(self.pc) as u16; self.inc_pc(); + + let addrs = (high << 8) | low; + + if self.zero { + self.pc = addrs; + } + + } + } diff --git a/src/main.rs b/src/main.rs index 7c638ba..efbf5f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,31 +20,36 @@ fn main() { // b = 2 mem.write(0x0003, Instruction::MOV as u8); mem.write(0x0004, 1); - mem.write(0x0005, 1); + mem.write(0x0005, 5); // a = a + b mem.write(0x0006, Instruction::SUB as u8); mem.write(0x0007, 0); mem.write(0x0008, 1); + // JMP to halt + mem.write(0x0009, Instruction::JZ as u8); + mem.write(0x000a, 0x0f); // Low + mem.write(0x000b, 0x00); // High + // set b = 0 - mem.write(0x0009, Instruction::MOV as u8); - mem.write(0x000a, 1); - mem.write(0x000b, 0); + mem.write(0x000c, Instruction::MOV as u8); + mem.write(0x000d, 1); + mem.write(0x000e, 0); // halt - mem.write(0x000c, Instruction::HLT as u8); + mem.write(0x000f, Instruction::HLT as u8); while !cpu.halted { let opcode = mem.read(cpu.pc); - cpu.inc_cp(); + cpu.inc_pc(); match opcode { x if x == Instruction::MOV as u8 => cpu.mov(&mut mem), x if x == Instruction::ADD as u8 => cpu.add(&mut mem), x if x == Instruction::SUB as u8 => cpu.sub(&mut mem), - x if x == Instruction::JMP as u8 => {} - x if x == Instruction::JZ as u8 => {} + x if x == Instruction::JMP as u8 => cpu.jmp(&mut mem), + x if x == Instruction::JZ as u8 => cpu.jz(&mut mem), x if x == Instruction::HLT as u8 => cpu.halt(), _ => panic!("Unknown opcode {:02X}", opcode), }