diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 7576fbe1..27de79c6 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -38,6 +38,7 @@ KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS ; CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCBASE .EQU $80 ; CTC BASE FOR ECB-ZILOG-PERIPHERALS ; DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index b17a35ca..e3e0e75b 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1071,16 +1071,62 @@ HB_CPU2: ; #IF (HTIMENABLE) ; SIMH TIMER ; - #IF (INTMODE == 1) + #IF (INTMODE == 1) LD HL,HB_TIMINT CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST #ENDIF + + #ENDIF + #IF (CTCENABLE) + #IF (INTMODE == 2) ; - #IF (INTMODE == 2) - ;LD HL,HB_TIMINT - ;LD (HBX_IVT),HL - #ENDIF + ; TIMER INTERRUPT IS ON CTCD, VECTOR IS FOURTH IVT SLOT + LD HL,HB_TIMINT ; TIMER INT HANDLER ADR + LD (IVT(INT_CTC0D)),HL ; IVT ENTRY FOR CTC0D ; + ; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR + ; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE + ; START OF THE IVT, SO THE FIRST FOUR ENTIRES OF THE + ; IVT CORRESPOND TO CTC CHANNELS A-D + LD A,0 + OUT (CTCA),A ; SETUP CTC BASE INT VECTOR +; + ; ASSUMING ECB-ZP WITH 4.9125MHz XTAL AND / 8 DIVIDER + ; JUMPER X5 15-16, 9-11, X5 PIN 3 (PHI_X) TO X4 PIN 7 (CTC_TG2) + ; CONFIGURE CHANNEL D FOR 50HZ PERIODIC INTERRUPTS + ; CTC CLK = 614,400Hz + ; CTCD TIME CONSTANT = 48 + ; INT FREQ IS CTC CLK / CTCC TC / CTCD TC + ; WHICH IS 614,400HZ / 256 / 48 = 50HZ + LD A,%01010111 ; CTCC CONTROL WORD VALUE + ; |||||||+-- 1=CONTROL WORD FLAG + ; ||||||+--- 1=SOFTWARE RESET + ; |||||+---- 1=TIME CONSTANT FOLLOWS + ; ||||+----- 0=AUTO TRIGGER WHEN TIME CONST LOADED + ; |||+------ 1=RISING EDGE TRIGGER + ; ||+------- 1=PRESCALER OF 16 (NOT USED) + ; |+-------- 1=COUNTER MODE + ; +--------- 0=NO INTERRUPTS + OUT (CTCC),A ; SETUP CTCC + LD A,0 ; CTCC TIMER CONSTANT = 256, 0 MEANS 256 + OUT (CTCC),A ; SETUP CTCC TIMER CONSTANT + LD A,%11010111 ; CTCD CONTROL WORD VALUE + ; |||||||+-- 1=CONTROL WORD FLAG + ; ||||||+--- 1=SOFTWARE RESET + ; |||||+---- 1=TIME CONSTANT FOLLOWS + ; ||||+----- 0=AUTO TRIGGER WHEN TIME CONST LOADED + ; |||+------ 1=RISING EDGE TRIGGER + ; ||+------- 1=PRESCALER OF 16 (NOT USED) + ; |+-------- 1=COUNTER MODE + ; +--------- 1=ENABLE INTERRUPTS + OUT (CTCD),A ; SETUP CTCD + LD A,48 ; CTCD TIMER CONSTANT = 48 + OUT (CTCD),A ; SETUP CTCD TIMER CONSTANT + + #ELSE + .ECHO "*** ERROR: CTC REQUIRES INTMODE 2!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF #ENDIF ; #ENDIF @@ -1740,6 +1786,9 @@ HB_INITTBL: #IF (UFENABLE) .DW UF_INIT #ENDIF +#IF (CTCENABLE) + .DW CTC_INIT +#ENDIF ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; @@ -3197,6 +3246,14 @@ SIZ_UF .EQU $ - ORG_UF .ECHO SIZ_UF .ECHO " bytes.\n" #ENDIF +#IF (CTCENABLE) +ORG_CTC .EQU $ + #INCLUDE "ctcstub.asm" +SIZ_CTC .EQU $ - ORG_CTC + .ECHO "CTC occupies " + .ECHO SIZ_CTC + .ECHO " bytes.\n" +#ENDIF ; #DEFINE USEDELAY #INCLUDE "util.asm"