diff options
author | 2021-08-22 09:06:15 +1000 | |
---|---|---|
committer | 2021-08-22 09:06:15 +1000 | |
commit | e8bbea1fc6e94e14768509d322f6c624403ffb36 (patch) | |
tree | 74dd1606a900d83de8aecff17a6737af4113308d /src/lib/formats/trs80_dsk.cpp | |
parent | e319bde5fc3696d7f48f62b15b6366c4377fe5d1 (diff) |
formats, osd, util: Started refactoring file I/O stuff. (#8456)
Added more modern generic I/O interfaces with implementation backed by stdio, osd_file and core_file, replacing io_generic. Also replaced core_file's build-in zlib compression with a filter.
unzip.cpp, un7z.cpp: Added option to supply abstract I/O interface rather than filename.
Converted osd_file, core_file, archive_file, chd_file and device_image_interface to use std::error_condition rather than their own error enums.
Allow mounting TI-99 RPK from inside archives.
Diffstat (limited to 'src/lib/formats/trs80_dsk.cpp')
-rw-r--r-- | src/lib/formats/trs80_dsk.cpp | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/src/lib/formats/trs80_dsk.cpp b/src/lib/formats/trs80_dsk.cpp index f010a24e570..acd48368239 100644 --- a/src/lib/formats/trs80_dsk.cpp +++ b/src/lib/formats/trs80_dsk.cpp @@ -66,6 +66,9 @@ Description of JV3: #include "trs80_dsk.h" +#include "ioprocs.h" + + jv1_format::jv1_format() : wd177x_format(formats) { } @@ -132,15 +135,18 @@ const char *jv3_format::extensions() const return "jv3,dsk"; } -int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants) +int jv3_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) { - uint32_t image_size = io_generic_size(io); + uint64_t image_size; + if (io.length(image_size)) + return 0; if (image_size < 0x2200) return 0; // too small, silent return std::vector<uint8_t> data(image_size); - io_generic_read(io, data.data(), 0, image_size); + size_t actual; + io.read_at(0, data.data(), image_size, actual); const uint32_t entries = 2901; const uint32_t header_size = entries *3 +1; @@ -181,20 +187,20 @@ int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector // validate so we don't overrun the array if (track >= MAX_TRACKS) { - printf("jv3_format::identify - track %d exceeds maximum allowed (%d)\n",track,MAX_TRACKS-1); + osd_printf_info("jv3_format::identify - track %d exceeds maximum allowed (%d)\n",track,MAX_TRACKS-1); return 0; } if (sector >= MAX_SECTORS) { - printf("jv3_format::identify - sector %d exceeds maximum allowed (%d)\n",sector,MAX_SECTORS-1); + osd_printf_info("jv3_format::identify - sector %d exceeds maximum allowed (%d)\n",sector,MAX_SECTORS-1); return 0; } // check if sector already exists if (sector_array[flag_side][track][sector]) { - printf("jv3_format::identify - side %d track %d sector %d is duplicated\n",flag_side,track,sector); + osd_printf_info("jv3_format::identify - side %d track %d sector %d is duplicated\n",flag_side,track,sector); return 0; } @@ -214,21 +220,25 @@ int jv3_format::identify(io_generic *io, uint32_t form_factor, const std::vector // Is all data in the image? (unused tracks at the end are optional) if (last_data > image_size) { - printf("jv3_format::identify - disk is missing some data. Expected 0x%X, Actual = 0x%X\n",last_data,image_size); + osd_printf_info("jv3_format::identify - disk is missing some data. Expected 0x%X, Actual = 0x%X\n",last_data,image_size); return 0; } return 80; } -bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) +bool jv3_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image) { // disk has already been validated in every way except if it exceeds drive tracks, we do that below - printf("Disk detected as JV3\n");fflush(stdout); + osd_printf_info("Disk detected as JV3\n"); int drive_tracks, drive_sides; image->get_maximal_geometry(drive_tracks, drive_sides); - std::vector<uint8_t> data(io_generic_size(io)); - io_generic_read(io, data.data(), 0, data.size()); + uint64_t image_size; + if (io.length(image_size)) + return false; + std::vector<uint8_t> data(image_size); + size_t actual; + io.read_at(0, data.data(), data.size(), actual); const uint32_t entries = 2901; const uint32_t header_size = entries *3 +1; bool is_dd = false, is_ds = false; @@ -313,7 +323,7 @@ bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui data_ptr += sector_size; } - //printf("Side %d, Track %d, %s density\n",curr_side,curr_track,ddensity ? "Double" : "Single"); + //osd_printf_verbose("Side %d, Track %d, %s density\n",curr_side,curr_track,ddensity ? "Double" : "Single"); if (ddensity) { is_dd = true; @@ -344,7 +354,7 @@ bool jv3_format::load(io_generic *io, uint32_t form_factor, const std::vector<ui return true; } -bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, floppy_image *image) +bool jv3_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image) { int track_count, head_count; image->get_actual_geometry(track_count, head_count); @@ -352,10 +362,15 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo if (track_count) { // If the disk already exists, find out if it's writable - std::vector<uint8_t> data(io_generic_size(io)); - io_generic_read(io, data.data(), 0, data.size()); - if ((data.size() >= 0x2200) && (data[0x21ff] == 0)) - return false; // disk is readonly + uint64_t image_size; + if (!io.length(image_size)) + { + std::vector<uint8_t> data(image_size); + size_t actual; + io.read_at(0, data.data(), data.size(), actual); + if ((data.size() >= 0x2200) && (data[0x21ff] == 0)) + return false; // disk is readonly + } } uint32_t data_ptr = 0x2200, sect_ptr = 0; @@ -396,7 +411,8 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo header[sect_ptr++] = track; header[sect_ptr++] = i; header[sect_ptr++] = head ? 0x10 : 0; - io_generic_write(io, &dummy[0], data_ptr, 256); + size_t actual; + io.write_at(data_ptr, &dummy[0], 256, actual); data_ptr += 256; } } @@ -417,14 +433,16 @@ bool jv3_format::save(io_generic *io, const std::vector<uint32_t> &variants, flo flags |= (sectors[i].size() >> 8) ^1; flags |= head ? 0x10 : 0; header[sect_ptr++] = flags; - io_generic_write(io, sectors[i].data(), data_ptr, sectors[i].size()); + size_t actual; + io.write_at(data_ptr, sectors[i].data(), sectors[i].size(), actual); data_ptr += sectors[i].size(); } } } } // Save the header - io_generic_write(io, header, 0, 0x2200); + size_t actual; + io.write_at(0, header, 0x2200, actual); return true; } |