From a302c483d10ecae40ec5aeb522e950e4a9cb1f49 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Wed, 29 Jun 2022 16:04:20 +0100
Subject: [PATCH] feat: new instructions

---
 src/cpu.rs | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/cpu.rs b/src/cpu.rs
index 6ea093ba..12f1ce69 100644
--- a/src/cpu.rs
+++ b/src/cpu.rs
@@ -17,7 +17,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
     (inc_c, 4, "INC C"),
-    (nop, 4, "! UNIMP !"),
+    (dec_c, 4, "DEC C"),
     (ld_c_u8, 8, "LD C, u8"),
     (nop, 4, "! UNIMP !"),
     // 0x1 opcodes
@@ -130,7 +130,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (ld_mhl_a, 8, "LD [HL], A"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
@@ -252,7 +252,7 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (ld_mu16_a, 16, "LD [u16], A"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
     (nop, 4, "! UNIMP !"),
@@ -755,6 +755,16 @@ fn inc_c(cpu: &mut Cpu) {
     cpu.c = value;
 }
 
+fn dec_c(cpu: &mut Cpu) {
+    let value = cpu.c.wrapping_sub(1);
+
+    cpu.set_sub(true);
+    cpu.set_zero(value == 0);
+    cpu.set_half_carry((value & 0xf) == 0xf);
+
+    cpu.c = value;
+}
+
 fn ld_c_u8(cpu: &mut Cpu) {
     let byte = cpu.read_u8();
     cpu.c = byte;
@@ -855,6 +865,10 @@ fn ld_c_a(cpu: &mut Cpu) {
     cpu.c = cpu.a;
 }
 
+fn ld_mhl_a(cpu: &mut Cpu) {
+    cpu.mmu.write(cpu.hl(), cpu.a);
+}
+
 fn ld_a_e(cpu: &mut Cpu) {
     cpu.a = cpu.e;
 }
@@ -905,6 +919,11 @@ fn ld_mff00c_a(cpu: &mut Cpu) {
     cpu.mmu.write(0xff0c + cpu.c as u16, cpu.a);
 }
 
+fn ld_mu16_a(cpu: &mut Cpu) {
+    let word = cpu.read_u16();
+    cpu.mmu.write(word, cpu.a);
+}
+
 fn cp_a_u8(cpu: &mut Cpu) {
     let byte = cpu.read_u8();
     sub_set_flags(cpu, cpu.a, byte);
-- 
GitLab