This commit is contained in:
Denis Molony 2017-04-26 18:04:48 +10:00
parent 0fe2a21f96
commit bdbd837376
15 changed files with 93 additions and 97 deletions

View File

@ -67,7 +67,6 @@ public abstract class AbstractFile implements DataSource
@Override
public JComponent getComponent ()
{
// System.out.println ("In AbstractFile.getComponent()");
JPanel panel = new JPanel ();
return panel;
}

View File

@ -378,14 +378,16 @@ public class BasicProgram extends AbstractFile
int length = getLineLength (ptr);
if (length == 0)
{
pgm.append (HexFormatter.formatNoHeader (buffer, ptr, 2, programLoadAddress));
pgm.append (
HexFormatter.formatNoHeader (buffer, ptr, 2, programLoadAddress + ptr));
ptr += 2;
break;
}
if (ptr + length < buffer.length)
pgm.append (HexFormatter.formatNoHeader (buffer, ptr, length, programLoadAddress)
+ "\n\n");
pgm.append (
HexFormatter.formatNoHeader (buffer, ptr, length, programLoadAddress + ptr)
+ "\n\n");
ptr += length;
}
@ -393,7 +395,8 @@ public class BasicProgram extends AbstractFile
{
int length = buffer.length - ptr;
pgm.append ("\n\n");
pgm.append (HexFormatter.formatNoHeader (buffer, ptr, length, programLoadAddress));
pgm.append (
HexFormatter.formatNoHeader (buffer, ptr, length, programLoadAddress + ptr));
}
return pgm.toString ();

View File

@ -68,13 +68,13 @@ public class TextFile extends AbstractFile
// check whether file is spread over multiple buffers
if (buffers != null)
return treeFileText (text);
return treeFileText (text); // calls knownLength()
// check whether the record length is known
if (recordLength == 0)
return unknownLength (text);
text.append ("Offset Record Text values\n");
text.append ("Offset Record# Text values\n");
text.append (
"------ ------- -------------------------------------------------------\n");
return knownLength (text, 0).toString ();
@ -82,9 +82,12 @@ public class TextFile extends AbstractFile
private String treeFileText (StringBuilder text)
{
text.append (" Offset Record# Text values\n");
text.append (
"---------- ------- -------------------------------------------------------\n");
for (TextBuffer tb : buffers)
{
this.buffer = tb.buffer;
buffer = tb.buffer;
knownLength (text, tb.firstRecNo);
}
return text.toString ();
@ -105,7 +108,10 @@ public class TextFile extends AbstractFile
while (buffer[ptr + bytes - 1] == 0)
bytes--;
text.append (String.format ("%,6d %,8d %s%n", ptr, recNo++,
if ((buffer[ptr + bytes - 1] & 0x7F) == 0x0D) // ignore CR
bytes--;
text.append (String.format ("%,10d %,8d %s%n", recNo * recordLength, recNo++,
HexFormatter.getString (buffer, ptr, bytes)));
}
return text;
@ -118,20 +124,22 @@ public class TextFile extends AbstractFile
int size = buffer.length;
int lastVal = 0;
boolean newFormat = true;
boolean showAllOffsets = false;
boolean showAllOffsets = true;
if (newFormat)
{
text.append ("Offset Text values\n");
text.append ("------ -------------------------------------------------------"
text.append (" Offset Text values\n");
text.append ("---------- -------------------------------------------------------"
+ "-------------------\n");
if (size == 0)
if (buffer.length == 0)
return text.toString ();
if (buffer[ptr] != 0)
text.append (String.format ("%6d ", ptr));
if (buffer[0] != 0)
text.append (String.format ("%,10d ", ptr));
}
int gcd = 0;
while (ptr < size)
{
int val = buffer[ptr++] & 0x7F; // strip hi-order bit
@ -144,24 +152,34 @@ public class TextFile extends AbstractFile
if (nulls > 0)
{
if (newFormat)
text.append (String.format ("%6d ", ptr - 1));
text.append (String.format ("%,10d ", ptr - 1));
else
text.append ("\nNew record at : " + (ptr - 1) + "\n");
nulls = 0;
gcd = gcd == 0 ? ptr - 1 : gcd (gcd, ptr - 1);
}
else if (lastVal == 0x0D && newFormat)
if (showAllOffsets)
text.append (String.format ("%6d ", ptr - 1));
text.append (String.format ("%,10d ", ptr - 1));
else
text.append (" ");
text.append (" ");
text.append ((char) val);
}
lastVal = val;
}
if (text.length () > 0 && text.charAt (text.length () - 1) == '\n')
if (gcd > 0)
text.append ("\nGCD: " + gcd);
else if (text.length () > 0 && text.charAt (text.length () - 1) == '\n')
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
private int gcd (int a, int b)
{
return a == 0 ? b : gcd (b % a, a);
}
}

View File

@ -166,7 +166,6 @@ abstract class AbstractCatalogEntry implements AppleFileSource
if (reportedLength > buffer.length)
reportedLength = buffer.length - 2;
System.arraycopy (buffer, 2, exactBuffer, 0, reportedLength);
// appleFile = new ApplesoftBasicProgram (name, exactBuffer);
appleFile = new BasicProgram (name, exactBuffer);
break;

View File

@ -82,7 +82,8 @@ class DiskLayoutPanel extends JPanel
verticalRuler.setLayout (layout);
horizontalRuler.setLayout (layout);
legendPanel.setDisk (disk, layout);
sp.setViewportView (diskLayoutImage); // this is the only way I know of to force a refresh
sp.setViewportView (diskLayoutImage); // this is the only way I know of to
// force a refresh
setLayout (new BorderLayout ());
if (disk.getGridLayout ().height == 35)
@ -154,7 +155,6 @@ class DiskLayoutPanel extends JPanel
// This can happen if a file is selected from a dual-dos disk
checkCorrectDisk (event.file.getFormattedDisk ());
// This may need to allow for sparse text files with null DiskAddresses
diskLayoutImage.setSelection (event.file.getSectors ());
}

View File

@ -148,11 +148,11 @@ class DiskLayoutSelection implements Iterable<DiskAddress>
public void setSelection (List<DiskAddress> list)
{
// for some reason list sometimes contains nulls
// sparse files contain empty blocks
highlights.clear ();
if (list != null)
for (DiskAddress da : list)
if (da != null)
if (da != null && da.getBlock () > 0)
highlights.add (da);
}

View File

@ -20,36 +20,12 @@ public class FileEntry extends CatalogEntry
int max = Math.min (lastBlock, parent.getDisk ().getTotalBlocks ());
for (int i = firstBlock; i < max; i++)
{
switch (fileType)
if (fileType < parent.sectors.length)
parent.sectorTypes[i] = parent.sectors[fileType];
else
{
case 2:
parent.sectorTypes[i] = parent.codeSector;
break;
case 3:
parent.sectorTypes[i] = parent.textSector;
break;
case 4:
parent.sectorTypes[i] = parent.infoSector;
break;
case 5:
parent.sectorTypes[i] = parent.dataSector;
break;
case 6:
parent.sectorTypes[i] = parent.grafSector;
break;
case 7:
parent.sectorTypes[i] = parent.fotoSector;
break;
default:
System.out.println ("Unknown pascal file type : " + fileType);
parent.sectorTypes[i] = parent.dataSector;
break;
System.out.println ("Unknown pascal file type : " + fileType);
parent.sectorTypes[i] = parent.dataSector;
}
}
}
@ -109,10 +85,6 @@ public class FileEntry extends CatalogEntry
case 5: // data
if (name.equals ("SYSTEM.CHARSET"))
file = new Charset (name, buffer);
// else if (name.equals ("WT")) // only testing
// file = new WizardryTitle (name, buffer);
// else if (name.equals ("SYSTEM.RELOC"))
// file = new Relocator (name, buffer);
else
file = new DefaultAppleFile (name, buffer);
break;

View File

@ -25,7 +25,7 @@ public class PascalDisk extends AbstractFormattedDisk
protected Relocator relocator;
final String[] fileTypes =
{ "Volume", "Xdsk", "Code", "Text", "Info", "Data", "Graf", "Foto", "SecureDir" };
{ "Volume", "Bad ", "Code", "Text", "Info", "Data", "Graf", "Foto", "SecureDir" };
SectorType diskBootSector = new SectorType ("Boot", Color.lightGray);
SectorType catalogSector = new SectorType ("Catalog", Color.magenta);
@ -35,6 +35,10 @@ public class PascalDisk extends AbstractFormattedDisk
SectorType infoSector = new SectorType ("Info", Color.orange);
SectorType grafSector = new SectorType ("Graf", Color.cyan);
SectorType fotoSector = new SectorType ("Foto", Color.gray);
SectorType badSector = new SectorType ("Bad", Color.darkGray);
SectorType[] sectors = { catalogSector, badSector, codeSector, textSector, infoSector,
dataSector, grafSector, fotoSector };
public PascalDisk (Disk disk)
{
@ -48,6 +52,7 @@ public class PascalDisk extends AbstractFormattedDisk
sectorTypesList.add (infoSector);
sectorTypesList.add (grafSector);
sectorTypesList.add (fotoSector);
sectorTypesList.add (badSector);
List<DiskAddress> blocks = disk.getDiskAddressList (0, 1); // B0, B1
this.bootSector = new BootSector (disk, disk.readSectors (blocks), "Pascal");

View File

@ -34,8 +34,8 @@ public interface ProdosConstants
int TYPE_DIRECTORY_HEADER = 15;
int TYPE_SUBDIRECTORY_HEADER = 14;
int TYPE_SUBDIRECTORY = 13;
int TYPE_GSOS_EXTENDED_FILE = 5;
int TYPE_PASCAL_ON_PROFILE = 4;
int TYPE_GSOS_EXTENDED_FILE = 5; // tech note #25
int TYPE_PASCAL_ON_PROFILE = 4; // tech note #25
int TYPE_TREE = 3;
int TYPE_SAPLING = 2;
int TYPE_SEEDLING = 1;

View File

@ -110,16 +110,4 @@ class LZW
{
return 32 - Integer.numberOfLeadingZeros (maximumValue);
}
static int getLong (byte[] buffer, int ptr)
{
return getWord (buffer, ptr) + getWord (buffer, ptr + 2) * 0x10000;
}
static int getWord (byte[] buffer, int ptr)
{
int a = (buffer[ptr + 1] & 0xFF) << 8;
int b = buffer[ptr] & 0xFF;
return a + b;
}
}

View File

@ -8,7 +8,7 @@ class LZW1 extends LZW
{
bytes = Objects.requireNonNull (buffer);
crc = LZW.getWord (buffer, 0);
crc = Utility.getWord (buffer, 0);
crcBase = 0;
volume = buffer[2] & 0xFF;
@ -17,7 +17,7 @@ class LZW1 extends LZW
while (ptr < buffer.length - 1) // what is in the last byte?
{
int rleLength = LZW.getWord (buffer, ptr);
int rleLength = Utility.getWord (buffer, ptr);
int lzwPerformed = buffer[ptr + 2] & 0xFF;
ptr += 3;

View File

@ -22,7 +22,7 @@ class LZW2 extends LZW
while (ptr < buffer.length - 1) // what is in the last byte?
{
int rleLength = LZW.getWord (buffer, ptr);
int rleLength = Utility.getWord (buffer, ptr);
boolean lzwPerformed = (rleLength & 0x8000) != 0;
ptr += 2;
@ -32,7 +32,7 @@ class LZW2 extends LZW
if (rleLength == 0)
rleLength = TRACK_LENGTH;
int chunkLength = LZW.getWord (buffer, ptr);
int chunkLength = Utility.getWord (buffer, ptr);
ptr += 2;
setBuffer (buffer, ptr); // prepare to read n-bit integers

View File

@ -129,12 +129,12 @@ public class NuFX
throw new FileFormatException ("NuFile not found");
}
crc = LZW.getWord (buffer, ptr + 6);
totalRecords = LZW.getLong (buffer, ptr + 8);
crc = Utility.getWord (buffer, ptr + 6);
totalRecords = Utility.getLong (buffer, ptr + 8);
created = new DateTime (buffer, ptr + 12);
modified = new DateTime (buffer, ptr + 20);
version = LZW.getWord (buffer, ptr + 28);
eof = LZW.getLong (buffer, ptr + 38);
version = Utility.getWord (buffer, ptr + 28);
eof = Utility.getLong (buffer, ptr + 38);
byte[] crcBuffer = new byte[40];
System.arraycopy (buffer, ptr + 8, crcBuffer, 0, crcBuffer.length);
@ -203,21 +203,21 @@ public class NuFX
if (!isNuFX (buffer, dataPtr))
throw new FileFormatException ("NuFX not found");
crc = LZW.getWord (buffer, dataPtr + 4);
attributes = LZW.getWord (buffer, dataPtr + 6);
version = LZW.getWord (buffer, dataPtr + 8);
totThreads = LZW.getLong (buffer, dataPtr + 10);
fileSystemID = LZW.getWord (buffer, dataPtr + 14);
crc = Utility.getWord (buffer, dataPtr + 4);
attributes = Utility.getWord (buffer, dataPtr + 6);
version = Utility.getWord (buffer, dataPtr + 8);
totThreads = Utility.getLong (buffer, dataPtr + 10);
fileSystemID = Utility.getWord (buffer, dataPtr + 14);
separator = (char) (buffer[dataPtr + 16] & 0x00FF);
access = LZW.getLong (buffer, dataPtr + 18);
fileType = LZW.getLong (buffer, dataPtr + 22);
auxType = LZW.getLong (buffer, dataPtr + 26);
storType = LZW.getWord (buffer, dataPtr + 30);
access = Utility.getLong (buffer, dataPtr + 18);
fileType = Utility.getLong (buffer, dataPtr + 22);
auxType = Utility.getLong (buffer, dataPtr + 26);
storType = Utility.getWord (buffer, dataPtr + 30);
created = new DateTime (buffer, dataPtr + 32);
modified = new DateTime (buffer, dataPtr + 40);
archived = new DateTime (buffer, dataPtr + 48);
optionSize = LZW.getWord (buffer, dataPtr + 56);
fileNameLength = LZW.getWord (buffer, dataPtr + attributes - 2);
optionSize = Utility.getWord (buffer, dataPtr + 56);
fileNameLength = Utility.getWord (buffer, dataPtr + attributes - 2);
int len = attributes + fileNameLength - 6;
byte[] crcBuffer = new byte[len + totThreads * 16];

View File

@ -104,12 +104,12 @@ class Thread
public ThreadHeader (byte[] buffer, int offset)
{
threadClass = LZW.getWord (buffer, offset);
format = LZW.getWord (buffer, offset + 2);
threadKind = LZW.getWord (buffer, offset + 4);
crc = LZW.getWord (buffer, offset + 6);
uncompressedEOF = LZW.getLong (buffer, offset + 8);
compressedEOF = LZW.getLong (buffer, offset + 12);
threadClass = Utility.getWord (buffer, offset);
format = Utility.getWord (buffer, offset + 2);
threadKind = Utility.getWord (buffer, offset + 4);
crc = Utility.getWord (buffer, offset + 6);
uncompressedEOF = Utility.getLong (buffer, offset + 8);
compressedEOF = Utility.getLong (buffer, offset + 12);
}
@Override

View File

@ -31,6 +31,18 @@ public class Utility
.equals (AffineTransform.getScaleInstance (2.0, 2.0));
}
static int getLong (byte[] buffer, int ptr)
{
return getWord (buffer, ptr) + getWord (buffer, ptr + 2) * 0x10000;
}
static int getWord (byte[] buffer, int ptr)
{
int a = (buffer[ptr + 1] & 0xFF) << 8;
int b = buffer[ptr] & 0xFF;
return a + b;
}
public static boolean find (byte[] buffer, byte[] key)
{
for (int i = 0; i < buffer.length; i++)