use crate::{get_register, get_register_pair, set_register, EmulatorState, Register};

/// Move (copy) value from source to destination register
pub fn mov(src: Register, dest: Register, state: &mut EmulatorState) {
    let data = get_register(src, state);
    set_register(dest, data, state);
}

/// Move immediate into destination register
pub fn mvi(byte: u8, dest: Register, state: &mut EmulatorState) {
    set_register(dest, byte, state);
}

/// Store accumulator using the BC or DE register pair
pub fn stax(register: Register, state: &mut EmulatorState) {
    let address = get_register_pair(register, state);
    state.memory[address as usize] = state.a;
}

/// Load accumulator using the BC or DE register pair
pub fn ldax(register: Register, state: &mut EmulatorState) {
    let address = get_register_pair(register, state);
    state.a = state.memory[address as usize];
}

/// Store a 16-bit word from H and L to the specified address
pub fn shld(address: u16, state: &mut EmulatorState) {
    state.memory[address as usize] = state.l;
    state.memory[address as usize + 1] = state.h;
}

/// Load a 16-bit word into H and L from the specified address
pub fn lhld(address: u16, state: &mut EmulatorState) {
    state.l = state.memory[address as usize];
    state.h = state.memory[address as usize + 1];
}
