#![feature(btree_drain_filter)]
#[cfg(any(
all(feature = "cpu-mc68000", feature = "cpu-scc68070"),
not(any(feature = "cpu-mc68000", feature = "cpu-scc68070")),
))]
compile_error!("You must specify one and only one CPU type feature.");
pub mod addressing_modes;
pub mod assembler;
#[cfg(doc)] pub mod cinterface;
#[cfg(not(doc))]
mod cinterface;
pub mod decoder;
pub mod disassembler;
pub mod exception;
#[cfg(feature = "cpu-mc68000")]
#[path = "cpu/mc68000.rs"]
pub(crate) mod execution_times;
#[cfg(feature = "cpu-scc68070")]
#[path = "cpu/scc68070.rs"]
pub(crate) mod execution_times;
pub mod instruction;
mod interpreter;
mod interpreter_disassembler;
mod interpreter_fast;
pub mod isa;
pub mod memory_access;
mod operands_fast;
pub mod status_register;
pub mod utils;
use exception::{Exception, Vector};
pub use memory_access::MemoryAccess;
use status_register::StatusRegister;
use std::collections::BTreeSet;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[repr(C)]
pub struct Registers {
pub d: [u32; 8],
pub a: [u32; 7],
pub usp: u32,
pub ssp: u32,
pub sr: StatusRegister,
pub pc: u32,
}
#[derive(Clone, Debug)]
pub struct M68000 {
pub regs: Registers,
current_opcode: u16,
pub stop: bool,
exceptions: BTreeSet<exception::Exception>,
cycles: usize,
}
impl M68000 {
pub fn new() -> Self {
let mut cpu = Self::new_no_reset();
cpu.exception(Exception::from(Vector::ResetSspPc));
cpu
}
pub fn new_no_reset() -> Self {
Self {
regs: Registers {
d: [0; 8],
a: [0; 7],
usp: 0,
ssp: 0,
sr: StatusRegister::default(),
pc: 0,
},
current_opcode: 0xFFFF,
stop: false,
exceptions: BTreeSet::new(),
cycles: 0,
}
}
pub fn d_byte(&mut self, reg: u8, value: u8) {
self.regs.d[reg as usize] &= 0xFFFF_FF00;
self.regs.d[reg as usize] |= value as u32;
}
pub fn d_word(&mut self, reg: u8, value: u16) {
self.regs.d[reg as usize] &= 0xFFFF_0000;
self.regs.d[reg as usize] |= value as u32;
}
pub const fn a(&self, reg: u8) -> u32 {
if reg < 7 {
self.regs.a[reg as usize]
} else {
self.sp()
}
}
pub fn a_mut(&mut self, reg: u8) -> &mut u32 {
if reg < 7 {
&mut self.regs.a[reg as usize]
} else {
self.sp_mut()
}
}
pub const fn sp(&self) -> u32 {
if self.regs.sr.s {
self.regs.ssp
} else {
self.regs.usp
}
}
pub fn sp_mut(&mut self) -> &mut u32 {
if self.regs.sr.s {
&mut self.regs.ssp
} else {
&mut self.regs.usp
}
}
}