From befdf002f1ea6f91e135cebd71e4477aa20b5abe Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Sat, 25 Jan 2020 16:34:41 +1000 Subject: [PATCH] bad length .po file --- .../bytezone/diskbrowser/disk/AppleDisk.java | 4 +- .../diskbrowser/disk/DiskFactory.java | 4 +- .../diskbrowser/infocom/CodeManager.java | 10 +-- .../diskbrowser/infocom/Instruction.java | 84 +++++++++++-------- .../diskbrowser/prodos/ProdosDisk.java | 8 +- 5 files changed, 66 insertions(+), 44 deletions(-) diff --git a/src/com/bytezone/diskbrowser/disk/AppleDisk.java b/src/com/bytezone/diskbrowser/disk/AppleDisk.java index 6dc7667..42fad5a 100755 --- a/src/com/bytezone/diskbrowser/disk/AppleDisk.java +++ b/src/com/bytezone/diskbrowser/disk/AppleDisk.java @@ -106,7 +106,6 @@ public class AppleDisk implements Disk byte[] buffer = getPrefix (file); // HDV could be a 2mg String prefix = new String (buffer, 0, 4); - // int skip = 0; if (suffix.equalsIgnoreCase ("2mg") || "2IMG".equals (prefix)) { @@ -162,7 +161,8 @@ public class AppleDisk implements Disk this.trackSize = sectors * sectorSize; } } - else if (suffix.equalsIgnoreCase ("HDV")) + else if (suffix.equalsIgnoreCase ("HDV") + || (suffix.equalsIgnoreCase ("po") && tracks > 50)) // ULTIMATE APPLE1 CFFA 3.5.po { //this.blocks = (int) file.length () / 4096 * 8; // reduce blocks to a multiple of 8 this.blocks = tracks * sectors; diff --git a/src/com/bytezone/diskbrowser/disk/DiskFactory.java b/src/com/bytezone/diskbrowser/disk/DiskFactory.java index d2a7c77..255f867 100755 --- a/src/com/bytezone/diskbrowser/disk/DiskFactory.java +++ b/src/com/bytezone/diskbrowser/disk/DiskFactory.java @@ -202,7 +202,7 @@ public class DiskFactory } if (debug) - System.out.println (" Checking po or dsk hard drive: " + file.length ()); + System.out.printf (" Checking po or dsk hard drive: %,d%n", file.length ()); disk = checkHardDisk (file); if (disk != null) @@ -232,7 +232,7 @@ public class DiskFactory { AppleDisk appleDisk = new AppleDisk (file, (int) file.length () / 4096, 8); if (debug) - System.out.println (" created data usk"); + System.out.println (" created data disk"); return new DataDisk (appleDisk); } catch (FileFormatException e) diff --git a/src/com/bytezone/diskbrowser/infocom/CodeManager.java b/src/com/bytezone/diskbrowser/infocom/CodeManager.java index 4e99d4b..d8a8320 100644 --- a/src/com/bytezone/diskbrowser/infocom/CodeManager.java +++ b/src/com/bytezone/diskbrowser/infocom/CodeManager.java @@ -228,16 +228,16 @@ class CodeManager extends AbstractFile } // try to create a new Routine - Routine r = new Routine (address, header, caller); - if (!r.isValid ()) + Routine routine = new Routine (address, header, caller); + if (!routine.isValid ()) return null; // recursively add all routines called by this one - routines.put (address, r); - for (int ptr : r.calls) + routines.put (address, routine); + for (int ptr : routine.calls) addRoutine (ptr, address); - return r; + return routine; } Routine getRoutine (int address) diff --git a/src/com/bytezone/diskbrowser/infocom/Instruction.java b/src/com/bytezone/diskbrowser/infocom/Instruction.java index 22d78d9..efb7144 100755 --- a/src/com/bytezone/diskbrowser/infocom/Instruction.java +++ b/src/com/bytezone/diskbrowser/infocom/Instruction.java @@ -17,7 +17,7 @@ class Instruction enum OperandType { - VAR_SP, VAR_LOCAL, VAR_GLOBAL, BYTE, WORD, ARG_BRANCH, ARG_STRING + VAR_SP, VAR_LOCAL, VAR_GLOBAL, BYTE, WORD, ARG_BRANCH, ARG_STRING, OBJECT } static final String[] name2OP = @@ -142,7 +142,7 @@ class Instruction { int opcodeNumber; int opcodeLength; - List operands; + List operands = new ArrayList<> (); int totalOperandLength; ArgumentBranch branch; ArgumentString string; @@ -151,11 +151,6 @@ class Instruction int jumpTarget; int callTarget; - Opcode () - { - operands = new ArrayList (); - } - @Override public String toString () { @@ -174,7 +169,7 @@ class Instruction text.append (op + ", "); if (operands.size () > 1) text.delete (text.length () - 2, text.length ()); - text.append (") --> " + store); + text.append (") -> " + store); } else { @@ -183,7 +178,7 @@ class Instruction if (branch != null) text.append (branch); if (store != null) - text.append (" --> " + store); + text.append (" -> " + store); if (string != null) text.append (" \"" + string + "\""); } @@ -360,8 +355,17 @@ class Instruction opcodeNumber = buffer[ptr] & 0x1F; boolean bit1 = ((buffer[ptr] & 0x40) == 0x40); boolean bit2 = ((buffer[ptr] & 0x20) == 0x20); - addOperand (buffer, ptr + 1, bit1); - addOperand (buffer, ptr + 1, bit2); + + if (opcodeNumber == 0x0D) // store (variable) value + { + addOperand (buffer, ptr + 1, true); // always a variable + addOperand (buffer, ptr + 1, bit2); + } + else + { + addOperand (buffer, ptr + 1, bit1); + addOperand (buffer, ptr + 1, bit2); + } setArguments (buffer); } @@ -389,11 +393,17 @@ class Instruction if (opcodeNumber == 0 || opcodeNumber == 7) setStore (buffer); - if (opcodeNumber == 0) + if (opcodeNumber == 0) // call routine { isCall = true; callTarget = operands.get (0).value * 2; } + + if (opcodeNumber == 3) // put prop object propertyValue + { + // first parameter is the object id + operands.get (0).operandType = OperandType.OBJECT; + } } @Override @@ -408,6 +418,34 @@ class Instruction int length; int value; OperandType operandType; + + @Override + public String toString () + { + switch (operandType) + { + case VAR_SP: + return ("(SP)"); + + case VAR_LOCAL: + return (String.format ("L%02X", value - 1)); + + case VAR_GLOBAL: + return String.format ("G%02X", (value - 16)); + + case BYTE: + return String.format ("#%02X", value); + + case WORD: + return String.format ("#%04X", value); + + case OBJECT: + return "\"" + header.objectManager.getObject (value - 1).getName () + "\""; + + default: + return "*** Illegal ***"; + } + } } class OperandWord extends Operand @@ -418,12 +456,6 @@ class Instruction length = 2; operandType = OperandType.WORD; } - - @Override - public String toString () - { - return String.format ("#%04X", value); - } } class OperandByte extends Operand @@ -434,12 +466,6 @@ class Instruction length = 1; operandType = OperandType.BYTE; } - - @Override - public String toString () - { - return String.format ("#%02X", value); - } } class OperandVariable extends Operand @@ -456,16 +482,6 @@ class Instruction else operandType = OperandType.VAR_GLOBAL; } - - @Override - public String toString () - { - if (operandType == OperandType.VAR_SP) - return ("(SP)"); - if (operandType == OperandType.VAR_LOCAL) - return (String.format ("L%02X", value)); - return String.format ("G%02X", (value - 16)); - } } class ArgumentBranch extends Operand diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java index 294dfe3..4b57208 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java @@ -12,7 +12,13 @@ import javax.swing.tree.DefaultTreeModel; import com.bytezone.diskbrowser.applefile.AppleFileSource; import com.bytezone.diskbrowser.applefile.BootSector; -import com.bytezone.diskbrowser.disk.*; +import com.bytezone.diskbrowser.disk.AbstractFormattedDisk; +import com.bytezone.diskbrowser.disk.AppleDisk; +import com.bytezone.diskbrowser.disk.DefaultAppleFileSource; +import com.bytezone.diskbrowser.disk.DefaultSector; +import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; +import com.bytezone.diskbrowser.disk.SectorType; import com.bytezone.diskbrowser.gui.DataSource; import com.bytezone.diskbrowser.gui.ProdosPreferences; import com.bytezone.diskbrowser.utilities.HexFormatter;