diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 015fe5c4..8f7e32f3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -992,8 +992,10 @@ PSCNX .EQU $ + 1 ; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. ; #IF (INTMODE == 2) - LD HL,INT_TIMER - LD (HBX_IVT),HL +; + ; TIMER INTERRUPT IS ON CTCB, VECTOR IS SECOND IVT SLOT + LD HL,INT_TIMER ; TIMER INT HANDLER ADR + LD (HBX_IVT + 2),HL ; IVT SLOT 2 ; ; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR ; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE @@ -1002,21 +1004,37 @@ PSCNX .EQU $ + 1 LD A,0 OUT (CTCBASE),A ; SETUP CTC BASE INT VECTOR ; - ; CONFIGURE CHANNEL A FOR 50HZ PERIODIC INTERRUPTS - ; INT FREQ IS CTC CLK / PRESCALER / TIME CONSTANT + ; CTCA IS SLAVED (WIRED) TO TO CTCB TO ACT AS A PRESCALER + ; CONFIGURE CHANNEL B FOR 50HZ PERIODIC INTERRUPTS + ; CTC CLK = 921,200HZ + ; CTCA TIME CONSTANT = 256 + ; CTCB TIME CONSTANT = 72 + ; INT FREQ IS CTC CLK / CTCA TC / CTCB TC ; WHICH IS 921,600HZ / 256 / 72 = 50HZ - LD A,%10110111 ; CTC CONTROL WORD VALUE - ; |||||||+-- 0=CONTROL WORD FLAG + LD A,%01010111 ; CTCA 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 256 - ; |+-------- 0=TIMER MODE + ; ||+------- 1=PRESCALER OF 16 (NOT USED) + ; |+-------- 1=COUNTER MODE + ; +--------- 0=NO INTERRUPTS + OUT (CTCA),A ; SETUP CTCA + LD A,0 ; CTCA TIMER CONSTANT = 256, 0 MEANS 256 + OUT (CTCA),A ; SETUP CTCA TIMER CONSTANT + LD A,%11010111 ; CTCB 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 (CTCA),A ; SETUP CTC CHANNEL A - LD A,72 ; TIMER CONSTANT FOR 50HZ - OUT (CTCA),A ; SETUP CTC CHANNEL A TIMER CONSTANT + OUT (CTCB),A ; SETUP CTCB + LD A,72 ; CTCB TIMER CONSTANT = 72 + OUT (CTCB),A ; SETUP CTCB TIMER CONSTANT #ENDIF ; #ENDIF @@ -1029,8 +1047,10 @@ PSCNX .EQU $ + 1 ; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. ; #IF (INTMODE == 2) - LD HL,INT_TIMER - LD (HBX_IVT + IVT_TIM0),HL +; + ; TIMER INTERRUPT IS ON CTCD, VECTOR IS FOURTH IVT SLOT + LD HL,INT_TIMER ; TIMER INT HANDLER ADR + LD (HBX_IVT + 6),HL ; IVT SLOT 4 ; ; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR ; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE @@ -1039,28 +1059,40 @@ PSCNX .EQU $ + 1 LD A,0 OUT (CTCBASE),A ; SETUP CTC BASE INT VECTOR ; - ; CONFIGURE CHANNEL C FOR 50HZ PERIODIC INTERRUPTS - ; INT FREQ IS CTC CLK / PRESCALER / TIME CONSTANT + ; CTCC IS SLAVED (WIRED) TO TO CTCD TO ACT AS A PRESCALER + ; CONFIGURE CHANNEL D FOR 50HZ PERIODIC INTERRUPTS + ; CTC CLK = 921,200HZ + ; CTCC TIME CONSTANT = 256 + ; CTCD TIME CONSTANT = 72 + ; INT FREQ IS CTC CLK / CTCC TC / CTCD TC ; WHICH IS 921,600HZ / 256 / 72 = 50HZ - LD A,%10110111 ; CTC CONTROL WORD VALUE - ; |||||||+-- 0=CONTROL WORD FLAG + 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 256 - ; |+-------- 0=TIMER MODE + ; ||+------- 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 (CTCC),A ; SETUP CTC CHANNEL C - LD A,72 ; TIMER CONSTANT FOR 50HZ - OUT (CTCC),A ; SETUP CTC CHANNEL C TIMER CONSTANT + OUT (CTCD),A ; SETUP CTCD + LD A,72 ; CTCD TIMER CONSTANT = 72 + OUT (CTCD),A ; SETUP CTCD TIMER CONSTANT #ENDIF ; #ENDIF - - - - ; #IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4) | (PLATFORM == PLT_RC180)) ;