summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-08-10 15:22:40 +0200
committer Olivier Galibert <galibert@pobox.com>2022-08-10 15:22:47 +0200
commitd0747f5009f923df73197d202ca513e97597836d (patch)
treeba8b8005f016ce1c54f0430979f56a0303be9968 /src/lib
parentf93bf1c5f3a1ad1b6fd97705cdcfd678d068bb23 (diff)
woz: handle FLUX tracks, even when somewhat broken
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/ap2_dsk.cpp36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp
index dbeed0d6f36..1c128f3d26e 100644
--- a/src/lib/formats/ap2_dsk.cpp
+++ b/src/lib/formats/ap2_dsk.cpp
@@ -1692,11 +1692,17 @@ bool a2_woz_format::load(util::random_read &io, uint32_t form_factor, const std:
return false;
uint32_t info_vers = r8(img, off_info + 0);
-
- if((info_vers != 1) && (info_vers != 2))
+ if(info_vers < 1 || info_vers > 3)
return false;
+ uint16_t off_flux = info_vers < 3 ? 0 : r16(img, off_info + 46);
+ uint16_t flux_size = info_vers < 3 ? 0 : r16(img, off_info + 48);
+
+ if(!flux_size)
+ off_flux = 0;
+
bool is_35 = r8(img, off_info + 1) == 2;
+
if((form_factor == floppy_image::FF_35 && !is_35) || (form_factor == floppy_image::FF_525 && is_35))
return false;
@@ -1708,7 +1714,6 @@ bool a2_woz_format::load(util::random_read &io, uint32_t form_factor, const std:
image->set_form_variant(floppy_image::FF_525, floppy_image::SSSD);
if (woz_vers == 1) {
-
for (unsigned int trkid = 0; trkid != limit; trkid++) {
int head = is_35 && trkid >= 80 ? 1 : 0;
int track = is_35 ? trkid % 80 : trkid / 4;
@@ -1731,7 +1736,30 @@ bool a2_woz_format::load(util::random_read &io, uint32_t form_factor, const std:
int subtrack = is_35 ? 0 : trkid & 3;
uint8_t idx = r8(img, off_tmap + trkid);
- if(idx != 0xff) {
+ uint8_t fidx = off_flux ? r8(img, off_flux*512 + 8 + trkid) : 0xff;
+
+ if(fidx != 0xff) {
+ uint32_t trks_off = off_trks + (fidx * 8);
+ uint32_t boff = (uint32_t)r16(img, trks_off + 0) * 512;
+ uint32_t track_size = r32(img, trks_off + 4);
+
+ uint32_t total_ticks = 0;
+ for(uint32_t i=0; i != track_size; i++)
+ total_ticks += img[boff+i];
+
+ // Assumptions: track starts at index, there's no flux
+ // change at index, there's no flux change at the end
+
+ std::vector<uint32_t> &buf = image->get_buffer(track, head, subtrack);
+ uint32_t cpos = 0;
+ for(uint32_t i=0; i != track_size; i++) {
+ uint8_t step = img[boff+i];
+ cpos += step;
+ if(step != 0xff && i != track_size-1)
+ buf.push_back(uint64_t(cpos)*200000000/total_ticks);
+ }
+
+ } else if(idx != 0xff) {
uint32_t trks_off = off_trks + (idx * 8);
uint32_t boff = (uint32_t)r16(img, trks_off + 0) * 512;