From 06b4a4cfea4555cebf4e43974dcdae8317589b1c Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Sun, 17 Jul 2016 14:41:04 +1000 Subject: [PATCH] allow sectors to know their own address --- .../diskbrowser/applefile/BootSector.java | 20 ++++++++++++++----- .../diskbrowser/cpm/CPMCatalogSector.java | 5 +++-- src/com/bytezone/diskbrowser/cpm/CPMDisk.java | 2 +- .../disk/AbstractFormattedDisk.java | 6 +++--- .../diskbrowser/disk/AbstractSector.java | 14 +++++++++++-- .../diskbrowser/disk/DefaultSector.java | 4 ++-- .../diskbrowser/dos/DosCatalogSector.java | 5 +++-- src/com/bytezone/diskbrowser/dos/DosDisk.java | 20 ++++++++++--------- .../diskbrowser/dos/DosTSListSector.java | 10 ++++++---- .../diskbrowser/dos/DosVTOCSector.java | 6 ++++-- .../pascal/PascalCatalogSector.java | 6 ++++-- .../diskbrowser/pascal/PascalDisk.java | 7 ++++--- .../prodos/ProdosBitMapSector.java | 8 ++++---- .../prodos/ProdosCatalogSector.java | 5 +++-- .../diskbrowser/prodos/ProdosDisk.java | 15 +++++++------- .../prodos/ProdosExtendedKeySector.java | 5 +++-- .../diskbrowser/prodos/ProdosIndexSector.java | 5 +++-- 17 files changed, 89 insertions(+), 54 deletions(-) diff --git a/src/com/bytezone/diskbrowser/applefile/BootSector.java b/src/com/bytezone/diskbrowser/applefile/BootSector.java index 3511cef..e63c622 100644 --- a/src/com/bytezone/diskbrowser/applefile/BootSector.java +++ b/src/com/bytezone/diskbrowser/applefile/BootSector.java @@ -1,16 +1,26 @@ package com.bytezone.diskbrowser.applefile; +import java.util.List; + import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; public class BootSector extends AbstractSector { AssemblerProgram assembler; - String name; // DOS or Prodos + String name; // DOS or Prodos - public BootSector (Disk disk, byte[] buffer, String name) + public BootSector (Disk disk, byte[] buffer, String name, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); + this.name = name; + } + + public BootSector (Disk disk, byte[] buffer, String name, + List diskAddressList) + { + super (disk, buffer, diskAddressList); this.name = name; } @@ -22,9 +32,9 @@ public class BootSector extends AbstractSector if (assembler == null) { int flag = buffer[0] & 0xFF; - if (flag == 1) // apple II + if (flag == 1) // apple II assembler = new AssemblerProgram (name + " Boot Loader", buffer, 0x00, 1); - else // apple III (SOS) + else // apple III (SOS) { byte[] newBuffer = new byte[buffer.length * 2]; System.arraycopy (buffer, 0, newBuffer, 0, buffer.length); diff --git a/src/com/bytezone/diskbrowser/cpm/CPMCatalogSector.java b/src/com/bytezone/diskbrowser/cpm/CPMCatalogSector.java index 849c10c..20a8170 100644 --- a/src/com/bytezone/diskbrowser/cpm/CPMCatalogSector.java +++ b/src/com/bytezone/diskbrowser/cpm/CPMCatalogSector.java @@ -2,14 +2,15 @@ package com.bytezone.diskbrowser.cpm; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; public class CPMCatalogSector extends AbstractSector { private static int CATALOG_ENTRY_SIZE = 32; - public CPMCatalogSector (Disk disk, byte[] buffer) + public CPMCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); } @Override diff --git a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java index fbdcbd4..f679f11 100644 --- a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java +++ b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java @@ -130,7 +130,7 @@ public class CPMDisk extends AbstractFormattedDisk byte[] buffer = disk.readSector (da); if (type == catalogSector) - return new CPMCatalogSector (disk, buffer); + return new CPMCatalogSector (disk, buffer, da); return super.getFormattedSector (da); } diff --git a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java index 5972416..ebea23b 100755 --- a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java +++ b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java @@ -306,14 +306,14 @@ public abstract class AbstractFormattedDisk implements FormattedDisk String address = String.format ("%02X %02X", da.getTrack (), da.getSector ()); if (sectorType == emptySector) - return new DefaultSector ("Empty sector at " + address, disk, buffer); + return new DefaultSector ("Empty sector at " + address, disk, buffer, da); if (sectorType == usedSector) - return new DefaultSector ("Orphan sector at " + address, disk, buffer); + return new DefaultSector ("Orphan sector at " + address, disk, buffer, da); String name = getSectorFilename (da); if (!name.isEmpty ()) name = " : " + name; - return new DefaultSector ("Data sector at " + address + name, disk, buffer); + return new DefaultSector ("Data sector at " + address + name, disk, buffer, da); } /* diff --git a/src/com/bytezone/diskbrowser/disk/AbstractSector.java b/src/com/bytezone/diskbrowser/disk/AbstractSector.java index f747fa1..b53b1ff 100755 --- a/src/com/bytezone/diskbrowser/disk/AbstractSector.java +++ b/src/com/bytezone/diskbrowser/disk/AbstractSector.java @@ -1,6 +1,7 @@ package com.bytezone.diskbrowser.disk; import java.awt.image.BufferedImage; +import java.util.List; import javax.swing.JComponent; import javax.swing.JPanel; @@ -16,14 +17,23 @@ public abstract class AbstractSector implements DataSource public byte[] buffer; protected Disk disk; + protected DiskAddress diskAddress; + protected List diskAddressList; AssemblerProgram assembler; String description; - // maybe this should just use a DiskAddress - public AbstractSector (Disk disk, byte[] buffer) + public AbstractSector (Disk disk, byte[] buffer, DiskAddress diskAddress) { this.buffer = buffer; this.disk = disk; + this.diskAddress = diskAddress; + } + + public AbstractSector (Disk disk, byte[] buffer, List diskAddressList) + { + this.buffer = buffer; + this.disk = disk; + this.diskAddressList = diskAddressList; } @Override diff --git a/src/com/bytezone/diskbrowser/disk/DefaultSector.java b/src/com/bytezone/diskbrowser/disk/DefaultSector.java index 49f2823..3ba9c8e 100755 --- a/src/com/bytezone/diskbrowser/disk/DefaultSector.java +++ b/src/com/bytezone/diskbrowser/disk/DefaultSector.java @@ -6,9 +6,9 @@ public class DefaultSector extends AbstractSector { String name; - public DefaultSector (String name, Disk disk, byte[] buffer) + public DefaultSector (String name, Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); this.name = name; } diff --git a/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java b/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java index 9004d8e..88ad634 100755 --- a/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java +++ b/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java @@ -2,6 +2,7 @@ package com.bytezone.diskbrowser.dos; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class DosCatalogSector extends AbstractSector @@ -11,9 +12,9 @@ class DosCatalogSector extends AbstractSector "SS file", "Relocatable file", "AA file", "BB file" }; private static int CATALOG_ENTRY_SIZE = 35; - public DosCatalogSector (Disk disk, byte[] buffer) + public DosCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); } @Override diff --git a/src/com/bytezone/diskbrowser/dos/DosDisk.java b/src/com/bytezone/diskbrowser/dos/DosDisk.java index c889407..8d97f19 100755 --- a/src/com/bytezone/diskbrowser/dos/DosDisk.java +++ b/src/com/bytezone/diskbrowser/dos/DosDisk.java @@ -47,11 +47,13 @@ public class DosDisk extends AbstractFormattedDisk sectorTypesList.add (tsListSector); sectorTypesList.add (dataSector); - byte[] sectorBuffer = disk.readSector (0, 0); // Boot sector - bootSector = new BootSector (disk, sectorBuffer, "DOS"); + DiskAddress da = disk.getDiskAddress (0, 0); + byte[] sectorBuffer = disk.readSector (da); // Boot sector + bootSector = new BootSector (disk, sectorBuffer, "DOS", da); - sectorBuffer = disk.readSector (CATALOG_TRACK, 0); // VTOC - dosVTOCSector = new DosVTOCSector (this, disk, sectorBuffer); + da = disk.getDiskAddress (CATALOG_TRACK, 0); + sectorBuffer = disk.readSector (da); // VTOC + dosVTOCSector = new DosVTOCSector (this, disk, sectorBuffer, da); DiskAddress catalogStart = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]); @@ -77,7 +79,7 @@ public class DosDisk extends AbstractFormattedDisk rootNode.add (volumeNode); // flag the catalog sectors before any file mistakenly grabs them - DiskAddress da = disk.getDiskAddress (catalogStart.getBlock ()); + da = disk.getDiskAddress (catalogStart.getBlock ()); do { if (!disk.isValidAddress (da)) @@ -324,14 +326,14 @@ public class DosDisk extends AbstractFormattedDisk String address = String.format ("%02X %02X", da.getTrack (), da.getSector ()); if (type == tsListSector) - return new DosTSListSector (getSectorFilename (da), disk, buffer); + return new DosTSListSector (getSectorFilename (da), disk, buffer, da); if (type == catalogSector) - return new DosCatalogSector (disk, buffer); + return new DosCatalogSector (disk, buffer, da); if (type == dataSector) return new DefaultSector ( - "Data Sector at " + address + " : " + getSectorFilename (da), disk, buffer); + "Data Sector at " + address + " : " + getSectorFilename (da), disk, buffer, da); if (type == dosSector) - return new DefaultSector ("DOS sector at " + address, disk, buffer); + return new DefaultSector ("DOS sector at " + address, disk, buffer, da); return super.getFormattedSector (da); } diff --git a/src/com/bytezone/diskbrowser/dos/DosTSListSector.java b/src/com/bytezone/diskbrowser/dos/DosTSListSector.java index 6b573e4..df3e141 100755 --- a/src/com/bytezone/diskbrowser/dos/DosTSListSector.java +++ b/src/com/bytezone/diskbrowser/dos/DosTSListSector.java @@ -9,9 +9,9 @@ class DosTSListSector extends AbstractSector { String name; - public DosTSListSector (String name, Disk disk, byte[] buffer) + public DosTSListSector (String name, Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); this.name = name; } @@ -52,10 +52,12 @@ class DosTSListSector extends AbstractSector @Override public String createText () { - // should check whether the next sector address is this sector + DiskAddress da = disk.getDiskAddress (buffer[1], buffer[2]); + String msg = da.compareTo (diskAddress) == 0 ? " (circular reference)" : ""; + StringBuilder text = getHeader ("TS List Sector : " + name); addText (text, buffer, 0, 1, "Not used"); - addText (text, buffer, 1, 2, "Next TS list track/sector"); + addText (text, buffer, 1, 2, "Next TS list track/sector" + msg); addText (text, buffer, 3, 2, "Not used"); addTextAndDecimal (text, buffer, 5, 2, "Sector base number"); addText (text, buffer, 7, 4, "Not used"); diff --git a/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java b/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java index 51ab240..a8cec4b 100755 --- a/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java +++ b/src/com/bytezone/diskbrowser/dos/DosVTOCSector.java @@ -2,6 +2,7 @@ package com.bytezone.diskbrowser.dos; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class DosVTOCSector extends AbstractSector @@ -18,9 +19,10 @@ class DosVTOCSector extends AbstractSector int maxSectors; int maxTracks; - public DosVTOCSector (DosDisk parentDisk, Disk disk, byte[] buffer) + public DosVTOCSector (DosDisk parentDisk, Disk disk, byte[] buffer, + DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); this.parentDisk = parentDisk; DOSVersion = buffer[3]; diff --git a/src/com/bytezone/diskbrowser/pascal/PascalCatalogSector.java b/src/com/bytezone/diskbrowser/pascal/PascalCatalogSector.java index 6be71ea..3680d84 100644 --- a/src/com/bytezone/diskbrowser/pascal/PascalCatalogSector.java +++ b/src/com/bytezone/diskbrowser/pascal/PascalCatalogSector.java @@ -2,9 +2,11 @@ package com.bytezone.diskbrowser.pascal; import java.text.DateFormat; import java.util.GregorianCalendar; +import java.util.List; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class PascalCatalogSector extends AbstractSector @@ -13,9 +15,9 @@ class PascalCatalogSector extends AbstractSector private static String[] fileTypes = { "Volume", "Bad", "Code", "Text", "Info", "Data", "Graf", "Foto", "SecureDir" }; - public PascalCatalogSector (Disk disk, byte[] buffer) + public PascalCatalogSector (Disk disk, byte[] buffer, List diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); } @Override diff --git a/src/com/bytezone/diskbrowser/pascal/PascalDisk.java b/src/com/bytezone/diskbrowser/pascal/PascalDisk.java index 91ad360..632e920 100755 --- a/src/com/bytezone/diskbrowser/pascal/PascalDisk.java +++ b/src/com/bytezone/diskbrowser/pascal/PascalDisk.java @@ -47,9 +47,10 @@ public class PascalDisk extends AbstractFormattedDisk sectorTypesList.add (grafSector); sectorTypesList.add (fotoSector); + // DiskAddress da = disk.getDiskAddress (0); List blocks = disk.getDiskAddressList (0, 1); byte[] buffer = disk.readSectors (blocks); - this.bootSector = new BootSector (disk, buffer, "Pascal"); + this.bootSector = new BootSector (disk, buffer, "Pascal", blocks); buffer = disk.readSector (2); byte[] data = new byte[CATALOG_ENTRY_SIZE]; @@ -78,7 +79,7 @@ public class PascalDisk extends AbstractFormattedDisk } buffer = disk.readSectors (sectors); - diskCatalogSector = new PascalCatalogSector (disk, buffer); // uses all 4 sectors + diskCatalogSector = new PascalCatalogSector (disk, buffer, sectors); DefaultMutableTreeNode root = getCatalogTreeRoot (); DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode (volume); @@ -220,7 +221,7 @@ public class PascalDisk extends AbstractFormattedDisk return diskCatalogSector; String name = getSectorFilename (da); if (name != null) - return new DefaultSector (name, disk, disk.readSector (da)); + return new DefaultSector (name, disk, disk.readSector (da), da); return super.getFormattedSector (da); } diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosBitMapSector.java b/src/com/bytezone/diskbrowser/prodos/ProdosBitMapSector.java index daa9a76..eea1373 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosBitMapSector.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosBitMapSector.java @@ -8,13 +8,13 @@ import com.bytezone.diskbrowser.disk.DiskAddress; class ProdosBitMapSector extends AbstractSector { - private final DiskAddress da; + // private final DiskAddress da; private final ProdosDisk parent; ProdosBitMapSector (ProdosDisk parent, Disk disk, byte[] buffer, DiskAddress da) { - super (disk, buffer); - this.da = da; + super (disk, buffer, da); + // this.da = da; this.parent = parent; } @@ -25,7 +25,7 @@ class ProdosBitMapSector extends AbstractSector // check range of bits for current block - so far I don't have a disk that needs // more than a single block - int relativeBlock = da.getBlock () - parent.vdh.bitMapBlock; + int relativeBlock = diskAddress.getBlock () - parent.vdh.bitMapBlock; int startBit = relativeBlock * 4096; int endBit = startBit + 4096; if (startBit >= grid.width * grid.height) diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java b/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java index cf832fd..d1e6bb8 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java @@ -6,13 +6,14 @@ import java.util.GregorianCalendar; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class ProdosCatalogSector extends AbstractSector { - ProdosCatalogSector (Disk disk, byte[] buffer) + ProdosCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); } @Override diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java index 30f10ec..cdaa656 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java @@ -51,8 +51,9 @@ public class ProdosDisk extends AbstractFormattedDisk if (!disk.isSectorEmpty (disk.getDiskAddress (block))) sectorTypes[block] = dosSector; - byte[] buffer = disk.readSector (0); - bootSector = new BootSector (disk, buffer, "Prodos"); + DiskAddress da = disk.getDiskAddress (0); + byte[] buffer = disk.readSector (da); + bootSector = new BootSector (disk, buffer, "Prodos", da); DefaultMutableTreeNode root = getCatalogTreeRoot (); DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode ("empty volume node"); @@ -224,19 +225,19 @@ public class ProdosDisk extends AbstractFormattedDisk SectorType type = sectorTypes[da.getBlock ()]; if (type == catalogSector || type == subcatalogSector) - return new ProdosCatalogSector (disk, buffer); + return new ProdosCatalogSector (disk, buffer, da); if (type == volumeMapSector) return new ProdosBitMapSector (this, disk, buffer, da); if (type == masterIndexSector || type == indexSector) - return new ProdosIndexSector (getSectorFilename (da), disk, buffer); + return new ProdosIndexSector (getSectorFilename (da), disk, buffer, da); if (type == extendedKeySector) - return new ProdosExtendedKeySector (disk, buffer); + return new ProdosExtendedKeySector (disk, buffer, da); if (type == dosSector) - return new DefaultSector ("Boot sector", disk, buffer); + return new DefaultSector ("Boot sector", disk, buffer, da); String name = getSectorFilename (da); if (name != null) - return new DefaultSector (name, disk, buffer); + return new DefaultSector (name, disk, buffer, da); return super.getFormattedSector (da); } diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosExtendedKeySector.java b/src/com/bytezone/diskbrowser/prodos/ProdosExtendedKeySector.java index 7f458f0..b039130 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosExtendedKeySector.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosExtendedKeySector.java @@ -2,12 +2,13 @@ package com.bytezone.diskbrowser.prodos; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; class ProdosExtendedKeySector extends AbstractSector { - public ProdosExtendedKeySector (Disk disk, byte[] buffer) + public ProdosExtendedKeySector (Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); } @Override diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosIndexSector.java b/src/com/bytezone/diskbrowser/prodos/ProdosIndexSector.java index 0584bd8..d8fa3bb 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosIndexSector.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosIndexSector.java @@ -2,15 +2,16 @@ package com.bytezone.diskbrowser.prodos; import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.Disk; +import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.utilities.HexFormatter; class ProdosIndexSector extends AbstractSector { private final String name; - ProdosIndexSector (String name, Disk disk, byte[] buffer) + ProdosIndexSector (String name, Disk disk, byte[] buffer, DiskAddress diskAddress) { - super (disk, buffer); + super (disk, buffer, diskAddress); this.name = name; }