From deac6a4448be93c3c70655cea821e84a7a1b116c Mon Sep 17 00:00:00 2001 From: krolxon Date: Mon, 5 Jan 2026 19:46:19 +0530 Subject: add add_ri, sub_ri --- src/cpu.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 4 deletions(-) (limited to 'src/cpu.rs') diff --git a/src/cpu.rs b/src/cpu.rs index 116d20d..d0365ba 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -42,8 +42,10 @@ impl CPU { match opcode { x if x == Instruction::MOV_RI as u8 => self.mov_ri(mem), x if x == Instruction::MOV_RR as u8 => self.mov_rr(mem), - x if x == Instruction::ADD as u8 => self.add(mem), - x if x == Instruction::SUB as u8 => self.sub(mem), + x if x == Instruction::ADD_RR as u8 => self.add_rr(mem), + x if x == Instruction::ADD_RI as u8 => self.add_ri(mem), + x if x == Instruction::SUB_RR as u8 => self.sub_rr(mem), + x if x == Instruction::SUB_RI as u8 => self.sub_ri(mem), x if x == Instruction::JMP as u8 => self.jmp(mem), x if x == Instruction::JZ as u8 => self.jz(mem), x if x == Instruction::JNZ as u8 => self.jnz(mem), @@ -92,7 +94,7 @@ impl CPU { } - pub fn add(&mut self, mem: &Memory) { + pub fn add_rr(&mut self, mem: &Memory) { let dest = mem.read(self.pc); self.pc += 1; let src = mem.read(self.pc); @@ -133,8 +135,35 @@ impl CPU { self.zero = result == 0; self.carry = carry; } + pub fn add_ri(&mut self, mem: &Memory) { - pub fn sub(&mut self, mem: &Memory) { + let dest = mem.read(self.pc); + self.pc += 1; + let imm = mem.read(self.pc); + self.pc += 1; + + let (result, carry) = match dest { + 0 => self.a.overflowing_add(imm), + 1 => self.b.overflowing_add(imm), + 2 => self.c.overflowing_add(imm), + 3 => self.d.overflowing_add(imm), + _ => (0, false), + }; + + match dest { + 0 => self.a = result, + 1 => self.b = result, + 2 => self.c = result, + 3 => self.d = result, + _ => {} + } + + self.zero = result == 0; + self.carry = carry; + } + + + pub fn sub_rr(&mut self, mem: &Memory) { let dest = mem.read(self.pc); self.pc += 1; let src = mem.read(self.pc); @@ -176,6 +205,33 @@ impl CPU { self.carry = borrow; } + pub fn sub_ri(&mut self, mem: &Memory) { + let dest = mem.read(self.pc); + self.pc += 1; + let imm = mem.read(self.pc); + self.pc += 1; + + let (result, borrow) = match dest { + 0 => self.a.overflowing_sub(imm), + 1 => self.b.overflowing_sub(imm), + 2 => self.c.overflowing_sub(imm), + 3 => self.d.overflowing_sub(imm), + _ => (0, false), + }; + + match dest { + 0 => self.a = result, + 1 => self.b = result, + 2 => self.c = result, + 3 => self.d = result, + _ => {} + } + + self.zero = result == 0; + self.carry = borrow; + } + + pub fn jmp(&mut self, mem: &Memory) { let low = mem.read(self.pc) as u16; self.inc_pc(); -- cgit v1.2.3