|
|
|
@ -99,8 +99,7 @@ HDSK_STATUS: |
|
|
|
; |
|
|
|
; |
|
|
|
HDSK_RESET: |
|
|
|
XOR A ; ALWAYS OK |
|
|
|
RET |
|
|
|
JP HDSK_DSKRESET |
|
|
|
; |
|
|
|
; GET DISK CAPACITY |
|
|
|
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE |
|
|
|
@ -158,92 +157,103 @@ HDSK_SEEK: |
|
|
|
; |
|
|
|
; |
|
|
|
HDSK_READ: |
|
|
|
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS |
|
|
|
LD A,HDSK_CMDREAD |
|
|
|
JR HDSK_RW |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
HDSK_WRITE: |
|
|
|
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS |
|
|
|
LD A,HDSK_CMDWRITE |
|
|
|
JR HDSK_RW |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
HDSK_RW: |
|
|
|
LD (HDSK_CMD),A |
|
|
|
|
|
|
|
; CLEAR RESULTS |
|
|
|
XOR A ; A = 0 |
|
|
|
LD (HDSK_RC),A ; CLEAR RETURN CODE |
|
|
|
LD (HDSK_CMD),A ; SET COMMAND BYTE |
|
|
|
LD (HDSK_DMA),HL ; SAVE INITIAL DMA |
|
|
|
LD A,E ; SECTOR COUNT TO A |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 |
|
|
|
LD B,A ; INIT SECTOR DOWNCOUNTER |
|
|
|
LD C,0 ; INIT SECTOR READ/WRITE COUNT |
|
|
|
LD A,(HDSK_UNIT) ; GET UNIT |
|
|
|
;AND $0F |
|
|
|
LD (HDSK_DEV),A ; ... AND SAVE IT |
|
|
|
|
|
|
|
; INIT IF NEEDED |
|
|
|
; RESET HDSK INTERFACE IF NEEDED |
|
|
|
LD A,(HDSK_STAT) ; GET CURRENT STATUS |
|
|
|
OR A ; SET FLAGS |
|
|
|
PUSH BC ; SAVE COUNTERS |
|
|
|
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY |
|
|
|
POP BC ; RESTORE COUNTERS |
|
|
|
JR NZ,HDSK_RW6 ; ABORT ON FAILURE |
|
|
|
|
|
|
|
HDSK_RW0: |
|
|
|
PUSH BC ; SAVE COUNTERS |
|
|
|
XOR A ; A = 0 |
|
|
|
LD (HDSK_RC),A ; CLEAR RETURN CODE |
|
|
|
|
|
|
|
; CONVERT LBA HHHH:LLLL (4 BYTES) |
|
|
|
; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) |
|
|
|
; SAVING TO HDSK PARM BLOCK |
|
|
|
LD A,(HSTLBA) ; LSB OF LBA |
|
|
|
LD (HDSK_SEC),A ; ... SAVED TO SECTOR |
|
|
|
LD HL,(HSTLBA+1) ; 2 MIDDLE BYTES OF LBA |
|
|
|
LD (HDSK_TRK),HL ; ... SAVE TO TRACK |
|
|
|
|
|
|
|
; SET DEVICE |
|
|
|
LD A,(HDSK_UNIT) |
|
|
|
;AND $0F |
|
|
|
LD (HDSK_DEV),A |
|
|
|
; EXECUTE COMMAND |
|
|
|
LD B,7 ; SIZE OF PARAMETER BLOCK |
|
|
|
LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK |
|
|
|
LD C,$FD ; HDSK CMD PORT |
|
|
|
OTIR ; SEND IT |
|
|
|
|
|
|
|
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA |
|
|
|
; ; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS |
|
|
|
; |
|
|
|
; LD A,(HSTTRK) ; LSB OF TRACK |
|
|
|
; LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK |
|
|
|
; LD A,(HSTSEC + 1) ; MSB OF SECTOR |
|
|
|
; LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK |
|
|
|
; LD A,(HSTSEC) ; LSB OF SECTOR |
|
|
|
; LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC |
|
|
|
|
|
|
|
; INCOMING ADDRESS IS LBA |
|
|
|
; MAP HHHH:LLLL TO HDSK DRIVER AS HHLL:LL |
|
|
|
; GET RESULT |
|
|
|
IN A,(C) ; GET RESULT CODE |
|
|
|
LD (HDSK_RC),A ; SAVE IT |
|
|
|
OR A ; SET FLAGS |
|
|
|
|
|
|
|
LD A,(HSTLBAHI) ; LSB OF LBA HIGH |
|
|
|
LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK |
|
|
|
LD A,(HSTLBALO + 1) ; MSB OF LBA LOW |
|
|
|
LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK |
|
|
|
LD A,(HSTLBALO) ; LSB OF LBA LOW |
|
|
|
LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC |
|
|
|
#IF (HDSKTRACE > 0) |
|
|
|
PUSH AF ; SAVE RETURN CODE |
|
|
|
#IF (HDSKTRACE == 1) |
|
|
|
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY |
|
|
|
#ENDIF |
|
|
|
#IF (HDSKTRACE >= 2) |
|
|
|
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS |
|
|
|
#ENDIF |
|
|
|
POP AF ; RESTORE RETURN CODE |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; SET TRANSFER ADDRESS |
|
|
|
LD BC,(HDSK_DSKBUF) |
|
|
|
LD (HDSK_DMA),BC |
|
|
|
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR |
|
|
|
|
|
|
|
; EXECUTE COMMAND |
|
|
|
LD B,7 ; SIZE OF PARAMETER BLOCK |
|
|
|
LD HL,HDSK_PARMBLK ; START ADDRESS OF PARAMETER BLOCK |
|
|
|
HDSK_RW1: |
|
|
|
LD A,(HL) ; GET BYTE OF PARAMETER BLOCK |
|
|
|
OUT ($FD),A ; SEND IT TO PORT |
|
|
|
INC HL ; POINT TO NEXT BYTE |
|
|
|
DJNZ HDSK_RW1 |
|
|
|
; INCREMENT LBA |
|
|
|
LD HL,HSTLBA |
|
|
|
PUSH HL |
|
|
|
CALL LD32 |
|
|
|
CALL INC32 |
|
|
|
POP BC |
|
|
|
CALL ST32 |
|
|
|
|
|
|
|
; INCREMENT DMA |
|
|
|
LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA |
|
|
|
INC (HL) ; BUMP DMA BY |
|
|
|
INC (HL) ; ... 512 BYTES |
|
|
|
|
|
|
|
XOR A ; A := 0 SIGNALS SUCCESS |
|
|
|
|
|
|
|
IN A,($FD) ; GET RESULT CODE |
|
|
|
LD (HDSK_RC),A |
|
|
|
OR A |
|
|
|
JR Z,HDSK_OK |
|
|
|
JR HDSK_ERR |
|
|
|
HDSK_RW5: |
|
|
|
|
|
|
|
HDSK_ERR: |
|
|
|
XOR A |
|
|
|
DEC A ; A=$FF TO SIGNAL ERROR |
|
|
|
LD (HDSK_STAT),A ; SAVE IT |
|
|
|
#IF (HDSKTRACE >= 1) |
|
|
|
PUSH AF |
|
|
|
CALL HDSK_PRT |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
POP BC ; RECOVER COUNTERS |
|
|
|
JR NZ,HDSK_RW6 ; IF ERROR, GET OUT |
|
|
|
|
|
|
|
INC C ; RECORD SECTOR COMPLETED |
|
|
|
DJNZ HDSK_RW0 ; LOOP AS NEEDED |
|
|
|
|
|
|
|
HDSK_OK: |
|
|
|
#IF (HDSKTRACE >= 2) |
|
|
|
CALL HDSK_PRT |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
HDSK_RW6: |
|
|
|
; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL |
|
|
|
LD E,C ; SECTOR READ COUNT TO E |
|
|
|
LD HL,(HDSK_DMA) ; CURRENT DMA TO HL |
|
|
|
OR A ; SET FLAGS BASED ON RETURN CODE |
|
|
|
RET ; AND RETURN, A HAS RETURN CODE |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -323,7 +333,7 @@ HDSK_PRTRW: |
|
|
|
LD A,(HDSK_SEC) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_SPACE |
|
|
|
LD BC,(HDSK_DSKBUF) |
|
|
|
LD BC,(HDSK_DMA) |
|
|
|
CALL PRTHEXWORD |
|
|
|
|
|
|
|
CALL PC_SPACE |
|
|
|
@ -373,7 +383,6 @@ HDSK_STAT .DB 0 |
|
|
|
HDSK_RC .DB 0 |
|
|
|
; |
|
|
|
HDSK_UNIT .DB 0 |
|
|
|
HDSK_DSKBUF .DW 0 |
|
|
|
; |
|
|
|
HDSK_PARMBLK: |
|
|
|
HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) |
|
|
|
|