summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/st_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/st_dsk.cpp')
-rw-r--r--src/lib/formats/st_dsk.cpp94
1 files changed, 44 insertions, 50 deletions
diff --git a/src/lib/formats/st_dsk.cpp b/src/lib/formats/st_dsk.cpp
index 3d81221ea72..fc105de6fcb 100644
--- a/src/lib/formats/st_dsk.cpp
+++ b/src/lib/formats/st_dsk.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Olivier Galibert
/*********************************************************************
- formats/st_dsk.c
+ formats/st_dsk.cpp
All usual Atari ST formats
@@ -11,6 +11,7 @@
#include "formats/st_dsk.h"
#include "ioprocs.h"
+#include "multibyte.h"
#include <cstring>
@@ -19,22 +20,22 @@ st_format::st_format()
{
}
-const char *st_format::name() const
+const char *st_format::name() const noexcept
{
return "st";
}
-const char *st_format::description() const
+const char *st_format::description() const noexcept
{
return "Atari ST floppy disk image";
}
-const char *st_format::extensions() const
+const char *st_format::extensions() const noexcept
{
return "st";
}
-bool st_format::supports_save() const
+bool st_format::supports_save() const noexcept
{
return true;
}
@@ -52,17 +53,17 @@ void st_format::find_size(util::random_read &io, uint8_t &track_count, uint8_t &
track_count = head_count = sector_count = 0;
}
-int st_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int st_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
if(track_count)
- return 50;
+ return FIFID_SIZE;
return 0;
}
-bool st_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool st_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
uint8_t track_count, head_count, sector_count;
find_size(io, track_count, head_count, sector_count);
@@ -78,19 +79,18 @@ bool st_format::load(util::random_read &io, uint32_t form_factor, const std::vec
int track_size = sector_count*512;
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
- size_t actual;
- io.read_at((track*head_count + head)*track_size, sectdata, track_size, actual);
+ /*auto const [err, actual] =*/ read_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors and premature EOF
generate_track(atari_st_fcp_get_desc(track, head, head_count, sector_count),
track, head, sectors, sector_count, 100000, image);
}
}
- image->set_variant(floppy_image::DSDD);
+ image.set_variant(floppy_image::DSDD);
return true;
}
-bool st_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool st_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -115,8 +115,7 @@ bool st_format::save(util::random_read_write &io, const std::vector<uint32_t> &v
for(int track=0; track < track_count; track++) {
for(int head=0; head < head_count; head++) {
get_track_data_mfm_pc(track, head, image, 2000, 512, sector_count, sectdata);
- size_t actual;
- io.write_at((track*head_count + head)*track_size, sectdata, track_size, actual);
+ /*auto const [err, actual] =*/ write_at(io, (track*head_count + head)*track_size, sectdata, track_size); // FIXME: check for errors
}
}
@@ -128,22 +127,22 @@ msa_format::msa_format()
{
}
-const char *msa_format::name() const
+const char *msa_format::name() const noexcept
{
return "msa";
}
-const char *msa_format::description() const
+const char *msa_format::description() const noexcept
{
return "Atari MSA floppy disk image";
}
-const char *msa_format::extensions() const
+const char *msa_format::extensions() const noexcept
{
return "msa";
}
-bool msa_format::supports_save() const
+bool msa_format::supports_save() const noexcept
{
return true;
}
@@ -151,13 +150,12 @@ bool msa_format::supports_save() const
void msa_format::read_header(util::random_read &io, uint16_t &sign, uint16_t &sect, uint16_t &head, uint16_t &strack, uint16_t &etrack)
{
uint8_t h[10];
- size_t actual;
- io.read_at(0, h, 10, actual);
- sign = (h[0] << 8) | h[1];
- sect = (h[2] << 8) | h[3];
- head = (h[4] << 8) | h[5];
- strack = (h[6] << 8) | h[7];
- etrack = (h[8] << 8) | h[9];
+ /*auto const [err, actual] =*/ read_at(io, 0, h, 10); // FIXME: check for errors and premature EOF
+ sign = get_u16be(&h[0]);
+ sect = get_u16be(&h[2]);
+ head = get_u16be(&h[4]);
+ strack = get_u16be(&h[6]);
+ etrack = get_u16be(&h[8]);
}
bool msa_format::uncompress(uint8_t *buffer, int csize, int usize)
@@ -170,7 +168,7 @@ bool msa_format::uncompress(uint8_t *buffer, int csize, int usize)
if(csize-src < 3)
return false;
c = buffer[src++];
- int count = (buffer[src] << 8) | buffer[src+1];
+ int count = get_u16be(&buffer[src]);
src += 2;
if(usize-dst < count)
return false;
@@ -201,8 +199,8 @@ bool msa_format::compress(const uint8_t *buffer, int usize, uint8_t *dest, int &
return false;
dest[dst++] = 0xe5;
dest[dst++] = c;
- dest[dst++] = ncopy >> 8;
- dest[dst++] = ncopy;
+ put_u16be(&dest[dst], ncopy);
+ dst += 2;
} else {
src -= ncopy-1;
dest[dst++] = c;
@@ -214,7 +212,7 @@ bool msa_format::compress(const uint8_t *buffer, int usize, uint8_t *dest, int &
return dst < usize;
}
-int msa_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
+int msa_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint16_t sign, sect, head, strack, etrack;
read_header(io, sign, sect, head, strack, etrack);
@@ -224,11 +222,11 @@ int msa_format::identify(util::random_read &io, uint32_t form_factor, const std:
(head == 0 || head == 1) &&
strack <= etrack &&
etrack < 82)
- return 100;
+ return FIFID_SIGN | FIFID_STRUCT;
return 0;
}
-bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
+bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
uint16_t sign, sect, heads, strack, etrack;
read_header(io, sign, sect, heads, strack, etrack);
@@ -236,7 +234,7 @@ bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::ve
uint8_t sectdata[11*512];
desc_s sectors[11];
for(int i=0; i<sect; i++) {
- sectors[i].data = sectdata + 512*1;
+ sectors[i].data = sectdata + 512*i;
sectors[i].size = 512;
sectors[i].sector_id = i + 1;
}
@@ -246,12 +244,11 @@ bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::ve
for(int track=strack; track <= etrack; track++) {
for(int head=0; head <= heads; head++) {
- size_t actual;
uint8_t th[2];
- io.read_at(pos, th, 2, actual);
+ read_at(io, pos, th, 2); // FIXME: check for errors and premature EOF
pos += 2;
- int tsize = (th[0] << 8) | th[1];
- io.read_at(pos, sectdata, tsize, actual);
+ int tsize = get_u16be(th);
+ read_at(io, pos, sectdata, tsize); // FIXME: check for errors and premature EOF
pos += tsize;
if(tsize < track_size) {
if(!uncompress(sectdata, tsize, track_size))
@@ -262,12 +259,12 @@ bool msa_format::load(util::random_read &io, uint32_t form_factor, const std::ve
}
}
- image->set_variant(floppy_image::DSDD);
+ image.set_variant(floppy_image::DSDD);
return true;
}
-bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, floppy_image *image)
+bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const
{
int track_count, head_count, sector_count;
get_geometry_mfm_pc(image, 2000, track_count, head_count, sector_count);
@@ -300,8 +297,7 @@ bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &
if(io.seek(0, SEEK_SET))
return false;
- size_t actual;
- io.write(header, 10, actual);
+ write(io, header, 10); // FIXME: check for errors
uint8_t sectdata[11*512];
uint8_t compdata[11*512];
@@ -313,16 +309,14 @@ bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &
int csize;
if(compress(sectdata, track_size, compdata, csize)) {
uint8_t th[2];
- th[0] = csize >> 8;
- th[1] = csize;
- io.write(th, 2, actual);
- io.write(compdata, csize, actual);
+ put_u16be(th, csize);
+ write(io, th, 2); // FIXME: check for errors
+ write(io, compdata, csize); // FIXME: check for errors
} else {
uint8_t th[2];
- th[0] = track_size >> 8;
- th[1] = track_size;
- io.write(th, 2, actual);
- io.write(sectdata, track_size, actual);
+ put_u16be(th, track_size);
+ write(io, th, 2); // FIXME: check for errors
+ write(io, sectdata, track_size); // FIXME: check for errors
}
}
}
@@ -330,5 +324,5 @@ bool msa_format::save(util::random_read_write &io, const std::vector<uint32_t> &
return true;
}
-const floppy_format_type FLOPPY_ST_FORMAT = &floppy_image_format_creator<st_format>;
-const floppy_format_type FLOPPY_MSA_FORMAT = &floppy_image_format_creator<msa_format>;
+const st_format FLOPPY_ST_FORMAT;
+const msa_format FLOPPY_MSA_FORMAT;