; VALCL1 - VAL INTERFACE TO CLONE PROCESSOR FOR RSX11M ;LAST EDIT: 27-OCT-81 ; .NLIST .LIST TTM .NLIST BEX .LIST .TITLE VALCL1 .IDENT /V003/ ; ; THIS MODULE CONTAINS ROUTINES WHICH CONSTRUCT MESSAGES ; FOR CLONE AND WHICH INTERPRET THE REPLIES. ; CL1C$ - CONNECTS A TASK TO CLONE ; CL1F$ - CALLED BY FINISH TO NOTIFY CLONE OF TERMINATION ; CL1Q$ - ASK A QUESTION OF CLONE ; CL1T$ - DETERMINE IF CLONE INPUT IS AVAILABLE ; CL1$ - ISSUE A CLONE FUNCTION ; ; ALL OPERATIONS REQUIRE ACKNOWLEDEGMENT FROM CLONE. ; WHEN CLONE HAS COMPLETED PROCESSING A REQUEST IT RETURNS A STATUS ; TO VC.QST AND SETS THE EVENT FLAG IN VC.EFN . SETTING THIS FLAG ENABLES ; THE CALLING TASK TO CONTINUE. IF CLONE EXITS ABNORMALY DURING THE ; PROCESSING OF A REQUEST AN AST OCCURES WHICH CLEARS THE CLONE ACTIVE ; BIT IN VI.STA, THE FLAG ON WHICH THE TASK IS WAITING ALSO SETS AND ; ENABLES THE TASK TO CONTINUE ASKING QUESTIONS TO THE TERMINAL. ; ; AS THIS MODULE CONTAINS AST CODE IT MUST BE INCLUDED IN THE ROOT ; IF A PROGRAM IS OVERLAYED. ; ; .PSECT VALCL1 ; .MCALL RQST$S,SDAT$S,CNCT$S,ASTX$S,SREF$S .MCALL CLEF$S,STSE$S,USTP$S ; CR=15 LF=12 ; ; ; CL1C$ - CONNECT TO CLONE ; INPUT: R0=VAL IMPURE ADDRESS ; R1=VAL COMMON ADDRESS ; R2=POSITION IN BUFFER OF CONNECT COMMAND ; ; THIS ROUTINE HAS TWO FUNCTIONS: ; 1) IT IS CALLED FROM START WHEN A TASK IS ACTIVATED EITHER BY A CLONE ; RUN STATEMENT OR VIA GOTASK/CHAIN FROM A TASK WHICH IS ITSELF ; RUNNING UNDER CLONE. ; IN THIS CASE A CNCT$ DIRCETIVE IS ISSUED TO SPECIFY AN EVENT FLAG ; AND AST FOR CLONE EXIT NOTIFICATION. ; 2) THIS ROUTINE IS ALSO CALLED WHEN THE REPLY TO A QUESTION POSED ; BY THE TASK IS TERMINATED BY OF STARTS WITH '@'. ; IN THIS CASE CLONE MUST BE REQUESTED AND NOTIFIED OF OUR INTENTION ; TO CONNECT. A REFERANCE TO VALCOM IS SENT TO CLONE, THE ASSOCIATED ; SEND BUFFER HAS THE FOLLOWING FORMAT: ; WD. 1 TERMINAL NAME (ALWAYS TT) ; WD. 2 TERMINAL UNIT NUMBER ; WD. 3 0 ; ; CL1C$:: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV VI.DLN(R0),VC.EFN(R1) ;SET EVENT FLAG FOR CONNECT BIT #ST.CL1,VC.STA(R1) ;ALREADY UNDER CLONE ? BEQ 1$ ;SKIP IF SO ; ; HERE CONNECT HAS BEEN CALLED FROM START CALL CONECT ;ELSE CONNECT TO CLONE BCS 10$ ;BRANCH ON ERROR JMP EX ;AND QUIT ; ; HERE WE HAVE A CONNECT FROM WITHIN THE TASK 1$: SUB R1,R2 ;COMPUTE BUFFER OFFSET SUB #VC.LBF+1,R2 ;TO CONNECT COMMAND MOVB R2,VC.LBF(R1) ;AND SAVE IT MOV #"TT,VI.SCR(R0) ;STORE TI TERMINAL NAME MOV VI.DEV(R0),VI.SCR+2(R0);AND UNIT CLR VI.SCR+4(R0) ;CLEAR ID WORD MOV #FU.CON,VC.FUN(R1);SET CONNECT FUNCTION CLR VC.QST(R1) ;CLEAR RETURN STATUS ; MOV #CL1NAM,R2 ;POINT TO CLONE'S NAME MOV R0,R3 ;POINT TO WDB ADD #VI.WDB,R3 MOV #,W.NSTS(R3) SREF$S R2,R3 ;SEND BY REFERANCE BCS 10$ ;ERROR IS PROBABLY CLONE NOT INSTALLED RQST$S R2 ;REQUEST CLONE FOR EXECUTION CALL CONECT ;CONNECT TO CLONE BCS 10$ ;SKIP IF CONNECT FAILS CALL CL1WT ;GO WAIT FOR ACKNOWLEGEMENT BR EX ; 10$: MOV R5,-(SP) MOV #FBLK,R5 ;OUTPUT CLONE NOT AVAILABLE MESSAGE CALL OUTS MOV (SP)+,R5 BIC #ST.CLA,VI.STA(R0) ;CLEAR CLONE ACTIVE FLAG BIC #ST.CL1,VC.STA(R0) ;AND CLONE BIT IN COMMON SEC BR EX ; CONECT: CLC ;INIT RETURN STATUS BIT #ST.CLA,VI.STA(R0) ;IS CLONE ALREADY FLAGED ACTIVE ? BNE 1$ ;IF SO DO NOTHING MOV VI.DLN(R0),R4 ;GET THE EVEN FLAG (SAME AS LUN) MOV R4,VC.EFN(R1) ;SET IN COMMON MOV #CL1NAM,R2 ;POINT TO TASK NAME BIS #ST.CLA,VI.STA(R0) ;FLAG CLONE ACTIVE CNCT$S R2,R4,#EXAST ;CONNECT TO CLONE 1$: RETURN ; FBLK: .WORD 1,FMES FMES: .ASCIZ /VAL -- CLONE NOT AVAILABLE/ .EVEN ; ; ; CL1F$ - TELL CLONE WE ARE ABOUT TO EXIT ; CL1F$:: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) BIT #ST.QIO,VC.STA(R1);REQUEST IN PROGRESS ? BEQ 1$ CALL CL1WT ;WAIT FOR COMPLETION 1$: MOV VI.RTK(R0),VC.RTK(R1) ;COPY RETURN TASK NAME MOV VI.RTK+2(R0),VC.RTK+2(R1) MOV #FU.FIN,R2 ;SET FUNCTION CODE CALL CL1$ ;ISSUE FUNCTION BR EX ; ; ; ; CL1Q$ - ASK A QUESTION OF CLONE ; INPUT: R0=VAL IMPURE AREA ; R1=VAL COMMON REGION ; CL1Q$:: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV #FU.REQ,R2 ;SET REQUEST FUNCTION CALL CL1$ BR EX ; ; EX: MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 RETURN ; ; ; CL1T$ - TEST IF CLONE INPUT IS AVAILABLE ; INPUT: R0 ADDRESS OF VALIMP ; R1 ADDRESS OF VALCOM ; OUTPUT: C CLEAR - INPUT IS IMMEDIATLY AVAILABLE FROM CLONE ; C SET - CLONE MUST REFER QUESTION TO TERMINAL ; CL1T$:: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV #FU.TST,R2 ;SET TEST FUNCTION CALL CL1$ ;ISSUE TO CLONE BCS 1$ ;SKIP ON ERROR TST VC.QST(R1) ;TEST STATUS BLOCK BPL 1$ ;RETURN C CLEAR IF PLUS SEC 1$: BR EX ; ; ; CL1$ - SEND A MESSAGE AND WAIT FOR REPLY ; THE CLONE STREAM POINTER IS PLACED IN THE FIRST ; WORD OF THE SEND BUFFER. ; IF THE ST.NWT BIT IS SET THE REPLY IS NOT WAITED FOR. ; IF THE ST.QIO BIT IS SET THE REQUEST HAS ALREADY BEEN ISSUED ; INPUT: R2=CLONE FUNCTION CODE FU.XXX ; ; OUTPUT: TRANSACTION IS COMPLETE IF ST.NWT WAS CLEAR ; C CLEAR IF SUCCESS ; C SET IF REQUEST REJECTED ; ; ALTERNATIVE ENTRY CL1WT DOES NOT ISSUE A FUNCTION, BUT WAITS FOR ; COMPLETION OF AN ALREADY INITIATED OPERATION. ; CL1$:: BIT #ST.CLA,VI.STA(R0) ;CHECK THAT CLONE IS STILL ACTIVE BEQ CL1GON ;IF NOT ITS AN ERROR BIT #ST.QIO,VC.STA(R1) ;OPERATION ALREADY STARTED ? BNE 1$ MOV R0,R3 ;POINT TO SEND DATA BUFFER ADD #VI.SCR,R3 CLR (R3) ;CLEAR FIRST WORD MOV VC.CL1(R1),2(R3);SET STREAM POINTER BIS #ST.QIO,VC.STA(R1) ;FLAG INPUT IN PROGRES MOV R2,VC.FUN(R1) ;SET FUNCTION IN COMMON MOV #CL1NAM,R2 MOV VC.EFN(R1),R4 ;GET EVENT FLAG CLR VC.QST(R1) ;EMULATE QIO SDAT$S R2,R3 ;AND SEND OFF REQUEST 1$: BIT #ST.NWT,VC.STA(R1) ;DO WE WAIT ? BEQ CL1WT ;SKIP IF SO CLC ;ELSE RETURN RETURN ; ; CL1WT - WAIT FOR CLONE TO GIVE US A REPLY. ; REQUEST COMPLETION WILL BE SIGNALLED IN THE FIRST QIO STATUS WORD ; HOWEVER IF BY ANY CHANCE CLONE EXITS WE WILL KNOW FROM THE ESB. ; CL1WT: MOV #CL1NAM,R2 ;POINT TO CLONE'S NAME USTP$S R2 ;IN CASE CLONE IS STOPPED CLEF$S R4 ;RESET FLAG TST VC.QST(R1) ;ANY RETURN STATUS ? BNE 2$ ;IF SO REQUEST IS COMPLETE BIT #ST.CLA,VI.STA(R0) ;HAS CLONE EXITED ? BEQ 1$ ;SKIP IF SO STSE$S R4 ;STOP TILL CLONE SETS FLAG (OR EXITS) BR CL1WT ;AND TRY AGAIN ; ; IF CLONE HAS EXITED CHECK ONE MORE TIME THAT THE TERMINATION ; HAS NOT BEEN ACKNOWLEGED AND THEN DISCONNECT. 1$: TST VC.QST(R1) ;CHECK ONCE MORE FOR A REPLY BEQ CL1GON ;ERROR IF NONE 2$: BIC #ST.QIO,VC.STA(R1);CLEAR IN-PROGRESS BIT CLC ;GOOD RETURN STATUS RETURN ; ; HERE CLONE HAS EXITED UNEXPECTEDLY CL1GON: BIC #ST.CL1!ST.QIO,VC.STA(R1) SEC RETURN ; ; ; EXAST - THIS AST OCCURES WHEN CLONE EXITS IT CLEARS THE CLONE ACTIVE BIT ; IN VALIMP. ; EXAST: TST (SP)+ ;POP ESB ADDRESS BIC #ST.CLA,VI.STA+VALIMP ASTX$S ; ; CL1NAM: .RAD50 /CLONE/ ; .END