|
|
|
@ -19,17 +19,27 @@ CTC_TIMCFG .EQU %11010111 ; CTC TIMER CHANNEL CONFIG |
|
|
|
; |+-------- COUNTER MODE |
|
|
|
; +--------- INTERRUPT ENABLE |
|
|
|
; |
|
|
|
#IF (CTCTIMER) |
|
|
|
#IF (INTMODE != 2) |
|
|
|
.ECHO "*** WARNING: CTC TIMER DISABLED -- INTMODE 2 REQUIRED!!!\n" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CTCTIMER & (INTMODE == 2)) |
|
|
|
; |
|
|
|
#IF (INT_CTC0A % 4) |
|
|
|
|
|
|
|
.ECHO INT_CTC0A |
|
|
|
.ECHO "\n" |
|
|
|
.ECHO (INT_CTC0A % 4) |
|
|
|
.ECHO "\n" |
|
|
|
|
|
|
|
.ECHO "*** ERROR: CTC BASE VECTOR NOT /4 ALIGNED!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; ONLY IM2 IMPLEMENTED BELOW. I DON'T SEE ANY REASONABLE WAY TO |
|
|
|
; IMPLEMENT AN IM1 TIMER BECAUSE THE CTC PROVIDES NO WAY TO |
|
|
|
; DETERMINE IF IT WAS THE CAUSE OF AN INTERRUPT OR A WAY TO |
|
|
|
; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. |
|
|
|
; |
|
|
|
#IF (INTMODE != 2) |
|
|
|
.ECHO "*** ERROR: CTC REQUIRES INTMODE 2!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CTC_PREIO .EQU CTCBASE + CTCPRECH |
|
|
|
CTC_SCLIO .EQU CTCBASE + CTCTIMCH |
|
|
|
@ -82,6 +92,9 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH |
|
|
|
; |
|
|
|
; |
|
|
|
CTC_PREINIT: |
|
|
|
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 |
|
|
|
@ -92,7 +105,7 @@ CTC_PREINIT1: |
|
|
|
INC C ; NEXT CHANNEL PORT |
|
|
|
DJNZ CTC_PREINIT1 |
|
|
|
; |
|
|
|
#IF (CTCTIMER) |
|
|
|
#IF (CTCTIMER & (INTMODE == 2)) |
|
|
|
; SETUP TIMER INTERRUPT IVT SLOT |
|
|
|
LD HL,HB_TIMINT ; TIMER INT HANDLER ADR |
|
|
|
LD (IVT(CTCTIVT)),HL ; IVT ENTRY FOR TIMER CHANNEL |
|
|
|
@ -136,9 +149,20 @@ CTC_PRTCFG: |
|
|
|
LD A,CTCBASE ; GET BASE PORT |
|
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
|
; |
|
|
|
#IF (CTCTIMER) |
|
|
|
LD A,(CTC_EXIST) ; IS IT THERE? |
|
|
|
OR A ; 0 MEANS YES |
|
|
|
JR Z,CTC_PRTCFG1 ; IF SO, CONTINUE |
|
|
|
; |
|
|
|
; NOTIFY NO CTC HARDWARE |
|
|
|
PRTS(" NOT PRESENT$") |
|
|
|
OR $FF |
|
|
|
RET |
|
|
|
; |
|
|
|
CTC_PRTCFG1: |
|
|
|
; |
|
|
|
#IF (CTCTIMER & (INTMODE == 2)) |
|
|
|
; |
|
|
|
PRTS(" MODE=$") ; FORMATTING |
|
|
|
PRTS(" TIMER MODE=$") ; FORMATTING |
|
|
|
#IF (CTCMODE == CTCMODE_CTR) |
|
|
|
PRTS("CTR$") |
|
|
|
#ENDIF |
|
|
|
@ -175,3 +199,31 @@ CTC_PRTCFG: |
|
|
|
; |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
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,$FF ; TIME CONSTANT $FF |
|
|
|
OUT (CTCBASE),A |
|
|
|
IN A,(CTCBASE) ; SHOULD NOT BE 0 NOW |
|
|
|
CP 0 |
|
|
|
JR Z,CTC_NO |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
CTC_NO: |
|
|
|
OR $FF |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
CTC_EXIST .DB $FF |
|
|
|
|