From c3ee00673d8c0804dba78cdbf59190ca1232110b Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Thu, 6 May 2021 08:12:46 +1000 Subject: [PATCH] applesoft alignment bug --- .../diskbrowser/applefile/Alignment.java | 25 +++++++++-- .../diskbrowser/applefile/SubLine.java | 3 +- .../applefile/UserBasicFormatter.java | 1 + .../bytezone/diskbrowser/disk/Prefix2mg.java | 11 +++++ .../diskbrowser/prodos/write/ProdosDisk.java | 41 ++++++++++++------- .../diskbrowser/utilities/MasterHeader.java | 14 +++---- .../diskbrowser/utilities/Utility.java | 3 ++ 7 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/com/bytezone/diskbrowser/applefile/Alignment.java b/src/com/bytezone/diskbrowser/applefile/Alignment.java index 32265dc..041a712 100644 --- a/src/com/bytezone/diskbrowser/applefile/Alignment.java +++ b/src/com/bytezone/diskbrowser/applefile/Alignment.java @@ -59,18 +59,18 @@ class Alignment implements ApplesoftConstants int targetLength = subline.endPosition - equalsPosition; // insert spaces before '=' until it lines up with the other assignment lines - while (alignEqualsPos-- > equalsPosition) - line.insert (equalsPosition, ' '); + while (alignEqualsPos-- > subline.equalsPosition) + line.insert (subline.equalsPosition, ' '); if (line.charAt (line.length () - 1) == ':') - while (targetLength++ <= targetLength) + while (targetLength++ <= this.targetLength) line.append (" "); return line.toString (); } // ---------------------------------------------------------------------------------// - private StringBuilder toStringBuilder (SubLine subline) + static StringBuilder toStringBuilder (SubLine subline) // ---------------------------------------------------------------------------------// { StringBuilder line = new StringBuilder (); @@ -103,4 +103,21 @@ class Alignment implements ApplesoftConstants return line; } + + // ---------------------------------------------------------------------------------// + @Override + public String toString () + // ---------------------------------------------------------------------------------// + { + StringBuilder text = new StringBuilder (); + + text.append (String.format ("Equals position ..... %d%n", equalsPosition)); + text.append (String.format ("Target length ....... %d%n", targetLength)); + text.append ( + String.format ("First subline ....... %s%n", toStringBuilder (firstSubLine))); + text.append ( + String.format ("Last subline ........ %s", toStringBuilder (lastSubLine))); + + return text.toString (); + } } diff --git a/src/com/bytezone/diskbrowser/applefile/SubLine.java b/src/com/bytezone/diskbrowser/applefile/SubLine.java index a130bf7..29885cb 100644 --- a/src/com/bytezone/diskbrowser/applefile/SubLine.java +++ b/src/com/bytezone/diskbrowser/applefile/SubLine.java @@ -465,7 +465,8 @@ public class SubLine implements ApplesoftConstants while (++p < max) if (buffer[p] == TOKEN_EQUALS) { - String expandedLine = toString (); + // String expandedLine = toString (); + String expandedLine = Alignment.toStringBuilder (this).toString (); equalsPosition = expandedLine.indexOf ('='); endPosition = expandedLine.length (); if (expandedLine.endsWith (":")) diff --git a/src/com/bytezone/diskbrowser/applefile/UserBasicFormatter.java b/src/com/bytezone/diskbrowser/applefile/UserBasicFormatter.java index e5c6892..81dda08 100644 --- a/src/com/bytezone/diskbrowser/applefile/UserBasicFormatter.java +++ b/src/com/bytezone/diskbrowser/applefile/UserBasicFormatter.java @@ -258,6 +258,7 @@ public class UserBasicFormatter extends BasicFormatter .size (); i++) { boolean precededByIf = false; + for (SubLine subline : sourceLines.get (i).sublines) { if (started) diff --git a/src/com/bytezone/diskbrowser/disk/Prefix2mg.java b/src/com/bytezone/diskbrowser/disk/Prefix2mg.java index c55ddd3..917101c 100644 --- a/src/com/bytezone/diskbrowser/disk/Prefix2mg.java +++ b/src/com/bytezone/diskbrowser/disk/Prefix2mg.java @@ -24,6 +24,9 @@ public class Prefix2mg int creatorOffset; int creatorLength; + boolean flagsLocked; + int flagsVolume; + // ---------------------------------------------------------------------------------// public Prefix2mg (byte[] buffer) // ---------------------------------------------------------------------------------// @@ -42,6 +45,12 @@ public class Prefix2mg creatorOffset = Utility.getLong (buffer, 0x28); creatorLength = Utility.getLong (buffer, 0x2C); + flagsLocked = (flags & 0x80000000) != 0; + if ((flags & 0x0100) != 0) + flagsVolume = flags & 0xFF; + if (format == 0 && flagsVolume == 0) + flagsVolume = 254; + // see /Asimov disks/images/gs/os/prodos16/ProDOS 16v1_3.2mg System.out.println (this); } @@ -59,6 +68,8 @@ public class Prefix2mg text.append (String.format ("Version : %d%n", version)); text.append (String.format ("Format : %02X%n", format)); text.append (String.format ("Flags : %,d%n", flags)); + text.append (String.format ("Locked : %s%n", flagsLocked)); + text.append (String.format ("DOS Volume : %,d%n", flagsVolume)); text.append (String.format ("Blocks : %,d%n", blocks)); text.append (String.format ("Offset : %,d%n", offset)); text.append (String.format ("Length : %08X (%<,d)%n", length)); diff --git a/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java index 3d2365e..9a03bb5 100644 --- a/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/write/ProdosDisk.java @@ -151,20 +151,7 @@ public class ProdosDisk } // search for each subdirectory, create any that don't exist - int catalogBlockNo = 2; - - FileEntry fileEntry = null; - for (int i = 0; i < subdirectories.length; i++) - { - Optional fileEntryOpt = - searchDirectory (catalogBlockNo, subdirectories[i]); - if (fileEntryOpt.isEmpty ()) - fileEntry = createSubdirectory (catalogBlockNo, subdirectories[i]); - else - fileEntry = fileEntryOpt.get (); - - catalogBlockNo = fileEntry.keyPointer; - } + int catalogBlockNo = createPath (subdirectories); // check that the file doesn't already exist Optional fileEntryOpt = searchDirectory (catalogBlockNo, fileName); @@ -176,7 +163,7 @@ public class ProdosDisk } // create a file entry in the current catalog block - fileEntry = findFreeSlot (catalogBlockNo); + FileEntry fileEntry = findFreeSlot (catalogBlockNo); if (fileEntry != null) { @@ -204,6 +191,30 @@ public class ProdosDisk return fileEntry; } + // ---------------------------------------------------------------------------------// + private int createPath (String[] subdirectories) + throws DiskFullException, VolumeCatalogFullException + // ---------------------------------------------------------------------------------// + { + // search for each subdirectory, create any that don't exist + int catalogBlockNo = 2; + + FileEntry fileEntry = null; + for (int i = 0; i < subdirectories.length; i++) + { + Optional fileEntryOpt = + searchDirectory (catalogBlockNo, subdirectories[i]); + if (fileEntryOpt.isEmpty ()) + fileEntry = createSubdirectory (catalogBlockNo, subdirectories[i]); + else + fileEntry = fileEntryOpt.get (); + + catalogBlockNo = fileEntry.keyPointer; + } + + return catalogBlockNo; + } + // ---------------------------------------------------------------------------------// public void addResourceFork (FileEntry fileEntry, byte[] fileBuffer, int eof) throws DiskFullException diff --git a/src/com/bytezone/diskbrowser/utilities/MasterHeader.java b/src/com/bytezone/diskbrowser/utilities/MasterHeader.java index a758cd6..60f84c5 100644 --- a/src/com/bytezone/diskbrowser/utilities/MasterHeader.java +++ b/src/com/bytezone/diskbrowser/utilities/MasterHeader.java @@ -29,13 +29,13 @@ class MasterHeader { if (Utility.isMagic (buffer, ptr, NuFile)) break; - if (Utility.isMagic (buffer, 0x2000, NuFile)) - { - System.out.println ("found it"); - ptr = 0x2000; - bin2 = true; - break; - } + // if (Utility.isMagic (buffer, 0x2000, NuFile)) + // { + // System.out.println ("found it"); + // ptr = 0x2000; + // bin2 = true; + // break; + // } if (isBin2 (buffer, ptr)) { diff --git a/src/com/bytezone/diskbrowser/utilities/Utility.java b/src/com/bytezone/diskbrowser/utilities/Utility.java index 7f464c7..746e854 100644 --- a/src/com/bytezone/diskbrowser/utilities/Utility.java +++ b/src/com/bytezone/diskbrowser/utilities/Utility.java @@ -453,6 +453,9 @@ public class Utility static boolean isMagic (byte[] buffer, int ptr, byte[] magic) // ---------------------------------------------------------------------------------// { + if (ptr + magic.length >= buffer.length) + return false; + for (int i = 0; i < magic.length; i++) if (buffer[ptr + i] != magic[i]) return false;