From c80017e0b622417ee5a57aad6b53f4e8c24c069e Mon Sep 17 00:00:00 2001 From: ThomasFok Date: Mon, 23 Jan 2023 11:59:49 +0000 Subject: [PATCH 1/5] Dump Command - Add raw binary and instruction set selection --- .../acx/command/DumpCommand.java | 83 +++++++++++++++---- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java index fd877b9..32ae1e0 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java @@ -32,13 +32,16 @@ import io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions; import io.github.applecommander.acx.converter.IntegerTypeConverter; import io.github.applecommander.disassembler.api.Disassembler; import io.github.applecommander.disassembler.api.Instruction; +import io.github.applecommander.disassembler.api.InstructionSet; import io.github.applecommander.disassembler.api.mos6502.InstructionSet6502; +import io.github.applecommander.disassembler.api.sweet16.InstructionSetSWEET16; +import io.github.applecommander.disassembler.api.switching6502.InstructionSet6502Switching; import picocli.CommandLine.ArgGroup; import picocli.CommandLine.Command; import picocli.CommandLine.Mixin; import picocli.CommandLine.Option; -@Command(name = "dump", description = "Dump a block or sector.") +@Command(name = "dump", description = "Dump a block or sector.", sortOptions = false) public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @ArgGroup(heading = "%nOutput Selection:%n") private OutputSelection output = new OutputSelection(); @@ -49,7 +52,11 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @Override public int handleCommand() throws Exception { byte[] data = options.coordinate.read(disk); - System.out.println(output.format(options, data)); + if (output.raw) { + System.out.write(data); + } else { + System.out.println(output.format(options, data)); + } return 0; } @@ -59,33 +66,36 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { return fn.apply(options, data); } - @Option(names = "--hex", description = "Hex dump.") + @Option(names = "--hex", description = "Hex dump. (Default)") public void selectHexDump(boolean flag) { fn = this::formatHexDump; } - + @Option(names = "--disassembly", description = "Disassembly.") public void selectDisassembly(boolean flag) { fn = this::formatDisassembly; } + + @Option(names = "--raw", description = "Raw Binary dump.") + public boolean raw = false; public String formatHexDump(Options options, byte[] data) { - return AppleUtil.getHexDump(options.address, data); + return AppleUtil.getHexDump(data); } public String formatDisassembly(Options options, byte[] data) { // If the offset is given, use that. If not, use 0 except for the boot sector and then use 1. - int calculatedOffset = options.offset.orElse(options.coordinate.includesBootSector() ? 1 : 0); + int calculatedOffset = options.disassemblerOptions.offset.orElse(options.coordinate.includesBootSector() ? 1 : 0); return Disassembler.with(data) - .startingAddress(options.address) + .startingAddress(options.disassemblerOptions.address) .bytesToSkip(calculatedOffset) - .use(InstructionSet6502.for6502()) + .use(options.disassemblerOptions.instructionSet.get()) .decode() .stream() .map(this::formatInstruction) .collect(Collectors.joining()); - } + private String formatInstruction(Instruction instruction) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); @@ -106,14 +116,51 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { public static class Options { @ArgGroup(multiplicity = "1", heading = "%nCoordinate Selection:%n") - private CoordinateSelection coordinate = new CoordinateSelection(); - - @Option(names = { "-a", "--address" }, converter = IntegerTypeConverter.class, - description = "Starting address.") - private int address = 0x800; - - @Option(names = { "-o", "--offset" }, converter = IntegerTypeConverter.class, - description = "Number of bytes to skip into file before disassembling.") - private Optional offset = Optional.empty(); + private CoordinateSelection coordinate = new CoordinateSelection(); + + @ArgGroup(heading = "%nDisassembler Options:%n", exclusive = false) + private DisassemblerOptions disassemblerOptions = new DisassemblerOptions(); } + + public static class DisassemblerOptions { + @Option(names = {"-a", "--address"}, converter = IntegerTypeConverter.class, + description = "Starting Address.") + private int address = 0x800; + + @Option(names = {"-o", "--offset"}, converter = IntegerTypeConverter.class, + description = "Number of bytes to skip into file before disassembling.") + private Optional offset = Optional.empty(); + + @ArgGroup(multiplicity = "0..1") + private InstructionSetSelection instructionSet = new InstructionSetSelection(); + + public static class InstructionSetSelection { + private InstructionSet instructionSet = InstructionSet6502.for6502(); + + public InstructionSet get() { + return this.instructionSet; + } + + @Option(names = "--6502", description = "MOS 6502. (Default)") + public void select6502(boolean flag) { + this.instructionSet = InstructionSet6502.for6502(); + } + @Option(names = { "--65C02" }, description = "WDC 65C02.") + public void select65C02(boolean flag) { + this.instructionSet = InstructionSet6502.for65C02(); + } + @Option(names = { "--6502X" }, description = "MOS 6502 + 'illegal' instructions.") + public void select6502X(boolean flag) { + this.instructionSet = InstructionSet6502.for6502withIllegalInstructions(); + } + @Option(names = { "--SWEET16" }, description = "SWEET16.") + public void selectSWEET16(boolean flag) { + this.instructionSet = InstructionSetSWEET16.forSWEET16(); + } + @Option(names = { "--6502S" }, description = "MOS 6502 with SWEET16 switching.") + public void select6502Switching(boolean flag) { + this.instructionSet = InstructionSet6502Switching.withSwitching(); + } + } + } } From bde56f440694c1e35b478c876256a9c3a25b24a1 Mon Sep 17 00:00:00 2001 From: ThomasFok Date: Mon, 23 Jan 2023 12:07:33 +0000 Subject: [PATCH 2/5] source code formatting --- .../acx/command/DumpCommand.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java index 32ae1e0..9655654 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java @@ -76,8 +76,8 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { fn = this::formatDisassembly; } - @Option(names = "--raw", description = "Raw Binary dump.") - public boolean raw = false; + @Option(names = "--raw", description = "Raw Binary dump.") + public boolean raw = false; public String formatHexDump(Options options, byte[] data) { return AppleUtil.getHexDump(data); @@ -122,17 +122,17 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { private DisassemblerOptions disassemblerOptions = new DisassemblerOptions(); } - public static class DisassemblerOptions { - @Option(names = {"-a", "--address"}, converter = IntegerTypeConverter.class, - description = "Starting Address.") - private int address = 0x800; + public static class DisassemblerOptions { + @Option(names = {"-a", "--address"}, converter = IntegerTypeConverter.class, + description = "Starting Address.") + private int address = 0x800; - @Option(names = {"-o", "--offset"}, converter = IntegerTypeConverter.class, - description = "Number of bytes to skip into file before disassembling.") - private Optional offset = Optional.empty(); + @Option(names = {"-o", "--offset"}, converter = IntegerTypeConverter.class, + description = "Number of bytes to skip into file before disassembling.") + private Optional offset = Optional.empty(); - @ArgGroup(multiplicity = "0..1") - private InstructionSetSelection instructionSet = new InstructionSetSelection(); + @ArgGroup(multiplicity = "0..1") + private InstructionSetSelection instructionSet = new InstructionSetSelection(); public static class InstructionSetSelection { private InstructionSet instructionSet = InstructionSet6502.for6502(); @@ -140,8 +140,8 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { public InstructionSet get() { return this.instructionSet; } - - @Option(names = "--6502", description = "MOS 6502. (Default)") + + @Option(names = "--6502", description = "MOS 6502. (Default)") public void select6502(boolean flag) { this.instructionSet = InstructionSet6502.for6502(); } @@ -160,7 +160,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @Option(names = { "--6502S" }, description = "MOS 6502 with SWEET16 switching.") public void select6502Switching(boolean flag) { this.instructionSet = InstructionSet6502Switching.withSwitching(); - } + } } - } + } } From bde23a819759231f60e6e7c67e5b5541319eac49 Mon Sep 17 00:00:00 2001 From: ThomasFok Date: Mon, 23 Jan 2023 12:10:04 +0000 Subject: [PATCH 3/5] source code formatting --- .../io/github/applecommander/acx/command/DumpCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java index 9655654..0a8fe3d 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java @@ -52,7 +52,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @Override public int handleCommand() throws Exception { byte[] data = options.coordinate.read(disk); - if (output.raw) { + if (output.raw) { System.out.write(data); } else { System.out.println(output.format(options, data)); @@ -141,7 +141,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { return this.instructionSet; } - @Option(names = "--6502", description = "MOS 6502. (Default)") + @Option(names = "--6502", description = "MOS 6502. (Default)") public void select6502(boolean flag) { this.instructionSet = InstructionSet6502.for6502(); } From f23aa4b3d3d48414ac974a246369b3e48fe43c83 Mon Sep 17 00:00:00 2001 From: ThomasFok Date: Mon, 23 Jan 2023 12:13:25 +0000 Subject: [PATCH 4/5] removal of unnecssary tab --- .../io/github/applecommander/acx/command/DumpCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java index 0a8fe3d..1f14d2f 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java @@ -70,7 +70,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { public void selectHexDump(boolean flag) { fn = this::formatHexDump; } - + @Option(names = "--disassembly", description = "Disassembly.") public void selectDisassembly(boolean flag) { fn = this::formatDisassembly; @@ -126,7 +126,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @Option(names = {"-a", "--address"}, converter = IntegerTypeConverter.class, description = "Starting Address.") private int address = 0x800; - + @Option(names = {"-o", "--offset"}, converter = IntegerTypeConverter.class, description = "Number of bytes to skip into file before disassembling.") private Optional offset = Optional.empty(); From 8b082d4258d55e81193e0d28484e4c71ce53f026 Mon Sep 17 00:00:00 2001 From: ThomasFok Date: Mon, 23 Jan 2023 17:41:00 +0000 Subject: [PATCH 5/5] removal of -raw option --- .../applecommander/acx/command/DumpCommand.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java index 1f14d2f..480b89c 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/DumpCommand.java @@ -52,11 +52,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { @Override public int handleCommand() throws Exception { byte[] data = options.coordinate.read(disk); - if (output.raw) { - System.out.write(data); - } else { - System.out.println(output.format(options, data)); - } + System.out.println(output.format(options, data)); return 0; } @@ -66,7 +62,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { return fn.apply(options, data); } - @Option(names = "--hex", description = "Hex dump. (Default)") + @Option(names = "--hex", description = "Hex dump. (default)") public void selectHexDump(boolean flag) { fn = this::formatHexDump; } @@ -75,9 +71,6 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { public void selectDisassembly(boolean flag) { fn = this::formatDisassembly; } - - @Option(names = "--raw", description = "Raw Binary dump.") - public boolean raw = false; public String formatHexDump(Options options, byte[] data) { return AppleUtil.getHexDump(data); @@ -141,7 +134,7 @@ public class DumpCommand extends ReadOnlyDiskImageCommandOptions { return this.instructionSet; } - @Option(names = "--6502", description = "MOS 6502. (Default)") + @Option(names = "--6502", description = "MOS 6502. (default)") public void select6502(boolean flag) { this.instructionSet = InstructionSet6502.for6502(); }