summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/flopimg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/flopimg.cpp')
-rw-r--r--src/lib/formats/flopimg.cpp66
1 files changed, 58 insertions, 8 deletions
diff --git a/src/lib/formats/flopimg.cpp b/src/lib/formats/flopimg.cpp
index ec978817a6e..fa4903447fb 100644
--- a/src/lib/formats/flopimg.cpp
+++ b/src/lib/formats/flopimg.cpp
@@ -39,6 +39,39 @@ floppy_image::~floppy_image()
{
}
+void floppy_image::set_variant(uint32_t _variant)
+{
+ variant = _variant;
+
+ // Initialize hard sectors
+ index_array.clear();
+
+ uint32_t sectors;
+ switch(variant) {
+ case SSDD16:
+ case SSQD16:
+ case DSDD16:
+ case DSQD16:
+ sectors = 16;
+ break;
+ default:
+ sectors = 0;
+ }
+ if(sectors) {
+ uint32_t sector_angle = 200000000/sectors;
+ for(int i = 1; i < sectors; i++)
+ index_array.push_back(i*sector_angle);
+ index_array.push_back((sectors-1)*sector_angle + sector_angle/2);
+ }
+}
+
+void floppy_image::find_index_hole(uint32_t pos, uint32_t &last, uint32_t &next) const
+{
+ auto nexti = std::lower_bound(index_array.begin(), index_array.end(), pos+1);
+ next = nexti == index_array.end() ? 200000000 : *nexti;
+ last = nexti == index_array.begin() ? 0 : *--nexti;
+}
+
void floppy_image::get_maximal_geometry(int &_tracks, int &_heads) const noexcept
{
_tracks = tracks;
@@ -104,13 +137,30 @@ bool floppy_image::track_is_formatted(int track, int head, int subtrack) const n
const char *floppy_image::get_variant_name(uint32_t form_factor, uint32_t variant) noexcept
{
switch(variant) {
- case SSSD: return "Single side, single density";
- case SSDD: return "Single side, double density";
- case SSQD: return "Single side, quad density";
- case DSDD: return "Double side, double density";
- case DSQD: return "Double side, quad density";
- case DSHD: return "Double side, high density";
- case DSED: return "Double side, extended density";
+ case SSSD: return "Single side, single density";
+ case SSSD10: return "Single side, single density, 10-sector";
+ case SSSD16: return "Single side, single density, 16-sector";
+ case SSSD32: return "Single side, single density, 32-sector";
+ case SSDD: return "Single side, double density";
+ case SSDD10: return "Single side, double density, 10-sector";
+ case SSDD16: return "Single side, double density, 16 hard sector";
+ case SSDD32: return "Single side, double density, 32-sector";
+ case SSQD: return "Single side, quad density";
+ case SSQD10: return "Single side, quad density, 10-sector";
+ case SSQD16: return "Single side, quad density, 16 hard sector";
+ case DSSD: return "Double side, single density";
+ case DSSD10: return "Double side, single density, 10-sector";
+ case DSSD16: return "Double side, single density, 16-sector";
+ case DSSD32: return "Double side, single density, 32-sector";
+ case DSDD: return "Double side, double density";
+ case DSDD10: return "Double side, double density, 10-sector";
+ case DSDD16: return "Double side, double density, 16 hard sector";
+ case DSDD32: return "Double side, double density, 32-sector";
+ case DSQD: return "Double side, quad density";
+ case DSQD10: return "Double side, quad density, 10-sector";
+ case DSQD16: return "Double side, quad density, 16 hard sector";
+ case DSHD: return "Double side, high density";
+ case DSED: return "Double side, extended density";
}
return "Unknown";
}
@@ -864,7 +914,7 @@ void floppy_image_format_t::generate_track_from_bitstream(int track, int head, c
normalize_times(dest, track_size*2);
- if(splice >= 0 || splice < track_size) {
+ if(splice >= 0 && splice < track_size) {
int splpos = uint64_t(200000000) * splice / track_size;
image.set_write_splice_position(track, head, splpos, subtrack);
}