From ee48dc2a32ce11b21fe8eaafcddb927847d06f26 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Wed, 12 Apr 2017 07:48:08 +1000 Subject: [PATCH] modified CPM validation --- src/com/bytezone/diskbrowser/cpm/CPMDisk.java | 17 +++++++++++++---- .../diskbrowser/prodos/ProdosDirectory.java | 9 ++++++--- .../bytezone/diskbrowser/utilities/NuFX.java | 7 +++---- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java index 5f4dfc6..2b137f7 100644 --- a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java +++ b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java @@ -58,16 +58,25 @@ public class CPMDisk extends AbstractFormattedDisk for (int sector = 0; sector < 8; sector++) { DiskAddress da = disk.getDiskAddress (3, sector); - if (disk.isSectorEmpty (da)) - break; sectorTypes[da.getBlock ()] = catalogSector; byte[] buffer = disk.readSector (da); + int b1 = buffer[0] & 0xFF; + int b2 = buffer[1] & 0xFF; + if (b1 == 0xE5) + continue; + if (b1 > 31) + break; + if (b2 < 32 || (b2 > 126 && b2 != 0xE5)) + break; for (int i = 0; i < buffer.length; i += 32) { - int val = buffer[i] & 0xFF; - if (val == 0xE5) + b1 = buffer[i] & 0xFF; + b2 = buffer[i + 1] & 0xFF; + if (b1 == 0xE5) + break; + if (b2 < 32 || (b2 > 126 && b2 != 0xE5)) break; DirectoryEntry entry = new DirectoryEntry (this, buffer, i); diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDirectory.java b/src/com/bytezone/diskbrowser/prodos/ProdosDirectory.java index 8404016..e6e29ed 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDirectory.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDirectory.java @@ -79,19 +79,22 @@ class ProdosDirectory extends AbstractFile switch (fileType) { - case 4: // Text file + case 4: // Text file int aux = HexFormatter.intValue (buffer[i + 31], buffer[i + 32]); subType = String.format ("R=%5d", aux); break; - case 6: // BIN file + + case 6: // BIN file aux = HexFormatter.intValue (buffer[i + 31], buffer[i + 32]); subType = String.format ("A=$%4X", aux); break; - case 0x1A: // AWP file + + case 0x1A: // AWP file aux = HexFormatter.intValue (buffer[i + 32], buffer[i + 31]); // backwards! if (aux != 0) filename = convert (filename, aux); break; + default: subType = ""; } diff --git a/src/com/bytezone/diskbrowser/utilities/NuFX.java b/src/com/bytezone/diskbrowser/utilities/NuFX.java index a300a77..226b7d5 100644 --- a/src/com/bytezone/diskbrowser/utilities/NuFX.java +++ b/src/com/bytezone/diskbrowser/utilities/NuFX.java @@ -12,10 +12,9 @@ import com.bytezone.common.Utility; public class NuFX { private static String[] fileSystems = - {// - "", "ProDOS/SOS", "DOS 3.3", "DOS 3.2", "Apple II Pascal", "Macintosh HFS", - "Macintosh MFS", "Lisa File System", "Apple CP/M", "", "MS-DOS", "High Sierra", - "ISO 9660", "AppleShare" }; + { "", "ProDOS/SOS", "DOS 3.3", "DOS 3.2", "Apple II Pascal", "Macintosh HFS", + "Macintosh MFS", "Lisa File System", "Apple CP/M", "", "MS-DOS", "High Sierra", + "ISO 9660", "AppleShare" }; private Header header; private final byte[] buffer; private final boolean debug = false;