.TITLE EDDRV .IDENT /V04/ ; ;**************************************************************** ; ; [02-MAY-78] D.DANIELS [V3.1] ; [09-NOV-78] J.DOWNWARD - REMOVE PHONY INTERUPT VECTOR ; ; EXECUTIVE DRIVER ; ; **LOADABLE DRIVER SUPPORT AND MULITUSER PROTECTION** ; ;**************************************************************** ; SUPPORTED FUNCTIONS ;**************************************************************** ; ; NAME SYMBOLIC DISCRIPTION FUNCTION ; VALUE ; IO.KIL 12 CANCEL I/O ; IO.WLB 400 WRITE LOGICAL SEND BUFFER TO MCR> ; IO.RLB 1000 READ LOGICAL GET LOGON UIC ; IO.ATT 1400 ATTACH ; IO.DET 2000 DETTACH ; ;**************************************************************** ; ERROR RETURNS FROM DRIVER ;**************************************************************** ; ; NAME DECIMAL OCTAL DISCRIPTION ; ; IE.IFC -2 376 ILLEGAL FUNCTION ; IE.PRI -16 360 PRIVILEGE VIOLATION ; IE.RBG -40 330 ILLEGAL RECORD SIZE ; IE.BDV -55 311 BAD DEVICE NAME ; IE.NDR -72 270 NO DYNAMC SPACE AVAILIBLE ; ; ;**************************************************************** ; MACRO LIBRARY CALLS ;**************************************************************** ; .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,SCBDF$ ; ABODF$ ; TASK ABORT CODES HWDDF$ ; HARDWARE REGISTER SYMBOLS PKTDF$ ; I/O PACKET OFFSETS TCBDF$ ; TASK CONTROL BLOCK OFFSETS SCBDF$ ; CONTROL BLOCK OFFSETS ; ;**************************************************************** ; LOCAL DATA AND DEFINITIONS ;**************************************************************** ; LD$ED= 000000 ; LD$'DEV' FOR ACCESS TO INTSV$ TEMP: .BLKW 1 ; STORAGE FOR UCB FROM INTSV$ CNTBL: .BLKW 1 ; STORAGE FOR CONTRLR FROM INTSV$ ; ;**************************************************************** ; DRIVER DISPATCH TABLE ;**************************************************************** ; $EDTBL::.WORD EDINI ; DEVICE INITIATOR ENTRY POINT .WORD EDCAN ; CANCEL I/O OPERATION ENTRY POINT .WORD EDOUT ; DEVICE TIMEOUT ENTRY POINT .WORD EDPWF ; POWERFAIL ENTRY POINT ; ;**************************************************************** ; EXECUTIVE DRIVER INITIATOR ENTRY POINT ;**************************************************************** ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE ; IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO ; THE CALLER IS EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY, ; THEN THE REQUEST IS DEQUEUED AND THE I/O ; OPERATION IS INITIATED. ; $EDINP:: ; INPUT ENTRY POINT EDINI: CALL $GTPKT ; GET AN I/O PACKET BCC 1$ ; PROCESS IF CARRY CLR RETURN ; CONTROLLER BUSY OR NO REQUEST ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; EXECUTIVE DRIVER I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD (UCB). ; WD. 05 -- I/O FUNCTION CODE ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS. ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. ; WD. 13 -- BUFFER ADDR OF I/O TRANSFER. ; WD. 14 -- BUFFER SIZE. ; WD. 15 -- TTY NUMBER. ; WD. 16 -- UNUSED. ; WD. 17 -- UNUSED. ; WD. 20 -- UNUSED. ; ;**************************************************************** ; XEQ INDICATED I/O PROCESS ;**************************************************************** ; 1$: MOV I.TCB(R1),R3 ; LOAD TCB ADDR. MOV T.UCB(R3),R4 ; LOAD TI: UCB ADDR. CMPB I.FCN+1(R1),#IO.WLB/256.; WRITE LOGICAL? BEQ WLB ; WRITE. CMPB I.FCN+1(R1),#IO.RLB/256.; NOT READ LOGICAL? BNE ERRIFC ; ILLEGAL FUNCTION. ; ;**************************************************************** ; READ LOGICAL BLOCK ;**************************************************************** ; MOV I.PRM+6(R1),R3 ; LOAD TTY UNIT #. BMI 2$ ; TRUE: TTY=TI:. CMP #MAXTTY,R3 ; CHECK UNIT #. BLE ERRBDV ; UNDEFINED DEVICE. ASL R3 ; WORD OFF-SET. MOV TTY(R3),R4 ; LOAD TTY UCB ADDR. 2$: MOV U.LUIC(R4),-(SP) ; PUSH TTY LOGIN UIC. CALL $PTWRD ; STORE IN USERS BUFFER. BR BYE ; DONE. ; ;**************************************************************** ; WRITE LOGICAL BLOCK ;**************************************************************** ; WLB: CMP #80.,I.PRM+4(R1) ; BYTE COUNT > 80.? BLE ERRRBG ; TOO LONG. MOV I.PRM+6(R1),R3 ; LOAD TTY UNIT #. BMI 2$ ; TRUE: TTY=TI: BIT #U2.PRV,U.CW2(R4) ; TEST FOR PRIVILEGE. BNE 1$ ; PRIVILEGED. BR ERRPRI ; PRIVILEGE VIOLATION. 1$: CMP #MAXTTY,R3 ; CHECK UNIT #. BLE ERRBDV ; UNDEFINED DEVICE. ASL R3 ; WORD OFF-SET. MOV TTY(R3),R4 ; LOAD TTY UCB ADDR. 2$: MOV R1,R3 ; SAVE I/O NODE ADDR. MOV #84.,R1 ; ALLOCATE 84. BYTES. CALL $ALOCB ; GET CORE BLOCK. BCS ERRNDR ; NO DYNAMIC POOL SPACE. MOV R0,-(SP) ; SAVE ADDR OF BLOCK. TST (R0)+ ; POINT TO SECOND WORD. MOV R4,(R0)+ ; SAVE TTY UCB. MOV I.PRM+4(R3),R1 ; BYTE COUNT. 3$: CALL $GTBYTE ; PUT A BYTE ON STACK. MOVB (SP)+,(R0)+ ; POP BYTE TO MCR BUFFER. SOB R1,3$ ; LOOP BACK. MOVB #33,(R0) ; TERMINATE WITH ALTMODE. MOV (SP)+,R1 ; RESET BLOCK ADDR. CALL $QMCRL ; QUEUE TO MCR. BYE: MOV #IS.SUC,R0 ; SUCCESS CODE. EXIT: CLR R1 CALL $IODON BR EDINI ERRIFC: MOV #IE.IFC,R0 ; ILLEGAL FUNCTION. BR EXIT ERRPRI: MOV #IE.PRI,R0 ; PRIVILEGE VIOLATION. BR EXIT ERRRBG: MOV #IE.RBG,R0 ; ILLEGAL RECORD SIZE. BR EXIT ERRBDV: MOV #IE.BDV,R0 ; BAD DEVICE NAME. BR EXIT ERRNDR: MOV #IE.NDR,R0 ; NO DYNAMIC POOL SPACE. BR EXIT TTY: .WORD .TT0 .WORD .TT1 .WORD .TT2 .WORD .TT3 .WORD .TT4 .WORD .TT5 .WORD .TT6 MAXTTY= <.-TTY>/2 ; ; ;**************************************************************** ; CANCEL I/O ENTRY POINT ;**************************************************************** ; EDCAN: RETURN ; NOT USED. ; ;**************************************************************** ; POWERFAIL ENTRY POINT ;**************************************************************** ; EDPWF: RETURN ;;; NOT USED. ; ;**************************************************************** ; DEVICE TIMOUT ENTRY POINT ;**************************************************************** ; EDOUT: RETURN ;;; NOT USED. ; ;**************************************************************** ; .END