]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Only Paula checks DMAEN when deciding if audio/disk DMA request needs to be generated...
authorToni Wilen <twilen@winuae.net>
Fri, 10 Jul 2020 18:39:40 +0000 (21:39 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 10 Jul 2020 18:39:40 +0000 (21:39 +0300)
audio.cpp
custom.cpp
disk.cpp

index 1cec1263427f05155a4d0410f590c77d00ff7e12..b537b7a8c776de4a6e5a90e0921c2e0b4092a658 100644 (file)
--- a/audio.cpp
+++ b/audio.cpp
@@ -1456,26 +1456,33 @@ static void newsample (int nr, sample8_t sample)
        }
 }
 
-STATIC_INLINE void setdr (int nr)
+static void setdr(int nr, bool startup)
 {
        struct audio_channel_data *cdp = audio_channel + nr;
 #if TEST_AUDIO > 0
        if (debugchannel (nr) && cdp->dr)
                write_log (_T("%d: DR already active (STATE=%d)\n"), nr, cdp->state);
 #endif
-       cdp->drhpos = current_hpos ();
+       if (dmaen(DMA_MASTER)) {
 
 #if DEBUG_AUDIO > 0
-       if (debugchannel(nr) && cdp->wlen <= 2)
-               write_log(_T("DR%d=%d LEN=%d/%d PT=%08X PC=%08X\n"), nr, cdp->dr, cdp->wlen, cdp->len, cdp->pt, M68K_GETPC);
+               if (debugchannel(nr) && cdp->wlen <= 2)
+                       write_log(_T("DR%d=%d LEN=%d/%d PT=%08X PC=%08X\n"), nr, cdp->dr, cdp->wlen, cdp->len, cdp->pt, M68K_GETPC);
 #endif
-       cdp->dr = true;
+               cdp->dr = true;
+               cdp->drhpos = current_hpos();
 
-       if (cdp->wlen == 1) {
-               cdp->dsr = true;
+               if (!startup && cdp->wlen == 1) {
+                       cdp->dsr = true;
 #if DEBUG_AUDIO > 0
-               if (debugchannel (nr))
-                       write_log (_T("DSR%d=1 PT=%08X PC=%08X\n"), nr, cdp->pt, M68K_GETPC);
+                       if (debugchannel(nr))
+                               write_log(_T("DSR%d=1 PT=%08X PC=%08X\n"), nr, cdp->pt, M68K_GETPC);
+#endif
+               }
+       } else {
+#if DEBUG_AUDIO > 0
+               if (debugchannel(nr))
+                       write_log(_T("setdr%d ignored, DMA disabled PT=%08X PC=%08X\n"), nr, cdp->pt, M68K_GETPC);
 #endif
        }
 }
@@ -1596,8 +1603,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                if (chan_ena) {
                        cdp->evtime = MAX_EV;
                        cdp->state = 1;
-                       cdp->dr = true;
-                       cdp->drhpos = hpos;
+                       setdr(nr, true);
                        cdp->wlen = cdp->len;
                        cdp->ptx_written = false;
                        /* Some programs first start short empty sample and then later switch to
@@ -1650,7 +1656,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                cdp->losample = cdp->hisample = false;
 #endif
                setirq (nr, 10);
-               setdr (nr);
+               setdr(nr, false);
                if (cdp->wlen != 1)
                        cdp->wlen = (cdp->wlen - 1) & 0xffff;
                cdp->state = 5;
@@ -1675,7 +1681,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                }
                loaddat (nr);
                if (napnav)
-                       setdr (nr);
+                       setdr(nr, false);
                cdp->state = 2;
                loadper (nr);
                cdp->pbufldl = true;
@@ -1713,7 +1719,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                        loaddat (nr, true);
                if (chan_ena) {
                        if (audap)
-                               setdr (nr);
+                               setdr(nr, false);
                        if (cdp->intreq2 && audap)
                                setirq (nr, 21);
                } else {
@@ -1755,7 +1761,7 @@ static void audio_state_channel2 (int nr, bool perfin)
                        if (cdp->intreq2 && napnav)
                                setirq (nr, 31);
                        if (napnav)
-                               setdr (nr);
+                               setdr(nr, false);
                } else {
                        if (isirq (nr)) {
 #if DEBUG_AUDIO > 0
index 74a97bf77c726e9876de0f2c5c898e04debaf1c5..d9168e0a071570885e1d2e7f20b27ddb0eab700c 100644 (file)
@@ -8531,14 +8531,12 @@ static void hsync_scandoubler (void)
        }
 }
 
-static void events_dmal (int);
+static void events_dmal(int);
 static uae_u16 dmal, dmal_hpos;
 
-static void dmal_emu (uae_u32 v)
+static void dmal_emu(uae_u32 v)
 {
-       // Disk and Audio DMA bits are ignored by Agnus, Agnus only checks DMAL and master bit
-       if (!(dmacon & DMA_MASTER))
-               return;
+       // Disk and Audio DMA bits are ignored by Agnus. Including DMA master bit.
        int hpos = current_hpos ();
        if (v >= 6) {
                v -= 6;
@@ -8581,23 +8579,23 @@ static void dmal_emu (uae_u32 v)
        }
 }
 
-static void dmal_func (uae_u32 v)
+static void dmal_func(uae_u32 v)
 {
        dmal_emu (v);
        events_dmal (0);
 }
 
-static void dmal_func2 (uae_u32 v)
+static void dmal_func2(uae_u32 v)
 {
        while (dmal) {
                if (dmal & 3)
-                       dmal_emu (dmal_hpos + ((dmal & 2) ? 1 : 0));
+                       dmal_emu(dmal_hpos + ((dmal & 2) ? 1 : 0));
                dmal_hpos += 2;
                dmal >>= 2;
        }
 }
 
-static void events_dmal (int hp)
+static void events_dmal(int hp)
 {
        if (!dmal)
                return;
@@ -8609,33 +8607,33 @@ static void events_dmal (int hp)
                        dmal >>= 2;
                        dmal_hpos += 2;
                }
-               event2_newevent2 (hp, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func);
+               event2_newevent2(hp, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func);
                dmal &= ~3;
        } else if (currprefs.cachesize) {
-               dmal_func2 (0);
+               dmal_func2(0);
        } else {
-               event2_newevent2 (hp, 13, dmal_func2);
+               event2_newevent2(hp, 13, dmal_func2);
        }
 }
 
-static void events_dmal_hsync (void)
+static void events_dmal_hsync(void)
 {
        if (dmal)
                write_log (_T("DMAL error!? %04x\n"), dmal);
-       dmal = audio_dmal ();
+       dmal = audio_dmal();
        dmal <<= 6;
-       dmal |= disk_dmal ();
+       dmal |= disk_dmal();
        if (!dmal)
                return;
        dmal_hpos = 0;
        if (currprefs.cpu_memory_cycle_exact) {
                for (int i = 0; i < 6 + 8; i += 2) {
                        if (dmal & (3 << i)) {
-                               alloc_cycle_ext (i + 7, CYCLE_MISC);
+                               alloc_cycle_ext(i + 7, CYCLE_MISC);
                        }
                }
        }
-       events_dmal (7);
+       events_dmal(7);
 }
 
 static void lightpen_trigger_func(uae_u32 v)
index 3c35283550ed4bf1a38a7652169dae4b9585980d..46fd21c83e90c5b83dfbba1a812f9d0c295e33c6 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -3444,7 +3444,7 @@ static void disk_doupdate_write(int floppybits, int trackspeed)
                                }
                        }
                }
-               if (dmaen (DMA_DISK) && dskdmaen == DSKDMA_WRITE && dsklength > 0 && fifo_filled) {
+               if (dmaen(DMA_DISK) && dmaen(DMA_MASTER) && dskdmaen == DSKDMA_WRITE && dsklength > 0 && fifo_filled) {
                        bitoffset++;
                        bitoffset &= 15;
                        if (!bitoffset) {
@@ -3597,7 +3597,7 @@ int disk_fifostatus (void)
 
 static int doreaddma (void)
 {
-       if (dmaen (DMA_DISK) && bitoffset == 15 && dma_enable && dskdmaen == DSKDMA_READ && dsklength >= 0) {
+       if (dmaen(DMA_DISK) && dmaen(DMA_MASTER) && bitoffset == 15 && dma_enable && dskdmaen == DSKDMA_READ && dsklength >= 0) {
                if (dsklength > 0) {
                        // DSKLEN == 1: finish without DMA transfer.
                        if (dsklength == 1 && dsklength2 == 1) {
@@ -3794,7 +3794,7 @@ uae_u16 DSKBYTR (int hpos)
                        dumpdisk(_T("DSKBYTR SYNC"));
                }
        }
-       if (dskdmaen != DSKDMA_OFF && dmaen (DMA_DISK))
+       if (dskdmaen != DSKDMA_OFF && dmaen(DMA_DISK) && dmaen(DMA_MASTER))
                v |= 0x4000;
        if (dsklen & 0x4000)
                v |= 0x2000;