Skip to content

Commit

Permalink
From memory instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
IsaacMarovitz committed Nov 30, 2023
1 parent 2fd9cf1 commit 3f29e25
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 90 deletions.
183 changes: 93 additions & 90 deletions src/cpu.rs
Original file line number Diff line number Diff line change
@@ -1,107 +1,110 @@
use crate::mmu::MMU;
use crate::mode::GBMode;
use crate::registers::{Registers, Flags};

pub struct CPU {
reg: Registers
reg: Registers,
mem: MMU
}

impl CPU {
pub fn new(mode: GBMode) -> CPU {
CPU {
reg: Registers::new(mode)
reg: Registers::new(mode),
mem: MMU::new()
}
}

pub fn call(&mut self, opcode: u8) -> u32 {
match opcode {
0x40 => { self.reg.b = self.reg.b; 1 },
0x41 => { self.reg.b = self.reg.c; 1 },
0x42 => { self.reg.b = self.reg.d; 1 },
0x43 => { self.reg.b = self.reg.e; 1 },
0x44 => { self.reg.b = self.reg.h; 1 },
0x45 => { self.reg.b = self.reg.l; 1 },
0x46 => { 2 }, // LD B, HL
0x47 => { self.reg.b = self.reg.a; 1 },
0x48 => { self.reg.c = self.reg.b; 1 },
0x49 => { self.reg.c = self.reg.c; 1 },
0x4A => { self.reg.c = self.reg.d; 1 },
0x4B => { self.reg.c = self.reg.e; 1 },
0x4C => { self.reg.c = self.reg.h; 1 },
0x4D => { self.reg.c = self.reg.l; 1 },
0x4E => { 2 }, // LD C, HL
0x4F => { self.reg.c = self.reg.a; 1 },
0x50 => { self.reg.d = self.reg.b; 1 },
0x51 => { self.reg.d = self.reg.c; 1 },
0x52 => { self.reg.d = self.reg.d; 1 },
0x53 => { self.reg.d = self.reg.e; 1 },
0x54 => { self.reg.d = self.reg.l; 1 },
0x56 => { 2 }, // LD D, HL
0x57 => { self.reg.d = self.reg.a; 1 },
0x58 => { self.reg.e = self.reg.b; 1 },
0x59 => { self.reg.e = self.reg.c; 1 },
0x5A => { self.reg.e = self.reg.d; 1 },
0x5B => { self.reg.e = self.reg.e; 1 },
0x5C => { self.reg.e = self.reg.h; 1 },
0x5D => { self.reg.e = self.reg.l; 1 },
0x5E => { 2 }, // LD E, HL
0x5F => { self.reg.e = self.reg.a; 1 },
0x60 => { self.reg.h = self.reg.b; 1 },
0x61 => { self.reg.h = self.reg.c; 1 },
0x62 => { self.reg.h = self.reg.d; 1 },
0x63 => { self.reg.h = self.reg.e; 1 },
0x64 => { self.reg.h = self.reg.h; 1 },
0x65 => { self.reg.h = self.reg.l; 1 },
0x66 => { 2 }, // LD H, HL
0x67 => { self.reg.h = self.reg.a; 1 },
0x68 => { self.reg.l = self.reg.b; 1 },
0x69 => { self.reg.l = self.reg.c; 1 },
0x6A => { self.reg.l = self.reg.d; 1 },
0x6B => { self.reg.l = self.reg.e; 1 },
0x6C => { self.reg.l = self.reg.h; 1 },
0x6D => { self.reg.l = self.reg.l; 1 },
0x6E => { 2 }, // LD L, HL,
0x6F => { self.reg.l = self.reg.a; 1 },
0x78 => { self.reg.a = self.reg.b; 1 },
0x79 => { self.reg.a = self.reg.c; 1 },
0x7A => { self.reg.a = self.reg.d; 1 },
0x7B => { self.reg.a = self.reg.e; 1 },
0x7C => { self.reg.a = self.reg.h; 1 },
0x7D => { self.reg.a = self.reg.l; 1 },
0x7E => { 2 }, // LD A, HL
0x7F => { self.reg.a = self.reg.a; 1 },
0x80 => { self.alu_add(self.reg.b); 1 },
0x81 => { self.alu_add(self.reg.c); 1 },
0x82 => { self.alu_add(self.reg.d); 1 },
0x83 => { self.alu_add(self.reg.e); 1 },
0x84 => { self.alu_add(self.reg.h); 1 },
0x85 => { self.alu_add(self.reg.l); 1 },
0x86 => { 2 }, // ADD A, HL
0x87 => { self.alu_add(self.reg.a); 1 },
0x88 => { self.alu_adc(self.reg.b); 1 },
0x89 => { self.alu_adc(self.reg.c); 1 },
0x8A => { self.alu_adc(self.reg.d); 1 },
0x8B => { self.alu_adc(self.reg.e); 1 },
0x8C => { self.alu_adc(self.reg.h); 1 },
0x8D => { self.alu_adc(self.reg.l); 1 },
0x8E => { 2 }, // ADC A, HL
0x8F => { self.alu_adc(self.reg.a); 1 },
0x90 => { self.alu_sub(self.reg.b); 1 },
0x91 => { self.alu_sub(self.reg.c); 1 },
0x92 => { self.alu_sub(self.reg.d); 1 },
0x93 => { self.alu_sub(self.reg.e); 1 },
0x94 => { self.alu_sub(self.reg.h); 1 },
0x95 => { self.alu_sub(self.reg.l); 1 },
0x96 => { 2 }, // SUB A, HL
0x97 => { self.alu_sub(self.reg.a); 1 },
0x98 => { self.alu_sbc(self.reg.b); 1 },
0x99 => { self.alu_sbc(self.reg.c); 1 },
0x9A => { self.alu_sbc(self.reg.d); 1 },
0x9B => { self.alu_sbc(self.reg.e); 1 },
0x9C => { self.alu_sbc(self.reg.h); 1 },
0x9D => { self.alu_sbc(self.reg.l); 1 },
0x9E => { 2 }, // SBC A, HL
0x9F => { self.alu_sbc(self.reg.a); 1 },
0xCB => { 0 }, // CB OPs
0x40 => { self.reg.b = self.reg.b; 1 },
0x41 => { self.reg.b = self.reg.c; 1 },
0x42 => { self.reg.b = self.reg.d; 1 },
0x43 => { self.reg.b = self.reg.e; 1 },
0x44 => { self.reg.b = self.reg.h; 1 },
0x45 => { self.reg.b = self.reg.l; 1 },
0x46 => { self.reg.b = self.mem.read(self.reg.get_hl()); 2 },
0x47 => { self.reg.b = self.reg.a; 1 },
0x48 => { self.reg.c = self.reg.b; 1 },
0x49 => { self.reg.c = self.reg.c; 1 },
0x4A => { self.reg.c = self.reg.d; 1 },
0x4B => { self.reg.c = self.reg.e; 1 },
0x4C => { self.reg.c = self.reg.h; 1 },
0x4D => { self.reg.c = self.reg.l; 1 },
0x4E => { self.reg.c = self.mem.read(self.reg.get_hl()); 2 },
0x4F => { self.reg.c = self.reg.a; 1 },
0x50 => { self.reg.d = self.reg.b; 1 },
0x51 => { self.reg.d = self.reg.c; 1 },
0x52 => { self.reg.d = self.reg.d; 1 },
0x53 => { self.reg.d = self.reg.e; 1 },
0x54 => { self.reg.d = self.reg.l; 1 },
0x56 => { self.reg.d = self.mem.read(self.reg.get_hl()); 2 },
0x57 => { self.reg.d = self.reg.a; 1 },
0x58 => { self.reg.e = self.reg.b; 1 },
0x59 => { self.reg.e = self.reg.c; 1 },
0x5A => { self.reg.e = self.reg.d; 1 },
0x5B => { self.reg.e = self.reg.e; 1 },
0x5C => { self.reg.e = self.reg.h; 1 },
0x5D => { self.reg.e = self.reg.l; 1 },
0x5E => { self.reg.e = self.mem.read(self.reg.get_hl()); 2 },
0x5F => { self.reg.e = self.reg.a; 1 },
0x60 => { self.reg.h = self.reg.b; 1 },
0x61 => { self.reg.h = self.reg.c; 1 },
0x62 => { self.reg.h = self.reg.d; 1 },
0x63 => { self.reg.h = self.reg.e; 1 },
0x64 => { self.reg.h = self.reg.h; 1 },
0x65 => { self.reg.h = self.reg.l; 1 },
0x66 => { self.reg.h = self.mem.read(self.reg.get_hl()); 2 },
0x67 => { self.reg.h = self.reg.a; 1 },
0x68 => { self.reg.l = self.reg.b; 1 },
0x69 => { self.reg.l = self.reg.c; 1 },
0x6A => { self.reg.l = self.reg.d; 1 },
0x6B => { self.reg.l = self.reg.e; 1 },
0x6C => { self.reg.l = self.reg.h; 1 },
0x6D => { self.reg.l = self.reg.l; 1 },
0x6E => { self.reg.l = self.mem.read(self.reg.get_hl()); 2 },
0x6F => { self.reg.l = self.reg.a; 1 },
0x78 => { self.reg.a = self.reg.b; 1 },
0x79 => { self.reg.a = self.reg.c; 1 },
0x7A => { self.reg.a = self.reg.d; 1 },
0x7B => { self.reg.a = self.reg.e; 1 },
0x7C => { self.reg.a = self.reg.h; 1 },
0x7D => { self.reg.a = self.reg.l; 1 },
0x7E => { self.reg.a = self.mem.read(self.reg.get_hl()); 2 },
0x7F => { self.reg.a = self.reg.a; 1 },
0x80 => { self.alu_add(self.reg.b); 1 },
0x81 => { self.alu_add(self.reg.c); 1 },
0x82 => { self.alu_add(self.reg.d); 1 },
0x83 => { self.alu_add(self.reg.e); 1 },
0x84 => { self.alu_add(self.reg.h); 1 },
0x85 => { self.alu_add(self.reg.l); 1 },
0x86 => { self.alu_add(self.mem.read(self.reg.get_hl())); 2 },
0x87 => { self.alu_add(self.reg.a); 1 },
0x88 => { self.alu_adc(self.reg.b); 1 },
0x89 => { self.alu_adc(self.reg.c); 1 },
0x8A => { self.alu_adc(self.reg.d); 1 },
0x8B => { self.alu_adc(self.reg.e); 1 },
0x8C => { self.alu_adc(self.reg.h); 1 },
0x8D => { self.alu_adc(self.reg.l); 1 },
0x8E => { self.alu_adc(self.mem.read(self.reg.get_hl())); 2 },
0x8F => { self.alu_adc(self.reg.a); 1 },
0x90 => { self.alu_sub(self.reg.b); 1 },
0x91 => { self.alu_sub(self.reg.c); 1 },
0x92 => { self.alu_sub(self.reg.d); 1 },
0x93 => { self.alu_sub(self.reg.e); 1 },
0x94 => { self.alu_sub(self.reg.h); 1 },
0x95 => { self.alu_sub(self.reg.l); 1 },
0x96 => { self.alu_sub(self.mem.read(self.reg.get_hl())); 2 },
0x97 => { self.alu_sub(self.reg.a); 1 },
0x98 => { self.alu_sbc(self.reg.b); 1 },
0x99 => { self.alu_sbc(self.reg.c); 1 },
0x9A => { self.alu_sbc(self.reg.d); 1 },
0x9B => { self.alu_sbc(self.reg.e); 1 },
0x9C => { self.alu_sbc(self.reg.h); 1 },
0x9D => { self.alu_sbc(self.reg.l); 1 },
0x9E => { self.alu_sbc(self.mem.read(self.reg.get_hl())); 2 },
0x9F => { self.alu_sbc(self.reg.a); 1 },
0xCB => { 0 }, // CB OPs
code => panic!("Instruction {:2X} is unknown!", code),
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/mmu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ pub struct MMU {
}

impl MMU {
pub fn new() -> MMU {
MMU {
wram: [0; 0x8000],
hram: [0; 0x7f],
interrupt: 0,
}
}

pub fn read(&self, a: u16) -> u8 {
match a {
0xC000..=0xCFFF => self.wram[a as usize - 0xC000],
Expand Down

0 comments on commit 3f29e25

Please sign in to comment.