.TITLE CHAIN ; ; FORTRAN CALLABLE SUBROUTINE TO CHAIN TO A TIME-SHARED TAS ; AND OPTIONALLY SEND A MESSAGE TO THE SCCESSOR ; ; CALL CHAIN (TASKNAME [,ITYP] [,MESS]) ; ; TASKNAME VALID COMMAND LINE FOR SUCCESSOR TASK ; (TERMINATES IN ZERO) ; ; ITYP OPTAIONAL ARGUMENT SPECIFYING TYPE OF TASK ; 1 (DEFAULT) FILENAME OF TASK TO BE AUTO-INSTALLED ; 2 MCR TASK (...XYZ) ; 3 SYSTEM LIBRARY TASK ($$$XYZ) ; 4 INSTALLED TASK (UP TO 6 CHARACTERS) ; ; MESS OPTIONAL ARGUMENT SPECIFYING A MESSAGE TO BE ; SENT TO THE CHAINED TASK. MUST START WITH ; 1-WORD LENGTH FIELD. ; .PSECT SUBDAT,RW,D,GBL,REL,CON CTDB: CDBDF$ ;DEFINE THE CTDB SDBC: SDBDF$ ;DEFINE THE SDB FOR LATER USE ; .PSECT SUBTAS,RO,I,LCL,REL,CON ; CHAIN:: MOVB (R5)+,R2 ;NO. OF ARGS BLE 100$ INC R5 MOV (R5)+,R0 ;A(TASKNAME STRING) BLE 100$ 4$: MOV #CTDB,R4 MOV R0,T.CHNA(R4) ;SET IN CTDB CLR R3 2$: TSTB (R0)+ ;CHAR = 0? BEQ 3$ ;YES - STOP COUNTING INC R3 ;COUNT BR 2$ ;CONT 3$: CMP #2,R2 ;TWO OR MORE ARGS? BGT 5$ ;NO--DEFAULT TYPE MOV (R5)+,R0 ;A(TYPE) BLE 5$ ;N.G.--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) BR 11$ 7$: CMP #4,R0 ;TYPE 4? BNE 5$ ;NO--DEFAULT MOVB #TS.INS,T.CTYP(R4) BR 11$ 5$: MOVB #TS.USE,T.CTYP(R4) 11$: MOVB R3,T.CHNL(R4) ;L(TASKNAME STRING) ; IS THERE A MESSAGE TO SEND? CMP #3,R2 ;IS MSG BUFFER SPECIFIED? BNE 12$ ;NO ; THE FOLLOWING LINE GRANTS ALL PRIVILEGES TO THE CHAINED TASK. TDPR$R R4,#JP.PI!JP.PD!JP.PT,#PR.RST!PR.CTC!PR.TEV!PR.CHN MOV (R5),R0 ;A(MSG BUFFER) BLE 12$ ;INVALID ADDR CMP #253.,(R0) ;LENGTH < 253? BLT 12$ ;NO--IGNORE MSG MOV #SDBC,R4 MOV R0,T.SNDA(R4) CHN$T #CTDB,,,,#SDBC ;CHAIN AND SEND MESSAGE BR 99$ 12$: CHN$T #CTDB ;CHAIN 99$: MOV #CTDB+T.CESB-T.TESB,R0 ;FAKE OFFSET TO ERROR BLOCK ADDRESS BCC 101$ JSR PC,ERRTS ;CALL ERROR ROUTINE RETURN 100$: MOV #-1,R0 ;BAD ARGUMENT RETURN RETURN 101$: MOV #1,R0 ;SUCCESS CODE RETURN .END