From 8d96efb6f50690fe2f072a326b6c81413980d924 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 30 Sep 2019 17:22:02 -0700 Subject: [PATCH] Status LED Support --- Doc/ChangeLog.txt | 1 + Source/HBIOS/cfg_ezz80.asm | 4 + Source/HBIOS/cfg_master.asm | 4 + Source/HBIOS/cfg_mk4.asm | 4 + Source/HBIOS/cfg_n8.asm | 4 + Source/HBIOS/cfg_rcz180.asm | 4 + Source/HBIOS/cfg_rcz80.asm | 4 + Source/HBIOS/cfg_sbc.asm | 4 + Source/HBIOS/cfg_sc126.asm | 4 + Source/HBIOS/cfg_zeta.asm | 4 + Source/HBIOS/cfg_zeta2.asm | 4 + Source/HBIOS/dsrtc.asm | 143 +++++++++++++++++++----------------- Source/HBIOS/hbios.asm | 17 +++++ 13 files changed, 134 insertions(+), 67 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 95e86877..bbe1e5c5 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -21,6 +21,7 @@ Version 2.9.2 - N?B: Made ZCAL Y2K compliant - WBW: Show disk activity on diagnostic LEDs - WBW: DSRTC now detects DS-1302 presence dynamically +- WBW: Add status LED support Version 2.9.1 ------------- diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index b143f007..955ecb98 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -47,6 +47,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index add48b40..76216d6b 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -65,6 +65,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 8f2cceb4..d707446f 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -51,6 +51,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 5ff655bb..3bf7f73d 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -54,6 +54,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 1bb7517e..b6ededec 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -51,6 +51,10 @@ DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index a9ec50dc..b2c21660 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -46,6 +46,10 @@ DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index ded8a6e0..b451ad9d 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -43,6 +43,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_sc126.asm b/Source/HBIOS/cfg_sc126.asm index 10d18e74..89b45df7 100644 --- a/Source/HBIOS/cfg_sc126.asm +++ b/Source/HBIOS/cfg_sc126.asm @@ -46,6 +46,10 @@ DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index f32ee166..0e556536 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -43,6 +43,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 40ea8bd2..6fca8253 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -47,6 +47,10 @@ DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS ; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) ; CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 9ddfb8ee..2df0da05 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -163,16 +163,18 @@ DSRTC_INIT: PRTS("MFPIC$") #ENDIF ; - LD A,(DSRTC_STAT) - OR A - JR Z,DSRTC_INIT0 + ; PRINT RTC LATCH PORT ADDRESS + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,DSRTC_BASE ; GET IO ADDRESS + CALL PRTHEXBYTE ; PRINT IT ; - ; HARDWARE NOT PRESENT - PRTS(" NOT PRESENT$") + ; CHECK PRESENCE STATUS + LD A,(DSRTC_STAT) ; GET DEVICE STATUS + OR A ; SET FLAGS + JR Z,DSRTC_INIT1 ; IF ZERO, ALL GOOD + PRTS(" NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT OR $FF ; SIGNAL FAILURE - RET -; -DSRTC_INIT0: + RET ; BAIL OUT ; DSRTC_INIT1: ; DISPLAY CURRENT TIME @@ -183,27 +185,13 @@ DSRTC_INIT1: CALL DSRTC_CLK2TIM LD HL,DSRTC_TIMBUF CALL PRTDT - +; #IF DSRTCCHG ; FORCE_RTC_CHARGE_ENABLE - LD E,$8E ; ACCESS WRITE PROT REG - CALL DSRTC_CMD ; - LD E,$00 ; WRITE PROTECT OFF - CALL DSRTC_PUT ; - CALL DSRTC_END ; FINISH CMD - - LD E,$90 ; ACCESS CHARGE REGISTER - CALL DSRTC_CMD ; + LD C,$90 ; ACCESS CHARGE REGISTER LD E,DS1d2k ; STD CHARGE VALUES - CALL DSRTC_PUT ; - CALL DSRTC_END ; FINISH REG WRITE - - LD E,$8E ; ACCESS WRITE PROT REG - CALL DSRTC_CMD ; - LD E,$80 ; WRITE PROTECT ON - CALL DSRTC_PUT ; - CALL DSRTC_END ; FINISH CMD + CALL DSRTC_WRBYTWP #ENDIF - +; PRTS(" CHARGE=$") ; DISPLAY CALL DSRTC_TSTCHG ; CHARGING JR NZ,NOCHG1 ; STATUS @@ -318,47 +306,23 @@ DSRTC_GETBYT: LD A,C ; INDEX SLA A ; SHIFT TO INDEX BITS ADD A,$C1 ; CMD OFFSET - LD E,A - CALL DSRTC_CMD - CALL DSRTC_GET - CALL DSRTC_END - XOR A - RET + LD C,A ; SAVE READ CMD BYTE + CALL DSRTC_RDBYT ; DO IT + XOR A ; SIGNAL SUCCESS + RET ; DONE ; ; RTC SET NVRAM BYTE ; C: INDEX ; E: VALUE ; DSRTC_SETBYT: - PUSH DE ; SAVE INCOMING INDEX -; - ; TURN OFF WRITE PROTECT - LD E,$8E ; ACCESS WRITE PROT REG - CALL DSRTC_CMD ; - LD E,$00 ; WRITE PROTECT OFF - CALL DSRTC_PUT ; - CALL DSRTC_END ; FINISH CMD -; - ; SET REGISTER VALUE LD A,C ; INDEX SLA A ; SHIFT TO INDEX BITS ADD A,$C0 ; CMD OFFSET - LD E,A ; INTO E - CALL DSRTC_CMD - POP DE - CALL DSRTC_PUT - CALL DSRTC_END -; - ; TURN ON WRITE PROTECT - LD E,$8E ; ACCESS WRITE PROT REG - CALL DSRTC_CMD ; - LD E,$80 ; WRITE PROTECT ON - CALL DSRTC_PUT ; - CALL DSRTC_END ; FINISH CMD -; - ; SIGNAL SUCCESS - XOR A - RET + LD C,A ; SAVE WRITE CMD BYTE + CALL DSRTC_WRBYTWP ; DO IT + XOR A ; SIGNAL SUCCESS + RET ; DONE ; ; CONVERT DATA IN CLOCK BUFFER TO TIME BUFFER AT HL ; @@ -412,13 +376,11 @@ DSRTC_TIM2CLK: ; TEST CLOCK FOR CHARGE DATA ; DSRTC_TSTCHG: - LD E,$91 ; CHARGE RESISTOR & DIODE VALUES - CALL DSRTC_CMD ; SEND THE COMMAND - CALL DSRTC_GET ; READ THE REGISTER - CALL DSRTC_END ; FINISH IT + LD C,$91 ; CHARGE RESISTOR & DIODE VALUES + CALL DSRTC_RDBYT ; GET VALUE LD A,E ; VALUE TO A AND %11110000 ; CHECK FOR - CP %10100000 ; ENABLED FLAG + CP %10100000 ; ... ENABLED FLAG RET ; ; DETECT RTC HARDWARE PRESENCE @@ -455,14 +417,61 @@ DSRTC_DETECT1: ; 1 = HALTED ; DSRTC_TSTCLK: - LD E,$81 ; SECONDS REGISTER HAS CLOCK HALT FLAG - CALL DSRTC_CMD ; SEND THE COMMAND - CALL DSRTC_GET ; READ THE REGISTER - CALL DSRTC_END ; FINISH IT + LD C,$81 ; SECONDS REGISTER HAS CLOCK HALT FLAG + CALL DSRTC_RDBYT ; GET REGISTER VALUE LD A,E ; VALUE TO A AND %10000000 ; HIGH ORDER BIT IS CLOCK HALT RET ; +; READ RAW BYTE +; C=READ CMD BYTE +; E=VALUE (OUTPUT) +; +DSRTC_RDBYT: + LD E,C + CALL DSRTC_CMD + CALL DSRTC_GET + CALL DSRTC_END + RET +; +; WRITE RAW BYTE +; C=WRITE CMD BYTE +; E=VALUE +; +DSRTC_WRBYT: + PUSH DE ; SAVE VALUE TO WRITE + LD E,C ; CMD TO E + CALL DSRTC_CMD + POP DE ; RESTORE VALUE + CALL DSRTC_PUT + CALL DSRTC_END + RET +; +; WRITE RAW BYTE W/ WRITE PROTECT BRACKETING +; C=WRITE CMD BYTE +; E=VALUE +; +DSRTC_WRBYTWP: + LD D,C ; WRITE CMD TO D + PUSH DE ; SAVE PARMS +; + ; TURN OFF WRITE PROTECT + LD C,$8E ; CMD + LD E,0 ; WRITE PROTECT OFF + CALL DSRTC_WRBYT ; DO IT +; + ; WRITE THE VALUE + POP DE ; RESTORE INPUTS + LD C,D ; WRITE CMD BACK TO C + CALL DSRTC_WRBYT ; DO IT +; + ; TURN WRITE PROTECT BACK ON + LD C,$8E ; WRITE CMD TO D + LD E,$80 ; WRITE PROTECT ON + CALL DSRTC_WRBYT ; DO IT +; + RET +; ; BURST READ CLOCK DATA INTO BUFFER AT HL ; DSRTC_RDCLK: diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2ecde910..fba51542 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -95,6 +95,15 @@ MODCNT .SET MODCNT + 1 #DEFINE DIAG(N) \; #ENDIF ; +#IF (LEDENABLE) +#DEFINE LED(N) PUSH AF + #DEFCONT \ LD A,N + #DEFCONT \ OUT (LEDPORT),A + #DEFCONT \ POP AF +#ELSE +#DEFINE LED(N) \; +#ENDIF +; ; ; #IF (INTMODE == 0) @@ -827,6 +836,7 @@ HB_START: #ENDIF ; DIAG(%00000011) + LED($FF) ; ; CHECK BATTERY BACKUP STATUS BEFORE WE COPY PROXY TO UPPER MEMORY ; @@ -1388,6 +1398,7 @@ HB_CPU2: #ENDIF ; DIAG(%01111111) + LED($00) ; ; PRIOR TO THIS POINT, CONSOLE I/O WAS NOT AVAILABLE UNLESS DIRECTED TO DEBUG OUTPUT I.E. XIO ; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O @@ -2150,12 +2161,18 @@ HB_DSKFN: #IF (DIAGENABLE & DIAGDISKIO) LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK OUT (DIAGPORT),A ; DISPLAY ON DIAG LEDS +#ENDIF +#IF (LEDENABLE & LEDDISKIO) + LED($FF) #ENDIF LD E,1 ; ONE SECTOR HB_DSKFNADR .EQU $+1 CALL PANIC ; READ ONE SECTOR #IF (DIAGENABLE & DIAGDISKIO) DIAG(0) ; CLEAR DIAG LEDS +#ENDIF +#IF (LEDENABLE & LEDDISKIO) + LED($00) #ENDIF POP BC ; RESTORE COUNTERS RET ; RETURN