diff options
| author | 2017-08-03 16:04:49 +0200 | |
|---|---|---|
| committer | 2017-08-03 16:05:08 +0200 | |
| commit | c10471e7ec768d42b4c0230da8d39aebce6b8c95 (patch) | |
| tree | a4c64aeddf5000713de686b3692ac7f0a455966a /src/lib | |
| parent | 8eb07ffe97cec831711b9bbd2c5bdc97a14a5b52 (diff) | |
jvc_dsk: Improve support for headerless OS-9 images
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/formats/jvc_dsk.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/lib/formats/jvc_dsk.cpp b/src/lib/formats/jvc_dsk.cpp index a07bece77bf..87695e54cdd 100644 --- a/src/lib/formats/jvc_dsk.cpp +++ b/src/lib/formats/jvc_dsk.cpp @@ -14,6 +14,7 @@ ***************************************************************************/ #include "emu.h" +#include "imageutl.h" #include "jvc_dsk.h" jvc_format::jvc_format() @@ -69,17 +70,35 @@ bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int case 1: sectors = header[0]; // no break case 0: tracks = (size - header_size) / sector_size / sectors / heads; + break; + } + + // os-9 format disk images often don't have a header, but can contain + // various geometries. we try to open the file as os-9 image here and + // see if the values we get make sense + if (header_size == 0 && size > 0x20) + { + uint8_t os9_header[0x20]; + io_generic_read(io, os9_header, 0, 0x20); + + int os9_total_sectors = pick_integer_be(os9_header, 0x00, 3); + int os9_heads = BIT(os9_header[0x10], 0) ? 2 : 1; + int os9_sectors = pick_integer_be(os9_header, 0x11, 2); + int os9_tracks = os9_total_sectors / os9_sectors / os9_heads; - // assume double sided when larger than 84 tracks without header - if (tracks > 84 && header_size == 0) + // now let's see if we have valid info + if ((os9_tracks * os9_heads * os9_sectors * 256) == size) { - tracks /= 2; - heads = 2; - } + tracks = os9_tracks; + heads = os9_heads; + sectors = os9_sectors; - break; + osd_printf_verbose("OS-9 format disk image detected.\n"); + } } + osd_printf_verbose("Floppy disk image geometry: %d tracks, %d head(s), %d sectors with %d bytes.\n", tracks, heads, sectors, sector_size); + return tracks * heads * sectors * sector_size == (size - header_size); } |
