mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
50
Source/HBIOS/Config/RCZ80_kio.asm
Normal file
50
Source/HBIOS/Config/RCZ80_kio.asm
Normal file
@@ -0,0 +1,50 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; RC2014 Z80 STANDARD CONFIGURATION W/ KIO
|
||||
;==================================================================================================
|
||||
;
|
||||
; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE
|
||||
; CFG_<PLT>.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS
|
||||
; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE
|
||||
; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS.
|
||||
; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE <PLT>_XXX.ASM AND SPECIFY
|
||||
; YOUR FILE IN THE BUILD PROCESS.
|
||||
;
|
||||
; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM.
|
||||
; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO
|
||||
; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON
|
||||
; SETTINGS.
|
||||
;
|
||||
; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE,
|
||||
; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING
|
||||
; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS!
|
||||
;
|
||||
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO
|
||||
; DIRECTORIES ABOVE THIS ONE).
|
||||
;
|
||||
#include "cfg_rcz80.asm"
|
||||
;
|
||||
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
|
||||
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
|
||||
DEFSERCFG .SET SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
|
||||
;
|
||||
KIOENABLE .SET TRUE ; ENABLE ZILOG KIO SUPPORT
|
||||
;
|
||||
CTCENABLE .SET TRUE ; ENABLE ZILOG CTC SUPPORT
|
||||
CTCBASE .SET KIOBASE+$04 ; CTC BASE I/O ADDRESS
|
||||
;
|
||||
DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
|
||||
;
|
||||
ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM)
|
||||
SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM)
|
||||
SIOCNT .SET 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP
|
||||
SIO0MODE .SET SIOMODE_EZZ80 ; SIO 0: CHIP TYPE: SIOMODE_[RC|SMB|ZP|EZZ80]
|
||||
SIO0BASE .SET KIOBASE+$08 ; SIO 0: REGISTERS BASE ADR
|
||||
;
|
||||
FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM)
|
||||
FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3]
|
||||
;
|
||||
IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM)
|
||||
IDEMODE .SET IDEMODE_RC ; IDE: DRIVER MODE: IDEMODE_[DIO|DIDE]
|
||||
;
|
||||
PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
|
||||
@@ -37,6 +37,9 @@ MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY)
|
||||
RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR
|
||||
WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU TRUE ; ENABLE ZILOG CTC SUPPORT
|
||||
CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS
|
||||
;
|
||||
|
||||
@@ -55,6 +55,9 @@ RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
|
||||
WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
|
||||
PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
CTCBASE .EQU $20 ; CTC BASE I/O ADDRESS
|
||||
;
|
||||
|
||||
@@ -42,6 +42,9 @@ MK4_RTC .EQU $8A ; MK4: RTC LATCH REGISTER ADR
|
||||
;
|
||||
RTCIO .EQU MK4_RTC ; RTC LATCH REGISTER ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -45,6 +45,9 @@ N8_DEFACR .EQU $1B ; N8: AUX CTL REGISTER DEFAULT VALUE (QUIESCIENT STATE)
|
||||
RTCIO .EQU N8_RTC ; RTC LATCH REGISTER ADR
|
||||
PPIBASE .EQU N8_PPI0 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -42,6 +42,9 @@ Z180_IOWAIT .EQU 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
|
||||
;
|
||||
RTCIO .EQU $0C ; RTC LATCH REGISTER ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -36,7 +36,11 @@ MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY)
|
||||
;
|
||||
RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS
|
||||
;
|
||||
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
|
||||
|
||||
@@ -34,6 +34,9 @@ MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY)
|
||||
RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
|
||||
PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -37,6 +37,9 @@ Z180_IOWAIT .EQU 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
|
||||
;
|
||||
RTCIO .EQU $0C ; RTC LATCH REGISTER ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -34,6 +34,9 @@ MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY)
|
||||
RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
|
||||
PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT
|
||||
;
|
||||
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
|
||||
|
||||
@@ -37,6 +37,9 @@ MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY)
|
||||
RTCIO .EQU $70 ; RTC LATCH REGISTER ADR
|
||||
PPIBASE .EQU $60 ; PRIMARY PARALLEL PORT REGISTERS BASE ADR
|
||||
;
|
||||
KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT
|
||||
KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS
|
||||
;
|
||||
CTCENABLE .EQU TRUE ; ENABLE ZILOG CTC SUPPORT
|
||||
CTCBASE .EQU $20 ; CTC BASE I/O ADDRESS
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 9
|
||||
#DEFINE RUP 2
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.9.2-pre.9"
|
||||
#DEFINE BIOSVER "2.9.2-pre.10"
|
||||
|
||||
Reference in New Issue
Block a user