mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-13 06:29:31 +00:00
debug for CP/M basic
This commit is contained in:
parent
f02c932d91
commit
0e40e25710
|
@ -5,7 +5,7 @@ import static com.bytezone.diskbrowser.utilities.Utility.getShort;
|
||||||
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
public class CPMBasicFile extends TextFile
|
public class CPMBasicFile extends BasicProgram
|
||||||
// -----------------------------------------------------------------------------------//
|
// -----------------------------------------------------------------------------------//
|
||||||
{
|
{
|
||||||
String[] tokens = { //
|
String[] tokens = { //
|
||||||
|
@ -52,7 +52,7 @@ public class CPMBasicFile extends TextFile
|
||||||
{
|
{
|
||||||
StringBuilder text = new StringBuilder ();
|
StringBuilder text = new StringBuilder ();
|
||||||
|
|
||||||
if (textPreferences.showHeader)
|
if (basicPreferences.showHeader)
|
||||||
text.append ("Name : " + name + "\n\n");
|
text.append ("Name : " + name + "\n\n");
|
||||||
|
|
||||||
int ptr = 5;
|
int ptr = 5;
|
||||||
|
@ -60,6 +60,11 @@ public class CPMBasicFile extends TextFile
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
int loadAddress = getShort (buffer, 1) - ptr - 1;
|
int loadAddress = getShort (buffer, 1) - ptr - 1;
|
||||||
|
if (!validate (buffer, loadAddress))
|
||||||
|
System.out.println ("Invalid load address");
|
||||||
|
|
||||||
|
if (showDebugText)
|
||||||
|
return debugText (loadAddress);
|
||||||
|
|
||||||
ptr = 1;
|
ptr = 1;
|
||||||
while (ptr < buffer.length)
|
while (ptr < buffer.length)
|
||||||
|
@ -83,10 +88,10 @@ public class CPMBasicFile extends TextFile
|
||||||
{
|
{
|
||||||
if (val == 0xFF)
|
if (val == 0xFF)
|
||||||
{
|
{
|
||||||
int next = buffer[ptr++] & 0xFF;
|
val = buffer[ptr++] & 0xFF;
|
||||||
String token = functions[next & 0x7F];
|
String token = functions[val & 0x7F];
|
||||||
if (token.length () == 0)
|
if (token.length () == 0)
|
||||||
token = String.format ("<FF %02X>", next);
|
token = String.format ("<FF %02X>", val);
|
||||||
text.append (token);
|
text.append (token);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -108,6 +113,10 @@ public class CPMBasicFile extends TextFile
|
||||||
text.append ("'");
|
text.append ("'");
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
}
|
}
|
||||||
|
else if (val == 0x3A && ptr < buffer.length && buffer[ptr] == (byte) 0x9E)
|
||||||
|
{
|
||||||
|
// ignore colon before ELSE
|
||||||
|
}
|
||||||
else
|
else
|
||||||
text.append (String.format ("%s", (char) val));
|
text.append (String.format ("%s", (char) val));
|
||||||
continue;
|
continue;
|
||||||
|
@ -180,4 +189,59 @@ public class CPMBasicFile extends TextFile
|
||||||
|
|
||||||
return text.toString ();
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user