This commit is contained in:
Denis Molony 2021-02-22 13:41:34 +10:00
parent 228c70e1ea
commit d1afecbfa0
2 changed files with 57 additions and 57 deletions

View File

@ -55,6 +55,9 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons
final String formatCall; final String formatCall;
private final int maxDigits; private final int maxDigits;
private final int lineWrapLeft = 5;
private final int lineWrapRight = 33;
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
public ApplesoftBasicProgram (String name, byte[] buffer) public ApplesoftBasicProgram (String name, byte[] buffer)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
@ -120,7 +123,7 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons
int loadAddress = getLoadAddress (); int loadAddress = getLoadAddress ();
int ptr = 0; int ptr = 0;
int linkField; int linkField;
byte b;
StringBuilder currentLine = new StringBuilder (); StringBuilder currentLine = new StringBuilder ();
while ((linkField = unsignedShort (buffer, ptr)) != 0) while ((linkField = unsignedShort (buffer, ptr)) != 0)
@ -130,36 +133,9 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons
ptr += 4; ptr += 4;
if (basicPreferences.appleLineWrap) if (basicPreferences.appleLineWrap)
ptr = append (currentLine, ptr); ptr = appendWithWrap (currentLine, ptr);
else else
while ((b = buffer[ptr++]) != 0) ptr = appendWithOutWrap (currentLine, ptr);
if (isHighBitSet (b))
{
String token = String.format (" %s ", ApplesoftConstants.tokens[b & 0x7F]);
currentLine.append (token);
}
else
switch (b)
{
case Utility.ASCII_CR:
currentLine.append (NEWLINE);
break;
case Utility.ASCII_BACKSPACE:
if (currentLine.length () > 0)
currentLine.deleteCharAt (currentLine.length () - 1);
break;
case Utility.ASCII_LF:
int indent = getIndent (currentLine);
currentLine.append ("\n");
for (int i = 0; i < indent; i++)
currentLine.append (" ");
break;
default:
currentLine.append ((char) b);
}
if (ptr != (linkField - loadAddress)) if (ptr != (linkField - loadAddress))
{ {
@ -176,28 +152,63 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private int append (StringBuilder currentLine, int ptr) private int appendWithOutWrap (StringBuilder currentLine, int ptr)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
{ {
byte b; byte b;
int left = 5;
int right = 33;
int cursor = currentLine.length ();
while ((b = buffer[ptr++]) != 0) while ((b = buffer[ptr++]) != 0)
if (isHighBitSet (b)) if (isHighBitSet (b))
{ {
String token = String.format (" %s ", ApplesoftConstants.tokens[b & 0x7F]); String token = String.format (" %s ", ApplesoftConstants.tokens[b & 0x7F]);
currentLine.append (token); currentLine.append (token);
cursor = increment (currentLine, cursor, token.length ());
} }
else else
switch (b) switch (b)
{ {
case Utility.ASCII_CR: case Utility.ASCII_CR:
currentLine.append (NEWLINE); currentLine.append (NEWLINE);
cursor = left; break;
case Utility.ASCII_BACKSPACE:
if (currentLine.length () > 0)
currentLine.deleteCharAt (currentLine.length () - 1);
break;
case Utility.ASCII_LF:
int indent = getIndent (currentLine);
currentLine.append ("\n");
for (int i = 0; i < indent; i++)
currentLine.append (" ");
break;
default:
currentLine.append ((char) b);
}
return ptr;
}
// ---------------------------------------------------------------------------------//
private int appendWithWrap (StringBuilder currentLine, int ptr)
// ---------------------------------------------------------------------------------//
{
byte b;
int cursor = currentLine.length (); // controls when to wrap
while ((b = buffer[ptr++]) != 0)
if (isHighBitSet (b))
{
String token = String.format (" %s ", ApplesoftConstants.tokens[b & 0x7F]);
currentLine.append (token);
cursor = incrementCursor (currentLine, cursor, token.length ());
}
else
switch (b)
{
case Utility.ASCII_CR:
currentLine.append (NEWLINE);
cursor = lineWrapLeft;
break; break;
case Utility.ASCII_BACKSPACE: case Utility.ASCII_BACKSPACE:
@ -217,35 +228,23 @@ public class ApplesoftBasicProgram extends BasicProgram implements ApplesoftCons
default: default:
currentLine.append ((char) b); currentLine.append ((char) b);
cursor = increment (currentLine, cursor, 1); cursor = incrementCursor (currentLine, cursor, 1);
} }
return ptr; return ptr;
} }
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
private int increment (StringBuilder currentLine, int cursor, int size) private int incrementCursor (StringBuilder currentLine, int cursor, int size)
// ---------------------------------------------------------------------------------// // ---------------------------------------------------------------------------------//
{ {
int left = 5; if ((cursor += size) >= lineWrapRight)
int right = 33;
cursor += size;
if (cursor >= right)
{ {
if (cursor < 40) // seems to be a bug in the ROM - see line 1610 in KEY-CAT on UtilityCity.dsk
{ cursor = cursor < 40 ? lineWrapLeft : 0;
cursor = left; currentLine.append ("\n ".substring (0, cursor + 1));
currentLine.append ("\n ".substring (0, left + 1));
}
else
// this is presumably a bug in the applesoft ROM
// see line 1610 in KEY-CAT on the UtilityCity.dsk
{
cursor = 0;
currentLine.append ("\n");
}
} }
return cursor; return cursor;
} }

View File

@ -151,7 +151,8 @@ class MenuHandler implements DiskSelectionListener, FileSelectionListener, QuitL
final JMenuItem showAllFormatItem = new JCheckBoxMenuItem ("Enable Format options"); final JMenuItem showAllFormatItem = new JCheckBoxMenuItem ("Enable Format options");
final JMenuItem showAllXrefItem = new JCheckBoxMenuItem ("Enable XREF options"); final JMenuItem showAllXrefItem = new JCheckBoxMenuItem ("Enable XREF options");
final JMenuItem appleLineWrapItem = new JCheckBoxMenuItem ("Apple line wrap"); final JMenuItem appleLineWrapItem =
new JCheckBoxMenuItem ("Applesoft 40 column line wrap");
final JMenuItem splitRemarkItem = new JCheckBoxMenuItem ("Split remarks"); final JMenuItem splitRemarkItem = new JCheckBoxMenuItem ("Split remarks");
final JMenuItem splitDimItem = new JCheckBoxMenuItem ("Split DIM"); final JMenuItem splitDimItem = new JCheckBoxMenuItem ("Split DIM");