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;
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<DiskAddress> 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);

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}
/*

View File

@ -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<DiskAddress> 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<DiskAddress> diskAddressList)
{
this.buffer = buffer;
this.disk = disk;
this.diskAddressList = diskAddressList;
}
@Override

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}

View File

@ -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");

View File

@ -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];

View File

@ -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> diskAddress)
{
super (disk, buffer);
super (disk, buffer, diskAddress);
}
@Override

View File

@ -47,9 +47,10 @@ public class PascalDisk extends AbstractFormattedDisk
sectorTypesList.add (grafSector);
sectorTypesList.add (fotoSector);
// DiskAddress da = disk.getDiskAddress (0);
List<DiskAddress> 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);
}

View File

@ -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)

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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;
}