From 79bbaf6a3df09eef401cd58621bd47a49f199604 Mon Sep 17 00:00:00 2001 From: Rob Greene Date: Sat, 26 Jul 2025 11:15:59 -0500 Subject: [PATCH] Some prep work for 3.5" disks to support T/S reads. --- .../storage/physical/ProdosOrder.java | 4 ++-- .../applecommander/storage/physical/WozOrder.java | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/ProdosOrder.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/ProdosOrder.java index 78f4a0fa..ce1b203a 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/ProdosOrder.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/ProdosOrder.java @@ -33,14 +33,14 @@ public class ProdosOrder extends ImageOrder { /** * This table contains the block offset for a particular DOS sector. */ - private static final int[] blockInterleave = { + public static final int[] blockInterleave = { 0, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 7 }; /** * Defines the location within a block in which the DOS sector resides. * (0 = 0-255 and 1 = 256-511.) */ - private static final int[] blockOffsets = { + public static final int[] blockOffsets = { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1 }; diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/WozOrder.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/WozOrder.java index 37337ced..506182f1 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/WozOrder.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/physical/WozOrder.java @@ -16,6 +16,9 @@ import java.util.function.Consumer; import java.util.function.Function; import static com.webcodepro.applecommander.storage.physical.NibbleCodec.readSectorFromTrack; +import static com.webcodepro.applecommander.storage.physical.NibbleCodec.readSectorFromTrack35; +import static com.webcodepro.applecommander.storage.physical.ProdosOrder.blockInterleave; +import static com.webcodepro.applecommander.storage.physical.ProdosOrder.blockOffsets; public class WozOrder extends ImageOrder { // The magic bytes are read in little-endian order, so they do appear reversed here. @@ -131,7 +134,7 @@ public class WozOrder extends ImageOrder { public byte[] readBlock35(int block) { DosSectorAddress addr = blockToSector35(block); byte[] trackData = readTrackData(addr.track); - return readSectorFromTrack(trackData, addr.track, addr.sector, getSectorsPerTrack()); + return readSectorFromTrack35(trackData, addr.track, addr.sector, getSectorsPerTrack()); } public DosSectorAddress blockToSector35(int block) { @@ -187,7 +190,13 @@ public class WozOrder extends ImageOrder { } public byte[] readSector35(int track, int sector) throws IllegalArgumentException { - throw new RuntimeException("WOZ 3.5\" Disk Image does not support reading DOS track and sectors at this time"); + int block = track * 8 + blockInterleave[sector]; + byte[] blockData = readBlock(block); + int offset = blockOffsets[sector]; + byte[] sectorData = new byte[Disk.SECTOR_SIZE]; + System.arraycopy(blockData, offset * Disk.SECTOR_SIZE, + sectorData, 0, Disk.SECTOR_SIZE); + return sectorData; } @Override