From 2eddd6df86a394ed4cc71f91d8201a740edafeba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Sat, 2 Jul 2022 15:24:55 +0100
Subject: [PATCH] feat: more instructions

---
 src/inst.rs | 40 +++++++++++++++++++++++++++++++++++-----
 src/ppu.rs  |  8 +++++++-
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/src/inst.rs b/src/inst.rs
index 314afe79..255e8f51 100644
--- a/src/inst.rs
+++ b/src/inst.rs
@@ -13,7 +13,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (ld_mu16_sp, 20, "LD [u16], SP"),
     (add_hl_bc, 8, "ADD HL, BC"),
     (noimpl, 4, "! UNIMP !"),
-    (noimpl, 4, "! UNIMP !"),
+    (dec_bc, 8, "DEC BC"),
     (inc_c, 4, "INC C"),
     (dec_c, 4, "DEC C"),
     (ld_c_u8, 8, "LD C, u8"),
@@ -46,12 +46,12 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (noimpl, 4, "! UNIMP !"),
     (jr_z_i8, 8, "JR Z, i8"),
     (noimpl, 4, "! UNIMP !"),
-    (noimpl, 4, "! UNIMP !"),
+    (ld_a_mhli, 8, "LD A, [HL+] "),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
     (ld_l_u8, 8, "LD L, u8"),
-    (noimpl, 4, "! UNIMP !"),
+    (cpl, 4, "CPL"),
     // 0x3 opcodes
     (noimpl, 4, "! UNIMP !"),
     (ld_sp_u16, 12, "LD SP, u16"),
@@ -190,7 +190,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (xor_a_a, 4, "XOR A, A"),
     // 0xb opcodes
     (noimpl, 4, "! UNIMP !"),
-    (noimpl, 4, "! UNIMP !"),
+    (or_a_c, 4, "OR A, C"),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
@@ -268,7 +268,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
-    (noimpl, 4, "! UNIMP !"),
+    (ei, 4, "EI"),
     (noimpl, 4, "! UNIMP !"),
     (noimpl, 4, "! UNIMP !"),
     (cp_a_u8, 8, "CP A, u8"),
@@ -532,6 +532,10 @@ fn add_hl_bc(cpu: &mut Cpu) {
     cpu.set_hl(value);
 }
 
+fn dec_bc(cpu: &mut Cpu) {
+    cpu.set_bc(cpu.bc().wrapping_sub(1));
+}
+
 fn inc_c(cpu: &mut Cpu) {
     let value = cpu.c.wrapping_add(1);
 
@@ -667,11 +671,24 @@ fn jr_z_i8(cpu: &mut Cpu) {
     cpu.ticks = cpu.ticks.wrapping_add(4);
 }
 
+fn ld_a_mhli(cpu: &mut Cpu) {
+    let byte = cpu.mmu.read(cpu.hl());
+    cpu.a = byte;
+    cpu.set_hl(cpu.hl().wrapping_add(1));
+}
+
 fn ld_l_u8(cpu: &mut Cpu) {
     let byte = cpu.read_u8();
     cpu.l = byte;
 }
 
+fn cpl(cpu: &mut Cpu) {
+    cpu.a = !cpu.a;
+
+    cpu.set_sub(true);
+    cpu.set_half_carry(true);
+}
+
 fn ld_sp_u16(cpu: &mut Cpu) {
     cpu.sp = cpu.read_u16();
 }
@@ -756,6 +773,15 @@ fn xor_a_a(cpu: &mut Cpu) {
     cpu.set_carry(false);
 }
 
+fn or_a_c(cpu: &mut Cpu) {
+    cpu.a |= cpu.c;
+
+    cpu.set_sub(false);
+    cpu.set_zero(cpu.a == 0);
+    cpu.set_half_carry(false);
+    cpu.set_carry(false);
+}
+
 fn cp_a_mhl(cpu: &mut Cpu) {
     let byte = cpu.mmu.read(cpu.hl());
     sub_set_flags(cpu, cpu.a, byte);
@@ -817,6 +843,10 @@ fn di(cpu: &mut Cpu) {
     cpu.disable_int();
 }
 
+fn ei(cpu: &mut Cpu) {
+    cpu.enable_int();
+}
+
 fn cp_a_u8(cpu: &mut Cpu) {
     let byte = cpu.read_u8();
     sub_set_flags(cpu, cpu.a, byte);
diff --git a/src/ppu.rs b/src/ppu.rs
index 16da0326..2a87d7cf 100644
--- a/src/ppu.rs
+++ b/src/ppu.rs
@@ -241,7 +241,13 @@ impl Ppu {
                         color_index => panic!("Invalid palette color index {:04x}", color_index),
                     }
                 }
-            },
+            }
+            0x004a => {
+                println!("Writing to $FF4A - WY (Window Y Position) (R/W)")
+            }
+            0x004b => {
+                println!("Writing to $FF4B - WX (Window X Position + 7) (R/W)")
+            }
             0x007f => (),
             addr => panic!("Writing in unknown PPU location 0x{:04x}", addr),
         }
-- 
GitLab