use crate::cia::*;
use crate::sid::*;
use crate::vic2::*;
use bitflags::bitflags;
use volatile_register::RW;
bitflags! {
pub struct CpuPortFlags: u8 {
const DEFAULT = Self::BASIC_IO_KERNAL.bits;
const BASIC_IO_KERNAL = 0b00110111;
const RAM_RAM_RAM = 0b00110000;
const RAM_CHAR_RAM = 0b00110001;
const RAM_CHAR_KERNAL = 0b00110010;
const BASIC_CHAR_KERNAL = 0b00110011;
const RAM_IO_RAM = 0b00110101;
const RAM_IO_KERNAL = 0b00110110;
const DATASETTE_SIGNAL = 0b00001000; const DATASETTE_BUTTON_OFF = 0b00010000; const DATASETTE_MOTOR_OFF = 0b00100000; }
}
pub const CPU_PORT: *mut RW<CpuPortFlags> = (0x0001) as *mut RW<CpuPortFlags>;
pub const DEFAULT_VIDEO_MEMORY: *mut u8 = (0x0400) as *mut u8;
pub const DEFAULT_VIDEO_MATRIX: *mut [u8; 25 * 40] = (0x0400) as *mut [u8; 25 * 40];
pub const DEFAULT_SPRITE_PTR: [*mut u8; 8] = [
(0x0400 + 0x3F8) as *mut u8,
(0x0400 + 0x3F8 + 1) as *mut u8,
(0x0400 + 0x3F8 + 2) as *mut u8,
(0x0400 + 0x3F8 + 3) as *mut u8,
(0x0400 + 0x3F8 + 4) as *mut u8,
(0x0400 + 0x3F8 + 5) as *mut u8,
(0x0400 + 0x3F8 + 6) as *mut u8,
(0x0400 + 0x3F8 + 7) as *mut u8,
];
pub const DEFAULT_UPPERCASE_FONT: *mut u8 = (0x1000) as *mut u8;
pub const DEFAULT_MIXEDCASE_FONT: *mut u8 = (0x1800) as *mut u8;
pub const BASIC_ROM: *mut u8 = (0xa000) as *mut u8;
pub const BASIC_ROM_AREA: *mut [u8; 0x1fff] = (0xa000) as *mut [u8; 0x1fff];
pub const VIC: *const MOSVideoInterfaceControllerII =
(0xd000) as *const MOSVideoInterfaceControllerII;
pub const SID: *const MOSSoundInterfaceDevice = (0xd400) as *const MOSSoundInterfaceDevice;
pub const COLOR_RAM: *mut u8 = (0xd800) as *mut u8;
pub const CIA1: *const MOSComplexInterfaceAdapter6526 =
(0xdc00) as *const MOSComplexInterfaceAdapter6526;
pub const CIA2: *const MOSComplexInterfaceAdapter6526 =
(0xdd00) as *const MOSComplexInterfaceAdapter6526;
pub const KERNAL_ROM: *mut [u8; 8192] = (0xe000) as *mut [u8; 8192];
bitflags! {
pub struct CIA1ControlAFlags: u8 {
const START = 0b00000001; const PBON = 0b00000010;
const OUTMODE = 0b00000100;
const RUNMODE = 0b00001000;
const FORCE_LOAD = 0b00010000;
const INMODE = 0b00100000;
const SERIAL_OUTPUT = 0b01000000;
const FIFTY_HZ_RTC = 0b10000000;
}
}
pub enum VicBank {
Region0000 = 0x11, Region4000 = 0x10, Region8000 = 0x01, RegionC000 = 0x00, }
extern "C" {
fn hardware_raster_irq_c(triggering_raster_line: u8);
}
pub fn hardware_raster_irq(triggering_raster_line: u8) {
unsafe {
hardware_raster_irq_c(triggering_raster_line);
}
}
pub enum Keyboard {
Delete = 0x14,
Stop = 0x03,
Return = 0x0d,
Home = 0x13,
CursorDown = 0x11,
CursorRight = 0x1d,
Space = 0x20,
ArrowLeft = 0x5f,
Run = 0x83,
F1 = 0x85,
F2 = 0x86,
F3 = 0x87,
F4 = 0x88,
F5 = 0x89,
F6 = 0x8a,
F7 = 0x8b,
F8 = 0x8c,
ShiftReturn = 0x8d,
CursorUp = 0x91,
Clear = 0x93,
Insert = 0x94,
CursorLeft = 0x9d,
}
pub const fn vic2() -> &'static MOSVideoInterfaceControllerII {
unsafe { &*VIC }
}
pub const fn sid() -> &'static MOSSoundInterfaceDevice {
unsafe { &*SID }
}
pub const fn cia1() -> &'static MOSComplexInterfaceAdapter6526 {
unsafe { &*CIA1 }
}
pub const fn cia2() -> &'static MOSComplexInterfaceAdapter6526 {
unsafe { &*CIA2 }
}
pub fn clear_screen() {
unsafe {
(*DEFAULT_VIDEO_MATRIX)
.iter_mut()
.for_each(|i| *i = Keyboard::Space as u8);
}
}
pub fn set_lower_case() {
unsafe {
vic2().screen_and_charset_bank.write(23);
}
}
pub fn set_upper_case() {
unsafe {
vic2().screen_and_charset_bank.write(21);
}
}