From da882d26a5768c663010527b502490f8d325c7f8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 1 Aug 2021 22:45:50 +0800 Subject: [PATCH] DMA fall-back mode for md.asm driver --- Source/HBIOS/dma.asm | 13 ++++++++++++- Source/HBIOS/md.asm | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index 065c30e1..314a30b4 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -26,6 +26,8 @@ DMA_RESET .equ $c3 ;DMA_ENABLE_AFTER_RETI .equ $b7 ;DMA_REINIT_STATUS_BYTE .equ $8b ; +DMA_FBACK .equ TRUE +; ;================================================================================================== ; DMA INITIALIZATION CODE ;================================================================================================== @@ -67,9 +69,18 @@ DMA_NOTFOUND: push af call PRTSTRD .db " NOT PRESENT$" + +#IF (DMA_FBACK) + call PRTSTRD + .db ". USING SOFTWARE$" + LD A,ERR_NOHW + LD (DMA_FAIL_FLAG),A +#ENDIF pop af jr DMA_EXIT - +; +DMA_FAIL_FLAG: + .db 0 ; ;================================================================================================== ; DMA PROBE - WRITE TO ADDRESS REGISTER AND READ BACK diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 06c5327b..88acda0f 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -359,14 +359,28 @@ MD_SECM: LD DE,(MD_DSKBUF) ; #IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) +#IF (DMA_FBACK) + LD A,(DMA_FAIL_FLAG) + OR A + JR NZ,MD_NODMA +#ENDIF LD BC,512-1 ; COPY ONE 512B SECTOR FROM THE - CALL DMALDIR ; 4K SECTOR TO THE DISK BUFFER -#ELSE + JP DMALDIR ; 4K SECTOR TO THE DISK BUFFER +#ENDIF +MD_NODMA: +#IF (!(DMAENABLE & (DMAMODE=DMAMODE_ECB))) + LD BC,512 ; COPY ONE 512B SECTOR FROM THE + LDIR ; 4K SECTOR TO THE DISK BUFFER + XOR A + RET +#ELSE +#IF (DMA_FBACK) LD BC,512 ; COPY ONE 512B SECTOR FROM THE LDIR ; 4K SECTOR TO THE DISK BUFFER XOR A -#ENDIF RET +#ENDIF +#ENDIF ; ; SETUP DE:HL AS THE SECTOR ADDRESS TO READ OR WRITE ; @@ -479,14 +493,27 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER ; LD HL,(MD_DSKBUF) #IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) +#IF (DMA_FBACK) + LD A,(DMA_FAIL_FLAG) + OR A + JR NZ,MD_NODMA1 +#ENDIF LD BC,512-1 ; COPY ONE 512B SECTOR FROM THE CALL DMALDIR ; THE DISK BUFFER TO 4K SECTOR RET NZ ; EXIT IF DMA COPY ERROR -#ELSE + JR MD_NODMAERR +#ENDIF +MD_NODMA1: +#IF (!(DMAENABLE & (DMAMODE=DMAMODE_ECB))) LD BC,512 ; COPY ONE 512B SECTOR FROM THE - LDIR ; THE DISK BUFFER TO 4K SECTOR + LDIR +#ELSE +#IF (DMA_FBACK) ; THE DISK BUFFER TO 4K SECTOR + LD BC,512 + LDIR #ENDIF -; +#ENDIF +MD_NODMAERR: LD IX,MD_F4KBUF ; SET SOURCE ADDRESS LD HL,MD_FWRIT_R ; PUT ROUTINE TO CALL CALL MD_FNCALL ; EXECUTE: WRITE 4K SECTOR