diff --git a/src/com/bytezone/diskbrowser/disk/AppleDisk.java b/src/com/bytezone/diskbrowser/disk/AppleDisk.java index 2a443bc..423c29a 100755 --- a/src/com/bytezone/diskbrowser/disk/AppleDisk.java +++ b/src/com/bytezone/diskbrowser/disk/AppleDisk.java @@ -15,9 +15,10 @@ import java.util.zip.Checksum; import com.bytezone.common.Utility; import com.bytezone.diskbrowser.applefile.AppleFileSource; -import com.bytezone.diskbrowser.nib.WozFile; import com.bytezone.diskbrowser.nib.NibFile; import com.bytezone.diskbrowser.nib.V2dFile; +import com.bytezone.diskbrowser.nib.WozFile; +import com.bytezone.diskbrowser.nib.WozFile.Sector; import com.bytezone.diskbrowser.nib.WozFileOld; import com.bytezone.diskbrowser.utilities.FileFormatException; import com.bytezone.diskbrowser.utilities.HexFormatter; @@ -77,6 +78,7 @@ public class AppleDisk implements Disk // DFB 06,04,02,15 ;12->06,13->04,14->02,15->15 private boolean[] hasData; + private boolean[] isMissing; private byte emptyByte = 0; private ActionListener actionListenerList; @@ -194,6 +196,7 @@ public class AppleDisk implements Disk diskBuffer = new byte[blocks * sectorSize]; hasData = new boolean[blocks]; + isMissing = new boolean[blocks]; if (debug) { @@ -229,6 +232,7 @@ public class AppleDisk implements Disk sectorSize = trackSize / sectors; blocks = tracks * sectors; hasData = new boolean[blocks]; + isMissing = new boolean[blocks]; checkSectorsForData (); } @@ -261,6 +265,7 @@ public class AppleDisk implements Disk blocks = tracks * sectors; hasData = new boolean[blocks]; + isMissing = new boolean[blocks]; checkSectorsForData (); } @@ -285,8 +290,12 @@ public class AppleDisk implements Disk blocks = tracks * sectors; hasData = new boolean[blocks]; + isMissing = new boolean[blocks]; checkSectorsForData (); + + for (Sector sector : wozFile.getBadSectors ()) + isMissing[sector.trackNo * sectors + sector.sectorNo] = true; } private byte[] getPrefix (File path) @@ -411,6 +420,24 @@ public class AppleDisk implements Disk return !hasData[getDiskAddress (track, sector).getBlock ()]; } + @Override + public boolean isSectorMissing (DiskAddress da) + { + return isMissing[da.getBlock ()]; + } + + @Override + public boolean isSectorMissing (int block) + { + return isMissing[block]; + } + + @Override + public boolean isSectorMissing (int track, int sector) + { + return isMissing[getDiskAddress (track, sector).getBlock ()]; + } + @Override public File getFile () { @@ -495,9 +522,6 @@ public class AppleDisk implements Disk @Override public DiskAddress getDiskAddress (int track, int sector) { - // track &= 0x3F; - // sector &= 0x1F; - if (!isValidAddress (track, sector)) { System.out.println ("Invalid block : " + track + "/" + sector); diff --git a/src/com/bytezone/diskbrowser/disk/AppleDiskAddress.java b/src/com/bytezone/diskbrowser/disk/AppleDiskAddress.java index 4c42dcf..91ff5a6 100755 --- a/src/com/bytezone/diskbrowser/disk/AppleDiskAddress.java +++ b/src/com/bytezone/diskbrowser/disk/AppleDiskAddress.java @@ -6,6 +6,7 @@ public class AppleDiskAddress implements DiskAddress private final int track; private final int sector; public final Disk owner; + private boolean zeroFlag; public AppleDiskAddress (Disk owner, int block) @@ -42,8 +43,6 @@ public class AppleDiskAddress implements DiskAddress { if (that == null) return false; - // if (zeroFlag != ((AppleDiskAddress) that).zeroFlag) - // return false; return this.block == that.getBlock (); } diff --git a/src/com/bytezone/diskbrowser/disk/Disk.java b/src/com/bytezone/diskbrowser/disk/Disk.java index e67516d..c65243d 100755 --- a/src/com/bytezone/diskbrowser/disk/Disk.java +++ b/src/com/bytezone/diskbrowser/disk/Disk.java @@ -48,6 +48,12 @@ public interface Disk extends Iterable public boolean isSectorEmpty (DiskAddress da); + public boolean isSectorMissing (int block); + + public boolean isSectorMissing (int track, int sector); + + public boolean isSectorMissing (DiskAddress da); + public boolean isValidAddress (int block); public boolean isValidAddress (int track, int sector); diff --git a/src/com/bytezone/diskbrowser/disk/DiskFactory.java b/src/com/bytezone/diskbrowser/disk/DiskFactory.java index aa8119a..cca35e8 100755 --- a/src/com/bytezone/diskbrowser/disk/DiskFactory.java +++ b/src/com/bytezone/diskbrowser/disk/DiskFactory.java @@ -235,20 +235,20 @@ public class DiskFactory try { // WozFileOld wozDisk = new WozFileOld (file); - WozFile wozDisk = new WozFile (file); - if (wozDisk.getSectorsPerTrack () == 13) + WozFile wozFile = new WozFile (file); + if (wozFile.getSectorsPerTrack () == 13) { - AppleDisk appleDisk = new AppleDisk (wozDisk, 35, 13); + AppleDisk appleDisk = new AppleDisk (wozFile, 35, 13); disk = checkDos (appleDisk); return disk == null ? new DataDisk (appleDisk) : disk; } - if (wozDisk.getSectorsPerTrack () == 16) + if (wozFile.getSectorsPerTrack () == 16) { - AppleDisk appleDisk256 = new AppleDisk (wozDisk, 35, 16); + AppleDisk appleDisk256 = new AppleDisk (wozFile, 35, 16); disk = checkDos (appleDisk256); if (disk == null) - disk = checkProdos (new AppleDisk (wozDisk, 35, 8)); + disk = checkProdos (new AppleDisk (wozFile, 35, 8)); if (disk == null) disk = new DataDisk (appleDisk256); } @@ -708,4 +708,9 @@ public class DiskFactory return null; } + + private static void checkMissingSectors (AppleDisk disk, WozFile wozFile) + { + + } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/gui/DiskLayoutImage.java b/src/com/bytezone/diskbrowser/gui/DiskLayoutImage.java index 1f14098..75a95b0 100644 --- a/src/com/bytezone/diskbrowser/gui/DiskLayoutImage.java +++ b/src/com/bytezone/diskbrowser/gui/DiskLayoutImage.java @@ -24,6 +24,8 @@ class DiskLayoutImage extends DiskPanel implements Scrollable, RedoListener private static final Cursor crosshairCursor = new Cursor (Cursor.CROSSHAIR_CURSOR); private static final Color[] lightColors = { Color.WHITE, Color.YELLOW, Color.PINK, Color.CYAN, Color.ORANGE, Color.GREEN }; + private static Stroke missingStroke = + new BasicStroke ((float) 3.0, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); private boolean showFreeSectors; private final DiskLayoutSelection selectionHandler = new DiskLayoutSelection (); @@ -124,14 +126,15 @@ class DiskLayoutImage extends DiskPanel implements Scrollable, RedoListener DiskAddress da = d.getDiskAddress (blockNo); boolean free = showFreeSectors && formattedDisk.isSectorFree (da); boolean selected = selectionHandler.isSelected (da); - drawBlock ((Graphics2D) g, type, x, y, free, selected); + boolean missing = d.isSectorMissing (da); + drawBlock ((Graphics2D) g, type, x, y, free, selected, missing); } } } } private void drawBlock (Graphics2D g, SectorType type, int x, int y, boolean flagFree, - boolean selected) + boolean selected, boolean missing) { g.setColor (type.colour); g.fillRect (x + 1, y + 1, blockWidth - 1, blockHeight - 1); @@ -146,6 +149,14 @@ class DiskLayoutImage extends DiskPanel implements Scrollable, RedoListener if (selected) g.fillOval (x + centerOffset, y + 6, 3, 3); } + + if (missing) + { + g.setColor (Color.black); + g.setStroke (missingStroke); + g.drawLine (x + 5, y + 5, x + 11, y + 11); + g.drawLine (x + 5, y + 11, x + 11, y + 5); + } } private Color getContrastColor (SectorType type) @@ -159,7 +170,7 @@ class DiskLayoutImage extends DiskPanel implements Scrollable, RedoListener @Override public Dimension getPreferredScrollableViewportSize () { - return new Dimension (240 + 1, 525 + 1); // floppy disk size + return new Dimension (240 + 1, 525 + 1); // floppy disk size } @Override diff --git a/src/com/bytezone/diskbrowser/nib/WozFile.java b/src/com/bytezone/diskbrowser/nib/WozFile.java index fdf646b..fe95a53 100644 --- a/src/com/bytezone/diskbrowser/nib/WozFile.java +++ b/src/com/bytezone/diskbrowser/nib/WozFile.java @@ -39,6 +39,7 @@ public class WozFile private final byte[] diskBuffer; private final boolean debug = false; + List badSectors = new ArrayList<> (); // ---------------------------------------------------------------------------------// public WozFile (File file) throws DiskNibbleException @@ -117,6 +118,13 @@ public class WozFile return diskSectors; } + // ---------------------------------------------------------------------------------// + public List getBadSectors () + // ---------------------------------------------------------------------------------// + { + return badSectors; + } + // ---------------------------------------------------------------------------------// private void info (byte[] buffer, int ptr) // ---------------------------------------------------------------------------------// @@ -310,7 +318,7 @@ public class WozFile { int trackNo; int startingBlock; - int blockCount; + int blockCount; // WOZ2 - not needed int bitCount; int bytesUsed; // WOZ1 - not needed @@ -379,6 +387,9 @@ public class WozFile if (sectors.size () > 0) checkDuplicates (sector); sectors.add (sector); + + if (sector.dataOffset < 0) + badSectors.add (sector); } } @@ -503,11 +514,11 @@ public class WozFile } // ---------------------------------------------------------------------------------// - class Sector + public class Sector // ---------------------------------------------------------------------------------// { Track track; - int trackNo, sectorNo, volume, checksum; + public final int trackNo, sectorNo, volume, checksum; int addressOffset, dataOffset; // ---------------------------------------------------------------------------------// @@ -521,6 +532,9 @@ public class WozFile sectorNo = decode4and4 (track.newBuffer, addressOffset + 7); checksum = decode4and4 (track.newBuffer, addressOffset + 9); + // int epiloguePtr = track.findNext (epilogue, addressOffset + 11); + // assert epiloguePtr == addressOffset + 11; + this.addressOffset = addressOffset; dataOffset = track.findNext (dataPrologue, addressOffset + 11); if (dataOffset > addressOffset + 200)