diff --git a/src/cpu.rs b/src/cpu.rs
index 6ea093bad0fb421419f879e6fe78c918bbab21fb..12f1ce69da7589fec23e9c6db61f8b42b57a45b2 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);