summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/pc98fdi_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/pc98fdi_dsk.cpp')
-rw-r--r--src/lib/formats/pc98fdi_dsk.cpp78
1 files changed, 47 insertions, 31 deletions
diff --git a/src/lib/formats/pc98fdi_dsk.cpp b/src/lib/formats/pc98fdi_dsk.cpp
index 37cdae18ff7..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 <cassert>
#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;