This commit is contained in:
Denis Molony 2016-12-17 19:34:47 +11:00
parent f025c72d1e
commit 343d460679
6 changed files with 205 additions and 87 deletions

View File

@ -98,73 +98,73 @@ public class AssemblerProgram extends AbstractFile
return pgm.append (getStringBuilder2 ()).toString (); return pgm.append (getStringBuilder2 ()).toString ();
} }
private StringBuilder getStringBuilder () // private StringBuilder getStringBuilder ()
{ // {
if (true) // if (true)
return getStringBuilder2 (); // return getStringBuilder2 ();
//
StringBuilder pgm = new StringBuilder (); // StringBuilder pgm = new StringBuilder ();
//
int ptr = executeOffset; // int ptr = executeOffset;
int address = loadAddress + executeOffset; // int address = loadAddress + executeOffset;
//
// if the assembly doesn't start at the beginning, just dump the bytes that // // if the assembly doesn't start at the beginning, just dump the bytes that
// are skipped // // are skipped
for (int i = 0; i < executeOffset; i++) // for (int i = 0; i < executeOffset; i++)
pgm.append (String.format ("%04X: %02X%n", (loadAddress + i), buffer[i])); // pgm.append (String.format ("%04X: %02X%n", (loadAddress + i), buffer[i]));
//
while (ptr < buffer.length) // while (ptr < buffer.length)
{ // {
StringBuilder line = new StringBuilder (); // StringBuilder line = new StringBuilder ();
//
AssemblerStatement cmd = new AssemblerStatement (buffer[ptr]); // AssemblerStatement cmd = new AssemblerStatement (buffer[ptr]);
//
if (cmd.size == 2 && ptr < buffer.length - 1) // if (cmd.size == 2 && ptr < buffer.length - 1)
cmd.addData (buffer[ptr + 1]); // cmd.addData (buffer[ptr + 1]);
else if (cmd.size == 3 && ptr < buffer.length - 2) // else if (cmd.size == 3 && ptr < buffer.length - 2)
cmd.addData (buffer[ptr + 1], buffer[ptr + 2]); // cmd.addData (buffer[ptr + 1], buffer[ptr + 2]);
else // else
cmd.size = 1; // cmd.size = 1;
//
line.append (String.format ("%04X: ", address)); // line.append (String.format ("%04X: ", address));
for (int i = 0; i < cmd.size; i++) // for (int i = 0; i < cmd.size; i++)
line.append (String.format ("%02X ", buffer[ptr + i])); // line.append (String.format ("%02X ", buffer[ptr + i]));
while (line.length () < 20) // while (line.length () < 20)
line.append (" "); // line.append (" ");
line.append (cmd.mnemonic + " " + cmd.operand); // line.append (cmd.mnemonic + " " + cmd.operand);
if (cmd.offset != 0) // if (cmd.offset != 0)
{ // {
int branch = address + cmd.offset + 2; // int branch = address + cmd.offset + 2;
line.append (String.format ("$%04X", branch < 0 ? branch += 0xFFFF : branch)); // line.append (String.format ("$%04X", branch < 0 ? branch += 0xFFFF : branch));
} // }
//
if (cmd.target > 0 // if (cmd.target > 0
&& (cmd.target < loadAddress - 1 || cmd.target > (loadAddress + buffer.length))) // && (cmd.target < loadAddress - 1 || cmd.target > (loadAddress + buffer.length)))
{ // {
while (line.length () < 40) // while (line.length () < 40)
line.append (" "); // line.append (" ");
//
String text = equates.get (cmd.target); // String text = equates.get (cmd.target);
if (text != null) // if (text != null)
line.append ("; " + text); // line.append ("; " + text);
else // else
for (int i = 0, max = ApplesoftConstants.tokenAddresses.length; i < max; i++) // for (int i = 0, max = ApplesoftConstants.tokenAddresses.length; i < max; i++)
if (cmd.target == ApplesoftConstants.tokenAddresses[i]) // if (cmd.target == ApplesoftConstants.tokenAddresses[i])
{ // {
line.append ("; Applesoft - " + ApplesoftConstants.tokens[i]); // line.append ("; Applesoft - " + ApplesoftConstants.tokens[i]);
break; // break;
} // }
} // }
pgm.append (line.toString () + "\n"); // pgm.append (line.toString () + "\n");
address += cmd.size; // address += cmd.size;
ptr += cmd.size; // ptr += cmd.size;
} // }
//
if (pgm.length () > 0) // if (pgm.length () > 0)
pgm.deleteCharAt (pgm.length () - 1); // pgm.deleteCharAt (pgm.length () - 1);
//
return pgm; // return pgm;
} // }
private StringBuilder getStringBuilder2 () private StringBuilder getStringBuilder2 ()
{ {
@ -197,8 +197,7 @@ public class AssemblerProgram extends AbstractFile
int branch = cmd.address + cmd.offset + 2; int branch = cmd.address + cmd.offset + 2;
line.append (String.format ("$%04X", branch < 0 ? branch += 0xFFFF : branch)); line.append (String.format ("$%04X", branch < 0 ? branch += 0xFFFF : branch));
} }
else if (cmd.target > 0
if (cmd.target > 0
&& (cmd.target < loadAddress - 1 || cmd.target > (loadAddress + buffer.length))) && (cmd.target < loadAddress - 1 || cmd.target > (loadAddress + buffer.length)))
{ {
while (line.length () < 40) while (line.length () < 40)

View File

@ -0,0 +1,78 @@
package com.bytezone.diskbrowser.applefile;
import java.util.ArrayList;
import java.util.List;
public class FontFile extends AbstractFile
{
List<Character> characters = new ArrayList<Character> ();
public FontFile (String name, byte[] buffer)
{
super (name, buffer);
int ptr = 0;
while (ptr < buffer.length)
{
Character c = new Character (buffer, ptr);
ptr += 8;
characters.add (c);
}
}
@Override
public String getText ()
{
StringBuilder text = new StringBuilder ("Name : " + name + "\n\n");
for (int i = 0; i < characters.size (); i += 8)
{
StringBuilder line = new StringBuilder ();
for (int j = 0; j < 8; j++)
{
for (int k = 0; k < 8; k++)
{
line.append (characters.get (i + k).lines[j]);
line.append (" ");
}
line.append ("\n");
}
text.append (line.toString ());
text.append ("\n");
}
return text.toString ();
}
class Character
{
String[] lines = new String[8];
public Character (byte[] buffer, int ptr)
{
for (int i = 0; i < 8; i++)
{
int b = buffer[ptr + i] & 0xFF;
String s = "0000000" + Integer.toString (b, 2);
s = s.substring (s.length () - 7);
s = s.replace ('0', ' ');
s = s.replace ('1', 'O');
s = new StringBuilder (s).reverse ().toString ();
lines[i] = s;
}
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
for (String s : lines)
text.append (s + "\n");
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
}
}

View File

@ -33,10 +33,15 @@ public class HiResImage extends AbstractFile
private byte[] unpackedBuffer; private byte[] unpackedBuffer;
public HiResImage (String name, byte[] buffer) public HiResImage (String name, byte[] buffer)
{
this (name, buffer, false);
}
public HiResImage (String name, byte[] buffer, boolean scrunched)
{ {
super (name, buffer); super (name, buffer);
if (name.equals ("FLY LOGO") || name.equals ("BIGBAT.PAC")) if (scrunched)
this.buffer = unscrunch (buffer); this.buffer = unscrunch (buffer);
draw (); draw ();

View File

@ -1,5 +1,10 @@
* Zero page * Zero page
0018 First data track
0019 First data sector
001A Shape pointer LO
001B Shape pointer HI
001C Last color used
0020 WNDLFT 0020 WNDLFT
0021 WNDWDTH 0021 WNDWDTH
0022 WNDTOP 0022 WNDTOP
@ -10,7 +15,9 @@
0027 GBAS-HI 0027 GBAS-HI
0028 BAS-LO 0028 BAS-LO
0029 BAS-HI 0029 BAS-HI
002B Boot slot * 16
0032 INVFLG 0032 INVFLG
0033 Prompt character
0035 YSAV1 0035 YSAV1
0036 CSWL 0036 CSWL
0037 CSHW 0037 CSHW
@ -18,6 +25,12 @@
004E RND-LO 004E RND-LO
004F RND-HI 004F RND-HI
0050 LINNUM 0050 LINNUM
0067 Basic program address LO
0068 Basic program address HI
0069 Basic variables address LO
006A Basic variables address HI
006B Basic arrays address LO
006C Basic arrays address HI
0073 HIMEM 0073 HIMEM
009D FAC 009D FAC
009E FAC mantissa hi order 009E FAC mantissa hi order
@ -26,6 +39,12 @@
00B7 CHRGOT 00B7 CHRGOT
00B8 TXTPTR 00B8 TXTPTR
00E4 HCOLOR
00E8 Shape table address LO
00E9 Shape table address HI
00EA Collision counter
00F9 ROT
0200 Input buffer 0200 Input buffer
03D0 Applesoft warm start 03D0 Applesoft warm start

View File

@ -80,12 +80,12 @@ abstract class AbstractCatalogEntry implements AppleFileSource
if (c > 127) if (c > 127)
c -= c < 160 ? 64 : 128; c -= c < 160 ? 64 : 128;
if (c < 32) if (c < 32)
text.append ("^" + (char) (c + 64)); // non-printable ascii text.append ("^" + (char) (c + 64)); // non-printable ascii
else else
text.append ((char) c); // standard ascii text.append ((char) c); // standard ascii
} }
while (text.length () > 0 && text.charAt (text.length () - 1) == ' ') while (text.length () > 0 && text.charAt (text.length () - 1) == ' ')
text.deleteCharAt (text.length () - 1); // rtrim() text.deleteCharAt (text.length () - 1); // rtrim()
return text.toString (); return text.toString ();
} }
@ -196,7 +196,9 @@ abstract class AbstractCatalogEntry implements AppleFileSource
System.arraycopy (buffer, 4, exactBuffer, 0, exactBuffer.length); System.arraycopy (buffer, 4, exactBuffer, 0, exactBuffer.length);
if (ShapeTable.isShapeTable (exactBuffer)) if (name.endsWith (".FONT"))
appleFile = new FontFile (name, exactBuffer);
else if (ShapeTable.isShapeTable (exactBuffer))
appleFile = new ShapeTable (name, exactBuffer); appleFile = new ShapeTable (name, exactBuffer);
else if (name.endsWith (".S")) else if (name.endsWith (".S"))
appleFile = new MerlinSource (name, exactBuffer); appleFile = new MerlinSource (name, exactBuffer);
@ -204,11 +206,10 @@ abstract class AbstractCatalogEntry implements AppleFileSource
appleFile = new HiResImage (name, exactBuffer); appleFile = new HiResImage (name, exactBuffer);
else if (loadAddress == 0x2000 || loadAddress == 0x4000) else if (loadAddress == 0x2000 || loadAddress == 0x4000)
{ {
if ((reportedLength > 0x1F00 && reportedLength <= 0x4000) if (reportedLength > 0x1F00 && reportedLength <= 0x4000)
|| ((name.equals ("FLY LOGO") && reportedLength == 0x14FA)))
appleFile = new HiResImage (name, exactBuffer); appleFile = new HiResImage (name, exactBuffer);
// else if else if (isScrunched (reportedLength))
// appleFile = new HiResImage (name, unscrunch (exactBuffer)); appleFile = new HiResImage (name, exactBuffer, true);
else else
appleFile = new AssemblerProgram (name, exactBuffer, loadAddress); appleFile = new AssemblerProgram (name, exactBuffer, loadAddress);
} }
@ -219,7 +220,6 @@ abstract class AbstractCatalogEntry implements AppleFileSource
((AssemblerProgram) appleFile).setExtraBuffer (buffer, ((AssemblerProgram) appleFile).setExtraBuffer (buffer,
exactBuffer.length + 4, buffer.length - (exactBuffer.length + 4)); exactBuffer.length + 4, buffer.length - (exactBuffer.length + 4));
} }
// }
break; break;
case SS: // what is this? case SS: // what is this?
@ -254,6 +254,18 @@ abstract class AbstractCatalogEntry implements AppleFileSource
return appleFile; return appleFile;
} }
private boolean isScrunched (int reportedLength)
{
if ((name.equals ("FLY LOGO") || name.equals ("FLY LOGO SCRUNCHED"))
&& reportedLength == 0x14FA)
return true;
if (name.equals ("BBROS LOGO SCRUNCHED") && reportedLength == 0x0FED)
return true;
return false;
}
@Override @Override
public boolean contains (DiskAddress da) public boolean contains (DiskAddress da)
{ {

View File

@ -25,8 +25,9 @@ class CatalogEntry extends AbstractCatalogEntry
dosDisk.sectorTypes[da.getBlock ()] = dosDisk.tsListSector; dosDisk.sectorTypes[da.getBlock ()] = dosDisk.tsListSector;
else else
{ {
System.out.printf ("Attempt to assign TS sector to occupied sector " System.out.printf (
+ ": %s from %s%n", da, name); "Attempt to assign TS sector to occupied sector " + ": %s from %s%n", da,
name);
// break; // break;
} }
tsSectors.add (da); tsSectors.add (da);
@ -50,7 +51,7 @@ class CatalogEntry extends AbstractCatalogEntry
{ {
System.out.print ("T/S list in sector " + i); System.out.print ("T/S list in sector " + i);
System.out.printf (" contains an invalid address : %02X, %02X (file %s)%n", System.out.printf (" contains an invalid address : %02X, %02X (file %s)%n",
sectorBuffer[i], sectorBuffer[i + 1], name.trim ()); sectorBuffer[i], sectorBuffer[i + 1], name.trim ());
break loop; break loop;
} }
if (da.getBlock () == 0) if (da.getBlock () == 0)
@ -79,7 +80,7 @@ class CatalogEntry extends AbstractCatalogEntry
{ {
System.out.print ("Next T/S list in sector " + thisDA); System.out.print ("Next T/S list in sector " + thisDA);
System.out.printf (" is invalid : %02X, %02X%n", sectorBuffer[1], System.out.printf (" is invalid : %02X, %02X%n", sectorBuffer[1],
sectorBuffer[2]); sectorBuffer[2]);
break; break;
} }
@ -136,9 +137,13 @@ class CatalogEntry extends AbstractCatalogEntry
message += "Bad size (" + reportedSize + ") "; message += "Bad size (" + reportedSize + ") ";
if (dataSectors.size () == 0) if (dataSectors.size () == 0)
message += "No data "; message += "No data ";
return String.format ("%1s %1s %03d %-30.30s %-5s " + "%-13s %2d %3d %s",
lockedFlag, getFileType (), actualSize, name, addressText, String text =
lengthText, tsSectors.size (), String.format ("%1s %1s %03d %-30.30s %-5s " + "%-13s %2d %3d %s",
(dataSectors.size () - textFileGaps), message.trim ()); lockedFlag, getFileType (), actualSize, name, addressText, lengthText,
tsSectors.size (), (dataSectors.size () - textFileGaps), message.trim ());
if (actualSize == 0)
text = text.substring (0, 50);
return text;
} }
} }