use std::{cmp::Ordering, fmt::Display, ops::Add};
use crate::opcodes::*;
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub enum AddressMode {
Immediate,
Implied,
Accumulator,
Absolute,
AbsoluteX,
AbsoluteY,
AbsoluteLong,
AbsoluteLongX,
AbsoluteIndirect,
AbsoluteIndirectX,
AbsoluteIndirectLong,
Direct,
DirectX,
DirectY,
DirectIndirect,
DirectIndirectX,
DirectIndirectY,
DirectIndirectLong,
DirectIndirectLongY,
StackRelative,
StackRelativeIndirectY,
BlockMove,
}
impl Display for AddressMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use AddressMode::*;
f.write_str(match *self {
Immediate => "#",
Implied => "i",
Accumulator => "A",
Absolute => "a",
AbsoluteX => "a,x",
AbsoluteY => "a,y",
AbsoluteLong => "al",
AbsoluteLongX => "al,x",
AbsoluteIndirect => "(a)",
AbsoluteIndirectX => "(a,x)",
AbsoluteIndirectLong => "[a]",
Direct => "d",
DirectX => "d,x",
DirectY => "d,y",
DirectIndirect => "(d)",
DirectIndirectX => "(d,x)",
DirectIndirectY => "(d),y",
DirectIndirectLong => "[d]",
DirectIndirectLongY => "[d],y",
StackRelative => "d,s",
StackRelativeIndirectY => "(d,s),y",
BlockMove => "#,#",
})
}
}
pub fn format_address_mode(addr_mode: AddressMode, bytes: &[u8], opcode_len: u32) -> String {
use AddressMode::*;
let off = format!("${:02X}", bytes[0]);
let abs = format!("${:02X}{:02X}", bytes[1], bytes[0]);
let long = format!("${:02X}{:02X}{:02X}", bytes[2], bytes[1], bytes[0]);
match addr_mode {
Implied => String::new(),
Immediate => {
if opcode_len == 3 {
format!("#{}", abs)
} else {
format!("#{}", off)
}
}
Absolute => abs,
AbsoluteX => format!("{}, x", abs),
AbsoluteY => format!("{}, y", abs),
AbsoluteIndirect => format!("({})", abs),
AbsoluteIndirectX => format!("({}, x)", abs),
AbsoluteLong => long,
AbsoluteLongX => format!("{}, x", long),
AbsoluteIndirectLong => format!("[{}]", abs),
Accumulator => "ACC".to_string(),
Direct => off,
DirectX => format!("{}, x", off),
DirectY => format!("{}, y", off),
DirectIndirect => format!("({})", off),
DirectIndirectX => format!("({}, x)", off),
DirectIndirectY => format!("({}), y", off),
DirectIndirectLong => format!("[{}]", off),
DirectIndirectLongY => format!("[{}], y", off),
StackRelative => format!("({}, s)", off),
StackRelativeIndirectY => format!("({}, s), y", off),
BlockMove => format!("{:02X},{:02X}", bytes[0], bytes[1]),
}
}
pub struct OpcodeData {
pub code: u8,
pub name: &'static str,
pub addr_mode: AddressMode,
pub bytes: u32,
}
impl PartialEq for OpcodeData {
fn eq(&self, other: &Self) -> bool {
self.code == other.code
}
}
impl Eq for OpcodeData {}
impl PartialOrd for OpcodeData {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for OpcodeData {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
match self.name.cmp(other.name) {
Ordering::Equal => self.addr_mode.cmp(&other.addr_mode),
o => o,
}
}
}
pub fn opcode_data(opcode: u8, a: bool, xy: bool) -> OpcodeData {
match opcode {
ADC_I => OpcodeData {
code: 105,
name: "ADC",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
ADC_A => OpcodeData {
code: 109,
name: "ADC",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
ADC_AL => OpcodeData {
code: 111,
name: "ADC",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
ADC_D => OpcodeData {
code: 101,
name: "ADC",
addr_mode: AddressMode::Direct,
bytes: 2,
},
ADC_DI => OpcodeData {
code: 114,
name: "ADC",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
ADC_DIL => OpcodeData {
code: 103,
name: "ADC",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
ADC_AX => OpcodeData {
code: 125,
name: "ADC",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
ADC_ALX => OpcodeData {
code: 127,
name: "ADC",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
ADC_AY => OpcodeData {
code: 121,
name: "ADC",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
ADC_DX => OpcodeData {
code: 117,
name: "ADC",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
ADC_DIX => OpcodeData {
code: 97,
name: "ADC",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
ADC_DIY => OpcodeData {
code: 113,
name: "ADC",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
ADC_DILY => OpcodeData {
code: 119,
name: "ADC",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
ADC_SR => OpcodeData {
code: 99,
name: "ADC",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
ADC_SRIY => OpcodeData {
code: 115,
name: "ADC",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
AND_I => OpcodeData {
code: 41,
name: "AND",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
AND_A => OpcodeData {
code: 45,
name: "AND",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
AND_AL => OpcodeData {
code: 47,
name: "AND",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
AND_D => OpcodeData {
code: 37,
name: "AND",
addr_mode: AddressMode::Direct,
bytes: 2,
},
AND_DI => OpcodeData {
code: 50,
name: "AND",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
AND_DIL => OpcodeData {
code: 39,
name: "AND",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
AND_AX => OpcodeData {
code: 61,
name: "AND",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
AND_ALX => OpcodeData {
code: 63,
name: "AND",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
AND_AY => OpcodeData {
code: 57,
name: "AND",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
AND_DX => OpcodeData {
code: 53,
name: "AND",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
AND_DIX => OpcodeData {
code: 33,
name: "AND",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
AND_DIY => OpcodeData {
code: 49,
name: "AND",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
AND_DILY => OpcodeData {
code: 55,
name: "AND",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
AND_SR => OpcodeData {
code: 35,
name: "AND",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
AND_SRIY => OpcodeData {
code: 51,
name: "AND",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
ASL_ACC => OpcodeData {
code: 10,
name: "ASL",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
ASL_A => OpcodeData {
code: 14,
name: "ASL",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
ASL_D => OpcodeData {
code: 6,
name: "ASL",
addr_mode: AddressMode::Direct,
bytes: 2,
},
ASL_AX => OpcodeData {
code: 30,
name: "ASL",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
ASL_DX => OpcodeData {
code: 22,
name: "ASL",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
BCC => OpcodeData {
code: 144,
name: "BCC",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BCS => OpcodeData {
code: 176,
name: "BCS",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BNE => OpcodeData {
code: 208,
name: "BNE",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BEQ => OpcodeData {
code: 240,
name: "BEQ",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BPL => OpcodeData {
code: 16,
name: "BPL",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BMI => OpcodeData {
code: 48,
name: "BMI",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BVC => OpcodeData {
code: 80,
name: "BVC",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BVS => OpcodeData {
code: 112,
name: "BVS",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BRA => OpcodeData {
code: 128,
name: "BRA",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
BRL => OpcodeData {
code: 130,
name: "BRL",
addr_mode: AddressMode::Immediate,
bytes: 3,
},
BIT_I => OpcodeData {
code: 137,
name: "BIT",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
BIT_A => OpcodeData {
code: 44,
name: "BIT",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
BIT_D => OpcodeData {
code: 36,
name: "BIT",
addr_mode: AddressMode::Direct,
bytes: 2,
},
BIT_AX => OpcodeData {
code: 60,
name: "BIT",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
BIT_DX => OpcodeData {
code: 52,
name: "BIT",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
BRK => OpcodeData {
code: 0,
name: "BRK",
addr_mode: AddressMode::Implied,
bytes: 2,
},
COP => OpcodeData {
code: 2,
name: "COP",
addr_mode: AddressMode::Implied,
bytes: 2,
},
CLC => OpcodeData {
code: 24,
name: "CLC",
addr_mode: AddressMode::Implied,
bytes: 1,
},
CLI => OpcodeData {
code: 88,
name: "CLI",
addr_mode: AddressMode::Implied,
bytes: 1,
},
CLD => OpcodeData {
code: 216,
name: "CLD",
addr_mode: AddressMode::Implied,
bytes: 1,
},
CLV => OpcodeData {
code: 184,
name: "CLV",
addr_mode: AddressMode::Implied,
bytes: 1,
},
CMP_I => OpcodeData {
code: 201,
name: "CMP",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
CMP_A => OpcodeData {
code: 205,
name: "CMP",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
CMP_AL => OpcodeData {
code: 207,
name: "CMP",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
CMP_D => OpcodeData {
code: 197,
name: "CMP",
addr_mode: AddressMode::Direct,
bytes: 2,
},
CMP_DI => OpcodeData {
code: 210,
name: "CMP",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
CMP_DIL => OpcodeData {
code: 199,
name: "CMP",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
CMP_AX => OpcodeData {
code: 221,
name: "CMP",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
CMP_ALX => OpcodeData {
code: 223,
name: "CMP",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
CMP_AY => OpcodeData {
code: 217,
name: "CMP",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
CMP_DX => OpcodeData {
code: 213,
name: "CMP",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
CMP_DIX => OpcodeData {
code: 193,
name: "CMP",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
CMP_DIY => OpcodeData {
code: 209,
name: "CMP",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
CMP_DILY => OpcodeData {
code: 215,
name: "CMP",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
CMP_SR => OpcodeData {
code: 195,
name: "CMP",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
CMP_SRIY => OpcodeData {
code: 211,
name: "CMP",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
CPX_I => OpcodeData {
code: 224,
name: "CPX",
addr_mode: AddressMode::Immediate,
bytes: if xy { 3 } else { 2 },
},
CPX_A => OpcodeData {
code: 236,
name: "CPX",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
CPX_D => OpcodeData {
code: 228,
name: "CPX",
addr_mode: AddressMode::Direct,
bytes: 2,
},
CPY_I => OpcodeData {
code: 192,
name: "CPY",
addr_mode: AddressMode::Immediate,
bytes: if xy { 3 } else { 2 },
},
CPY_A => OpcodeData {
code: 204,
name: "CPY",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
CPY_D => OpcodeData {
code: 196,
name: "CPY",
addr_mode: AddressMode::Direct,
bytes: 2,
},
DEC_ACC => OpcodeData {
code: 58,
name: "DEC",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
DEC_A => OpcodeData {
code: 206,
name: "DEC",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
DEC_D => OpcodeData {
code: 198,
name: "DEC",
addr_mode: AddressMode::Direct,
bytes: 2,
},
DEC_AX => OpcodeData {
code: 222,
name: "DEC",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
DEC_DX => OpcodeData {
code: 214,
name: "DEC",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
DEX => OpcodeData {
code: 202,
name: "DEX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
DEY => OpcodeData {
code: 136,
name: "DEY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
EOR_I => OpcodeData {
code: 73,
name: "EOR",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
EOR_A => OpcodeData {
code: 77,
name: "EOR",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
EOR_AL => OpcodeData {
code: 79,
name: "EOR",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
EOR_D => OpcodeData {
code: 69,
name: "EOR",
addr_mode: AddressMode::Direct,
bytes: 2,
},
EOR_DI => OpcodeData {
code: 82,
name: "EOR",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
EOR_DIL => OpcodeData {
code: 71,
name: "EOR",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
EOR_AX => OpcodeData {
code: 93,
name: "EOR",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
EOR_ALX => OpcodeData {
code: 95,
name: "EOR",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
EOR_AY => OpcodeData {
code: 89,
name: "EOR",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
EOR_DX => OpcodeData {
code: 85,
name: "EOR",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
EOR_DIX => OpcodeData {
code: 65,
name: "EOR",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
EOR_DIY => OpcodeData {
code: 81,
name: "EOR",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
EOR_DILY => OpcodeData {
code: 87,
name: "EOR",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
EOR_SR => OpcodeData {
code: 67,
name: "EOR",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
EOR_SRIY => OpcodeData {
code: 83,
name: "EOR",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
INC_ACC => OpcodeData {
code: 26,
name: "INC",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
INC_A => OpcodeData {
code: 238,
name: "INC",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
INC_D => OpcodeData {
code: 230,
name: "INC",
addr_mode: AddressMode::Direct,
bytes: 2,
},
INC_AX => OpcodeData {
code: 254,
name: "INC",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
INC_DX => OpcodeData {
code: 246,
name: "INC",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
INX => OpcodeData {
code: 232,
name: "INX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
INY => OpcodeData {
code: 200,
name: "INY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
JMP_A => OpcodeData {
code: 76,
name: "JMP",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
JMP_AI => OpcodeData {
code: 108,
name: "JMP",
addr_mode: AddressMode::AbsoluteIndirect,
bytes: 3,
},
JMP_AIX => OpcodeData {
code: 124,
name: "JMP",
addr_mode: AddressMode::AbsoluteIndirectX,
bytes: 3,
},
JMP_AL => OpcodeData {
code: 92,
name: "JMP",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
JMP_AIL => OpcodeData {
code: 220,
name: "JMP",
addr_mode: AddressMode::AbsoluteIndirectLong,
bytes: 3,
},
JSR_A => OpcodeData {
code: 32,
name: "JSR",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
JSR_AIX => OpcodeData {
code: 252,
name: "JSR",
addr_mode: AddressMode::AbsoluteIndirectX,
bytes: 3,
},
JSL => OpcodeData {
code: 34,
name: "JSL",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
LDA_I => OpcodeData {
code: 169,
name: "LDA",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
LDA_A => OpcodeData {
code: 173,
name: "LDA",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
LDA_AL => OpcodeData {
code: 175,
name: "LDA",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
LDA_D => OpcodeData {
code: 165,
name: "LDA",
addr_mode: AddressMode::Direct,
bytes: 2,
},
LDA_DI => OpcodeData {
code: 178,
name: "LDA",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
LDA_DIL => OpcodeData {
code: 167,
name: "LDA",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
LDA_AX => OpcodeData {
code: 189,
name: "LDA",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
LDA_ALX => OpcodeData {
code: 191,
name: "LDA",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
LDA_AY => OpcodeData {
code: 185,
name: "LDA",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
LDA_DX => OpcodeData {
code: 181,
name: "LDA",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
LDA_DIX => OpcodeData {
code: 161,
name: "LDA",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
LDA_DIY => OpcodeData {
code: 177,
name: "LDA",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
LDA_DILY => OpcodeData {
code: 183,
name: "LDA",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
LDA_SR => OpcodeData {
code: 163,
name: "LDA",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
LDA_SRIY => OpcodeData {
code: 179,
name: "LDA",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
LDX_I => OpcodeData {
code: 162,
name: "LDX",
addr_mode: AddressMode::Immediate,
bytes: if xy { 3 } else { 2 },
},
LDX_A => OpcodeData {
code: 174,
name: "LDX",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
LDX_D => OpcodeData {
code: 166,
name: "LDX",
addr_mode: AddressMode::Direct,
bytes: 2,
},
LDX_AY => OpcodeData {
code: 190,
name: "LDX",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
LDX_DY => OpcodeData {
code: 182,
name: "LDX",
addr_mode: AddressMode::DirectY,
bytes: 2,
},
LDY_I => OpcodeData {
code: 160,
name: "LDY",
addr_mode: AddressMode::Immediate,
bytes: if xy { 3 } else { 2 },
},
LDY_A => OpcodeData {
code: 172,
name: "LDY",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
LDY_D => OpcodeData {
code: 164,
name: "LDY",
addr_mode: AddressMode::Direct,
bytes: 2,
},
LDY_AX => OpcodeData {
code: 188,
name: "LDY",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
LDY_DX => OpcodeData {
code: 180,
name: "LDY",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
LSR_ACC => OpcodeData {
code: 74,
name: "LSR",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
LSR_A => OpcodeData {
code: 78,
name: "LSR",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
LSR_D => OpcodeData {
code: 70,
name: "LSR",
addr_mode: AddressMode::Direct,
bytes: 2,
},
LSR_AX => OpcodeData {
code: 94,
name: "LSR",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
LSR_DX => OpcodeData {
code: 86,
name: "LSR",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
MVN => OpcodeData {
code: 84,
name: "MVN",
addr_mode: AddressMode::BlockMove,
bytes: 3,
},
MVP => OpcodeData {
code: 68,
name: "MVP",
addr_mode: AddressMode::BlockMove,
bytes: 3,
},
NOP => OpcodeData {
code: 234,
name: "NOP",
addr_mode: AddressMode::Implied,
bytes: 1,
},
ORA_I => OpcodeData {
code: 9,
name: "ORA",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
ORA_A => OpcodeData {
code: 13,
name: "ORA",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
ORA_AL => OpcodeData {
code: 15,
name: "ORA",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
ORA_D => OpcodeData {
code: 5,
name: "ORA",
addr_mode: AddressMode::Direct,
bytes: 2,
},
ORA_DI => OpcodeData {
code: 18,
name: "ORA",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
ORA_DIL => OpcodeData {
code: 7,
name: "ORA",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
ORA_AX => OpcodeData {
code: 29,
name: "ORA",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
ORA_ALX => OpcodeData {
code: 31,
name: "ORA",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
ORA_AY => OpcodeData {
code: 25,
name: "ORA",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
ORA_DX => OpcodeData {
code: 21,
name: "ORA",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
ORA_DIX => OpcodeData {
code: 1,
name: "ORA",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
ORA_DIY => OpcodeData {
code: 17,
name: "ORA",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
ORA_DILY => OpcodeData {
code: 23,
name: "ORA",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
ORA_SR => OpcodeData {
code: 3,
name: "ORA",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
ORA_SRIY => OpcodeData {
code: 19,
name: "ORA",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
PEA => OpcodeData {
code: 244,
name: "PEA",
addr_mode: AddressMode::Immediate,
bytes: 3,
},
PEI => OpcodeData {
code: 212,
name: "PEI",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
PER => OpcodeData {
code: 98,
name: "PER",
addr_mode: AddressMode::Immediate,
bytes: 3,
},
PHA => OpcodeData {
code: 72,
name: "PHA",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHB => OpcodeData {
code: 139,
name: "PHB",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHD => OpcodeData {
code: 11,
name: "PHD",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHK => OpcodeData {
code: 75,
name: "PHK",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHP => OpcodeData {
code: 8,
name: "PHP",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHX => OpcodeData {
code: 218,
name: "PHX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PHY => OpcodeData {
code: 90,
name: "PHY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLA => OpcodeData {
code: 104,
name: "PLA",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLB => OpcodeData {
code: 171,
name: "PLB",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLD => OpcodeData {
code: 43,
name: "PLD",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLP => OpcodeData {
code: 40,
name: "PLP",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLX => OpcodeData {
code: 250,
name: "PLX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
PLY => OpcodeData {
code: 122,
name: "PLY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
REP_I => OpcodeData {
code: 194,
name: "REP",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
ROL_ACC => OpcodeData {
code: 42,
name: "ROL",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
ROL_A => OpcodeData {
code: 46,
name: "ROL",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
ROL_D => OpcodeData {
code: 38,
name: "ROL",
addr_mode: AddressMode::Direct,
bytes: 2,
},
ROL_AX => OpcodeData {
code: 62,
name: "ROL",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
ROL_DX => OpcodeData {
code: 54,
name: "ROL",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
ROR_ACC => OpcodeData {
code: 106,
name: "ROR",
addr_mode: AddressMode::Accumulator,
bytes: 1,
},
ROR_A => OpcodeData {
code: 110,
name: "ROR",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
ROR_D => OpcodeData {
code: 102,
name: "ROR",
addr_mode: AddressMode::Direct,
bytes: 2,
},
ROR_AX => OpcodeData {
code: 126,
name: "ROR",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
ROR_DX => OpcodeData {
code: 118,
name: "ROR",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
RTI => OpcodeData {
code: 64,
name: "RTI",
addr_mode: AddressMode::Implied,
bytes: 1,
},
RTS => OpcodeData {
code: 96,
name: "RTS",
addr_mode: AddressMode::Implied,
bytes: 1,
},
RTL => OpcodeData {
code: 107,
name: "RTL",
addr_mode: AddressMode::Implied,
bytes: 1,
},
SBC_I => OpcodeData {
code: 233,
name: "SBC",
addr_mode: AddressMode::Immediate,
bytes: if a { 3 } else { 2 },
},
SBC_A => OpcodeData {
code: 237,
name: "SBC",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
SBC_AL => OpcodeData {
code: 239,
name: "SBC",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
SBC_D => OpcodeData {
code: 229,
name: "SBC",
addr_mode: AddressMode::Direct,
bytes: 2,
},
SBC_DI => OpcodeData {
code: 242,
name: "SBC",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
SBC_DIL => OpcodeData {
code: 231,
name: "SBC",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
SBC_AX => OpcodeData {
code: 253,
name: "SBC",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
SBC_ALX => OpcodeData {
code: 255,
name: "SBC",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
SBC_AY => OpcodeData {
code: 249,
name: "SBC",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
SBC_DX => OpcodeData {
code: 245,
name: "SBC",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
SBC_DIX => OpcodeData {
code: 225,
name: "SBC",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
SBC_DIY => OpcodeData {
code: 241,
name: "SBC",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
SBC_DILY => OpcodeData {
code: 247,
name: "SBC",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
SBC_SR => OpcodeData {
code: 227,
name: "SBC",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
SBC_SRIY => OpcodeData {
code: 243,
name: "SBC",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
SEC => OpcodeData {
code: 56,
name: "SEC",
addr_mode: AddressMode::Implied,
bytes: 1,
},
SEI => OpcodeData {
code: 120,
name: "SEI",
addr_mode: AddressMode::Implied,
bytes: 1,
},
SED => OpcodeData {
code: 248,
name: "SED",
addr_mode: AddressMode::Implied,
bytes: 1,
},
SEP_I => OpcodeData {
code: 226,
name: "SEP",
addr_mode: AddressMode::Immediate,
bytes: 2,
},
STA_A => OpcodeData {
code: 141,
name: "STA",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
STA_AL => OpcodeData {
code: 143,
name: "STA",
addr_mode: AddressMode::AbsoluteLong,
bytes: 4,
},
STA_D => OpcodeData {
code: 133,
name: "STA",
addr_mode: AddressMode::Direct,
bytes: 2,
},
STA_DI => OpcodeData {
code: 146,
name: "STA",
addr_mode: AddressMode::DirectIndirect,
bytes: 2,
},
STA_DIL => OpcodeData {
code: 135,
name: "STA",
addr_mode: AddressMode::DirectIndirectLong,
bytes: 2,
},
STA_AX => OpcodeData {
code: 157,
name: "STA",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
STA_ALX => OpcodeData {
code: 159,
name: "STA",
addr_mode: AddressMode::AbsoluteLongX,
bytes: 4,
},
STA_AY => OpcodeData {
code: 153,
name: "STA",
addr_mode: AddressMode::AbsoluteY,
bytes: 3,
},
STA_DX => OpcodeData {
code: 149,
name: "STA",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
STA_DIX => OpcodeData {
code: 129,
name: "STA",
addr_mode: AddressMode::DirectIndirectX,
bytes: 2,
},
STA_DIY => OpcodeData {
code: 145,
name: "STA",
addr_mode: AddressMode::DirectIndirectY,
bytes: 2,
},
STA_DILY => OpcodeData {
code: 151,
name: "STA",
addr_mode: AddressMode::DirectIndirectLongY,
bytes: 2,
},
STA_SR => OpcodeData {
code: 131,
name: "STA",
addr_mode: AddressMode::StackRelative,
bytes: 2,
},
STA_SRIY => OpcodeData {
code: 147,
name: "STA",
addr_mode: AddressMode::StackRelativeIndirectY,
bytes: 2,
},
STP => OpcodeData {
code: 219,
name: "STP",
addr_mode: AddressMode::Implied,
bytes: 1,
},
STX_A => OpcodeData {
code: 142,
name: "STX",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
STX_D => OpcodeData {
code: 134,
name: "STX",
addr_mode: AddressMode::Direct,
bytes: 2,
},
STX_DY => OpcodeData {
code: 150,
name: "STX",
addr_mode: AddressMode::DirectY,
bytes: 2,
},
STY_A => OpcodeData {
code: 140,
name: "STY",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
STY_D => OpcodeData {
code: 132,
name: "STY",
addr_mode: AddressMode::Direct,
bytes: 2,
},
STY_DX => OpcodeData {
code: 148,
name: "STY",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
STZ_A => OpcodeData {
code: 156,
name: "STZ",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
STZ_D => OpcodeData {
code: 100,
name: "STZ",
addr_mode: AddressMode::Direct,
bytes: 2,
},
STZ_AX => OpcodeData {
code: 158,
name: "STZ",
addr_mode: AddressMode::AbsoluteX,
bytes: 3,
},
STZ_DX => OpcodeData {
code: 116,
name: "STZ",
addr_mode: AddressMode::DirectX,
bytes: 2,
},
TAX => OpcodeData {
code: 170,
name: "TAX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TAY => OpcodeData {
code: 168,
name: "TAY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TCD => OpcodeData {
code: 91,
name: "TCD",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TCS => OpcodeData {
code: 27,
name: "TCS",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TDC => OpcodeData {
code: 123,
name: "TDC",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TSC => OpcodeData {
code: 59,
name: "TSC",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TSX => OpcodeData {
code: 186,
name: "TSX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TXA => OpcodeData {
code: 138,
name: "TXA",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TXS => OpcodeData {
code: 154,
name: "TXS",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TXY => OpcodeData {
code: 155,
name: "TXY",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TYA => OpcodeData {
code: 152,
name: "TYA",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TYX => OpcodeData {
code: 187,
name: "TYX",
addr_mode: AddressMode::Implied,
bytes: 1,
},
TRB_A => OpcodeData {
code: 28,
name: "TRB",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
TRB_D => OpcodeData {
code: 20,
name: "TRB",
addr_mode: AddressMode::Direct,
bytes: 2,
},
TSB_A => OpcodeData {
code: 12,
name: "TSB",
addr_mode: AddressMode::Absolute,
bytes: 3,
},
TSB_D => OpcodeData {
code: 4,
name: "TSB",
addr_mode: AddressMode::Direct,
bytes: 2,
},
WAI => OpcodeData {
code: 203,
name: "WAI",
addr_mode: AddressMode::Implied,
bytes: 1,
},
WDM => OpcodeData {
code: 66,
name: "WDM",
addr_mode: AddressMode::Implied,
bytes: 2,
},
XBA => OpcodeData {
code: 235,
name: "XBA",
addr_mode: AddressMode::Implied,
bytes: 1,
},
XCE => OpcodeData {
code: 251,
name: "XCE",
addr_mode: AddressMode::Implied,
bytes: 1,
},
_ => panic!(
"Invalid opcode {:02X} passed to opcode_data. This should never happen",
opcode
),
}
}