]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Don't miss disk index if mfmpos is increased by more than 1 bit
authorToni Wilen <twilen@winuae.net>
Fri, 14 Jan 2022 19:09:24 +0000 (21:09 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 14 Jan 2022 19:09:24 +0000 (21:09 +0200)
disk.cpp

index 5a968340db68d1e6aa1964d759bc1a0eb604ac0a..1e053932425c185cc9eee421cef6cb273834dff4 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -1853,7 +1853,7 @@ static bool drive_diskready(drive *drv)
        return drv->dskready;
 }
 
-static bool drive_at_index(drive *drv, int mfmBitPosition)
+static bool drive_at_index(drive *drv, int pmfmBitPosition, int mfmBitPosition)
 {
 #ifdef FLOPPYBRIDGE
        if (drv->bridge) {
@@ -1861,7 +1861,17 @@ static bool drive_at_index(drive *drv, int mfmBitPosition)
                return v;
        }
 #endif
-       return mfmBitPosition == drv->indexoffset;
+       if (mfmBitPosition == drv->indexoffset) {
+               return true;
+       }
+       while (pmfmBitPosition != mfmBitPosition) {
+               pmfmBitPosition++;
+               pmfmBitPosition %= drv->tracklen;
+               if (pmfmBitPosition == drv->indexoffset) {
+                       return true;
+               }
+       }
+       return false;
 }
 
 static bool drive_running (drive * drv)
@@ -3800,7 +3810,7 @@ static void disk_doupdate_write(int floppybits, int trackspeed)
                                drive *drv2 = &floppy[dr];
                                drv2->mfmpos++;
                                drv2->mfmpos %= drv2->tracklen;
-                               if (drive_at_index(drv2, drv2->mfmpos)) {
+                               if (drive_at_index(drv2, drv2->mfmpos, drv2->mfmpos)) {
                                        do_disk_index();
                                }
                        }
@@ -3932,12 +3942,13 @@ static void disk_doupdate_predict (int startcycle)
                                if (dskdmaen != DSKDMA_READ && (tword & 0xffff) == dsksync && dsksync != 0)
                                        diskevent_flag |= DISK_WORDSYNC;
                        }
+                       int pmfmpos = mfmpos;
                        mfmpos += inc;
                        mfmpos %= drv->tracklen;
                        if (!dskdmaen) {
                                if (mfmpos == 0)
                                        diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
-                               if (drive_at_index(drv, mfmpos))
+                               if (drive_at_index(drv, pmfmpos, mfmpos))
                                        diskevent_flag |= DISK_INDEXSYNC;
                        }
                        if (dskdmaen != DSKDMA_WRITE && mfmpos == drv->skipoffset) {
@@ -3948,7 +3959,7 @@ static void disk_doupdate_predict (int startcycle)
                                        if (!dskdmaen) {
                                                if (mfmpos == 0)
                                                        diskevent_flag |= DISK_REVOLUTION << (drv - floppy);
-                                               if (drive_at_index(drv, mfmpos))
+                                               if (drive_at_index(drv, mfmpos, mfmpos))
                                                        diskevent_flag |= DISK_INDEXSYNC;
                                        }
                                }
@@ -4144,15 +4155,16 @@ static void disk_doupdate_read (drive * drv, int floppybits)
                        word >>= 1;
                        return;
                }
+               int pmfmpos = drv->mfmpos;
                drv->mfmpos += inc;
                drv->mfmpos %= drv->tracklen;
-               if (drive_at_index(drv, drv->mfmpos)) {
+               if (drive_at_index(drv, pmfmpos, drv->mfmpos)) {
                        if (disk_debug_logging > 2 && drv->indexhack)
                                write_log (_T("indexhack cleared\n"));
                        drv->indexhack = 0;
                        do_disk_index ();
                }
-               if (drv->mfmpos == 0) {
+               if (pmfmpos > drv->mfmpos || drv->mfmpos == 0) {
                        fetchnextrevolution (drv);
                        if (drv->tracktiming[0])
                                updatetrackspeed (drv, drv->mfmpos);
@@ -4162,7 +4174,7 @@ static void disk_doupdate_read (drive * drv, int floppybits)
                        while (skipcnt-- > 0) {
                                drv->mfmpos += nextbit(drv);
                                drv->mfmpos %= drv->tracklen;
-                               if (drive_at_index(drv, drv->mfmpos)) {
+                               if (drive_at_index(drv, drv->mfmpos, drv->mfmpos)) {
                                        if (disk_debug_logging > 2 && drv->indexhack)
                                                write_log (_T("indexhack cleared\n"));
                                        drv->indexhack = 0;