diff options
| author | krolxon <krolyxon@tutanota.com> | 2026-01-04 18:47:43 +0530 |
|---|---|---|
| committer | krolxon <krolyxon@tutanota.com> | 2026-01-04 18:47:43 +0530 |
| commit | 798ac8ce75e2784e9e412f9ea7778b80b077c1dd (patch) | |
| tree | f59a7fe2ff085f8a250d36d361a2b70e35feff0a /src/cpu.rs | |
| parent | 4809d7159f373a358da4932571e2219b39b561ed (diff) | |
refactor the cpu logic to cpu module
Diffstat (limited to 'src/cpu.rs')
| -rw-r--r-- | src/cpu.rs | 113 |
1 files changed, 113 insertions, 0 deletions
@@ -1,3 +1,5 @@ +use crate::memory::{self, Memory}; + #[derive(Default)] #[derive(Debug)] pub struct CPU{ @@ -19,4 +21,115 @@ impl CPU { pub fn inc_cp(&mut self) { self.pc += 1; } + + pub fn halt(&mut self) { + self.halted = true; + } + + 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(); + + match reg { + 0 => self.a = val, + 1 => self.b = val, + 2 => self.c = val, + 3 => self.d = val, + _ => {} + } + } + + pub fn add(&mut self, mem:&mut Memory) { + + let dest = mem.read(self.pc); self.pc += 1; + let src = mem.read(self.pc); self.pc += 1; + + let (result, carry) = match (dest, src) { + // What the fuck do these tuples mean? + // so basically they are the numbers assigned to register + // 0 => A, 1 => B .... + // so when it is (0, 0), it basically says add the + // value of register B into register A, + // thats exactly whats replicated in the code below + (0, 0) => self.a.overflowing_add(self.a), + (0, 1) => self.a.overflowing_add(self.b), + (0, 2) => self.a.overflowing_add(self.c), + (0, 3) => self.a.overflowing_add(self.d), + + (1, 0) => self.b.overflowing_add(self.a), + (1, 1) => self.b.overflowing_add(self.b), + (1, 2) => self.b.overflowing_add(self.c), + (1, 3) => self.b.overflowing_add(self.d), + + (2, 0) => self.c.overflowing_add(self.a), + (2, 1) => self.c.overflowing_add(self.b), + (2, 2) => self.c.overflowing_add(self.c), + (2, 3) => self.c.overflowing_add(self.d), + + (3, 0) => self.d.overflowing_add(self.a), + (3, 1) => self.d.overflowing_add(self.b), + (3, 2) => self.d.overflowing_add(self.c), + (3, 3) => self.d.overflowing_add(self.d), + + _ => (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(&mut self, mem: &mut Memory) { + let dest = mem.read(self.pc); self.pc += 1; + let src = mem.read(self.pc); self.pc += 1; + + let (result, borrow) = match (dest, src) { + // What the fuck do these tuples mean? + // so basically they are the numbers assigned to register + // 0 => A, 1 => B .... + // so when it is (0, 0), it basically says add the + // value of register B into register A, + // thats exactly whats replicated in the code below + (0, 0) => self.a.overflowing_sub(self.a), + (0, 1) => self.a.overflowing_sub(self.b), + (0, 2) => self.a.overflowing_sub(self.c), + (0, 3) => self.a.overflowing_sub(self.d), + + (1, 0) => self.b.overflowing_sub(self.a), + (1, 1) => self.b.overflowing_sub(self.b), + (1, 2) => self.b.overflowing_sub(self.c), + (1, 3) => self.b.overflowing_sub(self.d), + + (2, 0) => self.c.overflowing_sub(self.a), + (2, 1) => self.c.overflowing_sub(self.b), + (2, 2) => self.c.overflowing_sub(self.c), + (2, 3) => self.c.overflowing_sub(self.d), + + (3, 0) => self.d.overflowing_sub(self.a), + (3, 1) => self.d.overflowing_sub(self.b), + (3, 2) => self.d.overflowing_sub(self.c), + (3, 3) => self.d.overflowing_sub(self.d), + + _ => (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; + } + } |
