From: Toni Wilen Date: Wed, 1 Aug 2018 09:57:38 +0000 (+0300) Subject: Do not simply clear DMA counter. Less than requested number of bytes may have been... X-Git-Tag: 4100~133 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=85cf6e06339a755ff9d22afcfc65ca764ed0e4cb;p=francis%2Fwinuae.git Do not simply clear DMA counter. Less than requested number of bytes may have been transferred. Fixes some HD controllers (53F94 based Blizzards for example) returning too large HD_SCSICMD scsi_Actual value. --- diff --git a/qemuvga/esp.cpp b/qemuvga/esp.cpp index 7616068b..63c027db 100644 --- a/qemuvga/esp.cpp +++ b/qemuvga/esp.cpp @@ -334,10 +334,13 @@ static void esp_dma_done(ESPState *s) s->rregs[ESP_RSTAT] |= STAT_TC; s->rregs[ESP_RINTR] = INTR_BS; s->rregs[ESP_RSEQ] = 0; - s->rregs[ESP_TCLO] = 0; - s->rregs[ESP_TCMID] = 0; - s->rregs[ESP_TCHI] = 0; - esp_raise_irq(s); + + s->dma_counter -= s->dma_len; + s->rregs[ESP_TCLO] = s->dma_counter; + s->rregs[ESP_TCMID] = s->dma_counter >> 8; + s->rregs[ESP_TCHI] = s->dma_counter >> 16; + + esp_raise_irq(s); } static int esp_do_dma(ESPState *s)