summaryrefslogtreecommitdiffstats
path: root/src/lib/formats/flopimg.cpp
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2018-05-29 20:07:11 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2018-05-29 20:07:11 +1000
commit2336a228e740c954cdbaf0f64cc96aab3b0b94e9 (patch)
treeaa5001de80e4f70ba9832aacaae327712cc8d809 /src/lib/formats/flopimg.cpp
parentbdb91883e30d21aa141100c18a90ac9314f7849d (diff)
parent80dacaa17ce65e00e689583c0ccae055e292fbba (diff)
Merge remote-tracking branch 'upstream/release0198'
Diffstat (limited to 'src/lib/formats/flopimg.cpp')
-rw-r--r--src/lib/formats/flopimg.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/lib/formats/flopimg.cpp b/src/lib/formats/flopimg.cpp
index 4ffe3e720ad..3d05ec38d03 100644
--- a/src/lib/formats/flopimg.cpp
+++ b/src/lib/formats/flopimg.cpp
@@ -1681,34 +1681,44 @@ void floppy_image_format_t::normalize_times(std::vector<uint32_t> &buffer)
void floppy_image_format_t::generate_track_from_bitstream(int track, int head, const uint8_t *trackbuf, int track_size, floppy_image *image, int subtrack, int splice)
{
- if(splice >= track_size)
- splice = 0;
-
std::vector<uint32_t> &dest = image->get_buffer(track, head, subtrack);
dest.clear();
+ // If the bitstream has an odd number of inversions, one needs to be added.
+ // Put in in the middle of the half window after the center inversion, where
+ // any fdc ignores it.
+
int inversions = 0;
for(int i=0; i != track_size; i++)
if(trackbuf[i >> 3] & (0x80 >> (i & 7)))
inversions++;
- int invert_splice = inversions & 1 ? splice : -1;
+ bool need_flux = inversions & 1;
uint32_t cbit = floppy_image::MG_A;
uint32_t count = 0;
for(int i=0; i != track_size; i++)
- if((i == invert_splice) ^ !!(trackbuf[i >> 3] & (0x80 >> (i & 7)))) {
- dest.push_back(cbit | (count+1));
+ if(trackbuf[i >> 3] & (0x80 >> (i & 7))) {
+ dest.push_back(cbit | (count+2));
cbit = cbit == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
- count = 1;
+ if(need_flux) {
+ need_flux = false;
+ dest.push_back(cbit | 1);
+ cbit = cbit == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
+ count = 1;
+ } else
+ count = 2;
} else
- count += 2;
+ count += 4;
if(count)
dest.push_back(cbit | count);
normalize_times(dest);
- int splpos = uint64_t(200000000) * splice / track_size;
- image->set_write_splice_position(track, head, splpos, subtrack);
+
+ if(splice >= 0 || splice < track_size) {
+ int splpos = uint64_t(200000000) * splice / track_size;
+ image->set_write_splice_position(track, head, splpos, subtrack);
+ }
}
void floppy_image_format_t::generate_track_from_levels(int track, int head, std::vector<uint32_t> &trackbuf, int splice_pos, floppy_image *image)