.TITLE SUBTASK .IDENT /V002/ ; ; AUTHOR: MARK F. LEWIS, FEDERAL AVIATION ADMINISTRATION ; ; CREATION DATE: 21-MAR-78 ; ; ; COPYRIGHT (C) NOT-AT-ALL ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ON ANY ; COMPUTER SYSTEM AND MAY BE COPIED WITH OR WITHOUT THE INCLUSION ; OF THIS NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN THE PUBLIC DOMAIN. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY THE AUTHOR, ; THE FEDERAL AVIATION ADMINISTRATION, THE DEPARTMENT OF TRANSPORTATION, ; OR ANY FEDERAL OR NON-FEDERAL GOVERNMENT. I UNDERSTAND THE DIGITAL ; EQUIPMENT CORPORATION CAN'T BE BLAMED EITHER. ; ; THE AUTHOR ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY SOMEONE. ; .SBTTL INTRODUCTION ; ; THESE SUBROUTINES PERMIT THE FORTRAN PROGRAMMER TO TAKE ADVANTAGE ; OF THE FACILITIES OFFERRED BY THE TIME-SHARING CONTROL SERVICES. ; EACH ROUTINE IS SELF-DOCUMENTING. WHERE NECESSARY, EXPLANATORY NOTES ; HAVE BEEN ADDED TO CLARIFY THE RELATIONSHIPS AMONG THE VARIOUS ROUTINES. ; ; IT IS ASSUMED THAT THE USER HAS READ THE INTRODUCTION TO TIME SHARING ; CONTROL SERVICES IN APPENDIX B OF THE IAS RELEASE NOTES (DEC-11-OISRA-E-D). ; THESE ROUTINES WERE DEVELOPEDED UNDER IAS-11 V2.0 AND USE SHOULD BE ; RESTRICTED TO THAT RELEASE. IN PARTICULAR, USE WITH SUCCEEDING RELEASES ; SHOULD BE ATTEMPTED ONLY AFTER EXTENSIVE TESTING. ; ; AN ATTEMPT WAS MADE TO MODULARIZE SERVICES AS MUCH AS POSSIBLE SO THAT ; EACH ROUTINE REPRESENTS A SINGLE FUNCTION. THE USER MAY WISH TO COMBINE ; SEVERAL ROUTINES INTO A SINGLE MUTLI-FUNCTION ROUTINE. CHKEV, CHKEVW, ; CHKALL, AND WTEREV ARE OBVIOUS CANDIDATES FOR COMBINING. ; ; THE MEMORY-CONSCIOUS USER MAY WISH TO BREAK OUT THOSE ROUTINES NOT TIED TO ; THE COMMON DATA SECTION SO THAT SEVERAL INDEPENDENT SUBROUTINES ARE CREATED ; THAT MAY BE USED IN A LIBRARY. FOR CONVENIENCE, ROUTINES THAT ARE ; INDEPENDENT OF THE COMMON DATA SECTION ARE IDENTIFIED BY AN ASTERISK (*) IN ; THE SUBTITLE. ; ; THE CODE HAS NOT BEEN SEPERATED INTO PURE AND IMPURE AREAS. MANY USERS, ; ESPECIALLY THOSE WHO WISH TO USE THESE ROUTINES IN A CLI, MIGHT CONSIDER ; SUCH CHANGES. ; ; NOTE THAT ONLY A FEW OF THESE ROUTINES RETURN ERROR CODES. ; THE ADDITION OF ERROR RETURNS IS SOMETHING MANY USERS MAY WISH TO CONSIDER. ; ; PLEASE NOTIFY ME OF ANY PROBLEMS EXPERIENCED WITH THESE ROUTINES. ; IF POSSIBLE, SUPPLY COPIES OF THE OFFENDING PROGRAM, THE RESULTS OF RUNNING ; SAME, AND ANY CHANGES MADE TO THIS CODE. ; ; NOTE THAT THIS IS VERSION 2. VERSION 1, OF WHICH ONLY THREE ROUTINES ; (CHAIN, SENTS, & RECV) WERE MADE PUBLIC, IS NOW OBSOLETE. ; ; MARK F. LEWIS ; FEDERAL AVIATION ADMINISTRATION ; AAC-118 ; P.O. BOX 25082 ; OKLAHOMA CITY, OK 73125 ; ; 24-MAR-78 .SBTTL COMMON DATA SECTION ; ; MARK F. LEWIS ; 21-MAR-78 ; ; ; THE PURPOSE OF THIS SECTION IS TO HOUSE THE NECESSARY TDB'S, SDB'S ; AND (MAYBE, AT A LATER DATE) ESB'S. POINTERS TO THESE STRUCTURES ; ARE ALSO MAINTAINED HERE. THE BASIC DESIGN OF THE SUBROUTINES KEEPS ; THESE STRUCTURES AT ARM'S LENGTH FROM THE CALLER TO MINIMIZE THE ; CHANCE OF CORRUPTION BY IMPROPER USE. ; .MCALL TCSMC$, RETURN TCSMC$ .EVEN ;+ ; DEFINE MAXIMUM NUMBER OF TDB'S AND SDB'S HANDLED ; THIS IS ONLY PARAMETER IN THE SOURCE. IF CHANGED, ONLY ROUTINE ; CHKALL NEED BE EDITED. MAXTD = 3 ;SHOULD BE ENOUGH FOR MOST APPLICATIONS ;- .MACRO TABLE D=0 .REPT MAXTD ENT \D D=D+1 .ENDR .EVEN .ENDM ; .MACRO ENT D TDB'D: TDBDF$ TDCM$A SDB'D: SDBDF$ .ENDM ; .MACRO DTABL SYM B=0 .REPT MAXTD ENX SYM,\B B=B+1 .ENDR .ENDM ; .MACRO ENX SYM,B .WORD SYM'B .ENDM ; TABLE TDB: DTABL TDB SDB: DTABL SDB .EVEN .SBTTL RUNTS ; ; FORTRAN-CALLABLE SUBROUTINE TO RUN A TIME-SHARED TASK, ; OPTIONALLY SEND A MESSAGE IT, AND OPTIONALLY WAIT FOR A SUBTASK EVENT ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE-- ; CALL RUNTS(TASKNAME [,NTDB] [,ITYP] [,MESS] [,WAIT]) ; ; TASKNAME - VALID COMMAND LINE FOR SUBTASK ; - LAST BYTE MUST BE ZERO. (SET AUTOMATICALLY BY ; F4P FOR LITERALS). ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD. ; ; ITYP - OPTIONAL ARGUMENT SPECIFYING TYPE OF TASK. ; = 1 (DEFAULT) COMMAND IS FILENAME OF TASK TO ; BE AUTO-INSTALLED AND REMOVED ; NOTE:FIRST CHAR OF TASKNAME MUST BE A SPACE ; FOR ITYP=1 ; = 2 COMMAND IS FOR MCR TASK (...XYZ) ; = 3 COMMAND IS FOR SYSTEM LIBRARY TASK ($$$XYZ) ; = 4 COMMAND IS FOR AN INSTALLED TASK (UP TO 6 CHARACTERS) ; ; MESS - OPTIONAL ARGUMENT SPECIFYING THE ADDRESS OF A MESSAGE ; TO BE SENT TO THE SUBTASK. DEFAULT IS NO MESSAGE. ; NOTE THAT THE FIRST WORD OF THE MESSAGE MUST CONTAIN ; THE LENGTH, IN BYTES, OF THE MESSAGE, WHICH MUST START ; AT ADRRESS MESS+2 ; ; WAIT - AN OPTIONAL ARGUMENT WHICH, IF NON-NULL, INDICATES ; THAT THE CALLING TASK WISHES TO WAIT FOR THE SUBTASK ; TO CAUSE AN EVENT ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; .EVEN RUNTS:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;INVALID ARGUMENT LIST INC R5 MOV (R5)+,R0 ;ADDRESS OF STRING TO R0 BLE 99$ ;INVALID ARGUMENT 4$: CMP #2,R2 ;AT LEAST TWO ARGUMENTS? BGT 20$ ;NO -- USE DEFAULT MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R4 ;SET TDB MOV R0,T.CMDA(R4) ;SET ADDRESS OF STRING IN CTDB CLR R1 ;INITIALIZE CHARACTER COUNT 2$: TSTB (R0)+ ;CHAR.EQ.0? BEQ 3$ ;YES, STOP COUNTING INC R1 ;NO. COUNT IT BR 2$ ;LOOP TILL ZERO FOUND 3$: CMP #3,R2 ;THREE OR MORE ARGUMENTS? BGT 5$ ;NO -- USE DEFAULT TYPE MOV (R5)+,R0 ;ADDRESS OF TYPE BLE 5$ ;USE DEFAULT MOV (R0),R0 ;TYPE CMP #1,R0 ;TYPE 1? BEQ 5$ ;YES CMP #2,R0 ;TYPE 2? BNE 6$ ;NO MOVB #TS.DOT,T.TTYP(R4) ;SET TYPE BR 11$ 6$: CMP #3,R0 ;TYPE 3? BNE 7$ ;NO MOVB #TS.DOL,T.TTYP(R4) ;SET TYPE BR 11$ 7$: CMP #4,R0 ;TYPE 4? BNE 5$ ;NO!! TRY DEFAULT MOVB #TS.INS,T.TTYP(R4) ;SET TYPE BR 11$ 5$: MOVB #TS.USE,T.TTYP(R4) 11$: MOVB R1,T.CMDL(R4) ; IS THERE A MESSAGE TO SEND? CMP #4,R2 ;IS MESSAGE BUFFER SPECIFIED? BGT 13$ ;NO MOV (R5),R0 ;ADDRESS OF MESSAGE BUFFER BLE 12$ ;INVALID ADDRESS CMP #253.,(R0) ;MESSAGE LENGTH LESS THAN 253? BLT 12$ ;NOPE -- IGNORE MESSAGE MOV SDB(R3),R3 MOV R0,T.SNDA(R3) BR 70$ 12$: CMP #5,R2 ;FIVE ARGUMENTS? BNE 13$ ;NO RUN$T R4,,,,,WAIT BR 99$ 13$: RUN$T R4 ;RUN SUBTASK 99$: RETURN 70$: TDPR$R R4,#JP.PI,#PR.CHN ;ENABLE SEND/RECV PRIV CMP #5,R2 BNE 75$ RUN$T R4,,,,R3,WAIT BR 99$ 75$: RUN$T R4,,,,R3 BR 99$ .SBTTL ABORTS ; ; FORTRAN CALLABLE SUBROUTINE TO ABORT A TIMESHARING SUBTASK ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL ABORTS(NTDB) ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; .EVEN ; ; ABORTS:: MOVB (R5)+,R1 ;NUMBER OF ARGUMENTS BLE 20$ ;NO ARGS. USE DEFAULT INC R5 MOV (R5)+,R1 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R1),R1 ;NTDB CMP #MAXTD,R1 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R1 ASL R1 ;NEED WORD OFFSET BR 21$ 20$: CLR R1 ;SET TO DEFAULT 21$: MOV TDB(R1),R0 ;SET TDB ABRT$T 99$: RETURN .SBTTL CHKEV ; ; FORTRAN CALLABLE SUBROUTINE TO CHECK TASK EVENTS ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL CHKEV(ISTAT, NTDB) ; ; ISTAT - STATUS ; = -1 NO EVENTS HAVE OCCURRED ; = SET EQUAL TO NTDB IF TASK EVENT OCCURRED. ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; ; CHKEV:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;RETURN -- NO ARGUMENTS INC R5 MOV (R5)+,R1 ;ADDRESS OF ISTAT CMP #2,R2 ;TWO OR MORE ARGS? BGT 10$ ;NO MOV (R5),R3 ;NTDB ADDRESS BLE 10$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;IN RANGE? BLT 10$ ;NO SUB #1,R3 ASL R3 ;WORD OFFSET BR 11$ 10$: CLR R3 11$: MOV TDB(R3),R3 ;SET TDB CKEV$T ,R3 TST R0 ;CHECK EVENTS BLE 80$ ;RETURN EVENTS (.LE.0) MOV #TDB,R2 76$: CMP (R2)+,R0 BNE 76$ ;NO MATCH SUB #2,R2 ;FOUND POINTER SUB #TDB,R2 ;GET DIFFERENCE MOV R2,R0 ASR R0 ;FORM NTDB-1 INC R0 ;NTDB 80$: TST R1 ;IS ISTAT REAL OR NULL BLE 99$ ;NULL -- FORGET RETURN MOV R0,(R1) ;RETURN NTDB 99$: RETURN .SBTTL CHKEVW ; ; FORTRAN CALLABLE SUBROUTINE TO WAIT FOR TASK EVENTS ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL CHKEVW (NTDB) ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; CHKEVW:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;RETURN -- NO ARGUMENTS INC R5 MOV (R5),R3 ;NTDB ADDRESS BLE 10$ ;N.G. USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;IN RANGE? BLT 10$ ;NO SUB #1,R3 ASL R3 ;WORD OFFSET BR 11$ 10$: CLR R3 11$: MOV TDB(R3),R3 ;SET TDB CKEV$T ,R3,WAIT 99$: RETURN .SBTTL CHKALL ; ; FORTRAN CALLABLE SUBROUTINE TO WAIT FOR ALL EVENTS ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL CHKALL (ISTAT [,ITERM]) ; ; ; ISTAT - STATUS (SOURCE OF EVENT) ; = 0 TERMINAL EVENT (CONTROL-C) OCCURRED. ; = + -- NTDB OF SUBTASK CAUSING EVENT ; NTDB RANGES FROM 1 TO MAXTD. ; ; ITERM - OPTIONAL ARGUMENT, WHICH, IF NON-NULL, INDICATES ; INCLUDING TERMINAL EVENTS IN WAIT. ; ; NOTE: THIS ROUTINE MUST ONLY BE CALLED AFTER ALL POSSIBLE ; TDB'S HAVE BEEN DECLARED. THE NUMBER POSSIBLE IS DETERMINED ; BY PARAMETER MAXTD. IF THE ORIGINAL VALUE OF MAXTD IS CHANGED, ; LINES AT LABELS 40$ AND 50$ BELOW MUST ALSO BE CHANGED. ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; CHKALL:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;RETURN -- NO ARGUMENTS INC R5 MOV (R5)+,R1 ;ADDRESS OF ISTAT BLE 99$ ;WON'T LET HIM CALL WITH NULL ISTAT ;IF HE'S NOT INTERESTED IN SOURCE OF EVENT ;HE MUST KNOW IT. SO LET HIM USE ANOTHER ;ROUTINE (I.E. CHKEVW OR WTEREV). CMP #2,R2 ;TWO ARGUMENTS BNE 50$ ;NO MOV (R5),R2 ;GET 2ND BLE 50$ ;IT'S NULL -- TO TERM 40$: CKEV$T WAIT,<#TDB0,#TDB1,#TDB2>,WAIT BR 98$ 50$: CKEV$T ,<#TDB0,#TDB1,#TDB2>,WAIT 98$: TST R0 ;CHECK SOURCE OF EVENT BLE 80$ ;RETURN VALUE .LE. 0 MOV #TDB,R2 76$: CMP (R2)+,R0 BNE 76$ ;NO MATCH SUB #2,R2 ;FOUND POINTER SUB #TDB,R2 ;GET DIFFERENCE MOV R2,R0 ASR R0 ;FORM NTDB-1 INC R0 ;FORM NTDB 80$: MOV R0,(R1) ;RETURN ISTAT 99$: RETURN .SBTTL WTEREV* ; ; FORTRAN CALLABLE SUBROUTINE TO WAIT FOR TERMINAL EVENT ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL WTEREV ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; ; WTEREV:: CKEV$T WAIT,,WAIT RETURN .SBTTL RDEVTS ; ; FORTRAN CALLABLE SUBROUTINE TO READ TASK EVENTS ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL RDEVTS(ISTAT,NTDB) ; ; ISTAT - STATUS ; ISTAT IS SET TO CONTAIN THE FLAGS BYTE FROM LOCATION ; T.EVNT CODED AS FOLLOWS: ; BIT 0 - IF.JS -- SUBTASK SUCCESSFULLY TERMINATED ; BIT 1 - IF.JA -- TASK ABORTED ; BIT 2 - IF.NL -- LOAD FAILURE ; BIT 3 - IF.SU -- SUBTASK SUSPENDED ITSELF ; BIT 4 - IF.CH -- TERMINATED AND CHAINED SUCCESSFULLY ; BIT 5 - IF.SD -- SUBTASK HAS SENT A MESSAGE ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; RDEVTS:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ INC R5 MOV (R5)+,R1 ;ADDRESS OF ISTAT CMP #2,R2 ;TWO ARGS BGT 20$ ;NO USE DEFAULT MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R3 ;SET TDB RDEV$T R3 MOVB T.EVNT(R3),R2 ;GET FLAGS BYTE CLR (R1) BITB #IF.JS,R2 BEQ 1$ ADD #1,(R1) 1$: BITB #IF.JA,R2 BEQ 2$ ADD #2,(R1) 2$: BITB #IF.NL,R2 BEQ 3$ ADD #4,(R1) 3$: BITB #IF.SU,R2 BEQ 4$ ADD #10,(R1) 4$: BITB #IF.CH,R2 BEQ 5$ ADD #20,(R1) 5$: BITB #IF.SD,R2 BEQ 99$ ADD #40,(R1) BR 99$ 99$: RETURN .SBTTL RSUMTS ; ; FORTRAN CALLABLE SUBROUTINE TO RSUM A SUSPENDED SUBTASK ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL RSUMTS(NTDB) ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; ; RSUMTS:: MOVB (R5)+,R3 ;NUMBER OF ARGUMENTS BLE 20$ ;NO ARGS. USE DEFAULT INC R5 MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R3 ;SET TDB RSUM$T R3 RETURN .SBTTL SPNDTS ; ; FORTRAN CALLABLE SUBROUTINE TO SUSPEND A SUBTASK ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL SPNDTS(NTDB) ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; ; ; SPNDTS:: MOVB (R5)+,R3 ;NUMBER OF ARGUMENTS BLE 20$ ;NO ARGS. USE DEFAULT INC R5 MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R3 ;SET TDB SPND$T R3 RETURN .SBTTL STEVTS ; ; FORTRAN CALLABLE SUBROUTINE TO SET SUBTASK LOCAL EVENT FLAG ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL STEVTS(IFLAG, NTDB) ; ; IFLAG - NUMBER OF LOCAL EVENT FLAG TO BE SET ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; STEVTS:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ INC R5 MOV (R5)+,R1 ;ADDRESS OF IFLAG MOV (R1),R1 CMP #2,R2 BGT 20$ ;USE DEFAULT MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R3 ;SET TDB SETF$T R3,R1 99$: RETURN .SBTTL TDPRIV ; ; FORTRAN CALLABLE SUBROUTINE TO SET TASK PRIVILEGE SECTION OF TDB ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL TDPRIV(ALL, NTDB) ; ; ALL - ARGUMENT WHICH IF NON-NULL INDICATES THAT ; TDB PRIVILEGES SHOULD EQUAL OWNER TASKS ; IF ALL IS A NULL-ARGUMENT, PRIVILEGES ARE DENIED ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; TDPRIV:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ INC R5 MOV (R5)+,R1 ;ALL ARGUMENT ADDRESS CMP #2,R2 BGT 20$ ;USE DEFAULT MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R3 ;SET TDB TST R1 BLE 50$ ;NULL ARGUMENT MEANS DENY PRIVILEGES TDPR$R R3,#JP.PI!JP.PD!JP.PT,#PR.RST!PR.CTC!PR.TEV!PR.CHN 99$: RETURN 50$: TDPR$R R3 BR 99$ .SBTTL DECTDB ; ; FORTRAN CALLABLE SUBROUTINE TO DECLARE A TDB ; ; MARK F. LEWIS ; 21-MAR-78 ; ; THIS ROUTINE SHOULD BE CALLED ONCE FOR EACH TDB TO BE USED ; IN A PROGRAM BEFORE CALLING ANY ROUTINE THAT HAS NTDB AS AN ARGUMENT. ; ; FORTRAN CALLING SEQUENCE ; CALL DECTDB(NTDB) ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; DECTDB:: MOVB (R5)+,R3 ;NUMBER OF ARGUMENTS BLE 20$ ;NO ARGS. USE DEFAULT INC R5 MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R0 ;SET TDB TDBD$T R0 RETURN .SBTTL RELTDB ; ; FORTRAN CALLABLE SUBROUTINE TO RELEASE A TDB ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE ; CALL RELTDB(NTDB) ; ; NTDB - ORDINAL NUMBER OF SUBTASK ; NTDB RANGES FROM 1 (DEFAULT) TO MAXTD ; ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; RELTDB:: MOVB (R5)+,R3 ;NUMBER OF ARGUMENTS BLE 20$ ;NO ARGS. USE DEFAULT INC R5 MOV (R5)+,R3 ;NTDB ADDRESS BLE 20$ ;N.G--USE DEFAULT MOV (R3),R3 ;NTDB CMP #MAXTD,R3 ;WITHIN RANGE? BLT 20$ ;TOO BIG--USE DEFAULT SUB #1,R3 ASL R3 ;NEED WORD OFFSET BR 21$ 20$: CLR R3 ;SET TO DEFAULT 21$: MOV TDB(R3),R0 ;SET TDB TDBR$T R0 99$: RETURN .SBTTL CLAIMC* ; ; FORTRAN CALLABLE SUBROUTINE TO CLAIM CONTROL-C NOTIFICATION ; ; MARK F. LEWIS ; 19-OCT-77 ; ; FORTRAN CALLING SEQUENCE ; CALL CLAIMC ; ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; CLAIMC:: CTC$T CLAIM RETURN .SBTTL SENTS ; ; FORTRAN CALLABLE SUBROUTINE TO SEND A MESSAGE TO A TIME-SHARED TASK ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE -- ; CALL SENTS(BUFF, IDEST [,ISTAT]) ; ; BUFF - BUFFER CONTAINING MESSAGE. BUFFER MUST ; START ON A WORD BOUNDARY AND FIRST WORD MUST BE ; LENGTH OF BUFFER IN BYTES. ; ; IDEST - WORD CONTAINING DESTINATION: ; = -1 DESTINATION IS OWNER TASK ; = 0 DESTINATION IS CHAIN TASK ; = OTHER: ORDINAL SUBTASK NUMBER (NTDB) ; ; ISTAT - OPTIONAL 2-WORD ARRAY TO RECEIVE STATUS INFORMATION ; ; NOTE: SENTS USES ITS OWN SDB WHEN IDEST.LE.0 ; SENTS USES THE COMMON SDB'S WHEN IDEST.GT.0 ; SDBS: SDBDF$ ,,,ESBS ESBS: ESBDF$ .EVEN ; SENTS:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;INVALID ARGUMENT LIST INC R5 MOV (R5)+,R3 ;GET BUFFER ADDRESS BLE 99$ ;INVALID ADDRESS CMP #2,R2 BGT 99$ ;MUST HAVE AT LEAST TWO ARGUMENTS MOV (R5)+,R1 ;R1=ADDRESS OF IDEST MOV (R1),R1 ;R1=IDEST BGT 50$ MOV #SDBS,R0 ;SET UP SDB MOV R1,T.SNDT(R0) ;SET DESTINATION ADDRESS BR 51$ 50$: CMP #MAXTD,R1 ;IDEST WITHIN RANGE? BLT 20$ ;NO -- USE DEFAULT SUB #1,R1 ASL R1 ;SET UP WORD OFFSET BR 21$ 20$: CLR R1 21$: MOV TDB(R1),T.SNDT(R0) MOV SDB(R1),R0 51$: MOV R3,T.SNDA(R0) ;SET UP BUFFER ADDRESS SEND$T R0,,,ESBS BCS 98$ 99$: RETURN 98$: ;IF AN ERROR OCCURS TST R1 BGT 99$ ;IDEST.GT.0--IGNORE ERRORS MOV (R5)+,R1 ;ADDRESS OF ISTAT TST R1 ;VALID ADDRESS? BLE 99$ MOV ESBS+T.ERR,(R1)+ ;RETURN ERROR CODE MOV ESBS+T.ERR+2,(R1) ; AND SUBCODE BR 99$ .SBTTL RELINC* ; ; FORTRAN CALLABLE SUBROUTINE TO RELINQUISH CONTROL-C NOTIFICATION ; ; MARK F. LEWIS ; 19-OCT-77 ; ; FORTRAN CALLING SEQUENCE ; CALL RELINC ; ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; RELINC:: CTC$T RELINQ RETURN .SBTTL RSASTS* ; ; FORTRAN CALLABLE SUBROUTINE TO RESUME ALL AUTO-SUSPENDED SUBTASKS ; ; MARK F. LEWIS ; 19-OCT-77 ; ; FORTRAN CALLING SEQUENCE ; CALL RSASTS ; ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; RSASTS:: RSAS$T RETURN .SBTTL CHAIN* ; ; FORTRAN-CALLABLE SUBROUTINE TO CHAIN TO A TIME-SHARED TASK ; AND OPTIONALLY SEND A MESSAGE TO THE SUCCESSOR ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE-- ; CALL CHAIN(TASKNAME [,ITYP] [,MESS]) ; ; TASKNAME - VALID COMMAND LINE FOR SUCCESSOR TASK ; - LAST BYTE MUST BE ZERO. (SET AUTOMATICALLY BY ; F4P FOR LITERALS). ; ; ITYP - OPTIONAL ARGUMENT SPECIFYING TYPE OF TASK ; = 1 (DEFAULT) COMMAND IS FILENAME OF TASK TO ; BE AUTO-INSTALLED AND REMOVED ; = 2 COMMAND IS FOR MCR TASK (...XYZ) ; = 3 COMMAND IS FOR SYSTEM LIBRARY TASK ($$$XYZ) ; = 4 COMMAND IS FOR AN INSTALLED TASK (UP TO 6 CHARACTERS) ; ; MESS - OPTIONAL ARGUMENT SPECIFYING THE ADDRESS OF A MESSAGE ; TO BE SENT TO THE CHAINED TASK. DEFAULT IS NO MESSAGE. ; NOTE THAT THE FIRST WORD OF THE MESSAGE MUST CONTAIN ; THE LENGTH, IN BYTES, OF THE MESSAGE, WHICH MUST START ; AT ADRRESS MESS+2 ; ; THERE ARE NO ERROR RETURNS FROM THIS SUBROUTINE. ; CTDB: CDBDF$ ;DEFINE THE CTDB SDBC: SDBDF$ ;DEFINE SDB FOR LATER USE .EVEN ; CHAIN:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;INVALID ARGUMENT LIST INC R5 MOV (R5)+,R0 ;ADDRESS OF TASKNAME STRING TO R0 BLE 99$ 4$: MOV #CTDB,R4 MOV R0,T.CHNA(R4) ;SET ADDRESS OF TASKNAME STRING IN CTDB CLR R3 ;INITIALIZE CHARACTER COUNT 2$: TSTB (R0)+ ;CHAR.EQ.0? BEQ 3$ ;YES, STOP COUNTING INC R3 ;NO. COUNT IT BR 2$ ;LOOP TILL ZERO FOUND 3$: CMP #2,R2 ;TWO OR MORE ARGUMENTS? BGT 5$ ;NO -- USE DEFAULT TYPE MOV (R5)+,R0 ;ADDRESS OF TYPE BLE 5$ ;USE DEFAULT MOV (R0),R0 ;TYPE CMP #1,R0 ;TYPE 1? BEQ 5$ ;YES CMP #2,R0 ;TYPE 2? BNE 6$ ;NO MOVB #TS.DOT,T.CTYP(R4) ;SET TYPE BR 11$ 6$: CMP #3,R0 ;TYPE 3? BNE 7$ ;NO MOVB #TS.DOL,T.CTYP(R4) ;SET TYPE BR 11$ 7$: CMP #4,R0 ;TYPE 4? BNE 5$ ;NO!! TRY DEFAULT MOVB #TS.INS,T.CTYP(R4) ;SET TYPE BR 11$ 5$: MOVB #TS.USE,T.CTYP(R4) 11$: MOVB R3,T.CHNL(R4) ;SET LENGTH OF TASKNAME STRING ; IS THERE A MESSAGE TO SEND? CMP #3,R2 ;IS MESSAGE BUFFER SPECIFIED? BNE 12$ ;NO ;THE FOLLOWING LINE GRANTS ALL PRIVILEGES TO THE CHAINED TASK ;THIS ROUTINE WILL HAVE TO BE RE-DONE IF THIS IS NOT DESIRED TDPR$R R4,#JP.PI!JP.PD!JP.PT,#PR.RST!PR.CTC!PR.TEV!PR.CHN MOV (R5),R0 ;ADDRESS OF MESSAGE BUFFER BLE 12$ ;INVALID ADDRESS CMP #253.,(R0) ;LENGTH LESS THAN 253? BLT 12$ ;NOPE -- IGNORE MESSAGE MOV #SDBC,R4 MOV R0,T.SNDA(R4) CHN$T #CTDB,,,,#SDBC ;CHAIN AND SEND MESSAGE BR 99$ 12$: CHN$T #CTDB ;CHAIN 99$: RETURN .SBTTL RECV ; ; FORTRAN CALLABLE SUBROUTINE TO RECEIVE A MESSAGE FROM A TIME-SHARED TASK ; ; MARK F. LEWIS ; 21-MAR-78 ; ; FORTRAN CALLING SEQUENCE -- ; CALL RECV(BUFF ,LENGTH [,ISNDER] [,ISTAT]) ; ; BUFF - ADDRESS OF BUFFER TO RECEIVE MESSAGE. BUFFER MUST ; START ON A WORD BOUNDARY. ; ; LENGTH - LENGTH OF BUFFER IN BYTES ; ; ISNDER - OPTIONAL WORD TO RECEIVE SENDING TASK INDICATOR ; = -2 SENDER WAS A SUBTASK WHOSE TDB AS BEEN RELEASED ; OR REUSED. ; = -1 SENDER WAS OWNER. ; = 0 SENDER WAS THE PREDECESSOR. ; = OTHER -- NTDB OF SENDER ; ; ISTAT - OPTIONAL 2-WORD ARRAY TO RECEIVE STATUS INFORMATION ; SDBR: SDBDF$ ,,,ESBR ESBR: ESBDF$ .EVEN ; RECV:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ ;INVALID ARGUMENT LIST INC R5 MOV #SDBR,R4 MOV (R5)+,T.SNDA(R4) ;SET UP ADDRESS BLE 99$ ;INVALID ADDRESS CMP #2,R2 BGT 99$ ;MUST HAVE AT LEAST TWO ARGUMENTS MOV (R5)+,R1 ;ADDRESS OF LENGTH MOVB (R1),T.SNDL(R4) ;LENGTH OF BUFFER CMP #3,R2 ;THREE ARGS? BGT 10$ ;NO MOV (R5)+,R3 ;ADDRESS OF ISNDER CMP #4,R2 ;FOUR ARGS? BGT 10$ MOV (R5)+,R1 ;ADDRESS OF ISTAT 10$: RCV$T #SDBR BCS 98$ ; DO WE NEED SENDER STUFF? CMP #3,R2 ;THREE OR MORE ARGUMENTS? BGT 99$ ;NO TST R3 ;VALID ADDRESS? BLE 99$ ;NO MOV T.SNDT(R4),R4 BLE 97$ ;ISNDER .LE.0 MOV #TDB,R2 76$: CMP (R2)+,R4 BNE 76$ ;NO MATCH SUB #2,R2 ;FOUND POINTER SUB #TDB,R2 ;GET DIFFERENCE MOV R2,R4 ASR R4 ;R4=NTDB-1 INC R4 ;R4=NTDB 97$: MOV R4,(R3) ;RETURN ISNDER 99$: RETURN 98$: ;IF AN ERROR OCCURS TST R1 ;VALID ADDRESS? BLE 99$ MOV ESBR+T.ERR,(R1)+ ;RETURN ERROR CODE MOV ESBR+T.ERR+2,(R1) ; AND SUBCODE BR 99$ .SBTTL STMAXT* ; ; FORTRAN CALLABLE ROUTINE TO SET A TERMINAL'S MAXIMUM TASK ALLOCATION ; ; CALLING SEQUENCE: ; CALL STMAXT(N) ; ; N - REQUIRED ALLOCATION LIMIT DESIRED ; ON RETURN N IS SET TO THE ACTUAL ALLOCATION MADE. ; ** NOTE: N MUST NOT BE A LITERAL.** ; ; NOTE THAT THIS ROUTINE IS AVAILABLE ONLY TO A CLI. ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; STMAXT:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE 99$ INC R5 MOV (R5)+,R1 ;ALLOCATION LIMIT ADDRESS MOV (R1),R2 ;LIMIT JNOD$T R2 MOV R0,(R1) ;RETURN ALLOCATION 99$: RETURN .SBTTL INITS* ; ; FORTRAN CALLABLE SUBROUTINE TO INITIALIZE TCS ; AND RELEASE ANY DECLARED TDB'S. ; ; SHOULD BE CALLED IF IT IS INTENED TO RESTART A PROGRAM WITHOUT ; PRIOR LOADING. ; ; CALLING SEQUENCE: ; CALL INITS ; ; THERE ARE NO ERROR RETURNS FROM THIS ROUTINE. ; INITS:: TINIT$ RETURN .END