diff options
Diffstat (limited to 'src/lib/formats/flopimg.cpp')
-rw-r--r-- | src/lib/formats/flopimg.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/lib/formats/flopimg.cpp b/src/lib/formats/flopimg.cpp index d517c240a80..4ffe3e720ad 100644 --- a/src/lib/formats/flopimg.cpp +++ b/src/lib/formats/flopimg.cpp @@ -1679,16 +1679,24 @@ 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) +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) { - // Maximal number of cells which happens when the buffer is all 1 + if(splice >= track_size) + splice = 0; + std::vector<uint32_t> &dest = image->get_buffer(track, head, subtrack); dest.clear(); + 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; + uint32_t cbit = floppy_image::MG_A; uint32_t count = 0; for(int i=0; i != track_size; i++) - if(trackbuf[i >> 3] & (0x80 >> (i & 7))) { + if((i == invert_splice) ^ !!(trackbuf[i >> 3] & (0x80 >> (i & 7)))) { dest.push_back(cbit | (count+1)); cbit = cbit == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A; count = 1; @@ -1699,7 +1707,8 @@ void floppy_image_format_t::generate_track_from_bitstream(int track, int head, c dest.push_back(cbit | count); normalize_times(dest); - image->set_write_splice_position(track, head, 0, subtrack); + 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) |