Skip to main content

portal_solutions_mos6502_model/
lib.rs

1#![no_std]
2extern crate alloc;
3pub mod addressing_mode;
4pub mod assembler_instruction;
5pub mod debug;
6pub mod instruction;
7pub mod machine;
8pub mod opcode;
9pub mod operand;
10pub mod status;
11
12pub use addressing_mode::Trait as AddressingMode;
13pub use assembler_instruction::Trait as AssemblerInstruction;
14
15use core::fmt;
16
17pub type Address = u16;
18
19#[derive(Clone, Copy)]
20pub struct UnknownOpcode(pub u8);
21
22impl fmt::Debug for UnknownOpcode {
23    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
24        write!(f, "UnknownOpcode({:02X})", self.0)
25    }
26}
27
28pub mod address {
29    use super::*;
30    pub fn lo(address: Address) -> u8 {
31        address as u8
32    }
33    pub fn hi(address: Address) -> u8 {
34        address.wrapping_shr(8) as u8
35    }
36    pub const fn from_u8_lo_hi(lo: u8, hi: u8) -> Address {
37        (hi as Address).wrapping_shl(8) | lo as Address
38    }
39    pub const fn from_u8_hi_lo(hi: u8, lo: u8) -> Address {
40        from_u8_lo_hi(lo, hi)
41    }
42    pub fn on_different_pages(a: Address, b: Address) -> bool {
43        a.wrapping_shr(8) != b.wrapping_shr(8)
44    }
45}
46
47pub mod interrupt_vector {
48    use super::*;
49    pub const NMI_LO: Address = 0xFFFA;
50    pub const NMI_HI: Address = 0xFFFB;
51    pub const START_LO: Address = 0xFFFC;
52    pub const START_HI: Address = 0xFFFD;
53    pub const IRQ_LO: Address = 0xFFFE;
54    pub const IRQ_HI: Address = 0xFFFF;
55}