mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Update dmamon.asm
This commit is contained in:
@@ -39,12 +39,36 @@ INTENABLE .EQU TRUE ; ENABLE INT TESTING
|
||||
INTIDX .EQU 1 ; INT VECTOR INDEX
|
||||
;
|
||||
;==================================================================================================
|
||||
; DMA MODE BYTES
|
||||
; DMA MODE BYTES - I/O ROUTINES CLEAR b3 AND ONLY PROGRAM LOW ADDRESS
|
||||
;==================================================================================================
|
||||
;
|
||||
DMA_CONTINUOUS .equ %10111101 ; + Pulse
|
||||
DMA_BYTE .equ %10011101 ; + Pulse
|
||||
DMA_BURST .equ %11011101 ; + Pulse
|
||||
DMA_BYTE .equ %10011101 ; b7b1b0 = Register = 1xxxxx01 = Program R4
|
||||
; b6b5 = Transfer Mode = x00xxxxx = Byte transfer mode
|
||||
; b2 = start address (low) = xxxxx1xx = low address follows (1 byte)
|
||||
; b3 = start address (high) = xxxx1xxx = high address follows (1 byte)
|
||||
; b4 = int control byte = xxx1xxxx = interrupt, pulse or vector byte follow
|
||||
;
|
||||
DMA_CONTINUOUS .equ %10111101 ; b7b1b0 = Register = 1xxxxx01 = Program R4
|
||||
; b6b5 = Transfer Mode = x01xxxxx = Continuous transfer mode (default)
|
||||
; b2 = start address (low) = xxxxx1xx = low address follows (1 byte)
|
||||
; b3 = start address (high) = xxxx1xxx = high address follows (1 byte)
|
||||
; b4 = int control byte = xxx1xxxx = interrupt, pulse or vector byte follow
|
||||
;
|
||||
DMA_BURST .equ %11011101 ; b7b1b0 = Register = 1xxxxx01 = Program R4
|
||||
; b6b5 = Transfer Mode = x10xxxxx = Burst transfer mode
|
||||
; b2 = start address (low) = xxxxx1xx = low address follows (1 byte)
|
||||
; b3 = start address (high) = xxxx1xxx = high address follows (1 byte)
|
||||
; b4 = int control byte = xxx1xxxx = interrupt, pulse or vector byte follow
|
||||
;
|
||||
DMA_ICBYTE .equ %00001100 ; b7 = Interrupt Cont. Byte = 0xxxxxxx = Interrupt Control Byte identifier
|
||||
; b6 = Interrupt on RDY = x0xxxxxx = Do not interrupt on RDY
|
||||
; b5 = Status affects vector= xx0xxxxx = Status does not affect vector
|
||||
; b4 = Interrupt vector byte= xxx0xxxx = No interrupt vector byte will follow
|
||||
; b3 = Pulse control byte = xxxx1xxx = A pulse control byte will follow
|
||||
; b2 = Pulse generation = xxxxx100 = A pulse will be generated
|
||||
; b1 = Interrupt @ block end= xxxxxx0x = No interrupt at block end
|
||||
; b0 = Interrupt on match = xxxxxxx0 = No interrupt on match
|
||||
;
|
||||
DMA_LOAD .equ $cf ; %11001111
|
||||
DMA_ENABLE .equ $87 ; %10000111
|
||||
DMA_FORCE_READY .equ $b3
|
||||
@@ -64,6 +88,7 @@ DMA_REINIT_STATUS_BYTE .equ $8b
|
||||
;
|
||||
DMA_RDY .EQU %00001000
|
||||
DMA_FORCE .EQU 0
|
||||
DMA_XMODE .equ 1 ; Byte = 0, Continuous = 1, Burst = 2
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW HBIOS DEFINITIONS
|
||||
@@ -116,6 +141,8 @@ MENULP: CALL DISPM ; DISPLAY MENU
|
||||
;
|
||||
MENULP1:
|
||||
CALL NEWLINE
|
||||
CP 'C'
|
||||
JP Z,DMACFG_C ; CONFIGURE XFER MODE
|
||||
CP 'D'
|
||||
JP Z,DMATST_D ; DUMP REGISTERS
|
||||
CP 'I'
|
||||
@@ -141,12 +168,33 @@ MENULP1:
|
||||
JP Z,DMATST_Y ; TOGGLE READY
|
||||
#ENDIF
|
||||
cp 'S'
|
||||
call z,DMACFG_S ; SET PORT
|
||||
jp z,DMACFG_S ; SET PORT
|
||||
cp 'V'
|
||||
jp z,DMACFG_V ; TOGGLE VERBOSE
|
||||
CP 'X'
|
||||
JP Z,DMABYE ; EXIT
|
||||
;
|
||||
JR MENULP
|
||||
;
|
||||
DMABYE:
|
||||
#IF (INTENABLE)
|
||||
; Deinstall interrupt vector
|
||||
ld hl,(orgvec) ; original vector
|
||||
ld b,bf_sysint
|
||||
ld c,bf_sysintset ; set new vector
|
||||
ld e,INTIDX ; vector idx
|
||||
di
|
||||
rst 08 ; do it
|
||||
ei ; interrupts back on
|
||||
#ENDIF
|
||||
;
|
||||
LD SP,(SAVSTK) ; RESTORE CP/M STACK
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; CONFIGURE PORT
|
||||
;==================================================================================================
|
||||
;
|
||||
DMACFG_S:
|
||||
call PRTSTRD
|
||||
.db "\n\rSet port address\n\rPort:$"
|
||||
@@ -158,21 +206,6 @@ DMACFG_S:
|
||||
ld (hl),a
|
||||
jp MENULP
|
||||
;
|
||||
DMABYE:
|
||||
#IF (INTENABLE)
|
||||
; Deinstall interrupt vector
|
||||
ld hl,(orgvec) ; original vector
|
||||
ld b,bf_sysint
|
||||
ld c,bf_sysintset ; set new vector
|
||||
ld e,INTIDX ; vector idx
|
||||
di
|
||||
rst 08 ; do it
|
||||
ei ; interrupts back on
|
||||
#ENDIF
|
||||
;
|
||||
LD SP,(SAVSTK) ; RESTORE CP/M STACK
|
||||
RET
|
||||
;
|
||||
DMATST_I:
|
||||
call PRTSTRD
|
||||
.db "\n\rStart Initialization\n\r$"
|
||||
@@ -230,6 +263,16 @@ DMATST_R:
|
||||
.db "\n\rPerforming Reset\n\r$"
|
||||
; CALL
|
||||
JP MENULP
|
||||
|
||||
DMACFG_C:
|
||||
CALL DMA_XferM
|
||||
call PRTSTRD
|
||||
.db "\n\rTransfer mode change to: $"
|
||||
LD a,(dmaxfer)
|
||||
LD DE,DMA_XFRMODE
|
||||
CALL PRTIDXDEA
|
||||
CALL NEWLINE
|
||||
JP MENULP
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISPLAY MENU
|
||||
@@ -274,7 +317,6 @@ DISPM_INT:
|
||||
#ENDIF
|
||||
call PRTSTRD ; DISPLAY SPEED
|
||||
.db "\n\rCPU at $"
|
||||
|
||||
LD B,bf_sysget
|
||||
LD C,bf_sysgetcpuspd ; GET CURRENT
|
||||
RST 08 ; SPEED SETTING
|
||||
@@ -282,9 +324,14 @@ DISPM_INT:
|
||||
LD A,L
|
||||
JR Z,SPDDISP
|
||||
LD A,3
|
||||
;
|
||||
SPDDISP:LD DE,DMA_SPD_STR
|
||||
CALL PRTIDXDEA
|
||||
;
|
||||
call PRTSTRD
|
||||
.db "\n\rTransfer Mode: $" ; DIPLAY TRANSFER
|
||||
LD a,(dmaxfer) ; MODE
|
||||
LD DE,DMA_XFRMODE
|
||||
CALL PRTIDXDEA
|
||||
CALL NEWLINE
|
||||
;
|
||||
LD HL,MENU_OPT ; DISPLAY
|
||||
@@ -309,13 +356,16 @@ DMA_INIT:
|
||||
LD A,DMA_FORCE
|
||||
out (c),a ; force ready off
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
call DMAProbe ; do we have a dma?
|
||||
jr nz,DMA_NOTFOUND
|
||||
;
|
||||
call PRTSTRD
|
||||
.db " DMA Found\n\r$"
|
||||
;
|
||||
ld hl,DMAInitMode ; setup the
|
||||
call SETXFER ; transfer mode
|
||||
set 3,(hl) ; upper and lower address
|
||||
;
|
||||
ld hl,DMACode ; program the
|
||||
ld b,DMACode_Len ; dma command
|
||||
@@ -338,6 +388,27 @@ DMA_NOTFOUND:
|
||||
;
|
||||
DMA_FAIL_FLAG:
|
||||
.db 0
|
||||
;
|
||||
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-Block length
|
||||
.db %00010100 ; R1-No timing bytes follow, address increments, is memory
|
||||
.db %00010000 ; R2-No timing bytes follow, address increments, is memory
|
||||
.db %10000000 ; R3-DMA, interrupt, stop on match disabled
|
||||
DMAInitMode: .db DMA_CONTINUOUS ; R4-Transfer mode, destination address, interrupt and control byte follow
|
||||
.dw 0 ; R4-Port B, Destination address
|
||||
.db DMA_ICBYTE ; R4-Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse offset
|
||||
.db %10010010+DMA_RDY; R5-Stop on end of block, ce/wait multiplexed, READY active config
|
||||
.db DMA_LOAD ; R6-Command Load
|
||||
; .db DMA_FORCE_READY ; R6-Command Force ready
|
||||
; .db DMA_ENABLE ; R6-Command Enable DMA
|
||||
DMACode_Len .equ $-DMACode
|
||||
;
|
||||
;==================================================================================================
|
||||
; STRINGS
|
||||
;==================================================================================================
|
||||
;
|
||||
DMA_DEV_STR:
|
||||
.TEXT "NONE$"
|
||||
@@ -354,8 +425,14 @@ DMA_SPD_STR:
|
||||
.TEXT "double speed.$"
|
||||
.TEXT "unknown speed.$"
|
||||
;
|
||||
DMA_XFRMODE:
|
||||
.TEXT "Byte.$"
|
||||
.TEXT "Continuous.$"
|
||||
.TEXT "Burst.$"
|
||||
;
|
||||
MENU_OPT:
|
||||
.TEXT "\n\r"
|
||||
.TEXT "C) Change transfer mode\n\r"
|
||||
.TEXT "D) Dump DMA registers\n\r"
|
||||
.TEXT "I) Initialize DMA\n\r"
|
||||
.TEXT "T) Toggle Interrupt Usage\n\r"
|
||||
@@ -368,11 +445,36 @@ MENU_OPT:
|
||||
.TEXT "Y) Test Ready Bit\n\r"
|
||||
#ENDIF
|
||||
.TEXT "S) Set DMA port\n\r"
|
||||
.TEXT "L) Set Latch port\n\r"
|
||||
.TEXT "V) Verbose status toggle\n\r"
|
||||
.TEXT "X) Exit\n\r"
|
||||
|
||||
.TEXT ">$"
|
||||
;
|
||||
;==================================================================================================
|
||||
; TOGGLE TRANSFER MODE
|
||||
;==================================================================================================
|
||||
;
|
||||
DMA_XferM: ; Set next transfer mode
|
||||
ld a,(dmaxfer)
|
||||
inc a
|
||||
cp 3
|
||||
jr nz,NextX
|
||||
ld a,0
|
||||
NextX: ld (dmaxfer),a
|
||||
ret
|
||||
;
|
||||
;==================================================================================================
|
||||
; TOGGLE VERBOSE MODE
|
||||
;==================================================================================================
|
||||
;
|
||||
DMACFG_V:
|
||||
ld a,(dmavbs)
|
||||
cpl
|
||||
ld (dmavbs),a
|
||||
jp MENULP
|
||||
;
|
||||
;==================================================================================================
|
||||
; OUTPUT A BUFFER OF TEXT TO AN IOPORT
|
||||
;==================================================================================================
|
||||
;
|
||||
@@ -393,19 +495,14 @@ IOLoop: push bc
|
||||
ld bc,16
|
||||
;
|
||||
call DMAOTIR
|
||||
;
|
||||
call PRTSTRD
|
||||
.db " Return Status: $"
|
||||
call PRTHEXBYTE
|
||||
;
|
||||
pop bc
|
||||
djnz IOLoop
|
||||
call NEWLINE
|
||||
|
||||
ret
|
||||
;
|
||||
;==================================================================================================
|
||||
; PULSE PORT (COMMON ROUTINE WITH A CONTAINING ASCII PORT OFFSET)
|
||||
; PULSE PORT (COMMON ROUTINE WHERE A CONTAINS THE ASCII PORT OFFSET)
|
||||
;==================================================================================================
|
||||
;
|
||||
DMA_Port01:
|
||||
@@ -480,7 +577,6 @@ portlp2:push bc
|
||||
;==================================================================================================
|
||||
;
|
||||
DMAMemMove:
|
||||
;
|
||||
LD HL,$8000 ; PREFILL DESTINATION WITH $55
|
||||
LD A,$55
|
||||
LD (HL),A
|
||||
@@ -513,10 +609,6 @@ DMAMemMove2:
|
||||
; LD A,$00 ; BAD
|
||||
; LD (HL),A ; SEED
|
||||
;
|
||||
call PRTSTRD
|
||||
.db "Return Status: $"
|
||||
call PRTHEXBYTE
|
||||
|
||||
LD A,$AA ; CHECK COPY SUCCESSFULL
|
||||
LD HL,$8000
|
||||
LD BC,4096
|
||||
@@ -616,23 +708,6 @@ DMAProbe:
|
||||
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-Block length
|
||||
.db %00010100 ; R1-No timing bytes follow, address increments, is memory
|
||||
.db %00010000 ; R2-No timing bytes follow, address increments, is memory
|
||||
.db %10000000 ; R3-DMA, interrupt, stop on match disabled
|
||||
.db DMA_CONTINUOUS ; R4-Continuous mode, destination address, interrupt and control byte follow
|
||||
.dw 0 ; R4-Port B, Destination address
|
||||
.db %00001100 ; R4-Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse offset
|
||||
.db %10010010+DMA_RDY; R5-Stop on end of block, ce/wait multiplexed, READY active config
|
||||
.db DMA_LOAD ; R6-Command Load
|
||||
; .db DMA_FORCE_READY ; R6-Command Force ready
|
||||
; .db DMA_ENABLE ; R6-Command Enable DMA
|
||||
DMACode_Len .equ $-DMACode
|
||||
;
|
||||
;==================================================================================================
|
||||
; DMA COPY BLOCK CODE - ASSUMES DMA PREINITIALIZED
|
||||
;==================================================================================================
|
||||
@@ -641,6 +716,10 @@ DMALDIR:
|
||||
ld (DMASource),hl ; populate the dma
|
||||
ld (DMADest),de ; register template
|
||||
ld (DMALength),bc
|
||||
;
|
||||
ld hl,DMACopyMode
|
||||
call SETXFER
|
||||
set 3,(hl) ; upper and lower address
|
||||
;
|
||||
ld hl,DMACopy ; program the
|
||||
ld b,DMACopy_Len ; dma command
|
||||
@@ -651,11 +730,7 @@ DMALDIR:
|
||||
otir ; load and execute dma
|
||||
ei
|
||||
;
|
||||
ld a,DMA_READ_STATUS_BYTE ; check status
|
||||
out (c),a ; of transfer
|
||||
in a,(c) ; set non-zero
|
||||
; and %00111011 ; if failed
|
||||
; sub %00011011
|
||||
call DMASTATUS
|
||||
ret
|
||||
;
|
||||
DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA
|
||||
@@ -665,9 +740,9 @@ DMALength .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
|
||||
.db %10000000 ; R3-DMA, interrupt, stop on match disabled
|
||||
.db DMA_CONTINUOUS ; R4-Continuous mode, destination address, interrupt and control byte follow
|
||||
DMACopyMode: .db DMA_CONTINUOUS ; R4-Transfer mode. Destination address, interrupt and control byte follow
|
||||
DMADest .dw 0 ; R4-Port B, Destination address
|
||||
.db %00001100 ; R4-Pulse byte follows, Pulse generated
|
||||
.db DMA_ICBYTE ; R4-Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse offset
|
||||
; .db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config
|
||||
.db DMA_LOAD ; R6-Command Load
|
||||
@@ -687,6 +762,10 @@ DMALDIRINT:
|
||||
ld (DMASourceInt),hl ; populate the dma
|
||||
ld (DMADestInt),de ; register template
|
||||
ld (DMALengthInt),bc
|
||||
;
|
||||
ld hl,DMAICopyMode
|
||||
call SETXFER
|
||||
set 3,(hl) ; upper and lower address
|
||||
;
|
||||
ld hl,DMACopyInt ; program the
|
||||
ld b,DMACopyInt_Len ; dma command
|
||||
@@ -697,17 +776,7 @@ DMALDIRINT:
|
||||
otir ; load and execute dma
|
||||
ei
|
||||
;
|
||||
ld a,DMA_READ_STATUS_BYTE ; check status
|
||||
out (c),a ; of transfer
|
||||
in a,(c)
|
||||
|
||||
call PRTSTRD
|
||||
.db "Return Status: $"
|
||||
call PRTHEXBYTE
|
||||
|
||||
; and %00111011 ; set non-zero
|
||||
; sub %00011011 ; if failed
|
||||
;
|
||||
call DMASTATUS
|
||||
#ENDIF
|
||||
;
|
||||
ret
|
||||
@@ -721,7 +790,7 @@ DMALengthInt .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
|
||||
.db %10100000 ; R3-DMA, interrupt, stop on match disabled
|
||||
.db DMA_CONTINUOUS ; R4-Continuous mode, destination address, interrupt and control byte follow
|
||||
DMAICopyMode: .db DMA_CONTINUOUS ; R4-Transfer mode, destination address, interrupt and control byte follow
|
||||
DMADestInt .dw 0 ; R4-Port B, Destination address
|
||||
.db %00011110 ; R4-Interrupt control byte: Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse control byte
|
||||
@@ -743,6 +812,10 @@ DMAOTIR:
|
||||
ld (DMAOutSource),hl ; populate the dma
|
||||
ld (DMAOutDest),a ; register template
|
||||
ld (DMAOutLength),bc
|
||||
;
|
||||
ld hl,DMAOutMode
|
||||
call SETXFER
|
||||
res 3,(hl) ; no upper address
|
||||
;
|
||||
ld hl,DMAOutCode ; program the
|
||||
ld b,DMAOut_Len ; dma command
|
||||
@@ -753,14 +826,7 @@ DMAOTIR:
|
||||
otir ; load and execute dma
|
||||
ei
|
||||
;
|
||||
ld a,DMA_READ_STATUS_BYTE ; check status
|
||||
out (c),a ; of transfer
|
||||
in a,(c) ; set non-zero
|
||||
|
||||
|
||||
; and %00111011 ; if failed
|
||||
; sub %00011011
|
||||
;
|
||||
call DMASTATUS
|
||||
ret
|
||||
;
|
||||
DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA
|
||||
@@ -772,10 +838,10 @@ DMAOutLength .dw 0 ; R0-Block length
|
||||
.db %00101000 ; R2-No timing bytes follow, address static, is i/o
|
||||
.db %10000000 ; R3-DMA, interrupt, stop on match disabled
|
||||
|
||||
.db %10100101 ; R4-Continuous mode, destination port, interrupt and control byte follow
|
||||
DMAOutMode: .db DMA_CONTINUOUS ; R4-Transfer Mode, destination port, interrupt and control byte follow
|
||||
DMAOutDest .db 0 ; R4-Port B, Destination port
|
||||
; .db %00001100 ; R4-Pulse byte follows, Pulse generated
|
||||
; .db 0 ; R4-Pulse offset
|
||||
.db DMA_ICBYTE ; R4-Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse offset
|
||||
|
||||
.db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config
|
||||
.db DMA_LOAD ; R6-Command Load
|
||||
@@ -794,6 +860,10 @@ DMAINIR:
|
||||
ld (DMAInSource),a ; register template
|
||||
ld (DMAInLength),bc
|
||||
;
|
||||
ld hl,DMAOutMode
|
||||
call SETXFER
|
||||
res 3,(hl) ; no upper address
|
||||
|
||||
ld hl,DMAInCode ; program the
|
||||
ld b,DMAIn_Len ; dma command
|
||||
ld a,(dmaport) ; block
|
||||
@@ -803,13 +873,7 @@ DMAINIR:
|
||||
otir ; load and execute dma
|
||||
ei
|
||||
;
|
||||
ld a,DMA_READ_STATUS_BYTE ; check status
|
||||
out (c),a ; of transfer
|
||||
in a,(c) ; set non-zero
|
||||
|
||||
; and %00111011 ; if failed
|
||||
; sub %00011011
|
||||
;
|
||||
call DMASTATUS
|
||||
ret
|
||||
;
|
||||
DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA
|
||||
@@ -819,10 +883,10 @@ DMAInLength .dw 0 ; R0-Block length
|
||||
.db %00010100 ; R1-No timing bytes follow, address increments, is memory
|
||||
.db %00111000 ; R2-No timing bytes follow, address static, is i/o
|
||||
.db %10000000 ; R3-DMA, interrupt, stop on match disabled
|
||||
.db %10100101 ; R4-Continuous mode, destination port, no interrupt, control byte.
|
||||
DMAInMode: .db DMA_CONTINUOUS ; R4-Transfer mode, destination port, no interrupt, control byte.
|
||||
DMAInSource .db 0 ; R4-Port B, Destination port
|
||||
; .db %00001100 ; R4-Pulse byte follows, Pulse generated
|
||||
; .db 0 ; R4-Pulse offset
|
||||
.db DMA_ICBYTE ; R4-Pulse byte follows, Pulse generated
|
||||
.db 0 ; R4-Pulse offset
|
||||
.db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config
|
||||
.db DMA_LOAD ; R6-Command Load
|
||||
.db DMA_FORCE_READY ; R6-Command Force ready
|
||||
@@ -831,6 +895,99 @@ DMAInSource .db 0 ; R4-Port B, Destination port
|
||||
DMAIn_Len .equ $-DMAInCode
|
||||
;
|
||||
;==================================================================================================
|
||||
; SET TRANSFER MODE
|
||||
;==================================================================================================
|
||||
;
|
||||
SETXFER:
|
||||
ld a,(dmaxfer) ; setup the
|
||||
cp 0 ; transfer mode
|
||||
jr nz,DMAX1
|
||||
ld a,DMA_BYTE
|
||||
jr DMAX3
|
||||
DMAX1: cp 1
|
||||
jr nz,DMAX2
|
||||
ld a,DMA_CONTINUOUS
|
||||
jr DMAX3
|
||||
DMAX2: cp 2
|
||||
ret nz
|
||||
ld a,DMA_BURST
|
||||
DMAX3: ld (hl),a
|
||||
ret
|
||||
;
|
||||
;==================================================================================================
|
||||
; GET STATUS
|
||||
;==================================================================================================
|
||||
;
|
||||
DMASTATUS:
|
||||
ld a,(dmaxfer) ; if byte mode
|
||||
cp 0 ; give some time to finish
|
||||
jr nz,DMASTS1
|
||||
|
||||
; ld b,1
|
||||
;DMASTS2:call delay
|
||||
; djnz DMASTS2
|
||||
;
|
||||
DMASTS1:ld a,DMA_READ_STATUS_BYTE ; check status
|
||||
out (c),a ; of transfer
|
||||
in a,(c)
|
||||
and %00111011
|
||||
;
|
||||
; push af
|
||||
; ld a,DMA_REINIT_STATUS_BYTE
|
||||
; out (c),a
|
||||
; pop af
|
||||
;
|
||||
call PRTSTRD
|
||||
.db "\n\rReturn Status: $"
|
||||
call PRTHEXBYTE
|
||||
call NEWLINE
|
||||
;
|
||||
ld c,a
|
||||
ld a,(dmavbs)
|
||||
or a
|
||||
jr z,DMSSTS2
|
||||
ld a,c
|
||||
;
|
||||
ld a,%00000001
|
||||
ld de,DMASTSBIT0
|
||||
call PRTIDXMSK
|
||||
;
|
||||
ld a,%00000010
|
||||
ld de,DMASTSBIT1
|
||||
call PRTIDXMSK
|
||||
;
|
||||
ld a,%00001000
|
||||
ld de,DMASTSBIT3
|
||||
call PRTIDXMSK
|
||||
;
|
||||
ld a,%00010000
|
||||
ld de,DMASTSBIT4
|
||||
call PRTIDXMSK
|
||||
;
|
||||
ld a,%00100000
|
||||
ld de,DMASTSBIT5
|
||||
call PRTIDXMSK
|
||||
;
|
||||
DMSSTS2:ld a,c
|
||||
ret
|
||||
|
||||
DMASTSBIT0:
|
||||
.TEXT "DMA Bus request did not occur after LOAD command\n\r$"
|
||||
.TEXT "DMA Bus request occurred after the LOAD command\n\r$"
|
||||
DMASTSBIT1:
|
||||
.TEXT "Ready line inactive\n\r$"
|
||||
.TEXT "Ready line active\n\r$"
|
||||
DMASTSBIT3:
|
||||
.TEXT "Interrupt pending\n\r$"
|
||||
.TEXT "No interrupt pending\n\r$"
|
||||
DMASTSBIT4:
|
||||
.TEXT "Match found\n\r$"
|
||||
.TEXT "No match found\n\r$"
|
||||
DMASTSBIT5:
|
||||
.TEXT "End of block reached\n\r$"
|
||||
.TEXT "End of block not reached\n\r$"
|
||||
;
|
||||
;==================================================================================================
|
||||
; DEBUG - READ START, DESTINATION AND COUNT REGISTERS
|
||||
;==================================================================================================
|
||||
;
|
||||
@@ -1010,7 +1167,11 @@ CST:
|
||||
RET
|
||||
;
|
||||
USEINT .DB FALSE ; USE INTERRUPTS FLAG
|
||||
;
|
||||
counter .dw 0
|
||||
dmaport .db DMABASE
|
||||
dmautil .db DMABASE+1
|
||||
dmaxfer .db DMA_XMODE
|
||||
dmavbs .db 0
|
||||
SAVSTK: .DW 2
|
||||
.FILL 64
|
||||
STACK: .EQU $
|
||||
@@ -1050,10 +1211,6 @@ int:
|
||||
or $ff ; signal int handled
|
||||
ret
|
||||
;
|
||||
counter .dw 0
|
||||
dmaport .db DMABASE
|
||||
dmautil .db DMABASE+1
|
||||
;
|
||||
hsiz .equ $ - $A000 ; size of handler to relocate
|
||||
;
|
||||
.org reladr + hsiz
|
||||
|
||||
Reference in New Issue
Block a user