From 7f9e51d0d6e0d14b70bf13f639c09d01d4618c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hein=20Andre=20Gr=C3=B8nnestad?= Date: Tue, 8 Oct 2019 21:31:16 +0200 Subject: [PATCH] #8 More work on the disassembler --- MicroProcessor/Cpu6502/OpCode.cs | 44 +++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/MicroProcessor/Cpu6502/OpCode.cs b/MicroProcessor/Cpu6502/OpCode.cs index fa2b79b..00914dc 100644 --- a/MicroProcessor/Cpu6502/OpCode.cs +++ b/MicroProcessor/Cpu6502/OpCode.cs @@ -1,6 +1,7 @@ using MicroProcessor.Cpu6502.Attributes; using System; using System.Collections.Generic; +using System.Linq; namespace MicroProcessor.Cpu6502 { @@ -12,53 +13,83 @@ public class OpCode : OpCodeDefinitionAttribute { public Action GetAddress { get; set; } public Action Run { get; set; } + public OpCode() : base() { } + public override string ToString() { - var s = $"{OpCodeAddress:X4} {Name}"; + return ToString(); + } + + public string ToString(bool showComments = false) { + var operands = $"{string.Join(" ", Operands.Select(x => $"{x:X2}"))}"; + var s = $"{OpCodeAddress:X4}\t{Code:X2}\t{operands.PadRight(5, ' ')}\t{Name}"; switch (AddressingMode) { case Enums.AddressingMode.Accumulator: - return $"{s} A"; + s = $"{s} A"; + break; case Enums.AddressingMode.Implied: - return $"{s}"; + s = $"{s}"; + break; case Enums.AddressingMode.Absolute: - return $"{s} 0x{Operands[1]:X2}{Operands[0]:X2}"; + s = $"{s} ${Operands[1]:X2}{Operands[0]:X2}"; + break; case Enums.AddressingMode.AbsoluteX: - return $"{s} 0x{Operands[1]:X2}{Operands[0]:X2}, X"; + s = $"{s} ${Operands[1]:X2}{Operands[0]:X2}, X"; + break; case Enums.AddressingMode.AbsoluteY: - return $"{s} 0x{Operands[1]:X2}{Operands[0]:X2}, Y"; + s = $"{s} ${Operands[1]:X2}{Operands[0]:X2}, Y"; + break; case Enums.AddressingMode.Immediate: + s = $"{s} #${Operands[0]:X2}"; break; case Enums.AddressingMode.Indirect: + s = $"{s} (${Operands[1]:X2}{Operands[0]:X2})"; break; + case Enums.AddressingMode.XIndirect: + s = $"{s} (${Operands[0]:X2}, X)"; break; + case Enums.AddressingMode.IndirectY: + s = $"{s} (${Operands[0]:X2}), Y"; break; + case Enums.AddressingMode.Relative: + s = $"{s} ${OpCodeAddress + Length + (Operands[0]):X2}"; break; + case Enums.AddressingMode.Zeropage: + s = $"{s} ${Operands[0]:X2}"; break; + case Enums.AddressingMode.ZeropageX: + s = $"{s} ${Operands[0]:X2}, X"; break; + case Enums.AddressingMode.ZeropageY: + s = $"{s} ${Operands[0]:X2}, Y"; break; + default: break; } + if (showComments) s = $"{s.PadRight(31, ' ')}\t// {Description}"; + return s; } + public static OpCode FromOpCodeDefinitionAttribute(Action action, Action getAddress, OpCodeDefinitionAttribute a) { return new OpCode { GetAddress = getAddress, @@ -72,6 +103,7 @@ public static OpCode FromOpCodeDefinitionAttribute(Action action, Action getAddr Name = a.Name }; } + } }