summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/acorn_dsk.cpp
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2020-08-16 16:07:30 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2020-08-16 16:14:07 +0100
commitc2a670bda8b45c5b741cb9b403df8db69596e20d (patch)
treedfe14d913761f151089bbe7a6ca173a682defc77 /src/lib/formats/acorn_dsk.cpp
parentea75086da7877ac4e93c777434bf0d2dfe0a8657 (diff)
acorn_dsk: Added support for Kenda formatted SSD images.
Diffstat (limited to 'src/lib/formats/acorn_dsk.cpp')
-rw-r--r--src/lib/formats/acorn_dsk.cpp16
1 files changed, 14 insertions, 2 deletions
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" : "");
}