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.cpp17
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)