@ -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
FALSE .EQU 0
TRUE .EQU ~ FALSE
TRUE .EQU ~ FALSE
;
;
; HELPER MACROS
;
# DEFINE PRTC ( C ) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')
# 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 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)
# 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
; INTERRUPT TESTING CONFIGURATION
; N.B., INTERRUPT TESTING REQUIRES ROMWBW!!!
; ASSUMES SYSTEM IS ALREADY CONFIGURED FOR IM2 OPERATION
; ASSUMES SYSTEM IS ALREADY CONFIGURED FOR IM2 OPERATION
; INTIDX MUST BE SET TO AN UNUSED INTERRUPT SLOT
; INTIDX MUST BE SET TO AN UNUSED INTERRUPT SLOT
;==================================================================================================
;
;
INTENABLE .EQU TRUE ; ENABLE INT TESTING
INTENABLE .EQU TRUE ; ENABLE INT TESTING
INTIDX .EQU 1 ; INT VECTOR INDEX
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_CONTINUOUS .equ % 10111101 ; + Pulse
DMA_BYTE .equ % 10011101 ; + Pulse
DMA_BYTE .equ % 10011101 ; + Pulse
@ -72,36 +64,17 @@ DMA_REINIT_STATUS_BYTE .equ $8b
DMA_RDY .EQU % 00001000
DMA_RDY .EQU % 00001000
DMA_FORCE .EQU 0
DMA_FORCE .EQU 0
;
;
;==================================================================================================
; ROMWBW HBIOS DEFINITIONS
;==================================================================================================
;
bf_sysint .equ $ FC ; INT function
bf_sysint .equ $ FC ; INT function
bf_sysget .equ $ F8 ; GET function
;
;
bf_sysintinfo .equ $ 00 ; INT INFO subfunction
bf_sysintinfo .equ $ 00 ; INT INFO subfunction
bf_sysintget .equ $ 10 ; INT GET subfunction
bf_sysintget .equ $ 10 ; INT GET subfunction
bf_sysintset .equ $ 20 ; INT SET 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
; MAIN DMA MONITOR ROUTINE
@ -161,12 +134,14 @@ MENULP1:
JP Z , DMATST_N ; MEMORY COPY ITER
JP Z , DMATST_N ; MEMORY COPY ITER
CP '0'
CP '0'
JP Z , DMATST_01
JP Z , DMATST_01
# IF ! ( DMAMODE = = DMAMODE_DG )
CP '1'
CP '1'
JP Z , DMATST_01
JP Z , DMATST_01
CP 'R'
CP 'R'
JP Z , DMATST_R ; TOGGLE RESET
JP Z , DMATST_R ; TOGGLE RESET
CP 'Y'
CP 'Y'
JP Z , DMATST_Y ; TOGGLE READY
JP Z , DMATST_Y ; TOGGLE READY
# ENDIF
CP 'X'
CP 'X'
JP Z , DMABYE ; EXIT
JP Z , DMABYE ; EXIT
;
;
@ -223,7 +198,7 @@ DMATST_01:
;
;
DMATST_D:
DMATST_D:
call PRTSTRD
call PRTSTRD
.db "\n\rDump Registers \n\r$"
.db "\n\rRegister dump: \n\r$"
CALL DMARegDump
CALL DMARegDump
JP MENULP
JP MENULP
;
;
@ -238,6 +213,7 @@ DMATST_R:
.db "\n\rPerforming Reset\n\r$"
.db "\n\rPerforming Reset\n\r$"
; CALL
; CALL
JP MENULP
JP MENULP
;
;==================================================================================================
;==================================================================================================
; DISPLAY MENU
; DISPLAY MENU
;==================================================================================================
;==================================================================================================
@ -275,10 +251,27 @@ DISPM_INT:
;
;
# ENDIF
# 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
LD HL , MENU_OPT ; DISPLAY
CALL PRTSTR ; MENU OPTIONS
CALL PRTSTR ; MENU OPTIONS
;
RET
RET
;
;
# INCLUDE "util.asm"
# INCLUDE "util.asm"
@ -293,10 +286,11 @@ DMA_INIT:
LD A , DMABASE
LD A , DMABASE
CALL PRTHEXBYTE
CALL PRTHEXBYTE
;
;
# IF ! ( DMAMODE = = DMAMODE_DG )
LD A , DMA_FORCE
LD A , DMA_FORCE
out ( DMABASE + 1 ), a ; force ready off
out ( DMABASE + 1 ), a ; force ready off
# ENDIF
;
;
DMAIOSLO
;
;
call DMAProbe ; do we have a dma?
call DMAProbe ; do we have a dma?
jr nz , DMA_NOTFOUND
jr nz , DMA_NOTFOUND
@ -314,7 +308,6 @@ DMA_INIT:
xor a ; set status
xor a ; set status
;
;
DMA_EXIT:
DMA_EXIT:
DMAIONOR
ret
ret
;
;
DMA_NOTFOUND:
DMA_NOTFOUND:
@ -334,22 +327,32 @@ DMA_DEV_STR:
.TEXT "Z280$"
.TEXT "Z280$"
.TEXT "RCBUS$"
.TEXT "RCBUS$"
.TEXT "MBC$"
.TEXT "MBC$"
.TEXT "DATAGEAR$"
;
DMA_SPD_STR:
.TEXT "half speed.$"
.TEXT "full speed.$"
.TEXT "double speed.$"
.TEXT "unknown speed.$"
;
;
MENU_OPT:
MENU_OPT:
.TEXT "\n\r"
.TEXT "\n\r"
.TEXT "D) Dump DMA registers\n\r"
.TEXT "I) Initialize DMA\n\r"
.TEXT "I) Initialize DMA\n\r"
.TEXT "T) Toggle Interrupt Usage\n\r"
.TEXT "T) Toggle Interrupt Usage\n\r"
.TEXT "M) Test Memory-Memory Copy\n\r"
.TEXT "M) Test Memory-Memory Copy\n\r"
.TEXT "N) Test Memory-Memory Copy Iteratively\n\r"
.TEXT "N) Test Memory-Memory Copy Iteratively\n\r"
.TEXT "0) Test DMA Port Selection\n\r"
.TEXT "0) Test DMA Port Selection\n\r"
# IF ! ( DMAMODE = = DMAMODE_DG )
.TEXT "1) Test DMA Latch Port Selection\n\r"
.TEXT "1) Test DMA Latch Port Selection\n\r"
.TEXT "Y) Test Ready Bit\n\r"
.TEXT "Y) Test Ready Bit\n\r"
# ENDIF
.TEXT "X) Exit\n\r"
.TEXT "X) Exit\n\r"
.TEXT ">$"
.TEXT ">$"
;
;
;==================================================================================================
;==================================================================================================
; PULSE PORT
; PULSE PORT (COMMON ROUTINE WITH A CONTAINING ASCII PORT OFFSET)
;==================================================================================================
;==================================================================================================
;
;
DMA_Port01:
DMA_Port01:
@ -390,6 +393,9 @@ dlylp: dec bc
;
;
DMA_ReadyT:
DMA_ReadyT:
call NEWLINE
call NEWLINE
# IF ! ( DMAMODE = = DMAMODE_DG )
# ENDIF
ld c , DMABASE + 1 ; toggle
ld c , DMABASE + 1 ; toggle
ld b , $ 20 ; loop counter
ld b , $ 20 ; loop counter
portlp2: push bc
portlp2: push bc
@ -578,7 +584,6 @@ DMALDIR:
ld b , DMACopy_Len ; dma command
ld b , DMACopy_Len ; dma command
ld c , DMABASE ; block
ld c , DMABASE ; block
;
;
DMAIOSLO
di
di
otir ; load and execute dma
otir ; load and execute dma
ei
ei
@ -588,7 +593,6 @@ DMALDIR:
in a ,( DMABASE ) ; set non-zero
in a ,( DMABASE ) ; set non-zero
and % 00111011 ; if failed
and % 00111011 ; if failed
sub % 00011011
sub % 00011011
DMAIONOR
ret
ret
;
;
DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA
DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA
@ -625,7 +629,6 @@ DMALDIRINT:
ld b , DMACopyInt_Len ; dma command
ld b , DMACopyInt_Len ; dma command
ld c , DMABASE ; block
ld c , DMABASE ; block
;
;
DMAIOSLO
di
di
otir ; load and execute dma
otir ; load and execute dma
ei
ei
@ -635,7 +638,6 @@ DMALDIRINT:
in a ,( DMABASE ) ; set non-zero
in a ,( DMABASE ) ; set non-zero
and % 00111011 ; if failed
and % 00111011 ; if failed
sub % 00011011
sub % 00011011
DMAIONOR
;
;
# ENDIF
# ENDIF
;
;
@ -677,7 +679,6 @@ DMAOTIR:
ld b , DMAOut_Len ; dma command
ld b , DMAOut_Len ; dma command
ld c , DMABASE ; block
ld c , DMABASE ; block
;
;
DMAIOSLO
di
di
otir ; load and execute dma
otir ; load and execute dma
ei
ei
@ -688,7 +689,6 @@ DMAOTIR:
and % 00111011 ; if failed
and % 00111011 ; if failed
sub % 00011011
sub % 00011011
;
;
DMAIONOR
ret
ret
;
;
DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA
DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA
@ -726,7 +726,6 @@ DMAINIR:
ld b , DMAIn_Len ; dma command
ld b , DMAIn_Len ; dma command
ld c , DMABASE ; block
ld c , DMABASE ; block
;
;
DMAIOSLO
di
di
otir ; load and execute dma
otir ; load and execute dma
ei
ei
@ -737,7 +736,6 @@ DMAINIR:
and % 00111011 ; if failed
and % 00111011 ; if failed
sub % 00011011
sub % 00011011
;
;
DMAIONOR
ret
ret
;
;
DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA
DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA