diff options
author | 2018-04-24 18:24:33 +0200 | |
---|---|---|
committer | 2018-04-24 20:41:54 +0200 | |
commit | d43d8bcecf4a5515012f73165f72813ee21cd8e3 (patch) | |
tree | 65729d12be75dd06b8214d5ba21242cc7b5346fe /src/lib/formats/flopimg.cpp | |
parent | 8e39405a4216455f5ffb4246382991251236ebdb (diff) |
apple2: Add WOZ format [O. Galibert]
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) |