allow sectors to know their own address

This commit is contained in:
Denis Molony 2016-07-17 14:41:04 +10:00
parent bb38d3d68f
commit 06b4a4cfea
17 changed files with 89 additions and 54 deletions

View File

@ -1,16 +1,26 @@
package com.bytezone.diskbrowser.applefile; package com.bytezone.diskbrowser.applefile;
import java.util.List;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
public class BootSector extends AbstractSector public class BootSector extends AbstractSector
{ {
AssemblerProgram assembler; 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<DiskAddress> diskAddressList)
{
super (disk, buffer, diskAddressList);
this.name = name; this.name = name;
} }
@ -22,9 +32,9 @@ public class BootSector extends AbstractSector
if (assembler == null) if (assembler == null)
{ {
int flag = buffer[0] & 0xFF; int flag = buffer[0] & 0xFF;
if (flag == 1) // apple II if (flag == 1) // apple II
assembler = new AssemblerProgram (name + " Boot Loader", buffer, 0x00, 1); assembler = new AssemblerProgram (name + " Boot Loader", buffer, 0x00, 1);
else // apple III (SOS) else // apple III (SOS)
{ {
byte[] newBuffer = new byte[buffer.length * 2]; byte[] newBuffer = new byte[buffer.length * 2];
System.arraycopy (buffer, 0, newBuffer, 0, buffer.length); System.arraycopy (buffer, 0, newBuffer, 0, buffer.length);

View File

@ -2,14 +2,15 @@ package com.bytezone.diskbrowser.cpm;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
public class CPMCatalogSector extends AbstractSector public class CPMCatalogSector extends AbstractSector
{ {
private static int CATALOG_ENTRY_SIZE = 32; 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 @Override

View File

@ -130,7 +130,7 @@ public class CPMDisk extends AbstractFormattedDisk
byte[] buffer = disk.readSector (da); byte[] buffer = disk.readSector (da);
if (type == catalogSector) if (type == catalogSector)
return new CPMCatalogSector (disk, buffer); return new CPMCatalogSector (disk, buffer, da);
return super.getFormattedSector (da); return super.getFormattedSector (da);
} }

View File

@ -306,14 +306,14 @@ public abstract class AbstractFormattedDisk implements FormattedDisk
String address = String.format ("%02X %02X", da.getTrack (), da.getSector ()); String address = String.format ("%02X %02X", da.getTrack (), da.getSector ());
if (sectorType == emptySector) 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) 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); String name = getSectorFilename (da);
if (!name.isEmpty ()) if (!name.isEmpty ())
name = " : " + name; name = " : " + name;
return new DefaultSector ("Data sector at " + address + name, disk, buffer); return new DefaultSector ("Data sector at " + address + name, disk, buffer, da);
} }
/* /*

View File

@ -1,6 +1,7 @@
package com.bytezone.diskbrowser.disk; package com.bytezone.diskbrowser.disk;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.List;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -16,14 +17,23 @@ public abstract class AbstractSector implements DataSource
public byte[] buffer; public byte[] buffer;
protected Disk disk; protected Disk disk;
protected DiskAddress diskAddress;
protected List<DiskAddress> diskAddressList;
AssemblerProgram assembler; AssemblerProgram assembler;
String description; String description;
// maybe this should just use a DiskAddress public AbstractSector (Disk disk, byte[] buffer, DiskAddress diskAddress)
public AbstractSector (Disk disk, byte[] buffer)
{ {
this.buffer = buffer; this.buffer = buffer;
this.disk = disk; this.disk = disk;
this.diskAddress = diskAddress;
}
public AbstractSector (Disk disk, byte[] buffer, List<DiskAddress> diskAddressList)
{
this.buffer = buffer;
this.disk = disk;
this.diskAddressList = diskAddressList;
} }
@Override @Override

View File

@ -6,9 +6,9 @@ public class DefaultSector extends AbstractSector
{ {
String name; 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; this.name = name;
} }

View File

@ -2,6 +2,7 @@ package com.bytezone.diskbrowser.dos;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
class DosCatalogSector extends AbstractSector class DosCatalogSector extends AbstractSector
@ -11,9 +12,9 @@ class DosCatalogSector extends AbstractSector
"SS file", "Relocatable file", "AA file", "BB file" }; "SS file", "Relocatable file", "AA file", "BB file" };
private static int CATALOG_ENTRY_SIZE = 35; 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 @Override

View File

@ -47,11 +47,13 @@ public class DosDisk extends AbstractFormattedDisk
sectorTypesList.add (tsListSector); sectorTypesList.add (tsListSector);
sectorTypesList.add (dataSector); sectorTypesList.add (dataSector);
byte[] sectorBuffer = disk.readSector (0, 0); // Boot sector DiskAddress da = disk.getDiskAddress (0, 0);
bootSector = new BootSector (disk, sectorBuffer, "DOS"); byte[] sectorBuffer = disk.readSector (da); // Boot sector
bootSector = new BootSector (disk, sectorBuffer, "DOS", da);
sectorBuffer = disk.readSector (CATALOG_TRACK, 0); // VTOC da = disk.getDiskAddress (CATALOG_TRACK, 0);
dosVTOCSector = new DosVTOCSector (this, disk, sectorBuffer); sectorBuffer = disk.readSector (da); // VTOC
dosVTOCSector = new DosVTOCSector (this, disk, sectorBuffer, da);
DiskAddress catalogStart = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]); DiskAddress catalogStart = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]);
@ -77,7 +79,7 @@ public class DosDisk extends AbstractFormattedDisk
rootNode.add (volumeNode); rootNode.add (volumeNode);
// flag the catalog sectors before any file mistakenly grabs them // flag the catalog sectors before any file mistakenly grabs them
DiskAddress da = disk.getDiskAddress (catalogStart.getBlock ()); da = disk.getDiskAddress (catalogStart.getBlock ());
do do
{ {
if (!disk.isValidAddress (da)) if (!disk.isValidAddress (da))
@ -324,14 +326,14 @@ public class DosDisk extends AbstractFormattedDisk
String address = String.format ("%02X %02X", da.getTrack (), da.getSector ()); String address = String.format ("%02X %02X", da.getTrack (), da.getSector ());
if (type == tsListSector) if (type == tsListSector)
return new DosTSListSector (getSectorFilename (da), disk, buffer); return new DosTSListSector (getSectorFilename (da), disk, buffer, da);
if (type == catalogSector) if (type == catalogSector)
return new DosCatalogSector (disk, buffer); return new DosCatalogSector (disk, buffer, da);
if (type == dataSector) if (type == dataSector)
return new DefaultSector ( return new DefaultSector (
"Data Sector at " + address + " : " + getSectorFilename (da), disk, buffer); "Data Sector at " + address + " : " + getSectorFilename (da), disk, buffer, da);
if (type == dosSector) 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); return super.getFormattedSector (da);
} }

View File

@ -9,9 +9,9 @@ class DosTSListSector extends AbstractSector
{ {
String name; 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; this.name = name;
} }
@ -52,10 +52,12 @@ class DosTSListSector extends AbstractSector
@Override @Override
public String createText () 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); StringBuilder text = getHeader ("TS List Sector : " + name);
addText (text, buffer, 0, 1, "Not used"); 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"); addText (text, buffer, 3, 2, "Not used");
addTextAndDecimal (text, buffer, 5, 2, "Sector base number"); addTextAndDecimal (text, buffer, 5, 2, "Sector base number");
addText (text, buffer, 7, 4, "Not used"); addText (text, buffer, 7, 4, "Not used");

View File

@ -2,6 +2,7 @@ package com.bytezone.diskbrowser.dos;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
class DosVTOCSector extends AbstractSector class DosVTOCSector extends AbstractSector
@ -18,9 +19,10 @@ class DosVTOCSector extends AbstractSector
int maxSectors; int maxSectors;
int maxTracks; 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; this.parentDisk = parentDisk;
DOSVersion = buffer[3]; DOSVersion = buffer[3];

View File

@ -2,9 +2,11 @@ package com.bytezone.diskbrowser.pascal;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.List;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
class PascalCatalogSector extends AbstractSector class PascalCatalogSector extends AbstractSector
@ -13,9 +15,9 @@ class PascalCatalogSector extends AbstractSector
private static String[] fileTypes = private static String[] fileTypes =
{ "Volume", "Bad", "Code", "Text", "Info", "Data", "Graf", "Foto", "SecureDir" }; { "Volume", "Bad", "Code", "Text", "Info", "Data", "Graf", "Foto", "SecureDir" };
public PascalCatalogSector (Disk disk, byte[] buffer) public PascalCatalogSector (Disk disk, byte[] buffer, List<DiskAddress> diskAddress)
{ {
super (disk, buffer); super (disk, buffer, diskAddress);
} }
@Override @Override

View File

@ -47,9 +47,10 @@ public class PascalDisk extends AbstractFormattedDisk
sectorTypesList.add (grafSector); sectorTypesList.add (grafSector);
sectorTypesList.add (fotoSector); sectorTypesList.add (fotoSector);
// DiskAddress da = disk.getDiskAddress (0);
List<DiskAddress> blocks = disk.getDiskAddressList (0, 1); List<DiskAddress> blocks = disk.getDiskAddressList (0, 1);
byte[] buffer = disk.readSectors (blocks); byte[] buffer = disk.readSectors (blocks);
this.bootSector = new BootSector (disk, buffer, "Pascal"); this.bootSector = new BootSector (disk, buffer, "Pascal", blocks);
buffer = disk.readSector (2); buffer = disk.readSector (2);
byte[] data = new byte[CATALOG_ENTRY_SIZE]; byte[] data = new byte[CATALOG_ENTRY_SIZE];
@ -78,7 +79,7 @@ public class PascalDisk extends AbstractFormattedDisk
} }
buffer = disk.readSectors (sectors); buffer = disk.readSectors (sectors);
diskCatalogSector = new PascalCatalogSector (disk, buffer); // uses all 4 sectors diskCatalogSector = new PascalCatalogSector (disk, buffer, sectors);
DefaultMutableTreeNode root = getCatalogTreeRoot (); DefaultMutableTreeNode root = getCatalogTreeRoot ();
DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode (volume); DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode (volume);
@ -220,7 +221,7 @@ public class PascalDisk extends AbstractFormattedDisk
return diskCatalogSector; return diskCatalogSector;
String name = getSectorFilename (da); String name = getSectorFilename (da);
if (name != null) if (name != null)
return new DefaultSector (name, disk, disk.readSector (da)); return new DefaultSector (name, disk, disk.readSector (da), da);
return super.getFormattedSector (da); return super.getFormattedSector (da);
} }

View File

@ -8,13 +8,13 @@ import com.bytezone.diskbrowser.disk.DiskAddress;
class ProdosBitMapSector extends AbstractSector class ProdosBitMapSector extends AbstractSector
{ {
private final DiskAddress da; // private final DiskAddress da;
private final ProdosDisk parent; private final ProdosDisk parent;
ProdosBitMapSector (ProdosDisk parent, Disk disk, byte[] buffer, DiskAddress da) ProdosBitMapSector (ProdosDisk parent, Disk disk, byte[] buffer, DiskAddress da)
{ {
super (disk, buffer); super (disk, buffer, da);
this.da = da; // this.da = da;
this.parent = parent; 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 // check range of bits for current block - so far I don't have a disk that needs
// more than a single block // more than a single block
int relativeBlock = da.getBlock () - parent.vdh.bitMapBlock; int relativeBlock = diskAddress.getBlock () - parent.vdh.bitMapBlock;
int startBit = relativeBlock * 4096; int startBit = relativeBlock * 4096;
int endBit = startBit + 4096; int endBit = startBit + 4096;
if (startBit >= grid.width * grid.height) if (startBit >= grid.width * grid.height)

View File

@ -6,13 +6,14 @@ import java.util.GregorianCalendar;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
class ProdosCatalogSector extends AbstractSector class ProdosCatalogSector extends AbstractSector
{ {
ProdosCatalogSector (Disk disk, byte[] buffer) ProdosCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress)
{ {
super (disk, buffer); super (disk, buffer, diskAddress);
} }
@Override @Override

View File

@ -51,8 +51,9 @@ public class ProdosDisk extends AbstractFormattedDisk
if (!disk.isSectorEmpty (disk.getDiskAddress (block))) if (!disk.isSectorEmpty (disk.getDiskAddress (block)))
sectorTypes[block] = dosSector; sectorTypes[block] = dosSector;
byte[] buffer = disk.readSector (0); DiskAddress da = disk.getDiskAddress (0);
bootSector = new BootSector (disk, buffer, "Prodos"); byte[] buffer = disk.readSector (da);
bootSector = new BootSector (disk, buffer, "Prodos", da);
DefaultMutableTreeNode root = getCatalogTreeRoot (); DefaultMutableTreeNode root = getCatalogTreeRoot ();
DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode ("empty volume node"); DefaultMutableTreeNode volumeNode = new DefaultMutableTreeNode ("empty volume node");
@ -224,19 +225,19 @@ public class ProdosDisk extends AbstractFormattedDisk
SectorType type = sectorTypes[da.getBlock ()]; SectorType type = sectorTypes[da.getBlock ()];
if (type == catalogSector || type == subcatalogSector) if (type == catalogSector || type == subcatalogSector)
return new ProdosCatalogSector (disk, buffer); return new ProdosCatalogSector (disk, buffer, da);
if (type == volumeMapSector) if (type == volumeMapSector)
return new ProdosBitMapSector (this, disk, buffer, da); return new ProdosBitMapSector (this, disk, buffer, da);
if (type == masterIndexSector || type == indexSector) if (type == masterIndexSector || type == indexSector)
return new ProdosIndexSector (getSectorFilename (da), disk, buffer); return new ProdosIndexSector (getSectorFilename (da), disk, buffer, da);
if (type == extendedKeySector) if (type == extendedKeySector)
return new ProdosExtendedKeySector (disk, buffer); return new ProdosExtendedKeySector (disk, buffer, da);
if (type == dosSector) if (type == dosSector)
return new DefaultSector ("Boot sector", disk, buffer); return new DefaultSector ("Boot sector", disk, buffer, da);
String name = getSectorFilename (da); String name = getSectorFilename (da);
if (name != null) if (name != null)
return new DefaultSector (name, disk, buffer); return new DefaultSector (name, disk, buffer, da);
return super.getFormattedSector (da); return super.getFormattedSector (da);
} }

View File

@ -2,12 +2,13 @@ package com.bytezone.diskbrowser.prodos;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
class ProdosExtendedKeySector extends AbstractSector 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 @Override

View File

@ -2,15 +2,16 @@ package com.bytezone.diskbrowser.prodos;
import com.bytezone.diskbrowser.disk.AbstractSector; import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk; import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
class ProdosIndexSector extends AbstractSector class ProdosIndexSector extends AbstractSector
{ {
private final String name; 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; this.name = name;
} }