portal_solutions_mos6502_model/
lib.rs1#![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}