summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/dim_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/dim_dsk.cpp')
-rw-r--r--src/lib/formats/dim_dsk.cpp139
1 files changed, 21 insertions, 118 deletions
diff --git a/src/lib/formats/dim_dsk.cpp b/src/lib/formats/dim_dsk.cpp
index 67c04adc2bf..1f0902c2859 100644
--- a/src/lib/formats/dim_dsk.cpp
+++ b/src/lib/formats/dim_dsk.cpp
@@ -2,156 +2,64 @@
// copyright-holders:Olivier Galibert
/*********************************************************************
- formats/dim_dsk.c
+ formats/dim_dsk.cpp
DIM disk images
*********************************************************************/
-#include <string.h>
-#include <assert.h>
-
#include "dim_dsk.h"
-#include "basicdsk.h"
-
-FLOPPY_IDENTIFY(dim_dsk_identify)
-{
- uint8_t dim_header[16];
-
- floppy_image_read(floppy, (uint8_t*)dim_header,0xab,16);
-
- if(strncmp((const char*)dim_header,"DIFC HEADER",11) == 0)
- *vote = 100;
- else
- *vote = 0;
- return FLOPPY_ERROR_SUCCESS;
-}
-
-FLOPPY_CONSTRUCT(dim_dsk_construct)
-{
- struct basicdsk_geometry geometry;
- // DIM disk image header, most of this is guesswork
- int tracks = 77;
- int heads = 2;
- int sectors = 8; // per track
- int sectorlen = 1024;
- int firstsector = 0x01;
- uint8_t format_tmp;
- int x;
- uint16_t temp;
-
- if(params)
- {
- // create
- return FLOPPY_ERROR_UNSUPPORTED;
- }
-
- // Offset + 0 : disk format type (1 byte):
- // 0 = 2HD / 2HDA (8 sector/track, 1024 bytes/sector, GAP#3 = 0x74)
- // 1 = 2HS (9 sector/track, 1024 bytes/sector, GAP#3 = 0x39)
- // 2 = 2HC (15 sector/track, 512 bytes/sector, GAP#3 = 0x54)
- // 3 = 2HDE(68) (9 sector/track, 1024 bytes/sector, GAP#3 = 0x39)
- // 9 = 2HQ (18 sector/track, 512 bytes/sector, GAP#3 = 0x54)
- // 17 = N88-BASIC (26 sector/track, 256 bytes/sector, GAP#3 = 0x33)
- // or (26 sector/track, 128 bytes/sector, GAP#3 = 0x1a)
- //
- floppy_image_read(floppy, &format_tmp,0,1);
-
- switch(format_tmp)
- {
- case 0x00:
- sectors = 8;
- sectorlen = 1024;
- break;
- case 0x01:
- case 0x03:
- sectors = 9;
- sectorlen = 1024;
- break;
- case 0x02:
- sectors = 15;
- sectorlen = 512;
- break;
- case 0x09:
- sectors = 18;
- sectorlen = 512;
- break;
- case 0x11:
- sectors = 26;
- sectorlen = 256;
- break;
- }
- tracks = 0;
- for (x=0;x<86;x++)
- {
- floppy_image_read(floppy,&temp,(x*2)+1,2);
- if(temp == 0x0101)
- tracks++;
- }
- // TODO: expand on this basic implementation
-
- LOG_FORMATS("FDD: DIM image loaded - type %i, %i tracks, %i sectors per track, %i bytes per sector\n", format_tmp,tracks, sectors,sectorlen);
-
- memset(&geometry, 0, sizeof(geometry));
- geometry.heads = heads;
- geometry.first_sector_id = firstsector;
- geometry.sector_length = sectorlen;
- geometry.tracks = tracks+1;
- geometry.sectors = sectors;
- geometry.offset = 0x100;
- return basicdsk_construct(floppy, &geometry);
-}
-
-/*********************************************************************
-
- formats/dim_dsk.c
+#include "ioprocs.h"
- DIM disk images
+#include <cstring>
+#include <tuple>
-*********************************************************************/
-
-#include "dim_dsk.h"
dim_format::dim_format()
{
}
-const char *dim_format::name() const
+const char *dim_format::name() const noexcept
{
return "dim";
}
-const char *dim_format::description() const
+const char *dim_format::description() const noexcept
{
return "DIM disk image";
}
-const char *dim_format::extensions() const
+const char *dim_format::extensions() const noexcept
{
return "dim";
}
-int dim_format::identify(io_generic *io, uint32_t form_factor)
+int dim_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, 0xab, 16);
+ auto const [err, actual] = read_at(io, 0xab, h, 16);
+ if(err || (16 != actual))
+ return 0;
if(strncmp((const char *)h, "DIFC HEADER", 11) == 0)
- return 100;
+ return FIFID_SIGN;
return 0;
}
-bool dim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool dim_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
+ std::error_condition err;
+ size_t actual;
int offset = 0x100;
uint8_t h;
uint8_t track_total = 77;
int cell_count = form_factor == floppy_image::FF_35 ? 200000 : 166666;
- io_generic_read(io, &h, 0, 1);
+ std::tie(err, actual) = read_at(io, 0, &h, 1);
+ if (err || (1 != actual))
+ return false;
int spt, gap3, bps, size;
switch(h) {
@@ -211,7 +119,7 @@ bool dim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
sects[i].deleted = false;
sects[i].bad_crc = false;
sects[i].data = &sect_data[sdatapos];
- io_generic_read(io, sects[i].data, offset, bps);
+ std::tie(err, actual) = read_at(io, offset, sects[i].data, bps); // FIXME: check for errors and premature EOF
offset += bps;
sdatapos += bps;
}
@@ -223,14 +131,9 @@ bool dim_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
}
-bool dim_format::save(io_generic *io, floppy_image *image)
-{
- return false;
-}
-
-bool dim_format::supports_save() const
+bool dim_format::supports_save() const noexcept
{
return false;
}
-const floppy_format_type FLOPPY_DIM_FORMAT = &floppy_image_format_creator<dim_format>;
+const dim_format FLOPPY_DIM_FORMAT;