aboutsummaryrefslogtreecommitdiff
path: root/src/cpu.rs
diff options
context:
space:
mode:
authorkrolxon <krolyxon@tutanota.com>2026-01-05 19:46:19 +0530
committerkrolxon <krolyxon@tutanota.com>2026-01-05 19:46:19 +0530
commitdeac6a4448be93c3c70655cea821e84a7a1b116c (patch)
treec7113c14e56bc82a26b0ed1a900a81ec888c8306 /src/cpu.rs
parent4166b0e5430bd723e31c1198b8d940381aded499 (diff)
add add_ri, sub_ri
Diffstat (limited to 'src/cpu.rs')
-rw-r--r--src/cpu.rs64
1 files changed, 60 insertions, 4 deletions
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();