Skip to content
Snippets Groups Projects
inst.rs 59 KiB
Newer Older
  • Learn to ignore specific revisions
  •     cpu.set_half_carry((first ^ second ^ result) & 0x10 == 0x10);
        cpu.set_carry(result & 0x100 == 0x100);
    
        result_b
    
    fn add_carry_set_flags(cpu: &mut Cpu, first: u8, second: u8) -> u8 {
        let first = first as u32;
        let second = second as u32;
        let carry = cpu.get_carry() as u32;
    
        let result = first.wrapping_add(second).wrapping_add(carry);
        let result_b = result as u8;
    
        cpu.set_sub(false);
        cpu.set_zero(result_b == 0);
        cpu.set_half_carry((first ^ second ^ result) & 0x10 == 0x10);
        cpu.set_carry(result & 0x100 == 0x100);
    
        result_b
    }
    
    
    fn sub_set_flags(cpu: &mut Cpu, first: u8, second: u8) -> u8 {
        let first = first as u32;
        let second = second as u32;
    
    
        let result = first.wrapping_sub(second);
        let result_b = result as u8;
    
    
        cpu.set_sub(true);
    
        cpu.set_zero(result_b == 0);
        cpu.set_half_carry((first ^ second ^ result) & 0x10 == 0x10);
        cpu.set_carry(result & 0x100 == 0x100);
    
        result_b
    
    fn sub_carry_set_flags(cpu: &mut Cpu, first: u8, second: u8) -> u8 {
        let first = first as u32;
        let second = second as u32;
        let carry = cpu.get_carry() as u32;
    
        let result = first.wrapping_sub(second).wrapping_sub(carry);
        let result_b = result as u8;
    
        cpu.set_sub(true);
        cpu.set_zero(result_b == 0);
        cpu.set_half_carry((first ^ second ^ result) & 0x10 == 0x10);
        cpu.set_carry(result & 0x100 == 0x100);
    
        result_b
    }
    
    
    fn add_u16_u16(cpu: &mut Cpu, first: u16, second: u16) -> u16 {
        let first = first as u32;
        let second = second as u32;
    
        let result = first.wrapping_add(second);
    
    
        cpu.set_sub(false);
    
        cpu.set_half_carry((first ^ second ^ result) & 0x1000 == 0x1000);
        cpu.set_carry(result & 0x10000 == 0x10000);
    
        result as u16
    
    }
    
    fn swap(cpu: &mut Cpu, value: u8) -> u8 {
        cpu.set_sub(false);
        cpu.set_zero(value == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(false);
    
        (value << 4) | (value >> 4)
    }
    
    
    /// Helper function to shift an `u8` to the left and update CPU
    /// flags.
    
    fn sla(cpu: &mut Cpu, value: u8) -> u8 {
    
        let result = value << 1;
    
        cpu.set_sub(false);
        cpu.set_zero(result == 0);
        cpu.set_half_carry(false);
    
        cpu.set_carry(value & 0x80 == 0x80);
    
        result
    }
    
    fn sra(cpu: &mut Cpu, value: u8) -> u8 {
        let result = (value >> 1) | (value & 0x80);
    
        cpu.set_sub(false);
        cpu.set_zero(result == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(value & 0x01 == 0x01);
    
    fn srl(cpu: &mut Cpu, value: u8) -> u8 {
        let result = value >> 1;
    
        cpu.set_sub(false);
        cpu.set_zero(result == 0);
        cpu.set_half_carry(false);
        cpu.set_carry(value & 0x01 == 0x01);
    
        result
    }
    
    
    /// Helper function for RST instructions, pushes the
    /// current PC to the stack and jumps to the provided
    /// address.
    fn rst(cpu: &mut Cpu, addr: u16) {
        cpu.push_word(cpu.pc);
        cpu.pc = addr;
    }