summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/vdk_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/vdk_dsk.cpp')
-rw-r--r--src/lib/formats/vdk_dsk.cpp63
1 files changed, 32 insertions, 31 deletions
diff --git a/src/lib/formats/vdk_dsk.cpp b/src/lib/formats/vdk_dsk.cpp
index fa07d22a958..02e25ec5df9 100644
--- a/src/lib/formats/vdk_dsk.cpp
+++ b/src/lib/formats/vdk_dsk.cpp
@@ -12,46 +12,55 @@
#include "vdk_dsk.h"
+#include "ioprocs.h"
+
+
vdk_format::vdk_format()
{
}
-const char *vdk_format::name() const
+const char *vdk_format::name() const noexcept
{
return "vdk";
}
-const char *vdk_format::description() const
+const char *vdk_format::description() const noexcept
{
return "VDK disk image";
}
-const char *vdk_format::extensions() const
+const char *vdk_format::extensions() const noexcept
{
return "vdk";
}
-int vdk_format::identify(io_generic *io, uint32_t form_factor)
+int vdk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t id[2];
- io_generic_read(io, id, 0, 2);
+ auto const [err, actual] = read_at(io, 0, id, 2);
+ if (err || (2 != actual))
+ return 0;
if (id[0] == 'd' && id[1] == 'k')
- return 50;
+ return FIFID_SIGN;
else
return 0;
}
-bool vdk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool vdk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
+ if (io.seek(0, SEEK_SET))
+ return false;
+
uint8_t header[0x100];
- io_generic_read(io, header, 0, 0x100);
+ read(io, header, 0x100); // FIXME: check for errors and premature EOF
- int header_size = header[3] * 0x100 + header[2];
- int track_count = header[8];
- int head_count = header[9];
+ int const header_size = header[3] * 0x100 + header[2];
+ int const track_count = header[8];
+ int const head_count = header[9];
- int file_offset = header_size;
+ if (io.seek(header_size, SEEK_SET))
+ return false;
for (int track = 0; track < track_count; track++)
{
@@ -72,10 +81,9 @@ bool vdk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
sectors[i].bad_crc = false;
sectors[i].data = &sector_data[sector_offset];
- io_generic_read(io, sectors[i].data, file_offset, SECTOR_SIZE);
+ read(io, sectors[i].data, SECTOR_SIZE); // FIXME: check for errors and premature EOF
sector_offset += SECTOR_SIZE;
- file_offset += SECTOR_SIZE;
}
build_wd_track_mfm(track, head, image, 100000, SECTOR_COUNT, sectors, 22, 32, 24);
@@ -85,15 +93,13 @@ bool vdk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
return true;
}
-bool vdk_format::save(io_generic *io, floppy_image *image)
+bool vdk_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const
{
- uint8_t bitstream[500000/8];
- uint8_t sector_data[50000];
- desc_xs sectors[256];
- uint64_t file_offset = 0;
+ if (io.seek(0, SEEK_SET))
+ return false;
int track_count, head_count;
- image->get_actual_geometry(track_count, head_count);
+ image.get_actual_geometry(track_count, head_count);
// write header
uint8_t header[12];
@@ -111,32 +117,27 @@ bool vdk_format::save(io_generic *io, floppy_image *image)
header[10] = 0;
header[11] = 0;
- io_generic_write(io, header, file_offset, sizeof(header));
- file_offset += sizeof(header);
+ write(io, header, sizeof(header)); // FIXME: check for errors
// write disk data
for (int track = 0; track < track_count; track++)
{
for (int head = 0; head < head_count; head++)
{
- int track_size;
- generate_bitstream_from_track(track, head, 2000, bitstream, track_size, image);
- extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data));
+ auto bitstream = generate_bitstream_from_track(track, head, 2000, image);
+ auto sectors = extract_sectors_from_bitstream_mfm_pc(bitstream);
for (int i = 0; i < SECTOR_COUNT; i++)
- {
- io_generic_write(io, sectors[FIRST_SECTOR_ID + i].data, file_offset, SECTOR_SIZE);
- file_offset += SECTOR_SIZE;
- }
+ write(io, sectors[FIRST_SECTOR_ID + i].data(), SECTOR_SIZE); // FIXME: check for errors
}
}
return true;
}
-bool vdk_format::supports_save() const
+bool vdk_format::supports_save() const noexcept
{
return true;
}
-const floppy_format_type FLOPPY_VDK_FORMAT = &floppy_image_format_creator<vdk_format>;
+const vdk_format FLOPPY_VDK_FORMAT;