diff options
-rw-r--r-- | scripts/src/formats.lua | 12 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/bus/coco/coco_fdc.cpp | 4 | ||||
-rw-r--r-- | src/devices/bus/coco/dragon_fdc.cpp | 1 | ||||
-rw-r--r-- | src/lib/formats/jvc_dsk.cpp | 51 | ||||
-rw-r--r-- | src/lib/formats/os9_dsk.cpp | 115 | ||||
-rw-r--r-- | src/lib/formats/os9_dsk.h | 33 |
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 = §or_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 = §or_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 |