From 5029b5ffb6b4200d1f2c7fd1547f73ea98bae8d9 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Thu, 24 Mar 2022 15:29:57 +0100 Subject: imd_dsk: Remove the save support that is just too broken, remove member variables --- src/lib/formats/imd_dsk.cpp | 187 ++++++++++++++------------------------------ src/lib/formats/imd_dsk.h | 14 ---- 2 files changed, 59 insertions(+), 142 deletions(-) diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp index 6c905f46e2d..e07d0d72f21 100644 --- a/src/lib/formats/imd_dsk.cpp +++ b/src/lib/formats/imd_dsk.cpp @@ -427,6 +427,18 @@ int imd_format::identify(util::random_read &io, uint32_t form_factor, const std: bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image *image) { + std::vector comment; + std::vector > snum; + std::vector > tnum; + std::vector > hnum; + + std::vector mode; + std::vector track; + std::vector head; + std::vector sector_count; + std::vector ssize; + + int trackmult; uint64_t size; if(io.length(size)) return false; @@ -438,8 +450,8 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve for(pos=0; pos < size && img[pos] != 0x1a; pos++) { } pos++; - m_comment.resize(pos); - memcpy(&m_comment[0], &img[0], pos); + comment.resize(pos); + memcpy(&comment[0], &img[0], pos); if(pos >= size) return false; @@ -447,12 +459,12 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve int tracks, heads; image->get_maximal_geometry(tracks, heads); - m_mode.clear(); - m_track.clear(); - m_head.clear(); - m_sector_count.clear(); - m_ssize.clear(); - m_trackmult = 1; + mode.clear(); + track.clear(); + head.clear(); + sector_count.clear(); + ssize.clear(); + trackmult = 1; // we have to walk the whole file to find out the number of tracks savepos = pos; @@ -509,7 +521,7 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve (has_variant(variants, floppy_image::DSHD))) { if (maxtrack <= 39) - m_trackmult = 2; + trackmult = 2; } else { @@ -520,79 +532,79 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve pos = savepos; while(pos < size) { - m_mode.push_back(img[pos++]); - m_track.push_back(img[pos++]); - m_head.push_back(img[pos++]); - m_sector_count.push_back(img[pos++]); - m_ssize.push_back(img[pos++]); + mode.push_back(img[pos++]); + track.push_back(img[pos++]); + head.push_back(img[pos++]); + sector_count.push_back(img[pos++]); + ssize.push_back(img[pos++]); - if(m_track.back() >= tracks) + if(track.back() >= tracks) { - osd_printf_error("imd_format: Track %d exceeds maximum of %d\n", m_track.back(), tracks); + osd_printf_error("imd_format: Track %d exceeds maximum of %d\n", track.back(), tracks); return false; } - if((m_head.back() & 0x3f) >= heads) + if((head.back() & 0x3f) >= heads) { - osd_printf_error("imd_format: Head %d exceeds maximum of %d\n", m_head.back() & 0x3f, heads); + osd_printf_error("imd_format: Head %d exceeds maximum of %d\n", head.back() & 0x3f, heads); return false; } - if(m_ssize.back() == 0xff) + if(ssize.back() == 0xff) { - osd_printf_error("imd_format: Unsupported variable sector size on track %d head %d", m_track.back(), m_head.back() & 0x3f); + osd_printf_error("imd_format: Unsupported variable sector size on track %d head %d", track.back(), head.back() & 0x3f); return false; } - uint32_t actual_size = m_ssize.back() < 7 ? 128 << m_ssize.back() : 8192; + uint32_t actual_size = ssize.back() < 7 ? 128 << ssize.back() : 8192; static const int rates[3] = { 500000, 300000, 250000 }; - bool fm = m_mode.back() < 3; - int rate = rates[m_mode.back() % 3]; + bool fm = mode.back() < 3; + int rate = rates[mode.back() % 3]; int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300; int cell_count = (fm ? 1 : 2)*rate*60/rpm; //const uint8_t *snum = &img[pos]; - m_snum.push_back(std::vector(m_sector_count.back())); - memcpy(&m_snum.back()[0], &img[pos], m_sector_count.back()); - pos += m_sector_count.back(); + snum.push_back(std::vector(sector_count.back())); + memcpy(&snum.back()[0], &img[pos], sector_count.back()); + pos += sector_count.back(); //const uint8_t *tnum = head & 0x80 ? &img[pos] : nullptr; - if (m_head.back() & 0x80) + if (head.back() & 0x80) { - m_tnum.push_back(std::vector(m_sector_count.back())); - memcpy(&m_tnum.back()[0], &img[pos], m_sector_count.back()); - pos += m_sector_count.back(); + tnum.push_back(std::vector(sector_count.back())); + memcpy(&tnum.back()[0], &img[pos], sector_count.back()); + pos += sector_count.back(); } else { - m_tnum.push_back(std::vector(0)); + tnum.push_back(std::vector(0)); } //const uint8_t *hnum = head & 0x40 ? &img[pos] : nullptr; - if (m_head.back() & 0x40) + if (head.back() & 0x40) { - m_hnum.push_back(std::vector(m_sector_count.back())); - memcpy(&m_hnum.back()[0], &img[pos], m_sector_count.back()); - pos += m_sector_count.back(); + hnum.push_back(std::vector(sector_count.back())); + memcpy(&hnum.back()[0], &img[pos], sector_count.back()); + pos += sector_count.back(); } else { - m_hnum.push_back(std::vector(0)); + hnum.push_back(std::vector(0)); } - uint8_t head = m_head.back() & 0x3f; + uint8_t chead = head.back() & 0x3f; int gap_3 = calc_default_pc_gap3_size(form_factor, actual_size); desc_pc_sector sects[256]; - for(int i=0; i 8) { @@ -611,15 +623,15 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve } } - if(m_sector_count.back()) { + if(sector_count.back()) { if(fm) { - build_pc_track_fm(m_track.back()*m_trackmult, head, image, cell_count, m_sector_count.back(), sects, gap_3); + build_pc_track_fm(track.back()*trackmult, chead, image, cell_count, sector_count.back(), sects, gap_3); } else { - build_pc_track_mfm(m_track.back()*m_trackmult, head, image, cell_count, m_sector_count.back(), sects, gap_3); + build_pc_track_mfm(track.back()*trackmult, chead, image, cell_count, sector_count.back(), sects, gap_3); } } - for(int i=0; i< m_sector_count.back(); i++) + for(int i=0; i< sector_count.back(); i++) if(sects[i].data && (sects[i].data < &img[0] || sects[i].data >= (&img[0] + size))) delete [] sects[i].data; } @@ -627,90 +639,9 @@ bool imd_format::load(util::random_read &io, uint32_t form_factor, const std::ve return true; } -bool can_compress(const uint8_t* buffer, uint8_t ptrn, uint64_t size) -{ - for (; size > 0; size--) - if (*buffer++ != ptrn) - return false; - return true; -} - -bool imd_format::save(util::random_read_write &io, const std::vector &variants, floppy_image *image) -{ - if(io.seek(0, SEEK_SET)) - return false; - - size_t written; - io.write(&m_comment[0], m_comment.size(), written); - - for (int i = 0; i < m_mode.size(); i++) - { - io.write(&m_mode[i], 1, written); - io.write(&m_track[i], 1, written); - io.write(&m_head[i], 1, written); - io.write(&m_sector_count[i], 1, written); - io.write(&m_ssize[i], 1, written); - - io.write(&m_snum[i][0], m_sector_count[i], written); - - if (m_tnum[i].size()) - io.write(&m_tnum[i][0], m_sector_count[i], written); - - if (m_hnum[i].size()) - io.write(&m_hnum[i][0], m_sector_count[i], written); - - uint32_t const actual_size = m_ssize[i] < 7 ? 128 << m_ssize[i] : 8192; - uint8_t const head = m_head[i] & 0x3f; - - bool const fm = m_mode[i]< 3; - - auto bitstream = generate_bitstream_from_track(m_track[i]*m_trackmult, head, fm ? 4000 : 2000, image); - std::vector> sectors; - - if (fm) - sectors = extract_sectors_from_bitstream_fm_pc(bitstream); - else - sectors = extract_sectors_from_bitstream_mfm_pc(bitstream); - - uint8_t sdata[8192]; - for (int j = 0; j < m_sector_count[i]; j++) { - - const auto &data = sectors[m_snum[i][j]]; - - if (data.empty()) - { - uint8_t const mode = 0; - io.write(&mode, 1, written); - continue; - } - else if (data.size() < actual_size) { - memcpy((void*)sdata, data.data(), data.size()); - memset((uint8_t*)sdata + data.size(), 0, data.size() - actual_size); - } - else - memcpy((void*)sdata, data.data(), actual_size); - - if (can_compress(sdata, sdata[0], actual_size)) - { - uint8_t const mode = 2; - io.write(&mode, 1, written); - io.write(&sdata[0], 1, written); - } - else - { - uint8_t const mode = 1; - io.write(&mode, 1, written); - io.write(&sdata, actual_size, written); - } - } - } - - return true; -} - bool imd_format::supports_save() const { - return true; + return false; } const floppy_format_type FLOPPY_IMD_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/imd_dsk.h b/src/lib/formats/imd_dsk.h index e067383c6a1..18816d23634 100644 --- a/src/lib/formats/imd_dsk.h +++ b/src/lib/formats/imd_dsk.h @@ -19,7 +19,6 @@ public: virtual int identify(util::random_read &io, uint32_t form_factor, const std::vector &variants) override; virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector &variants, floppy_image *image) override; - virtual bool save(util::random_read_write &io, const std::vector &variants, floppy_image* image) override; virtual const char *name() const override; virtual const char *description() const override; @@ -28,19 +27,6 @@ public: private: void fixnum(char *start, char *end) const; - - std::vector m_comment; - std::vector > m_snum; - std::vector > m_tnum; - std::vector > m_hnum; - - std::vector m_mode; - std::vector m_track; - std::vector m_head; - std::vector m_sector_count; - std::vector m_ssize; - - int m_trackmult = 1; }; extern const floppy_format_type FLOPPY_IMD_FORMAT; -- cgit v1.2.3