summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author tim lindner <tlindner@macmess.org>2019-04-26 09:12:01 -0700
committer R. Belmont <rb6502@users.noreply.github.com>2019-04-26 12:12:01 -0400
commit8a8fcba1205a9b33506bf16fe74d8d74e6982fb2 (patch)
tree6f86d3d9c4896a7853b064eff63e939e5b7ff492
parentca07dc3cc53b809954db77d8248c5642d0c0d12d (diff)
Fix OS-9 disk writing bug (#4925)
* Start fixing OS9 disk handling * Got it working, now need to refine and test * Almost complete. Doing more testing... * Tested aginst a varient of sotware. Solved bug. Cleaned up tabs. * Turned on sector interleaving in OS9_DSK and retested.
-rw-r--r--scripts/src/formats.lua12
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp4
-rw-r--r--src/devices/bus/coco/dragon_fdc.cpp1
-rw-r--r--src/lib/formats/jvc_dsk.cpp51
-rw-r--r--src/lib/formats/os9_dsk.cpp115
-rw-r--r--src/lib/formats/os9_dsk.h33
7 files changed, 177 insertions, 40 deletions
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua
index 9e7a2a1eb5a..5b678c480af 100644
--- a/scripts/src/formats.lua
+++ b/scripts/src/formats.lua
@@ -991,6 +991,18 @@ end
--------------------------------------------------
--
+--@src/lib/formats/os9_dsk.h,FORMATS["OS9_DSK"] = true
+--------------------------------------------------
+
+if (FORMATS["OS9_DSK"]~=null or _OPTIONS["with-tools"]) then
+ files {
+ MAME_DIR.. "src/lib/formats/os9_dsk.cpp",
+ MAME_DIR.. "src/lib/formats/os9_dsk.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/lib/formats/jfd_dsk.h,FORMATS["JFD_DSK"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 8e233c29304..604ed351959 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -931,6 +931,7 @@ FORMATS["IQ151_DSK"] = true
FORMATS["ITT3030_DSK"] = true
FORMATS["JFD_DSK"] = true
FORMATS["JVC_DSK"] = true
+FORMATS["OS9_DSK"] = true
FORMATS["KAYPRO_DSK"] = true
FORMATS["KC85_DSK"] = true
FORMATS["KC_CAS"] = true
diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp
index 79658d27d60..c7bd40d8952 100644
--- a/src/devices/bus/coco/coco_fdc.cpp
+++ b/src/devices/bus/coco/coco_fdc.cpp
@@ -53,6 +53,7 @@
#include "formats/jvc_dsk.h"
#include "formats/vdk_dsk.h"
#include "formats/sdf_dsk.h"
+#include "formats/os9_dsk.h"
/***************************************************************************
@@ -118,7 +119,8 @@ FLOPPY_FORMATS_MEMBER( coco_family_fdc_device_base::floppy_formats )
FLOPPY_DMK_FORMAT,
FLOPPY_JVC_FORMAT,
FLOPPY_VDK_FORMAT,
- FLOPPY_SDF_FORMAT
+ FLOPPY_SDF_FORMAT,
+ FLOPPY_OS9_FORMAT
FLOPPY_FORMATS_END
static void coco_fdc_floppies(device_slot_interface &device)
diff --git a/src/devices/bus/coco/dragon_fdc.cpp b/src/devices/bus/coco/dragon_fdc.cpp
index be31a660db9..caa5780ff87 100644
--- a/src/devices/bus/coco/dragon_fdc.cpp
+++ b/src/devices/bus/coco/dragon_fdc.cpp
@@ -75,6 +75,7 @@
#include "formats/jvc_dsk.h"
#include "formats/vdk_dsk.h"
#include "formats/sdf_dsk.h"
+#include "formats/os9_dsk.h"
/***************************************************************************
diff --git a/src/lib/formats/jvc_dsk.cpp b/src/lib/formats/jvc_dsk.cpp
index 3056a311169..ec83c4c6710 100644
--- a/src/lib/formats/jvc_dsk.cpp
+++ b/src/lib/formats/jvc_dsk.cpp
@@ -164,34 +164,6 @@ bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int
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);
-
- if (os9_total_sectors > 0 && os9_heads > 0 && os9_sectors > 0)
- {
- int os9_tracks = os9_total_sectors / os9_sectors / os9_heads;
-
- // now let's see if we have valid info
- if ((os9_tracks * os9_heads * os9_sectors * 256) == size)
- {
- tracks = os9_tracks;
- heads = os9_heads;
- sectors = os9_sectors;
-
- 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);
@@ -223,19 +195,20 @@ bool jvc_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
desc_pc_sector sectors[256];
uint8_t sector_data[10000];
int sector_offset = 0;
-
+ // standard RS-DOS interleave
+ int interleave[18] = { 0, 11, 4, 15, 8, 1, 12, 5, 16, 9, 2, 13, 6, 17, 10, 3, 14, 7 };
for (int i = 0; i < sector_count; i++)
{
- sectors[i].track = track;
- sectors[i].head = head;
- sectors[i].sector = sector_base_id + i;
- sectors[i].actual_size = sector_size;
- sectors[i].size = sector_size >> 8;
- sectors[i].deleted = false;
- sectors[i].bad_crc = false;
- sectors[i].data = &sector_data[sector_offset];
-
- io_generic_read(io, sectors[i].data, file_offset, sector_size);
+ sectors[interleave[i]].track = track;
+ sectors[interleave[i]].head = head;
+ sectors[interleave[i]].sector = sector_base_id + i;
+ sectors[interleave[i]].actual_size = sector_size;
+ sectors[interleave[i]].size = sector_size >> 8;
+ sectors[interleave[i]].deleted = false;
+ sectors[interleave[i]].bad_crc = false;
+ sectors[interleave[i]].data = &sector_data[sector_offset];
+
+ io_generic_read(io, sectors[interleave[i]].data, file_offset, sector_size);
sector_offset += sector_size;
file_offset += sector_size;
diff --git a/src/lib/formats/os9_dsk.cpp b/src/lib/formats/os9_dsk.cpp
new file mode 100644
index 00000000000..8cd2bd985bf
--- /dev/null
+++ b/src/lib/formats/os9_dsk.cpp
@@ -0,0 +1,115 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/*********************************************************************
+
+ formats/os9_dsk.c
+
+ OS-9 disk images
+
+ OS-9 Level 2 Technical Reference, Chapter 5, Random Block File
+ Manager, page 2
+
+ Available: http://www.colorcomputerarchive.com/coco/Documents/Manuals/
+ Operating Systems/OS-9 Level 2 Manual (Tandy).pdf
+
+*********************************************************************/
+
+#include <assert.h>
+#include "emu.h"
+#include "formats/imageutl.h"
+
+#include "formats/os9_dsk.h"
+
+os9_format::os9_format() : wd177x_format(formats)
+{
+}
+
+const char *os9_format::name() const
+{
+ return "os9";
+}
+
+const char *os9_format::description() const
+{
+ return "OS-9 floppy disk image";
+}
+
+const char *os9_format::extensions() const
+{
+ return "dsk,os9";
+}
+
+int os9_format::identify(io_generic *io, uint32_t form_factor)
+{
+ int type = find_size(io, form_factor);
+
+ if (type != -1)
+ return 75;
+ return 0;
+}
+
+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);
+
+ 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;
+
+ // 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];
+
+ if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
+ continue;
+
+ if(os9_tracks == f.track_count) {
+ if( os9_heads == f.head_count ) {
+ if(os9_sectors == f.sector_count ) {
+ return i;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return -1;
+}
+
+const os9_format::format os9_format::formats[] = {
+ { // 5"25 160K 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ },
+ {}
+};
+
+const floppy_format_type FLOPPY_OS9_FORMAT = &floppy_image_format_creator<os9_format>;
diff --git a/src/lib/formats/os9_dsk.h b/src/lib/formats/os9_dsk.h
new file mode 100644
index 00000000000..cd0ab645914
--- /dev/null
+++ b/src/lib/formats/os9_dsk.h
@@ -0,0 +1,33 @@
+// license:BSD-3-Clause
+// copyright-holders:tim lindner
+/*********************************************************************
+
+ formats/os9_dsk.h
+
+ OS-9 disk images
+
+*********************************************************************/
+#ifndef MAME_FORMATS_OS9_DSK_H
+#define MAME_FORMATS_OS9_DSK_H
+
+#pragma once
+
+#include "wd177x_dsk.h"
+
+class os9_format : public wd177x_format {
+public:
+ os9_format();
+
+ virtual int identify(io_generic *io, uint32_t form_factor) override;
+ virtual int find_size(io_generic *io, uint32_t form_factor) override;
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+
+private:
+ static const format formats[];
+};
+
+extern const floppy_format_type FLOPPY_OS9_FORMAT;
+
+#endif // MAME_FORMATS_OS9_DSK_H