Skip to content
Snippets Groups Projects
inst.rs 62.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • fn ld_a_mhld(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = byte;
        cpu.set_hl(cpu.hl().wrapping_sub(1));
    }
    
    
    fn dec_sp(cpu: &mut Cpu) {
        cpu.sp = cpu.sp.wrapping_sub(1);
    }
    
    
    fn inc_a(cpu: &mut Cpu) {
    
        let a = cpu.a;
        let value = a.wrapping_add(1);
    
    
        cpu.set_sub(false);
        cpu.set_zero(value == 0);
    
        cpu.set_half_carry((a & 0xf) == 0xf);
    
    fn dec_a(cpu: &mut Cpu) {
        let a = cpu.a;
        let value = a.wrapping_sub(1);
    
        cpu.set_sub(true);
        cpu.set_zero(value == 0);
    
        cpu.set_half_carry((a & 0xf) == 0x0);
    
    
        cpu.a = value;
    }
    
    fn ld_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = byte;
    }
    
    
    fn ccf(cpu: &mut Cpu) {
        cpu.set_sub(false);
        cpu.set_half_carry(false);
    
        cpu.set_carry(!cpu.carry());
    
    fn ld_b_b(_cpu: &mut Cpu) {}
    
    fn ld_b_c(cpu: &mut Cpu) {
        cpu.b = cpu.c;
    }
    
    fn ld_b_d(cpu: &mut Cpu) {
        cpu.b = cpu.d;
    }
    
    
    fn ld_b_e(cpu: &mut Cpu) {
        cpu.b = cpu.e;
    }
    
    
    fn ld_b_h(cpu: &mut Cpu) {
        cpu.b = cpu.h;
    }
    
    
    fn ld_b_l(cpu: &mut Cpu) {
        cpu.b = cpu.l;
    }
    
    
    fn ld_b_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.b = byte;
    }
    
    
    fn ld_b_a(cpu: &mut Cpu) {
        cpu.b = cpu.a;
    }
    
    
    fn ld_c_b(cpu: &mut Cpu) {
        cpu.c = cpu.b;
    }
    
    
    fn ld_c_c(_cpu: &mut Cpu) {}
    
    
    fn ld_c_d(cpu: &mut Cpu) {
        cpu.c = cpu.d;
    }
    
    fn ld_c_e(cpu: &mut Cpu) {
        cpu.c = cpu.e;
    }
    
    fn ld_c_h(cpu: &mut Cpu) {
        cpu.c = cpu.h;
    }
    
    fn ld_c_l(cpu: &mut Cpu) {
        cpu.c = cpu.l;
    }
    
    
    fn ld_c_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.c = byte;
    }
    
    
    fn ld_c_a(cpu: &mut Cpu) {
        cpu.c = cpu.a;
    }
    
    
    fn ld_d_b(cpu: &mut Cpu) {
        cpu.d = cpu.b;
    }
    
    fn ld_d_c(cpu: &mut Cpu) {
        cpu.d = cpu.c;
    }
    
    
    fn ld_d_d(_cpu: &mut Cpu) {}
    
    
    fn ld_d_e(cpu: &mut Cpu) {
        cpu.d = cpu.e;
    }
    
    fn ld_d_h(cpu: &mut Cpu) {
        cpu.d = cpu.h;
    }
    
    fn ld_d_l(cpu: &mut Cpu) {
        cpu.d = cpu.l;
    }
    
    
    fn ld_d_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.d = byte;
    }
    
    
    fn ld_d_a(cpu: &mut Cpu) {
        cpu.d = cpu.a;
    }
    
    
    fn ld_e_b(cpu: &mut Cpu) {
        cpu.e = cpu.b;
    }
    
    fn ld_e_c(cpu: &mut Cpu) {
        cpu.e = cpu.c;
    }
    
    fn ld_e_d(cpu: &mut Cpu) {
        cpu.e = cpu.d;
    }
    
    
    fn ld_e_e(_cpu: &mut Cpu) {}
    
    
    fn ld_e_h(cpu: &mut Cpu) {
        cpu.e = cpu.h;
    }
    
    
    fn ld_e_l(cpu: &mut Cpu) {
        cpu.e = cpu.l;
    }
    
    
    fn ld_e_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.e = byte;
    }
    
    
    fn ld_e_a(cpu: &mut Cpu) {
        cpu.e = cpu.a;
    }
    
    
    João Magalhães's avatar
    João Magalhães committed
    fn ld_h_b(cpu: &mut Cpu) {
        cpu.h = cpu.b;
    }
    
    fn ld_h_c(cpu: &mut Cpu) {
        cpu.h = cpu.c;
    }
    
    fn ld_h_d(cpu: &mut Cpu) {
        cpu.h = cpu.d;
    }
    
    fn ld_h_e(cpu: &mut Cpu) {
        cpu.h = cpu.e;
    }
    
    
    fn ld_h_h(_cpu: &mut Cpu) {}
    
    João Magalhães's avatar
    João Magalhães committed
    
    fn ld_h_l(cpu: &mut Cpu) {
        cpu.h = cpu.l;
    }
    
    fn ld_h_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.h = byte;
    }
    
    
    fn ld_h_a(cpu: &mut Cpu) {
        cpu.h = cpu.a;
    }
    
    
    João Magalhães's avatar
    João Magalhães committed
    fn ld_l_b(cpu: &mut Cpu) {
        cpu.l = cpu.b;
    }
    
    fn ld_l_c(cpu: &mut Cpu) {
        cpu.l = cpu.c;
    }
    
    fn ld_l_d(cpu: &mut Cpu) {
        cpu.l = cpu.d;
    }
    
    fn ld_l_e(cpu: &mut Cpu) {
        cpu.l = cpu.e;
    }
    
    fn ld_l_h(cpu: &mut Cpu) {
        cpu.l = cpu.h;
    }
    
    
    fn ld_l_l(_cpu: &mut Cpu) {}
    
    fn ld_l_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.l = byte;
    }
    
    
    fn ld_l_a(cpu: &mut Cpu) {
        cpu.l = cpu.a;
    }
    
    
    fn ld_mhl_b(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.b);
    }
    
    fn ld_mhl_c(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.c);
    }
    
    fn ld_mhl_d(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.d);
    }
    
    
    fn ld_mhl_e(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.e);
    }
    
    
    João Magalhães's avatar
    João Magalhães committed
    fn ld_mhl_h(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.h);
    }
    
    fn ld_mhl_l(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.l);
    }
    
    
    fn halt(cpu: &mut Cpu) {
        cpu.halt();
    }
    
    
    fn ld_mhl_a(cpu: &mut Cpu) {
        cpu.mmu.write(cpu.hl(), cpu.a);
    }
    
    fn ld_a_b(cpu: &mut Cpu) {
        cpu.a = cpu.b;
    }
    
    fn ld_a_c(cpu: &mut Cpu) {
        cpu.a = cpu.c;
    }
    
    
    fn ld_a_d(cpu: &mut Cpu) {
        cpu.a = cpu.d;
    }
    
    
    fn ld_a_e(cpu: &mut Cpu) {
        cpu.a = cpu.e;
    }
    
    fn ld_a_h(cpu: &mut Cpu) {
        cpu.a = cpu.h;
    }
    
    fn ld_a_l(cpu: &mut Cpu) {
        cpu.a = cpu.l;
    }
    
    
    fn ld_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = byte;
    }
    
    
    fn ld_a_a(_cpu: &mut Cpu) {}
    
    fn add_a_b(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.b);
    }
    
    
    fn add_a_c(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.c);
    }
    
    
    fn add_a_d(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.d);
    }
    
    
    fn add_a_e(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.e);
    }
    
    
    fn add_a_h(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.h);
    }
    
    fn add_a_l(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.l);
    }
    
    
    fn add_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = add_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn add_a_a(cpu: &mut Cpu) {
        cpu.a = add_set_flags(cpu, cpu.a, cpu.a);
    }
    
    
    fn adc_a_b(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.b);
    }
    
    fn adc_a_c(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.c);
    }
    
    fn adc_a_d(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.d);
    }
    
    fn adc_a_e(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.e);
    }
    
    fn adc_a_h(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.h);
    }
    
    fn adc_a_l(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.l);
    }
    
    fn adc_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = add_carry_set_flags(cpu, cpu.a, byte);
    }
    
    fn adc_a_a(cpu: &mut Cpu) {
        cpu.a = add_carry_set_flags(cpu, cpu.a, cpu.a);
    }
    
    
    fn sub_a_b(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.b);
    }
    
    
    fn sub_a_c(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.c);
    }
    
    fn sub_a_d(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.d);
    }
    
    fn sub_a_e(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.e);
    }
    
    fn sub_a_h(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.h);
    }
    
    fn sub_a_l(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.l);
    }
    
    fn sub_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = sub_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn sub_a_a(cpu: &mut Cpu) {
        cpu.a = sub_set_flags(cpu, cpu.a, cpu.a);
    }
    
    
    fn sbc_a_b(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.b);
    }
    
    fn sbc_a_c(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.c);
    }
    
    fn sbc_a_d(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.d);
    }
    
    fn sbc_a_e(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.e);
    }
    
    fn sbc_a_h(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.h);
    }
    
    fn sbc_a_l(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.l);
    }
    
    fn sbc_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a = sub_carry_set_flags(cpu, cpu.a, byte);
    }
    
    fn sbc_a_a(cpu: &mut Cpu) {
        cpu.a = sub_carry_set_flags(cpu, cpu.a, cpu.a);
    }
    
    
    fn and_a_b(cpu: &mut Cpu) {
        cpu.a &= cpu.b;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    
    fn and_a_c(cpu: &mut Cpu) {
        cpu.a &= cpu.c;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    
    fn and_a_d(cpu: &mut Cpu) {
        cpu.a &= cpu.d;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    fn and_a_e(cpu: &mut Cpu) {
        cpu.a &= cpu.e;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    fn and_a_h(cpu: &mut Cpu) {
        cpu.a &= cpu.h;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    fn and_a_l(cpu: &mut Cpu) {
        cpu.a &= cpu.l;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    fn and_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a &= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    fn and_a_a(cpu: &mut Cpu) {
        cpu.a &= cpu.a;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_b(cpu: &mut Cpu) {
        cpu.a ^= cpu.b;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_c(cpu: &mut Cpu) {
        cpu.a ^= cpu.c;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_d(cpu: &mut Cpu) {
        cpu.a ^= cpu.d;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn xor_a_e(cpu: &mut Cpu) {
        cpu.a ^= cpu.e;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn xor_a_h(cpu: &mut Cpu) {
        cpu.a ^= cpu.h;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_l(cpu: &mut Cpu) {
        cpu.a ^= cpu.l;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a ^= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn xor_a_a(cpu: &mut Cpu) {
        cpu.a ^= cpu.a;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn or_a_b(cpu: &mut Cpu) {
        cpu.a |= cpu.b;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn or_a_c(cpu: &mut Cpu) {
        cpu.a |= cpu.c;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn or_a_d(cpu: &mut Cpu) {
        cpu.a |= cpu.d;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn or_a_e(cpu: &mut Cpu) {
        cpu.a |= cpu.e;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn or_a_h(cpu: &mut Cpu) {
        cpu.a |= cpu.h;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    fn or_a_l(cpu: &mut Cpu) {
        cpu.a |= cpu.l;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn or_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        cpu.a |= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn or_a_a(cpu: &mut Cpu) {
        cpu.a |= cpu.a;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn cp_a_b(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.b);
    }
    
    fn cp_a_c(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.c);
    }
    
    fn cp_a_d(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.d);
    }
    
    fn cp_a_e(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.e);
    }
    
    fn cp_a_h(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.h);
    }
    
    fn cp_a_l(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.l);
    }
    
    
    fn cp_a_mhl(cpu: &mut Cpu) {
        let byte = cpu.mmu.read(cpu.hl());
        sub_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn cp_a_a(cpu: &mut Cpu) {
        sub_set_flags(cpu, cpu.a, cpu.a);
    }
    
    
    fn ret_nz(cpu: &mut Cpu) {
    
        if cpu.zero() {
    
            return;
        }
    
        cpu.pc = cpu.pop_word();
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    }
    
    fn pop_bc(cpu: &mut Cpu) {
        let word = cpu.pop_word();
        cpu.set_bc(word);
    }
    
    
    fn jp_nz_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if cpu.zero() {
    
            return;
        }
    
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(4);
    
    fn jp_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
        cpu.pc = word;
    }
    
    fn call_nz_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if cpu.zero() {
    
            return;
        }
    
        cpu.push_word(cpu.pc);
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    }
    
    fn push_bc(cpu: &mut Cpu) {
        cpu.push_word(cpu.bc());
    }
    
    
    João Magalhães's avatar
    João Magalhães committed
    fn add_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = add_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn rst_00h(cpu: &mut Cpu) {
        rst(cpu, 0x0000);
    }
    
    
    fn ret_z(cpu: &mut Cpu) {
    
        if !cpu.zero() {
    
            return;
        }
    
        cpu.pc = cpu.pop_word();
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    fn ret(cpu: &mut Cpu) {
        cpu.pc = cpu.pop_word();
    }
    
    
    fn jp_z_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if !cpu.zero() {
    
            return;
        }
    
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(4);
    
    }
    
    fn call_z_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if !cpu.zero() {
    
            return;
        }
    
        cpu.push_word(cpu.pc);
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    fn call_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
        cpu.push_word(cpu.pc);
        cpu.pc = word;
    }
    
    
    fn adc_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = add_carry_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn rst_08h(cpu: &mut Cpu) {
        rst(cpu, 0x0008);
    }
    
    
    João Magalhães's avatar
    João Magalhães committed
    fn ret_nc(cpu: &mut Cpu) {
    
        if cpu.carry() {
    
    João Magalhães's avatar
    João Magalhães committed
            return;
        }
    
        cpu.pc = cpu.pop_word();
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    João Magalhães's avatar
    João Magalhães committed
    fn pop_de(cpu: &mut Cpu) {
        let word = cpu.pop_word();
        cpu.set_de(word);
    }
    
    
    fn jp_nc_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if cpu.carry() {
    
            return;
        }
    
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(4);
    
    }
    
    fn call_nc_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if cpu.carry() {
    
            return;
        }
    
        cpu.push_word(cpu.pc);
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    fn push_de(cpu: &mut Cpu) {
        cpu.push_word(cpu.de());
    }
    
    
    fn sub_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = sub_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn rst_10h(cpu: &mut Cpu) {
        rst(cpu, 0x0010);
    }
    
    
    fn ret_c(cpu: &mut Cpu) {
    
        if !cpu.carry() {
    
            return;
        }
    
        cpu.pc = cpu.pop_word();
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    fn reti(cpu: &mut Cpu) {
        cpu.pc = cpu.pop_word();
        cpu.enable_int();
    }
    
    
    fn jp_c_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if !cpu.carry() {
    
            return;
        }
    
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(4);
    
    }
    
    fn call_c_u16(cpu: &mut Cpu) {
        let word = cpu.read_u16();
    
    
        if !cpu.carry() {
    
            return;
        }
    
        cpu.push_word(cpu.pc);
        cpu.pc = word;
    
    João Magalhães's avatar
    João Magalhães committed
        cpu.cycles = cpu.cycles.wrapping_add(12);
    
    fn sbc_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = sub_carry_set_flags(cpu, cpu.a, byte);
    }
    
    
    fn rst_18h(cpu: &mut Cpu) {
        rst(cpu, 0x0018);
    }
    
    
    fn ld_mff00u8_a(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.mmu.write(0xff00 + byte as u16, cpu.a);
    }
    
    
    fn pop_hl(cpu: &mut Cpu) {
        let word = cpu.pop_word();
        cpu.set_hl(word);
    }
    
    
    fn ld_mff00c_a(cpu: &mut Cpu) {
        cpu.mmu.write(0xff00 + cpu.c as u16, cpu.a);
    }
    
    
    fn push_hl(cpu: &mut Cpu) {
        cpu.push_word(cpu.hl());
    }
    
    
    fn and_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
    
        cpu.a &= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(true);
        cpu.set_carry(false);
    }
    
    
    fn rst_20h(cpu: &mut Cpu) {
        rst(cpu, 0x0020);
    }
    
    
    fn add_sp_i8(cpu: &mut Cpu) {
        let sp = cpu.sp as i32;
        let byte = cpu.read_u8() as i8;
        let byte_i32 = byte as i32;
    
        let result = sp.wrapping_add(byte_i32);
    
        cpu.set_sub(false);
        cpu.set_zero(false);
        cpu.set_half_carry((sp ^ byte_i32 ^ result) & 0x10 == 0x10);
        cpu.set_carry((sp ^ byte_i32 ^ result) & 0x100 == 0x100);
    
        cpu.sp = result as u16;
    }
    
    
    fn jp_hl(cpu: &mut Cpu) {
        cpu.pc = cpu.hl();
    }
    
    
    fn ld_mu16_a(cpu: &mut Cpu) {
        let word = cpu.read_u16();
        cpu.mmu.write(word, cpu.a);
    }
    
    
    fn xor_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a ^= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn rst_28h(cpu: &mut Cpu) {
        rst(cpu, 0x0028);
    
    }
    
    fn ld_a_mff00u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a = cpu.mmu.read(0xff00 + byte as u16);
    }
    
    
    fn pop_af(cpu: &mut Cpu) {
        let word = cpu.pop_word();
        cpu.set_af(word);
    }
    
    
    fn ld_a_mff00c(cpu: &mut Cpu) {
        cpu.a = cpu.mmu.read(0xff00 + cpu.c as u16);
    }
    
    
    fn di(cpu: &mut Cpu) {
        cpu.disable_int();
    }
    
    
    fn push_af(cpu: &mut Cpu) {
        cpu.push_word(cpu.af());
    }
    
    
    fn or_a_u8(cpu: &mut Cpu) {
        let byte = cpu.read_u8();
        cpu.a |= byte;
    
        cpu.set_sub(false);
        cpu.set_zero(cpu.a == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    }
    
    
    fn rst_30h(cpu: &mut Cpu) {
        rst(cpu, 0x0030);
    }
    
    
    fn ld_hl_spi8(cpu: &mut Cpu) {
        let sp = cpu.sp as i32;
        let byte = cpu.read_u8() as i8;
        let byte_i32 = byte as i32;
    
        let result = sp.wrapping_add(byte_i32);
    
        cpu.set_sub(false);
        cpu.set_zero(false);
        cpu.set_half_carry((sp ^ byte_i32 ^ result) & 0x10 == 0x10);
        cpu.set_carry((sp ^ byte_i32 ^ result) & 0x100 == 0x100);
    
        cpu.set_hl(result as u16);
    }