use std::collections::HashMap;
use super::TrapDispatcher;
use crate::cpu::{CpuOps, Register};
use crate::memory::{MacMemoryBus, MemoryBus};
pub struct MockCpu {
regs: HashMap<u8, u32>,
pub ccr: u8,
}
impl MockCpu {
pub fn new() -> Self {
Self {
regs: HashMap::new(),
ccr: 0,
}
}
fn reg_index(reg: Register) -> u8 {
match reg {
Register::D0 => 0,
Register::D1 => 1,
Register::D2 => 2,
Register::D3 => 3,
Register::D4 => 4,
Register::D5 => 5,
Register::D6 => 6,
Register::D7 => 7,
Register::A0 => 8,
Register::A1 => 9,
Register::A2 => 10,
Register::A3 => 11,
Register::A4 => 12,
Register::A5 => 13,
Register::A6 => 14,
Register::A7 => 15,
Register::PC => 16,
}
}
}
impl CpuOps for MockCpu {
fn read_reg(&self, reg: Register) -> u32 {
*self.regs.get(&Self::reg_index(reg)).unwrap_or(&0)
}
fn write_reg(&mut self, reg: Register, value: u32) {
self.regs.insert(Self::reg_index(reg), value);
}
fn get_ccr(&self) -> u8 {
self.ccr
}
fn set_ccr(&mut self, ccr: u8) {
self.ccr = ccr;
}
}
pub const TEST_SP: u32 = 0x100000;
pub fn setup() -> (TrapDispatcher, MockCpu, MacMemoryBus) {
let mut dispatcher = TrapDispatcher::new();
dispatcher.scrap_clipboard_writable = true;
let mut cpu = MockCpu::new();
let mut bus = MacMemoryBus::new(4 * 1024 * 1024);
cpu.write_reg(Register::A7, TEST_SP);
let a5_addr = 0x180000u32;
let qd_globals = 0x180004u32;
cpu.write_reg(Register::A5, a5_addr);
bus.write_long(a5_addr, qd_globals);
bus.write_long(0x016A, 100);
dispatcher.tick_count = 100;
(dispatcher, cpu, bus)
}
pub fn setup_with_port() -> (TrapDispatcher, MockCpu, MacMemoryBus) {
let (disp, cpu, mut bus) = setup();
let port_ptr = 0x181000u32;
let screen_base = bus.read_long(0x0824);
bus.write_word(port_ptr, 0); bus.write_long(port_ptr + 2, screen_base); bus.write_word(port_ptr + 6, 64); bus.write_word(port_ptr + 8, 0); bus.write_word(port_ptr + 10, 0); bus.write_word(port_ptr + 12, 342); bus.write_word(port_ptr + 14, 512);
bus.write_word(port_ptr + 16, 0); bus.write_word(port_ptr + 18, 0); bus.write_word(port_ptr + 20, 342); bus.write_word(port_ptr + 22, 512);
let vis_rgn = 0x182000u32;
bus.write_word(vis_rgn, 10); bus.write_word(vis_rgn + 2, 0); bus.write_word(vis_rgn + 4, 0); bus.write_word(vis_rgn + 6, 342); bus.write_word(vis_rgn + 8, 512); let vis_rgn_handle = 0x182100u32;
bus.write_long(vis_rgn_handle, vis_rgn);
bus.write_long(port_ptr + 24, vis_rgn_handle);
let clip_rgn = 0x182200u32;
bus.write_word(clip_rgn, 10);
bus.write_word(clip_rgn + 2, 0);
bus.write_word(clip_rgn + 4, 0);
bus.write_word(clip_rgn + 6, 342);
bus.write_word(clip_rgn + 8, 512);
let clip_rgn_handle = 0x182300u32;
bus.write_long(clip_rgn_handle, clip_rgn);
bus.write_long(port_ptr + 28, clip_rgn_handle);
bus.write_bytes(port_ptr + 32, &[0x00; 8]); bus.write_bytes(port_ptr + 40, &[0xFF; 8]); bus.write_long(port_ptr + 48, 0); bus.write_word(port_ptr + 52, 1); bus.write_word(port_ptr + 54, 1); bus.write_word(port_ptr + 56, 8); bus.write_bytes(port_ptr + 58, &[0xFF; 8]); bus.write_word(port_ptr + 66, 0); bus.write_word(port_ptr + 68, 0); bus.write_word(port_ptr + 70, 0); bus.write_word(port_ptr + 72, 1); bus.write_word(port_ptr + 74, 0);
let a5 = cpu.read_reg(Register::A5);
let globals_ptr = bus.read_long(a5);
bus.write_long(globals_ptr, port_ptr);
(disp, cpu, bus)
}