From bff1e8de2debfe32b6b6e6e13d8d8d8535aef7fa Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Wed, 20 Jul 2016 15:22:33 +1000 Subject: [PATCH] set code sectors --- .../diskbrowser/infocom/CodeManager.java | 34 ++++++++++++++----- .../bytezone/diskbrowser/infocom/Header.java | 8 +++-- .../diskbrowser/infocom/InfocomDisk.java | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/com/bytezone/diskbrowser/infocom/CodeManager.java b/src/com/bytezone/diskbrowser/infocom/CodeManager.java index 2d60b3f..964f055 100644 --- a/src/com/bytezone/diskbrowser/infocom/CodeManager.java +++ b/src/com/bytezone/diskbrowser/infocom/CodeManager.java @@ -1,5 +1,6 @@ package com.bytezone.diskbrowser.infocom; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -8,7 +9,8 @@ import javax.swing.tree.DefaultMutableTreeNode; import com.bytezone.diskbrowser.applefile.AbstractFile; import com.bytezone.diskbrowser.disk.DefaultAppleFileSource; -import com.bytezone.diskbrowser.disk.FormattedDisk; +import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class CodeManager extends AbstractFile @@ -23,25 +25,41 @@ class CodeManager extends AbstractFile this.header = header; } - public void addNodes (DefaultMutableTreeNode root, FormattedDisk disk) + void addNodes (DefaultMutableTreeNode root, InfocomDisk disk) { root.setAllowsChildren (true); - codeSize = header.stringPointer - header.highMemory; // should be set by now - do this better! + // should be set by now - do this better! + codeSize = header.stringPointer - header.highMemory; int count = 0; for (Routine routine : routines.values ()) { - DefaultMutableTreeNode node = - new DefaultMutableTreeNode (new DefaultAppleFileSource ( - String.format ("%3d %s (%04X)", ++count, routine.getName (), - routine.startPtr / 2), - routine, disk)); + String name = String.format ("%3d %s (%04X)", ++count, routine.getName (), + routine.startPtr / 2); + DefaultAppleFileSource dafs = new DefaultAppleFileSource (name, routine, disk); + dafs.setSectors (getSectors (routine, disk.getDisk ())); + + DefaultMutableTreeNode node = new DefaultMutableTreeNode (dafs); node.setAllowsChildren (false); root.add (node); } } + private List getSectors (Routine routine, Disk disk) + { + int blockNo = routine.startPtr / 256 + 48; + int size = routine.length; + List blocks = new ArrayList (); + + while (size > 0) + { + blocks.add (disk.getDiskAddress (blockNo++)); + size -= 256; + } + return blocks; + } + public void addMissingRoutines () { System.out.printf ("%nWalking the code block%n%n"); diff --git a/src/com/bytezone/diskbrowser/infocom/Header.java b/src/com/bytezone/diskbrowser/infocom/Header.java index ee47b31..3206aa1 100755 --- a/src/com/bytezone/diskbrowser/infocom/Header.java +++ b/src/com/bytezone/diskbrowser/infocom/Header.java @@ -2,11 +2,14 @@ package com.bytezone.diskbrowser.infocom; import java.io.File; +import com.bytezone.diskbrowser.disk.Disk; + class Header extends InfocomAbstractFile { final String[] propertyNames = new String[32]; private final File file; + private final Disk disk; int version; int highMemory; int programCounter; @@ -27,10 +30,11 @@ class Header extends InfocomAbstractFile Globals globals; Grammar grammar; - public Header (String name, byte[] buffer, File file) + public Header (String name, byte[] buffer, Disk disk) { super (name, buffer); - this.file = file; + this.disk = disk; + this.file = disk.getFile (); version = getByte (0); highMemory = getWord (4); diff --git a/src/com/bytezone/diskbrowser/infocom/InfocomDisk.java b/src/com/bytezone/diskbrowser/infocom/InfocomDisk.java index 6930a3f..05d82bf 100755 --- a/src/com/bytezone/diskbrowser/infocom/InfocomDisk.java +++ b/src/com/bytezone/diskbrowser/infocom/InfocomDisk.java @@ -58,7 +58,7 @@ public class InfocomDisk extends AbstractFormattedDisk DefaultMutableTreeNode dictionaryNode = null; DefaultMutableTreeNode stringsNode = null; - header = new Header ("Header", data, disk.getFile ()); + header = new Header ("Header", data, disk); headerNode = addToTree (root, "Header", header, TYPE_LEAF); DefaultAppleFileSource dafs = (DefaultAppleFileSource) headerNode.getUserObject ();