summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/uniflex_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/uniflex_dsk.cpp')
-rw-r--r--src/lib/formats/uniflex_dsk.cpp53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/lib/formats/uniflex_dsk.cpp b/src/lib/formats/uniflex_dsk.cpp
index 6b536aac3eb..063d3c877f9 100644
--- a/src/lib/formats/uniflex_dsk.cpp
+++ b/src/lib/formats/uniflex_dsk.cpp
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:68bit
/*
- * uniflex_dsk.c - UniFLEX compatible disk images
+ * uniflex_dsk.cpp - UniFLEX compatible disk images
*
* The UniFLEX floppy disk format is distinctily different to the FLEX format,
* the sector size is 512 byte sectors versus 256 byte sectors and the format
@@ -10,58 +10,67 @@
*/
#include "uniflex_dsk.h"
-#include "formats/imageutl.h"
+#include "imageutl.h"
+
+#include "ioprocs.h"
+#include "multibyte.h"
+
uniflex_format::uniflex_format() : wd177x_format(formats)
{
}
-const char *uniflex_format::name() const
+const char *uniflex_format::name() const noexcept
{
return "uniflex";
}
-const char *uniflex_format::description() const
+const char *uniflex_format::description() const noexcept
{
return "UniFLEX compatible disk image";
}
-const char *uniflex_format::extensions() const
+const char *uniflex_format::extensions() const noexcept
{
return "dsk";
}
-int uniflex_format::identify(io_generic *io, uint32_t form_factor)
+int uniflex_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
- int type = find_size(io, form_factor);
+ int const type = find_size(io, form_factor, variants);
if (type != -1)
- return 75;
+ return FIFID_SIZE;
+
return 0;
}
-int uniflex_format::find_size(io_generic *io, uint32_t form_factor)
+int uniflex_format::find_size(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
- uint64_t size = io_generic_size(io);
- uint8_t sir[192];
+ uint64_t size;
+ if (io.length(size))
+ return -1;
// Look at the SIR sector, the second sector.
- io_generic_read(io, sir, 1 * 512, sizeof(sir));
+ uint8_t sir[192];
+ auto const [err, actual] = read_at(io, 1 * 512, sir, sizeof(sir)); // FIXME: check for premature EOF
+ if (err)
+ return -1;
- uint16_t fdn_block_count = pick_integer_be(sir, 0x10, 2);
- uint32_t last_block_number = pick_integer_be(sir, 0x12, 3);
- uint32_t free_block_count = pick_integer_be(sir, 0x15, 3);
- uint16_t fdn_free_count = pick_integer_be(sir, 0x15, 2);
+ uint16_t fdn_block_count = get_u16be(&sir[0x10]);
+ uint32_t last_block_number = get_u24be(&sir[0x12]);
+ uint32_t free_block_count = get_u24be(&sir[0x15]);
+ uint16_t fdn_free_count = get_u16be(&sir[0x15]); // FIXME: offset should be different from previous?
- uint16_t volume_number = pick_integer_be(sir, 0x36, 2);
+ uint16_t volume_number = get_u16be(&sir[0x36]);
uint8_t disk_density = sir[0x3a];
uint8_t disk_side_info = sir[0x3b];
- uint32_t volbc_start_addr = pick_integer_be(sir, 0x3c, 3);
- uint16_t swap_size = pick_integer_be(sir, 0x3f, 2);
+ uint32_t volbc_start_addr = get_u24be(&sir[0x3c]);
+ uint16_t swap_size = get_u16be(&sir[0x3f]);
LOG_FORMATS("UniFLEX floppy dsk size %d\n", (uint32_t)size);
- LOG_FORMATS(" time = %u %u\n", (uint32_t) pick_integer_be(sir, 0x08, 4), (uint32_t) pick_integer_be(sir, 0x0c, 4));
+ LOG_FORMATS(" time = %u %u\n", get_u32be(&sir[0x08]), get_u32be(&sir[0x0c]));
LOG_FORMATS(" fdn_block_count: %d\n", fdn_block_count);
LOG_FORMATS(" file system name: ");
@@ -83,7 +92,7 @@ int uniflex_format::find_size(io_generic *io, uint32_t form_factor)
LOG_FORMATS(" swap_size: %d\n", swap_size);
// The first eight bytes appear to be zeros.
- if (pick_integer_be(sir, 0x00, 8) != 0)
+ if (get_u64be(&sir[0x00]) != 0)
return -1;
for(int i=0; formats[i].form_factor; i++) {
@@ -147,4 +156,4 @@ const uniflex_format::format uniflex_format::formats[] = {
{}
};
-const floppy_format_type FLOPPY_UNIFLEX_FORMAT = &floppy_image_format_creator<uniflex_format>;
+const uniflex_format FLOPPY_UNIFLEX_FORMAT;