.TITLE SAVMY MY SPECIAL DRIVER .IDENT /01.01/ ;+ ; Copyright (c) 2012 Oleg Safiullin ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;- ;+ ; 8-MAR-2012 01.00 FORM INITIAL RELEASE ; 19-MAR-2012 01.01 FORM OPTIMIZATION ;- ;+ ; ; DRIVER INPUTS: ; R2 = UMR USAGE FLAG (0=DON'T USE UMR'S) ; R5=0 USE CSR ADDRESS STORED IN THE DRIVER. ; R5<>0 USE CSR ADDRESS STORED IN R5. ; ; DRIVER OUTPUTS: ; R0 = RESIDUAL BLOCK COUNT ; R1 = DEVICE NAME IN ASCII ; R4 = PHYSICAL UNIT NUMBER ; R5 = CSR ADDRESS ;- .MCALL HWDDF$ HWDDF$ ;DEFINE HARDWARE DEFINITIONS MYDA = 2 ;MY DATA REGISTER DONE = 40 ;I/O DONE BIT BLKLEN = 4. ;BLOCKS TO READ TO GET 1024. WORDS .PSECT DRVTAB,RW,D,GBL,REL,CON .ASCII /MY/ ;MY DISKETTE .WORD MYLLEN ;ADDRESS OF LOAD LENGTH .WORD MYSA ;ADDRESS OF BUFFER ADDRESS .WORD MYFUN ;ADDRESS OF FUNCTION CODE/UNIT .WORD $MYDRV ;DRIVER ENTRY ADDRESS .WORD /2 ;DRIVER LENGTH IN WORDS .WORD 3 ;WRITE FUNCTION CODE (WITH GO BIT) .WORD 1 ;READ FUNCTION CODE (WITH GO BIT) .WORD 0 ;UNIT SELECT BITS IN CORRECT POSITION .WORD MYFUN ;ADDRESS OF DRIVE SELECT WORD .WORD MYCSR ;ADDRESS OF CSR ADDRESS .PSECT DRVRS,RW,I .ENABL LSB $MYDRV::BR MY0 ;;;BR AROUND DRIVER NAME MYNAM: .WORD "MY ;;;ASCII DEVICE NAME MYCSR: .WORD 0 ;;;CSR ADDRESS MY0: TST R5 ;;;CSR SPECIFIED? BNE 10$ ;;;IF NE YES MOV MYCSR,R5 ;;;NO, USE DRIVER CSR 10$: MOV @#6,R4 ;;;GET LBN JSR R4,20$ ;;;SAVE LBN, PUT PARAM BLOCK IN R4 MYSU: .BYTE 0 ;UNIT AND SIDE MYAE: .BYTE 0 ;BUFFER ADDRESS EXTENSION MYSA: .WORD 0 ;BUFFER ADDRESS MYSC: .BYTE 0 ;SECTOR NUMBER MYTR: .BYTE 0 ;TRACK NUMBER MYWC: .WORD 0 ;WORD COUNT 20$: MOV MYFUN,R1 ;;;GET DEVICE UNIT BPL 30$ ;;;IF PL UNIT SPECIFIED MOV MYDA(R5),R1 ;;;GET DEVICE UNIT FROM DATA REGISTER 30$: SWAB R1 ;;;PUT UNIT IN LOW BYTE BIC #^C3,R1 ;;;MASK UNUSED BITS MOV R1,@R4 ;;;SET UNIT NUMBER, CLEAR SIDE & BAE MOV #0,R0 ;;;GET LOAD LENGTH IN BLOCK MYLLEN = .-2 MOV R4,R3 ;;;COPY ADDRESS OF PARAMETER BLOCK ASH #-12.,R3 ;;;CALCULATE PAGE INDEX BIC #^C16,R3 ;;;MASK UNUSED BITS MOV KINAR0(R3),R3 ;;;GET APR BIAS CLR R2 ;;; ASHC #6,R2 ;;;CONVERT TO 22-BIT ADDRESS MOV R4,-(SP) ;;;GET PARAMETER BLOCK OFFSET BIC #160000,@SP ;;;MASK PAGE BITS ADD (SP)+,R3 ;;;ADD TO ADDRESS ADC R2 ;;; SWAB R2 ;;;PUT BAE IN HIGH BYTE BISB #0,R2 ;;;ADD FUNCTION CODE MYFUN = .-2 MOV R2,MYRCS ;;;SET VALUE FOR CSR MOV R3,MYRDA ;;;SET VALUE FOR DAT MY1: MOV @SP,R3 ;;;GET LBN CLR R2 ;;;CONVERT TO DISK ADDRESS DIV #10.,R2 ;;; BIC #4,@R4 ;;;ASSUME SIDE 0 ASR R2 ;;;PUT SIDE NUMBER IN CARRY BCC 40$ ;;;IF CC DISE 0 BIS #4,@R4 ;;;SET SIDE 1 40$: MOVB R2,MYTR ;;;SET TRACK NUMBER INC R3 ;;;FIX SECTOR NUMBER MOVB R3,MYSC ;;;SET SECTOR NUMBER MOV #BLKLEN,R1 ;;;SET CHUNK SIZE SUB R1,R0 ;;;FULL TRANSFER LEFT? BPL 50$ ;;;IF PL YES ADD R0,R1 ;;;NO, GET RESIDUAL COUNT BLE MYEXIT ;;;IF LE ALL DONE CLR R0 ;;;CLEAR RESIDUAL COUNT 50$: MOVB R1,MYWC+1 ;;;SET WORD COUNT 60$: BIT #DONE,@R5 ;;;WAIT FOR CONTROLLER READYNESS BEQ 60$ ;;; MOV #0,@R5 ;;;SET COMMAND & BAE MYRCS = .-2 70$: TSTB @R5 ;;;WAIT FOR PARAMETER BLOCK REQUEST BPL 70$ ;;; MOV #0,MYDA(R5) ;;;START I/O MYRDA = .-4 80$: BIT #DONE,@R5 ;;;WAIT FOR I/O COMPLETION BEQ 80$ ;;; TST @R5 ;;;ANY ERRORS? BMI MY1 ;;;IF MI YES, RETRY ADD R1,@SP ;;;UPDATE LBN SWAB R1 ;;;CONVERT BLOCK COUNT TO WORD COUNT ASL R1 ;;;CONVERT TO BYTE COUNT ADD R1,MYSA ;;;UPDATE BUFFER ADDRESS ADCB MYAE ;;; BR MY1 ;;;READY TO READ NEXT CHUNK MYEXIT: TST (SP)+ ;;;POP LBN MOV MYNAM,R1 ;;;GET DEVICE NAME FOR SAV MOV @R4,R4 ;;;GET DEVICE UNIT BIC #^C3,R4 ;;;MASK UNUSED BITS MYEND: RETURN ;;;END OF DRIVER .DSABL LSB .END