summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/fsd_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/fsd_dsk.cpp')
-rw-r--r--src/lib/formats/fsd_dsk.cpp37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/lib/formats/fsd_dsk.cpp b/src/lib/formats/fsd_dsk.cpp
index 7880c4415c6..b386dc026c6 100644
--- a/src/lib/formats/fsd_dsk.cpp
+++ b/src/lib/formats/fsd_dsk.cpp
@@ -9,6 +9,11 @@
***************************************************************************/
#include "fsd_dsk.h"
+#include "imageutl.h"
+
+#include "ioprocs.h"
+
+#include <cstring>
/*********************************************************************
@@ -63,48 +68,54 @@ fsd_format::fsd_format()
{
}
-const char *fsd_format::name() const
+const char *fsd_format::name() const noexcept
{
return "fsd";
}
-const char *fsd_format::description() const
+const char *fsd_format::description() const noexcept
{
return "BBC Micro 8271 protected disk image";
}
-const char *fsd_format::extensions() const
+const char *fsd_format::extensions() const noexcept
{
return "fsd";
}
-bool fsd_format::supports_save() const
+bool fsd_format::supports_save() const noexcept
{
return false;
}
-int fsd_format::identify(io_generic *io, uint32_t form_factor)
+int fsd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t h[3];
-
- io_generic_read(io, h, 0, 3);
+ auto const [err, actual] = read_at(io, 0, h, 3);
+ if (err || (3 != actual)) {
+ LOG_FORMATS("fsd: read error\n");
+ return 0;
+ }
if (memcmp(h, "FSD", 3) == 0) {
- return 100;
+ return FIFID_SIGN;
}
LOG_FORMATS("fsd: no match\n");
return 0;
}
-bool fsd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool fsd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
const char* result[255];
result[0x00] = "OK";
result[0x0e] = "Data CRC Error";
result[0x20] = "Deleted Data";
- uint64_t size = io_generic_size(io);
- std::vector<uint8_t> img(size);
- io_generic_read(io, &img[0], 0, size);
+ uint64_t size;
+ if(io.length(size))
+ return false;
+ auto const [err, img, actual] = read_at(io, 0, size);
+ if(err || (actual != size))
+ return false;
uint64_t pos;
std::string title;
@@ -181,4 +192,4 @@ bool fsd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
return true;
}
-const floppy_format_type FLOPPY_FSD_FORMAT = &floppy_image_format_creator<fsd_format>;
+const fsd_format FLOPPY_FSD_FORMAT;