acorn_dsk: Added support for Kenda formatted SSD images.

This commit is contained in:
Nigel Barnes 2020-08-16 16:07:30 +01:00
parent ea75086da7
commit c2a670bda8

View File

@ -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" : "");
}