From 35d7c11f918e79f2e244afd32c6e9f71bb275a20 Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 20 Nov 2024 18:28:31 -0500 Subject: vt_dsk: Regression fixes for loading and saving both disk formats - Remember to put in a flux change at the start of each bit - Revert flux_to_image bitstream generator to as it was before 08f28cee11ce94e6656d4924c7a3c30614811783 (new version simply didn't work) --- src/lib/formats/vt_dsk.cpp | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/lib/formats/vt_dsk.cpp b/src/lib/formats/vt_dsk.cpp index 8792ba86525..040d24b4fb9 100644 --- a/src/lib/formats/vt_dsk.cpp +++ b/src/lib/formats/vt_dsk.cpp @@ -21,6 +21,7 @@ void vtech_common_format::wbit(std::vector &buffer, uint32_t &pos, bool bit) { + buffer.push_back(pos | floppy_image::MG_F); if(bit) { pos += 2237; buffer.push_back(pos | floppy_image::MG_F); @@ -93,37 +94,29 @@ std::vector vtech_common_format::flux_to_image(const floppy_image &imag continue; std::vector bitstream; - int cpos = 0; - while((buffer[cpos] & floppy_image::MG_MASK) != floppy_image::MG_F) { - cpos++; - if(cpos == sz) { - cpos = -1; - break; + int lpos = -1; + bool looped = !((buffer[sz-1] ^ buffer[0]) & floppy_image::MG_MASK); + int cpos = looped ? sz-1 : 0; + while(cpos != lpos) { + int dt = looped && cpos == sz-1 ? (200000000 - (buffer[cpos] & floppy_image::TIME_MASK)) + (buffer[1] & floppy_image::TIME_MASK) : + cpos == sz-1 ? 200000000 - (buffer[cpos] & floppy_image::TIME_MASK) : + (buffer[cpos+1] & floppy_image::TIME_MASK) - (buffer[cpos] & floppy_image::TIME_MASK); + int t = dt >= 9187 - 143 ? 0 : + dt >= 2237 - 143 && dt <= 2237 + 143 ? 1 : + 2; + if(t <= 1) { + if(lpos == -1) + lpos = cpos; + bitstream.push_back(t); } - } - if(cpos == -1) - continue; - for(;;) { - int npos = cpos; - for(;;) { - npos++; - if(npos == sz) - npos = 0; - if((buffer[npos] & floppy_image::MG_MASK) == floppy_image::MG_F) - break; - } - int dt = (buffer[npos] & floppy_image::TIME_MASK) - (buffer[cpos] & floppy_image::TIME_MASK); - if(dt < 0) - cpos += 200000000; - bitstream.push_back(dt < 9187 - 143); - if(npos <= cpos) - break; - cpos = npos; + cpos += 1; + if(cpos == sz) + cpos = looped ? 1 : 0; } int mode = 0; int pos = 0; int count = 0; - bool looped = false; + looped = false; uint8_t *dest = nullptr; [[maybe_unused]] uint16_t checksum = 0; uint64_t buf = 0; -- cgit v1.2.3