diff --git a/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java b/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java index aa9b60d..bc85e39 100644 --- a/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java +++ b/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java @@ -118,8 +118,8 @@ abstract class AbstractCatalogEntry implements AppleFileSource return "R"; case AA: // what is this? return "A"; - case BB: // what is this? - return "B"; + case BB: // Lisa file + return "L"; default: System.out.println ("Unknown file type : " + fileType); return "?"; diff --git a/src/com/bytezone/diskbrowser/dos/DeletedCatalogEntry.java b/src/com/bytezone/diskbrowser/dos/DeletedCatalogEntry.java index ae006b2..8ec8a56 100644 --- a/src/com/bytezone/diskbrowser/dos/DeletedCatalogEntry.java +++ b/src/com/bytezone/diskbrowser/dos/DeletedCatalogEntry.java @@ -1,6 +1,7 @@ package com.bytezone.diskbrowser.dos; import com.bytezone.diskbrowser.applefile.DefaultAppleFile; +import com.bytezone.diskbrowser.disk.AppleDiskAddress; import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.gui.DataSource; @@ -9,17 +10,35 @@ class DeletedCatalogEntry extends AbstractCatalogEntry boolean allSectorsAvailable = true; boolean debug = false; - public DeletedCatalogEntry (DosDisk dosDisk, DiskAddress catalogSector, byte[] entryBuffer) + public DeletedCatalogEntry (DosDisk dosDisk, DiskAddress catalogSector, + byte[] entryBuffer, int dosVersion) { super (dosDisk, catalogSector, entryBuffer); - // reportedSize = HexFormatter.intValue (entryBuffer[33], entryBuffer[34]); + if (debug) { System.out.println ("Deleted file : " + name); System.out.printf ("Reported size : %d%n", reportedSize); } - if (reportedSize <= 1 || !disk.isValidAddress (entryBuffer[32], entryBuffer[1])) + DiskAddress da = null; + + // Get address of first TS-list sector + if (dosVersion >= 0x41) + { + int track = entryBuffer[0] & 0x3F; + int sector = entryBuffer[1] & 0x1F; + da = disk.getDiskAddress (track, sector); + } + else + { + int track = entryBuffer[32] & 0xFF; + int sector = entryBuffer[1] & 0xFF; + da = disk.getDiskAddress (track, sector); + } + int totalBlocks = 0; + + if (reportedSize <= 1 || !disk.isValidAddress (da.getTrack (), da.getSector ())) { if (debug) System.out.println ("invalid catalog entry"); @@ -27,12 +46,8 @@ class DeletedCatalogEntry extends AbstractCatalogEntry return; } - // Get address of first TS-list sector - DiskAddress da = disk.getDiskAddress (entryBuffer[32], entryBuffer[1]); - int totalBlocks = 0; - // Loop through all TS-list sectors - loop: while (da.getBlock () > 0) + loop: while (da.getBlock () > 0 || ((AppleDiskAddress) da).zeroFlag ()) { if (!dosDisk.stillAvailable (da)) { @@ -51,7 +66,7 @@ class DeletedCatalogEntry extends AbstractCatalogEntry if (da.getBlock () > 0 && debug) System.out.println (da); - if (da.getBlock () > 0) + if (da.getBlock () > 0 || ((AppleDiskAddress) da).zeroFlag ()) { if (!dosDisk.stillAvailable (da)) { @@ -68,7 +83,7 @@ class DeletedCatalogEntry extends AbstractCatalogEntry if (da == null) { System.out.printf ("Next T/S list in sector %s is invalid : %02X, %02X%n", da, - sectorBuffer[1], sectorBuffer[2]); + sectorBuffer[1], sectorBuffer[2]); break; } } @@ -99,7 +114,7 @@ class DeletedCatalogEntry extends AbstractCatalogEntry public String getDetails () { - return String.format ("%-30s %s", name, allSectorsAvailable ? "Recoverable" - : "Not recoverable"); + return String.format ("%-30s %s", name, + allSectorsAvailable ? "Recoverable" : "Not recoverable"); } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java b/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java index c711634..f9ed8fb 100755 --- a/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java +++ b/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java @@ -10,7 +10,7 @@ class DosCatalogSector extends AbstractSector { private static final String[] fileTypes = { "Text file", "Integer Basic program", "Applesoft Basic program", "Binary file", - "SS file", "Relocatable file", "AA file", "BB file" }; + "SS file", "Relocatable file", "AA file", "Lisa file" }; private static int CATALOG_ENTRY_SIZE = 35; private final DosDisk dosDisk; diff --git a/src/com/bytezone/diskbrowser/dos/DosDisk.java b/src/com/bytezone/diskbrowser/dos/DosDisk.java index ba2f4e1..efcb0b5 100755 --- a/src/com/bytezone/diskbrowser/dos/DosDisk.java +++ b/src/com/bytezone/diskbrowser/dos/DosDisk.java @@ -55,6 +55,7 @@ public class DosDisk extends AbstractFormattedDisk da = disk.getDiskAddress (CATALOG_TRACK, VTOC_SECTOR); sectorBuffer = disk.readSector (da); // VTOC dosVTOCSector = new DosVTOCSector (this, disk, sectorBuffer, da); + sectorTypes[da.getBlock ()] = vtocSector; DiskAddress catalogStart = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]); @@ -63,7 +64,7 @@ public class DosDisk extends AbstractFormattedDisk if (dosVTOCSector.maxSectors != disk.getSectorsPerTrack ()) System.out.println ("Invalid sectors per track : " + dosVTOCSector.maxSectors); - sectorTypes[CATALOG_TRACK * dosVTOCSector.maxSectors] = vtocSector; + // sectorTypes[CATALOG_TRACK * dosVTOCSector.maxSectors] = vtocSector; // assert (maxTracks == disk.getTotalTracks ()); // assert (dosVTOCSector.maxSectors == disk.getSectorsPerTrack ()); @@ -91,12 +92,12 @@ public class DosDisk extends AbstractFormattedDisk // The first byte is officially unused, but it always seems to contain 0x00 or 0xFF // See beautifulboot.dsk. - if (sectorBuffer[0] != 0 && (sectorBuffer[0] & 0xFF) != 0xFF && false) - { - System.out - .println ("Dos catalog sector buffer byte #0 invalid : " + sectorBuffer[0]); - break; - } + // if (sectorBuffer[0] != 0 && (sectorBuffer[0] & 0xFF) != 0xFF && false) + // { + // System.out + // .println ("Dos catalog sector buffer byte #0 invalid : " + sectorBuffer[0]); + // break; + // } sectorTypes[da.getBlock ()] = catalogSector; @@ -130,11 +131,14 @@ public class DosDisk extends AbstractFormattedDisk byte[] entry = new byte[ENTRY_SIZE]; System.arraycopy (sectorBuffer, ptr, entry, 0, ENTRY_SIZE); + int track = entry[0] & 0xFF; + boolean deletedFlag = (entry[0] & 0x80) != 0; - if (entry[0] == (byte) 0xFF) // deleted file + // if (entry[0] == (byte) 0xFF) // deleted file + if (deletedFlag) // deleted file { DeletedCatalogEntry deletedCatalogEntry = - new DeletedCatalogEntry (this, da, entry); + new DeletedCatalogEntry (this, da, entry, dosVTOCSector.dosVersion); deletedFileEntries.add (deletedCatalogEntry); DefaultMutableTreeNode node = new DefaultMutableTreeNode (deletedCatalogEntry); node.setAllowsChildren (false); @@ -164,6 +168,7 @@ public class DosDisk extends AbstractFormattedDisk da = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]); } while (da.getBlock () != 0); + // link double hi-res files for (AppleFileSource fe : fileEntries) { diff --git a/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java b/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java index 23415d7..f25d7b4 100755 --- a/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java +++ b/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java @@ -53,7 +53,9 @@ class DosVTOCSector extends AbstractSector addText (text, buffer, 5, 1, "Ram DOS " + (char) (buffer[5] & 0x7F)); addTextAndDecimal (text, buffer, 6, 1, "Diskette volume"); - addText (text, buffer, 7, 1, "Volume type " + (char) (buffer[7] & 0x7F)); + String diskType = + buffer[7] == (byte) 0xC4 ? " = Data" : buffer[7] == (byte) 0xC2 ? " = Boot" : ""; + addText (text, buffer, 7, 1, "Volume type: " + (char) (buffer[7] & 0x7F) + diskType); int ptr = 8; addText (text, buffer, ptr, 4, "Volume name: " + getName (buffer, ptr));