; VALCTL - VAL CONTROL ROUTINES ; LAST EDIT: 11-NOV-81 ;- .NLIST .TITLE VALCTL .SBTTL DESCRIPTION .NLIST SEQ,LOC,BIN,BEX,TOC,CND .LIST TTM .LIST ; TASK CONTROL SECTION OF VAL PACKAGE ; THIS IS THE ONLY PART OF VAL WHICH IS REQUIRED ; BY ALL PROGRAMS. ; .IDENT /V003/ ; ; REMOVE DEFINITION OF SYMBOL 'BLURB' TO LIMIT EXTENSIVE DESCRIPTION ;BLURB=0 ; ; THIS MODULE SHOULD BE ASSEMBLED PRECEDED BY 'VALMFD' ; .NLIST .IF DF BLURB .LIST ;+ ; ; THE MODULE VALCTL CONTAINS THREE PRINCIPAL ROUTINES: ; START - INITIALISE THE VAL SYSTEM ; FINISH - DISCONNECT FROM VAL AND TERMINATE TASK ; ; ; ; ; ;- .NLIST .ENDC .LIST SEQ,LOC,BIN .LIST ; .PSECT VALCTL ;*RSX* .MCALL ALUN$S,EXIT$S,ALTP$S ;*RSX* .MCALL MRKT$S,SPND$S,RSUM$S ;*RSX* .MCALL RQST$S,DSCP$S,WTSE$S ;*RSX* .MCALL GLUN$S,GTSK$S ;*RSX* .IF DF RSX11M .MCALL CRAW$S,CRRG$S,MAP$S ;*RSX11M* .MCALL RREF$S,SREF$S,DTRG$S ;*RSX11M* .MCALL RDBBK$,WDBBK$ ;*RSX11M* .MCALL STOP$S,USTP$S ;*RSX11M* .ENDC .IF DF RSX11D .MCALL SDRQ$S,RCVS$S ;*RSX11D* .ENDC ; ; ; .IF DF RSX11D PRILOW=1. ;SLEEP PRIORITY PRIRUN=50. ;RUN PRIORITY PRIHI=100. ;GET OUT QUICK PRIORITY .ENDC ; ; ; RDOFF$ ;DEFINE READIT OFFSETS ; ; ; NPAGE .NLIST .NLIST SEQ,LOC,BIN .SBTTL SYSTEM INITIALISATION--START .IF DF BLURB .LIST ;+ ; ; START - INITIALISE VAL SYSTEM ; CALLING FORMAT: ; CALL START[(IDATA,LUN,DEV,UNIT)] ;WHERE: IDATA IS A 16 WORD ARRAY WHICH RECIEVES DATA AS FOLLOWS ; 1,2 RAD50 CALLER TASK NAME ; 4,3 RAD50 RETURN TASK NAME (IF CALLED BY GOTASK) ; 5 TERMINAL NUMBER. ; 6 TERMINAL EVENT FLAG ; A G.E.F. ASSIGNED UNEQUELY TO TERMINAL ; 7-16 USER ASSIGNED COMUNICATION AREA. ; LUN LUN ON WHICH TERMINAL I/O WILL TAKE PLACE (DEFAULT 6) ; THE LUN SPECIFIED IS ASSIGNED AUTOMATICALY TO DEV,UNIT. ; A CALL TO VALLUN MAY BE ISSUED AT ANY TIME TO SELECT A ; NEW LUN FOR TERMINAL INPUT. ; DEV DEVICE TO ASSIGN TO LUN (DEFAULT TI:) ; IF THIS ARGUMENT IS ZERO BUT NOT NULL THE SPECIFIED LUN ; IS NOT REASSIGNED. ; UNIT UNIT NUMBER TO ASSIGN TO LUN (DEFAULT 0) ; ; START MUST BE CALLED BEFOR ANY OTHER VAL ROUTINE AND AS ; A MATTER OF GOOD PRACTICE AS THE FIRST EXECUTABLE STATEMENT ; OF A PROGRAM. ; ;- .NLIST .ENDC .LIST SEQ,LOC,BIN .LIST ; START:: MOV #VALIMP,R0 ;GET OUR LOCAL IMPURE AREA TST VI.COM(R0) ;ALREADY CONNECTED ? BEQ 1$ RETURN ;IF SO IGNORE CALL 1$: ; .IF DF RSX ;*RSX* GET LUN INFORMATION ; GET LUN AND DEVICE ARGUMENTS AND ASSIGN MOV #DEFLUN,R2 ;*RSX* DEFAULT LUN MOV #"TI,R3 ;DEFAULT DEVICE CLR R4 ;DEFAULT UNIT CMPB (R5),#2 ;*RSX* LUN SPECIFIED? BLT 2$ ;*RSX* NO. CMP P2(R5),#-1 ;OR NULL BEQ 2$ MOV @P2(R5),R2 ;*RSX* IF SO GET VALUE 2$: MOV R2,VI.DLN(R0) ;*RSX* SET LUN VALUE CMPB (R5),#4 ;DO WE HAVE DEVICE AND UNIT BLT 3$ MOV @P3(R5),R3 ;GET DEVICE NAME BEQ 10$ ;SKIP ASSIGN IF ZERO MOV @P4(R5),R4 ;GET THE UNIT NUMBER 3$: ALUN$S R2,R3,R4 ;ASSIGN DEVICE TO LUN 10$: CALL DEVSET ;*RSX* GO COMPUTE TERMINAL NUMBER .ENDC ;*RSX* ; .IF DF RSX11M ; CREATE WINDOW TO MAP VALCOM ST1: CALL VSVCTX ;SAVE MAPPING OF VALAPR MOV #VALIMP,R0 MOV R0,R2 ;*RSX11M* WDB ADDRESS ADD #VI.WDB,R2 ;*RSX11M* MOVB VALAPR,W.NAPR(R2);*RSX11M* SET APR CRAW$S R2 ;*RSX11M* CREATE WINDOW BCC 3$ ;*RSX11M* JMP VERROR ;*RSX11M* FATAL ERROR ;*RSX11M* CHECK WINDOW WAS CREATED 1$: BIT #WS.CRW,W.NSTS(R2) ;*RSX11M* BEQ 2$ ;*RSX11M* ;*RSX11M* CHECK WE DIDNT UNMAP ANYTHING BIT #WS.UNM!WS.ELW,W.NSTS(R2) BEQ 3$ 2$: MOV W.NSTS(R2),@#$DSW JMP VERROR ;*RSX11M* IF SO THATS FATAL ; NOW GET BASE ADDRESS OF WINDOW 3$: MOV W.NBAS(R2),R1 .IFF ; SET UP VALCOM POINTER ST1: MOV #VALCOM,R1 .ENDC ; ST2: MOV R1,VI.COM(R0) ;SAVE ADDRESS OF VALCOM CALL RCVD ;ANY DATA QUEUED ? BCC ST5 ;SKIP IF SO .IF DF RSX11M ; ; HERE WE CREATE A NEW VALCOM REGION ST3: MOV R0,R2 ;*RSX11M* FORM RDB ADDRESS ADD #VI.RDB,R2 ; SET REGION NAME TO VALRXX WHERE XX IN TI: DEVICE #(OCTAL) ; THE NAME FIELD IS ASSEMBLED TO CONTAIN VALR00 IN RAD50 ; IF IF THIS REGION ALREADY EXISTS, VAL->VAM->VAN ETC. MOV VI.DEV(R0),R3 ;GET DEVICE # BIC #177770,R3 ;LOW ORDER DIGIT (OCTAL) ADD R3,R.GNAM+2(R2) ;RAD50 3RD CHAR MOV VI.DEV(R0),R3 ;GET BACK DEVICE BIC #177707,R3 ;SECOND ORDER DIGIT *8 MOV R3,-(SP) ; ASH #2,R3 ;MUL *4 ADD (SP)+,R3 ;AND ADD IN A FIFTH ADD R3,R.GNAM+2(R2) ;RAD50 2ND CHAR 4$: CRRG$S R2 ;*RSX11M* CREATE REGION BCC 1$ JMP VERROR ;*RSX11M* FATAL ERROR ; CHECK WE HAVE ACTUALY CREATED REGION 1$: BIT #RS.CRR,R.GSTS(R2) BNE 2$ DTRG$S R2 ;DETACH THAT REGION INC R.GNAM(R2) ;CHANGE REGION NAME BR 4$ ;AND TRY TO CREATE AGAIN ; NOW MAP THE CREATED REGION 2$: MOV R0,R3 ;*RSX11M* FORM WDB ADDRESS ADD #VI.WDB,R3 ; SAVE REGION ID IN WDB MOV R.GID(R2),W.NRID(R3) ; MAP WITH WRITE ACCESS MOV #WS.WRT,W.NSTS(R3) MAP$S R3 ;*RSX11M* MAP REGION BCC 3$ JMP VERROR ;*RSX11M* MUST SUCCEDE 3$: .ENDC ; SET COMMON TO ZEROS ST4: MOV #VC.LEN/2,R2 1$: CLR (R1)+ ;CLEAR AREA SOB R2,1$ MOV VI.COM(R0),R1 ;RE-INSTATE POINTER ; ; SET CALLER AND RETURN TASK NAMES TO -1 ; TO FLAG NO RETURN. MOV #-1,R3 MOV R1,R2 ;ADDRESS OF NAME BLOCK ADD #VC.CTK,R2 MOV R3,(R2)+ ;2 WORDS OF CALLER NAME MOV R3,(R2)+ MOV R3,(R2)+ ;2 WORDS OF RETURN MOV R3,(R2)+ ; ST5: MOV R1,R2 ;COPY TASK NAMES TO VALIMP ADD #VC.CTK,R2 MOV (R2)+,VI.CTK(R0);CALLER MOV (R2)+,VI.CTK+2(R0) TST (R2) ;ZERO RETURN NAME IS RETURN ;TO SENDER BNE 1$ SUB #4,R2 ;SO BACKSPACE 2 WORDS MOV (R2)+,VC.RTK(R1);AND SAVE IN VALCOM MOV (R2)+,VC.RTK+2(R1) SUB #4,R2 ;AND COPY TO VALIMP 1$: MOV (R2)+,VI.RTK(R0);RETURN NAME MOV (R2)+,VI.RTK+2(R0) ; .IF DF RSX ;COMPUTE G.E.F FOR TERMINAL ; COMPUTE G.E.F MOV VI.DEV(R0),R2 MOV R2,VC.TNO(R1) ;SET TERMINAL # ADD #33.,R2 ;COMPUTE GEF MOV R2,VC.GEF(R1) ;SAVE GEF IN VALCOM ; ; GET OUR TASK PARAMETERS MOV R0,R2 ;GET 16 WORD BLOCK FOR GTSK$ ADD #VI.SCR,R2 GTSK$S R2 ;GET TASK PARAMETERS MOV G.TSPC(R2),VI.UIC(R0) ;SAVE UIC MOV (R2),VI.TNM(R0) ;FIRST HALF OF TASK NAME MOV (R2)+,VC.TNM(R1) ;AND IN COMMON MOV (R2),VI.TNM+2(R0) ;SECOND HALF MOV (R2),VC.TNM+2(R1) ; .ENDC ; NOW INIT READIT BUFFER POINTERS MOV R1,R2 ;COMPUTE BUFFER ADDRESS ADD #VC.LBF+1,R2 MOV R2,RD.IA(R0) ;SAVE BUFFER ADDRESS IN BLK MOVB VC.LBF(R1),R3 ;GET CURRENT OFFSET ADD R3,R2 ;FORM ADDRESS MOV R2,RD.KP(R0) ;SET POINTER ; ; CONNECT TO CLONE IF REQUIRED ST6: BIT #ST.CL1,VC.STA(R1) ;ARE WE ALREADY UNDER CLONE ? BEQ 1$ CALL CL1C$ ;CONNECT TO CLONE ; ; ; NOW SET UP USER AREA IF REQUIRED 1$: TSTB (R5) ;ANY PARAMETERS? BEQ 4$ CMP P1(R5),#-1 ;DATA AREA? BEQ 4$ MOV P1(R5),R0 ;COPY OVER IDATA MOV #+6,R3;6 HEADER WORDS + UBUF MOV R1,R2 ;INTERNAL BUFFER ADDRESS ADD #VC.RCV,R2 3$: MOV (R2)+,(R0)+ SOB R3,3$ ; 4$: CALL VRSCTX ;RESTORE USER MAPPING RETURN ;INITIALIZATION COMPLETE ; .IF DF RSX ;*RSX* COMPUTE DEVICE # ; COMPOUT TI DEVICE # SO TASKS KNOW WHERE THEY ARE RUNNING DEVSET: MOV R0,R3 ;GET NAME AND UNIT OF TI: ADD #VI.SCR,R3 GLUN$S R2,R3 ;GET LUN PARAMETERS ; ; NOW COMPUTE THE DEVICE NUMBER. ; THIS IS A SITE DEPENDANT OPERATION .IF DF ORSAY MOVB 2(R3),VI.DEV(R0);JUST THE TT UNIT .ENDC .IF DF UCH CMP (R3),#"VD ;VIDIO-DISK TERMINAL BNE 1$ ;SKIP IF NOT MOVB 2(R3),VI.GEF(R0);IF SO UNIT IS DEV # BR 2$ ; TT UNITS COUNT DOWN FROM 14. 1$: MOVB 2(R3),R3 ;SO COMPUTE DEV # SUB #14.,R3 NEG R3 MOV R3,VI.DEV(R0) ;SAVE IN COMMUNICATIONS BLOCK 2$: .ENDC RETURN ;*RSX* .ENDC NPAGE .NLIST .NLIST SEQ,LOC,BIN .SBTTL TERMINATE PROGRAM--FINISH .IF DF BLURB .LIST ;+ ; ; FINISH - TERMINATE PROGRAM ; DISCON - DISCONECT FROM VAL AND RETURN ; CALLING FORMAT: ; CALL FINISH[(IDATA)] ; CALL DISCON[(IDATA)] ;WHERE: IDATA IS A 16 WORD DATA ARRAY, LOCATIONS 7--16 ; OF WHICH MAY CONTAIN DATA TO BE PASSED TO THE ; TASK TO WHICH RETURN IS MADE. ; ; THE ENTRY: DISCON ; HAS THE SAME EFFECT AS FINISH EXCEPT THAT CONTROL RETURNS TO ; THE CALLING TASK WITH ALL VAL FACILITIES DISABLED. THE REQUESTING TASK ; IF ANY IS ALSO RESUMED IN PARALLEL. ; ;- .NLIST .ENDC .LIST SEQ,LOC,BIN .LIST ; ; FORTRAN CLEANUP AND EXIT ROUTINE .GLOBL EXIT ; FINISH::CALL VMAP ;GET IMPURE AREA AND COMMON BIT #ST.FIN,VI.STA(R0);IS FINISH ALREADY ACTIVE BEQ 1$ ;IF NOT ITS OK CALL VRSCTX ;RESTORE USER CONTEXT RETURN ;AND QUIT 1$: BIS #ST.FIN,VI.STA(R0);SET FLAG CALL FIN ;CALL THE FINISH ROUTINE ; VEX:: CALL VRSCTX ;RESTORE CALLER CONTEXT MOV #NULL,R5 ;FORTRAN CALL BLOCK CALL EXIT ;FORTRAN EXIT ; DISCON::CALL VMAP ;GET IMPURE AREA CALL FIN ;REPLY TO REQUESTER MOV R0,R2 ;POINT TO RETURN TASK NAME ADD #VI.RTK,R2 CMP (R2),#-1 ;ANYONE TO RETURN TO ? BEQ 1$ ;IF NOT SKIP THE RESUME CALL RESUME ;ELSE RESUME THEM 1$: CALL VRSCTX ;RESTORE CONTEXT RETURN ;AND RETURN TO CALLER ; ; FIN: BIT #ST.CL1,VC.STA(R1) ;CONNECTED TO CLONE BEQ 1$ CALL CL1F$ ;REPORT FINISH TO CL1 1$: CMP VI.RTK(R0),#-1 ;RETURN OR QUIT ? BEQ 20$ ;IF NOTHING THERE JUST EXIT TSTB (R5) ;ARGUMENT? BEQ 4$ MOV P1(R5),R3 ADD #12.,R3 ;DONT OVERWRITE FIRST 6 WORDS MOV R1,R2 ADD #VC.UBF,R2 ;SAVE DATA AREA MOV #UBFLEN/2,R4 ;TXFR COUNT 3$: MOV (R2)+,(R3)+ SOB R4,3$ ; 4$: MOV RD.KP(R0),R2 ;CURRENT POINTER SUB RD.IA(R0),R2 ;COMPUTE INDEX MOVB R2,VC.LBF(R1) ;AND SAVE IN FIRST BYTE MOV R0,R2 ;GET RETURN TASK NAME ADD #VI.RTK,R2 CALL SDRS ;SEND DATA AND RESUME 20$: CLR VI.COM(R0) ;CLEAR COMMON POINTER RETURN ;AND BACK TO FINISH OR DISCON ; NULL: .WORD 0 NPAGE ; ; THE FOLLOWING ROUTINES PERFORM INTERTASK COMMUNICATION ; BY MEANS APPROPRIATE TO THE SPECIFIC OPERATING SYSTEM. ; ; RCVD - RECEIVES A COMMUNICATIONS BLOCK IF AVAILABLE ; SUCCESSFUL RETURN IS WITH THE C BIT CLEAR. ; UNDER RSX11M IF NO DATA IS RECEIVED A DYNAMIC ; COMMON IS CREATED. ; .IF DF RSX11M RCVD: MOV R0,R2 ;FORM ADDRESS OF WDB ADD #VI.WDB,R2 MOV #,W.NSTS(R2) RREF$S R2 ;RECEIVE REFERANCE BCC 1$ ;SKIP IF WE GET SOMETHING RETURN ; NOW SET UP CALLER NAME IN VALCOM TO MATCH 11-D NODE 1$: MOV VI.SCR(R0),VC.CTK(R1) MOV VI.SCR+2(R0),VC.CTK+2(R1) CLC ;RECEIVE SUCCESSFUL RETURN ; .ENDC .IF DF RSX11D ; RCVD: MOV #VALCOM,R1 ;GET COMMUNICATION AREA MOV R1,R2 ADD #VC.RBF,R2 ;OFFSET TO RECEIVE BUFFER VRCD$S ,R2,#43. ;TRY TO RECEIVE BCC RCVD ;CLEAR OUTSTANDING NODES TST (R2) ;ANYTHING RECEIVED ? BNE 1$ RETURN ;WITH C STILL SET 1$: CLC ;SUCCESSFUL RETURN RETURN ; .ENDC ; ; ; SDRS - SEND ACKNOWLEGEMENT TO A TASK PRIOR TO EXIT ; ; INPUT: R2 - ADDRESS OF TASK NAME ; .IF DF RSX11M SDRS: CLR VC.TNM(R1) ;ZERO OUR TASK NAME IN THE COMMON CLR VC.TNM+2(R1) ;THE EXIT AST WILL UNSTOP OUR REQUESTOR RETURN .ENDC ; ; .IF DF RSX11D SDRS:: ALTP$S R2,#PRIRUN ;RAISE TASKS PRIORITY MOV R1,R3 ;FORM SEND NODE ADDRESS ADD #VC.SBF,R3 VSDR$S R2,,,,,R3,#43. ;SEND AND RESUME CMP @#$DSW,#1 ;SENT AND RESUMED ? BNE RESUME RETURN ;IF SO RETURN .ENDC ; ; .IF NDF RT11 ; RESUME - RESUME A TASK WAITING FOR OUR EXIT ; INPUT: R2 POINTS TO TASK NAME ; .IF DF RSX11M RESUME: USTP$S R2 ;UNSTOP THE TASK .ENDC .IF DF RSX11D RESUME::RSUM$S R2 ;RESUME THE TASK .ENDC CMP $DSW,#IE.ITS ;IS TASK NOT STOPPED/SUSPENDED ? BEQ 1$ ;GO WAIT IF SO RETURN ;ELSE RETURN ; PAUSE THEN TRY AGAIN 1$: MRKT$S VI.DLN(R0),#10.,#1 WTSE$S VI.DLN(R0) BR RESUME .IFF ; DUMMY RT11 ROUTINE SDRS: JMP SDRQ .ENDC ; .END