]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Support DSKLEN writes while DMA is active.
authorToni Wilen <twilen@winuae.net>
Sat, 3 Oct 2015 17:04:26 +0000 (20:04 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 3 Oct 2015 17:04:26 +0000 (20:04 +0300)
disk.cpp

index 7446e1060d459f239ae688ccec615bd8153c46b2..7a9ed264637d2bd201d8459f319eba8fef4d91e1 100644 (file)
--- a/disk.cpp
+++ b/disk.cpp
@@ -3785,7 +3785,12 @@ void DSKLEN (uae_u16 v, int hpos)
        dsklen = v;
        dsklength2 = dsklength = dsklen & 0x3fff;
 
-       if ((dsklen & 0x8000) && (prev & 0x8000)) {
+       if ((v & 0x8000) && (prev & 0x8000)) {
+               if (dskdmaen == DSKDMA_READ) {
+                       // update only currently active DMA length, don't change DMA state
+                       write_log(_T("warning: Disk read DMA length rewrite %d -> %d\n"), prev & 0x3fff, v & 0x3fff);
+                       return;
+               }
                dskdmaen = DSKDMA_READ;
                DISK_start ();
        }
@@ -3823,6 +3828,10 @@ void DSKLEN (uae_u16 v, int hpos)
                        disk_dmafinished ();
                        return;
                }
+               if (dskdmaen == DSKDMA_WRITE) {
+                       write_log(_T("warning: Disk write DMA length rewrite %d -> %d\n"), prev & 0x3fff, v & 0x3fff);
+                       return;
+               }
                dskdmaen = DSKDMA_WRITE;
                DISK_start ();
        }
@@ -4019,7 +4028,7 @@ void DSKSYNC (int hpos, uae_u16 v)
 
 STATIC_INLINE bool iswrite (void)
 {
-       return dskdmaen == 3;
+       return dskdmaen == DSKDMA_WRITE;
 }
 
 void DSKDAT (uae_u16 v)