mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-12-01 09:50:32 +00:00
Wiz 4
This commit is contained in:
parent
3062189ee8
commit
77aebb3597
@ -29,7 +29,8 @@ public class PascalCode extends AbstractFile
|
|||||||
if (false)
|
if (false)
|
||||||
{
|
{
|
||||||
System.out.println (name);
|
System.out.println (name);
|
||||||
byte[] key = new byte[] { 0x38, 0x00, 0x0C, 0x1C };
|
// byte[] key = new byte[] { 0x38, 0x00, 0x0C, 0x1C };
|
||||||
|
byte[] key = new byte[] { 0x0F };
|
||||||
Utility.find (buffer, key);
|
Utility.find (buffer, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,10 +65,10 @@ public class PascalCode extends AbstractFile
|
|||||||
|
|
||||||
text.append ("Segment Dictionary\n==================\n\n");
|
text.append ("Segment Dictionary\n==================\n\n");
|
||||||
|
|
||||||
text.append ("Slot Addr Len Len Name Kind"
|
text.append ("Slot Addr Blks Len Len Name Kind"
|
||||||
+ " Text Seg# Mtyp Vers I/S\n");
|
+ " Txt Seg Mch Ver I/S I/S\n");
|
||||||
text.append ("---- ---- ----- ----- -------- ---------------"
|
text.append ("---- ---- ---- ---- ----- -------- ---------------"
|
||||||
+ " ---- ---- ---- ---- ---\n");
|
+ " --- --- --- --- --- ---\n");
|
||||||
|
|
||||||
for (PascalSegment segment : segments)
|
for (PascalSegment segment : segments)
|
||||||
text.append (segment.toText () + "\n");
|
text.append (segment.toText () + "\n");
|
||||||
|
@ -67,7 +67,7 @@ public class PascalProcedure
|
|||||||
|
|
||||||
while (ptr < max)
|
while (ptr < max)
|
||||||
{
|
{
|
||||||
System.out.printf ("ptr:%d, max:%d, buf:%d %n", ptr, max, buffer.length);
|
// System.out.printf ("ptr:%d, max:%d, buf:%d %n", ptr, max, buffer.length);
|
||||||
if (ptr >= buffer.length || ptr < 0)
|
if (ptr >= buffer.length || ptr < 0)
|
||||||
{
|
{
|
||||||
System.out.println ("Ptr outside buffer");
|
System.out.println ("Ptr outside buffer");
|
||||||
@ -138,19 +138,18 @@ public class PascalProcedure
|
|||||||
StringBuilder text = new StringBuilder ("\nProcedure Header\n================\n\n");
|
StringBuilder text = new StringBuilder ("\nProcedure Header\n================\n\n");
|
||||||
|
|
||||||
if (false)
|
if (false)
|
||||||
text.append (HexFormatter.format (buffer, procOffset + jumpTable, 2 - jumpTable)
|
text.append (
|
||||||
+ "\n\n");
|
HexFormatter.format (buffer, procOffset + jumpTable, 2 - jumpTable) + "\n\n");
|
||||||
|
|
||||||
text.append (String.format ("Level.......%5d %02X%n", procLevel,
|
text.append (
|
||||||
procLevel & 0xFF));
|
String.format ("Level.......%5d %02X%n", procLevel, procLevel & 0xFF));
|
||||||
text.append (String.format ("Proc no.....%5d %02X%n", procedureNo, procedureNo));
|
text.append (String.format ("Proc no.....%5d %02X%n", procedureNo, procedureNo));
|
||||||
text.append (String.format ("Code entry..%5d %04X (%04X - %04X = %04X)%n",
|
text.append (String.format ("Code entry..%5d %04X (%04X - %04X = %04X)%n",
|
||||||
codeStart, codeStart, (procOffset - 2), codeStart,
|
codeStart, codeStart, (procOffset - 2), codeStart, (procOffset - codeStart - 2)));
|
||||||
(procOffset - codeStart - 2)));
|
|
||||||
text.append (String.format ("Code exit...%5d %04X", codeEnd, codeEnd));
|
text.append (String.format ("Code exit...%5d %04X", codeEnd, codeEnd));
|
||||||
if (codeEnd > 0)
|
if (codeEnd > 0)
|
||||||
text.append (String.format (" (%04X - %04X = %04X)%n", (procOffset - 4), codeEnd,
|
text.append (String.format (" (%04X - %04X = %04X)%n", (procOffset - 4), codeEnd,
|
||||||
(procOffset - codeEnd - 4)));
|
(procOffset - codeEnd - 4)));
|
||||||
else
|
else
|
||||||
text.append (String.format ("%n"));
|
text.append (String.format ("%n"));
|
||||||
text.append (String.format ("Parm size...%5d %04X%n", parmSize, parmSize));
|
text.append (String.format ("Parm size...%5d %04X%n", parmSize, parmSize));
|
||||||
@ -181,7 +180,7 @@ public class PascalProcedure
|
|||||||
{
|
{
|
||||||
ptr = i - ((buffer[i + 1] & 0xFF) * 256 + (buffer[i] & 0xFF));
|
ptr = i - ((buffer[i + 1] & 0xFF) * 256 + (buffer[i] & 0xFF));
|
||||||
text.append (String.format ("%05X : %02X %02X --> %04X%n", i, buffer[i],
|
text.append (String.format ("%05X : %02X %02X --> %04X%n", i, buffer[i],
|
||||||
buffer[i + 1], ptr));
|
buffer[i + 1], ptr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,8 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
private final int segmentNoHeader;
|
private final int segmentNoHeader;
|
||||||
private int segmentNoBody;
|
private int segmentNoBody;
|
||||||
|
|
||||||
public final int blockNo;
|
public int blockNo;
|
||||||
|
public int newBlockNo;
|
||||||
public final int size;
|
public final int size;
|
||||||
|
|
||||||
private final int segKind;
|
private final int segKind;
|
||||||
@ -23,6 +24,19 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
private final int slot;
|
private final int slot;
|
||||||
private int totalProcedures;
|
private int totalProcedures;
|
||||||
private List<PascalProcedure> procedures;
|
private List<PascalProcedure> procedures;
|
||||||
|
private static final List<Redirection> redirections = new ArrayList<Redirection> ();
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
// somehow this should match the data in SYSTEM.RELOC
|
||||||
|
redirections.add (new Redirection ("WIZARDRY", 0x01, 0x1C66, 0x01));
|
||||||
|
redirections.add (new Redirection ("KANJIREA", 0x013F, 0x104E, 0x10));
|
||||||
|
redirections.add (new Redirection ("UTILITIE", 0x48, 0x1598, 0x19));
|
||||||
|
redirections.add (new Redirection ("SHOPS", 0x53, 0x0BE2, 0x24));
|
||||||
|
redirections.add (new Redirection ("CAMP", 0x70, 0x24CA, 0x2A));
|
||||||
|
redirections.add (new Redirection ("DOCOPY", 0x83, 0x07A0, 0x3D));
|
||||||
|
redirections.add (new Redirection ("DOCACHE", 0x87, 0x072E, 0x41));
|
||||||
|
}
|
||||||
|
|
||||||
public PascalSegment (String name, byte[] fullBuffer, int seq)
|
public PascalSegment (String name, byte[] fullBuffer, int seq)
|
||||||
{
|
{
|
||||||
@ -32,37 +46,48 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
this.blockNo = HexFormatter.intValue (fullBuffer[seq * 4], fullBuffer[seq * 4 + 1]);
|
this.blockNo = HexFormatter.intValue (fullBuffer[seq * 4], fullBuffer[seq * 4 + 1]);
|
||||||
this.size = HexFormatter.intValue (fullBuffer[seq * 4 + 2], fullBuffer[seq * 4 + 3]);
|
this.size = HexFormatter.intValue (fullBuffer[seq * 4 + 2], fullBuffer[seq * 4 + 3]);
|
||||||
|
|
||||||
|
for (Redirection redirection : redirections)
|
||||||
|
if (redirection.matches (name, blockNo, size))
|
||||||
|
{
|
||||||
|
newBlockNo = redirection.newOffset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
segKind = HexFormatter.intValue (fullBuffer[0xC0 + seq * 2],
|
segKind = HexFormatter.intValue (fullBuffer[0xC0 + seq * 2],
|
||||||
fullBuffer[0xC0 + seq * 2 + 1]);
|
fullBuffer[0xC0 + seq * 2 + 1]);
|
||||||
|
|
||||||
textAddress = HexFormatter.intValue (fullBuffer[0xE0 + seq * 2],
|
textAddress = HexFormatter.intValue (fullBuffer[0xE0 + seq * 2],
|
||||||
fullBuffer[0xE0 + seq * 2 + 1]);
|
fullBuffer[0xE0 + seq * 2 + 1]);
|
||||||
|
|
||||||
|
// segment 1 is the main segment, 2-6 are used by the system, and 7
|
||||||
|
// onwards is for our program
|
||||||
this.segmentNoHeader = fullBuffer[0x100 + seq * 2] & 0xFF;
|
this.segmentNoHeader = fullBuffer[0x100 + seq * 2] & 0xFF;
|
||||||
int flags = fullBuffer[0x101 + seq * 2] & 0xFF;
|
int flags = fullBuffer[0x101 + seq * 2] & 0xFF;
|
||||||
machineType = flags & 0x0F;
|
machineType = flags & 0x0F;
|
||||||
version = (flags & 0xD0) >> 5;
|
version = (flags & 0xD0) >> 5;
|
||||||
intrinsSegs1 = HexFormatter.intValue (fullBuffer[0x120 + seq * 4],
|
intrinsSegs1 = HexFormatter.intValue (fullBuffer[0x120 + seq * 4],
|
||||||
fullBuffer[0x120 + seq * 4 + 1]);
|
fullBuffer[0x120 + seq * 4 + 1]);
|
||||||
intrinsSegs2 = HexFormatter.intValue (fullBuffer[0x120 + seq * 4 + 2],
|
intrinsSegs2 = HexFormatter.intValue (fullBuffer[0x120 + seq * 4 + 2],
|
||||||
fullBuffer[0x120 + seq * 4 + 3]);
|
fullBuffer[0x120 + seq * 4 + 3]);
|
||||||
|
|
||||||
int offset = blockNo * 512;
|
int offset = blockNo * 512;
|
||||||
|
if (newBlockNo > 0)
|
||||||
|
offset = newBlockNo * 512;
|
||||||
// System.out.printf ("Seq:%d, block:%d, size:%d, seg:%d, kind:%d, address:%d %n", seq,
|
// System.out.printf ("Seq:%d, block:%d, size:%d, seg:%d, kind:%d, address:%d %n", seq,
|
||||||
// blockNo, size, segmentNoHeader, segKind, textAddress);
|
// blockNo, size, segmentNoHeader, segKind, textAddress);
|
||||||
// System.out.println (HexFormatter.format (fullBuffer));
|
// System.out.println (HexFormatter.format (fullBuffer));
|
||||||
if (offset < fullBuffer.length)
|
if (offset < fullBuffer.length)
|
||||||
{
|
{
|
||||||
buffer = new byte[size]; // replaces this.buffer with the segment buffer only
|
buffer = new byte[size]; // replaces this.buffer with the segment buffer only
|
||||||
System.arraycopy (fullBuffer, blockNo * 512, buffer, 0, size);
|
System.arraycopy (fullBuffer, offset, buffer, 0, size);
|
||||||
totalProcedures = buffer[size - 1] & 0xFF;
|
totalProcedures = buffer[size - 1] & 0xFF;
|
||||||
segmentNoBody = buffer[size - 2] & 0xFF;
|
segmentNoBody = buffer[size - 2] & 0xFF;
|
||||||
|
|
||||||
if (segmentNoHeader == 0)
|
if (segmentNoHeader == 0)
|
||||||
System.out.printf ("Zero segment header in %s seq %d%n", name, seq);
|
System.out.printf ("Zero segment header in %s seq %d%n", name, seq);
|
||||||
else if (segmentNoBody != segmentNoHeader)
|
else if (segmentNoBody != segmentNoHeader)
|
||||||
System.out.println ("Segment number mismatch : " + segmentNoBody + " / "
|
System.out.println (
|
||||||
+ segmentNoHeader);
|
"Segment number mismatch : " + segmentNoBody + " / " + segmentNoHeader);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -82,10 +107,14 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
|
|
||||||
public String toText ()
|
public String toText ()
|
||||||
{
|
{
|
||||||
return String
|
int sizeInBlocks = (size - 1) / 512 + 1;
|
||||||
.format (" %2d %02X %04X %,6d %-8s %-15s %3d %02X %d %d %d %d",
|
String newBlock = newBlockNo > 0 ? String.format ("%02X + %02X = %02X", newBlockNo,
|
||||||
slot, blockNo, size, size, name, SegmentKind[segKind], textAddress,
|
sizeInBlocks, (newBlockNo + sizeInBlocks)) : "";
|
||||||
segmentNoHeader, machineType, version, intrinsSegs1, intrinsSegs2);
|
return String.format (
|
||||||
|
" %2d %02X %02X %04X %,6d %-8s %-15s%3d "
|
||||||
|
+ "%02X %d %d %d %d %s",
|
||||||
|
slot, blockNo, sizeInBlocks, size, size, name, SegmentKind[segKind], textAddress,
|
||||||
|
segmentNoHeader, machineType, version, intrinsSegs1, intrinsSegs2, newBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -114,18 +143,18 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
text.append (HexFormatter.format (buffer, buffer.length - len, len) + "\n\n");
|
text.append (HexFormatter.format (buffer, buffer.length - len, len) + "\n\n");
|
||||||
|
|
||||||
text.append ("Proc Offset Lvl Entry Exit Parm Data Proc header\n");
|
text.append ("Proc Offset Lvl Entry Exit Parm Data Proc header\n");
|
||||||
text.append ("---- ------ --- ----- ---- ---- ---- --------------------\n");
|
text.append (
|
||||||
|
"---- ------ --- ----- ---- ---- ---- --------------------\n");
|
||||||
for (PascalProcedure procedure : procedures)
|
for (PascalProcedure procedure : procedures)
|
||||||
{
|
{
|
||||||
if (procedure.valid)
|
if (procedure.valid)
|
||||||
{
|
{
|
||||||
int address = size - procedure.slot * 2 - 2;
|
int address = size - procedure.slot * 2 - 2;
|
||||||
text.append (String
|
text.append (String.format (
|
||||||
.format (" %3d %04X %3d %04X %04X %04X %04X (%04X - %04X = %04X)%n",
|
" %3d %04X %3d %04X %04X %04X %04X (%04X - %04X = %04X)%n",
|
||||||
procedure.procedureNo, procedure.offset, procedure.procLevel,
|
procedure.procedureNo, procedure.offset, procedure.procLevel,
|
||||||
procedure.codeStart, procedure.codeEnd, procedure.parmSize,
|
procedure.codeStart, procedure.codeEnd, procedure.parmSize,
|
||||||
procedure.dataSize, address, procedure.offset,
|
procedure.dataSize, address, procedure.offset, procedure.procOffset));
|
||||||
procedure.procOffset));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
text.append (String.format (" %3d %04X%n", procedure.slot, procedure.offset));
|
text.append (String.format (" %3d %04X%n", procedure.slot, procedure.offset));
|
||||||
@ -136,8 +165,8 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
{
|
{
|
||||||
List<PascalCodeStatement> strings = pp.extractStrings ();
|
List<PascalCodeStatement> strings = pp.extractStrings ();
|
||||||
for (PascalCodeStatement cs : strings)
|
for (PascalCodeStatement cs : strings)
|
||||||
text.append (String.format (" %2d %04X %s%n", pp.procedureNo, cs.ptr,
|
text.append (
|
||||||
cs.text));
|
String.format (" %2d %04X %s%n", pp.procedureNo, cs.ptr, cs.text));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PascalProcedure procedure : procedures)
|
for (PascalProcedure procedure : procedures)
|
||||||
@ -146,3 +175,24 @@ public class PascalSegment extends AbstractFile implements PascalConstants
|
|||||||
return text.toString ();
|
return text.toString ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Redirection
|
||||||
|
{
|
||||||
|
int oldOffset;
|
||||||
|
int newOffset;
|
||||||
|
int length;
|
||||||
|
String name;
|
||||||
|
|
||||||
|
public Redirection (String name, int oldOffset, int length, int newOffset)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.oldOffset = oldOffset;
|
||||||
|
this.newOffset = newOffset;
|
||||||
|
this.length = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches (String name, int offset, int length)
|
||||||
|
{
|
||||||
|
return this.name.equals (name) && this.oldOffset == offset && this.length == length;
|
||||||
|
}
|
||||||
|
}
|
@ -100,8 +100,9 @@ public class Relocator extends AbstractFile
|
|||||||
@Override
|
@Override
|
||||||
public String toString ()
|
public String toString ()
|
||||||
{
|
{
|
||||||
return String.format (" %04X %04X %04X %04X", logicalBlock,
|
return String.format (" %04X %04X %04X %04X %04X",
|
||||||
physicalBlock, segmentLength, (physicalBlock - 0x46));
|
logicalBlock, physicalBlock, segmentLength,
|
||||||
|
(logicalBlock - 0x46), (physicalBlock - 0x46));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -30,16 +30,15 @@ abstract class CatalogEntry implements AppleFileSource
|
|||||||
firstBlock = HexFormatter.intValue (buffer[0], buffer[1]);
|
firstBlock = HexFormatter.intValue (buffer[0], buffer[1]);
|
||||||
lastBlock = HexFormatter.intValue (buffer[2], buffer[3]);
|
lastBlock = HexFormatter.intValue (buffer[2], buffer[3]);
|
||||||
fileType = HexFormatter.intValue (buffer[4], buffer[5]);
|
fileType = HexFormatter.intValue (buffer[4], buffer[5]);
|
||||||
// fileType = buffer[4] & 0x0F;
|
|
||||||
name = HexFormatter.getPascalString (buffer, 6);
|
name = HexFormatter.getPascalString (buffer, 6);
|
||||||
bytesUsedInLastBlock = HexFormatter.intValue (buffer[16], buffer[17]);
|
bytesUsedInLastBlock = HexFormatter.intValue (buffer[16], buffer[17]);
|
||||||
|
|
||||||
Disk disk = parent.getDisk ();
|
Disk disk = parent.getDisk ();
|
||||||
for (int i = firstBlock; i < lastBlock; i++)
|
for (int i = firstBlock; i < lastBlock; i++)
|
||||||
{
|
{
|
||||||
if (i >= 280)
|
if (i >= 0x118)
|
||||||
{
|
{
|
||||||
System.out.printf ("CatalogEntry: block %04X >= 280%n", i);
|
System.out.printf ("CatalogEntry: block 0x%04X >= 0x0118%n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
blocks.add (disk.getDiskAddress (i));
|
blocks.add (disk.getDiskAddress (i));
|
||||||
|
@ -64,7 +64,10 @@ class FileEntry extends CatalogEntry
|
|||||||
switch (fileType)
|
switch (fileType)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
file = new PascalCode (name, buffer);
|
if (name.equals ("SYSTEM.INTERP"))
|
||||||
|
file = new AssemblerProgram (name, buffer, 0xD000);
|
||||||
|
else
|
||||||
|
file = new PascalCode (name, buffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -103,7 +103,7 @@ public class PascalDisk extends AbstractFormattedDisk
|
|||||||
fileEntries.add (fileEntry);
|
fileEntries.add (fileEntry);
|
||||||
DefaultMutableTreeNode node = new DefaultMutableTreeNode (fileEntry);
|
DefaultMutableTreeNode node = new DefaultMutableTreeNode (fileEntry);
|
||||||
|
|
||||||
if (fileEntry.fileType == 2) // PascalCode
|
if (fileEntry.fileType == 2 && fileEntry.getDataSource () instanceof PascalCode) // PascalCode
|
||||||
{
|
{
|
||||||
node.setAllowsChildren (true);
|
node.setAllowsChildren (true);
|
||||||
PascalCode pascalCode = (PascalCode) fileEntry.getDataSource ();
|
PascalCode pascalCode = (PascalCode) fileEntry.getDataSource ();
|
||||||
|
Loading…
Reference in New Issue
Block a user