From: Toni Wilen Date: Fri, 14 Jan 2022 19:09:24 +0000 (+0200) Subject: Don't miss disk index if mfmpos is increased by more than 1 bit X-Git-Tag: 4910~21 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=4a57d2cf210ace919f5dd73213cba6d0395a7d90;p=francis%2Fwinuae.git Don't miss disk index if mfmpos is increased by more than 1 bit --- diff --git a/disk.cpp b/disk.cpp index 5a968340..1e053932 100644 --- 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;