summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/aim_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/aim_dsk.cpp')
-rw-r--r--src/lib/formats/aim_dsk.cpp68
1 files changed, 48 insertions, 20 deletions
diff --git a/src/lib/formats/aim_dsk.cpp b/src/lib/formats/aim_dsk.cpp
index 3bc2c2b5b5f..c33cab8fb12 100644
--- a/src/lib/formats/aim_dsk.cpp
+++ b/src/lib/formats/aim_dsk.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Sergey Svishchev
/*********************************************************************
- formats/aim_dsk.h
+ formats/aim_dsk.cpp
AIM disk images
@@ -12,48 +12,50 @@
*********************************************************************/
-#include <assert.h>
-
#include "aim_dsk.h"
+#include "ioprocs.h"
+
aim_format::aim_format()
{
}
-const char *aim_format::name() const
+const char *aim_format::name() const noexcept
{
return "aim";
}
-const char *aim_format::description() const
+const char *aim_format::description() const noexcept
{
return "AIM disk image";
}
-const char *aim_format::extensions() const
+const char *aim_format::extensions() const noexcept
{
return "aim";
}
-int aim_format::identify(io_generic *io, uint32_t form_factor)
+int aim_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
- if (io_generic_size(io) == 2068480)
- {
- return 100;
- }
+ uint64_t size;
+ if (io.length(size))
+ return 0;
+
+ if (size == 2068480)
+ return FIFID_SIZE;
return 0;
}
-bool aim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool aim_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
- image->set_variant(floppy_image::DSQD);
+ image.set_variant(floppy_image::DSQD);
const int tracks = 80;
const int track_size = 6464 * 2;
@@ -66,23 +68,42 @@ bool aim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
std::vector<uint8_t> track_data(track_size);
std::vector<uint32_t> raw_track_data;
int data_count = 0;
+ int splice_pos = -1;
bool header = false;
// Read track
- io_generic_read(io, &track_data[0], ( heads * track + head ) * track_size, track_size);
+ /*auto const [err, actual] =*/ read_at(io, (heads * track + head) * track_size, &track_data[0], track_size);
+ // FIXME: check for error and premature EOF
+ // Find first sector header or index mark
for (int offset = 0; offset < track_size; offset += 2)
{
- switch (track_data[offset + 1] & 1)
+ if (track_data[offset + 1] == 1 && splice_pos < 0)
+ {
+ splice_pos = offset - (20 * 2);
+ }
+ if (track_data[offset + 1] == 3)
+ {
+ splice_pos = offset;
+ }
+ }
+ if (splice_pos < 0)
+ {
+ splice_pos = 0;
+ }
+
+ for (int offset = splice_pos; offset < track_size + splice_pos; offset += 2)
+ {
+ switch (track_data[(offset + 1) % track_size])
{
- case 0:
+ case 0: // regular data
if (data_count == 0)
- header = (track_data[offset] == 0x95) ? true : false;
+ header = (track_data[offset % track_size] == 0x95) ? true : false;
data_count++;
- mfm_w(raw_track_data, 8, track_data[offset]);
+ mfm_w(raw_track_data, 8, track_data[offset % track_size]);
break;
- case 1:
+ case 1: // sync mark
if (header && data_count < 11) // XXX hack
{
for (; data_count < 12; data_count++)
@@ -94,6 +115,13 @@ bool aim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
raw_w(raw_track_data, 16, 0x5555);
data_count = 0;
break;
+
+ // TELETEXT.AIM and others
+ case 0xff:
+ break;
+
+ default:
+ break;
}
}
@@ -105,4 +133,4 @@ bool aim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
}
-const floppy_format_type FLOPPY_AIM_FORMAT = &floppy_image_format_creator<aim_format>;
+const aim_format FLOPPY_AIM_FORMAT;