This commit is contained in:
Trevor Merritt 2025-06-23 09:18:37 -04:00
parent a550fe40b9
commit 87ae4e7890
6 changed files with 72 additions and 53 deletions

View File

@ -3,6 +3,7 @@ use crate::mos6502cpu::Mos6502Cpu;
#[derive(PartialEq, Debug)]
pub enum AddressMode {
Implied,
Accumulator,
Immediate(u8),
ZeroPage(u8),

View File

@ -1,8 +1,10 @@
use std::fmt::format;
use log::debug;
use crate::address_mode::AddressMode;
use crate::address_mode::AddressMode::*;
use crate::constants::*;
use crate::instruction::Instruction::*;
use crate::instruction_stringify::InstructionStringify;
use crate::isa::microcode_steps::MicrocodeStep;
use crate::isa::microcode_steps::MicrocodeStep::{ALUAddC, ReadRegisterA};
use crate::mos6502cpu::Mos6502Cpu;
@ -1018,6 +1020,7 @@ pub enum Instruction {
TYA,
}
impl Instruction {
pub fn from_bytes(decode_from: Vec<u8>) -> Instruction {
let id_byte = decode_from[0];
@ -1318,64 +1321,69 @@ impl Instruction {
}
}
pub fn to_string(&self) -> String {
match self {
Instruction::ADC(mode) => {
match mode {
AddressMode::Immediate(value) => {
String::from(format!("ADC #${value:02x}"))
Instruction::ADC(newmode) => {
let prefix = "ADC";
match newmode {
Immediate(value) => {
InstructionStringify::format(Immediate(*value), prefix)
}
AddressMode::ZeroPage(address) => {
String::from(format!("ADC ${address:02x}"))
ZeroPage(address) => {
InstructionStringify::format(ZeroPage(*address), prefix)
}
AddressMode::ZeroPageX(address) => {
String::from(format!("ADC ${address:02x},X"))
ZeroPageX(address) => {
InstructionStringify::format(ZeroPageX(*address), prefix)
}
AddressMode::Absolute(address) => {
String::from("TBD")
Absolute(address) => {
InstructionStringify::format(Absolute(*address), prefix)
}
AddressMode::AbsoluteX(_) => {
String::from("TBD")
AbsoluteX(offset) => {
InstructionStringify::format(AbsoluteX(*offset), prefix)
}
AddressMode::AbsoluteY(_) => {
String::from("TBD")
AbsoluteY(offset) => {
InstructionStringify::format(AbsoluteY(*offset), prefix)
}
AddressMode::IndirectX(_) => {
String::from("TBD")
IndirectX(value) => {
InstructionStringify::format(IndirectX(*value), prefix)
}
AddressMode::IndirectY(_) => {
String::from("TBD")
IndirectY(value) => {
InstructionStringify::format(IndirectY(*value), prefix)
}
_ => String::from("Invalid instruction")
}
}
Instruction::AND(mode) => {
match mode {
AddressMode::Immediate(_) => {
String::from("TBD")
Instruction::AND(newmode) => {
let prefix = "AND";
match newmode {
Immediate(value) => {
InstructionStringify::format(Immediate(*value), prefix)
}
AddressMode::ZeroPage(_) => {
String::from("TBD")
ZeroPage(address) => {
InstructionStringify::format(ZeroPage(*address), prefix)
}
AddressMode::ZeroPageX(_) => {
String::from("TBD")
ZeroPageX(address) => {
InstructionStringify::format(ZeroPageX(*address), prefix)
}
AddressMode::Absolute(_) => {
String::from("TBD")
Absolute(address) => {
InstructionStringify::format(Absolute(*address), prefix)
}
AddressMode::AbsoluteX(_) => {
String::from("TBD")
AbsoluteX(offset) => {
InstructionStringify::format(AbsoluteX(*offset), prefix)
}
AddressMode::AbsoluteY(_) => {
String::from("TBD")
AbsoluteY(offset) => {
InstructionStringify::format(AbsoluteY(*offset), prefix)
}
AddressMode::IndirectX(_) => {
String::from("TBD")
IndirectX(value) => {
InstructionStringify::format(IndirectX(*value), prefix)
}
AddressMode::IndirectY(_) => {
String::from("TBD")
IndirectY(value) => {
InstructionStringify::format(IndirectY(*value), prefix)
}
_ => { String::from("invalid Instruction") }
_ => String::from("Invalid instruction")
}
}
Instruction::ASL(_) => {

View File

@ -0,0 +1,21 @@
use crate::address_mode::AddressMode;
pub struct InstructionStringify {}
impl InstructionStringify {
pub fn format(mode: AddressMode, prefix: &str) -> String {
let suffix = match mode {
AddressMode::Implied => "",
AddressMode::Accumulator => "A",
AddressMode::Immediate(value) => &*format!("#${value:02x}"),
AddressMode::ZeroPage(value) => &*format!("${value:02x}"),
AddressMode::ZeroPageX(value) => &*format!("${value:02x},X"),
AddressMode::Absolute(offset) => &*format!("${offset:04x}"),
AddressMode::AbsoluteX(offset) => &*format!("${offset:04x},X"),
AddressMode::AbsoluteY(offset) => &*format!("${offset:04x},Y"),
AddressMode::IndirectX(value) => &*format!("(${value:02x},X)"),
AddressMode::IndirectY(value) => &*format!("(${value:02x}),Y")
};
format!("{} {}", prefix, suffix)
}
}

View File

@ -121,9 +121,9 @@ mod test {
];
for (bytes, instruction) in params {
let encoded = Encoder::encode(bytes);
assert_eq!(encoded, instruction.into());
}
// for (bytes, instruction) in params {
// let encoded = Encoder::encode(bytes);
// assert_eq!(encoded, instruction.into());
// }
}
}

View File

@ -4,3 +4,4 @@ pub mod instruction;
pub mod mos6502flags;
pub mod isa;
pub mod constants;
mod instruction_stringify;

View File

@ -84,15 +84,3 @@ impl Mos6502Flags {
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn default() {
let expected = Mos6502Flag::default();
assert_eq!(expected,
Mos6502Flag::default());
}
}