;$DR MCDRV A DRIVER (MC) FOR PASSING COMMANDS TO THE "MCR" PROGRAM ;. 9-APR-78 M. R. FENRICK ;. ;. THIS PROGRAM WAS PUBLISHED IN THE DECEMBER 1977 MULTI-TASKER VOL. 8, NO. 6 ;. ON PAGE 75. IT WAS SUBMITTED BY PAUL MEAD ,PS DIVISION,CERN,GENEVA. ;. ;. ;. MC A DRIVER FOR MCR ;. ;. THIS DRIVER WILL ALLOW ANY TASK TO ISSUE A 'QIO' TO THE MC DEVICE ;. GIVING AS PARAMETERS:- ;. 1)ADDRESS OF MESSAGE TO BE PASSED TO MCR ;. 2)SIZE OF MESSAGE TO BE PASSED TO MCR ;. 3)TERMINAL FROM WHICH THE MCR STRING APPEARS TO HAVE COME ;. 0=TT0: ;. 1=TT1: ;. 2=TT2: ;. 3=TT3: ;. 4=TT4: ;. -VE FOR NON-EXISTANT TERMINAL (NO ECHO,PROMPT OR ;. ERROR MESSAGES RETURNED) ;. THE OTHER PARAMETERS MAY BE USED AT A LATER DATE AS A PASSWORD ;. OR OTHER ACCESS PRIVILEDGE RIGHTS AS MCR IS A VERY POWERFUL TOOL AND ;. ACCESS MAY NEED TO BE RESTRICED. ;. ;. ;. ;. THE ONLY ALLOWABLE FUNCTIONS ARE IO.WLB, IO.CAN ;. .TITLE MCDRV .IDENT /041078/ $MCTBL:: .WORD MCINI ;DEVICE INITATOR ENTRY POINT .WORD MCCAN ;CALCEL I/O OPERATION ENTRY POINT .WORD MCOUT ;TIMEOUT ENTRY POINT .WORD MCPWF ;POWERFAIL ENTRY POINT ; MCINI: JSR PC,$GTPKT ;TRY TO GET AN I/O/PACKET TO PROCESS ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; R1 = ADDRESS OF 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 UCB OF CONTROLLER TO BE INITIATED ; BCS MCOUT ;NO I/O PACKET TO PROCESS CMP #80.,I.PRM+4(R1) ;IS STRING > 80. CHARACTERS BLE MCERR1 ;COMMAND STRING TO LONG MOV R1,R3 ;SAVE I/O NODE ADDRESS MOV NOTTY,R4 ;ASSUME NONEXISTENT TERMINAL WANTED. MOV I.PRM+6(R3),R1 ;APPARENT TERMINAL WANTED. BMI 2$ CMP #MAXTTY,R1 ;GREATER THAN ALLOWED BLE MCERR3 ASL R1 ;WORD OFFSET FOR TERMINAL MOV TTY(R1),R4 ;GET CORRECT TERMINAL 2$: MOV #84.,R1 ;SET SIZE OF BLOCK TO ALLOCATE JSR PC,$ALOCB ;GET CORE BLOCK BCS MCERR2 ;NO CORE AVAILABLE MOV R0,-(SP) TST (R0)+ MOV R4,(R0)+ ;LOAD TERMINAL UCB ADDRESS ADD #I.PRM,R3 ;POINT TO FIRST PARAMETER IN I/O NODE MOV KISAR6,-(SP) ;SAVE MAPPING MOV (R3)+,KISAR6 ;MAP TO USER AREA MOV (R3)+,R4 ;POINT TO USER BUFFER MOV (R3)+,R1 ;SIZE OF COMMAND BUFFER 1$: MOVB (R4)+,(R0)+ ;TRANSFER USER STRING TO CORE BLOCK SOB R1,1$ MOVB #33,(R0) ;TERMINATE STRING WITH ALTMODE MOV (SP)+,KISAR6 ;RESET MAPPING MOV (SP)+,R1 ;ADDRESS OF CORE BLOCK JSR PC,$QMCRL ;QUEUE IT UP TO MCR MOV #IS.SUC,R0 ;SUCESS CODE MCEXIT: CLR R1 JSR PC,$IODONE ;FINISH REQUEST AT PR7 BR MCINI ;BACK TO DO MORE MCERR1: MOV #-100.,R0 ;ERROR CODE -- CMD STRING TOO LONG BR MCEXIT MCERR2: MOV #-101.,R0 ;ERROR CODE -- NO DYNAMIC CORE BR MCEXIT MCERR3: MOV #-102.,R0 ;ILLIGAL TERMINAL BR MCEXIT MCCAN: MCOUT: MCPWF: RTS PC TTY: .WORD .TT0 .WORD .TT1 .WORD .TT2 .WORD .TT3 .WORD .TT4 MAXTTY=<.-TTY>/2 NOTTY: .WORD .TT5 ;NON EXISTANT TERMINAL .END