diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp index c597ee74995..64091ed887b 100644 --- a/src/lib/formats/acorn_dsk.cpp +++ b/src/lib/formats/acorn_dsk.cpp @@ -50,6 +50,18 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor) if (memcmp(cat, "\x00\x28\x43\x29\x4a\x47\x48\x00", 4) == 0 && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) return i; + // test for Kenda SD - offset &0962 = 0 SD/1 DD, offset &0963 = disk size blocks / 4 (block size = 1K, ie. 0x400 bytes), reserved tracks = 3, ie. 0x1e00 bytes, soft stagger = 2 sectors, ie. 0x200 bytes + io_generic_read(io, cat, 0x0960, 8); + if (cat[2] == 0 && ((uint64_t)cat[3] * 4 * 0x400 + 0x2000) == size && size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) + { + // valid blocks for single sided + if (f.head_count == 1 && (cat[3] == 0x17 || cat[3] == 0x30)) + return i; + // valid blocks for double sided + if (f.head_count == 2 && (cat[3] == 0x2f || cat[3] == 0x62)) + return i; + } + // read sector count from side 0 catalogue io_generic_read(io, cat, 0x100, 8); sectors0 = ((cat[6] & 3) << 8) + cat[7]; @@ -59,7 +71,7 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor) if (f.head_count == 2) { // read sector count from side 2 catalogue - io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x100, 8); // sequential + io_generic_read(io, cat, (uint64_t)compute_track_size(f) * f.track_count + 0x100, 8); // sequential sectors2 = ((cat[6] & 3) << 8) + cat[7]; // exception case for Acorn CP/M System Disc 1 @@ -282,7 +294,7 @@ int opus_ddos_format::find_size(io_generic *io, uint32_t form_factor) if (f.head_count == 2) { // read sector count from side 2 catalogue - io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x1000, 8); // sequential + io_generic_read(io, cat, (uint64_t)compute_track_size(f) * f.track_count + 0x1000, 8); // sequential sectors2 = (cat[1] << 8) + cat[2]; LOG_FORMATS("ddos: sector count 2: %d %s\n", sectors2, sectors2 % 18 != 0 ? "invalid" : ""); }