Browse Source

ez80: specific implementation of DELAY and VDELAY function (using firmware helper)

The delay function is delegated to the on-chip ROM.

The on-chip ROM uses a programmable reload timer that is calibrated for a range of
CPU frequencies and wait states.
master
Dean Netherton 1 year ago
parent
commit
a24960a7d2
  1. 83
      Source/HBIOS/ez80cpudrv.asm
  2. 3
      Source/HBIOS/ez80instr.inc
  3. 44
      Source/HBIOS/hbios.asm
  4. 6
      Source/HBIOS/util.asm

83
Source/HBIOS/ez80cpudrv.asm

@ -12,9 +12,11 @@
; to communicate with the firmware to perform a number of initialisation tasks. ; to communicate with the firmware to perform a number of initialisation tasks.
; See also the associated ez80 platform drivers (ez80rtc, ez80systmr, ez80uart). ; See also the associated ez80 platform drivers (ez80rtc, ez80systmr, ez80uart).
; ;
; The driver 'exports' two key functions:
; The driver 'exports' the following:
; 1. EZ80_PREINIT - This function is called by the HBIOS boot code to initialise the eZ80 firmware. ; 1. EZ80_PREINIT - This function is called by the HBIOS boot code to initialise the eZ80 firmware.
; 2. EZ80_RPT_TIMINGS - This function is called by the HBIOS boot code to report the platform timings. ; 2. EZ80_RPT_TIMINGS - This function is called by the HBIOS boot code to report the platform timings.
; 3. DELAY - pause for approx 17us
; 4. VDELAY - pause for approx 17us * DE
; ;
; EZ80_PREINIT performs the following: ; EZ80_PREINIT performs the following:
; 1. Exchange platform version numbers ; 1. Exchange platform version numbers
@ -124,7 +126,10 @@ EZ80_PREINIT:
EZ80_TMR_SET_FREQTICK EZ80_TMR_SET_FREQTICK
RET RET
;
; --------------------------------
; eZ80 CPU DRIVER REPORT TIMINGS
; --------------------------------
EZ80_RPT_TIMINGS: EZ80_RPT_TIMINGS:
LD A, (EZ80_PLT_MEMWS) LD A, (EZ80_PLT_MEMWS)
BIT 7, A BIT 7, A
@ -161,7 +166,79 @@ EZ80_RPT_FSH_TIMINGS:
LD A, (EZ80_PLT_FLSHWS) LD A, (EZ80_PLT_FLSHWS)
CALL PRTDECB CALL PRTDECB
CALL PRTSTRD CALL PRTSTRD
.TEXT " FSH W/S$"
.TEXT " FSH W/S$";
;--------------------------------------------------------------------------------------------------
; DELAY LOOP TEST CALIBRATION
;--------------------------------------------------------------------------------------------------
;
; IF ENABLED, THE GPIO PCBx PINS OF THE EZ80 WILL BE TOGGLED AT 'DELAY' RATE * 16
; CAN BE USED TO VERIFY DELAY WORKS SUFFICIENT FOR DIFFERENT EZ80 CLOCK SPEEDS
; AND BUS CYCLES
;
#IF FALSE
; 7.3728 MHZ -- 1 MEM W/S, 6 I/O W/S, 0 FSH W/S - 428 - 26.7us
; 18.4320 MHZ -- 2 MEM W/S, 6 I/O W/S, 1 FSH W/S - 284 - 17.8us
; 20.0000 MHZ -- 2 MEM W/S, 6 I/O W/S, 1 FSH W/S - 281 - 17.6us
; 25.0000 MHZ -- 2 MEM W/S, 3 I/O B/C, 1 FSH W/S - 271 - 16.9us
; 32.0000 MHZ -- 3 MEM W/S, 4 I/O B/C, 2 FSH W/S - 289 - 18.0us
PC_DR: .equ $009E
PC_DDR: .equ $009F
DI
; ENABLE PC5 GPIO AS OUTPUT
LD BC, PC_DDR
XOR A
OUT (C), A
PUSH AF
LD BC, PC_DR
LOOP:
POP AF
OUT (C), A
CPL
PUSH AF
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
JR LOOP
#ENDIF
RET
DELAY:
EZ80_DELAY
EZ80_DELAY
EZ80_DELAY
RET
VDELAY:
EZ80_DELAY
DEC DE
LD A,D
OR E
JR NZ, VDELAY
RET RET
EZ80_RPT_FIRMWARE: EZ80_RPT_FIRMWARE:

3
Source/HBIOS/ez80instr.inc

@ -11,8 +11,11 @@
#DEFINE EZ80_IO .DB $49, $CF #DEFINE EZ80_IO .DB $49, $CF
; RST.L $10 ; RST.L $10
#DEFINE EZ80_FN .DB $49, $D7 #DEFINE EZ80_FN .DB $49, $D7
; RST.L $18
#DEFINE EZ80_DELAY .DB $49, $DF
#DEFINE EZ80_UTIL_VER_EXCH XOR A \ LD B, 0 \ EZ80_FN #DEFINE EZ80_UTIL_VER_EXCH XOR A \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_UTIL_DELAY XOR A \ LD B, 1 \ EZ80_FN
#DEFINE EZ80_UTIL_SET_BUSTM XOR A \ LD B, 3 \ EZ80_FN #DEFINE EZ80_UTIL_SET_BUSTM XOR A \ LD B, 3 \ EZ80_FN
#DEFINE EZ80_UTIL_SET_BUSFQ XOR A \ LD B, 4 \ EZ80_FN #DEFINE EZ80_UTIL_SET_BUSFQ XOR A \ LD B, 4 \ EZ80_FN
#DEFINE EZ80_UTIL_GET_CPU_FQ XOR A \ LD B, 5 \ EZ80_FN #DEFINE EZ80_UTIL_GET_CPU_FQ XOR A \ LD B, 5 \ EZ80_FN

44
Source/HBIOS/hbios.asm

@ -2570,8 +2570,10 @@ HB_CPU3:
; ;
;;; LOCATION OF THIS CODE??? ;;; LOCATION OF THIS CODE???
; ;
#IF (CPUFAM != CPU_EZ80)
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY
#ENDIF
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; SYSTEM TIMER INITIALIZATION ; SYSTEM TIMER INITIALIZATION
@ -2943,42 +2945,6 @@ PSCNX .EQU $ + 1
DJNZ PSCN1 DJNZ PSCN1
; ;
#ENDIF #ENDIF
#IF (CPUFAM == CPU_EZ80)
;
;--------------------------------------------------------------------------------------------------
; DELAY LOOP TEST CALIBRATION
;--------------------------------------------------------------------------------------------------
;
; IF ENABLED, THE GPIO PCBx PINS OF THE EZ80 WILL BE TOGGLED AT 'DELAY' RATE
; CAN BE USED TO VERIFY DELAY WORKS SUFFICIENT FOR DIFFERENT EZ80 CLOCK SPEEDS
; AND BUS CYCLES
;
#IF FALSE
PC_DR: .equ $009E
PC_DDR: .equ $009F
; ENABLE PC5 GPIO AS OUTPUT
LD BC, PC_DDR
XOR A
OUT (C), A
PUSH AF
LD BC, PC_DR
LD D, 0
LOOP:
POP AF
OUT (C), A
CPL
PUSH AF
LD DE, 2
CALL VDELAY
JR LOOP
#ENDIF
#ENDIF
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; CPU SPEED DETECTION ALIGNMENT TEST ; CPU SPEED DETECTION ALIGNMENT TEST
@ -5595,9 +5561,11 @@ SYS_SETCPUSPD2:
ADC A,C ; C -> A; ADD CF FOR ROUNDING ADC A,C ; C -> A; ADD CF FOR ROUNDING
LD (CB_CPUMHZ),A ; SAVE IT LD (CB_CPUMHZ),A ; SAVE IT
; ;
#IF (CPUFAM != CPU_EZ80)
; REINIT DELAY ROUTINE ; REINIT DELAY ROUTINE
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY
#ENDIF
; ;
SYS_SETCPUSPD3: SYS_SETCPUSPD3:
XOR A XOR A
@ -5640,9 +5608,11 @@ SYS_SETCPUSPD2:
ADC A,C ; C -> A; ADD CF FOR ROUNDING ADC A,C ; C -> A; ADD CF FOR ROUNDING
LD (CB_CPUMHZ),A ; SAVE IT LD (CB_CPUMHZ),A ; SAVE IT
; ;
#IF (CPUFAM != CPU_EZ80)
; REINIT DELAY ROUTINE ; REINIT DELAY ROUTINE
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY
#ENDIF
; ;
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
@ -5777,9 +5747,11 @@ SYS_SETCPUSPD4:
LD A,L ; WORKING VALUE TO A LD A,L ; WORKING VALUE TO A
OUT0 (Z180_DCNTL),A ; IMPLEMENT NEW VALUE OUT0 (Z180_DCNTL),A ; IMPLEMENT NEW VALUE
; ;
#IF (CPUFAM != CPU_EZ80)
; REINIT DELAY ROUTINE ; REINIT DELAY ROUTINE
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY
#ENDIF
; ;
#IF ((INTMODE == 2) & (Z180_TIMER)) #IF ((INTMODE == 2) & (Z180_TIMER))
; THE Z180 TIMER IS BASED ON CPU SPEED. SO HERE ; THE Z180 TIMER IS BASED ON CPU SPEED. SO HERE

6
Source/HBIOS/util.asm

@ -554,7 +554,7 @@ BYTE2BCD1:
RET RET
#IFDEF USEDELAY #IFDEF USEDELAY
#IF (CPUFAM != CPU_EZ80)
; ;
; DELAY 16US (CPU SPEED COMPENSATED) INCUDING CALL/RET INVOCATION ; DELAY 16US (CPU SPEED COMPENSATED) INCUDING CALL/RET INVOCATION
; REGISTER A AND FLAGS DESTROYED ; REGISTER A AND FLAGS DESTROYED
@ -632,6 +632,7 @@ VDELAY1: ; | |
; | ; |
RET ; 10TS (FINAL RETURN) | RET ; 10TS (FINAL RETURN) |
;---------------------------------------------------------------+ ;---------------------------------------------------------------+
#ENDIF
; ;
; DELAY ABOUT 0.5 SECONDS ; DELAY ABOUT 0.5 SECONDS
; 500000US / 16US = 31250 ; 500000US / 16US = 31250
@ -644,6 +645,7 @@ LDELAY:
POP DE POP DE
POP AF POP AF
RET RET
#IF (CPUFAM != CPU_EZ80)
; ;
; INITIALIZE DELAY SCALER BASED ON OPERATING CPU SPEED ; INITIALIZE DELAY SCALER BASED ON OPERATING CPU SPEED
; ENTER WITH A = CPU SPEED IN MHZ ; ENTER WITH A = CPU SPEED IN MHZ
@ -666,6 +668,8 @@ CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ
#ENDIF #ENDIF
; ;
#ENDIF #ENDIF
#ENDIF
; ;
; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY ; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY
; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE ; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE

Loading…
Cancel
Save