@ -147,18 +147,16 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH
;==================================================================================================
;
CTC_PREINIT:
; BLINDLY RESET THE CTC ASSUMING IT IS THERE
LD A , CTC_DEFCFG
OUT ( CTCBASE ), A
OUT ( CTCBASE + 1 ), A
OUT ( CTCBASE + 2 ), A
OUT ( CTCBASE + 3 ), A
;
CALL CTC_DETECT ; DO WE HAVE ONE?
LD ( CTC_EXIST ), A ; SAVE IT
RET NZ ; ABORT IF NONE
;
; RESET ALL CTC CHANNELS
LD B , 4 ; 4 CHANNELS
LD C , CTCBASE ; FIRST CHANNEL PORT
CTC_PREINIT1:
LD A , CTC_DEFCFG ; CTC DEFAULT CONFIG
OUT ( C ), A ; CTC COMMAND
INC C ; NEXT CHANNEL PORT
DJNZ CTC_PREINIT1
;
# IF ( CTCTIMER & ( INTMODE = = 2 ))
; SETUP TIMER INTERRUPT IVT SLOT
@ -258,32 +256,33 @@ CTC_PRTCFG1:
RET
;
;==================================================================================================
; DETECT CTC BY CHECKING REGISTER CAN BE WRITTEN AND READ, AND THEN BY SETTING UP ONE CHANNEL IN
; TIMER MODE AND CHECKING IT IS COUNTING DOWN.
; DETECT CTC BY PROGRAMMING THE FIRST CHANNEL TO COUNT IN TIMER
; MODE (BASED ON CPU CLOCK). THEN CHECK IF COUNTER IS ACTUALLY
; RUNNING.
;==================================================================================================
;
CTC_DETECT:
LD A , CTC_TIM256CFG
OUT ( CTCBASE ), A
XOR A
OUT ( CTCBASE ), A
; CTC SHOULD NOW BE RUNNING WITH TIME CONSTANT 0
LD A , CTC_TIM256CFG ; RESET
OUT ( CTCBASE ), A
IN A ,( CTCBASE ) ; SHOULD READ 0 NOW
CP 0
JR NZ , CTC_NO
LD A , CTC_TIM16CFG ; RESET & SETUP TIMER MODE
OUT ( CTCBASE ), A ; SEND TO CTC
LD A , $ FF ; TIME CONSTANT $FF
OUT ( CTCBASE ), A
IN A ,( CTCBASE ) ; SHOULD NOT BE 0 NOW
CP 0
JR Z , CTC_NO
XOR A
RET
OUT ( CTCBASE ), A ; SEND CONSTANT & START CTR
NOP ; BRIEF DELAY
IN A ,( CTCBASE ) ; READ COUNTER
LD C , A ; SAVE VALUE
CALL DL Y8 ; WAIT A BIT
IN A ,( CTCBASE ) ; READ COUNTER AGAIN
PUSH AF ; SAVE RESULT
LD A , CTC_DEFCFG ; DEFAULT CHANNEL CFG
OUT ( CTCBASE ), A ; RESTORE TO DEFAULTS
POP AF ; GET RESULT BACK
CP C ; COMPARE TO PREVIOUS
JR Z , CTC_NO ; IF SAME, FAIL
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
CTC_NO:
OR $ FF
RET
;
OR $ FF ; SIGNAL FAILURE
RET ; AND DONE
;
; CTC DRIVER DATA STORAGE
;
CTC_EXIST .DB $ FF
CTC_EXIST .DB $ FF ; SET TO ZERO IF EXISTS