diff options
Diffstat (limited to 'src/lib/formats/pc98fdi_dsk.cpp')
-rw-r--r-- | src/lib/formats/pc98fdi_dsk.cpp | 78 |
1 files changed, 47 insertions, 31 deletions
diff --git a/src/lib/formats/pc98fdi_dsk.cpp b/src/lib/formats/pc98fdi_dsk.cpp index 5b37b1ede37..10822ab316d 100644 --- a/src/lib/formats/pc98fdi_dsk.cpp +++ b/src/lib/formats/pc98fdi_dsk.cpp @@ -2,75 +2,90 @@ // copyright-holders:Olivier Galibert /********************************************************************* - formats/pc98fdi_dsk.h + formats/pc98fdi_dsk.cpp PC98FDI disk images *********************************************************************/ -#include <assert.h> #include "pc98fdi_dsk.h" +#include "ioprocs.h" +#include "multibyte.h" + +#include <tuple> + + pc98fdi_format::pc98fdi_format() { } -const char *pc98fdi_format::name() const +const char *pc98fdi_format::name() const noexcept { return "pc98_fdi"; } -const char *pc98fdi_format::description() const +const char *pc98fdi_format::description() const noexcept { return "PC98 FDI disk image"; } -const char *pc98fdi_format::extensions() const +const char *pc98fdi_format::extensions() const noexcept { return "fdi"; } -int pc98fdi_format::identify(io_generic *io, uint32_t form_factor) +int pc98fdi_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const { - uint64_t size = io_generic_size(io); - uint8_t h[32]; + uint64_t size; + if(io.length(size)) + return 0; - io_generic_read(io, h, 0, 32); - uint32_t hsize = little_endianize_int32(*(uint32_t *) (h + 0x8)); - uint32_t psize = little_endianize_int32(*(uint32_t *) (h + 0xc)); - uint32_t ssize = little_endianize_int32(*(uint32_t *) (h + 0x10)); - uint32_t scnt = little_endianize_int32(*(uint32_t *) (h + 0x14)); - uint32_t sides = little_endianize_int32(*(uint32_t *) (h + 0x18)); - uint32_t ntrk = little_endianize_int32(*(uint32_t *) (h + 0x1c)); + uint8_t h[32]; + auto const [err, actual] = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return 0; + + uint32_t const hsize = get_u32le(h + 0x8); + uint32_t const psize = get_u32le(h + 0xc); + uint32_t const ssize = get_u32le(h + 0x10); + uint32_t const scnt = get_u32le(h + 0x14); + uint32_t const sides = get_u32le(h + 0x18); + uint32_t const ntrk = get_u32le(h + 0x1c); if(size == hsize + psize && psize == ssize*scnt*sides*ntrk) - return 100; + return FIFID_STRUCT; return 0; } -bool pc98fdi_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) +bool pc98fdi_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const { - uint8_t h[32]; + std::error_condition err; + size_t actual; - io_generic_read(io, h, 0, 32); + uint8_t h[32]; + std::tie(err, actual) = read_at(io, 0, h, 32); + if(err || (32 != actual)) + return false; - uint32_t hsize = little_endianize_int32(*(uint32_t *)(h+0x8)); - uint32_t sector_size = little_endianize_int32(*(uint32_t *)(h+0x10)); - uint32_t sector_count = little_endianize_int32(*(uint32_t *)(h+0x14)); - uint32_t head_count = little_endianize_int32(*(uint32_t *)(h+0x18)); - uint32_t track_count = little_endianize_int32(*(uint32_t *)(h+0x1c)); + uint32_t const hsize = get_u32le(h + 0x8); + uint32_t const sector_size = get_u32le(h + 0x10); + uint32_t const sector_count = get_u32le(h + 0x14); + uint32_t const head_count = get_u32le(h + 0x18); + uint32_t const track_count = get_u32le(h + 0x1c); - int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666; + int const cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666; - int ssize; - for(ssize=0; (128 << ssize) < sector_size; ssize++) {}; + int ssize = 0; + while ((128 << ssize) < sector_size) + ssize++; desc_pc_sector sects[256]; uint8_t sect_data[65536]; - for(int track=0; track < track_count; track++) + for(int track=0; track < track_count; track++) { for(int head=0; head < head_count; head++) { - io_generic_read(io, sect_data, hsize + sector_size*sector_count*(track*head_count + head), sector_size*sector_count); + std::tie(err, actual) = read_at(io, hsize + sector_size*sector_count*(track*head_count + head), sect_data, sector_size*sector_count); // FIXME: check for errors and premature EOF for(int i=0; i<sector_count; i++) { sects[i].track = track; @@ -85,13 +100,14 @@ bool pc98fdi_format::load(io_generic *io, uint32_t form_factor, floppy_image *im build_pc_track_mfm(track, head, image, cell_count, sector_count, sects, calc_default_pc_gap3_size(form_factor, sector_size)); } + } return true; } -bool pc98fdi_format::supports_save() const +bool pc98fdi_format::supports_save() const noexcept { return false; } -const floppy_format_type FLOPPY_PC98FDI_FORMAT = &floppy_image_format_creator<pc98fdi_format>; +const pc98fdi_format FLOPPY_PC98FDI_FORMAT; |