summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/g64_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/g64_dsk.cpp')
-rw-r--r--src/lib/formats/g64_dsk.cpp70
1 files changed, 36 insertions, 34 deletions
diff --git a/src/lib/formats/g64_dsk.cpp b/src/lib/formats/g64_dsk.cpp
index 47592b37e42..177438dc9a6 100644
--- a/src/lib/formats/g64_dsk.cpp
+++ b/src/lib/formats/g64_dsk.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Curt Coder
/*********************************************************************
- formats/g64_dsk.c
+ formats/g64_dsk.cpp
Commodore 1541/1571 GCR disk image format
@@ -11,8 +11,10 @@
*********************************************************************/
#include "formats/g64_dsk.h"
+#include "imageutl.h"
#include "ioprocs.h"
+#include "multibyte.h"
#include "osdcore.h" // osd_printf_*
@@ -31,27 +33,28 @@ const uint32_t g64_format::c1541_cell_size[] =
3250 // 16MHz/13/4
};
-int g64_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int g64_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
char h[8];
+ auto const [err, actual] = read_at(io, 0, h, 8);
+ if (err || (8 != actual))
+ return 0;
- size_t actual;
- io.read_at(0, h, 8, actual);
if (!memcmp(h, G64_FORMAT_HEADER, 8))
- return 100;
+ return FIFID_SIGN;
return 0;
}
-bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
uint64_t size;
if (io.length(size))
return false;
- std::vector<uint8_t> img(size);
- size_t actual;
- io.read_at(0, &img[0], size, actual);
+ auto const [err, img, actual] = read_at(io, 0, size);
+ if (err || (actual != size))
+ return false;
if (img[POS_VERSION])
{
@@ -71,7 +74,7 @@ bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::ve
uint32_t tpos = POS_TRACK_OFFSET + (track * 4);
uint32_t spos = tpos + (track_count * 4);
- uint32_t dpos = pick_integer_le(&img[0], tpos, 4);
+ uint32_t dpos = get_u32le(&img[tpos]);
if (!dpos)
continue;
@@ -82,7 +85,7 @@ bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::ve
return false;
}
- uint32_t speed_zone = pick_integer_le(&img[0], spos, 4);
+ uint32_t speed_zone = get_u32le(&img[spos]);
if (speed_zone > 3)
{
@@ -90,7 +93,7 @@ bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::ve
return false;
}
- uint16_t track_bytes = pick_integer_le(&img[0], dpos, 2);
+ uint16_t track_bytes = get_u16le(&img[dpos]);
int track_size = track_bytes * 8;
LOG_FORMATS("head %u track %u offs %u size %u cell %ld\n", head, cylinder, dpos, track_bytes, 200000000L/track_size);
@@ -99,14 +102,14 @@ bool g64_format::load(util::random_read &io, uint32_t form_factor, const std::ve
}
if (!head)
- image->set_variant(floppy_image::SSSD);
+ image.set_variant(floppy_image::SSSD);
else
- image->set_variant(floppy_image::DSSD);
+ image.set_variant(floppy_image::DSSD);
return true;
}
-int g64_format::generate_bitstream(int track, int head, int speed_zone, std::vector<bool> &trackbuf, floppy_image *image)
+int g64_format::generate_bitstream(int track, int head, int speed_zone, std::vector<bool> &trackbuf, const floppy_image &image)
{
int cell_size = c1541_cell_size[speed_zone];
@@ -118,19 +121,18 @@ int g64_format::generate_bitstream(int track, int head, int speed_zone, std::vec
return ((actual_cell_size >= cell_size-10) && (actual_cell_size <= cell_size+10)) ? speed_zone : -1;
}
-bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const
{
uint8_t const zerofill[] = { 0x00, 0x00, 0x00, 0x00 };
std::vector<uint8_t> const prefill(TRACK_LENGTH, 0xff);
- size_t actual;
int tracks, heads;
- image->get_actual_geometry(tracks, heads);
+ image.get_actual_geometry(tracks, heads);
tracks = TRACK_COUNT * heads;
// write header
uint8_t header[] = { 'G', 'C', 'R', '-', '1', '5', '4', '1', 0x00, static_cast<uint8_t>(tracks), TRACK_LENGTH & 0xff, TRACK_LENGTH >> 8 };
- io.write_at(POS_SIGNATURE, header, sizeof(header), actual);
+ write_at(io, POS_SIGNATURE, header, sizeof(header)); // FIXME: check for errors
// write tracks
for (int head = 0; head < heads; head++) {
@@ -143,10 +145,10 @@ bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &
uint32_t const spos = tpos + (tracks * 4);
uint32_t const dpos = POS_TRACK_OFFSET + (tracks * 4 * 2) + (tracks_written * TRACK_LENGTH);
- io.write_at(tpos, zerofill, 4, actual);
- io.write_at(spos, zerofill, 4, actual);
+ write_at(io, tpos, zerofill, 4); // FIXME: check for errors
+ write_at(io, spos, zerofill, 4); // FIXME: check for errors
- if (image->get_buffer(track, head).size() <= 1)
+ if (image.get_buffer(track, head).size() <= 1)
continue;
int track_size;
@@ -172,15 +174,15 @@ bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &
uint8_t speed_offset[4];
uint8_t track_length[2];
- place_integer_le(track_offset, 0, 4, dpos);
- place_integer_le(speed_offset, 0, 4, speed_zone);
- place_integer_le(track_length, 0, 2, packed.size());
+ put_u32le(track_offset, dpos);
+ put_u32le(speed_offset, speed_zone);
+ put_u16le(track_length, packed.size());
- io.write_at(tpos, track_offset, 4, actual);
- io.write_at(spos, speed_offset, 4, actual);
- io.write_at(dpos, prefill.data(), TRACK_LENGTH, actual);
- io.write_at(dpos, track_length, 2, actual);
- io.write_at(dpos + 2, packed.data(), packed.size(), actual);
+ write_at(io, tpos, track_offset, 4); // FIXME: check for errors
+ write_at(io, spos, speed_offset, 4); // FIXME: check for errors
+ write_at(io, dpos, prefill.data(), TRACK_LENGTH); // FIXME: check for errors
+ write_at(io, dpos, track_length, 2); // FIXME: check for errors
+ write_at(io, dpos + 2, packed.data(), packed.size()); // FIXME: check for errors
tracks_written++;
}
@@ -189,19 +191,19 @@ bool g64_format::save(util::random_read_write &io, const std::vector<uint32_t> &
return true;
}
-const char *g64_format::name() const
+const char *g64_format::name() const noexcept
{
return "g64";
}
-const char *g64_format::description() const
+const char *g64_format::description() const noexcept
{
return "Commodore 1541/1571 GCR disk image";
}
-const char *g64_format::extensions() const
+const char *g64_format::extensions() const noexcept
{
return "g64,g41,g71";
}
-const floppy_format_type FLOPPY_G64_FORMAT = &floppy_image_format_creator<g64_format>;
+const g64_format FLOPPY_G64_FORMAT;