Browse Source

Add System Timer to Z280 IM3

- Z280 counter/timer is now used to implement 50Hz system timer based on CPU oscillator.
- Bug fix in EI <mask> opcodes.
pull/199/head
Wayne Warthen 5 years ago
parent
commit
8fa14863f8
  1. 101
      Source/HBIOS/hbios.asm
  2. 2
      Source/ver.inc
  3. 2
      Source/ver.lib

101
Source/HBIOS/hbios.asm

@ -118,9 +118,11 @@ MODCNT .SET MODCNT + 1
#ELSE #ELSE
#IF (CPUFAM == CPU_Z280) #IF (CPUFAM == CPU_Z280)
#IF (INTMODE == 3) #IF (INTMODE == 3)
; Z280 MODE 3 INTERRUPT HANDLING (INTA & UART ENABLED)
; Z280 MODE 3 INTERRUPT HANDLING (INTA, C/T 0, & UART RCVR ENABLED)
#DEFINE HB_DI DI #DEFINE HB_DI DI
#DEFINE HB_EI .DB $ED,$F7,$09
;#DEFINE HB_DI .DB $ED,$77,$7F
;#DEFINE HB_EI EI
#DEFINE HB_EI .DB $ED,$7F,$0B
#ELSE #ELSE
; Z280 MODE 1/2 INTERRUPT HANDLING ; Z280 MODE 1/2 INTERRUPT HANDLING
#DEFINE HB_DI DI #DEFINE HB_DI DI
@ -802,7 +804,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE
POP HL ; RESTORE HL POP HL ; RESTORE HL
CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS
.DB $ED,$55 ; BACK TO USER LAND
.DB $ED,$55 ; RETIL
; ;
HBX_RETI: HBX_RETI:
RETI RETI
@ -1033,7 +1035,7 @@ HB_START:
; DISABLE MEMORY REFRESH CYCLES ; DISABLE MEMORY REFRESH CYCLES
LD A,$08 ; DISABLED LD A,$08 ; DISABLED
OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER
;
; RESTORE I/O PAGE TO $00 ; RESTORE I/O PAGE TO $00
LD L,$00 ; NORMAL I/O REG IS $00 LD L,$00 ; NORMAL I/O REG IS $00
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
@ -1593,6 +1595,39 @@ HB_CPU2:
; ;
#ENDIF #ENDIF
; ;
#IF (CPUFAM == CPU_Z280)
;
#IF (INTMODE == 3)
;
Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT
;
LD HL,Z280_TIMINT
LD (Z280_IVT+$16),HL ; Z280 T/C VECTOR
;
; SELECT I/O PAGE $FE
LD L,$FE ; COUNTER/TIMER I/O PAGE
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
.DB $ED,$6E ; LDCTL (C),HL
;
LD A,%10100000 ; CONFIG: C, RE, IE
OUT (Z280_CT0_CFG),A ; SET C/T 0
LD HL,Z280_TC ; TIME CONSTANT & COUNTER
LD C,Z280_CT0_TC ; SET C/T 0
.DB $ED,$BF ; OUTW (C),HL
LD C,Z280_CT0_CT ; SET C/T 0
.DB $ED,$BF ; OUTW (C),HL
LD A,%11100000 ; CMD: EN, GT
OUT (Z280_CT0_CMDST),A ; SET C/T 0
;
; RESTORE I/O PAGE TO $00
LD L,$00 ; NORMAL I/O REG IS $00
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
.DB $ED,$6E ; LDCTL (C),HL
;
#ENDIF
;
#ENDIF
;
; INITIALIZE HEAP STORAGE ; INITIALIZE HEAP STORAGE
; ;
; INITIALIZE POINTERS ; INITIALIZE POINTERS
@ -3462,10 +3497,65 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY
; ;
#ENDIF #ENDIF
; ;
;
;
#IF (MEMMGR == MM_Z280)
Z280_TIMINT:
; DISCARD REASON CODE
INC SP
INC SP
;
; SAVE INCOMING REGISTERS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
;
; CALL PRIMARY TIMER LOGIC
CALL HB_TIMINT
;
; SELECT I/O PAGE $FE
LD L,$FE ; COUNTER/TIMER I/O PAGE
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
.DB $ED,$6E ; LDCTL (C),HL
;
; CLEAR END OF COUNT CONDITION TO RESET INTERRUPT
IN A,(Z280_CT0_CMDST) ; GET STATUS
RES 1,A ; CLEAR CC
OUT (Z280_CT0_CMDST),A ; SET C/T 0
;
; RESTORE I/O PAGE TO $00
LD L,$00 ; NORMAL I/O REG IS $00
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
.DB $ED,$6E ; LDCTL (C),HL
;
; RESTORE REGISTERS
POP HL
POP DE
POP BC
POP AF
;
.DB $ED,$55 ; RETIL
;
#ENDIF
;
;
;
HB_TIMINT:
#IF 0 ; *DEBUG*
LD HL,HB_TIMDBGCNT
INC (HL)
LD A,(HL)
OUT (DIAGPORT),A
JR HB_TIMDBG1
HB_TIMDBGCNT .DB 0
HB_TIMDBG1:
#ENDIF ; *DEBUG*
;
; TIMER HANDLER VECTORS ; TIMER HANDLER VECTORS
; THESE CAN BE HOOKED AS DESIRED BY DRIVERS ; THESE CAN BE HOOKED AS DESIRED BY DRIVERS
; ;
HB_TIMINT:
VEC_TICK: VEC_TICK:
JP HB_TICK ; TICK PROCESSING VECTOR JP HB_TICK ; TICK PROCESSING VECTOR
VEC_SECOND: VEC_SECOND:
@ -3504,7 +3594,6 @@ HB_SECOND:
; INCREMENT SECONDS COUNTER ; INCREMENT SECONDS COUNTER
LD HL,HB_SECS ; POINT TO SECONDS COUNTER LD HL,HB_SECS ; POINT TO SECONDS COUNTER
JP INC32HL ; INCREMENT AND RETURN JP INC32HL ; INCREMENT AND RETURN
; ;
; BAD INTERRUPT HANDLER ; BAD INTERRUPT HANDLER
; ;

2
Source/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 1 #DEFINE RMN 1
#DEFINE RUP 1 #DEFINE RUP 1
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.1.1-pre.34"
#DEFINE BIOSVER "3.1.1-pre.35"

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 1
rup equ 1 rup equ 1
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.1.1-pre.34"
db "3.1.1-pre.35"
endm endm

Loading…
Cancel
Save