summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-03-24 15:29:57 +0100
committer Olivier Galibert <galibert@pobox.com>2022-03-30 15:45:35 +0200
commit5029b5ffb6b4200d1f2c7fd1547f73ea98bae8d9 (patch)
tree8a5099086d437ef659a6aec3acb06149ff360686 /src/lib
parent14da1bc8a03759ac2387b99409c2e7c082327fad (diff)
imd_dsk: Remove the save support that is just too broken, remove member variables
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/imd_dsk.cpp187
-rw-r--r--src/lib/formats/imd_dsk.h14
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<uint32_t> &variants, floppy_image *image)
{
+ std::vector<uint8_t> comment;
+ std::vector<std::vector<uint8_t> > snum;
+ std::vector<std::vector<uint8_t> > tnum;
+ std::vector<std::vector<uint8_t> > hnum;
+
+ std::vector<uint8_t> mode;
+ std::vector<uint8_t> track;
+ std::vector<uint8_t> head;
+ std::vector<uint8_t> sector_count;
+ std::vector<uint8_t> 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<uint8_t>(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<uint8_t>(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<uint8_t>(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<uint8_t>(sector_count.back()));
+ memcpy(&tnum.back()[0], &img[pos], sector_count.back());
+ pos += sector_count.back();
}
else
{
- m_tnum.push_back(std::vector<uint8_t>(0));
+ tnum.push_back(std::vector<uint8_t>(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<uint8_t>(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<uint8_t>(sector_count.back()));
+ memcpy(&hnum.back()[0], &img[pos], sector_count.back());
+ pos += sector_count.back();
}
else
{
- m_hnum.push_back(std::vector<uint8_t>(0));
+ hnum.push_back(std::vector<uint8_t>(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<m_sector_count.back(); i++) {
+ for(int i=0; i<sector_count.back(); i++) {
uint8_t stype = img[pos++];
- sects[i].track = m_tnum.back().size() ? m_tnum.back()[i] : m_track.back();
- sects[i].head = m_hnum.back().size() ? m_hnum.back()[i] : m_head.back();
- sects[i].sector = m_snum.back()[i];
- sects[i].size = m_ssize.back();
+ sects[i].track = tnum.back().size() ? tnum.back()[i] : track.back();
+ sects[i].head = hnum.back().size() ? hnum.back()[i] : head.back();
+ sects[i].sector = snum.back()[i];
+ sects[i].size = ssize.back();
sects[i].actual_size = actual_size;
if(stype == 0 || stype > 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<uint32_t> &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<std::vector<uint8_t>> 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<imd_format>;
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<uint32_t> &variants) override;
virtual bool load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) override;
- virtual bool save(util::random_read_write &io, const std::vector<uint32_t> &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<uint8_t> m_comment;
- std::vector<std::vector<uint8_t> > m_snum;
- std::vector<std::vector<uint8_t> > m_tnum;
- std::vector<std::vector<uint8_t> > m_hnum;
-
- std::vector<uint8_t> m_mode;
- std::vector<uint8_t> m_track;
- std::vector<uint8_t> m_head;
- std::vector<uint8_t> m_sector_count;
- std::vector<uint8_t> m_ssize;
-
- int m_trackmult = 1;
};
extern const floppy_format_type FLOPPY_IMD_FORMAT;