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; }