|
|
|
@ -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 |
|
|
|
|