diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs index 2a5968850e8810d1f67262292f3f8df78626957b..bd1aa0c555a923e3bd2ab654ba3a1bab0b63b81a 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 e15cb36efa05a32cf2a215c49e08e2f6ff83b686..b16002dd59777e5f5e0273cb4d229f790ae837b5 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);