From 9a4421810c44d9799764d3b0159028fc0bc98eea Mon Sep 17 00:00:00 2001 From: arbee Date: Thu, 4 Feb 2021 19:27:34 -0500 Subject: ap_dsk35: support .2MG images in the new-style apple_gcr_format [R. Belmont] --- src/lib/formats/ap_dsk35.cpp | 26 +++++++++++++++++++++++++- src/lib/formats/ap_dsk35.h | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/formats/ap_dsk35.cpp b/src/lib/formats/ap_dsk35.cpp index 4e7ac40298d..6fd716f5f61 100644 --- a/src/lib/formats/ap_dsk35.cpp +++ b/src/lib/formats/ap_dsk35.cpp @@ -1378,6 +1378,8 @@ const floppy_format_type FLOPPY_DC42_FORMAT = &floppy_image_format_creator(signature), "2IMG", 4)) + { + return 100; + } + return 0; } @@ -1415,8 +1425,17 @@ bool apple_gcr_format::load(io_generic *io, uint32_t form_factor, const std::vec int pos_data = 0; + uint8_t header[64]; + io_generic_read(io, header, 0, 64); + m_bIs2MG = false; + if (!strncmp(reinterpret_cast(header), "2IMG", 4)) + { + m_u2MGOffset = pos_data = header[0x18] | (header[0x19] << 8) | (header[0x1a] << 16) | (header[0x1b] << 24); + m_bIs2MG = true; + } + uint64_t size = io_generic_size(io); - int head_count = size == 409600 ? 1 : size == 819200 ? 2 : 0; + int head_count = size == 409600 ? 1 : size >= 819200 ? 2 : 0; if(!head_count) return false; @@ -1455,6 +1474,11 @@ bool apple_gcr_format::save(io_generic *io, const std::vector &variant int pos_data = 0; + if (m_bIs2MG) + { + pos_data = m_u2MGOffset; + } + for(int track=0; track < 80; track++) { for(int head=0; head < g_heads; head++) { auto sectors = extract_sectors_from_track_mac_gcr6(head, track, image); diff --git a/src/lib/formats/ap_dsk35.h b/src/lib/formats/ap_dsk35.h index b2679df7546..7266fc65855 100644 --- a/src/lib/formats/ap_dsk35.h +++ b/src/lib/formats/ap_dsk35.h @@ -57,6 +57,10 @@ public: virtual const char *description() const override; virtual const char *extensions() const override; virtual bool supports_save() const override; + +private: + bool m_bIs2MG; + uint32_t m_u2MGOffset; }; extern const floppy_format_type FLOPPY_APPLE_GCR_FORMAT; -- cgit v1.2.3