dmolony-DiskBrowser/src/com/bytezone/diskbrowser/applefile/CPMBasicFile.java

232 lines
4.5 KiB
Java
Raw Normal View History

2021-07-25 08:31:02 +00:00
package com.bytezone.diskbrowser.applefile;
import static com.bytezone.diskbrowser.utilities.Utility.getShort;
// -----------------------------------------------------------------------------------//
public class CPMBasicFile extends TextFile
// -----------------------------------------------------------------------------------//
{
// ---------------------------------------------------------------------------------//
public CPMBasicFile (String name, byte[] buffer)
// ---------------------------------------------------------------------------------//
{
super (name, buffer);
}
// ---------------------------------------------------------------------------------//
@Override
public String getText ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
if (textPreferences.showHeader)
text.append ("Name : " + name + "\n\n");
int ptr = 5;
while (buffer[ptr] != 0)
ptr++;
2021-07-25 11:11:50 +00:00
int loadAddress = getShort (buffer, 1) - ptr - 1;
2021-07-25 08:31:02 +00:00
ptr = 1;
while (ptr < buffer.length)
{
2021-07-25 11:11:50 +00:00
int nextAddress = getShort (buffer, ptr);
2021-07-25 08:31:02 +00:00
2021-07-25 11:11:50 +00:00
if (nextAddress == 0)
2021-07-25 08:31:02 +00:00
break;
2021-07-25 11:11:50 +00:00
int lineNumber = getShort (buffer, ptr + 2);
2021-07-25 08:31:02 +00:00
2021-07-25 11:11:50 +00:00
text.append (String.format ("%7d ", lineNumber));
2021-07-25 08:31:02 +00:00
ptr += 4;
while (buffer[ptr] != 0)
{
int val = buffer[ptr++] & 0xFF;
2021-07-26 02:02:52 +00:00
if (val == 0x0E)
{
int next1 = buffer[ptr++] & 0xFF;
int next2 = buffer[ptr++] & 0xFF;
text.append (next2 * 256 + next1);
continue;
}
if (val == 0x0F)
{
int nextVal = buffer[ptr++] & 0xFF;
text.append (nextVal);
continue;
}
if (val == 0x0C)
{
int b1 = buffer[ptr++] & 0xFF;
int b2 = buffer[ptr++] & 0xFF;
text.append ("&H" + String.format ("%X", b2 * 256 + b1));
continue;
}
if (val == 0x0D)
{
System.out.println ("found 0x0D");
}
if (val >= 0x11 && val <= 0x1A)
{
text.append (val - 0x11);
continue;
}
if (val == 0xFF)
{
int next = buffer[ptr++] & 0xFF;
String token = switch (next)
{
case 0x94 -> "ASC";
case 0x96 -> "PEEK";
default -> String.format ("<%02X>", next);
};
text.append (token);
continue;
}
if (val >= 0x20 && val <= 0x7E)
2021-07-25 11:11:50 +00:00
text.append (String.format ("%s", (char) val)); // printable
2021-07-25 08:31:02 +00:00
else
2021-07-26 02:02:52 +00:00
text.append (getToken (val));
2021-07-25 08:31:02 +00:00
}
2021-07-25 11:11:50 +00:00
ptr = nextAddress - loadAddress;
2021-07-25 08:31:02 +00:00
text.append ("\n");
}
if (text.length () > 0)
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
2021-07-26 02:02:52 +00:00
// ---------------------------------------------------------------------------------//
private String getToken (int val)
// ---------------------------------------------------------------------------------//
{
switch (val)
{
case 0x81:
return "END";
case 0x82:
return "FOR";
case 0x83:
return "NEXT";
case 0x84:
return "DATA";
case 0x85:
return "INPUT";
case 0x8B:
return "IF";
case 0x89:
return "GOTO";
case 0x8D:
return "GOSUB";
case 0x8E:
return "RETURN";
case 0x8F:
return "REM";
case 0x90:
return "POS";
case 0x91:
return "PRINT";
case 0x95:
return "ON";
case 0x97:
return "POKE";
case 0x9E:
return "ELSE";
case 0xB3:
return "DIM ";
case 0xC5:
return "RESET";
case 0xC6:
return "TEXT";
case 0xC7:
return "HOME";
case 0xC8:
return "VTAB";
case 0xC9:
return "HTAB";
case 0xDD:
return "TO";
case 0xDE:
return "THEN";
case 0xDF:
return "TAB(";
case 0xE0:
return "STEP";
case 0xE1:
return "USR";
case 0xE7:
return "STRING$";
case 0xEF:
return ">";
case 0xF0:
return "=";
case 0xF1:
return "<";
case 0xF2:
return "+";
case 0xF3:
return "-";
case 0xF4:
return "*";
case 0xF7:
return "AND";
case 0xF8:
return "OR";
case 0xFC:
return "MOD";
default:
return String.format ("<%02X>", val);
}
}
2021-07-25 08:31:02 +00:00
}