|
|
|
@ -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,25 +32,82 @@ 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 |
|
|
|
@ -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 |
|
|
|
|