From 21e7f8f226ec0f8f35293afafdcdec576705a9ca Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Sun, 28 Feb 2016 10:17:34 +1100 Subject: [PATCH] allow cpm.sys in directory --- src/com/bytezone/diskbrowser/cpm/CPMDisk.java | 42 +++++++++++-------- .../diskbrowser/cpm/DirectoryEntry.java | 13 +++--- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java index 6de7c72..0056bb1 100644 --- a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java +++ b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java @@ -56,27 +56,26 @@ public class CPMDisk extends AbstractFormattedDisk for (int i = 0; i < buffer.length; i += 32) { - if (buffer[i] != 0 && buffer[i] != (byte) 0xE5) + int val = buffer[i] & 0xFF; + if (val == 0xE5) break; - if (buffer[i] == 0) - { - DirectoryEntry entry = new DirectoryEntry (this, buffer, i); - SectorType sectorType = getSectorType (entry.getType ()); - for (DiskAddress block : entry.getSectors ()) - if (!disk.isSectorEmpty (block)) - sectorTypes[block.getBlock ()] = sectorType; - DirectoryEntry parent = findParent (entry); - if (parent == null) - { - fileEntries.add (entry); - DefaultMutableTreeNode node = new DefaultMutableTreeNode (entry); - root.add (node); - node.setAllowsChildren (false); - } - else - parent.add (entry); + DirectoryEntry entry = new DirectoryEntry (this, buffer, i); + SectorType sectorType = getSectorType (entry.getType ()); + for (DiskAddress block : entry.getSectors ()) + if (!disk.isSectorEmpty (block)) + sectorTypes[block.getBlock ()] = sectorType; + + DirectoryEntry parent = findParent (entry); + if (parent == null) + { + fileEntries.add (entry); + DefaultMutableTreeNode node = new DefaultMutableTreeNode (entry); + root.add (node); + node.setAllowsChildren (false); } + else + parent.add (entry); } } @@ -175,6 +174,13 @@ public class CPMDisk extends AbstractFormattedDisk return true; if (val > 31) return false; + for (int j = 1; j <= 8; j++) + { + val = buffer[i + j] & 0xFF; + // System.out.printf ("%3d %s%n", val, (char) val); + if (val < 32 || val > 126) + return false; + } } } diff --git a/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java b/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java index 0c9a4c4..aff5df3 100644 --- a/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java +++ b/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java @@ -64,12 +64,15 @@ public class DirectoryEntry implements AppleFileSource if (b == 0) break; - int blockNumber = b * 4 + 48; + int blockNumber; + + if ((b & 0x80) == 0) + blockNumber = (b * 4 + 48); + else + blockNumber = (b & 0x7F) * 4; + for (int i = 0; i < 4; i++) - { - AppleDiskAddress da = new AppleDiskAddress (blockNumber + i, disk); - blocks.add (da); - } + blocks.add (new AppleDiskAddress (blockNumber + i, disk)); } }