summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/nfd_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/nfd_dsk.cpp')
-rw-r--r--src/lib/formats/nfd_dsk.cpp59
1 files changed, 34 insertions, 25 deletions
diff --git a/src/lib/formats/nfd_dsk.cpp b/src/lib/formats/nfd_dsk.cpp
index 4d9d8fab980..a51b461e144 100644
--- a/src/lib/formats/nfd_dsk.cpp
+++ b/src/lib/formats/nfd_dsk.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Fabio Priuli
/*********************************************************************
- formats/nfd_dsk.h
+ formats/nfd_dsk.cpp
PC98 NFD disk images (info from: http://www.geocities.jp/t98next/dev.html )
@@ -77,46 +77,55 @@
*********************************************************************/
- #include <assert.h>
-
#include "nfd_dsk.h"
+#include "ioprocs.h"
+
+#include "osdcomm.h" // little_endianize_int*
+
+#include <cstring>
+
+
nfd_format::nfd_format()
{
}
-const char *nfd_format::name() const
+const char *nfd_format::name() const noexcept
{
return "nfd";
}
-const char *nfd_format::description() const
+const char *nfd_format::description() const noexcept
{
return "NFD disk image";
}
-const char *nfd_format::extensions() const
+const char *nfd_format::extensions() const noexcept
{
return "nfd";
}
-int nfd_format::identify(io_generic *io, uint32_t form_factor)
+int nfd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t h[16];
- io_generic_read(io, h, 0, 16);
+ auto const [err, actual] = read_at(io, 0, h, 16); // TODO: does it really need 16 bytes? it only looks at 14.
+ if (err || (16 != actual))
+ return 0;
- if (strncmp((const char *)h, "T98FDDIMAGE.R0", 14) == 0 || strncmp((const char *)h, "T98FDDIMAGE.R1", 14) == 0)
- return 100;
+ if (!memcmp(h, "T98FDDIMAGE.R0", 14) || !memcmp(h, "T98FDDIMAGE.R1", 14))
+ return FIFID_SIGN;
return 0;
}
-bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool nfd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
- uint64_t size = io_generic_size(io);
+ uint64_t size;
+ if (io.length(size))
+ return false;
uint8_t h[0x120], hsec[0x10];
- io_generic_read(io, h, 0, 0x120);
- int format_version = !strncmp((const char *)h, "T98FDDIMAGE.R0", 14) ? 0 : 1;
+ read_at(io, 0, h, 0x120); // FIXME: check for errors and premature EOF
+ int format_version = !memcmp(h, "T98FDDIMAGE.R0", 14) ? 0 : 1;
// sector map (the 164th entry is only used by rev.1 format, loops with track < 163 are correct for rev.0)
uint8_t disk_type = 0;
@@ -140,7 +149,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
{
int curr_track_size = 0;
// read sector map absolute location
- io_generic_read(io, hsec, pos, 4);
+ read_at(io, pos, hsec, 4); // FIXME: check for errors and premature EOF
pos += 4;
uint32_t secmap_addr = little_endianize_int32(*(uint32_t *)(hsec));
@@ -149,14 +158,14 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
// read actual sector map for the sectors of this track
// for rev.1 format the first 0x10 are a track summary:
// first WORD is # of sectors, second WORD is # of special data sectors
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF
secmap_addr += 0x10;
num_secs[track] = little_endianize_int16(*(uint16_t *)(hsec));
num_specials[track] = little_endianize_int16(*(uint16_t *)(hsec + 0x2));
for (int sect = 0; sect < num_secs[track]; sect++)
{
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF
if (track == 0 && sect == 0)
disk_type = hsec[0xb]; // can this change across the disk? I don't think so...
@@ -175,7 +184,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
{
for (int sect = 0; sect < num_specials[track]; sect++)
{
- io_generic_read(io, hsec, secmap_addr, 0x10);
+ read_at(io, secmap_addr, hsec, 0x10); // FIXME: check for errors and premature EOF
secmap_addr += 0x10;
curr_track_size += (hsec[9] + 1) * little_endianize_int32(*(uint32_t *)(hsec + 0x0a));
}
@@ -198,7 +207,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
{
// read sector map for this sector
// for rev.0 format each sector uses 0x10 bytes
- io_generic_read(io, hsec, pos, 0x10);
+ read_at(io, pos, hsec, 0x10); // FIXME: check for errors and premature EOF
if (track == 0 && sect == 0)
disk_type = hsec[0xa]; // can this change across the disk? I don't think so...
@@ -228,13 +237,13 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
switch (disk_type)
{
case 0x10: // 640K disk, 2DD
- image->set_variant(floppy_image::DSDD);
+ image.set_variant(floppy_image::DSDD);
break;
//case 0x30: // 1.44M disk, ?? (no images found)
// break;
case 0x90: // 1.2M disk, 2HD
default:
- image->set_variant(floppy_image::DSHD);
+ image.set_variant(floppy_image::DSHD);
break;
}
@@ -245,7 +254,7 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
for (int track = 0; track < 163 && pos < size; track++)
{
- io_generic_read(io, sect_data, pos, track_sizes[track]);
+ read_at(io, pos, sect_data, track_sizes[track]); // FIXME: check for errors and premature EOF
for (int i = 0; i < num_secs[track]; i++)
{
@@ -268,15 +277,15 @@ bool nfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
if (mfm[track * 26])
build_pc_track_mfm(track / 2, track % 2, image, cell_count, num_secs[track], sects, calc_default_pc_gap3_size(form_factor, (128 << sec_sizes[track * 26])));
else
- build_pc_track_fm(track / 2, track % 2, image, cell_count, num_secs[track], sects, calc_default_pc_gap3_size(form_factor, (128 << sec_sizes[track * 26])));
+ build_pc_track_fm(track / 2, track % 2, image, cell_count / 2, num_secs[track], sects, calc_default_pc_gap3_size(form_factor, (128 << sec_sizes[track * 26])));
}
return true;
}
-bool nfd_format::supports_save() const
+bool nfd_format::supports_save() const noexcept
{
return false;
}
-const floppy_format_type FLOPPY_NFD_FORMAT = &floppy_image_format_creator<nfd_format>;
+const nfd_format FLOPPY_NFD_FORMAT;