summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ariedlmayer@gmail.com>2024-11-20 18:28:31 -0500
committer AJR <ariedlmayer@gmail.com>2024-11-20 18:32:14 -0500
commit35d7c11f918e79f2e244afd32c6e9f71bb275a20 (patch)
tree7be7b67f1167e703c2f5005fb7e81df57676c2dc
parent91f524670550bb935a38c929e7469c9afb379595 (diff)
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)
-rw-r--r--src/lib/formats/vt_dsk.cpp45
1 files 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<uint32_t> &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<uint8_t> vtech_common_format::flux_to_image(const floppy_image &imag
continue;
std::vector<bool> 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;