crustacean_6502_emulator/src/emulator/addressing_modes.rs

42 lines
1007 B
Rust

use std::convert::{From, Into};
struct Address(usize);
impl From<usize> for Address {
fn from(v: usize) -> Self {
if v > 0xFFFF {
panic!("Address is bigger than 0x10000 (Got 0x{:04X})", v);
}
Self(v)
}
}
impl From<u16> for Address {
fn from(v: u16) -> Self {
Self(v as usize)
}
}
pub fn get_size(addr_mode: AddressingMode) -> usize {
OP_SIZES[addr_mode as usize]
}
//A,abs,absX,absY,imm,impl,ind,indX,indY,rel,zpg,zpgX,zpgY
//1, 3, 3, 3, 2, 1, 3, 2, 2, 2, 2, 2, 2
pub static OP_SIZES: [usize; 13] = [1, 3, 3, 3, 2, 1, 3, 2, 2, 2, 2, 2, 2];
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum AddressingMode {
A = 0, // LSR A
ABS, // LDA $1234
ABSX, // STA $3000,X
ABSY, // AND $4000,Y
IMM, // LDA #$10
IMPL, // CLC
IND, // JMP ($FFFC)
INDX, // LDA ($40,X)
INDY, // LDA ($40),Y
REL, // LABEL // +4
ZPG, // LDA $10
ZPGX, // LDA $10,X
ZPGY, // LDA $10,Y
}