diff options
Diffstat (limited to 'src/lib/formats/vdk_dsk.cpp')
-rw-r--r-- | src/lib/formats/vdk_dsk.cpp | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/src/lib/formats/vdk_dsk.cpp b/src/lib/formats/vdk_dsk.cpp index 308f544e2d3..02e25ec5df9 100644 --- a/src/lib/formats/vdk_dsk.cpp +++ b/src/lib/formats/vdk_dsk.cpp @@ -1,4 +1,4 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Dirk Best /*************************************************************************** @@ -10,49 +10,57 @@ ***************************************************************************/ -#include "emu.h" #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++) { @@ -73,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 = §or_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); @@ -86,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]; @@ -112,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; |