wizardry 4 changes

This commit is contained in:
Denis Molony 2016-08-03 21:32:47 +10:00
parent e911fae830
commit 3062189ee8
12 changed files with 97 additions and 42 deletions

View File

@ -6,6 +6,7 @@ import java.util.List;
import com.bytezone.diskbrowser.utilities.FileFormatException; import com.bytezone.diskbrowser.utilities.FileFormatException;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
import com.bytezone.diskbrowser.utilities.Utility;
public class PascalCode extends AbstractFile public class PascalCode extends AbstractFile
implements PascalConstants, Iterable<PascalSegment> implements PascalConstants, Iterable<PascalSegment>
@ -25,25 +26,31 @@ public class PascalCode extends AbstractFile
{ {
super (name, buffer); super (name, buffer);
int nonameCounter = 0; int nonameCounter = 0;
if (false)
{
System.out.println (name);
byte[] key = new byte[] { 0x38, 0x00, 0x0C, 0x1C };
Utility.find (buffer, key);
}
// Build segment list (up to 16 segments) // Create segment list (up to 16 segments)
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
{ {
codeName = HexFormatter.getString (buffer, 0x40 + i * 8, 8).trim (); codeName = HexFormatter.getString (buffer, 0x40 + i * 8, 8).trim ();
if (codeName.length () == 0)
codeName = "<NULL" + nonameCounter++ + ">";
int size = HexFormatter.intValue (buffer[i * 4 + 2], buffer[i * 4 + 3]); int size = HexFormatter.intValue (buffer[i * 4 + 2], buffer[i * 4 + 3]);
System.out.printf ("%s %s %d %n", HexFormatter.getHexString (buffer, i * 4, 4), // System.out.printf ("%s %s %d %n", HexFormatter.getHexString (buffer, i * 4, 4),
codeName, size); // codeName, size);
if (size > 0) if (size > 0)
{ {
if (codeName.length () == 0)
codeName = "<NULL" + nonameCounter++ + ">";
try try
{ {
segments.add (new PascalSegment (codeName, buffer, i)); segments.add (new PascalSegment (codeName, buffer, i));
} }
catch (FileFormatException e) catch (FileFormatException e)
{ {
System.out.println ("Bad segment"); System.out.printf ("Bad segment: %d%n", i);
} }
} }
} }

View File

@ -334,4 +334,20 @@ public class PascalCodeStatement implements PascalConstants
return String.format ("%04X", addressTo); return String.format ("%04X", addressTo);
} }
} }
} }
/* from Wizardry info 1.txt
LDC instruction
---------------
Earlier today I noticed the LDC pcode instruction seems to display
differently at times. Then I realized that it is operating with WORD
values and needs to have them aligned on an even BYTE boundary. For
example:
5004 B3 02 8C 3F CD CC
LDC. PUSH 02 WORDS
5017 B3 02 (02)8C 3F CD CC
LDC. PUSH 02 WORDS
*/

View File

@ -38,7 +38,7 @@ public class PascalProcedure
if (valid) if (valid)
{ {
procedureNo = buffer[procOffset] & 0xFF; procedureNo = buffer[procOffset] & 0xFF;
procLevel = buffer[procOffset + 1]; procLevel = buffer[procOffset + 1] & 0xFF;
codeStart = HexFormatter.intValue (buffer[procOffset - 2], buffer[procOffset - 1]); codeStart = HexFormatter.intValue (buffer[procOffset - 2], buffer[procOffset - 1]);
codeEnd = HexFormatter.intValue (buffer[procOffset - 4], buffer[procOffset - 3]); codeEnd = HexFormatter.intValue (buffer[procOffset - 4], buffer[procOffset - 3]);
parmSize = HexFormatter.intValue (buffer[procOffset - 6], buffer[procOffset - 5]); parmSize = HexFormatter.intValue (buffer[procOffset - 6], buffer[procOffset - 5]);

View File

@ -31,12 +31,14 @@ public class PascalSegment extends AbstractFile implements PascalConstants
this.slot = seq; this.slot = seq;
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]);
this.segmentNoHeader = fullBuffer[0x100 + seq * 2];
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]);
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;
@ -64,8 +66,8 @@ public class PascalSegment extends AbstractFile implements PascalConstants
} }
else else
{ {
System.out.printf ("Error in blocksize %,d > %,d for pascal disk%n", offset, // System.out.printf ("Error in blocksize %,d > %,d for pascal disk%n", offset,
fullBuffer.length); // fullBuffer.length);
throw new FileFormatException ("Error in PascalSegment"); throw new FileFormatException ("Error in PascalSegment");
} }
} }
@ -81,7 +83,7 @@ public class PascalSegment extends AbstractFile implements PascalConstants
public String toText () public String toText ()
{ {
return String return String
.format (" %2d %02X %04X %,6d %-8s %-15s %3d %3d %d %d %d %d", .format (" %2d %02X %04X %,6d %-8s %-15s %3d %02X %d %d %d %d",
slot, blockNo, size, size, name, SegmentKind[segKind], textAddress, slot, blockNo, size, size, name, SegmentKind[segKind], textAddress,
segmentNoHeader, machineType, version, intrinsSegs1, intrinsSegs2); segmentNoHeader, machineType, version, intrinsSegs1, intrinsSegs2);
} }
@ -96,13 +98,13 @@ public class PascalSegment extends AbstractFile implements PascalConstants
String title = "Segment - " + name; String title = "Segment - " + name;
text.append (title + "\n" text.append (title + "\n"
+ "===============================".substring (0, title.length ()) + "\n\n"); + "===============================".substring (0, title.length ()) + "\n\n");
String warning = String warning = segmentNoBody == segmentNoHeader ? ""
segmentNoBody == segmentNoHeader ? "" : " (" + segmentNoHeader + " in header)"; : String.format (" (%02X in header)", segmentNoHeader);
text.append (String.format ("Address........ %02X%n", blockNo)); text.append (String.format ("Address........ %02X%n", blockNo));
text.append (String.format ("Length......... %04X%n", buffer.length)); text.append (String.format ("Length......... %04X%n", buffer.length));
text.append (String.format ("Machine type... %d%n", machineType)); text.append (String.format ("Machine type... %d%n", machineType));
text.append (String.format ("Version........ %d%n", version)); text.append (String.format ("Version........ %d%n", version));
text.append (String.format ("Segment........ %d%s%n", segmentNoBody, warning)); text.append (String.format ("Segment........ %02X%s%n", segmentNoBody, warning));
text.append (String.format ("Total procs.... %d%n", procedures.size ())); text.append (String.format ("Total procs.... %d%n", procedures.size ()));
text.append ("\nProcedure Dictionary\n====================\n\n"); text.append ("\nProcedure Dictionary\n====================\n\n");
@ -118,17 +120,15 @@ public class PascalSegment extends AbstractFile implements PascalConstants
if (procedure.valid) if (procedure.valid)
{ {
int address = size - procedure.slot * 2 - 2; int address = size - procedure.slot * 2 - 2;
text.append (String.format ( text.append (String
" %2d %04X %3d %04X %04X %04X " .format (" %3d %04X %3d %04X %04X %04X %04X (%04X - %04X = %04X)%n",
+ "%04X (%04X - %04X = %04X)%n", procedure.procedureNo, procedure.offset, procedure.procLevel,
procedure.procedureNo, procedure.offset, procedure.codeStart, procedure.codeEnd, procedure.parmSize,
procedure.procLevel, procedure.codeStart, procedure.dataSize, address, procedure.offset,
procedure.codeEnd, procedure.parmSize, procedure.procOffset));
procedure.dataSize, address, procedure.offset,
procedure.procOffset));
} }
else else
text.append (String.format (" %2d %04X%n", procedure.slot, procedure.offset)); text.append (String.format (" %3d %04X%n", procedure.slot, procedure.offset));
} }
text.append ("\nStrings\n=======\n"); text.append ("\nStrings\n=======\n");

View File

@ -100,8 +100,8 @@ public class Relocator extends AbstractFile
@Override @Override
public String toString () public String toString ()
{ {
return String.format (" %04X %04X %04X", logicalBlock, physicalBlock, return String.format (" %04X %04X %04X %04X", logicalBlock,
segmentLength); physicalBlock, segmentLength, (physicalBlock - 0x46));
} }
} }
} }

View File

@ -20,7 +20,7 @@ import com.bytezone.diskbrowser.wizardry.WizardryScenarioDisk;
public class DiskFactory public class DiskFactory
{ {
private static boolean debug = true; private static boolean debug = false;
private DiskFactory () private DiskFactory ()
{ {

View File

@ -160,7 +160,7 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
@Override @Override
public void quit (Preferences preferences) public void quit (Preferences preferences)
{ {
windowSaver = new WindowSaver (prefs, this, "DiskBrowser"); // windowSaver = new WindowSaver (prefs, this, "DiskBrowser");
windowSaver.saveWindow (); windowSaver.saveWindow ();
} }

View File

@ -24,8 +24,8 @@ public class WindowSaver
prefs.putInt (key + "Y", frame.getY ()); prefs.putInt (key + "Y", frame.getY ());
prefs.putInt (key + "Height", frame.getHeight ()); prefs.putInt (key + "Height", frame.getHeight ());
prefs.putInt (key + "Width", frame.getWidth ()); prefs.putInt (key + "Width", frame.getWidth ());
System.out.printf ("Saving x:%d, y:%d, w:%d, h:%d%n", frame.getX (), frame.getY (), // System.out.printf ("Saving x:%d, y:%d, w:%d, h:%d%n", frame.getX (), frame.getY (),
frame.getWidth (), frame.getHeight ()); // frame.getWidth (), frame.getHeight ());
} }
public boolean restoreWindow () public boolean restoreWindow ()
@ -42,17 +42,17 @@ public class WindowSaver
frame.setLocation (100, 100); frame.setLocation (100, 100);
frame.setSize (1000, 600); frame.setSize (1000, 600);
frame.setLocationRelativeTo (null); // centre frame.setLocationRelativeTo (null); // centre
System.out.printf ("Creating x:%d, y:%d, w:%d, h:%d%n", x, y, width, height); // System.out.printf ("Creating x:%d, y:%d, w:%d, h:%d%n", x, y, width, height);
return false; return false;
} }
System.out.printf ("w:%d, sw:%f%n", width, screen.getWidth ()); // System.out.printf ("w:%d, sw:%f%n", width, screen.getWidth ());
if (width > screen.getWidth () - 15) if (width > screen.getWidth () - 15)
width = (int) (screen.getWidth () - 15); width = (int) (screen.getWidth () - 15);
frame.setSize (width, height); frame.setSize (width, height);
frame.setLocation (x, y); frame.setLocation (x, y);
System.out.printf ("Restoring x:%d, y:%d, w:%d, h:%d%n", x, y, width, height); // System.out.printf ("Restoring x:%d, y:%d, w:%d, h:%d%n", x, y, width, height);
return true; return true;
} }

View File

@ -39,7 +39,7 @@ abstract class CatalogEntry implements AppleFileSource
{ {
if (i >= 280) if (i >= 280)
{ {
System.out.printf ("CatalogEntry: block >= 280%n"); System.out.printf ("CatalogEntry: block %04X >= 280%n", i);
break; break;
} }
blocks.add (disk.getDiskAddress (i)); blocks.add (disk.getDiskAddress (i));

View File

@ -54,9 +54,9 @@ class PascalCatalogSector extends AbstractSector
addTextAndDecimal (text, buffer, ptr + 2, 2, "File's last block"); addTextAndDecimal (text, buffer, ptr + 2, 2, "File's last block");
int type = buffer[ptr + 4] & 0x0F; int type = buffer[ptr + 4] & 0x0F;
if (type < fileTypes.length) if (type < fileTypes.length)
addText (text, buffer, ptr + 4, 2, "File type : " + fileTypes[type]); addText (text, buffer, ptr + 4, 1, "File type : " + fileTypes[type]);
int wildcard = buffer[ptr + 4] & 0xC0; int wildcard = buffer[ptr + 4] & 0xC0;
addText (text, buffer, ptr + 4, 2, "Wildcard : " + wildcard); addText (text, buffer, ptr + 5, 1, "Wildcard : " + wildcard);
name = HexFormatter.getPascalString (buffer, ptr + 6); name = HexFormatter.getPascalString (buffer, ptr + 6);
addText (text, buffer, ptr + 6, 4, ""); addText (text, buffer, ptr + 6, 4, "");
addText (text, buffer, ptr + 10, 4, ""); addText (text, buffer, ptr + 10, 4, "");

View File

@ -132,12 +132,12 @@ public class PascalDisk extends AbstractFormattedDisk
disk.setInterleave (1); // should only ever be Prodos disk.setInterleave (1); // should only ever be Prodos
if (checkFormat (disk, debug)) if (checkFormat (disk, debug))
return true; return true;
return false;
disk.setInterleave (0); // disk.setInterleave (0);
if (checkFormat (disk, debug)) // if (checkFormat (disk, debug))
return true; // return true;
disk.setInterleave (3); // disk.setInterleave (3);
return checkFormat (disk, debug); // return checkFormat (disk, debug);
} }
public static boolean checkFormat (AppleDisk disk, boolean debug) public static boolean checkFormat (AppleDisk disk, boolean debug)

View File

@ -25,4 +25,36 @@ public class Utility
return g.getFontRenderContext ().getTransform () return g.getFontRenderContext ().getTransform ()
.equals (AffineTransform.getScaleInstance (2.0, 2.0)); .equals (AffineTransform.getScaleInstance (2.0, 2.0));
} }
public static void find (byte[] buffer, byte[] key)
{
System.out.println ("*********** searching ************");
// System.out.println (HexFormatter.format (buffer));
for (int i = 0; i < buffer.length; i++)
{
// System.out.printf ("%02X %02X%n", buffer[i], key[0]);
if (buffer[i] == key[0])
{
// System.out.println ("**** checking first ****");
if (matches (buffer, i, key))
System.out.printf ("Matches at %04X%n", i);
}
}
}
private static boolean matches (byte[] buffer, int offset, byte[] key)
{
int ptr = 0;
while (offset < buffer.length && ptr < key.length)
{
if (buffer[offset++] != key[ptr++])
{
// System.out.printf ("%04X: %02X != %02X%n", offset, buffer[offset], key[ptr]);
return false;
}
// System.out.printf ("%04X: %02X == %02X%n", offset, buffer[offset - 1],
// key[ptr - 1]);
}
return true;
}
} }