mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2025-02-18 05:30:29 +00:00
allow sectors to know their own address
This commit is contained in:
parent
bb38d3d68f
commit
06b4a4cfea
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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];
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user