You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

278 lines
4.6 KiB

;
;==================================================================================================
; HDSK DISK DRIVER
;==================================================================================================
;
; IO PORT ADDRESSES
;
HDSK_IO .EQU $FD
;
HDSK_CMDNONE .EQU 0
HDSK_CMDRESET .EQU 1
HDSK_CMDREAD .EQU 2
HDSK_CMDWRITE .EQU 3
HDSK_CMDPARAM .EQU 4
;
; STATUS
;
HDSKRC_OK .EQU 0
;
; UNIT CONFIGURATION
;
HDSK0_DEVICE .DB 11100000B ; LBA, MASTER DEVICE
HDSK1_DEVICE .DB 11110000B ; LBA, SLAVE DEVICE
;
;
;
HDSK_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,HDSK_RD
DEC A
JR Z,HDSK_WR
DEC A
JR Z,HDSK_ST
DEC A
JR Z,HDSK_MED
CALL PANIC
;
HDSK_RD:
JP HDSK_READ
HDSK_WR:
JP HDSK_WRITE
HDSK_ST:
JP HDSK_STATUS
HDSK_MED:
JP HDSK_MEDIA
;
; HDSK_MEDIA
;
HDSK_MEDIA:
LD A,MID_HD
RET
;
;
;
HDSK_INIT:
XOR A
DEC A ; INITIAL STATUS IS NOT READY $FF
LD (HDSK_STAT),A ; SAVE IT
XOR A ; INIT SUCCEEDED
RET ; RETURN
;
;
;
HDSK_STATUS:
LD A,(HDSK_STAT) ; LOAD STATUS
OR A ; SET FLAGS
RET
;
;
;
HDSK_READ:
LD A,HDSK_CMDREAD
JR HDSK_RW
;
;
;
HDSK_WRITE:
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
; INIT IF NEEDED
LD A,(HDSK_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
CALL NZ,HDSK_RESET ; RESET IF NOT READY
; SET DEVICE
LD A,(HSTDSK)
AND 0FH
LD (HDSK_DEVICE),A
; SET SECTOR (IGNORES MSB)
LD A,(HSTSEC)
LD (HDSK_SEC),A
; SET TRACK
LD BC,(HSTTRK)
LD (HDSK_TRK),BC
; SET TRANSFER ADDRESS
LD BC,(DIOBUF)
LD (HDSK_DMA),BC
; 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 (0FDH),A ; SEND IT TO PORT
INC HL ; POINT TO NEXT BYTE
DJNZ HDSK_RW1
IN A,(0FDH) ; GET RESULT CODE
LD (HDSK_RC),A
OR A
JR Z,HDSK_OK
JR HDSK_ERR
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
HDSK_OK:
#IF (HDSKTRACE >= 2)
CALL HDSK_PRT
#ENDIF
XOR A
RET
;
;
;
HDSK_RESET:
LD B,32
LD A,HDSK_CMDRESET
HDSK_RESET1:
OUT (0FDH),A
DJNZ HDSK_RESET1
XOR A ; STATUS = OK
LD (HDSK_STAT),A ; SAVE IT
#IF (HDSKTRACE >= 2)
CALL NEWLINE
LD DE,HDSKSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_RESET
CALL WRITESTR
#ENDIF
RET
;
;
;
HDSK_PRT:
CALL NEWLINE
LD DE,HDSKSTR_PREFIX
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_CMD
CALL WRITESTR
LD A,(HDSK_CMD)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(HDSK_CMD)
LD DE,HDSKSTR_NONE
CP HDSK_CMDNONE
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_RESET
CP HDSK_CMDRESET
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_READ
CP HDSK_CMDREAD
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_WRITE
CP HDSK_CMDWRITE
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_PARAM
CP HDSK_CMDPARAM
JP Z,HDSK_PRTCMD
LD DE,HDSKSTR_UNKCMD
HDSK_PRTCMD:
CALL WRITESTR
CALL PC_RBKT
LD A,(HDSK_CMD)
CP HDSK_CMDREAD
JR Z,HDSK_PRTRW
CP HDSK_CMDWRITE
JR Z,HDSK_PRTRW
RET
HDSK_PRTRW:
CALL PC_SPACE
LD A,(HDSK_DEVICE)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_TRK)
CALL PRTHEXWORD
CALL PC_SPACE
LD A,(HDSK_SEC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_DMA)
CALL PRTHEXWORD
CALL PC_SPACE
LD DE,HDSKSTR_ARROW
CALL WRITESTR
CALL PC_SPACE
LD DE,HDSKSTR_RC
CALL WRITESTR
LD A,(HDSK_RC)
CALL PRTHEXBYTE
CALL PC_SPACE
CALL PC_LBKT
LD A,(HDSK_RC)
LD DE,HDSKSTR_RCOK
CP HDSKRC_OK
JP Z,HDSK_PRTRC
LD DE,HDSKSTR_RCUNK
HDSK_PRTRC:
CALL WRITESTR
CALL PC_RBKT
RET
;
;
;
HDSKSTR_PREFIX .TEXT "HDSK:$"
HDSKSTR_CMD .TEXT "CMD=$"
HDSKSTR_RC .TEXT "RC=$"
HDSKSTR_ARROW .TEXT "-->$"
HDSKSTR_NONE .TEXT "NONE$"
HDSKSTR_RESET .TEXT "RESET$"
HDSKSTR_READ .TEXT "READ$"
HDSKSTR_WRITE .TEXT "WRITE$"
HDSKSTR_PARAM .TEXT "PARAM$"
HDSKSTR_UNKCMD .TEXT "UNKCMD$"
HDSKSTR_RCOK .TEXT "OK$"
HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$"
;
;==================================================================================================
; HDSK DISK DRIVER - DATA
;==================================================================================================
;
HDSK_STAT .DB 0
HDSK_RC .DB 0
;
HDSK_PARMBLK:
HDSK_CMD .DB 0 ; HDSK_READ OR HDSK_WRITE
HDSK_DEVICE .DB 0 ; 0 .. 7, DEFINES HARD DISK TO BE USED
HDSK_SEC .DB 0 ; 0 .. 31, DEFINES SECTOR
HDSK_TRK .DW 0 ; 0 .. 2047, DEFINES TRACK
HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY