summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/apridisk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/apridisk.cpp')
-rw-r--r--src/lib/formats/apridisk.cpp72
1 files changed, 40 insertions, 32 deletions
diff --git a/src/lib/formats/apridisk.cpp b/src/lib/formats/apridisk.cpp
index a42aa9fa4d4..36ad6018336 100644
--- a/src/lib/formats/apridisk.cpp
+++ b/src/lib/formats/apridisk.cpp
@@ -1,4 +1,4 @@
-// license:GPL-2.0+
+// license:BSD-3-Clause
// copyright-holders:Dirk Best
/***************************************************************************
@@ -8,33 +8,39 @@
***************************************************************************/
-#include "emu.h"
-#include "imageutl.h"
#include "apridisk.h"
+#include "ioprocs.h"
+#include "multibyte.h"
+
+#include "osdcore.h" // osd_printf_error
+
+
apridisk_format::apridisk_format()
{
}
-const char *apridisk_format::name() const
+const char *apridisk_format::name() const noexcept
{
return "apridisk";
}
-const char *apridisk_format::description() const
+const char *apridisk_format::description() const noexcept
{
return "APRIDISK disk image";
}
-const char *apridisk_format::extensions() const
+const char *apridisk_format::extensions() const noexcept
{
return "dsk";
}
-int apridisk_format::identify(io_generic *io, uint32_t form_factor)
+int apridisk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t header[APR_HEADER_SIZE];
- io_generic_read(io, header, 0, APR_HEADER_SIZE);
+ auto const [err, actual] = read_at(io, 0, header, APR_HEADER_SIZE);
+ if (err || (APR_HEADER_SIZE != actual))
+ return 0;
const char magic[] = "ACT Apricot disk image\x1a\x04";
@@ -44,35 +50,38 @@ int apridisk_format::identify(io_generic *io, uint32_t form_factor)
return 0;
}
-bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool apridisk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
desc_pc_sector sectors[80][2][18];
- uint8_t sector_data[MAX_SECTORS * SECTOR_SIZE];
- uint8_t *data_ptr = sector_data;
+ std::unique_ptr<uint8_t []> sector_data(new uint8_t [MAX_SECTORS * SECTOR_SIZE]);
+ uint8_t *data_ptr = sector_data.get();
int track_count = 0, head_count = 0, sector_count = 0;
- uint64_t file_size = io_generic_size(io);
+ uint64_t file_size;
+ if (io.length(file_size))
+ return false;
+
uint64_t file_offset = APR_HEADER_SIZE;
while (file_offset < file_size)
{
// read sector header
uint8_t sector_header[16];
- io_generic_read(io, sector_header, file_offset, 16);
+ read_at(io, file_offset, sector_header, 16); // FIXME: check for errors and premature EOF
- uint32_t type = pick_integer_le(&sector_header, 0, 4);
- uint16_t compression = pick_integer_le(&sector_header, 4, 2);
- uint16_t header_size = pick_integer_le(&sector_header, 6, 2);
- uint32_t data_size = pick_integer_le(&sector_header, 8, 4);
+ uint32_t type = get_u32le(&sector_header[0]);
+ uint16_t compression = get_u16le(&sector_header[4]);
+ uint16_t header_size = get_u16le(&sector_header[6]);
+ uint32_t data_size = get_u32le(&sector_header[8]);
file_offset += header_size;
switch (type)
{
case APR_SECTOR:
- uint8_t head = pick_integer_le(&sector_header, 12, 1);
- uint8_t sector = pick_integer_le(&sector_header, 13, 1);
- uint8_t track = (uint8_t) pick_integer_le(&sector_header, 14, 2);
+ uint8_t head = sector_header[12];
+ uint8_t sector = sector_header[13];
+ uint8_t track = (uint8_t) get_u16le(&sector_header[14]);
track_count = std::max(track_count, int(unsigned(track)));
head_count = std::max(head_count, int(unsigned(head)));
@@ -93,22 +102,26 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *i
case APR_COMPRESSED:
{
uint8_t comp[3];
- io_generic_read(io, comp, file_offset, 3);
- uint16_t length = pick_integer_le(comp, 0, 2);
+ read_at(io, file_offset, comp, 3); // FIXME: check for errors and premature EOF
+ uint16_t length = get_u16le(&comp[0]);
if (length != SECTOR_SIZE)
- fatalerror("apridisk_format: Invalid compression length %04x\n", length);
+ {
+ osd_printf_error("apridisk_format: Invalid compression length %04x\n", length);
+ return false;
+ }
memset(data_ptr, comp[2], SECTOR_SIZE);
}
break;
case APR_UNCOMPRESSED:
- io_generic_read(io, data_ptr, file_offset, SECTOR_SIZE);
+ read_at(io, file_offset, data_ptr, SECTOR_SIZE); // FIXME: check for errors and premature EOF
break;
default:
- fatalerror("apridisk_format: Invalid compression %04x\n", compression);
+ osd_printf_error("apridisk_format: Invalid compression %04x\n", compression);
+ return false;
}
sectors[track][head][sector - 1].data = data_ptr;
@@ -135,14 +148,9 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *i
return true;
}
-bool apridisk_format::save(io_generic *io, floppy_image *image)
-{
- return false;
-}
-
-bool apridisk_format::supports_save() const
+bool apridisk_format::supports_save() const noexcept
{
return false;
}
-const floppy_format_type FLOPPY_APRIDISK_FORMAT = &floppy_image_format_creator<apridisk_format>;
+const apridisk_format FLOPPY_APRIDISK_FORMAT;