.LIST TTM .TITLE XD ; ; VIRTUAL DEVICE DRIVER ; ; D.STAGG. MARCH 1981 ; .MCALL .DRDEF,.MTPS ; .DRDEF XD,377,FILST$!SPFUN$,12,0,0 ; .DRBEG XD ; ; FIRST GET AND CHECK THE XD UNIT NUMBER MOV XDCQE,R4 ;GET POINTER TO Q.BLKN MOVB Q$UNIT(R4),R3 ;GET THE BIC #^C7,R3 ; UNIT NUMBER ASL R3 ;MULTIPLY BY 2 ASL R3 ;MULTIPLY BY 4 ASL R3 ;MULTIPLY BY 8. ASL R3 ;MULTIPLY BY 16. MOV PC,R0 ;GET ADDRESS ADD #XDINT-.,R0 ; OF TABLES ADD R0,R3 ;POINT TO DRIVER ADDRESS MOV @R3,R2 ;GET DRIVER ADDRESS BEQ ABORT ;UNIT UNDEFINED ; NOW CHECK FOR SPECIAL FUNCTION CALL MOVB Q$FUNC(R4),R0 ;GET FUNCTION NUMBER BEQ NOSPFN ;NOT A SPEC FUN REQUEST CMPB R0,#373 ;MUST BE SPFUN 373 BNE ABORT ;IT'S NOT .IF EQ MMG$T MOV 4(R3),@Q$BUFF(R4) ;STORE LENGTH OF UNIT .IFF MOV 4(R3),-(SP) ;PUSH LENGTH OF IUNIT JSR PC,@$PTWRD ;STORE IN BUFFER .ENDC BR DONE ;ALL DONE ; ; NOW CHECK FOR REFERENCE BEYOND THE FILE. THIS IS ONLY NECESSARY ; IN CASE THERE IS A NON-FILE STRUCTURED LOOKUP TO XDn. NOSPFN: MOV Q$WCNT(R4),R0 ;GET WORD COUNT BPL 1$ ;IT'S POSITIVE NEG R0 ;NEGATE IT 1$: ADD #377,R0 ;ADD BLOCK LENGTH-1 CLRB R0 ;DIVIDE SWAB R0 ; BY 256. ADD @R4,R0 ;ADD START BLOCK CMP R0,4(R3) ;OF THE END ? BGT ABORT ;YES ADD 2(R3),@R4 ;ADJUST THE BLOCK NUMBER BICB #7,Q$UNIT(R4) ;CLEAR THE UNIT NUMBER BISB 6(R3),Q$UNIT(R4) ;SET THE UNIT NUMBER ; ; PASS THE REQUEST ON TO THE DRIVER .MTPS #340 ;INHIBIT INTERRUPTIONS TST @R2 ;HANDLER BUSY ? BNE 2$ ;YES MOV XDLQE,(R2)+ ;STORE LQE MOV XDCQE,(R2)+ ;STORE CQE CLR XDLQE ;CLEAR LQE CLR XDCQE ;CLEAR CQE .MTPS #0 ;LOWER PRIORITY JMP @R2 ;ENTER THE HANDLER ; IF THE HANDLER IS BUSY WE PUT THE QUEUE ELEMENT INTO ITS LIST ; AT THE END, A LA SJ MONITOR. ; R2 POINTS TO THE LQE ENTRY OF THE HANDLER ; R4 CONTAINS THE ADDRESS OF THE XD CURRENT QUEUE ELEMENT AT Q.BLKN 2$: MOV R4,(R2)+ ;UPDATE LQE MOV @R2,R0 ;GET CURRENT ELEMENT ADDRESS ; SUB #4,R4 ;POINT TO AVAIL ; THE LINK POINTS TO Q.BLKN OF THE NEXT ELEMENT !!! MOV R4,-4(R0) ;LINK QUEUE ELEMENT CLR XDLQE ;CLEAR XDLQE CLR XDCQE ;CLEAR XDCQE .MTPS #0 ;LOWER PRIORITY RTS PC ;DONE ; ABORT: BIS #HDERR$,@-(R4) ;SET HARD ERROR BIT DONE: .DRFIN XD ;RETURN TO RT11 ; RTS PC ;ABORT ENTRY POINT XDINT:: .REPT 8. .WORD 0 ;DRIVER ADDRESS .WORD 0 ;BEGIN BLOCK .WORD 0 ;LENGTH IN BLOCKS .WORD 0 ;UNIT NUMBER .WORD 0,0,0,0 ;RAD50 FILE NAME .ENDR ; .DREND XD .END