|
|
|
@ -992,6 +992,236 @@ HB_CPU1: |
|
|
|
LD A,L |
|
|
|
LD (HB_CPUTYPE),A |
|
|
|
; |
|
|
|
#IF (KIOENABLE) |
|
|
|
LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN |
|
|
|
OUT (KIOBASE+$0E),A ; DO IT |
|
|
|
CALL DLY64 ; WAIT A BIT FOR RESET TO COMPLETE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SETUP INTERRUPT VECTORS, AS APPROPRIATE |
|
|
|
; |
|
|
|
;#IF (INTMODE == 1) |
|
|
|
; ; OVERLAY $0038 WITH JP INT_IM1 |
|
|
|
; LD A,$C3 ; JP INSTRUCTION |
|
|
|
; LD ($0038),A ; INSTALL IT |
|
|
|
; LD HL,INT_IM1 ; DESTINATION ADDRESS |
|
|
|
; LD ($0039),HL ; INSTALL IT |
|
|
|
;#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; SETUP Z80 IVT AND INT MODE 2 |
|
|
|
LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS |
|
|
|
LD I,A ; ... AND PLACE IT IN I REGISTER |
|
|
|
|
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; SETUP Z180 IVT |
|
|
|
XOR A ; SETUP LO BYTE OF IVT ADDRESS |
|
|
|
OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
IM 2 ; SWITCH TO INT MODE 2 |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF (PLATFORM == PLT_SBC) |
|
|
|
; |
|
|
|
#IF (HTIMENABLE) ; SIMH TIMER |
|
|
|
; |
|
|
|
#IF (INTMODE == 1) |
|
|
|
LD HL,HB_TIMINT |
|
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
;LD HL,HB_TIMINT |
|
|
|
;LD (HBX_IVT),HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_ZETA2) |
|
|
|
; |
|
|
|
; 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) |
|
|
|
; |
|
|
|
; TIMER INTERRUPT IS ON CTCB, VECTOR IS SECOND IVT SLOT |
|
|
|
LD HL,HB_TIMINT ; TIMER INT HANDLER ADR |
|
|
|
LD (IVT(INT_CTC0B)),HL ; IVT ENTRY FOR CTC0B |
|
|
|
; |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; 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,%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 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 (CTCB),A ; SETUP CTCB |
|
|
|
LD A,72 ; CTCB TIMER CONSTANT = 72 |
|
|
|
OUT (CTCB),A ; SETUP CTCB TIMER CONSTANT |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_EZZ80) |
|
|
|
; |
|
|
|
; 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) |
|
|
|
; |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; CTCC IS SLAVED (WIRED) 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,%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,72 ; CTCD TIMER CONSTANT = 72 |
|
|
|
OUT (CTCD),A ; SETUP CTCD TIMER CONSTANT |
|
|
|
#ELSE |
|
|
|
.ECHO "*** ERROR: EZZ80 REQUIRES INTMODE 2!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_RCZ80) |
|
|
|
; |
|
|
|
; FOR NOW, THIS IS SPECIFICALLY FOR A CTC TO DRIVE AN SIO |
|
|
|
; AT 1:1 USING CTC CHANNELS A & B. IN OTHER WORDS, IT JUST |
|
|
|
; PASSES THE INCOMING TRIGGER OUT AT 1:1. NO INTERRUPTS. |
|
|
|
; |
|
|
|
#IF (CTCENABLE == TRUE) |
|
|
|
; |
|
|
|
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 |
|
|
|
; ||+------- 0=PRESCALER OF 16 (NOT USED) |
|
|
|
; |+-------- 1=COUNTER MODE |
|
|
|
; +--------- 0=NO INTERRUPTS |
|
|
|
OUT (CTCA),A ; SETUP CTCC |
|
|
|
LD A,1 ; CTCC TIMER CONSTANT = 1 |
|
|
|
OUT (CTCA),A ; SETUP CTCC TIMER CONSTANT |
|
|
|
; |
|
|
|
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 |
|
|
|
; ||+------- 0=PRESCALER OF 16 (NOT USED) |
|
|
|
; |+-------- 1=COUNTER MODE |
|
|
|
; +--------- 0=NO INTERRUPTS |
|
|
|
OUT (CTCB),A ; SETUP CTCC |
|
|
|
LD A,1 ; CTCC TIMER CONSTANT = 1 |
|
|
|
OUT (CTCB),A ; SETUP CTCC TIMER CONSTANT |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; |
|
|
|
; MASK ALL EXTERNAL INTERRUPTS FOR NOW |
|
|
|
LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED |
|
|
|
OUT0 (Z180_ITC),A ; WRITE TO INT/TRAP CONTROL REGISTER |
|
|
|
; |
|
|
|
; SETUP Z180 TIMER0 INTERRUPT VECTOR IN IVT |
|
|
|
LD HL,HB_TIMINT |
|
|
|
LD (IVT(INT_TIM0)),HL ; Z180 TIMER 0 |
|
|
|
|
|
|
|
; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0 |
|
|
|
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ |
|
|
|
LD B,0 |
|
|
|
LD C,Z180_RLDR0L ; INITIALIZE TIMER 0 RELOAD REGISTER |
|
|
|
OUT (C),L |
|
|
|
INC C |
|
|
|
OUT (C),H |
|
|
|
LD C,Z180_TMDR0L ; INITIALIZE TIMER 0 DATA REGISTER |
|
|
|
OUT (C),L |
|
|
|
INC C |
|
|
|
OUT (C),H |
|
|
|
LD A,%00010001 ; ENABLE TIMER0 INT AND DOWN COUNTING |
|
|
|
OUT0 (Z180_TCR),A |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; |
|
|
|
; AT BOOT, Z180 PHI IS OSC / 2 |
|
|
|
@ -1180,192 +1410,6 @@ PSCNX .EQU $ + 1 |
|
|
|
DJNZ PSCN1 |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SETUP INTERRUPT VECTORS, AS APPROPRIATE |
|
|
|
; |
|
|
|
;#IF (INTMODE == 1) |
|
|
|
; ; OVERLAY $0038 WITH JP INT_IM1 |
|
|
|
; LD A,$C3 ; JP INSTRUCTION |
|
|
|
; LD ($0038),A ; INSTALL IT |
|
|
|
; LD HL,INT_IM1 ; DESTINATION ADDRESS |
|
|
|
; LD ($0039),HL ; INSTALL IT |
|
|
|
;#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; SETUP Z80 IVT AND INT MODE 2 |
|
|
|
LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS |
|
|
|
LD I,A ; ... AND PLACE IT IN I REGISTER |
|
|
|
|
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; SETUP Z180 IVT |
|
|
|
XOR A ; SETUP LO BYTE OF IVT ADDRESS |
|
|
|
OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
IM 2 ; SWITCH TO INT MODE 2 |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF (PLATFORM == PLT_SBC) |
|
|
|
; |
|
|
|
#IF (HTIMENABLE) ; SIMH TIMER |
|
|
|
; |
|
|
|
#IF (INTMODE == 1) |
|
|
|
LD HL,HB_TIMINT |
|
|
|
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
;LD HL,HB_TIMINT |
|
|
|
;LD (HBX_IVT),HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_ZETA2) |
|
|
|
; |
|
|
|
; 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) |
|
|
|
; |
|
|
|
; TIMER INTERRUPT IS ON CTCB, VECTOR IS SECOND IVT SLOT |
|
|
|
LD HL,HB_TIMINT ; TIMER INT HANDLER ADR |
|
|
|
LD (IVT(INT_CTC0B)),HL ; IVT ENTRY FOR CTC0B |
|
|
|
; |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; 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,%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 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 (CTCB),A ; SETUP CTCB |
|
|
|
LD A,72 ; CTCB TIMER CONSTANT = 72 |
|
|
|
OUT (CTCB),A ; SETUP CTCB TIMER CONSTANT |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_EZZ80) |
|
|
|
; |
|
|
|
; 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) |
|
|
|
; |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; CTCC IS SLAVED (WIRED) 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,%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,72 ; CTCD TIMER CONSTANT = 72 |
|
|
|
OUT (CTCD),A ; SETUP CTCD TIMER CONSTANT |
|
|
|
#ELSE |
|
|
|
.ECHO "*** ERROR: EZZ80 REQUIRES INTMODE 2!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; |
|
|
|
; MASK ALL EXTERNAL INTERRUPTS FOR NOW |
|
|
|
LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED |
|
|
|
OUT0 (Z180_ITC),A ; WRITE TO INT/TRAP CONTROL REGISTER |
|
|
|
; |
|
|
|
; SETUP Z180 TIMER0 INTERRUPT VECTOR IN IVT |
|
|
|
LD HL,HB_TIMINT |
|
|
|
LD (IVT(INT_TIM0)),HL ; Z180 TIMER 0 |
|
|
|
|
|
|
|
; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0 |
|
|
|
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ |
|
|
|
LD B,0 |
|
|
|
LD C,Z180_RLDR0L ; INITIALIZE TIMER 0 RELOAD REGISTER |
|
|
|
OUT (C),L |
|
|
|
INC C |
|
|
|
OUT (C),H |
|
|
|
LD C,Z180_TMDR0L ; INITIALIZE TIMER 0 DATA REGISTER |
|
|
|
OUT (C),L |
|
|
|
INC C |
|
|
|
OUT (C),H |
|
|
|
LD A,%00010001 ; ENABLE TIMER0 INT AND DOWN COUNTING |
|
|
|
OUT0 (Z180_TCR),A |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF 0 |
|
|
|
HB_SPDTST: |
|
|
|
CALL HB_CPUSPD ; CPU SPEED DETECTION |
|
|
|
|