checking Wiz4 disks

This commit is contained in:
Denis Molony 2022-05-03 15:36:37 +10:00
parent decc781572
commit 1b9e9d47ac
6 changed files with 148 additions and 140 deletions

View File

@ -279,7 +279,7 @@ public class DiskFactory
}
if (debug)
System.out.printf (" Checking po or dsk hard drive: %,d%n", file.length ());
System.out.printf ("Checking po or dsk hard drive: %,d%n", file.length ());
disk = checkHardDisk (file);
if (disk != null)
@ -681,7 +681,7 @@ public class DiskFactory
{
if (debug)
{
System.out.println ("\nChecking Prodos hard disk");
System.out.println ("\nChecking Prodos/Pascal hard disk");
System.out.printf ("Total blocks : %f%n", (float) file.length () / 512);
System.out.printf ("Total tracks : %f%n", (float) file.length () / 4096);
System.out.printf ("File length : %d%n", file.length ());
@ -716,6 +716,7 @@ public class DiskFactory
System.out.println (" --> PRODOS hard disk");
return new ProdosDisk (disk);
}
if (PascalDisk.isCorrectFormat (disk, debug))
{
if (debug)
@ -731,7 +732,7 @@ public class DiskFactory
}
if (debug)
System.out.println (" not a Prodos hard disk\n");
System.out.println (" not a Prodos/Pascal hard disk\n");
return null;
}
@ -856,10 +857,12 @@ public class DiskFactory
if (Wizardry4BootDisk.isWizardryIVorV (disk, debug))
{
if (debug)
System.out.println ("checking Wizardry IV or V");
String fileName = file.getAbsolutePath ().toLowerCase ();
int pos = file.getAbsolutePath ().indexOf ('.');
char c = fileName.charAt (pos - 1);
// String suffix = fileName.substring (pos + 1);
int requiredDisks = c == '1' ? 6 : c == 'a' ? 10 : 0;
if (requiredDisks > 0)
@ -903,9 +906,8 @@ public class DiskFactory
if (!f.exists () || !f.isFile ())
return false;
AppleDisk dataDisk = new AppleDisk (f, 35, 8);
dataDisk.setInterleave (1);
disks[i] = dataDisk;
disks[i] = new AppleDisk (f, 35, 8);
disks[i].setInterleave (1);
}
return true;

View File

@ -174,12 +174,12 @@ public class PascalDisk extends AbstractFormattedDisk
if (from != 0 || to != 6)
{
if (debug)
System.out.printf ("from: %d, to: %d%n", from, to);
System.out.printf ("from: %d to: %d%n", from, to);
return false; // will only work for floppies!
}
int blocks = Utility.getShort (buffer, 14);
if (blocks != 280 && blocks != 1600)
if (blocks != 280 && blocks != 1600 && blocks != 2048 && blocks != 1272)
{
if (debug)
System.out.printf ("Blocks > 280: %d%n", blocks);
@ -208,18 +208,35 @@ public class PascalDisk extends AbstractFormattedDisk
int firstBlock = Utility.getShort (buffer, ptr);
int lastBlock = Utility.getShort (buffer, ptr + 2);
int kind = Utility.getShort (buffer, ptr + 4);
if (lastBlock < firstBlock)
{
if (debug)
System.out.printf (" %d %d lastBlock < firstBlock%n", lastBlock, firstBlock);
return false;
if (kind == 0)
return false;
}
// if (kind == 0)
// {
// if (debug)
// System.out.printf (" kind = 0%n");
// return false;
// }
nameLength = buffer[ptr + 6] & 0xFF;
if (nameLength < 1 || nameLength > 15)
{
if (debug)
System.out.printf (" %d nameLength < 1 or > 15%n", nameLength);
return false;
}
int lastByte = Utility.getShort (buffer, ptr + 22);
GregorianCalendar date = Utility.getPascalDate (buffer, 24);
String dateString = date == null ? "" : date.toString ();
if (debug)
System.out.printf ("%4d %4d %d %-15s %d %s%n", firstBlock, lastBlock, kind,
new String (buffer, ptr + 7, nameLength), lastByte, date);
new String (buffer, ptr + 7, nameLength), lastByte, dateString);
}
return true;
@ -298,7 +315,7 @@ public class PascalDisk extends AbstractFormattedDisk
int bytes = (size - 1) * 512 + ce.bytesUsedInLastBlock;
String fileType =
ce.fileType < 0 || ce.fileType >= fileTypes.length ? "????" : fileTypes[ce.fileType];
text.append (String.format ("%4d %-15s %s %8s %,8d $%03X $%03X $%03X%n", size,
text.append (String.format ("%4d %-15s %-6s %8s %,8d $%03X $%03X $%03X%n", size,
ce.name, fileType, date, bytes, ce.firstBlock, ce.lastBlock, size));
}
text.append (line);

View File

@ -40,8 +40,8 @@ public final class Utility
private static MathContext mathContext4 = new MathContext (6);
private static MathContext mathContext8 = new MathContext (15);
private static final List<String> suffixes = Arrays.asList ("po", "dsk", "do", "hdv",
"2mg", "d13", "sdk", "shk", "bxy", "bny", "woz", "img", "dimg");
private static final List<String> suffixes = Arrays.asList ("po", "dsk", "do", "hdv", "2mg",
"d13", "sdk", "shk", "bxy", "bny", "woz", "img", "dimg");
// ---------------------------------------------------------------------------------//
private Utility ()
@ -257,8 +257,7 @@ public final class Utility
}
catch (DateTimeException e)
{
System.out.printf ("Bad date/time: %d %d %d %d %d %n", year, month, day, hour,
minute);
System.out.printf ("Bad date/time: %d %d %d %d %d %n", year, month, day, hour, minute);
}
}
@ -318,8 +317,7 @@ public final class Utility
public static int readTriple (byte[] buffer, int ptr)
// ---------------------------------------------------------------------------------//
{
return (buffer[ptr] & 0xFF) | (buffer[ptr + 1] & 0xFF) << 8
| (buffer[ptr + 2] & 0xFF) << 16;
return (buffer[ptr] & 0xFF) | (buffer[ptr + 1] & 0xFF) << 8 | (buffer[ptr + 2] & 0xFF) << 16;
}
// ---------------------------------------------------------------------------------//
@ -388,8 +386,8 @@ public final class Utility
if (exponent == 0)
return 0.0;
int mantissa = (buffer[ptr + 2] & 0x7F) << 16 | (buffer[ptr + 1] & 0xFF) << 8
| (buffer[ptr] & 0xFF);
int mantissa =
(buffer[ptr + 2] & 0x7F) << 16 | (buffer[ptr + 1] & 0xFF) << 8 | (buffer[ptr] & 0xFF);
boolean negative = (buffer[ptr + 2] & 0x80) != 0;
double value = 0.5;
@ -412,10 +410,9 @@ public final class Utility
if (exponent == 0)
return 0.0;
long mantissa = (long) (buffer[ptr + 6] & 0x7F) << 48
| (long) (buffer[ptr + 5] & 0xFF) << 40 | (long) (buffer[ptr + 4] & 0xFF) << 32
| (long) (buffer[ptr + 3] & 0xFF) << 24 | (buffer[ptr + 2] & 0xFF) << 16
| (buffer[ptr + 1] & 0xFF) << 8 | (buffer[ptr] & 0xFF);
long mantissa = (long) (buffer[ptr + 6] & 0x7F) << 48 | (long) (buffer[ptr + 5] & 0xFF) << 40
| (long) (buffer[ptr + 4] & 0xFF) << 32 | (long) (buffer[ptr + 3] & 0xFF) << 24
| (buffer[ptr + 2] & 0xFF) << 16 | (buffer[ptr + 1] & 0xFF) << 8 | (buffer[ptr] & 0xFF);
boolean negative = (buffer[ptr + 6] & 0x80) != 0;
double value = 0.5;
@ -437,6 +434,9 @@ public final class Utility
{
int date = Utility.getShort (buffer, offset);
if (date == 0)
return null;
int month = date & 0x0F;
int day = (date & 0x1F0) >>> 4;
int year = (date & 0xFE00) >>> 9;
@ -492,8 +492,7 @@ public final class Utility
for (int i = 0; i < 6; i++)
val[i] = Integer.parseInt (String.format ("%02X", buffer[ptr + i] & 0xFF));
LocalDateTime date =
LocalDateTime.of (val[3] + 2000, val[5], val[4], val[2], val[1], val[0]);
LocalDateTime date = LocalDateTime.of (val[3] + 2000, val[5], val[4], val[2], val[1], val[0]);
return date;
}
catch (DateTimeException | NumberFormatException e)
@ -584,8 +583,7 @@ public final class Utility
public static boolean isPossibleVariable (byte value)
// ---------------------------------------------------------------------------------//
{
return isDigit (value) || isLetter (value) || value == ASCII_DOLLAR
|| value == ASCII_PERCENT;
return isDigit (value) || isLetter (value) || value == ASCII_DOLLAR || value == ASCII_PERCENT;
}
// ---------------------------------------------------------------------------------//
@ -665,41 +663,41 @@ public final class Utility
return ~crc; // one's complement
}
static int[] crc32_tab = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148,
0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8,
0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf,
0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162,
0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6,
0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d,
0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525,
0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43,
0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3,
0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92,
0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226,
0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661,
0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330,
0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };
static int[] crc32_tab = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b,
0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a,
0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e,
0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11,
0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589,
0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8,
0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158,
0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3,
0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e,
0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76,
0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd,
0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14,
0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4,
0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3,
0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53,
0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };
}

View File

@ -191,6 +191,12 @@ public class MazeLevel extends AbstractFile
List<MazeAddress> monsterList)
// ---------------------------------------------------------------------------------//
{
if (monsters == null)
{
System.out.println ("monsters is null");
return;
}
text.append ("\n\nSQREXTRA SQRTYPE TSQUARE AUX0 AUX1 AUX2\n");
for (int j = 0; j < 16; j++)
{
@ -282,7 +288,8 @@ public class MazeLevel extends AbstractFile
{
if (id == minenemy + range0n)
text.append ("\n");
text.append (String.format ("%3d %-16s %n", id, monsters.get (id)));
Monster monster = monsters == null ? null : monsters.get (id);
text.append (String.format ("%3d %-16s %n", id, monster));
}
}
}

View File

@ -25,7 +25,7 @@ public class Relocator extends AbstractFile
{
super (name, buffer);
checkByte = Utility.getShort (buffer, 0);
checkByte = Utility.getShort (buffer, 0); // no of blocks?
int ptr = 2; // skip checkByte
@ -38,22 +38,24 @@ public class Relocator extends AbstractFile
for (DiskRecord diskRecord : diskRecords)
for (DiskSegment diskSegment : diskRecord.diskSegments)
addLogicalBlock ((byte) diskRecord.diskNumber, diskSegment);
}
{
int lo = diskSegment.logicalBlock;
int hi = diskSegment.logicalBlock + diskSegment.segmentLength;
// ---------------------------------------------------------------------------------//
private void addLogicalBlock (byte disk, DiskSegment diskSegment)
// ---------------------------------------------------------------------------------//
{
int lo = diskSegment.logicalBlock;
int hi = diskSegment.logicalBlock + diskSegment.segmentLength;
for (int i = lo, count = 0; i < hi; i++, count++)
// if (diskBlocks[i] == 0) // doesn't matter either way
{
diskBlocks[i] = disk;
diskOffsets[i] = diskSegment.physicalBlock + count;
}
for (int i = lo, count = 0; i < hi; i++, count++)
// if (diskBlocks[i] == 0) // doesn't matter either way
{
if (diskBlocks[i] != 0 && false)
{
System.out.print ("was: ");
System.out.printf ("diskBlocks[%d] = %d%n", i, diskBlocks[i]);
System.out.print ("now: ");
System.out.printf ("diskBlocks[%d] = %d%n", i, diskRecord.diskNumber);
}
diskBlocks[i] = diskRecord.diskNumber;
diskOffsets[i] = diskSegment.physicalBlock + count;
}
}
}
// ---------------------------------------------------------------------------------//
@ -109,14 +111,15 @@ public class Relocator extends AbstractFile
int first = 0;
int lastDisk = diskBlocks[0];
int lastOffset = diskOffsets[0];
for (int i = 0; i < diskBlocks.length; i++)
{
if (diskBlocks[i] != lastDisk || diskOffsets[i] != lastOffset + i - first)
{
int size = i - first;
if (lastDisk > 0)
lines.add (String.format ("%03X - %03X %03X %d %03X - %03X", first,
i - 1, size, lastDisk, lastOffset, lastOffset + size - 1));
lines.add (String.format ("%03X - %03X %03X %d %03X - %03X", first, i - 1, size,
lastDisk, lastOffset, lastOffset + size - 1));
else
lines.add (String.format ("%03X - %03X %03X", first, i - 1, size));
@ -130,8 +133,8 @@ public class Relocator extends AbstractFile
{
int max = diskBlocks.length;
int size = max - first;
lines.add (String.format ("%03X - %03X %03X %d %03X - %03X", first, max - 1,
size, lastDisk, lastOffset, lastOffset + size - 1));
lines.add (String.format ("%03X - %03X %03X %d %03X - %03X", first, max - 1, size,
lastDisk, lastOffset, lastOffset + size - 1));
}
for (int i = lines.size () - 1; i >= 0; i--)
@ -142,17 +145,14 @@ public class Relocator extends AbstractFile
lines.remove (i);
}
text.append (String.format (" %s %s%n %s %s%n", heading, heading,
underline, underline));
text.append (String.format (" %s %s%n %s %s%n", heading, heading, underline,
underline));
int offset = (lines.size () + 1) / 2;
// boolean oddLines = lines.size () % 2 == 1;
int pairs = lines.size () / 2;
for (int i = 0; i < pairs; i++)
{
text.append (
String.format (" %-35s %s%n", lines.get (i), lines.get (i + offset)));
}
text.append (String.format (" %-35s %s%n", lines.get (i), lines.get (i + offset)));
if (offset != pairs)
text.append (String.format (" %s%n", lines.get (pairs)));
@ -165,12 +165,14 @@ public class Relocator extends AbstractFile
{
int diskNumber;
int totDiskSegments;
List<DiskSegment> diskSegments = new ArrayList<> ();
List<DiskSegment> diskSegments;
public DiskRecord (byte[] buffer, int ptr)
{
diskNumber = Utility.getShort (buffer, ptr);
totDiskSegments = Utility.intValue (buffer[ptr + 2], buffer[ptr + 4]);
// totDiskSegments = Utility.intValue (buffer[ptr + 2], buffer[ptr + 4]);
totDiskSegments = Utility.getShort (buffer, ptr + 2);
diskSegments = new ArrayList<> (totDiskSegments);
ptr += 4;
for (int i = 0; i < totDiskSegments; i++)
@ -192,22 +194,22 @@ public class Relocator extends AbstractFile
text.append (String.format ("Disk number.... %04X%n", diskNumber));
text.append (String.format ("Segments....... %04X%n%n", totDiskSegments));
text.append (String.format (" Seg Skip Size Logical Physical%n"));
text.append (String.format (" --- ---- ---- ----------- -----------%n"));
text.append (String.format (" Seg Physical Logical Size Gap%n"));
text.append (String.format (" --- ----------- ----------- ---- ----%n"));
int count = 1;
int last = 0;
int skip = 0;
for (DiskSegment segment : diskSegments)
for (DiskSegment diskSegment : diskSegments)
{
if (segment.logicalBlock > last)
if (diskSegment.logicalBlock > last)
{
int end = segment.logicalBlock - 1;
int end = diskSegment.logicalBlock - 1;
skip = end - last + 1;
}
last = segment.logicalBlock + segment.segmentLength;
text.append (String.format (" %02X %04X %s %n", count++, skip, segment));
last = diskSegment.logicalBlock + diskSegment.segmentLength;
text.append (String.format (" %02X %s %04X%n", count++, diskSegment, skip));
}
return text.toString ();
@ -232,9 +234,9 @@ public class Relocator extends AbstractFile
@Override
public String toString ()
{
return String.format (" %04X %04X - %04X %04X - %04X", segmentLength,
logicalBlock, (logicalBlock + segmentLength - 1), physicalBlock,
(physicalBlock + segmentLength - 1));
return String.format (" %04X - %04X %04X - %04X %04X", physicalBlock,
(physicalBlock + segmentLength - 1), logicalBlock, (logicalBlock + segmentLength - 1),
segmentLength);
}
}
}

View File

@ -22,7 +22,6 @@ public class Wizardry4BootDisk extends PascalDisk
// -----------------------------------------------------------------------------------//
{
public Header scenarioHeader;
// private final List<AppleDisk> disks = new ArrayList<> ();
private Relocator relocator;
private MessageBlock messageBlock;
private Huffman huffman;
@ -44,9 +43,8 @@ public class Wizardry4BootDisk extends PascalDisk
FileEntry fileEntry = (FileEntry) relocNode.getUserObject ();
if (fileEntry != null)
{
relocator =
new Relocator (fileEntry.getUniqueName (), fileEntry.getDataSource ().buffer);
relocator.createNewBuffer (dataDisks); // create new data buffer
relocator = new Relocator (fileEntry.getUniqueName (), fileEntry.getDataSource ().buffer);
relocator.createNewBuffer (dataDisks);
fileEntry.setFile (relocator);
}
@ -63,10 +61,7 @@ public class Wizardry4BootDisk extends PascalDisk
fileEntry = (FileEntry) huffNode.getUserObject ();
if (fileEntry != null)
{
byte[] buffer = fileEntry.getDataSource ().buffer;
huffman = new Huffman ("Huffman tree", buffer);
huffman = new Huffman ("Huffman tree", fileEntry.getDataSource ().buffer);
fileEntry.setFile (huffman);
}
@ -138,14 +133,12 @@ public class Wizardry4BootDisk extends PascalDisk
}
// ---------------------------------------------------------------------------------//
private void linkMonsterImages4 (DefaultMutableTreeNode monstersNode,
FileEntry fileEntry)
private void linkMonsterImages4 (DefaultMutableTreeNode monstersNode, FileEntry fileEntry)
// ---------------------------------------------------------------------------------//
{
List<DiskAddress> pictureBlocks = fileEntry.getSectors ();
Wiz4Monsters w4monsters =
new Wiz4Monsters ("monsters", fileEntry.getDataSource ().buffer);
Wiz4Monsters w4monsters = new Wiz4Monsters ("monsters", fileEntry.getDataSource ().buffer);
fileEntry.setFile (w4monsters);
int count = 0;
@ -158,14 +151,12 @@ public class Wizardry4BootDisk extends PascalDisk
}
// ---------------------------------------------------------------------------------//
private void linkMonsterImages5 (DefaultMutableTreeNode monstersNode,
FileEntry fileEntry)
private void linkMonsterImages5 (DefaultMutableTreeNode monstersNode, FileEntry fileEntry)
// ---------------------------------------------------------------------------------//
{
List<DiskAddress> pictureBlocks = fileEntry.getSectors ();
Wiz5Monsters w5monsters =
new Wiz5Monsters ("monsters", fileEntry.getDataSource ().buffer);
Wiz5Monsters w5monsters = new Wiz5Monsters ("monsters", fileEntry.getDataSource ().buffer);
fileEntry.setFile (w5monsters);
for (Wiz5Monsters.Monster monster : w5monsters)
@ -255,8 +246,7 @@ public class Wizardry4BootDisk extends PascalDisk
HexFormatter.getHexString (buffer, offset + i * length, length)));
}
DefaultMutableTreeNode oracleNode =
linkNode ("Block1", text.toString (), scenarioNode);
DefaultMutableTreeNode oracleNode = linkNode ("Block1", text.toString (), scenarioNode);
oracleNode.setAllowsChildren (false);
DefaultAppleFileSource afs = (DefaultAppleFileSource) oracleNode.getUserObject ();
afs.setSectors (allBlocks);
@ -284,8 +274,7 @@ public class Wizardry4BootDisk extends PascalDisk
HexFormatter.getHexString (buffer, offset + i * length, length)));
}
DefaultMutableTreeNode oracleNode =
linkNode ("Block2", text.toString (), scenarioNode);
DefaultMutableTreeNode oracleNode = linkNode ("Block2", text.toString (), scenarioNode);
oracleNode.setAllowsChildren (false);
DefaultAppleFileSource afs = (DefaultAppleFileSource) oracleNode.getUserObject ();
afs.setSectors (allBlocks);
@ -306,8 +295,8 @@ public class Wizardry4BootDisk extends PascalDisk
int offset = 0x08600 + i * 32 + 18;
int key = Utility.getShort (buffer, offset);
if (key > 0)
text.append (String.format ("%04X %04X * %s%n", offset, key,
messageBlock.getMessageText (key)));
text.append (
String.format ("%04X %04X * %s%n", offset, key, messageBlock.getMessageText (key)));
key = Utility.getShort (buffer, offset + 8);
if (key > 0)
text.append (String.format ("%04X %04X %s%n", offset + 8, key,
@ -320,28 +309,24 @@ public class Wizardry4BootDisk extends PascalDisk
allOracleBlocks.add (blocks.get (67 + i));
}
DefaultMutableTreeNode oracleNode =
linkNode ("Oracle", text.toString (), scenarioNode);
DefaultMutableTreeNode oracleNode = linkNode ("Oracle", text.toString (), scenarioNode);
oracleNode.setAllowsChildren (false);
DefaultAppleFileSource afs = (DefaultAppleFileSource) oracleNode.getUserObject ();
afs.setSectors (allOracleBlocks);
}
// ---------------------------------------------------------------------------------//
private void addToNode (AbstractFile af, DefaultMutableTreeNode node,
List<DiskAddress> blocks)
private void addToNode (AbstractFile af, DefaultMutableTreeNode node, List<DiskAddress> blocks)
// ---------------------------------------------------------------------------------//
{
DefaultAppleFileSource dafs =
new DefaultAppleFileSource (af.getName (), af, this, blocks);
DefaultAppleFileSource dafs = new DefaultAppleFileSource (af.getName (), af, this, blocks);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (dafs);
childNode.setAllowsChildren (false);
node.add (childNode);
}
// ---------------------------------------------------------------------------------//
private DefaultMutableTreeNode linkNode (String name, String text,
DefaultMutableTreeNode parent)
private DefaultMutableTreeNode linkNode (String name, String text, DefaultMutableTreeNode parent)
// ---------------------------------------------------------------------------------//
{
DefaultAppleFileSource afs = new DefaultAppleFileSource (name, text, this);
@ -362,9 +347,6 @@ public class Wizardry4BootDisk extends PascalDisk
return false;
buffer = disk.readBlock (1);
if (buffer[510] != 1 || buffer[511] != 0) // disk #1
return false;
return true;
return buffer[510] == 1 && buffer[511] == 0; // disk #1
}
}