|
|
|
@ -70,8 +70,6 @@ |
|
|
|
; |
|
|
|
#DEFINE HBIOS |
|
|
|
; |
|
|
|
;;;#DEFINE TESTING |
|
|
|
; |
|
|
|
; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. |
|
|
|
; |
|
|
|
MODCNT .EQU 0 |
|
|
|
@ -188,19 +186,11 @@ RTCDEF .SET RTCDEF | %00000001 ; SC128 I2C SCL BIT |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC)) |
|
|
|
#IF (CPUSPDDEF==SPD_HIGH) |
|
|
|
RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED HIGH |
|
|
|
#ELSE |
|
|
|
RTCDEF .SET RTCDEF & ~%00001000 ; DEFAULT SPEED LOW |
|
|
|
#ENDIF |
|
|
|
RTCDEF .SET RTCDEF & ~%00001000 ; INITIAL SPEED LOW |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_SBC)) |
|
|
|
#IF (CPUSPDDEF==SPD_HIGH) |
|
|
|
RTCDEF .SET RTCDEF & ~%00001000 ; DEFAULT SPEED HIGH |
|
|
|
#ELSE |
|
|
|
RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED LOW |
|
|
|
#ENDIF |
|
|
|
RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; |
|
|
|
@ -1775,56 +1765,119 @@ HB_CPU1: |
|
|
|
OUT ($6D),A ; IMPLEMENT IT |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
DIAG(%00011111) |
|
|
|
; |
|
|
|
; INIT OSCILLATOR SPEED FROM CONFIG |
|
|
|
; |
|
|
|
LD HL,CPUOSC / 1000 |
|
|
|
LD (HB_CPUOSC),HL |
|
|
|
; |
|
|
|
; ATTEMPT DYNAMIC CPU SPEED DERIVATION |
|
|
|
; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, |
|
|
|
; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST |
|
|
|
; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED |
|
|
|
; LATER. |
|
|
|
; |
|
|
|
CALL HB_CPUSPD ; CPU SPEED DETECTION |
|
|
|
JR NZ,HB_CPUSPD2 ; SKIP IF FAILED |
|
|
|
; |
|
|
|
; RECORD THE UPDATED CPU OSCILLATOR SPEED |
|
|
|
; |
|
|
|
#IF ((CPUFAM == CPU_Z180) | (CPUSPDCAP == SPD_HILO)) |
|
|
|
; SPEED MEASURED WILL BE HALF OSCILLATOR SPEED |
|
|
|
; SO RECORD DOUBLE THE MEASURED VALUE |
|
|
|
SLA L |
|
|
|
RL H |
|
|
|
LD (HB_CPUOSC),HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
HB_CPUSPD2: |
|
|
|
; |
|
|
|
; INIT CPUKHZ BASED ON OSCILLATOR SPEED |
|
|
|
; |
|
|
|
LD HL,(HB_CPUOSC) |
|
|
|
; |
|
|
|
; TRANSITION TO FINAL DESIRED CPU SPEED FOR THOSE PLATFORMS |
|
|
|
; THAT SUPPORT SOFTWARE SELECTABLE CPU SPEED. UPDATE CB_CPUKHZ |
|
|
|
; IN HCB AS WE DO THIS. |
|
|
|
; |
|
|
|
#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC) & (CPUSPDDEF==SPD_HIGH)) |
|
|
|
; SET HIGH SPEED VIA RTC LATCH |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
OR %00001000 ; SET HI SPEED BIT |
|
|
|
LD (HB_RTCVAL),A ; SAVE SHADOW |
|
|
|
OUT (RTCIO),A ; IMPLEMENT |
|
|
|
; HL IS ALREADY CORRECT FOR FULL SPEED OPERATION |
|
|
|
#ELSE |
|
|
|
; ADJUST HL TO REFLECT HALF SPEED OPERATION |
|
|
|
SRL H ; ADJUST HL ASSUMING |
|
|
|
RR L ; HALF SPEED OPERATION |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_SBC) & (CPUSPDDEF==SPD_HIGH)) |
|
|
|
; SET HIGH SPEED VIA RTC LATCH |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
AND ~%00001000 ; CLEAR HI SPEED BIT |
|
|
|
LD (HB_RTCVAL),A ; SAVE SHADOW |
|
|
|
OUT (RTCIO),A ; IMPLEMENT |
|
|
|
; HL IS ALREADY CORRECT FOR FULL SPEED OPERATION |
|
|
|
#ELSE |
|
|
|
; ADJUST HL TO REFLECT HALF SPEED OPERATION |
|
|
|
SRL H ; ADJUST HL ASSUMING |
|
|
|
RR L ; HALF SPEED OPERATION |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; |
|
|
|
; AT BOOT, Z180 PHI IS OSC / 2 |
|
|
|
LD C,(CPUOSC / 2) / 1000000 |
|
|
|
LD DE,(CPUOSC / 2) / 1000 |
|
|
|
LD HL,(HB_CPUOSC) ; INIT HL TO CPU OSC FREQ (KHZ) |
|
|
|
; |
|
|
|
#IF (Z180_CLKDIV == 0) |
|
|
|
; ADJUST HL TO REFLECT HALF SPEED OPERATION |
|
|
|
SRL H ; ADJUST HL ASSUMING |
|
|
|
RR L ; HALF SPEED OPERATION |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (Z180_CLKDIV >= 1) |
|
|
|
#IF (Z180_CLKDIV == 1) |
|
|
|
LD A,(HB_CPUTYPE) ; GET CPU TYPE |
|
|
|
CP 2 ; Z8S180 REV K OR BETTER? |
|
|
|
JR C,HB_CPU2 ; IF NOT, NOT POSSIBLE! |
|
|
|
JR C,HB_CPU3 ; IF NOT, NOT POSSIBLE! |
|
|
|
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED |
|
|
|
LD A,$80 |
|
|
|
OUT0 (Z180_CCR),A |
|
|
|
; REFLECT SPEED CHANGE |
|
|
|
LD C,CPUOSC / 1000000 |
|
|
|
LD DE,CPUOSC / 1000 |
|
|
|
; HL ALREADY REFLECTS FULL SPEED OPERATION |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; |
|
|
|
#IF (Z180_CLKDIV >= 2) |
|
|
|
LD A,(HB_CPUTYPE) ; GET CPU TYPE |
|
|
|
CP 3 ; Z8S180 REV N OR BETTER? |
|
|
|
JR C,HB_CPU2 ; IF NOT, NOT POSSIBLE! |
|
|
|
JR C,HB_CPU3 ; IF NOT, NOT POSSIBLE! |
|
|
|
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED |
|
|
|
; ALSO SET CCR AGAIN BECAUSE OF REPORTS THAT CCR |
|
|
|
; *MUST* BE SET AFTER CMR. |
|
|
|
LD A,$80 |
|
|
|
OUT0 (Z180_CMR),A ; CPU MULTIPLIER |
|
|
|
OUT0 (Z180_CCR),A ; CLOCK DIVIDE |
|
|
|
; REFLECT SPEED CHANGE |
|
|
|
LD C,(CPUOSC * 2) / 1000000 |
|
|
|
LD DE,(CPUOSC * 2) / 1000 |
|
|
|
; ADJUST HL TO REFLECT DOUBLE SPEED OPERATION |
|
|
|
SLA L |
|
|
|
RL H |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
HB_CPU2: |
|
|
|
; SAVE CPU SPEED IN CONFIG BLOCK |
|
|
|
LD A,C |
|
|
|
LD (CB_CPUMHZ),A |
|
|
|
LD (CB_CPUKHZ),DE |
|
|
|
; |
|
|
|
HB_CPU3: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
DIAG(%00011111) |
|
|
|
; |
|
|
|
; PERFORM DYNAMIC CPU SPEED DERIVATION |
|
|
|
; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. |
|
|
|
; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. |
|
|
|
; |
|
|
|
CALL HB_CPUSPD ; CPU SPEED DETECTION |
|
|
|
; |
|
|
|
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT |
|
|
|
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY |
|
|
|
LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ |
|
|
|
LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ |
|
|
|
CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER |
|
|
|
LD DE,500 ; SET UP TO ROUND UP |
|
|
|
XOR A ; IF WITHIN 500 KHZ |
|
|
|
SBC HL,DE ; REMAINDER - 500 |
|
|
|
CCF ; COMPLEMENT CF |
|
|
|
ADC A,C ; C -> A; ADD CF FOR ROUNDING |
|
|
|
LD (CB_CPUMHZ),A ; SAVE IT |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
; |
|
|
|
@ -1855,6 +1908,9 @@ HB_CPU2: |
|
|
|
LDCTL (C),HL |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT |
|
|
|
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
; SETUP Z80 IVT AND INT MODE 2 |
|
|
|
@ -1931,6 +1987,8 @@ HB_CPU2: |
|
|
|
; NOW IF DIVIDE BOTH SIDES BY 1000, WE CAN USE |
|
|
|
; CPUKHZ VALUE AND SIMPLIFY TO |
|
|
|
; RLDR = CPUKHZ |
|
|
|
XOR A ; ALL BITS ZERO |
|
|
|
OUT0 (Z180_TCR),A ; ... INHIBITS TIMER OPERATION |
|
|
|
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ |
|
|
|
OUT0 (Z180_TMDR0L),L ; INITIALIZE TIMER 0 DATA REGISTER |
|
|
|
OUT0 (Z180_TMDR0H),H |
|
|
|
@ -1997,6 +2055,7 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT |
|
|
|
CALL FILL ; DO IT |
|
|
|
; |
|
|
|
DIAG(%00111111) |
|
|
|
; |
|
|
|
#IF FALSE |
|
|
|
; |
|
|
|
; TEST DEBUG *************************************************************************************** |
|
|
|
@ -2025,8 +2084,6 @@ NOT_REC_M0: |
|
|
|
CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE |
|
|
|
; |
|
|
|
#IF (DSKYENABLE) |
|
|
|
;CALL DSKY_PREINIT |
|
|
|
|
|
|
|
LD HL,MSG_HBVER + 5 |
|
|
|
LD A,(DSKY_HEXMAP + RMJ) |
|
|
|
OR $80 |
|
|
|
@ -3812,14 +3869,18 @@ SYS_GETBNKINFO: |
|
|
|
; |
|
|
|
SYS_GETCPUSPD: |
|
|
|
; |
|
|
|
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) |
|
|
|
#IF (((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) & (CPUSPDCAP==SPD_HILO)) |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
BIT 3,A |
|
|
|
#IF (PLATFORM == PLT_SBC) |
|
|
|
XOR %00001000 ; SBC SPEED BIT IS INVERTED |
|
|
|
#ENDIF |
|
|
|
LD L,0 ; ASSUME HALF SPEED |
|
|
|
JR Z,SYS_GETCPUSPD1 |
|
|
|
LD L,1 |
|
|
|
SYS_GETCPUSPD1: |
|
|
|
LD DE,$FFFF ; UNKNOWN WAIT STATES |
|
|
|
; |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
@ -4040,9 +4101,9 @@ SYS_SETSECS: |
|
|
|
; |
|
|
|
SYS_SETCPUSPD: |
|
|
|
; |
|
|
|
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) |
|
|
|
#IF (((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) & (CPUSPDCAP==SPD_HILO)) |
|
|
|
; |
|
|
|
; WAIT STATE SETTINGS ARE IGNORED FOR Z80 |
|
|
|
; NOTE: WAIT STATE SETTINGS ARE IGNORED FOR Z80 |
|
|
|
; |
|
|
|
LD A,L ; CLK SPD TO ACCUM |
|
|
|
LD C,%00000000 ; HALF SPEED |
|
|
|
@ -4056,24 +4117,69 @@ SYS_SETCPUSPD1: |
|
|
|
LD A,(HB_RTCVAL) |
|
|
|
AND ~%00001000 ; CLEAR SPEED BIT |
|
|
|
OR C ; IMPLEMENT NEW SPEED BIT |
|
|
|
#IF (PLATFORM == PLT_SBC) |
|
|
|
; SBC SPEED BIT IS INVERTED, ADJUST IT |
|
|
|
LD A,C |
|
|
|
XOR %00001000 |
|
|
|
LD C,A |
|
|
|
#ENDIF |
|
|
|
LD (HB_RTCVAL),A ; SAVE IN SHADOW REGISTER |
|
|
|
OUT (RTCIO),A ; UPDATE HARDWARE REGISTER |
|
|
|
; |
|
|
|
; UPDATE THE CURRENT CPU SPEED IN HCB! |
|
|
|
LD A,L |
|
|
|
LD HL,(HB_CPUOSC) ; ASSUME FULL SPEED |
|
|
|
CP 1 ; CHECK FOR 1 (FULL SPEED) |
|
|
|
JR Z,SYS_SETCPUSPD2 ; IF SO, ALL DONE |
|
|
|
; ADJUST HL TO REFLECT HALF SPEED OPERATION |
|
|
|
SRL H ; ADJUST HL ASSUMING |
|
|
|
RR L ; HALF SPEED OPERATION |
|
|
|
; |
|
|
|
SYS_SETCPUSPD2: |
|
|
|
; |
|
|
|
; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. |
|
|
|
; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. |
|
|
|
; |
|
|
|
LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ |
|
|
|
LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ |
|
|
|
CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER |
|
|
|
LD DE,500 ; SET UP TO ROUND UP |
|
|
|
XOR A ; IF WITHIN 500 KHZ |
|
|
|
SBC HL,DE ; REMAINDER - 500 |
|
|
|
CCF ; COMPLEMENT CF |
|
|
|
ADC A,C ; C -> A; ADD CF FOR ROUNDING |
|
|
|
LD (CB_CPUMHZ),A ; SAVE IT |
|
|
|
; |
|
|
|
; REINIT DELAY ROUTINE |
|
|
|
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT |
|
|
|
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY |
|
|
|
; |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
|
PUSH DE ; SAVE WAIT STATES FOR NOW |
|
|
|
LD A,L ; CLK SPD TO ACCUM |
|
|
|
LD B,0 ; B HAS BIT FOR CMR |
|
|
|
LD C,0 ; C HAS BIT FOR CCR |
|
|
|
CP 2 ; DOUBLE SPEED? |
|
|
|
JR C,SYS_SETCPUSPD1 |
|
|
|
LD B,%10000000 |
|
|
|
JR C,SYS_SETCPUSPD1 ; <2?, SKIP AHEAD |
|
|
|
LD B,%10000000 ; SET CMR BIT |
|
|
|
SYS_SETCPUSPD1: |
|
|
|
CP 1 |
|
|
|
JR C,SYS_SETCPUSPD2 |
|
|
|
LD C,%10000000 |
|
|
|
CP 1 ; FULL SPEED? |
|
|
|
JR C,SYS_SETCPUSPD2 ; <1?, SKIP AHEAD |
|
|
|
LD C,%10000000 ; SET CCR BIT |
|
|
|
SYS_SETCPUSPD2: |
|
|
|
; BEFORE IMPLEMENTING THE NEW CPU SPEED, WE SWITCH THE |
|
|
|
; WAIT STATES TO MAXIMUM BECAUSE WE MAY BE IMPLEMENTING |
|
|
|
; SLOWER WAIT STATES REQUIRED BY THE NEW SPEED. WE SAVE |
|
|
|
; THE ORIGINAL WAIT STATES REGISTER VALUE ON STACK |
|
|
|
IN0 A,(Z180_DCNTL) ; GET CURRENT REGISTER VALUE |
|
|
|
LD E,A ; PUT IN L |
|
|
|
PUSH DE ; SAVE FOR LATER |
|
|
|
OR %11110000 ; MAX WAIT STATES |
|
|
|
OUT0 (Z180_DCNTL),A ; DO IT |
|
|
|
; |
|
|
|
IN0 A,(Z180_CMR) |
|
|
|
AND ~%10000000 |
|
|
|
@ -4084,6 +4190,105 @@ SYS_SETCPUSPD2: |
|
|
|
AND ~%10000000 |
|
|
|
OR C |
|
|
|
OUT0 (Z180_CCR),A |
|
|
|
; |
|
|
|
; UPDATE THE CURRENT CPU SPEED IN HCB! |
|
|
|
LD A,L ; SETTING TO A |
|
|
|
LD HL,(HB_CPUOSC) ; START WITH CPU OSC VALUE |
|
|
|
; ADJUST HL TO REFLECT HALF SPEED OPERATION |
|
|
|
SRL H ; ADJUST HL ASSUMING |
|
|
|
RR L ; HALF SPEED OPERATION |
|
|
|
OR A ; CHECK FOR HALF SPEED |
|
|
|
JR Z,SETCPUSPD2A ; IF SO, DONE |
|
|
|
; ADJUST HL TO REFLECT FULL SPEED OPERATION |
|
|
|
SLA L |
|
|
|
RL H |
|
|
|
CP 1 ; CHECK FOR FULL SPEED |
|
|
|
JR Z,SETCPUSPD2A ; IF SO DONE |
|
|
|
; ADJUST HL TO REFLECT DOUBLE SPEED OPERATION |
|
|
|
SLA L |
|
|
|
RL H |
|
|
|
; |
|
|
|
SETCPUSPD2A: |
|
|
|
; |
|
|
|
; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. |
|
|
|
; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. |
|
|
|
; |
|
|
|
LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ |
|
|
|
LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ |
|
|
|
CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER |
|
|
|
LD DE,500 ; SET UP TO ROUND UP |
|
|
|
XOR A ; IF WITHIN 500 KHZ |
|
|
|
SBC HL,DE ; REMAINDER - 500 |
|
|
|
CCF ; COMPLEMENT CF |
|
|
|
ADC A,C ; C -> A; ADD CF FOR ROUNDING |
|
|
|
LD (CB_CPUMHZ),A ; SAVE IT |
|
|
|
; |
|
|
|
; NOW IMPLEMENT ANY WAIT STATE CHANGES. |
|
|
|
POP HL ; INIT L WITH ORIG VALUE |
|
|
|
POP DE ; RECOVER WAIT STATES |
|
|
|
LD A,D ; GET MEM WS |
|
|
|
CP $FF ; SKIP? |
|
|
|
JR Z,SYS_SETCPUSPD3 ; IF SO, GO AHEAD |
|
|
|
AND %00000011 ; JUST TWO BITS |
|
|
|
RRCA ; MEM WS IS TOP TWO BITS |
|
|
|
RRCA |
|
|
|
LD H,A ; MOVE WS BITS TO H |
|
|
|
LD A,L ; CUR VALUE TO A |
|
|
|
AND %00111111 ; MASK OFF MEM WS BITS |
|
|
|
OR H ; SET NEW MEM WS BITS |
|
|
|
LD L,A ; BACK TO L |
|
|
|
; |
|
|
|
SYS_SETCPUSPD3: |
|
|
|
; |
|
|
|
LD A,E ; GET I/O WS |
|
|
|
CP $FF ; SKIP? |
|
|
|
JR Z,SYS_SETCPUSPD4 ; IF SO, GO AHEAD |
|
|
|
DEC A ; ADJUST FOR BUILT-IN I/O WS |
|
|
|
AND %00000011 ; JUST TWO BITS |
|
|
|
RRCA ; I/O WS IS BITS 5-4 |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
LD H,A ; MOVE WS BITS TO H |
|
|
|
LD A,L ; CUR VALUE TO A |
|
|
|
AND %11001111 ; MASK OFF I/O WS BITS |
|
|
|
OR H ; SET NEW I/O WS BITS |
|
|
|
LD L,A ; BACK TO L |
|
|
|
; |
|
|
|
SYS_SETCPUSPD4: |
|
|
|
LD A,L ; WORKING VALUE TO A |
|
|
|
OUT0 (Z180_DCNTL),A ; IMPLEMENT NEW VALUE |
|
|
|
; |
|
|
|
; REINIT DELAY ROUTINE |
|
|
|
LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT |
|
|
|
CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY |
|
|
|
; |
|
|
|
#IF ((INTMODE == 2) & (Z180_TIMER)) |
|
|
|
; THE Z180 TIMER IS BASED ON CPU SPEED. SO HERE |
|
|
|
; WE RECOMPUTE THE TIMER CONSTANTS BASED ON THE NEW SPEED. |
|
|
|
XOR A ; ALL BITS ZERO |
|
|
|
OUT0 (Z180_TCR),A ; ... INHIBITS TIMER OPERATION |
|
|
|
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ |
|
|
|
OUT0 (Z180_TMDR0L),L ; INITIALIZE TIMER 0 DATA REGISTER |
|
|
|
OUT0 (Z180_TMDR0H),H |
|
|
|
DEC HL ; RELOAD OCCURS *AFTER* ZERO |
|
|
|
OUT0 (Z180_RLDR0L),L ; INITIALIZE TIMER 0 RELOAD REGISTER |
|
|
|
OUT0 (Z180_RLDR0H),H |
|
|
|
LD A,%00010001 ; ENABLE TIMER0 INT AND DOWN COUNTING |
|
|
|
OUT0 (Z180_TCR),A |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (ASCIENABLE) |
|
|
|
; RESET THE ASCI PORTS IN CASE SPEED CHANGED! |
|
|
|
; N.B., THIS WILL FAIL IF THE CURRENT BAUD RATE |
|
|
|
; IS IMPOSSIBLE TO IMPLEMENT AT THE NEW CPU SPEED!!! |
|
|
|
LD DE,-1 |
|
|
|
LD IY,ASCI0_CFG |
|
|
|
CALL ASCI_INITDEV |
|
|
|
LD DE,-1 |
|
|
|
LD IY,ASCI1_CFG |
|
|
|
CALL ASCI_INITDEV |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
@ -5595,16 +5800,8 @@ HB_CPUSPD1: |
|
|
|
SLA L |
|
|
|
RL H |
|
|
|
; |
|
|
|
LD (CB_CPUKHZ),HL ; HL=CPU SPEED IN KHZ |
|
|
|
LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ |
|
|
|
CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER |
|
|
|
LD DE,500 ; SET UP TO ROUND UP |
|
|
|
XOR A ; IF WITHIN 500 KHZ |
|
|
|
SBC HL,DE ; REMAINDER - 500 |
|
|
|
CCF ; COMPLEMENT CF |
|
|
|
ADC A,C ; C -> A; ADD CF FOR ROUNDING |
|
|
|
LD (CB_CPUMHZ),A ; SAVE IT |
|
|
|
; |
|
|
|
; RETURN CURRENT CPU SPD (KHZ) IN HL |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
HB_WAITSEC: |
|
|
|
@ -5657,6 +5854,7 @@ HB_RDSEC: |
|
|
|
; |
|
|
|
#ELSE |
|
|
|
; |
|
|
|
OR $FF ; SIGNAL ERROR |
|
|
|
RET ; NO RTC, ABORT |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
@ -6536,6 +6734,7 @@ HB_SECTCK .DB TICKFREQ ; TICK COUNTER FOR FRACTIONAL SECONDS |
|
|
|
HB_SECS .FILL 4,0 ; 32 BIT SECONDS COUNTER |
|
|
|
; |
|
|
|
HB_CPUTYPE .DB 0 ; 0=Z80, 1=80180, 2=SL1960, 3=ASCI BRG |
|
|
|
HB_CPUOSC .DW CPUOSC ; ACTUAL CPU HARDWARE OSC FREQ IN KHZ |
|
|
|
; |
|
|
|
IOPRVAL .DW 0 ; TEMP STORAGE FOR IOPR |
|
|
|
; |
|
|
|
|