use crate::Machine;
use crate::{Byte, Word};

pub type Register = Byte;
pub type RegisterAddress = (Byte, Word);
pub type AddressRegister = (Word, Byte);
pub type TwoRegisters = (Byte, Byte);
pub type ThreeRegisters = (Byte, Byte, Byte);
pub type FourRegisters = (Byte, Byte, Byte, Byte);

#[inline]
pub fn GetRegister(vm: &mut Machine) -> Register {
    vm.ReadByte(None)
}

#[inline]
pub fn GetRegisterAddress(vm: &mut Machine) -> RegisterAddress {
    (vm.ReadByte(None), vm.ReadWord(None))
}

#[inline]
pub fn GetAddressRegister(vm: &mut Machine) -> AddressRegister {
    (vm.ReadWord(None), vm.ReadByte(None))
}

#[inline]
pub fn GetTwoRegisters(vm: &mut Machine) -> TwoRegisters {
    (vm.ReadByte(None), vm.ReadByte(None))
}

#[inline]
pub fn GetThreeRegisters(vm: &mut Machine) -> ThreeRegisters {
    (vm.ReadByte(None), vm.ReadByte(None), vm.ReadByte(None))
}

#[inline]
pub fn GetFourRegisters(vm: &mut Machine) -> FourRegisters {
    (
        vm.ReadByte(None),
        vm.ReadByte(None),
        vm.ReadByte(None),
        vm.ReadByte(None),
    )
}