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/sdf_dsk.cpp | 196 | ||||
-rw-r--r-- | src/lib/formats/sdf_dsk.h | 45 | ||||
-rw-r--r-- | src/mame/drivers/dragon.cpp | 4 |
7 files changed, 261 insertions, 2 deletions
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua index 6129e45b2b6..b8bd7d3e38b 100644 --- a/scripts/src/formats.lua +++ b/scripts/src/formats.lua @@ -679,6 +679,18 @@ end -------------------------------------------------- -- +--@src/lib/formats/sdf_dsk.h,FORMATS["SDF_DSK"] = true +-------------------------------------------------- + +if (FORMATS["SDF_DSK"]~=null or _OPTIONS["with-tools"]) then + files { + MAME_DIR.. "src/lib/formats/sdf_dsk.cpp", + MAME_DIR.. "src/lib/formats/sdf_dsk.h", + } +end + +-------------------------------------------------- +-- --@src/lib/formats/ep64_dsk.h,FORMATS["EP64_DSK"] = true -------------------------------------------------- diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index a30ac378548..31f237d4de2 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -783,6 +783,7 @@ FORMATS["DCP_DSK"] = true FORMATS["DIM_DSK"] = true FORMATS["DIP_DSK"] = true FORMATS["DMK_DSK"] = true +FORMATS["SDF_DSK"] = true FORMATS["EP64_DSK"] = true FORMATS["DMV_DSK"] = true FORMATS["ESQ16_DSK"] = true diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp index bf0688ef102..19df2a24c37 100644 --- a/src/devices/bus/coco/coco_fdc.cpp +++ b/src/devices/bus/coco/coco_fdc.cpp @@ -52,6 +52,7 @@ #include "formats/dmk_dsk.h" #include "formats/jvc_dsk.h" #include "formats/vdk_dsk.h" +#include "formats/sdf_dsk.h" /*************************************************************************** @@ -112,7 +113,8 @@ protected: FLOPPY_FORMATS_MEMBER( coco_family_fdc_device_base::floppy_formats ) FLOPPY_DMK_FORMAT, FLOPPY_JVC_FORMAT, - FLOPPY_VDK_FORMAT + FLOPPY_VDK_FORMAT, + FLOPPY_SDF_FORMAT FLOPPY_FORMATS_END static SLOT_INTERFACE_START( coco_fdc_floppies ) diff --git a/src/devices/bus/coco/dragon_fdc.cpp b/src/devices/bus/coco/dragon_fdc.cpp index 3aac2305fab..8638d9abad5 100644 --- a/src/devices/bus/coco/dragon_fdc.cpp +++ b/src/devices/bus/coco/dragon_fdc.cpp @@ -73,6 +73,7 @@ #include "formats/dmk_dsk.h" #include "formats/jvc_dsk.h" #include "formats/vdk_dsk.h" +#include "formats/sdf_dsk.h" /*************************************************************************** diff --git a/src/lib/formats/sdf_dsk.cpp b/src/lib/formats/sdf_dsk.cpp new file mode 100644 index 00000000000..ab01de3b84a --- /dev/null +++ b/src/lib/formats/sdf_dsk.cpp @@ -0,0 +1,196 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol, tim lindner +/********************************************************************* + + formats/sdf_dsk.h + + SDF disk images. Format created by Darren Atkinson for use with + his CoCoSDC floppy disk emulator. + + http://cocosdc.blogspot.com/p/sd-card-socket-sd-card-socket-is-push.html + +*********************************************************************/ + +#include "sdf_dsk.h" +#include <assert.h> + +sdf_format::sdf_format() +{ +} + + +const char *sdf_format::name() const +{ + return "sdf"; +} + + +const char *sdf_format::description() const +{ + return "SDF disk image"; +} + + +const char *sdf_format::extensions() const +{ + return "sdf"; +} + + +int sdf_format::identify(io_generic *io, uint32_t form_factor) +{ + uint8_t header[HEADER_SIZE]; + + uint64_t size = io_generic_size(io); + + if (size < HEADER_SIZE) + { + return 0; + } + + io_generic_read(io, header, 0, HEADER_SIZE); + + int tracks = header[4]; + int heads = header[5]; + + // Check magic bytes + if (header[0] != 'S' || header[1] != 'D' || header[2] != 'F' || header[3] != '1') + { + return 0; + } + + // Check heads + if (heads != 1 && heads != 2) + { + return 0; + } + + if (size == HEADER_SIZE + heads * tracks * TOTAL_TRACK_SIZE) + { + return 100; + } + + return 0; +} + + +bool sdf_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) +{ + uint8_t header[HEADER_SIZE]; + std::vector<uint8_t> track_data(TOTAL_TRACK_SIZE); + std::vector<uint32_t> raw_track_data; + + io_generic_read(io, header, 0, HEADER_SIZE); + + const int tracks = header[4]; + const int heads = header[5]; + + if (heads == 2) + { + image->set_variant(floppy_image::DSDD); + } + else + { + image->set_variant(floppy_image::SSDD); + } + + for (int track = 0; track < tracks; track++) + { + for (int head = 0; head < heads; head++) + { + int iam_location = -1; + int idam_location[SECTOR_SLOT_COUNT+1]; + int dam_location[SECTOR_SLOT_COUNT+1]; + raw_track_data.clear(); + + // Read track + io_generic_read(io, &track_data[0], HEADER_SIZE + ( heads * track + head ) * TOTAL_TRACK_SIZE, TOTAL_TRACK_SIZE); + + int sector_count = track_data[0]; + + if (sector_count > SECTOR_SLOT_COUNT) return false; + + // Transfer IDAM and DAM locations to table + for (int i = 0; i < SECTOR_SLOT_COUNT+1; i++) + { + if (i < sector_count ) + { + idam_location[i] = ((track_data[ 8 * (i+1) + 1] << 8 | track_data[ 8 * (i+1)]) & 0x3FFF) - 4; + dam_location[i] = ((track_data[ 8 * (i+1) + 1 + 2] << 8 | track_data[ 8 * (i+1) + 2]) & 0x3FFF) - 4; + + if (idam_location[i] > TOTAL_TRACK_SIZE) return false; + if (dam_location[i] > TOTAL_TRACK_SIZE) return false; + } + else + { + idam_location[i] = -1; + dam_location[i] = -1; + } + } + + // Find IAM location + for (int i = idam_location[0] - 1; i >= TRACK_HEADER_SIZE + 3; i--) + { + // It's usually 3 bytes but several dumped tracks seem to contain only 2 bytes + if (track_data[i] == 0xfc && track_data[i-1] == 0xc2 && track_data[i-2] == 0xc2) + { + iam_location = i - 3; + break; + } + } + + int idam_index = 0; + int dam_index = 0; + for (int offset = TRACK_HEADER_SIZE; offset < TRACK_HEADER_SIZE + TRACK_SIZE; offset++) + { + if (offset == iam_location) + { + // Write IAM + raw_w(raw_track_data, 16, 0x5224); + raw_w(raw_track_data, 16, 0x5224); + raw_w(raw_track_data, 16, 0x5224); + offset += 3; + } + + if (offset == idam_location[idam_index]) + { + raw_w(raw_track_data, 16, 0x4489); + raw_w(raw_track_data, 16, 0x4489); + raw_w(raw_track_data, 16, 0x4489); + idam_index += 1; + offset += 3; + } + + if (offset == dam_location[dam_index]) + { + raw_w(raw_track_data, 16, 0x4489); + raw_w(raw_track_data, 16, 0x4489); + raw_w(raw_track_data, 16, 0x4489); + dam_index += 1; + offset += 3; + } + + mfm_w(raw_track_data, 8, track_data[offset]); + } + + generate_track_from_levels(track, head, raw_track_data, 0, image); + } + } + + return true; +} + + +bool sdf_format::save(io_generic *io, floppy_image *image) +{ + return false; +} + + +bool sdf_format::supports_save() const +{ + return false; +} + + +const floppy_format_type FLOPPY_SDF_FORMAT = &floppy_image_format_creator<sdf_format>; diff --git a/src/lib/formats/sdf_dsk.h b/src/lib/formats/sdf_dsk.h new file mode 100644 index 00000000000..219fdce3abe --- /dev/null +++ b/src/lib/formats/sdf_dsk.h @@ -0,0 +1,45 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol, tim lindner +/********************************************************************* + + formats/sdf_dsk.h + + SDF disk images. Format created by Darren Atkinson for use with + his CoCoSDC floppy disk emulator. + +*********************************************************************/ + +#ifndef SDF_DSK_H +#define SDF_DSK_H + +#include "flopimg.h" + +/**************************************************************************/ + +class sdf_format : public floppy_image_format_t +{ +public: + sdf_format(); + + virtual int identify(io_generic *io, uint32_t form_factor) override; + virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override; + virtual bool save(io_generic *io, floppy_image *image) override; + + virtual const char *name() const override; + virtual const char *description() const override; + virtual const char *extensions() const override; + virtual bool supports_save() const override; + +protected: + static constexpr int HEADER_SIZE = 512; + static constexpr int TRACK_HEADER_SIZE = 256; + static constexpr int TRACK_SIZE = 6250; + static constexpr int TRACK_PADDING = 150; + static constexpr int TOTAL_TRACK_SIZE = TRACK_HEADER_SIZE + TRACK_SIZE + TRACK_PADDING; + + static constexpr int SECTOR_SLOT_COUNT = 31; +}; + +extern const floppy_format_type FLOPPY_SDF_FORMAT; + +#endif /* SDF_DSK_H */ diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp index 7e12cc894e0..a981c6d7229 100644 --- a/src/mame/drivers/dragon.cpp +++ b/src/mame/drivers/dragon.cpp @@ -22,6 +22,7 @@ #include "bus/coco/coco_multi.h" #include "formats/vdk_dsk.h" #include "formats/dmk_dsk.h" +#include "formats/sdf_dsk.h" #include "imagedev/flopdrv.h" @@ -140,7 +141,8 @@ SLOT_INTERFACE_END FLOPPY_FORMATS_MEMBER( dragon_alpha_state::dragon_formats ) FLOPPY_VDK_FORMAT, - FLOPPY_DMK_FORMAT + FLOPPY_DMK_FORMAT, + FLOPPY_SDF_FORMAT FLOPPY_FORMATS_END static SLOT_INTERFACE_START( dragon_alpha_floppies ) |