diff --git a/src/com/bytezone/diskbrowser/disk/DiskFactory.java b/src/com/bytezone/diskbrowser/disk/DiskFactory.java index 28a79fa..0b8163b 100755 --- a/src/com/bytezone/diskbrowser/disk/DiskFactory.java +++ b/src/com/bytezone/diskbrowser/disk/DiskFactory.java @@ -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; diff --git a/src/com/bytezone/diskbrowser/pascal/PascalDisk.java b/src/com/bytezone/diskbrowser/pascal/PascalDisk.java index 623e0c6..6fa34e7 100755 --- a/src/com/bytezone/diskbrowser/pascal/PascalDisk.java +++ b/src/com/bytezone/diskbrowser/pascal/PascalDisk.java @@ -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); diff --git a/src/com/bytezone/diskbrowser/utilities/Utility.java b/src/com/bytezone/diskbrowser/utilities/Utility.java index fb844e1..73dde64 100644 --- a/src/com/bytezone/diskbrowser/utilities/Utility.java +++ b/src/com/bytezone/diskbrowser/utilities/Utility.java @@ -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 suffixes = Arrays.asList ("po", "dsk", "do", "hdv", - "2mg", "d13", "sdk", "shk", "bxy", "bny", "woz", "img", "dimg"); + private static final List 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 }; } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/wizardry/MazeLevel.java b/src/com/bytezone/diskbrowser/wizardry/MazeLevel.java index 57482ca..cdeecf4 100755 --- a/src/com/bytezone/diskbrowser/wizardry/MazeLevel.java +++ b/src/com/bytezone/diskbrowser/wizardry/MazeLevel.java @@ -191,6 +191,12 @@ public class MazeLevel extends AbstractFile List 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)); } } } diff --git a/src/com/bytezone/diskbrowser/wizardry/Relocator.java b/src/com/bytezone/diskbrowser/wizardry/Relocator.java index b4471a0..4b475cf 100644 --- a/src/com/bytezone/diskbrowser/wizardry/Relocator.java +++ b/src/com/bytezone/diskbrowser/wizardry/Relocator.java @@ -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 diskSegments = new ArrayList<> (); + List 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); } } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java b/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java index c448c50..57ea6fb 100644 --- a/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java +++ b/src/com/bytezone/diskbrowser/wizardry/Wizardry4BootDisk.java @@ -22,7 +22,6 @@ public class Wizardry4BootDisk extends PascalDisk // -----------------------------------------------------------------------------------// { public Header scenarioHeader; - // private final List 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 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 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 blocks) + private void addToNode (AbstractFile af, DefaultMutableTreeNode node, List 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 } } \ No newline at end of file