From 77d201f9d3c62295c97a6b136c73662afb5a3dfb Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 24 May 2025 16:10:39 -0700 Subject: [PATCH] CPU Speed LCD Dynamic Update, Issue #520 - Enable dynamic update of CPU speed display on LCD. --- Source/HBIOS/hbios.asm | 31 +++++++++++++------------ Source/HBIOS/lcd.asm | 51 +++++++++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 07ff95d8..9150d836 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -6222,12 +6222,12 @@ SYS_SETCPUSPD1: LD A,(HB_RTCVAL) AND ~%00001000 ; CLEAR SPEED BIT OR C ; IMPLEMENT NEW SPEED BIT -#IF (PLATFORM == PLT_SBC) + #IF (PLATFORM == PLT_SBC) ; SBC SPEED BIT IS INVERTED, ADJUST IT LD A,C XOR %00001000 LD C,A -#ENDIF + #ENDIF LD (HB_RTCVAL),A ; SAVE IN SHADOW REGISTER OUT (RTCIO),A ; UPDATE HARDWARE REGISTER ; @@ -6255,15 +6255,11 @@ SYS_SETCPUSPD2: ADC A,C ; C -> A; ADD CF FOR ROUNDING LD (CB_CPUMHZ),A ; SAVE IT ; -#IF (CPUFAM != CPU_EZ80) + #IF (CPUFAM != CPU_EZ80) ; REINIT DELAY ROUTINE LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY -#ENDIF -; -SYS_SETCPUSPD3: - XOR A - RET + #ENDIF #ENDIF ; #IF (PLATFORM == PLT_HEATH) @@ -6302,14 +6298,11 @@ SYS_SETCPUSPD2: ADC A,C ; C -> A; ADD CF FOR ROUNDING LD (CB_CPUMHZ),A ; SAVE IT ; -#IF (CPUFAM != CPU_EZ80) + #IF (CPUFAM != CPU_EZ80) ; REINIT DELAY ROUTINE LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY -#ENDIF -; - XOR A ; SIGNAL SUCCESS - RET + #ENDIF #ENDIF ; #IF (CPUFAM == CPU_Z180) @@ -6441,11 +6434,11 @@ SYS_SETCPUSPD4: LD A,L ; WORKING VALUE TO A OUT0 (Z180_DCNTL),A ; IMPLEMENT NEW VALUE ; -#IF (CPUFAM != CPU_EZ80) + #IF (CPUFAM != CPU_EZ80) ; REINIT DELAY ROUTINE LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY -#ENDIF + #ENDIF ; #IF ((INTMODE == 2) & (Z180_TIMER)) ; THE Z180 TIMER IS BASED ON CPU SPEED. SO HERE @@ -6473,10 +6466,16 @@ SYS_SETCPUSPD4: LD IY,ASCI1_CFG CALL ASCI_INITDEV #ENDIF +#ENDIF +; +SYS_SETCPUSPD_OK: +; + LD B,BF_DSKYEVENT + LD C,DSKY_EVT_CPUSPD + CALL DSKY_DISPATCH ; XOR A RET -#ENDIF ; SYS_SETCPUSPD_ERR: OR $FF ; NOT SUPPORTED diff --git a/Source/HBIOS/lcd.asm b/Source/HBIOS/lcd.asm index 0a49df9b..05e0becd 100644 --- a/Source/HBIOS/lcd.asm +++ b/Source/HBIOS/lcd.asm @@ -90,21 +90,7 @@ LCD_PREINIT: LD DE,LCD_STR_XPU CALL LCD_OUTDS ; - ; "12.345 MHz" RIGHT JUSTIFIED - LD HL,$010A ; ROW 2, COL 10 - CALL LCD_GOTORC - LD HL,(CB_CPUKHZ) - PUSH HL - LD BC,10000 ; 10 MHZ - SBC HL,BC ; SUBTRACT - JR NC,LCD_PREINIT1 - LD A,' ' ; EXTRA PAD - CALL LCD_OUTD -LCD_PREINIT1: - POP HL - CALL LCD_PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA - LD DE,LCD_STR_MHZ - CALL LCD_OUTDS + CALL LCD_EVT_CPUSPD ; ; THIRD LINE LD HL,$0200 ; ROW 2, COL 0 @@ -228,7 +214,22 @@ LCD_EVENT: ; CPU SPEED CHANGE ; LCD_EVT_CPUSPD: - XOR A + ; "12.345 MHz" RIGHT JUSTIFIED + LD HL,$010A ; ROW 2, COL 10 + CALL LCD_GOTORC + LD HL,(CB_CPUKHZ) + PUSH HL + LD BC,10000 ; 10 MHZ + SBC HL,BC ; SUBTRACT + JR NC,LCD_PREINIT1 + LD A,' ' ; EXTRA PAD + CALL LCD_OUTD +LCD_PREINIT1: + POP HL + CALL LCD_PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA + LD DE,LCD_STR_MHZ + CALL LCD_OUTDS +; RET ; ; FORMAT: "Disk #99 R:12345678" @@ -342,16 +343,23 @@ LCD_DELAY: CALL DELAY ; 16US JP DELAY ; 16US, TOTAL 48US ; +; DELAY USED DURING NORMAL I/O +; REQUIRED FOR HIGH SPEED CPU OPERATION +; +#DEFINE LCD_XDELAY EX (SP),HL \ EX (SP),HL +; ; SEND FUNCTION CODE IN A ; LCD_OUTF: PUSH AF ; SAVE CODE LCD_OUTF1: + LCD_XDELAY EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_OUTF1 ; LOOP TILL NOT BUSY POP AF ; RECOVER CODE + LCD_XDELAY EZ80_IO OUT (LCD_FUNC),A ; SEND IT RET ; DONE @@ -372,11 +380,13 @@ LCD_OUTFS: LCD_OUTD: PUSH AF ; SAVE BYTE LCD_OUTD1: + LCD_XDELAY EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_OUTD1 ; LOOP TILL NOT BUSY POP AF ; RECOVER BYTE + LCD_XDELAY EZ80_IO OUT (LCD_DATA),A ; SEND IT RET ; DONE @@ -408,11 +418,13 @@ LCD_OUTDS: ; GET DATA BYTE INTO A ; LCD_IND: + LCD_XDELAY EZ80_IO IN A,(LCD_STAT) ; GET STATUS AND $80 ; ISOLATE BUSY FLAG JR NZ,LCD_IND ; LOOP TILL NOT BUSY POP AF ; RECOVER BYTE + LCD_XDELAY EZ80_IO IN A,(LCD_DATA) ; GET IT RET ; DONE @@ -483,10 +495,9 @@ LCD_INIT_SEQ: .DB $00 ; TERMINATOR ; LCD_STR_BAN .DB "RomWBW v", BIOSVER, 0 -LCD_STR_CFG .DB "Build: ", CONFIG, 0 +LCD_STR_CFG .DB CONFIG, 0 LCD_STR_IO .DB "Disk #", 0 LCD_STR_XPU .DB " CPU",0 -;;;LCD_STR_SPD .DB "12.345",0 LCD_STR_MHZ .DB " MHz",0 ; LCD_CPU .DW LCD_CPU_Z80 @@ -498,8 +509,8 @@ LCD_CPU .DW LCD_CPU_Z80 ; LCD_CPU_Z80 .DB "Z80",0 LCD_CPU_Z180 .DB "Z180",0 -LCD_CPU_Z180K .DB "Z180-K",0 -LCD_CPU_Z180N .DB "Z180-N",0 +LCD_CPU_Z180K .DB "Z180K",0 +LCD_CPU_Z180N .DB "Z180N",0 LCD_CPU_Z280 .DB "Z280",0 LCD_CPU_EZ80 .DB "eZ80",0 ;