.TITLE DK ; ; VERSION V005A ;   001 ; COPYRIGHT 1971,1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; RK11 DISC DRIVER ; ; GLOBL DEFINITIONS ; .GLOBL DK .GLOBL DKDDB ; ; GLOBAL REFERENCES ; .GLOBL DV.STS  ;ENTRY TO FAKE INTERRUPT .GLOBL SRTI ;COMMON SYSTEM EXIT .GLOBL STRG ;COMMON SYSTEM ENTRY .GLOBL SY.DPR ;DDB-PERMANENT DDB BIT .GLOBL SY.TO ;DDB-TIME OUT COUNT (0=NOT ACTIVE) ; ; STANDARD REGISTER DEFINITIONS ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 PC=%7 .IFNDF DK.DSC DK.DSC=1 .ENDC ; ; PROLOGUE ; DK: .WORD 0  ;0 IF IDLE, DDB PTR OTHERWISE .BYTE 37  ;STANDARD FACILITY INDICATOR .BYTE 200  ;(NORMAL & FILE BASED) .BYTE 20  ;STD BUFFER SIZE IS 256. WORDS .BYTE DKINT-DK ;OFFSET TO INTERRUPT HANDLER .BYTE 240+DK.DSC-1 ;LEVEL & MAX # OF RK DRIVES .BYTE 0  ;NO OPEN ROUTINE .BYTE DKSTRT-DK ;OFFSET TO TRANSFER HANDLER .BYTE 0  ;NO CLOSE ROUTINE .BYTE 0  ;NO SPECIAL FUNCTIONS .BYTE DK.TB-DK ;MISC ENTRY DKNAM: .RAD50 /DK/  ;DEVICE NAME .WORD RKDIR  ;FIRST MFD BLOCK .WORD 0  ;BIT MAP POINTER ; ; MISC ENTRY TABLE ; DK.TB: .WORD 0  ;NO POWER FAIL .WORD DK.TO  ;TIME OUT .WORD 0  ;NO CONTINUE .WORD 0  ;NO CANCEL ; ; TRANSFER INITIATE ; DKSTRT: MOV @PC,DKREPT ;CLEAR RETRY INDICATOR DKRTRY: MOVB #-10,SY.TO(R0) ;SET TIME OUT COUNT CLR R1  ;UNIT IS ZERO CMP (R0)+,(R0)+ ;POINTER DDB+BLOCK MOV (R0)+,R2 .IFDF LOWDEN ASL R2 .ENDC CMP R2,#4800. ;IS BLOCK WITHIN BOUNDS? BLO DKIN20  ;YES - BRANCH SUB #6,R0  ;POINT TO DDB MOV #RKCS+2,R5 ;GET ADDR OF WC REGISTER MOV 10(R0),(R5) ;SET WORD COUNT REGISTER CLR SY.TO(R0) ;DISABLE TIME OUT JSR R5,DV.STS ;FAKE AN INTERRUPT TO AVOID POSSIBLE...    ;...PROBLEM IF CALLED FROM DEQUEUE BR DKHR06  ; DKIN10: ADD R2,R1  ;ADD IN VALID QUOTIENT ASR R2  ;ADJ REMAINDER FOR DIV BY 12 ASR R2 ADD R4,R2 DKIN20: MOV R2,R4  ;DIVIDE BY 16 - SAVE REMAINDER BIC #177760,R4 BIC R4,R2  ;EXTRACT QUOTIENT ... BNE DKIN10  ;... IF ANY BUILD RESULT CMP R4,#12.  ;CHECK REMAINDER BLT .+6  ;IF BETWEEN 12 & 15 ... ADD #4,R4  ;... CAUSE SURFACE INCR. ADD R4,R1  ;PUT SECTOR INTO REST MOV #RKDA,R4 MOV R1,@R4  ;SET UP DISK ADDRESS MOV (R0)+,-(R4) ;SET UP MEMORY ADDRESS MOV (R0)+,-(R4) ;SET UP WORD COUNT MOV (R0)+,R1 ;PUT IN THE FUNCTION MOV R1,R2  ;GET DRIVE UNIT NUMBER ASL R2  ;SHIFT DRIVE NUMBER... ASL R2  ;...TO HIGH ORDER BITS ASL R2 ASL R2 ASL R2 BIC #17777,R2 ;CLEAR EXTRANEOUS BITS BIS R2,4(R4) ;SET UNIT # IN DISK ADDRESS BISB @PC,R1  ;SET I.D.E. AND GO BITS BIC #177460,R1 ;CLEAR GARBAGE -*****- MOV R1,-(R4) ;SEND FUNCTION TO CONTROL DK.RTS: RTS PC  ;RETURN ; ; TIME OUT ENTRY ; DK.TO: CLR SY.TO(R0) ;DISABLE TIME OUT MOVB DK+6,177776 ;LOWER TO DEVICE LEVEL MOV #RKCS+2,R5 ;GET ADDRESS OF WC REGISTER CLR R1  ;CLEAR STATUS INDICATION BR DKHER  ;CLAIM HARD ERROR ; ; INTERRUPT ENTRY ; DKINT: JSR R5,STRG  ;SAVE REGS MOV #SRTI,-(R6) ;SAVE REGS MOV DK,R0  ;GET DDB ADDRESS BEQ DK.RTS  ;IF EQ IGNOR UNSOLICITED INTERRUPTS MOVB DK+6,177776 ;LOWER TO DEVICE LEVEL CLR SY.TO(R0) ;DISABLE TIME OUT MOV #RKDS,R5 MOV (R5)+,R1 ;SAVE RKDS AND RKER FOR LATER MOV (R5)+,R2 MOV (R5)+,R4 ;SAVE RKCS BMI DKERP  ;YES - BRANCH BIT #10,R4  ;WAS LAST FCN A DRIVE RESET? BNE DKER00  ;YES - BRANCH DKXIT: CLR -(R5)  ;DISABLE DEVICE INTERRUPTS JMP @14(R0)  ;TAKE COMPLETION EXIT ; ;ERROR PROCESSOR: ; DKERP: ASL R4  ;HARD ERROR? BMI DKHER  ;YES - BRANCH DKER00: ROL (PC)+  ;TRIED 8 TIMES? DKREPT: .WORD 0 BCC DKRTRY  ;IF CC TRY AGAIN BIS #100000,12(R0) ;SET PARITY ERROR BR DKHR07  ; DKHER: MOV #1,-(R5) ;CLEAR THE CONTROL DKHR00: TSTB @R5  ;DONE YET? BPL DKHR00  ;NO - LOOP BIT #1000,R1 ;IS IT SEEK INCOMPLETE? BEQ DKHR05  ;NO - BRANCH MOV R1,4(R5) ;REPLACE DRIVE # MOV #115,@R5 ;SET UP FOR DRIVE RESET RTS PC  ;RETURN DKHR05: TST (R5)+  ;ADJUST R5 DKHR06: BIS #10000,12(R0) ;SET UNRECOVERABLE ERROR DKHR07: MOV (R5),16(R0) ;SET UNTRANSFERED WORD COUNT BR DKXIT  ;TAKE COMPLETION RETURN ; DKNT=0    ;RK DRIVE UNIT # DKSPN=40   ;RK UNIT SUSPEND NUMBER ; ; RK11 DDB ; 0,0   ;ACTIVE DDB CHAIN .WORD 0  ;CHAIN LINK .WORD 0,0  ;LEVEL COUNTS .WORD DK  ;DRIVER ADDRESS DKDDB: .WORD 0,0,0,0,0,0,0,0,0,0,0,0; .BYTE 0  ; .BYTE DKSPN .WORD 0,0,0,0,0 ; .BYTE 0  ;TASK RESERVED FOR .BYTE SY.DPR  ;FLAGS(PERMANENT DDB) .WORD 0,0  ;SCB .WORD 0  ;TIME OUT COUNTS ; .IFGE DK.DSC-2 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-3 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-4 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-5 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-6 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-7 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT ; .IFGE DK.DSC-8 ; ; RK11 DDB ; DKNT=DKNT+1   ;UNIT NUMBER DKSPN=DKSPN+1   ;SUSPEND NUMBER ; 0,0   ;ACTIVE DDB QUEUE 0   ;MONITOR CHAIN LINK 0,0   ;LEVEL COUNTS DK   ;DRIVER ADDRESS 0 0   ;TRAN BLOCK ADDRESS 0   ;DEVICE BLOCK NUMBER 0   ;CORE TRANSFER ADDRESS 0   ;WORD COUNT .BYTE 0,DKNT  ;UNIT #,TRANSFER FUNCTION 0,0,0,0,0,0 .BYTE 0,DKSPN  ;SUSPEND NUMBER 0,0,0,0,0 .BYTE 0,SY.DPR ;PERMANENT DDB 0,0 0   ;TIMEOUT COUNT .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC ; ; DEFINITIONS ; RKDS=177400 RKCS=177404 RKDA=177412 RKDIR=1 .END