Browse Source

Diag LED Enhancement

Diagnostic LEDs will now show disk activity by disk unit number.
pull/48/head
Wayne Warthen 6 years ago
parent
commit
183ddeac5f
  1. 129
      Source/HBIOS/hbios.asm

129
Source/HBIOS/hbios.asm

@ -1588,6 +1588,7 @@ HB_SPDTST:
#ENDIF #ENDIF
; ;
INITSYS3: INITSYS3:
DIAG(0)
; ;
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
; ;
@ -1949,19 +1950,36 @@ DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES
; ;
; TOS=READ FN ADR ; TOS=READ FN ADR
; HL=BUF ADR ; HL=BUF ADR
; C=SEC COUNT
; E=SEC COUNT
; D=BUF BANK ID ; D=BUF BANK ID
; ;
HB_DSKREAD: HB_DSKREAD:
;
; THE ACTUAL SECTOR READ FUNCTION ADDRESS IS ON TOS, SAVE IT
EX (SP),HL ; SAVE HL TO TOS, HL := READ FN ADR
LD (HB_DSKFNADR),HL ; IMBED IN CALL OP BELOW
POP HL ; RECOVER HL
;
#IF (DIAGENABLE)
; SAVE DISK UNIT NUMBER BIT MASK
LD A,C ; GET DISK UNIT NUMBER
LD B,A ; PUT IN B FOR LOOP COUNTER
INC B ; LOOP ONE EXTRA TIME TO HANDLE UNIT=0
XOR A ; START WITH ACCUM ZERO
SCF ; ... AND CF SET
HB_DSKREAD0:
RLA ; ROTATE BIT
DJNZ HB_DSKREAD0 ; ... UNTIL IN PROPER LOCATION
LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS
#ENDIF
; ;
#IF 1 #IF 1
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE.
; CHECK TO SEE IF INTER-BANK I/O NEEDED.
BIT 7,H ; TGT BUF IN UPPER 32K? BIT 7,H ; TGT BUF IN UPPER 32K?
RET NZ ; IF SO, NOTHING TO DO
JP NZ,HB_DSKIO ; IF SO, NON-BANKED
LD A,D ; GET TGT BANK LD A,D ; GET TGT BANK
CP BID_BIOS ; BIOS BANK? CP BID_BIOS ; BIOS BANK?
RET Z ; IF SO, NOTHING TO DO
JP Z,HB_DSKIO ; IF SO, NON-BANKED
#ENDIF #ENDIF
; ;
#IF 1 #IF 1
@ -1975,23 +1993,16 @@ HB_DSKREAD:
LD (HB_IOBUF),HL LD (HB_IOBUF),HL
LD A,D LD A,D
LD (HB_IOBNK),A LD (HB_IOBNK),A
;
; SETUP READ FN ADR
POP HL ; READ FN ADR IS AT TOS
LD (HB_DSKREADFN),HL ; IMBED IN CALL OP BELOW
; ;
; SETUP READ AND LOOP COUNT ; SETUP READ AND LOOP COUNT
LD B,E ; SEC LOOP COUNTER LD B,E ; SEC LOOP COUNTER
LD C,0 ; SEC COMPLETE COUNTER LD C,0 ; SEC COMPLETE COUNTER
; ;
HB_DSKREAD1: HB_DSKREAD1:
LD HL,HB_WRKBUF ; USE WORK BUF REAL I/O
;
; CALL READ FN ; CALL READ FN
PUSH BC ; SAVE COUNTERS
LD E,1 ; ONE SECTOR
LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA
HB_DSKREADFN .EQU $+1
CALL PANIC ; READ ONE SECTOR
POP BC ; RESTORE COUNTERS
CALL HB_DSKFN ; READ ONE SECTOR
; ;
; IF FAIL, RETURN ERR ; IF FAIL, RETURN ERR
JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR
@ -2016,9 +2027,7 @@ HB_DSKREADFN .EQU $+1
; ;
HB_DSKREADX: HB_DSKREADX:
LD HL,(HB_IOBUF) ; NEXT BUF ADR LD HL,(HB_IOBUF) ; NEXT BUF ADR
LD E,C ; READ COUNT TO E
OR A ; SET RESULT FLAGS
RET ; DONE
JR HB_DSKIOX ; DONE
; ;
;================================================================================================== ;==================================================================================================
; DISK WRITE HELPER ; DISK WRITE HELPER
@ -2029,19 +2038,36 @@ HB_DSKREADX:
; ;
; TOS=WRITE FN ADR ; TOS=WRITE FN ADR
; HL=BUF ADR ; HL=BUF ADR
; C=SEC COUNT
; E=SEC COUNT
; D=BUF BANK ID ; D=BUF BANK ID
; ;
HB_DSKWRITE: HB_DSKWRITE:
;
; THE ACTUAL SECTOR READ FUNCTION ADDRESS IS ON TOS, SAVE IT
EX (SP),HL ; SAVE HL TO TOS, HL := READ FN ADR
LD (HB_DSKFNADR),HL ; IMBED IN CALL OP BELOW
POP HL ; RECOVER HL
;
#IF (DIAGENABLE)
; SAVE DISK UNIT NUMBER BIT MASK
LD A,C ; GET DISK UNIT NUMBER
LD B,A ; PUT IN B FOR LOOP COUNTER
INC B ; LOOP ONE EXTRA TIME TO HANDLE UNIT=0
XOR A ; START WITH ACCUM ZERO
SCF ; ... AND CF SET
HB_DSKWRITE0:
RLA ; ROTATE BIT
DJNZ HB_DSKWRITE0 ; ... UNTIL IN PROPER LOCATION
LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS
#ENDIF
; ;
#IF 1 #IF 1
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE.
; CHECK TO SEE IF INTER-BANK I/O NEEDED.
BIT 7,H ; TGT BUF IN UPPER 32K? BIT 7,H ; TGT BUF IN UPPER 32K?
RET NZ ; IF SO, NOTHING TO DO
JP NZ,HB_DSKIO ; IF SO, NON-BANKED
LD A,D ; GET TGT BANK LD A,D ; GET TGT BANK
CP BID_BIOS ; BIOS BANK? CP BID_BIOS ; BIOS BANK?
RET Z ; IF SO, NOTHING TO DO
JP Z,HB_DSKIO ; IF SO, NON-BANKED
#ENDIF #ENDIF
; ;
#IF 1 #IF 1
@ -2055,10 +2081,6 @@ HB_DSKWRITE:
LD (HB_IOBUF),HL LD (HB_IOBUF),HL
LD A,D LD A,D
LD (HB_IOBNK),A LD (HB_IOBNK),A
;
; SETUP WRITE FN ADR
POP HL ; WRITE FN ADR IS AT TOS
LD (HB_DSKWRITEFN),HL ; IMBED IN CALL OP BELOW
; ;
; SETUP WRITE AND LOOP COUNT ; SETUP WRITE AND LOOP COUNT
LD B,E ; SEC LOOP COUNTER LD B,E ; SEC LOOP COUNTER
@ -2079,12 +2101,8 @@ HB_DSKWRITE1:
POP BC ; RESTORE COUNTERS POP BC ; RESTORE COUNTERS
; ;
; CALL WRITE FN ; CALL WRITE FN
PUSH BC ; SAVE COUNTERS
LD E,1 ; ONE SECTOR
LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA
HB_DSKWRITEFN .EQU $+1
CALL PANIC ; READ ONE SECTOR
POP BC ; RESTORE COUNTERS
LD HL,HB_WRKBUF ; WRITE FROM WORK BUFFER
CALL HB_DSKFN ; WRITE ONE SECTOR
; ;
; IF FAIL, RETURN ERR ; IF FAIL, RETURN ERR
JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR
@ -2096,12 +2114,51 @@ HB_DSKWRITEFN .EQU $+1
; ;
HB_DSKWRITEX: HB_DSKWRITEX:
LD HL,(HB_IOBUF) ; NEXT BUF ADR LD HL,(HB_IOBUF) ; NEXT BUF ADR
JR HB_DSKIOX ; DONE
;
;==================================================================================================
; NON-BANKED DISK READ/WRITE
;==================================================================================================
;
HB_DSKIO:
;
; SETUP LOOP COUNT
LD B,E ; SEC LOOP COUNTER
LD C,0 ; SEC COMPLETE COUNTER
;
HB_DSKIO1:
; CALL READ/WRITE FN
CALL HB_DSKFN ; READ/WRITE ONE SECTOR
;
; IF FAIL, RETURN ERR
JR NZ,HB_DSKIOX ; BAIL OUT ON ERROR
;
; INC SECTOR COUNT
INC C ; BUMP SEC READ/WRITE COUNT
DJNZ HB_DSKIO1 ; LOOP AS NEEDED
XOR A ; SIGNAL SUCCESS
;
HB_DSKIOX:
LD E,C ; WRITE COUNT TO E LD E,C ; WRITE COUNT TO E
OR A ; SET RESULT FLAGS OR A ; SET RESULT FLAGS
RET ; DONE RET ; DONE
; ;
HB_IOBUF .DW 0
HB_IOBNK .DB 0
HB_DSKFN:
PUSH BC ; SAVE COUNTERS
#IF (DIAGENABLE)
LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK
OUT (DIAGPORT),A ; DISPLAY ON DIAG LEDS
#ENDIF
LD E,1 ; ONE SECTOR
HB_DSKFNADR .EQU $+1
CALL PANIC ; READ ONE SECTOR
DIAG(0) ; CLEAR DIAG DISPLAY
POP BC ; RESTORE COUNTERS
RET ; RETURN
;
HB_DSKBIT .DB 0 ; ACTIVE DISK UNIT
HB_IOBUF .DW 0 ; CURRENT IO BUFFER ADR
HB_IOBNK .DB 0 ; CURRENT IO BUFFER BANK ID
; ;
;================================================================================================== ;==================================================================================================
; REAL TIME CLOCK DEVICE DISPATCHER ; REAL TIME CLOCK DEVICE DISPATCHER
@ -2723,10 +2780,12 @@ HB_DISPCALL:
JR NC,HB_DISPERR ; HANDLE FN NUM OUT OF RANGE ERROR JR NC,HB_DISPERR ; HANDLE FN NUM OUT OF RANGE ERROR
; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX
PUSH BC ; SAVE BC
LD B,0 ; MSB IS ALWAYS ZERO LD B,0 ; MSB IS ALWAYS ZERO
RLC C ; MULTIPLY UNIT INDEX RLC C ; MULTIPLY UNIT INDEX
RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET
ADD IY,BC ; SET IY TO ENTRY ADDRESS ADD IY,BC ; SET IY TO ENTRY ADDRESS
POP BC ; RESTORE BC
; DERIVE DRIVER FUNC ADR TO CALL ; DERIVE DRIVER FUNC ADR TO CALL
PUSH HL ; SAVE INCOMING HL PUSH HL ; SAVE INCOMING HL

Loading…
Cancel
Save