diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 081a67cd..6c0e6036 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1588,6 +1588,7 @@ HB_SPDTST: #ENDIF ; INITSYS3: + DIAG(0) ; CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; @@ -1949,19 +1950,36 @@ DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES ; ; TOS=READ FN ADR ; HL=BUF ADR -; C=SEC COUNT +; E=SEC COUNT ; D=BUF BANK ID ; 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 - ; 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? - RET NZ ; IF SO, NOTHING TO DO + JP NZ,HB_DSKIO ; IF SO, NON-BANKED LD A,D ; GET TGT BANK CP BID_BIOS ; BIOS BANK? - RET Z ; IF SO, NOTHING TO DO + JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; #IF 1 @@ -1975,23 +1993,16 @@ HB_DSKREAD: LD (HB_IOBUF),HL LD A,D 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 LD B,E ; SEC LOOP COUNTER LD C,0 ; SEC COMPLETE COUNTER ; HB_DSKREAD1: + LD HL,HB_WRKBUF ; USE WORK BUF REAL I/O +; ; 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 JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR @@ -2016,9 +2027,7 @@ HB_DSKREADFN .EQU $+1 ; HB_DSKREADX: 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 @@ -2029,19 +2038,36 @@ HB_DSKREADX: ; ; TOS=WRITE FN ADR ; HL=BUF ADR -; C=SEC COUNT +; E=SEC COUNT ; D=BUF BANK ID ; 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 - ; 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? - RET NZ ; IF SO, NOTHING TO DO + JP NZ,HB_DSKIO ; IF SO, NON-BANKED LD A,D ; GET TGT BANK CP BID_BIOS ; BIOS BANK? - RET Z ; IF SO, NOTHING TO DO + JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; #IF 1 @@ -2055,10 +2081,6 @@ HB_DSKWRITE: LD (HB_IOBUF),HL LD A,D 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 LD B,E ; SEC LOOP COUNTER @@ -2079,12 +2101,8 @@ HB_DSKWRITE1: POP BC ; RESTORE COUNTERS ; ; 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 JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR @@ -2096,12 +2114,51 @@ HB_DSKWRITEFN .EQU $+1 ; HB_DSKWRITEX: 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 OR A ; SET RESULT FLAGS 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 @@ -2723,10 +2780,12 @@ HB_DISPCALL: JR NC,HB_DISPERR ; HANDLE FN NUM OUT OF RANGE ERROR ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX + PUSH BC ; SAVE BC LD B,0 ; MSB IS ALWAYS ZERO RLC C ; MULTIPLY UNIT INDEX RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET ADD IY,BC ; SET IY TO ENTRY ADDRESS + POP BC ; RESTORE BC ; DERIVE DRIVER FUNC ADR TO CALL PUSH HL ; SAVE INCOMING HL