pub const VENDOR_ID: u16 = 0xCAFE;
pub const PRODUCT_ID: u16 = 0x4011;
pub const ACM_CTRL_DTR: u16 = 0x01;
pub const ACM_CTRL_RTS: u16 = 0x02;
pub const EP_OUT_ADDR: u8 = 0x02;
pub const EP_IN_ADDR: u8 = 0x82;
pub const LEN_IN_BUFFER: usize = 1;
pub const LEN_OUT_BUFFER: usize = 64;
pub const OP_WRITE: u8 = 0;
pub const OP_READ: u8 = 1;
pub const OP_CYCLED_WRITE: u8 = 2;
pub const OP_COMMAND: u8 = 3;
pub const CMD_PAUSE: u8 = 10;
pub const CMD_UNPAUSE: u8 = 11;
pub const CMD_MUTE: u8 = 12;
pub const CMD_UNMUTE: u8 = 13;
pub const CMD_RESET_SID: u8 = 14;
pub const CMD_DISABLE_SID: u8 = 15;
pub const CMD_ENABLE_SID: u8 = 16;
pub const CMD_CLEAR_BUS: u8 = 17;
pub const CMD_CONFIG: u8 = 18;
pub const CMD_RESET_MCU: u8 = 19;
pub const CMD_BOOTLOADER: u8 = 20;
#[inline]
pub const fn command_byte(sub_cmd: u8) -> u8 {
(OP_COMMAND << 6) | sub_cmd
}
#[inline]
pub const fn cycled_write_header(count: u8) -> u8 {
(OP_CYCLED_WRITE << 6) | count
}
#[inline]
pub const fn write_header(count: u8) -> u8 {
(OP_WRITE << 6) | count
}
#[inline]
pub const fn read_header() -> u8 {
OP_READ << 6
}
pub const LINE_ENCODING: [u8; 7] = [0x40, 0x54, 0x89, 0x00, 0x00, 0x00, 0x08];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i64)]
pub enum ClockSpeed {
Default = 1_000_000,
Pal = 985_248,
Ntsc = 1_022_727,
Drean = 1_023_440,
Ntsc2 = 1_022_730,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i64)]
pub enum RefreshRate {
Default = 20_000,
Eu = 19_950,
Us = 16_715,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i64)]
pub enum RasterRate {
Default = 20_000,
Eu = 19_656,
Us = 17_096,
}
pub const CLOCK_TABLE: [(ClockSpeed, RefreshRate, RasterRate); 5] = [
(
ClockSpeed::Default,
RefreshRate::Default,
RasterRate::Default,
),
(ClockSpeed::Pal, RefreshRate::Eu, RasterRate::Eu),
(ClockSpeed::Ntsc, RefreshRate::Us, RasterRate::Us),
(ClockSpeed::Drean, RefreshRate::Us, RasterRate::Us),
(ClockSpeed::Ntsc2, RefreshRate::Us, RasterRate::Us),
];
pub const MIN_DIFF_SIZE: usize = 16;
pub const MIN_RING_SIZE: usize = 256;
pub const DEFAULT_DIFF_SIZE: usize = 64;
pub const DEFAULT_RING_SIZE: usize = 8192;
#[inline]
pub fn sid_address(addr: u16) -> u8 {
const SID_LMASK: u16 = 0xFF;
const SID2_MASK: u16 = 0x3F;
const SID3_ADDR: u16 = 0xD440;
match addr {
0xD400..=0xD499 => (addr & SID_LMASK) as u8,
0xD500..=0xD599 | 0xDE00..=0xDF99 => ((SID3_ADDR | (addr & SID2_MASK)) & SID_LMASK) as u8,
_ => (addr & SID_LMASK) as u8,
}
}