From 85cf6e06339a755ff9d22afcfc65ca764ed0e4cb Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 1 Aug 2018 12:57:38 +0300 Subject: [PATCH] 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. --- qemuvga/esp.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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) -- 2.47.3