refactor cpu decoder

This commit is contained in:
2023-12-30 16:32:31 -05:00
parent 9727a753d1
commit 1d08fbe19f

View File

@@ -1,5 +1,5 @@
extern crate snes_core;
use snes_core::emulator::Emulator;
use snes_core::{emulator::Emulator, cpu::instructions::mapper::map_opcode_to_instruction};
pub struct CPUDisassembler {
_history_limit: usize,
@@ -9,406 +9,7 @@ pub struct CPUDisassembler {
impl CPUDisassembler {
pub fn get_next_instruction(emulator: &Emulator) -> String {
let opcode = emulator.bus.read_external(emulator.cpu.registers.get_pc_address());
let is_cpu_16bit = emulator.cpu.registers.is_16bit_mode();
let is_index_16bit = emulator.cpu.registers.is_16bit_index();
let next_byte = emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 1);
let next_second_byte = emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 2);
let next_third_byte = emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 3);
let next_word = {
(emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 1) as u16) |
((emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 2) as u16) << 8)
};
let next_word_long = {
(emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 1) as u32) |
((emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 2) as u32) << 8) |
((emulator.bus.read_external(emulator.cpu.registers.get_pc_address() + 3) as u32) << 16)
};
match opcode {
// ADC
0x69 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | ADC #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | ADC #${:02X}", opcode, next_byte, next_byte),
},
0x6D => format!("{:02X} {:02X} {:02X} __ | ADC ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x6F => format!("{:02X} {:02X} {:02X} {:02X} | ADC ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x65 => format!("{:02X} {:02X} __ __ | ADC ${:02X} | dp", opcode, next_byte, next_byte),
0x72 => format!("{:02X} {:02X} __ __ | ADC (${:02X})", opcode, next_byte, next_byte),
0x67 => format!("{:02X} {:02X} __ __ | ADC [${:02X}]", opcode, next_byte, next_byte),
0x7D => format!("{:02X} {:02X} {:02X} __ | ADC ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x7F => format!("{:02X} {:02X} {:02X} {:02X} | ADC ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x79 => format!("{:02X} {:02X} {:02X} __ | ADC ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0x75 => format!("{:02X} {:02X} __ __ | ADC ${:02X}, X | dp", opcode, next_byte, next_byte),
0x61 => format!("{:02X} {:02X} __ __ | ADC (${:02X}, X) | dp", opcode, next_byte, next_byte),
0x71 => format!("{:02X} {:02X} __ __ | ADC (${:02X}), Y | dp", opcode, next_byte, next_byte),
0x77 => format!("{:02X} {:02X} __ __ | ADC [${:02X}], Y | dp", opcode, next_byte, next_byte),
0x63 => format!("{:02X} {:02X} __ __ | ADC {:02X}, S | sr", opcode, next_byte, next_byte),
0x73 => format!("{:02X} {:02X} __ __ | ADC ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// AND
0x29 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | AND #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | AND #${:02X}", opcode, next_byte, next_byte),
},
0x2D => format!("{:02X} {:02X} {:02X} __ | AND ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x2F => format!("{:02X} {:02X} {:02X} {:02X} | AND ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x25 => format!("{:02X} {:02X} __ __ | AND ${:02X} | dp", opcode, next_byte, next_byte),
0x32 => format!("{:02X} {:02X} __ __ | AND (${:02X})", opcode, next_byte, next_byte),
0x27 => format!("{:02X} {:02X} __ __ | AND [${:02X}]", opcode, next_byte, next_byte),
0x3D => format!("{:02X} {:02X} {:02X} __ | AND ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x3F => format!("{:02X} {:02X} {:02X} {:02X} | AND ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x39 => format!("{:02X} {:02X} {:02X} __ | AND ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0x35 => format!("{:02X} {:02X} __ __ | AND ${:02X}, X | dp", opcode, next_byte, next_byte),
0x21 => format!("{:02X} {:02X} __ __ | AND (${:02X}, X) | dp", opcode, next_byte, next_byte),
0x31 => format!("{:02X} {:02X} __ __ | AND (${:02X}), Y | dp", opcode, next_byte, next_byte),
0x37 => format!("{:02X} {:02X} __ __ | AND [${:02X}], Y | dp", opcode, next_byte, next_byte),
0x23 => format!("{:02X} {:02X} __ __ | AND {:02X}, S | sr", opcode, next_byte, next_byte),
0x33 => format!("{:02X} {:02X} __ __ | AND ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// ASL
0x0A => format!("{:02X} __ __ __ | ASL A", opcode),
0x0E => format!("{:02X} {:02X} {:02X} __ | ASL ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x06 => format!("{:02X} {:02X} __ __ | ASL ${:02X} | dp", opcode, next_byte, next_byte),
0x1E => format!("{:02X} {:02X} {:02X} __ | ASL ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x16 => format!("{:02X} {:02X} __ __ | ASL ${:02X}, X | dp", opcode, next_byte, next_byte),
// BCC
0x90 => format!("{:02X} {:02X} __ __ | BCC ${:02X}", opcode, next_byte, next_byte),
// BCS
0xB0 => format!("{:02X} {:02X} __ __ | BCS ${:02X}", opcode, next_byte, next_byte),
// BEQ
0xF0 => format!("{:02X} {:02X} __ __ | BEQ ${:02X}", opcode, next_byte, next_byte),
// BNE
0xD0 => format!("{:02X} {:02X} __ __ | BNE ${:02X}", opcode, next_byte, next_byte),
// BMI
0x30 => format!("{:02X} {:02X} __ __ | BMI ${:02X}", opcode, next_byte, next_byte),
// BPL
0x10 => format!("{:02X} {:02X} __ __ | BPL ${:02X}", opcode, next_byte, next_byte),
// BRA
0x80 => format!("{:02X} {:02X} __ __ | BRA ${:02X}", opcode, next_byte, next_byte),
// BRK
0x00 => format!("{:02X} __ __ __ | BRK", opcode),
// BRL
0x82 => format!("{:02X} {:02X} {:02X} __ | BRL ${:04X}", opcode, next_byte, next_second_byte, next_word),
// BVC
0x50 => format!("{:02X} {:02X} {:02X} __ | BVC ${:04X}", opcode, next_byte, next_second_byte, next_word),
// BVS
0x70 => format!("{:02X} {:02X} {:02X} __ | BVS ${:04X}", opcode, next_byte, next_second_byte, next_word),
// BIT
0x89 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | BIT #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | BIT #${:02X}", opcode, next_byte, next_byte),
},
0x2C => format!("{:02X} {:02X} {:02X} __ | BIT ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x24 => format!("{:02X} {:02X} __ __ | BIT ${:02X} | dp", opcode, next_byte, next_byte),
0x3C => format!("{:02X} {:02X} {:02X} __ | ADC ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x34 => format!("{:02X} {:02X} __ __ | AND ${:02X}, X | dp", opcode, next_byte, next_byte),
// CLC
0x18 => format!("{:02X} __ __ __ | CLC", opcode),
// CLD
0xD8 => format!("{:02X} __ __ __ | CLD", opcode),
// CLI
0x58 => format!("{:02X} __ __ __ | CLI", opcode),
// CLV
0xB8 => format!("{:02X} __ __ __ | CLV", opcode),
// CMP
0xC9 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | CMP #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | CMP #${:02X}", opcode, next_byte, next_byte),
},
0xCD => format!("{:02X} {:02X} {:02X} __ | CMP ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xCF => format!("{:02X} {:02X} {:02X} {:02X} | CMP ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xC5 => format!("{:02X} {:02X} __ __ | CMP ${:02X} | dp", opcode, next_byte, next_byte),
0xD2 => format!("{:02X} {:02X} __ __ | CMP (${:02X})", opcode, next_byte, next_byte),
0xC7 => format!("{:02X} {:02X} __ __ | CMP [${:02X}]", opcode, next_byte, next_byte),
0xDD => format!("{:02X} {:02X} {:02X} __ | CMP ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xDF => format!("{:02X} {:02X} {:02X} {:02X} | CMP ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xD9 => format!("{:02X} {:02X} {:02X} __ | CMP ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0xD5 => format!("{:02X} {:02X} __ __ | CMP ${:02X}, X | dp", opcode, next_byte, next_byte),
0xC1 => format!("{:02X} {:02X} __ __ | CMP (${:02X}, X) | dp", opcode, next_byte, next_byte),
0xD1 => format!("{:02X} {:02X} __ __ | CMP (${:02X}), Y | dp", opcode, next_byte, next_byte),
0xD7 => format!("{:02X} {:02X} __ __ | CMP [${:02X}], Y | dp", opcode, next_byte, next_byte),
0xC3 => format!("{:02X} {:02X} __ __ | CMP {:02X}, S | sr", opcode, next_byte, next_byte),
0xD3 => format!("{:02X} {:02X} __ __ | CMP ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// COP
0x02 => match is_index_16bit {
true => format!("{:02X} {:02X} {:02X} __ | COP #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | COP #${:02X}", opcode, next_byte, next_byte),
},
// CPX
0xE0 => match is_index_16bit {
true => format!("{:02X} {:02X} {:02X} __ | CPX #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | CPX #${:02X}", opcode, next_byte, next_byte),
},
0xEC => format!("{:02X} {:02X} {:02X} __ | CPX ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xE4 => format!("{:02X} {:02X} __ __ | CPX ${:02X} | dp", opcode, next_byte, next_byte),
// CPY
0xC0 => match is_index_16bit {
true => format!("{:02X} {:02X} {:02X} __ | CPY #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | CPY #${:02X}", opcode, next_byte, next_byte),
},
0xCC => format!("{:02X} {:02X} {:02X} __ | CPY ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xC4 => format!("{:02X} {:02X} __ __ | CPY ${:02X} | dp", opcode, next_byte, next_byte),
// DEC
0x3A => format!("{:02X} __ __ __ | DEC A", opcode),
0xCE => format!("{:02X} {:02X} {:02X} __ | DEC ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xC6 => format!("{:02X} {:02X} __ __ | DEC ${:02X} | dp", opcode, next_byte, next_byte),
0xDE => format!("{:02X} {:02X} {:02X} __ | DEC ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xD6 => format!("{:02X} {:02X} __ __ | DEC ${:02X}, X | dp", opcode, next_byte, next_byte),
// DEX
0xCA => format!("{:02X} __ __ __ | DEX", opcode),
// DEY
0x88 => format!("{:02X} __ __ __ | DEY", opcode),
// EOR
0x49 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | EOR #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | EOR #${:02X}", opcode, next_byte, next_byte),
},
0x4D => format!("{:02X} {:02X} {:02X} __ | EOR ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x4F => format!("{:02X} {:02X} {:02X} {:02X} | EOR ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x45 => format!("{:02X} {:02X} __ __ | EOR ${:02X} | dp", opcode, next_byte, next_byte),
0x52 => format!("{:02X} {:02X} __ __ | EOR (${:02X})", opcode, next_byte, next_byte),
0x47 => format!("{:02X} {:02X} __ __ | EOR [${:02X}]", opcode, next_byte, next_byte),
0x5D => format!("{:02X} {:02X} {:02X} __ | EOR ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x5F => format!("{:02X} {:02X} {:02X} {:02X} | EOR ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x59 => format!("{:02X} {:02X} {:02X} __ | EOR ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0x55 => format!("{:02X} {:02X} __ __ | EOR ${:02X}, X | dp", opcode, next_byte, next_byte),
0x41 => format!("{:02X} {:02X} __ __ | EOR (${:02X}, X) | dp", opcode, next_byte, next_byte),
0x51 => format!("{:02X} {:02X} __ __ | EOR (${:02X}), Y | dp", opcode, next_byte, next_byte),
0x57 => format!("{:02X} {:02X} __ __ | EOR [${:02X}], Y | dp", opcode, next_byte, next_byte),
0x43 => format!("{:02X} {:02X} __ __ | EOR {:02X}, S | sr", opcode, next_byte, next_byte),
0x53 => format!("{:02X} {:02X} __ __ | EOR ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// INC
0x1A => format!("{:02X} __ __ __ | INC A", opcode),
0xEE => format!("{:02X} {:02X} {:02X} __ | INC ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xE6 => format!("{:02X} {:02X} __ __ | INC ${:02X} | dp", opcode, next_byte, next_byte),
0xFE => format!("{:02X} {:02X} {:02X} __ | INC ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xF6 => format!("{:02X} {:02X} __ __ | INC ${:02X}, X | dp", opcode, next_byte, next_byte),
// INX
0xE8 => format!("{:02X} __ __ __ | INX", opcode),
// INY
0xC8 => format!("{:02X} __ __ __ | INY", opcode),
// JMP
0x4C => format!("{:02X} {:02X} {:02X} __ | JMP ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x6C => format!("{:02X} {:02X} {:02X} __ | JMP (${:04X})", opcode, next_byte, next_second_byte, next_word),
0x7C => format!("{:02X} {:02X} {:02X} __ | JMP (${:04X}, X)", opcode, next_byte, next_second_byte, next_word),
0x5C => format!("{:02X} {:02X} {:02X} {:02X} | JMP ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xDC => format!("{:02X} {:02X} {:02X} __ | JMP [${:04X}]", opcode, next_byte, next_second_byte, next_word),
// JSR
0x20 => format!("{:02X} {:02X} {:02X} __ | JSR ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xFC => format!("{:02X} {:02X} {:02X} __ | JSR (${:04X}, X)", opcode, next_byte, next_second_byte, next_word),
0x22 => format!("{:02X} {:02X} {:02X} {:02X} | JSR ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
// LDA
0xA9 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | LDA #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | LDA #${:02X}", opcode, next_byte, next_byte),
},
0xAD => format!("{:02X} {:02X} {:02X} __ | LDA ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xAF => format!("{:02X} {:02X} {:02X} {:02X} | LDA ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xA5 => format!("{:02X} {:02X} __ __ | LDA ${:02X} | dp", opcode, next_byte, next_byte),
0xB2 => format!("{:02X} {:02X} __ __ | LDA (${:02X})", opcode, next_byte, next_byte),
0xA7 => format!("{:02X} {:02X} __ __ | LDA [${:02X}]", opcode, next_byte, next_byte),
0xBD => format!("{:02X} {:02X} {:02X} __ | LDA ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xBF => format!("{:02X} {:02X} {:02X} {:02X} | LDA ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xB9 => format!("{:02X} {:02X} {:02X} __ | LDA ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0xB5 => format!("{:02X} {:02X} __ __ | LDA ${:02X}, X | dp", opcode, next_byte, next_byte),
0xA1 => format!("{:02X} {:02X} __ __ | LDA (${:02X}, X) | dp", opcode, next_byte, next_byte),
0xB1 => format!("{:02X} {:02X} __ __ | LDA (${:02X}), Y | dp", opcode, next_byte, next_byte),
0xB7 => format!("{:02X} {:02X} __ __ | LDA [${:02X}], Y | dp", opcode, next_byte, next_byte),
0xA3 => format!("{:02X} {:02X} __ __ | LDA {:02X}, S | sr", opcode, next_byte, next_byte),
0xB3 => format!("{:02X} {:02X} __ __ | LDA ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// LDX
0xA2 => match is_index_16bit {
true => format!("{:02X} {:02X} {:02X} __ | LDX #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | LDX #${:02X}", opcode, next_byte, next_byte),
},
0xAE => format!("{:02X} {:02X} {:02X} __ | LDX ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xA6 => format!("{:02X} {:02X} __ __ | LDX ${:02X} | dp", opcode, next_byte, next_byte),
0xBE => format!("{:02X} {:02X} {:02X} __ | LDX ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0xB6 => format!("{:02X} {:02X} __ __ | LDX ${:02X}, Y | dp", opcode, next_byte, next_byte),
// LDY
0xA0 => match is_index_16bit {
true => format!("{:02X} {:02X} {:02X} __ | LDY #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | LDY #${:02X}", opcode, next_byte, next_byte),
},
0xAC => format!("{:02X} {:02X} {:02X} __ | LDY ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xA4 => format!("{:02X} {:02X} __ __ | LDY ${:02X} | dp", opcode, next_byte, next_byte),
0xB4 => format!("{:02X} {:02X} {:02X} __ | LDY ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xBC => format!("{:02X} {:02X} __ __ | LDY ${:02X}, X | dp", opcode, next_byte, next_byte),
// LSR
0x4A => format!("{:02X} __ __ __ | LSR A", opcode),
0x4E => format!("{:02X} {:02X} {:02X} __ | LSR ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x46 => format!("{:02X} {:02X} __ __ | LSR ${:02X} | dp", opcode, next_byte, next_byte),
0x5E => format!("{:02X} {:02X} {:02X} __ | LSR ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x56 => format!("{:02X} {:02X} __ __ | LSR ${:02X}, X | dp", opcode, next_byte, next_byte),
// MVN
0x54 => format!("{:02X} {:02X} {:02X} __ | MVN ${:02X},${:02X}", opcode, next_byte, next_second_byte, next_second_byte, next_byte),
// MVP
0x44 => format!("{:02X} {:02X} {:02X} __ | MVP ${:02X},${:02X}", opcode, next_byte, next_second_byte, next_second_byte, next_byte),
// NOP
0xEA => format!("{:02X} __ __ __ | NOP", opcode),
// ORA
0x09 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | ORA #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | ORA #${:02X}", opcode, next_byte, next_byte),
},
0x0D => format!("{:02X} {:02X} {:02X} __ | ORA ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x0F => format!("{:02X} {:02X} {:02X} {:02X} | ORA ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x05 => format!("{:02X} {:02X} __ __ | ORA ${:02X} | dp", opcode, next_byte, next_byte),
0x12 => format!("{:02X} {:02X} __ __ | ORA (${:02X})", opcode, next_byte, next_byte),
0x07 => format!("{:02X} {:02X} __ __ | ORA [${:02X}]", opcode, next_byte, next_byte),
0x1D => format!("{:02X} {:02X} {:02X} __ | ORA ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x1F => format!("{:02X} {:02X} {:02X} {:02X} | ORA ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x19 => format!("{:02X} {:02X} {:02X} __ | ORA ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0x15 => format!("{:02X} {:02X} __ __ | ORA ${:02X}, X | dp", opcode, next_byte, next_byte),
0x01 => format!("{:02X} {:02X} __ __ | ORA (${:02X}, X) | dp", opcode, next_byte, next_byte),
0x11 => format!("{:02X} {:02X} __ __ | ORA (${:02X}), Y | dp", opcode, next_byte, next_byte),
0x17 => format!("{:02X} {:02X} __ __ | ORA [${:02X}], Y | dp", opcode, next_byte, next_byte),
0x03 => format!("{:02X} {:02X} __ __ | ORA {:02X}, S | sr", opcode, next_byte, next_byte),
0x13 => format!("{:02X} {:02X} __ __ | ORA ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// PEA
0xF4 => format!("{:02X} {:02X} {:02X} __ | PEA ${:04X}", opcode, next_byte, next_second_byte, next_word),
// PEI
0xD4 => format!("{:02X} {:02X} __ __ | PEI (${:02X}) | dp", opcode, next_byte, next_byte),
// PER
0x62 => format!("{:02X} {:02X} {:02X} __ | PER ${:04X}", opcode, next_byte, next_second_byte, next_word),
// PHA
0x48 => format!("{:02X} __ __ __ | PHA", opcode),
// PHB
0x8B => format!("{:02X} __ __ __ | PHB", opcode),
// PHD
0x0B => format!("{:02X} __ __ __ | PHD", opcode),
// PHK
0x4B => format!("{:02X} __ __ __ | PHK", opcode),
// PHP
0x08 => format!("{:02X} __ __ __ | PHP", opcode),
// PHX
0xDA => format!("{:02X} __ __ __ | PHX", opcode),
// PHY
0x5A => format!("{:02X} __ __ __ | PHY", opcode),
// PLA
0x68 => format!("{:02X} __ __ __ | PLA", opcode),
// PLB
0xAB => format!("{:02X} __ __ __ | PLB", opcode),
// PLD
0x2B => format!("{:02X} __ __ __ | PLD", opcode),
// PLP
0x28 => format!("{:02X} __ __ __ | PLP", opcode),
// PLX
0xFA => format!("{:02X} __ __ __ | PLX", opcode),
// PLY
0x7A => format!("{:02X} __ __ __ | PLY", opcode),
// REP
0xC2 => format!("{:02X} {:02X} __ __ | REP #${:02X}", opcode, next_byte, next_byte),
// ROL
0x2A => format!("{:02X} __ __ __ | ROL A", opcode),
0x2E => format!("{:02X} {:02X} {:02X} __ | ROL ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x26 => format!("{:02X} {:02X} __ __ | ROL ${:02X} | dp", opcode, next_byte, next_byte),
0x3E => format!("{:02X} {:02X} {:02X} __ | ROL ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x36 => format!("{:02X} {:02X} __ __ | ROL ${:02X}, X | dp", opcode, next_byte, next_byte),
// ROR
0x6A => format!("{:02X} __ __ __ | ROR A", opcode),
0x6E => format!("{:02X} {:02X} {:02X} __ | ROR ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x66 => format!("{:02X} {:02X} __ __ | ROR ${:02X} | dp", opcode, next_byte, next_byte),
0x7E => format!("{:02X} {:02X} {:02X} __ | ROR ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x76 => format!("{:02X} {:02X} __ __ | ROR ${:02X}, X | dp", opcode, next_byte, next_byte),
// RTI
0x40 => format!("{:02X} __ __ __ | RTI", opcode),
// RTL
0x6B => format!("{:02X} __ __ __ | RTL", opcode),
// RTS
0x60 => format!("{:02X} __ __ __ | RTS", opcode),
// SBC
0xE9 => match is_cpu_16bit {
true => format!("{:02X} {:02X} {:02X} __ | SBC #${:04X}", opcode, next_byte, next_second_byte, next_word),
false => format!("{:02X} {:02X} __ __ | SBC #${:02X}", opcode, next_byte, next_byte),
},
0xED => format!("{:02X} {:02X} {:02X} __ | SBC ${:04X}", opcode, next_byte, next_second_byte, next_word),
0xEF => format!("{:02X} {:02X} {:02X} {:02X} | SBC ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xE5 => format!("{:02X} {:02X} __ __ | SBC ${:02X} | dp", opcode, next_byte, next_byte),
0xF2 => format!("{:02X} {:02X} __ __ | SBC (${:02X})", opcode, next_byte, next_byte),
0xE7 => format!("{:02X} {:02X} __ __ | SBC [${:02X}]", opcode, next_byte, next_byte),
0xFD => format!("{:02X} {:02X} {:02X} __ | SBC ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0xFF => format!("{:02X} {:02X} {:02X} {:02X} | SBC ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0xF9 => format!("{:02X} {:02X} {:02X} __ | SBC ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0xF5 => format!("{:02X} {:02X} __ __ | SBC ${:02X}, X | dp", opcode, next_byte, next_byte),
0xE1 => format!("{:02X} {:02X} __ __ | SBC (${:02X}, X) | dp", opcode, next_byte, next_byte),
0xF1 => format!("{:02X} {:02X} __ __ | SBC (${:02X}), Y | dp", opcode, next_byte, next_byte),
0xF7 => format!("{:02X} {:02X} __ __ | SBC [${:02X}], Y | dp", opcode, next_byte, next_byte),
0xE3 => format!("{:02X} {:02X} __ __ | SBC {:02X}, S | sr", opcode, next_byte, next_byte),
0xF3 => format!("{:02X} {:02X} __ __ | SBC ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// SEC
0x38 => format!("{:02X} __ __ __ | SEC", opcode),
// SED
0xF8 => format!("{:02X} __ __ __ | SED", opcode),
// SEI
0x78 => format!("{:02X} __ __ __ | SEI", opcode),
// SEP
0xE2 => format!("{:02X} {:02X} __ __ | SEP #${:02X}", opcode, next_byte, next_byte),
// STA
0x8D => format!("{:02X} {:02X} {:02X} __ | STA ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x8F => format!("{:02X} {:02X} {:02X} {:02X} | STA ${:06X}", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x85 => format!("{:02X} {:02X} __ __ | STA ${:02X} | dp", opcode, next_byte, next_byte),
0x92 => format!("{:02X} {:02X} __ __ | STA (${:02X})", opcode, next_byte, next_byte),
0x87 => format!("{:02X} {:02X} __ __ | STA [${:02X}]", opcode, next_byte, next_byte),
0x9D => format!("{:02X} {:02X} {:02X} __ | STA ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x9F => format!("{:02X} {:02X} {:02X} {:02X} | STA ${:06X}, X", opcode, next_byte, next_second_byte, next_third_byte, next_word_long),
0x99 => format!("{:02X} {:02X} {:02X} __ | STA ${:04X}, Y", opcode, next_byte, next_second_byte, next_word),
0x95 => format!("{:02X} {:02X} __ __ | STA ${:02X}, X | dp", opcode, next_byte, next_byte),
0x81 => format!("{:02X} {:02X} __ __ | STA (${:02X}, X) | dp", opcode, next_byte, next_byte),
0x91 => format!("{:02X} {:02X} __ __ | STA (${:02X}), Y | dp", opcode, next_byte, next_byte),
0x97 => format!("{:02X} {:02X} __ __ | STA [${:02X}], Y | dp", opcode, next_byte, next_byte),
0x83 => format!("{:02X} {:02X} __ __ | STA {:02X}, S | sr", opcode, next_byte, next_byte),
0x93 => format!("{:02X} {:02X} __ __ | STA ({:02X}, S), Y | sr", opcode, next_byte, next_byte),
// STP
0xDB => format!("{:02X} __ __ __ | STP", opcode),
// STX
0x8E => format!("{:02X} {:02X} {:02X} __ | STX ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x86 => format!("{:02X} {:02X} __ __ | STX ${:02X} | dp", opcode, next_byte, next_byte),
0x96 => format!("{:02X} {:02X} __ __ | STX ${:02X}, Y | dp", opcode, next_byte, next_byte),
// STY
0x8C => format!("{:02X} {:02X} {:02X} __ | STY ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x84 => format!("{:02X} {:02X} __ __ | STY ${:02X} | dp", opcode, next_byte, next_byte),
0x94 => format!("{:02X} {:02X} __ __ | STY ${:02X}, X | dp", opcode, next_byte, next_byte),
// STZ
0x9C => format!("{:02X} {:02X} {:02X} __ | STZ ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x64 => format!("{:02X} {:02X} __ __ | STZ ${:02X} | dp", opcode, next_byte, next_byte),
0x9E => format!("{:02X} {:02X} {:02X} __ | STZ ${:04X}, X", opcode, next_byte, next_second_byte, next_word),
0x74 => format!("{:02X} {:02X} __ __ | STZ ${:02X}, X | dp", opcode, next_byte, next_byte),
// TAX
0xAA => format!("{:02X} __ __ __ | TAX", opcode),
// TAY
0xA8 => format!("{:02X} __ __ __ | TAY", opcode),
// TCD
0x5B => format!("{:02X} __ __ __ | TCD", opcode),
// TCS
0x1B => format!("{:02X} __ __ __ | TCS", opcode),
// TCD
0x7B => format!("{:02X} __ __ __ | TDC", opcode),
// TRB
0x1C => format!("{:02X} {:02X} {:02X} __ | TRB ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x14 => format!("{:02X} {:02X} __ __ | TRB ${:02X} | dp", opcode, next_byte, next_byte),
// TSB
0x0C => format!("{:02X} {:02X} {:02X} __ | TSB ${:04X}", opcode, next_byte, next_second_byte, next_word),
0x04 => format!("{:02X} {:02X} __ __ | TSB ${:02X} | dp", opcode, next_byte, next_byte),
// TSC
0x3B => format!("{:02X} __ __ __ | TSC", opcode),
// TSX
0xBA => format!("{:02X} __ __ __ | TSX", opcode),
// TXA
0x8A => format!("{:02X} __ __ __ | TXA", opcode),
// TXS
0x9A => format!("{:02X} __ __ __ | TXS", opcode),
// TXY
0x9B => format!("{:02X} __ __ __ | TXY", opcode),
// TYA
0x98 => format!("{:02X} __ __ __ | TYA", opcode),
// TYX
0xBB => format!("{:02X} __ __ __ | TYX", opcode),
// WAI
0xCB => format!("{:02X} __ __ __ | WAI", opcode),
// WDM
0x42 => format!("{:02X} __ __ __ | WDM", opcode),
// XBA
0xEB => format!("{:02X} __ __ __ | XBA", opcode),
// XCE
0xFB => format!("{:02X} __ __ __ | XCE", opcode),
}
let instruction = map_opcode_to_instruction(opcode);
instruction.mnemonic(&emulator.cpu.registers, &emulator.bus, opcode)
}
}