pub(crate) mod step {
pub(crate) const DOWN: u8 = 0b1000;
pub(crate) const ENABLED: u8 = 0b0100;
pub(crate) const PAIR: u8 = 0b0011;
pub(crate) const SELECTOR: u8 = ENABLED | PAIR;
pub(crate) const STACK_POINTER: u8 = 0b0111;
pub(crate) const fn enabled(field: u8) -> bool {
field & ENABLED != 0
}
pub(crate) const fn counts_down(field: u8) -> bool {
field & DOWN != 0
}
pub(crate) const fn is_stack_pointer(field: u8) -> bool {
field & SELECTOR == STACK_POINTER
}
pub(crate) const fn is_register_pair(field: u8) -> bool {
enabled(field) && field & PAIR != PAIR
}
pub(crate) const fn pair(field: u8) -> u8 {
field & PAIR
}
pub(crate) const BC: u8 = 0b00;
pub(crate) const DE: u8 = 0b01;
pub(crate) const HL: u8 = 0b10;
pub(crate) const STACK: u8 = 0b11;
pub(crate) const fn up(pair: u8) -> u8 {
ENABLED | (pair & PAIR)
}
pub(crate) const fn down(pair: u8) -> u8 {
DOWN | ENABLED | (pair & PAIR)
}
}
#[allow(
dead_code,
reason = "the register encoding is a complete set; a gap would be a trap"
)]
pub(crate) mod bus {
pub(crate) const B: u8 = 0b0000;
pub(crate) const C: u8 = 0b0001;
pub(crate) const D: u8 = 0b0010;
pub(crate) const E: u8 = 0b0011;
pub(crate) const H: u8 = 0b0100;
pub(crate) const L: u8 = 0b0101;
pub(crate) const REGISTER_LAST: u8 = L;
pub(crate) const DATA_LATCH: u8 = 0b0110;
pub(crate) const ACCUMULATOR: u8 = 0b0111;
pub(crate) const STACK_LOW: u8 = 0b1000;
pub(crate) const STACK_HIGH: u8 = 0b1001;
pub(crate) const ONE: u8 = 0b1010;
pub(crate) const FLAGS: u8 = 0b1011;
pub(crate) const PROGRAM_COUNTER_LOW: u8 = 0b1100;
pub(crate) const PROGRAM_COUNTER_HIGH: u8 = 0b1101;
pub(crate) const MASK: u8 = 0b1111;
pub(crate) const FOURTH_PAIR: u8 = 0b11;
}
pub(crate) mod destination {
pub(crate) const ENABLED: u8 = 0b1_0000;
pub(crate) const TARGET: u8 = 0b0_1111;
pub(crate) const ACCUMULATOR: u8 = ENABLED | super::bus::ACCUMULATOR;
}
pub(crate) mod mask {
pub(crate) const ALU_OPCODE: u8 = 0x3F;
pub(crate) const REFRESH_HELD: u8 = 0x80;
pub(crate) const REFRESH_COUNTED: u8 = 0x7F;
pub(crate) const CONDITION: u8 = 0b011;
pub(crate) const RESTART_TARGET: u8 = 0b0011_1000;
pub(crate) const PATTERN_BASE: u16 = 0xFFF8;
pub(crate) const PATTERN_OFFSET: u16 = 0x0007;
pub(crate) const JUMP_REGION: u16 = 0xC000;
pub(crate) const JUMP_TARGET: u16 = 0x3FC0;
pub(crate) const JUMP_SHIFT: u32 = 6;
}