From 5766d0abb8be6b3eec8744c04780bf852b598fab 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 10:16:54 +0100
Subject: [PATCH] feat: more instructions implemented

---
 examples/sdl/src/main.rs |   2 +-
 src/cpu.rs               | 821 ++++++++++++++++++++-------------------
 2 files changed, 420 insertions(+), 403 deletions(-)

diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs
index 2a596885..bd1aa0c5 100644
--- a/examples/sdl/src/main.rs
+++ b/examples/sdl/src/main.rs
@@ -4,7 +4,7 @@ fn main() {
     let mut game_boy = GameBoy::new();
     game_boy.load_boot_default();
 
-    for i in 0..24650 {
+    for i in 0..24700 {
         game_boy.clock();
         if game_boy.cpu().pc() >= 0x3032 {
             println!("{}", i);
diff --git a/src/cpu.rs b/src/cpu.rs
index e15cb36e..b16002dd 100644
--- a/src/cpu.rs
+++ b/src/cpu.rs
@@ -14,457 +14,457 @@ pub const INSTRUCTIONS: [(fn(&mut Cpu), u8, &'static str); 256] = [
     (rlca, 4, "RLCA"),
     (ld_mu16_sp, 20, "LD [u16], SP"),
     (add_hl_bc, 8, "ADD HL, BC"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (inc_c, 4, "INC C"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     (ld_c_u8, 8, "LD C, u8"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     // 0x1 opcodes
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     (ld_de_u16, 12, "LD DE, u16"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (inc_de, 8, "INC DE"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (rla, 4, "RLA"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (ld_a_mde, 8, "LD A, [DE]"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x2 opcodes
     (jr_nz_i8, 8, "JR NZ, i8"),
     (ld_hl_u16, 12, "LD HL, u16"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (ld_mhli_a, 8, "LD [HL]+, A"),
+    (inc_hl, 8, "INC HL"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x3 opcodes
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     (ld_sp_u16, 12, "LD SP, u16"),
     (ld_mhld_a, 8, "LD [HL]-, A"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (ld_a_u8, 8, "LD A, u8"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     // 0x4 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (ld_c_a, 4, "LD C, A"),
     // 0x5 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x6 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x7 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x8 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x9 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xa opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (xor_a_a, 4, "XOR A, A"),
     // 0xb opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xc opcodes
     (ret_nz, 8, "RET NZ"),
     (pop_bc, 12, "POP BC"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (push_bc, 16, "PUSH BC"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (ret, 16, "RET"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (call_u16, 24, "CALL u16"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xd opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xe opcodes
     (ld_mff00u8_a, 12, "LD [FF00+u8], A"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     (ld_mff00c_a, 8, "LD [FF00+C], A"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xf opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
 ];
 
 pub const BITWISE: [(fn(&mut Cpu), u8, &'static str); 176] = [
     // 0x0 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x1 opcodes
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
     (rl_c, 8, "RL C"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x2 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x3 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x4 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x5 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x6 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x7 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     (bit_7_h, 8, "BIT 7, H"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x8 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0x9 opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
     // 0xa opcodes
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
-    (nop, 4, "NOP"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
+    (nop, 4, "! UNIMP !"),
 ];
 
 pub struct Cpu {
@@ -765,6 +765,10 @@ fn ld_de_u16(cpu: &mut Cpu) {
     cpu.set_de(word);
 }
 
+fn inc_de(cpu: &mut Cpu) {
+    cpu.set_de(cpu.de().wrapping_add(1));
+}
+
 fn rla(cpu: &mut Cpu) {
     let carry = cpu.get_carry();
 
@@ -798,6 +802,15 @@ fn ld_hl_u16(cpu: &mut Cpu) {
     cpu.set_hl(word);
 }
 
+fn ld_mhli_a(cpu: &mut Cpu) {
+    cpu.mmu.write(cpu.hl(), cpu.a);
+    cpu.set_hl(cpu.hl().wrapping_add(1));
+}
+
+fn inc_hl(cpu: &mut Cpu) {
+    cpu.set_hl(cpu.hl().wrapping_add(1));
+}
+
 fn ld_sp_u16(cpu: &mut Cpu) {
     cpu.sp = cpu.read_u16();
 }
@@ -843,6 +856,10 @@ fn push_bc(cpu: &mut Cpu) {
     cpu.push_word(cpu.bc());
 }
 
+fn ret(cpu: &mut Cpu) {
+    cpu.pc = cpu.pop_word();
+}
+
 fn call_u16(cpu: &mut Cpu) {
     let word = cpu.read_u16();
     cpu.push_word(cpu.pc);
-- 
GitLab