From 0ebfebe8d17ecb76802a7035d8ebda44a25c67e1 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 9 Jul 2021 14:57:35 +0800 Subject: [PATCH] DMA updates Add hardware probe at initialization and status checks after DMA transfers --- Binary/SBC_std.upd | Bin 131072 -> 131072 bytes Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_ezz80.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/dma.asm | 162 ++++++++++++++++++++++++++++++++---- Source/HBIOS/md.asm | 7 +- Source/HBIOS/rf.asm | 9 +- Source/HBIOS/std.asm | 2 +- 17 files changed, 165 insertions(+), 39 deletions(-) diff --git a/Binary/SBC_std.upd b/Binary/SBC_std.upd index 6c9791fbb4632db6790cbeb0653c771ab26e231a..2b85c08ead3a524bb86406471451baf3f1c08a50 100644 GIT binary patch delta 25 hcmZo@;Am*zm@uEwa^r%?07lE^Ujf^H1u(L$2LOOx3Nioy delta 25 hcmZo@;Am*zm@uEwXyby&07j$cUjf^H1u(L$2LOMl3M2pk diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index a3045890..6cc9baa1 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -191,4 +191,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index f5dd41a4..58686d5b 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -226,4 +226,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index a03f4611..d3dbed94 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -294,4 +294,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index cc6e9b22..6fe370c2 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -226,4 +226,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index c27f2dca..9e06dcd5 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -226,4 +226,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 6dbb8b77..85200727 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -239,4 +239,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 998cc0b2..e9145a9a 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -255,4 +255,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 03e42160..0a262c07 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -244,4 +244,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 87cab859..b4f3cadd 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -227,4 +227,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index e47254de..7a85c2e4 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -234,4 +234,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 879d479d..e5f04b71 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -162,4 +162,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 01f6a2b9..37c96223 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -174,4 +174,4 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_WKD ; DMA: DMA MODE (NONE|WKD|Z180|Z280|RC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index 60fc67ad..065c30e1 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -13,8 +13,10 @@ DMA_LOAD .equ $cf ; %11001111 DMA_ENABLE .equ $87 ; %10000111 DMA_FORCE_READY .equ $b3 DMA_DISABLE .equ $83 -; -;DMA_RESET .equ $c3 +DMA_START_READ_SEQUENCE .equ $a7 +DMA_READ_STATUS_BYTE .equ $bf +DMA_READ_MASK_FOLLOWS .equ $bb +DMA_RESET .equ $c3 ;DMA_RESET_PORT_A_TIMING .equ $c7 ;DMA_RESET_PORT_B_TIMING .equ $cb ;DMA_CONTINUE .equ $d3 @@ -22,10 +24,7 @@ DMA_DISABLE .equ $83 ;DMA_ENABLE_INTERUPTS .equ $ab ;DMA_RESET_DISABLE_INTERUPTS .equ $a3 ;DMA_ENABLE_AFTER_RETI .equ $b7 -;DMA_READ_STATUS_BYTE .equ $bf ;DMA_REINIT_STATUS_BYTE .equ $8b -;DMA_START_READ_SEQUENCE .equ $a7 -;DMA_WRITE_REGISTER_COMMAND .equ $bb ; ;================================================================================================== ; DMA INITIALIZATION CODE @@ -33,30 +32,87 @@ DMA_DISABLE .equ $83 ; DMA_INIT: CALL NEWLINE - PRTS("DMA: IO=0x$") + PRTS("DMA: IO=0x$") ; announce LD A, DMABASE CALL PRTHEXBYTE ; - ld a,0 + xor a out (DMABASE+1),a ; force ready off +; + ld a,(RTCVAL) + or %00001000 ; half + out (RTCIO),a ; clock +; + call DMAProbe ; do we have a dma? + jr nz,DMA_NOTFOUND ; ld hl,DMACode ; program the ld b,DMACode_Len ; dma command ld c,DMABASE ; block ; - ld a,(RTCVAL) - or %00001000 ; half - out (112),a ; clock di otir ; load dma ei + xor a ; set status +; +DMA_EXIT: + push af + ld a,(RTCVAL) and %11110111 ; full - out (112),a ; clock + out (RTCIO),a ; clock + pop af + ret +; +DMA_NOTFOUND: + push af + call PRTSTRD + .db " NOT PRESENT$" + pop af + jr DMA_EXIT + +; +;================================================================================================== +; DMA PROBE - WRITE TO ADDRESS REGISTER AND READ BACK +;================================================================================================== +; +DMAProbe: + ld a,DMA_RESET + out (DMABASE),a + ld a,%01111101 ; R0-Transfer mode, A -> B, start address follows + out (DMABASE),a + ld a,$cc + out (DMABASE),a + ld a,$dd + out (DMABASE),a + ld a,$e5 + out (DMABASE),a + ld a,$1a + out (DMABASE),a + ld a,DMA_LOAD + out (DMABASE),a +; + ld a,DMA_READ_MASK_FOLLOWS ; set up + out (DMABASE),a ; for + ld a,%00011000 ; register + out (DMABASE),a ; read + ld a,DMA_START_READ_SEQUENCE + out (DMABASE),a +; + in a,(DMABASE) ; read in + ld c,a ; address + in a,(DMABASE) + ld b,a +; + xor a ; is it + ld hl,$ddcc ; a match + sbc hl,bc ; return with + ret z ; status + cpl ret ; DMACode ;.db DMA_DISABLE ; R6-Command Disable DMA .db %01111101 ; R0-Transfer mode, A -> B, start address, block length follow - .dw 0 ; R0-Port A, Start address + .dw 0 ; R0-Port A, Start address .dw 0 ; R0-Block length .db %00010100 ; R1-No timing bytes follow, address increments, is memory .db %00010000 ; R2-No timing bytes follow, address increments, is memory @@ -86,12 +142,22 @@ DMALDIR: ; ld a,(RTCVAL) or %00001000 ; half - out (112),a ; clock + out (RTCIO),a ; clock di otir ; load and execute dma ei +; + ld a,DMA_READ_STATUS_BYTE ; check status + out (DMABASE),a ; of transfer + in a,(DMABASE) ; set non-zero + and %00111011 ; if failed + sub %00011011 + + push af + ld a,(RTCVAL) and %11110111 ; full - out (112),a ; clock + out (RTCIO),a ; clock + pop af ret ; DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -126,12 +192,22 @@ DMAOTIR: ; ld a,(RTCVAL) or %00001000 ; half - out (112),a ; clock + out (RTCIO),a ; clock di otir ; load and execute dma ei +; + ld a,DMA_READ_STATUS_BYTE ; check status + out (DMABASE),a ; of transfer + in a,(DMABASE) ; set non-zero + and %00111011 ; if failed + sub %00011011 +; + push af + ld a,(RTCVAL) and %11110111 ; full - out (112),a ; clock + out (RTCIO),a ; clock + pop af ret ; DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -171,12 +247,22 @@ DMAINIR: ; ld a,(RTCVAL) or %00001000 ; half - out (112),a ; clock + out (RTCIO),a ; clock di otir ; load and execute dma ei +; + ld a,DMA_READ_STATUS_BYTE ; check status + out (DMABASE),a ; of transfer + in a,(DMABASE) ; set non-zero + and %00111011 ; if failed + sub %00011011 +; + push af + ld a,(RTCVAL) and %11110111 ; full - out (112),a ; clock + out (RTCIO),a ; clock + pop af ret ; DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA @@ -196,3 +282,43 @@ DMAInSource .db 0 ; R4-Port B, Destination port .db DMA_ENABLE ; R6-Command Enable DMA DMAIn_Len .equ $-DMAInCode +; +;================================================================================================== +; DEBUG - READ START, DESTINATION AN COUNT REGISTERS +;================================================================================================== +; +#IF (0) +; +DMARegDump: + ld a,DMA_READ_MASK_FOLLOWS + out (DMABASE),a + ld a,%01111110 + out (DMABASE),a + ld a,DMA_START_READ_SEQUENCE + out (DMABASE),a +; + in a,(DMABASE) + ld c,a + in a,(DMABASE) + ld b,a + call PRTHEXWORD + ld a,':' + call COUT +; + in a,(DMABASE) + ld c,a + in a,(DMABASE) + ld b,a + call PRTHEXWORD + ld a,':' + call COUT +; + in a,(DMABASE) + ld c,a + in a,(DMABASE) + ld b,a + call PRTHEXWORD +; + call NEWLINE + ret +#ENDIF diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index d7098c44..81f756e9 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -351,14 +351,14 @@ MD_SECM: ADD HL,DE ; WANT TO COPY LD DE,(MD_DSKBUF) ; -#IF (DMAENABLE) +#IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) LD BC,512-1 ; COPY ONE 512B SECTOR FROM THE CALL DMALDIR ; 4K SECTOR TO THE DISK BUFFER #ELSE LD BC,512 ; COPY ONE 512B SECTOR FROM THE LDIR ; 4K SECTOR TO THE DISK BUFFER -#ENDIF XOR A +#ENDIF RET ; ; SETUP DE:HL AS THE SECTOR ADDRESS TO READ OR WRITE @@ -471,9 +471,10 @@ MD_SECM1: ; DESIRED SECTOR IS IN BUFFER EX DE,HL ; LD HL,(MD_DSKBUF) -#IF (DMAENABLE) +#IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) 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 LD BC,512 ; COPY ONE 512B SECTOR FROM THE LDIR ; THE DISK BUFFER TO 4K SECTOR diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 263dadb1..04539646 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -272,7 +272,7 @@ RF_RDSEC: CALL RF_SETADR ; SEND SECTOR STARTING ADDRESS TO CARD LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS LD A,(RF_IO) ; GET IO PORT BASE -#IF (DMAENABLE) +#IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) LD BC,512-1 ; READ 512 BYTES CALL DMAINIR ; USING DMA #ELSE @@ -281,9 +281,8 @@ RF_RDSEC: LD B,0 ; INIT BYTE COUNTER INIR ; READ 256 BYTES INIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL -#ENDIF - XOR A ; SIGNAL SUCCESS +#ENDIF RET ; AND DONE ; ; WRITE SECTOR @@ -293,7 +292,7 @@ RF_WRSEC: LD HL,(RF_DSKBUF) ; HL := DISK BUFFER ADDRESS LD A,(RF_IO) ; GET IO PORT BASE OR RF_DAT ; OFFSET TO DAT PORT -#IF (DMAENABLE==1) +#IF (DMAENABLE & (DMAMODE=DMAMODE_ECB)) LD BC,512-1 ; WRITE 512 BYTES CALL DMAOTIR ; USING DMA #ELSE @@ -301,8 +300,8 @@ RF_WRSEC: LD B,0 ; INIT BYTE COUNTER OTIR ; WRITE 256 BYTES OTIR ; AND ANOTHER 256 BYTES FOR 512 TOTAL -#ENDIF XOR A ; SIGNAL SUCCESS +#ENDIF RET ; AND DONE ; ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index fb944299..595676a3 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -206,7 +206,7 @@ TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD ; DMA MODE SELECTIONS ; DMAMODE_NONE .EQU 0 -DMAMODE_WKD .EQU 1 ; ECB-DMA WOLFGANG KABATZKE'S Z80 DMA ECB BOARD +DMAMODE_ECB .EQU 1 ; ECB-DMA WOLFGANG KABATZKE'S Z80 DMA ECB BOARD DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA DMAMODE_RC .EQU 4 ; RC2014 Z80 DMA