diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs
index 74b7b4982f7eacda4ba334cdba1dd0d9eba9695f..4a56914a38c0eb2622bc37b2e7d32a77ffb0e529 100644
--- a/examples/sdl/src/main.rs
+++ b/examples/sdl/src/main.rs
@@ -1,5 +1,11 @@
-use boytacean::{gb::GameBoy, ppu::{DISPLAY_WIDTH, DISPLAY_HEIGHT}};
-use sdl2::{video::Window, pixels::PixelFormatEnum, VideoSubsystem, TimerSubsystem, EventPump};
+use boytacean::{
+    gb::GameBoy,
+    ppu::{DISPLAY_HEIGHT, DISPLAY_WIDTH},
+};
+use sdl2::{
+    pixels::PixelFormatEnum, video::Window, AudioSubsystem, EventPump, TimerSubsystem,
+    VideoSubsystem,
+};
 
 /// The base title to be used in the window.
 static TITLE: &'static str = "Boytacean";
@@ -8,6 +14,7 @@ pub struct Graphics {
     window: Window,
     video_subsystem: VideoSubsystem,
     timer_subsystem: TimerSubsystem,
+    audio_subsystem: AudioSubsystem,
     event_pump: EventPump,
 }
 
@@ -42,7 +49,8 @@ fn start_sdl() -> Graphics {
         window: window,
         video_subsystem: video_subsystem,
         timer_subsystem: timer_subsystem,
-        event_pump: event_pump
+        audio_subsystem: audio_subsystem,
+        event_pump: event_pump,
     }
 }
 
@@ -75,8 +83,7 @@ fn main() {
             break;
         }
 
-        while let Some(event) = graphics.event_pump.poll_event() {
-        }
+        while let Some(event) = graphics.event_pump.poll_event() {}
 
         let mut counter_ticks = 0u32;
 
@@ -106,6 +113,4 @@ fn main() {
 
         graphics.timer_subsystem.delay(17);
     }
-
-    //println!("{:?}", game_boy.frame_buffer().as_ref());
 }
diff --git a/src/cpu.rs b/src/cpu.rs
index 80619e5a2f0a8dcd11c92a0e3715d5bc36e01dd6..96f5e9f904f4cccd0baf6c90a3679dcc9cac1f92 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, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (inc_c, 4, "INC C"),
     (dec_c, 4, "DEC C"),
     (ld_c_u8, 8, "LD C, u8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x1 opcodes
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_de_u16, 12, "LD DE, u16"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (inc_de, 8, "INC DE"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (rla, 4, "RLA"),
     (jr_i8, 12, "JR i8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_a_mde, 8, "LD A, [DE]"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (dec_e, 4, "DEC E"),
     (ld_e_u8, 8, "LD E, u8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x2 opcodes
     (jr_nz_i8, 8, "JR NZ, i8"),
     (ld_hl_u16, 12, "LD HL, u16"),
     (ld_mhli_a, 8, "LD [HL+], A"),
     (inc_hl, 8, "INC HL"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (inc_h, 4, "INC H"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (jr_z_i8, 8, "JR Z, i8"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_l_u8, 8, "LD L, u8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x3 opcodes
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_sp_u16, 12, "LD SP, u16"),
     (ld_mhld_a, 8, "LD [HL-], A"),
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (dec_a, 4, "DEC A"),
     (ld_a_u8, 8, "LD A, u8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x4 opcodes
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_b_h, 4, "LD B, H"),
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_c_a, 4, "LD C, A"),
     // 0x5 opcodes
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_d_a, 4, "LD D, A"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x6 opcodes
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_h_a, 4, "LD H, A"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x7 opcodes
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_mhl_a, 8, "LD [HL], A"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_a_e, 4, "LD A, E"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (ld_a_h, 4, "LD A, H"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x8 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x9 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xa opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (xor_a_a, 4, "XOR A, A"),
     // 0xb opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xc opcodes
     (ret_nz, 8, "RET NZ"),
     (pop_bc, 12, "POP BC"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (push_bc, 16, "PUSH BC"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ret, 16, "RET"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (call_u16, 24, "CALL u16"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xd opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xe opcodes
     (ld_mff00u8_a, 12, "LD [FF00+u8], A"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_mff00c_a, 8, "LD [FF00+C], A"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (ld_mu16_a, 16, "LD [u16], A"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xf opcodes
     (ld_a_mff00u8, 12, "LD A, [FF00+u8]"),
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (cp_a_u8, 8, "CP A, u8"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
 ];
 
 pub const BITWISE: [(fn(&mut Cpu), u8, &'static str); 176] = [
     // 0x0 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x1 opcodes
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (rl_c, 8, "RL C"),
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x2 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x3 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x4 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x5 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x6 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x7 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     (bit_7_h, 8, "BIT 7, H"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
-    (nop, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x8 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0x9 opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
     // 0xa opcodes
-    (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 !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
+    (noimpl, 4, "! UNIMP !"),
 ];
 
 pub struct Cpu {
@@ -704,6 +704,10 @@ impl Cpu {
 
 fn nop(_cpu: &mut Cpu) {}
 
+fn noimpl(_cpu: &mut Cpu) {
+    todo!("Instruction not implemented");
+}
+
 fn ld_bc_u16(cpu: &mut Cpu) {
     let word = cpu.read_u16();
     cpu.set_bc(word);
@@ -820,6 +824,16 @@ fn ld_a_mde(cpu: &mut Cpu) {
     cpu.a = byte;
 }
 
+fn dec_e(cpu: &mut Cpu) {
+    let value = cpu.e.wrapping_sub(1);
+
+    cpu.set_sub(true);
+    cpu.set_zero(value == 0);
+    cpu.set_half_carry((value & 0xf) == 0xf);
+
+    cpu.e = value;
+}
+
 fn ld_e_u8(cpu: &mut Cpu) {
     let byte = cpu.read_u8();
     cpu.e = byte;
@@ -850,6 +864,16 @@ fn inc_hl(cpu: &mut Cpu) {
     cpu.set_hl(cpu.hl().wrapping_add(1));
 }
 
+fn inc_h(cpu: &mut Cpu) {
+    let value = cpu.h.wrapping_add(1);
+
+    cpu.set_sub(false);
+    cpu.set_zero(value == 0);
+    cpu.set_half_carry((value & 0xf) == 0xf);
+
+    cpu.h = value;
+}
+
 fn jr_z_i8(cpu: &mut Cpu) {
     let byte = cpu.read_u8() as i8;
 
@@ -914,6 +938,10 @@ fn ld_a_e(cpu: &mut Cpu) {
     cpu.a = cpu.e;
 }
 
+fn ld_a_h(cpu: &mut Cpu) {
+    cpu.a = cpu.h;
+}
+
 fn xor_a_a(cpu: &mut Cpu) {
     cpu.a ^= cpu.a;
 
diff --git a/src/ppu.rs b/src/ppu.rs
index fc1680067ef5b6049df4c050628defb55b273558..14f2ed8f21eb66252f82ee068c547c2c2eeb7f9b 100644
--- a/src/ppu.rs
+++ b/src/ppu.rs
@@ -113,7 +113,8 @@ impl Ppu {
                     // screen we're now entering the v-blank
                     if self.line == 143 {
                         self.mode = PpuMode::VBlank;
-                        // self.drawData @todo implement this one
+                        // self.drawData
+                        // @todo implement this one
                     } else {
                         self.mode = PpuMode::OamRead;
                     }