@ -1,53 +1,45 @@
;==================================================================================================
; Z80 DMA TEST UTILITY
; Z80 DMA TEST UTILITY - ROMWBW SPECIFIC
;==================================================================================================
;
;==================================================================================================
; PLATFORM CONFIGURATION
;==================================================================================================
;
DMAMODE_NONE .EQU 0
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 ; RCBUS Z80 DMA
DMAMODE_MBC .EQU 5 ; MBC
DMAMODE_DG .EQU 6 ; VELESOFT DATAGEAR
;
DMABASE .EQU $ E0 ; DMA: DMA BASE ADDRESS
DMAMODE .EQU DMAMODE_MBC ; SELECT DMA DEVICE FOR TESTING
;
;==================================================================================================
; HELPER MACROS AND EQUATES
;==================================================================================================
;
FALSE .EQU 0
TRUE .EQU ~ FALSE
;
; HELPER MACROS
;
# DEFINE PRTC ( C ) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')
# DEFINE PRTS ( S ) CALL PRTSTRD \ .TEXT S ; PRINT STRING S TO CONSOLE - PRTD("HELLO")
# DEFINE PRTX ( X ) CALL PRTSTRI \ .DW X ; PRINT STRING AT ADDRESS X TO CONSOLE - PRTI(STR_HELLO)
;
; SYSTEM SPEED CAPABILITIES
;
SPD_FIXED .EQU 0 ; PLATFORM SPEED FIXED AND CANNOT CHANGE SPEEDS
SPD_HILO .EQU 1 ; PLATFORM CAN CHANGE BETWEEN TWO SPEEDS
;
;==================================================================================================
; INTERRUPT TESTING CONFIGURATION
; N.B., INTERRUPT TESTING REQUIRES ROMWBW!!!
; ASSUMES SYSTEM IS ALREADY CONFIGURED FOR IM2 OPERATION
; INTIDX MUST BE SET TO AN UNUSED INTERRUPT SLOT
;==================================================================================================
;
INTENABLE .EQU TRUE ; ENABLE INT TESTING
INTIDX .EQU 1 ; INT VECTOR INDEX
;
; SYSTEM SPEED CHARACTERISTICS
;
SPD_UNSUP .EQU 0 ; PLATFORM CAN CHANGE SPEEDS BUT IS UNSUPPORTED
SPD_HIGH .EQU 1 ; PLATFORM CAN CHANGE SPEED, STARTS HIGH
SPD_LOW .EQU 2 ; PLATFORM CAN CHANGE SPEED, STARTS LOW
;
; DMA MODE SELECTIONS
;
DMAMODE_NONE .EQU 0
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 ; RCBUS Z80 DMA
DMAMODE_MBC .EQU 5 ; MBC
;
DMABASE .EQU $ E0 ; DMA: DMA BASE ADDRESS
RTCIO .EQU $ 70 ; RTC / SPEED PORT
HB_RTCVAL .EQU $ FFEE ; HB_RTCVAL
;
CPU SP DCAP .EQU SP D_HILO ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO
CPU SP DDEF .EQU SP D_HIGH ; SPD_UNSUP|SPD_HIGH|SPD_LOW
;
DMAMODE .EQU DMAMODE_MBC
DMA_USEHS .EQU TRUE ; USE CLOCK DIVIDER
;==================================================================================================
; DMA MODE BYTES
;==================================================================================================
;
DMA_CONTINUOUS .equ % 10111101 ; + Pulse
DMA_BYTE .equ % 10011101 ; + Pulse
@ -72,36 +64,17 @@ DMA_REINIT_STATUS_BYTE .equ $8b
DMA_RDY .EQU % 00001000
DMA_FORCE .EQU 0
;
;==================================================================================================
; ROMWBW HBIOS DEFINITIONS
;==================================================================================================
;
bf_sysint .equ $ FC ; INT function
bf_sysget .equ $ F8 ; GET function
;
bf_sysintinfo .equ $ 00 ; INT INFO subfunction
bf_sysintget .equ $ 10 ; INT GET subfunction
bf_sysintset .equ $ 20 ; INT SET subfunction
;
# IF ( DMA_USEHS & ( DMAMODE = DMAMODE_MBC ))
# IF ( CPUSPDDEF = SP D_HIGH )
# DEFINE DMAIOSLO LD A ,( HB_RTCVAL ) \ AND % 11110111 \ OUT ( RTCIO ), A
# DEFINE DMAIONOR PUSH AF \ LD A ,( HB_RTCVAL ) \ OR % 00001000 \ OUT ( RTCIO ), A \ POP AF
# ELSE
# DEFINE DMAIOSLO \ ;
# DEFINE DMAIONOR \ ;
# ENDIF
# ENDIF
;
# IF ( DMA_USEHS & ( DMAMODE = DMAMODE_ECB ))
# IF ( CPUSPDDEF = SP D_HIGH )
# DEFINE DMAIOSLO LD A ,( HB_RTCVAL ) \ OR % 00001000 \ OUT ( RTCIO ), A
# DEFINE DMAIONOR PUSH AF \ LD A ,( HB_RTCVAL ) \ AND % 11110111 \ OUT ( RTCIO ), A \ POP AF
# ELSE
# DEFINE DMAIOSLO \ ;
# DEFINE DMAIONOR \ ;
# ENDIF
# ENDIF
# IF ( ! DMA_USEHS )
# DEFINE DMAIOSLO \ ;
# DEFINE DMAIONOR \ ;
# ENDIF
bf_sysgetcpuspd .equ $ F3 ; GET CPUSPD subfunction
;
;==================================================================================================
; MAIN DMA MONITOR ROUTINE
@ -161,12 +134,14 @@ MENULP1:
JP Z , DMATST_N ; MEMORY COPY ITER
CP '0'
JP Z , DMATST_01
# IF ! ( DMAMODE = = DMAMODE_DG )
CP '1'
JP Z , DMATST_01
CP 'R'
JP Z , DMATST_R ; TOGGLE RESET
CP 'Y'
JP Z , DMATST_Y ; TOGGLE READY
# ENDIF
CP 'X'
JP Z , DMABYE ; EXIT
;
@ -223,7 +198,7 @@ DMATST_01:
;
DMATST_D:
call PRTSTRD
.db "\n\rDump Registers \n\r$"
.db "\n\rRegister dump: \n\r$"
CALL DMARegDump
JP MENULP
;
@ -238,6 +213,7 @@ DMATST_R:
.db "\n\rPerforming Reset\n\r$"
; CALL
JP MENULP
;
;==================================================================================================
; DISPLAY MENU
;==================================================================================================
@ -275,10 +251,27 @@ DISPM_INT:
;
# ENDIF
;
call NEWLINE
# IF ( DMAMODE = = DMAMODE_DG )
call PRTSTRD
.db "\n\rReset\\Ready Latch unsupported.$"
# ENDIF
call PRTSTRD ; DISPLAY SPEED
.db "\n\rCPU at $"
LD B , bf_sysget
LD C , bf_sysgetcpuspd ; GET CURRENT
RST 08 ; SPEED SETTING
OR A
LD A , L
JR Z , SP DDISP
LD A , 3
;
SPDDISP: LD DE , DMA_SPD_STR
CALL PRTIDXDEA
CALL NEWLINE
;
LD HL , MENU_OPT ; DISPLAY
CALL PRTSTR ; MENU OPTIONS
;
RET
;
# INCLUDE "util.asm"
@ -293,10 +286,11 @@ DMA_INIT:
LD A , DMABASE
CALL PRTHEXBYTE
;
# IF ! ( DMAMODE = = DMAMODE_DG )
LD A , DMA_FORCE
out ( DMABASE + 1 ), a ; force ready off
# ENDIF
;
DMAIOSLO
;
call DMAProbe ; do we have a dma?
jr nz , DMA_NOTFOUND
@ -314,7 +308,6 @@ DMA_INIT:
xor a ; set status
;
DMA_EXIT:
DMAIONOR
ret
;
DMA_NOTFOUND:
@ -334,22 +327,32 @@ DMA_DEV_STR:
.TEXT "Z280$"
.TEXT "RCBUS$"
.TEXT "MBC$"
.TEXT "DATAGEAR$"
;
DMA_SPD_STR:
.TEXT "half speed.$"
.TEXT "full speed.$"
.TEXT "double speed.$"
.TEXT "unknown speed.$"
;
MENU_OPT:
.TEXT "\n\r"
.TEXT "D) Dump DMA registers\n\r"
.TEXT "I) Initialize DMA\n\r"
.TEXT "T) Toggle Interrupt Usage\n\r"
.TEXT "M) Test Memory-Memory Copy\n\r"
.TEXT "N) Test Memory-Memory Copy Iteratively\n\r"
.TEXT "0) Test DMA Port Selection\n\r"
# IF ! ( DMAMODE = = DMAMODE_DG )
.TEXT "1) Test DMA Latch Port Selection\n\r"
.TEXT "Y) Test Ready Bit\n\r"
# ENDIF
.TEXT "X) Exit\n\r"
.TEXT ">$"
;
;==================================================================================================
; PULSE PORT
; PULSE PORT (COMMON ROUTINE WITH A CONTAINING ASCII PORT OFFSET)
;==================================================================================================
;
DMA_Port01:
@ -390,6 +393,9 @@ dlylp: dec bc
;
DMA_ReadyT:
call NEWLINE
# IF ! ( DMAMODE = = DMAMODE_DG )
# ENDIF
ld c , DMABASE + 1 ; toggle
ld b , $ 20 ; loop counter
portlp2: push bc
@ -578,7 +584,6 @@ DMALDIR:
ld b , DMACopy_Len ; dma command
ld c , DMABASE ; block
;
DMAIOSLO
di
otir ; load and execute dma
ei
@ -588,7 +593,6 @@ DMALDIR:
in a ,( DMABASE ) ; set non-zero
and % 00111011 ; if failed
sub % 00011011
DMAIONOR
ret
;
DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA
@ -625,7 +629,6 @@ DMALDIRINT:
ld b , DMACopyInt_Len ; dma command
ld c , DMABASE ; block
;
DMAIOSLO
di
otir ; load and execute dma
ei
@ -635,7 +638,6 @@ DMALDIRINT:
in a ,( DMABASE ) ; set non-zero
and % 00111011 ; if failed
sub % 00011011
DMAIONOR
;
# ENDIF
;
@ -677,7 +679,6 @@ DMAOTIR:
ld b , DMAOut_Len ; dma command
ld c , DMABASE ; block
;
DMAIOSLO
di
otir ; load and execute dma
ei
@ -688,7 +689,6 @@ DMAOTIR:
and % 00111011 ; if failed
sub % 00011011
;
DMAIONOR
ret
;
DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA
@ -726,7 +726,6 @@ DMAINIR:
ld b , DMAIn_Len ; dma command
ld c , DMABASE ; block
;
DMAIOSLO
di
otir ; load and execute dma
ei
@ -737,7 +736,6 @@ DMAINIR:
and % 00111011 ; if failed
sub % 00011011
;
DMAIONOR
ret
;
DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA