summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2017-08-03 16:04:49 +0200
committer Dirk Best <mail@dirk-best.de>2017-08-03 16:05:08 +0200
commitc10471e7ec768d42b4c0230da8d39aebce6b8c95 (patch)
treea4c64aeddf5000713de686b3692ac7f0a455966a /src/lib
parent8eb07ffe97cec831711b9bbd2c5bdc97a14a5b52 (diff)
jvc_dsk: Improve support for headerless OS-9 images
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/jvc_dsk.cpp31
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);
}