; ;================================================================================================== ; 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: PRTS("HDSK: UNITS=4$") ; 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