Browse Source

Fix CTC Support

pull/31/head
Wayne Warthen 7 years ago
parent
commit
b334a4224d
  1. 84
      Source/HBIOS/hbios.asm

84
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))
;

Loading…
Cancel
Save