|
|
|
@ -1821,6 +1821,169 @@ DIO_CNT .DB 0 ; ENTRY COUNT PREFIX |
|
|
|
DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; DISK READ HELPER |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM |
|
|
|
; BANKED RAM VIA BOUNCE BUFFER |
|
|
|
; |
|
|
|
; TOS=READ FN ADR |
|
|
|
; HL=BUF ADR |
|
|
|
; C=SEC COUNT |
|
|
|
; D=BUF BANK ID |
|
|
|
; |
|
|
|
HB_DSKREAD: |
|
|
|
; |
|
|
|
#IF 0 |
|
|
|
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT |
|
|
|
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE. |
|
|
|
BIT 7,H ; TGT BUF IN UPPER 32K? |
|
|
|
RET NZ ; IF SO, NOTHING TO DO |
|
|
|
LD A,D ; GET TGT BANK |
|
|
|
CP BID_BIOS ; BIOS BANK? |
|
|
|
RET Z ; IF SO, NOTHING TO DO |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF 1 |
|
|
|
; RAM BANK RANGE CHECK |
|
|
|
LD A,D ; GET TGT BANK |
|
|
|
CP BID_RAMN ; BANK IN RANGE 0-N? |
|
|
|
CALL NC,PANIC ; IF >N, PANIC |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SAVE TGT BUF BNK/ADR |
|
|
|
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: |
|
|
|
; 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 |
|
|
|
; |
|
|
|
; IF FAIL, RETURN ERR |
|
|
|
JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR |
|
|
|
; |
|
|
|
; BNKCPY SEC DATA TO REAL BANK/BUF & INC BUF ADR |
|
|
|
PUSH BC ; SAVE COUNTERS |
|
|
|
LD A,(HB_IOBNK) ; DEST BANK |
|
|
|
LD (HB_DSTBNK),A ; ... TO PROXY |
|
|
|
LD A,BID_BIOS ; SRC BANK |
|
|
|
LD (HB_SRCBNK),A ; ... TO PROXY |
|
|
|
LD BC,512 ; COPY 512 BYTES (1 SEC) |
|
|
|
LD DE,(HB_IOBUF) ; TGT BUFFER ADR |
|
|
|
LD HL,HB_WRKBUF ; SOURCE BUFFER |
|
|
|
CALL HBX_BNKCPY ; DO BANK COPY |
|
|
|
LD (HB_IOBUF),DE ; SAVE UPDATED TGT BUF ADR |
|
|
|
POP BC ; RESTORE COUNTERS |
|
|
|
; |
|
|
|
; INC READ COUNT |
|
|
|
INC C ; BUMP SEC READ COUNT |
|
|
|
DJNZ HB_DSKREAD1 ; LOOP AS NEEDED |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
; |
|
|
|
HB_DSKREADX: |
|
|
|
LD HL,(HB_IOBUF) ; NEXT BUF ADR |
|
|
|
LD E,C ; READ COUNT TO E |
|
|
|
OR A ; SET RESULT FLAGS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; DISK WRITE HELPER |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; IMPLEMENTS MULTI SECTOR WRITES AND I/O TO/FROM |
|
|
|
; BANKED RAM VIA BOUNCE BUFFER |
|
|
|
; |
|
|
|
; TOS=WRITE FN ADR |
|
|
|
; HL=BUF ADR |
|
|
|
; C=SEC COUNT |
|
|
|
; D=BUF BANK ID |
|
|
|
; |
|
|
|
HB_DSKWRITE: |
|
|
|
; |
|
|
|
#IF 0 |
|
|
|
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT |
|
|
|
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE. |
|
|
|
BIT 7,H ; TGT BUF IN UPPER 32K? |
|
|
|
RET NZ ; IF SO, NOTHING TO DO |
|
|
|
LD A,D ; GET TGT BANK |
|
|
|
CP BID_BIOS ; BIOS BANK? |
|
|
|
RET Z ; IF SO, NOTHING TO DO |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF 1 |
|
|
|
; RAM BANK RANGE CHECK |
|
|
|
LD A,D ; GET TGT BANK |
|
|
|
CP BID_RAMN ; BANK IN RANGE 0-N? |
|
|
|
CALL NC,PANIC ; IF >N, PANIC |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SAVE TGT BUF BNK/ADR |
|
|
|
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 |
|
|
|
LD C,0 ; SEC COMPLETE COUNTER |
|
|
|
; |
|
|
|
HB_DSKWRITE1: |
|
|
|
; BNKCPY SEC DATA TO WORK BANK/BUF & INC BUF ADR |
|
|
|
PUSH BC ; SAVE COUNTERS |
|
|
|
LD A,BID_BIOS ; DEST BANK |
|
|
|
LD (HB_DSTBNK),A ; ... TO PROXY |
|
|
|
LD A,(HB_IOBNK) ; SRC BANK |
|
|
|
LD (HB_SRCBNK),A ; ... TO PROXY |
|
|
|
LD BC,512 ; COPY 512 BYTES (1 SEC) |
|
|
|
LD DE,HB_WRKBUF ; TGT BUFFER ADR |
|
|
|
LD HL,(HB_IOBUF) ; SOURCE BUFFER |
|
|
|
CALL HBX_BNKCPY ; DO BANK COPY |
|
|
|
LD (HB_IOBUF),HL ; SAVE UPDATED SRC BUF ADR |
|
|
|
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 |
|
|
|
; |
|
|
|
; IF FAIL, RETURN ERR |
|
|
|
JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR |
|
|
|
; |
|
|
|
; INC WRITE COUNT |
|
|
|
INC C ; BUMP SEC WRITE COUNT |
|
|
|
DJNZ HB_DSKWRITE1 ; LOOP AS NEEDED |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
; |
|
|
|
HB_DSKWRITEX: |
|
|
|
LD HL,(HB_IOBUF) ; NEXT BUF ADR |
|
|
|
LD E,C ; WRITE COUNT TO E |
|
|
|
OR A ; SET RESULT FLAGS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
HB_IOBUF .DW 0 |
|
|
|
HB_IOBNK .DB 0 |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; REAL TIME CLOCK DEVICE DISPATCHER |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
|