]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix future disk event prediction.
authorToni Wilen <twilen@winuae.net>
Sat, 2 Dec 2023 17:55:52 +0000 (19:55 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 2 Dec 2023 17:55:52 +0000 (19:55 +0200)
custom.cpp
disk.cpp
include/disk.h

index 4c3e51723716e49b4c69b7e459394aa5af2e710b..702bdd6011dd13ff24f28266347970b15e6c8186 100644 (file)
@@ -8874,6 +8874,7 @@ static void ADKCON(int hpos, uae_u16 v)
        DISK_update(hpos);
        DISK_update_adkcon(hpos, v);
        setclr(&adkcon, v);
+       DISK_update_predict();
        audio_update_adkmasks();
 #ifdef SERIAL_PORT
        if ((v >> 11) & 1) {
index 61d2c66c439a056d0e429c2502d2af4083d1b6d1..957ebe955788935a9a2c20a820c348da10429fcc 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -141,6 +141,7 @@ static int prev_step;
 static bool initial_disk_statusline;
 static struct diskinfo disk_info_data = { 0 };
 static bool amax_enabled;
+static bool disk_strobe;
 
 typedef enum { TRACK_AMIGADOS, TRACK_RAW, TRACK_RAW1, TRACK_PCDOS, TRACK_DISKSPARE, TRACK_NONE } image_tracktype;
 typedef struct {
@@ -3900,6 +3901,7 @@ void DSKDAT(uae_u16 v)
        fifo_inuse[0] = iswrite() ? 2 : 1;
        fifo[0] = v;
        fifo_filled = 1;
+       disk_strobe = false;
 }
 
 uae_u16 DSKDATR(int slot)
@@ -3927,6 +3929,7 @@ uae_u16 DSKDATR(int slot)
                        disk_dmafinished();
                }
        }
+       disk_strobe = false;
        return v;
 }
 
@@ -3944,26 +3947,9 @@ static void do_disk_index (void)
 void event_DISK_handler(uae_u32 data)
 {
        int flag = data & 255;
-       int disk_sync_cycle = data >> 8;
 
-       DISK_update(disk_sync_cycle);
-
-       if (!dskdmaen) {
-               if (flag & (DISK_REVOLUTION << 0))
-                       fetchnextrevolution(&floppy[0]);
-               if (flag & (DISK_REVOLUTION << 1))
-                       fetchnextrevolution(&floppy[1]);
-               if (flag & (DISK_REVOLUTION << 2))
-                       fetchnextrevolution(&floppy[2]);
-               if (flag & (DISK_REVOLUTION << 3))
-                       fetchnextrevolution(&floppy[3]);
-       }
-       if (flag & DISK_WORDSYNC) {
-               INTREQ_INT(12, 0);
-       }
-       if (flag & DISK_INDEXSYNC) {
-               do_disk_index();
-       }
+       DISK_update(current_hpos());
+       DISK_update_predict();
 }
 
 static void loaddskbytr(int bits, int speed)
@@ -4111,12 +4097,14 @@ static void updatetrackspeed (drive *drv, int mfmpos)
        }
 }
 
-static void disk_doupdate_predict (int startcycle)
+void DISK_update_predict(void)
 {
        int finaleventcycle = maxhpos << 8;
        int finaleventflag = 0;
        bool noselected = true;
 
+       int startcycle = disk_hpos;
+
        for (int dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
                drive *drv = &floppy[dr];
                
@@ -4130,7 +4118,7 @@ static void disk_doupdate_predict (int startcycle)
                bool isempty = drive_empty(drv);
                bool isunformatted = unformatted(drv);
                int mfmpos = drv->mfmpos;
-               bool dsksync_on2 = dsksync_on;
+               bool tdsksync_on = dsksync_on;
                if (drv->tracktiming[0])
                        updatetrackspeed (drv, mfmpos);
                int diskevent_flag = 0;
@@ -4153,11 +4141,11 @@ static void disk_doupdate_predict (int startcycle)
                                                tword |= getonebit(drv, drv->bigmfmbuf, mfmpos, &inc);
                                }
                                if ((tword & 0xffff) != dsksync) {
-                                       dsksync_on2 = false;
+                                       tdsksync_on = false;
                                }
-                               if (dskdmaen != DSKDMA_READ && (tword & 0xffff) == dsksync && !dsksync_on2) {
+                               if ((tword & 0xffff) == dsksync && !tdsksync_on) {
                                        diskevent_flag |= DISK_WORDSYNC;
-                                       dsksync_on2 = true;
+                                       tdsksync_on = true;
                                }
                        }
                        int pmfmpos = mfmpos;
@@ -4224,7 +4212,7 @@ static void disk_doupdate_predict (int startcycle)
                }
        }
        if (finaleventflag && (finaleventcycle >> 8) < maxhpos) {
-               event2_newevent_x_replace((finaleventcycle - startcycle) >> 8, ((finaleventcycle >> 8) << 8) | finaleventflag, event_DISK_handler);
+               event2_newevent_x_replace((finaleventcycle - startcycle) >> 8, finaleventflag, event_DISK_handler);
        }
 }
 
@@ -4275,16 +4263,16 @@ static int doreaddma(void)
 
 static void wordsync_detected(bool startup)
 {
+       if (!dsksync_on) {
+               INTREQ_INT(12, 0);
+               dsksync_on = true;
+       }
        if (dskdmaen != DSKDMA_OFF) {
                int prev_dma_enabled = dma_enable;
                if (!startup) {
                        dma_enable = 1;
                }
-               if (!dsksync_on) {
-                       INTREQ_INT(12, 0);
-                       dsksync_on = true;
-               }
-               if ((disk_debug_logging && dma_enable == 0)) {
+               if (disk_debug_logging) {
                        int pos = -1;
                        for (int i = 0; i < MAX_FLOPPY_DRIVES; i++) {
                                drive *drv = &floppy[i];
@@ -4293,8 +4281,8 @@ static void wordsync_detected(bool startup)
                                        break;
                                }
                        }
-                       write_log(_T("Sync match %04x mfmpos %d enable %d->%d bcnt %d wordsync %d\n"),
-                               dsksync, pos, prev_dma_enabled, dma_enable, bitoffset, (adkcon & 0x0400) != 0);
+                       write_log(_T("Sync match %04x mfmpos %d enable %d->%d bcnt %d ADKCON %04x PC=%08x\n"),
+                               dsksync, pos, prev_dma_enabled, dma_enable, bitoffset, adkcon, M68K_GETPC);
                        if (disk_debug_logging > 1)
                                dumpdisk(_T("SYNC"));
                }
@@ -4501,6 +4489,7 @@ uae_u16 DSKBYTR(int hpos)
        uae_u16 v;
 
        DISK_update(hpos);
+       DISK_update_predict();
        if (dskbytr_delay) {
                v = dskbytr_val_prev;
                dskbytr_val_prev &= ~0x8000;
@@ -4682,6 +4671,7 @@ void DISK_hsync (void)
                return;
        }
        DISK_update (maxhpos);
+       DISK_update_predict();
 
        // show insert disk in df0: when booting
        if (initial_disk_statusline) {
@@ -4778,11 +4768,9 @@ void DISK_update (int tohpos)
                update_jitter();
                done_jitter = true;
        }
-       // predict events in next line
-       disk_doupdate_predict (disk_hpos);
 }
 
-void DSKLEN (uae_u16 v, int hpos)
+static void DSKLEN_2(uae_u16 v, int hpos)
 {
        int dr;
        int prevlen = dsklen2;
@@ -4791,13 +4779,11 @@ void DSKLEN (uae_u16 v, int hpos)
        int motormask;
        bool weirddma = false;
 
-       DISK_update (hpos);
-
        dsklen2 = dsklen = v;
        dsklength2 = dsklength = dsklen & 0x3fff;
 
        if ((v & 0x8000) && !(prevlen & 0x8000)) {
-               bitoffset = 15;
+               //bitoffset = 15;
        }
        if ((v & 0x8000) && (prevlen & 0x8000)) {
                if (dskdmaen == DSKDMA_READ && !(v & 0x4000)) {
@@ -4899,12 +4885,14 @@ void DSKLEN (uae_u16 v, int hpos)
        }
        if (dr == 4) {
                if (!amax_enabled) {
+                       write_log("\n");
                        write_log (_T("disk %s DMA started, drvmask=%x motormask=%x PC=%08x\n"),
                                dskdmaen == DSKDMA_WRITE ? _T("write") : _T("read"), selected ^ 15, motormask, M68K_GETPC);
                }
                noselected = 1;
        } else {
                if (disk_debug_logging > 0) {
+                       write_log("\n");
                        write_log (_T("disk %s DMA started, drvmask=%x track %d mfmpos %d dmaen=%d PC=%08X\n"),
                                dskdmaen == DSKDMA_WRITE ? _T("write") : _T("read"), selected ^ 15,
                                floppy[dr].cyl * 2 + side, floppy[dr].mfmpos, dma_enable, M68K_GETPC);
@@ -5078,6 +5066,13 @@ void DSKLEN (uae_u16 v, int hpos)
        }
 }
 
+void DSKLEN(uae_u16 v, int hpos)
+{
+       DISK_update(hpos);
+       DSKLEN_2(v, hpos);
+       DISK_update_predict();
+}
+
 void DISK_update_adkcon (int hpos, uae_u16 v)
 {
        uae_u16 vold = adkcon;
@@ -5092,8 +5087,8 @@ void DISK_update_adkcon (int hpos, uae_u16 v)
 
 void DSKSYNC(int hpos, uae_u16 v)
 {
+       DISK_update(hpos);
        if (v != dsksync) {
-               DISK_update(hpos);
                dsksync = v;
                dsksync_on = false;
        }
@@ -5101,6 +5096,7 @@ void DSKSYNC(int hpos, uae_u16 v)
                INTREQ_INT(12, 0);
                dsksync_on = true;
        }
+       DISK_update_predict();
 }
 
 uae_u16 disk_dmal(void)
@@ -5124,6 +5120,7 @@ uae_u16 disk_dmal(void)
                        dmal = 16 * (fifo_inuse[0] ? 1 : 0) + 4 * (fifo_inuse[1] ? 1 : 0) + 1 * (fifo_inuse[2] ? 1 : 0);
                }
        }
+       disk_strobe = true;
        return dmal;
 }
 
index d9fd67cd62b5b774d0cee943e61861e278716d55..7da217fd62d8118c43d5457461a65c0deb69402a 100644 (file)
@@ -79,7 +79,8 @@ extern void disk_insert_force (int num, const TCHAR *name, bool forcedwriteprote
 extern void DISK_vsync (void);
 extern int DISK_validate_filename (struct uae_prefs *p, const TCHAR *fname, int num, TCHAR *outfname, int leave_open, bool *wrprot, uae_u32 *crc32, struct zfile **zf);
 extern void DISK_handler (uae_u32);
-extern void DISK_update (int hpos);
+extern void DISK_update(int hpos);
+extern void DISK_update_predict(void);
 extern void DISK_update_adkcon (int hpos, uae_u16 v);
 extern void DISK_hsync (void);
 extern void DISK_reset (void);