@ -1821,6 +1821,169 @@ DIO_CNT .DB 0 ; ENTRY COUNT PREFIX
DIO_TBL .FILL DI O_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
;==================================================================================================
;