summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/os9_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/os9_dsk.cpp')
-rw-r--r--src/lib/formats/os9_dsk.cpp500
1 files changed, 479 insertions, 21 deletions
diff --git a/src/lib/formats/os9_dsk.cpp b/src/lib/formats/os9_dsk.cpp
index dd874f7d236..228f3069dde 100644
--- a/src/lib/formats/os9_dsk.cpp
+++ b/src/lib/formats/os9_dsk.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:tim lindner
+// copyright-holders:tim lindner, 68bit
/*********************************************************************
formats/os9_dsk.c
@@ -12,6 +12,36 @@
Available: http://www.colorcomputerarchive.com/coco/Documents/Manuals/
Operating Systems/OS-9 Level 2 Manual (Tandy).pdf
+ Some OS9 floppy drivers use a base sector ID of zero, for example SWTPC
+ and Gimix OS9, and some drivers use a base sector ID of one, for example
+ COCO OS9. The disk images do not encode the sector IDs so it is a
+ challenge to detect this base ID by looking at the disk content.
+
+ The OS9 disk header, at LSN0, does not necessarily encode the base sector
+ ID either. However it may optionally include a block of the device
+ descriptor information from when it was formatted and although this
+ optional content can vary across OS9 variants it appears to be regular
+ enough for COCO compatible formats to reply on it to identify a COCO
+ compatible disk and determine the base sector ID for these. All non-COCO
+ formats are assumed to have a base sector ID of zero and not exceptions to
+ this have been noted.
+
+ Commonly the 'coco' bit, bit 5, in the optional 'type' byte is set in COCO
+ format disks. Alternatively some OS9 formats set bit 7 of the optional
+ 'density' byte to indicate a COCO format disk, for example some Gimix
+ drivers with COCO support. Some of the other optional information also can
+ be checked for consistency to better identify the format.
+
+ Some formats encode the first track, on the first head only, in single
+ density even when the remainder of the disk is encoded in double density,
+ and this can typically be identified from the disk geometry and the image
+ size and the total number of logical sectors written in the header.
+ E.g. At least some versions of OS9 for the SWTPC and the Gimix encode this
+ first track in single density whereas COCO format disks are typically all
+ double density. The number of sectors on track zero is also typically
+ encoded in the optional header information and can be checked for
+ consistency.
+
*********************************************************************/
#include "emu.h"
@@ -19,7 +49,6 @@
#include "formats/imageutl.h"
-
os9_format::os9_format() : wd177x_format(formats)
{
}
@@ -52,58 +81,487 @@ int os9_format::find_size(io_generic *io, uint32_t form_factor)
{
uint64_t size = io_generic_size(io);
- uint8_t os9_header[0x20];
- io_generic_read(io, os9_header, 0, 0x20);
+ uint8_t os9_header[0x60];
+ io_generic_read(io, os9_header, 0, sizeof(os9_header));
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);
- if (os9_total_sectors > 0 && os9_heads > 0 && os9_sectors > 0) {
- int os9_tracks = os9_total_sectors / os9_sectors / os9_heads;
+ if (os9_total_sectors <= 0 || os9_heads <= 0 || os9_sectors <= 0)
+ return -1;
+
+ // The optional header information, which may contain a copy of the
+ // device descriptor used to format the disk. COCO format disks are
+ // expected to include this optional information.
+ int opt_dtype = os9_header[0x3f + 0];
+ int opt_type = os9_header[0x3f + 3];
+ int opt_density = os9_header[0x3f + 4];
+ int opt_cylinders = pick_integer_be(os9_header, 0x3f + 5, 2);
+ int opt_sides = os9_header[0x3f + 7];
+ int opt_sectors_per_track = pick_integer_be(os9_header, 0x3f + 9, 2);
+ int opt_track0_sectors = pick_integer_be(os9_header, 0x3f + 11, 2);
+ int opt_interleave = os9_header[0x3f + 13];
+
+ int opt_mfm = BIT(opt_density, 0);
+
+ // The NitrOS9 rb1773 driver uses bit 1 of opt_type to distinguish
+ // between a sector base ID of zero or one, so recognise that here.
+ int opt_sector_base_id = BIT(opt_type, 1) ? 0 : 1;
+ int opt_sector_size = BIT(opt_type, 2) ? 512 : 256;
+ int opt_coco = BIT(opt_type, 5);
+
+ // Some OS9 versions appear to use bit 7 of the opt_density rather
+ // than bit 5 of opt_type to signify a COCO format disk. E.g. Gimix
+ // OS9 is documented to use this bit and had a floppy driver that
+ // could read both non-COCO and COCO format disks.
+ if (BIT(opt_density, 7))
+ opt_coco = 1;
+
+ // COCO format disks are expected for have an opt_dtype of 1.
+ if (opt_dtype != 1)
+ opt_coco = 0;
- // now let's see if we have valid info
- if ((os9_tracks * os9_heads * os9_sectors * 256) == size) {
- for (int i=0; formats[i].form_factor; i++) {
- const format &f = formats[i];
+ for (int i=0; formats[i].form_factor; i++) {
+ const format &f = formats[i];
+ if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
+ continue;
- if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
- continue;
+ if ((os9_heads != f.head_count) || (os9_sectors != f.sector_count)) {
+ continue;
+ }
- if ((os9_tracks == f.track_count) && (os9_heads == f.head_count) && (os9_sectors == f.sector_count))
- return i;
+ unsigned int format_size = 0;
+ for (int track=0; track < f.track_count; track++) {
+ for (int head=0; head < f.head_count; head++) {
+ const format &tf = get_track_format(f, head, track);
+ format_size += compute_track_size(tf);
}
}
- }
+ if (format_size != size)
+ continue;
+
+ if (format_size < os9_total_sectors * 256)
+ continue;
+
+ // Accept the format if the total number of sectors used is
+ // consistent with at least 10 sectors being used on track
+ // zero, as happens when the driver or descriptor is coded for
+ // a single density track zero with 10 sectors and so uses
+ // only 10 of these track zero sectors.
+
+ if (f.sector_count < 10 || format_size > (os9_total_sectors + f.sector_count - 10) * 256)
+ continue;
+
+ const format &tf = get_track_format(f, 0, 0);
+
+ if (opt_coco) {
+ // Looks like a COCO format disk.
+
+ // Check the sector base ID.
+ if (f.sector_base_id != opt_sector_base_id &&
+ (f.sector_base_id != -1 || f.per_sector_id[0] != opt_sector_base_id))
+ continue;
+ if (tf.sector_base_id != opt_sector_base_id &&
+ (tf.sector_base_id != -1 || tf.per_sector_id[0] != opt_sector_base_id))
+ continue;
+
+ // Check some other optional fields for consistency.
+
+ // If the device descriptor is not MFM capable then
+ // the disk it not expected to be MFM encoded.
+ if (opt_mfm == 0 && f.encoding == floppy_image::MFM)
+ continue;
+
+ // Should not be more cylinders than suppored in the
+ // device descriptor.
+ if (f.track_count > opt_cylinders)
+ continue;
+
+ // Should not be more heads than suppored in the
+ // device descriptor.
+ if (f.head_count > opt_sides)
+ continue;
+
+ // Should not be more sectors per track than supported
+ // in the device descriptor.
+ if (f.sector_count > opt_sectors_per_track ||
+ tf.sector_count > opt_track0_sectors) {
+ continue;
+ }
+
+ // The sector size should be consistent.
+ if (opt_sector_size != f.sector_base_size)
+ continue;
+
+ // The sector interleave should not be greater than
+ // the number of sectors.
+ if (opt_interleave > f.sector_count)
+ continue;
+ }
+ else
+ {
+ // Not a recognizable COCO OS9 format. The options
+ // can not be relied on here, they are driver
+ // dependent, and the sector base ID is assumed to be
+ // zero. Check that format sector base ID is zero.
+ if (f.sector_base_id != 0 && (f.sector_base_id != -1 || f.per_sector_id[0] != 0))
+ continue;
+ if (tf.sector_base_id != 0 && (tf.sector_base_id != -1 || tf.per_sector_id[0] != 0))
+ continue;
+ }
+
+ LOG_FORMATS("OS9 matching format index %d\n", i);
+ return i;
+ }
return -1;
}
+const wd177x_format::format &os9_format::get_track_format(const format &f, int head, int track)
+{
+ int n = -1;
+
+ for (int i = 0; formats[i].form_factor; i++) {
+ if (&formats[i] == &f) {
+ n = i;
+ break;
+ }
+ }
+
+ if (n < 0) {
+ LOG_FORMATS("Error format not found\n");
+ return f;
+ }
+
+ if (head >= f.head_count) {
+ LOG_FORMATS("Error invalid head %d\n", head);
+ return f;
+ }
+
+ if (track >= f.track_count) {
+ LOG_FORMATS("Error invalid track %d\n", track);
+ return f;
+ }
+
+ if (track == 0 && head == 0) {
+ const format &t0 = formats_track0[n];
+ if (t0.form_factor)
+ return t0;
+ }
+
+ return f;
+}
+
const os9_format::format os9_format::formats[] = {
- { // 5"25 160K double density
+ // COCO formats, with a sector base ID of one.
+
+ { // 0 157.5K 5"25 double density
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 18, 35, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
- { // 5"25 160K double density
+ { // 1 315K 5"25 double density
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 18, 35, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
- { // 5"25 160K double density
+ { // 2 180K 5"25 double density
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 18, 40, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
- { // 5"25 160K double density
+ { // 3 360K 5"25 double density
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 18, 40, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
- { // 5"25 160K double density
+ { // 4 360K 5"25 double density
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 18, 80, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
- { // 5"25 160K double density
+ { // 5 720K 5"25 double density
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 18, 80, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
},
+
+ // Non-COCO formats, with a sector base ID of zero.
+
+ { // 6 87.5K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 7 100K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 8 200K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 80, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 9 175K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
+ 4000, 10, 35, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 10 200K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
+ 4000, 10, 40, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 11 400K 5 1/4 inch single density
+ floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
+ 4000, 10, 80, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 12 138.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 35, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 13 140K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 35, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 14 278.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 35, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 15 280K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 35, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 16 158.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 17 160K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 18 318.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 19 320K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 40, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 20 318.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 80, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 21 320K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 80, 1, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 22 638.5 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 80, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 23 640K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 80, 2, 256, {}, -1, {0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13}, 18, 28, 20
+ },
+ { // 24 155.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
+ 2000, 18, 35, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 25 157.5K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
+ 2000, 18, 35, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 26 311K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 18, 35, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 27 315K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 18, 35, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 28 178K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
+ 2000, 18, 40, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 29 180K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
+ 2000, 18, 40, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 30 356K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 18, 40, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 31 360K 5 1/4 inch double density
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 18, 40, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 32 358K 5 1/4 inch quad density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSQD, floppy_image::MFM,
+ 2000, 18, 80, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 33 360K 5 1/4 inch quad density
+ floppy_image::FF_525, floppy_image::SSQD, floppy_image::MFM,
+ 2000, 18, 80, 1, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 34 716K 5 1/4 inch quad density (single density track 0)
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 18, 80, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 35 720K 5 1/4 inch quad density
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 18, 80, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 80, 22, 24
+ },
+ { // 36 288.75K 8 inch single density
+ floppy_image::FF_8, floppy_image::SSSD, floppy_image::FM,
+ 2000, 15, 77, 1, 256, {}, -1, {0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13}, 40, 12, 12
+ },
+ { // 37 577.5K 8 inch single density
+ floppy_image::FF_8, floppy_image::DSSD, floppy_image::FM,
+ 2000, 15, 77, 2, 256, {}, -1, {0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13}, 40, 12, 12
+ },
+ { // 38 497.75K 8 inch double density (single density track 0)
+ floppy_image::FF_8, floppy_image::SSDD, floppy_image::MFM,
+ 1000, 26, 77, 1, 256, {}, -1, {0, 19, 12, 5, 24, 17, 10, 3, 22, 15, 8, 1, 20, 13, 6, 25, 18, 11, 4, 23, 16, 9, 2, 21, 14, 7}, 80, 22, 24
+ },
+ { // 39 500.5K 8 inch double density
+ floppy_image::FF_8, floppy_image::SSDD, floppy_image::MFM,
+ 1000, 26, 77, 1, 256, {}, -1, {0, 19, 12, 5, 24, 17, 10, 3, 22, 15, 8, 1, 20, 13, 6, 25, 18, 11, 4, 23, 16, 9, 2, 21, 14, 7}, 80, 22, 24
+ },
+ { // 40 995.5K 8 inch double density (single density track 0)
+ floppy_image::FF_8, floppy_image::DSDD, floppy_image::MFM,
+ 1000, 26, 77, 2, 256, {}, -1, {0, 19, 12, 5, 24, 17, 10, 3, 22, 15, 8, 1, 20, 13, 6, 25, 18, 11, 4, 23, 16, 9, 2, 21, 14, 7}, 80, 22, 24
+ },
+ { // 41 1001K 8 inch double density
+ floppy_image::FF_8, floppy_image::DSDD, floppy_image::MFM,
+ 1000, 26, 77, 2, 256, {}, -1, {0, 19, 12, 5, 24, 17, 10, 3, 22, 15, 8, 1, 20, 13, 6, 25, 18, 11, 4, 23, 16, 9, 2, 21, 14, 7}, 80, 22, 24
+ },
+ { // 42 1440K 3 1/2 inch high density (single density track 0)
+ floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM,
+ 1000, 36, 80, 2, 256, {}, -1, {0, 25, 14, 3, 28, 17, 6, 31, 20, 9, 34, 23, 12, 1, 26, 15, 4, 29, 18, 7, 32, 21, 10, 35, 24, 13, 2, 27, 16, 5, 30, 19, 8, 33, 22, 11}, 80, 22, 24
+ },
+ { // 43 1440K 3 1/2 inch high density.
+ floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM,
+ 1000, 36, 80, 2, 256, {}, -1, {0, 25, 14, 3, 28, 17, 6, 31, 20, 9, 34, 23, 12, 1, 26, 15, 4, 29, 18, 7, 32, 21, 10, 35, 24, 13, 2, 27, 16, 5, 30, 19, 8, 33, 22, 11}, 80, 22, 24
+ },
+ {}
+};
+
+const os9_format::format os9_format::formats_track0[] = {
+ // COCO formats, with a sector base ID of one.
+
+ { // 0 157.5K 5"25 double density
+ },
+ { // 1 315K 5"25 double density
+ },
+ { // 2 180K 5"25 double density
+ },
+ { // 3 360K 5"25 double density
+ },
+ { // 4 360K 5"25 double density
+ },
+ { // 5 720K 5"25 double density
+ },
+
+ // Non-COCO formats, with a sector base ID of zero.
+
+ { // 6 87.5K 5 1/4 inch single density
+ },
+ { // 7 100K 5 1/4 inch single density
+ },
+ { // 8 200K 5 1/4 inch single density
+ },
+ { // 9 175K 5 1/4 inch single density
+ },
+ { // 10 200K 5 1/4 inch single density
+ },
+ { // 11 400K 5 1/4 inch single density
+ },
+ { // 12 138.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 13 140K 5 1/4 inch double density
+ },
+ { // 14 278.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 15 280K 5 1/4 inch double density
+ },
+ { // 16 158.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 17 160K 5 1/4 inch double density
+ },
+ { // 18 318.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 19 320K 5 1/4 inch double density
+ },
+ { // 20 318.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 80, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 21 320K 5 1/4 inch double density
+ },
+ { // 22 638.5 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 80, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 23 640K 5 1/4 inch double density
+ },
+ { // 24 155.5K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 25 157.5K 5 1/4 inch double density
+ },
+ { // 26 311K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 35, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 27 315K 5 1/4 inch double density
+ },
+ { // 28 178K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 29 180K 5 1/4 inch double density
+ },
+ { // 30 356K 5 1/4 inch double density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 31 360K 5 1/4 inch double density
+ },
+ { // 32 358K 5 1/4 inch quad density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 80, 1, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 33 360K 5 1/4 inch quad density
+ },
+ { // 34 716K 5 1/4 inch quad density (single density track 0)
+ floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 80, 2, 256, {}, -1, {0, 3, 6, 9, 2, 5, 8, 1, 4, 7}, 40, 16, 11
+ },
+ { // 35 720K 5 1/4 inch quad density
+ },
+ { // 36 288.75K 8 inch single density
+ },
+ { // 37 577.5K 8 inch single density
+ },
+ { // 38 497.75K 8 inch double density (single density track 0)
+ floppy_image::FF_8, floppy_image::DSSD, floppy_image::FM,
+ 2000, 15, 77, 1, 256, {}, -1, {0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13}, 40, 12, 12
+ },
+ { // 39 500.5K 8 inch double density
+ },
+ { // 40 995.5K 8 inch double density (single density track 0)
+ floppy_image::FF_8, floppy_image::DSSD, floppy_image::FM,
+ 2000, 15, 77, 2, 256, {}, -1, {0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13}, 40, 12, 12
+ },
+ { // 41 1001K 8 inch double density
+ },
+ { // 42 1440K 3 1/2 inch high density (single density track 0)
+ floppy_image::FF_35, floppy_image::DSSD, floppy_image::FM,
+ 2000, 18, 80, 2, 256, {}, -1, {0, 5, 10, 15, 2, 7, 12, 17, 4, 9, 14, 1, 6, 11, 16, 3, 8, 13}, 40, 12, 12
+ },
+ { // 43 1440K 3 1/2 inch high density.
+ },
{}
};