.LIST TTM .TITLE CHAIN ; ; FORTRAN-CALLABLE SUBROUTINE TO CHAIN TO A TIME-SHARED TASK ; AND OPTIONALLY SEND A MESSAGE TO THE SUCCESSOR ; ; MARK F. LEWIS ; 17-OCT-77 ; ; 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. .MCALL TCSMC$,RETURN TCSMC$ CTDB: CDBDF$ ;DEFINE THE CTDB SDB: SDBDF$ ;DEFINE SDB FOR LATER USE CHAIN:: MOVB (R5)+,R2 ;NUMBER OF ARGUMENTS BLE EXIT ;INVALID ARGUMENT LIST INC R5 MOV (R5)+,R0 ;ADDRESS OF STRING TO R0 BLE EXIT 4$: MOV #CTDB,R4 MOV R0,T.CHNA(R4) ;SET ADDRESS OF 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) ; IS THERE A MESSAGE TO SEND? CMP #3,R2 ;IS MESSAGE BUFFER SPECIFIED? BNE 12$ ;NO MOV (R5),R0 ;ADDRESS OF MESSAGE BUFFER BLE 12$ ;INVALID ADDRESS MOV (R0),R1 ;MESSAGE LENGTH CMP #253.,R1 ;LENGTH LESS THAN 253? BLT 12$ ;NOPE -- IGNORE MESSAGE MOV #SDB,R4 MOV R0,T.SNDA(R4) SEND$T #SDB,#0 ;SEND MESSAGE 12$: CHN$T #CTDB ;CHAIN EXIT: RETURN .END