From 0e40e2571020f22d4fd7184acee92b2a7f43e4e3 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Tue, 27 Jul 2021 17:55:19 +1000 Subject: [PATCH] debug for CP/M basic --- .../diskbrowser/applefile/CPMBasicFile.java | 74 +++++++++++++++++-- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/src/com/bytezone/diskbrowser/applefile/CPMBasicFile.java b/src/com/bytezone/diskbrowser/applefile/CPMBasicFile.java index 4ea83a2..e57da37 100644 --- a/src/com/bytezone/diskbrowser/applefile/CPMBasicFile.java +++ b/src/com/bytezone/diskbrowser/applefile/CPMBasicFile.java @@ -5,7 +5,7 @@ import static com.bytezone.diskbrowser.utilities.Utility.getShort; import com.bytezone.diskbrowser.utilities.HexFormatter; // -----------------------------------------------------------------------------------// -public class CPMBasicFile extends TextFile +public class CPMBasicFile extends BasicProgram // -----------------------------------------------------------------------------------// { String[] tokens = { // @@ -52,7 +52,7 @@ public class CPMBasicFile extends TextFile { StringBuilder text = new StringBuilder (); - if (textPreferences.showHeader) + if (basicPreferences.showHeader) text.append ("Name : " + name + "\n\n"); int ptr = 5; @@ -60,6 +60,11 @@ public class CPMBasicFile extends TextFile ptr++; int loadAddress = getShort (buffer, 1) - ptr - 1; + if (!validate (buffer, loadAddress)) + System.out.println ("Invalid load address"); + + if (showDebugText) + return debugText (loadAddress); ptr = 1; while (ptr < buffer.length) @@ -83,10 +88,10 @@ public class CPMBasicFile extends TextFile { if (val == 0xFF) { - int next = buffer[ptr++] & 0xFF; - String token = functions[next & 0x7F]; + val = buffer[ptr++] & 0xFF; + String token = functions[val & 0x7F]; if (token.length () == 0) - token = String.format ("", next); + token = String.format ("", val); text.append (token); } else @@ -108,6 +113,10 @@ public class CPMBasicFile extends TextFile text.append ("'"); ptr += 2; } + else if (val == 0x3A && ptr < buffer.length && buffer[ptr] == (byte) 0x9E) + { + // ignore colon before ELSE + } else text.append (String.format ("%s", (char) val)); continue; @@ -180,4 +189,59 @@ public class CPMBasicFile extends TextFile return text.toString (); } + + // ---------------------------------------------------------------------------------// + private String debugText (int loadAddress) + // ---------------------------------------------------------------------------------// + { + StringBuilder text = new StringBuilder (); + + int ptr = 1; + int lastPtr; + + while (ptr < buffer.length) + { + int nextAddress = getShort (buffer, ptr); + if (nextAddress == 0) + break; + + int lineNumber = getShort (buffer, ptr + 2); + text.append (String.format (" %d ", lineNumber)); + + lastPtr = ptr; + ptr = nextAddress - loadAddress; + + text.append (HexFormatter.getHexString (buffer, lastPtr + 4, ptr - lastPtr)); + text.append ("\n"); + if (ptr < 0 || ptr >= buffer.length) + break; + if (buffer[ptr - 1] != 0) // end of previous line + break; + } + + return text.toString (); + } + + // ---------------------------------------------------------------------------------// + private boolean validate (byte[] buffer, int loadAddress) + // ---------------------------------------------------------------------------------// + { +// System.out.printf ("Load Address: %04X%n", loadAddress); + int ptr = 1; + + while (ptr < buffer.length) + { + int nextAddress = getShort (buffer, ptr); +// System.out.printf ("%04X%n", nextAddress); + if (nextAddress == 0) + return true; + ptr = nextAddress - loadAddress; + if (ptr < 0 || ptr >= buffer.length) + return false; + if (buffer[ptr - 1] != 0) // end of previous line + return false; + } + + return false; + } }