apple2: Support the new version 2 .WOZ images [R. Belmont]

This commit is contained in:
arbee 2018-12-23 21:07:50 -05:00 committed by Vas Crabb
parent c36b648d96
commit 3081bc6a26
2 changed files with 47 additions and 13 deletions

View File

@ -1672,12 +1672,15 @@ bool a2_woz_format::supports_save() const
}
const uint8_t a2_woz_format::signature[8] = { 0x57, 0x4f, 0x5a, 0x31, 0xff, 0x0a, 0x0d, 0x0a };
const uint8_t a2_woz_format::signature2[8] = { 0x57, 0x4f, 0x5a, 0x32, 0xff, 0x0a, 0x0d, 0x0a };
int a2_woz_format::identify(io_generic *io, uint32_t form_factor)
{
uint8_t header[8];
io_generic_read(io, header, 0, 8);
return !memcmp(header, signature, 8) ? 100 : 0;
if (!memcmp(header, signature, 8)) return 100;
if (!memcmp(header, signature2, 8)) return 100;
return 0;
}
bool a2_woz_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
@ -1686,9 +1689,12 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, floppy_image *ima
io_generic_read(io, &img[0], 0, img.size());
// Check signature
if(memcmp(&img[0], signature, 8))
if ((memcmp(&img[0], signature, 8)) && (memcmp(&img[0], signature2, 8)))
return false;
uint32_t woz_vers = 1;
if (!memcmp(&img[0], signature2, 8)) woz_vers = 2;
// Check integrity
uint32_t crc = crc32r(&img[12], img.size() - 12);
if(crc != r32(img, 8))
@ -1697,10 +1703,14 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, floppy_image *ima
uint32_t off_info = find_tag(img, 0x4f464e49);
uint32_t off_tmap = find_tag(img, 0x50414d54);
uint32_t off_trks = find_tag(img, 0x534b5254);
// uint32_t off_writ = find_tag(img, 0x54495257);
if(!off_info || !off_tmap || !off_trks)
return false;
if(r8(img, off_info + 0) != 1)
uint32_t info_vers = r8(img, off_info + 0);
if ((info_vers != 1) && (info_vers != 2))
return false;
bool is_35 = r8(img, off_info + 1) == 2;
@ -1708,19 +1718,42 @@ bool a2_woz_format::load(io_generic *io, uint32_t form_factor, floppy_image *ima
return false;
unsigned int limit = is_35 ? 160 : 141;
for(unsigned int trkid = 0; trkid != limit; trkid++) {
int head = is_35 && trkid >= 80 ? 1 : 0;
int track = is_35 ? trkid % 80 : trkid / 4;
int subtrack = is_35 ? 0 : trkid & 3;
uint8_t idx = r8(img, off_tmap + trkid);
if(idx != 0xff) {
uint32_t boff = off_trks + 6656*idx;
if (r16(img, boff + 6648) == 0)
return false;
generate_track_from_bitstream(track, head, &img[boff], r16(img, boff + 6648), image, subtrack, r16(img, boff + 6650));
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;
int subtrack = is_35 ? 0 : trkid & 3;
uint8_t idx = r8(img, off_tmap + trkid);
if(idx != 0xff) {
uint32_t boff = off_trks + 6656*idx;
if (r16(img, boff + 6648) == 0)
return false;
generate_track_from_bitstream(track, head, &img[boff], r16(img, boff + 6648), image, subtrack, r16(img, boff + 6650));
}
}
} else if (woz_vers == 2) {
for (unsigned int trkid = 0; trkid != limit; trkid++) {
int head = is_35 && trkid >= 80 ? 1 : 0;
int track = is_35 ? trkid % 80 : trkid / 4;
int subtrack = is_35 ? 0 : trkid & 3;
uint8_t idx = r8(img, off_tmap + trkid);
if(idx != 0xff) {
uint32_t trks_off = off_trks + (idx * 8);
uint32_t boff = (uint32_t)r16(img, trks_off + 0) * 512;
if (r16(img, trks_off + 4) == 0)
return false;
// TODO: when write capability is added, use the WRIT chunk data if it's present
generate_track_from_bitstream(track, head, &img[boff], r16(img, trks_off + 4), image, subtrack, 0xffff);
}
}
}
else return false;
return true;
}

View File

@ -117,6 +117,7 @@ public:
private:
static const uint8_t signature[8];
static const uint8_t signature2[8];
static uint32_t r32(const std::vector<uint8_t> &data, uint32_t offset);
static uint16_t r16(const std::vector<uint8_t> &data, uint32_t offset);