;NETWORK FILE COPY(NFC.MAC) ; ; PAUL ELKINS 4-SEPT-84 ; ; LOS ALAMOS NATIONAL LAB. ; PO BOX 1663 MS-J957 ; LOS ALAMOS NM 87545 ; 505 667 3502 ; ; ; ;COPYRIGHT, 1984,THE REGENTS OF THE UNIVERSITY OF CALIFORNIA. ;THIS SOFTWARE WAS PRODUCED UNDER A U.S. GOVERNMENT CONTRACT ;(W-7405-ENG-36) BY THE LOS ALAMOS NATIONAL LABORATORY,WHICH ;IS OPERATED BY THE UNIVERSITY OF CALIFORNIA FOR THE U.S. ;DEPARTMENT OF ENERGY. THE U.S. GOVERNMENT IS LICENSED TO USE, ;REPRODUCE, AND DISTRIBUTE THIS SOFTWARE. PERMISSION IS GRANTED ;TO THE PUBLIC TO COPY AND USE THIS SOFTWARE WITHOUT CHARGE, ;PROVIDED THAT THIS NOTICE AND ANY STATEMENT OF AUTHORSHIP ARE ;REPRODUCED ON ALL COPIES. NEITHER THE GOVERNMENT NOR THE ;UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ;ANY LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE. ; ;THIS CODE USES GMCR COMMAND LINE INPUT ; ;USES DATA SET DESCRIPTOR ; .TITLE NFC .MCALL FSRSZ$,FDBDF$,FDRC$A,FDBK$A,FDOP$A .MCALL NMBLK$,FINIT$,OPEN$R,READ$,WAIT$ .MCALL FDOP$R,WRITE$,CLOSE$,EXIT$S,OPEN$W .MCALL FDRC$R,FDBK$R,FDAT$R,GMCR$,DIR$,QIOW$ .MCALL FCSBT$,GTSK$S,QIO$,MRKT$,CMKT$S,WTLO$S .MCALL XQPRCL,XQFTYP,XQFOFF,XQFACC,XQNODS ; .LIST MEB ; XQPRCL ;DEFINE XQ PROTOCOL PACKET FIELDS XQFTYP ;DEFINE XQ FILE ACCESS TYPE CODES XQFOFF ;DEFINE XQ FILE OFFSETS IN PACKET XQFACC ;DEFINE FILE ACCESS CODES FCSBT$ ;DEFINE FCS BIT VALUES FOR FDB'S ; L1=1 ;FILE ACCESS LUN L2=2 ;ENTERNET QIO LUN L3=3 ;ERROR TYPE OUT LUN EF1=1 ;FILE ACCESS EVENT FLAG EF2=2 ;ETHERNET QIO EVENT FLAG EF3=3 ;ERROR TYPE OUT EVENT FLAG WTEF=14. ;TIME OUT EVENT FLAG WTMSK=20000 ;TIME OUT EVENT FLAG MASK XQMSK=2 ;ETHERNET EVENT FLAG MASK TMMSK=XQMSK!WTMSK ;ETHERNET RECEIVE OR TIME OUT MASK LHDR=XQRECL+2 ;HEADER LENGTH IN BYTES LBUF=1000 ;DATA BUFFER LENGTH IN BYTES LBFX=LHDR+LBUF ;TOTAL BUFFER LENGTH LREQ=200 ;REQUEST PACKET LENGTH IN BYTES LACK=100 ;ACKNOWLEDGE PACKET LENGTH IN BYTES XQFERR=44 ;XQ: FILE ERROR OFFSET XQEFBK=34 ;XQ: END OF FILE BLOCK NUMBER HIGH WORD XQFFBY=40 ;XQ: FIRST FREE BYTE ; ; START:: FINIT$ ;INIT FSR AT RUN TIME CLOSE$ #FDB ;FLUSH OUT FDB GTSK$S #HDR+XQSTSK ;GET MY TASK NAME MOV TSKUIC,R1 ;GET DEFAULT TASK UIC MOV R1,MYUIC ;SAVE IT FOR FUTURE USE JSR PC,.WDFUI ;SET FCS DEFAULT UIC JSR PC,.WFOWN ;SET FCS FILE OWNER UIC MOV DTASK,HDR+XQDTSK ;GET DESTINATION TASK NAME(1) MOV DTASK+2,HDR+XQDTSK+2 ;GET DESTINATION TASK NAME(2) MOV #STBLK,FDB+F.STBK ;INITIALIZE STATISTICS BLOCK DIR$ #GMCR ;EXECUTE GMCR EXEC CALL BCC 10$ ;OK CONTINUE JSR PC,ERR1 ;GET MCR COMMAND LINE ERROR 10$: DIR$ #GDPB ;GET MY NODE ADDRESS MOV #XQFTYP,HDR+XQTYP ;INSERT FILE ACCESS TYPE CODE MOV #PBLK,R5 ;PARSX ARG BLOCK JSR PC,PARSX ;PARSE COMMAND LINE BCC 15$ ;OK CONTINUE JSR PC,ERR1 ;PARSE ERROR 15$: MOV #IDSPT+14,R0 ;INPUT NODE DSPT JSR PC,FNODA ;GET INPUT NODE ADDRESS BPL 20$ JSR PC,ERR6 ;INPUT NODE ADDRESS ERROR 20$: MOV R0,INODE ;SAVE INPUT-NODE ADDRESS MOV #ODSPT+14,R0 ;OUTPUT NODE DSPT JSR PC,FNODA ;GET OUTPUT NODE ADDRESS BPL 22$ JSR PC,ERR6 ;OUTPUT NODE ADDRESS ERROR 22$: MOV R0,ONODE ;SAVE OUTPUT-NODE ADDRESS CMP R0,INODE ;ONODE=INODE ? BNE .+6 ;NO CONTINUE JSR PC,ERR6 ;NODES CAN'T BE SAME CMP R0,MYNOD ;ONODE=MYNOD ? BEQ 24$ ;YES CMP INODE,MYNOD ;INODE=MYNOD ? BEQ 26$ ;YES JSR PC,ERR6 ;NO MATCH- MUST BE AN ERROR 24$: MOV ONODE,FNODE ;SETUP FROM-NODE MOV INODE,TNODE ;SETUP TO-NODE BR WRFIL ;WRITE LOCAL FILE 26$: MOV INODE,FNODE ;SETUP FROM-NODE MOV ONODE,TNODE ;SETUP TO-NODE BR RDFIL ;READ LOCAL FILE ; ;READ LOCAL WRITE REMOTE ; RDFIL: OPEN$R #FDB ;OPEN FOR READ BCC .+6 ;OK SKIP JSR PC,ERR2 ;FILE OPEN ERROR MOV F.EFBK(R0),EFBK ;SAVE EOF BLOCK NUMBER(HIGH) MOV F.EFBK+2(R0),EFBK+2 ;SAVE EOF BLOCK NUMBER(LO) MOV F.FFBY(R0),FFBY ;SAVE FIRST FREE BYTE POINTER JSR PC,SACK ;ISSUE CONNECT REQUEST MOV MYUIC,HDR+XQDUIC ;INSERT MY DEFAULT UIC MOV STBLK+6,HDR+XQCNTG ;ASSUME FILE CONTIGUOUS TST STBLK ;FILE CONTIGUOUS ? BNE 5$ ;YES TST STBLK+2 ;FILE CONTINUOUS ? BNE 5$ ;YES NEG HDR+XQCNTG ;MAKE FILE NON-CONTIGUOUS 5$: MOVB F.RTYP(R0),HDR+XQRTYP ;FILE TYPE CODE MOVB F.RATT(R0),HDR+XQRATT ;RECORD ATTRIBUTES MOV F.RSIZ(R0),HDR+XQRSIZ ;RECORD SIZE MOV #XQOPEN,HDR+XQSTYP ;SEND OPEN FOR WRITE CODE MOV #XQWBAS,HDR+XQFST ;F.FACC+(F.RACC)400 JSR PC,XFRDSP ;XFR DSPT AND DATA SET DESC. JSR PC,SREQ ;SEND OPEN REQUEST WAIT FOR REPLY MOV #XQWRBK,HDR+XQSTYP ;SEND WRITE BLOCK CODE CLR HDR+XQSEQ ;RESET RECORD NUMBER 10$: INC HDR+XQSEQ ;BUMP RECORD NUMBER READ$ #FDB ;READ BLOCK BCS 15$ ;END OF FILE ? WAIT$ R0 ;WAIT FOR I/O JSR PC,SBLK ;SEND BLOCK WAIT FOR REPLY BR 10$ ;READ ANOTHER RECORD 15$: CMPB #IE.EOF,F.ERR(R0) ;END OF FILE ? BEQ CLOS1 ;YES JSR PC,ERR2 ;READ FILE ERROR ; ;READ REMOTE WRITE LOCAL ; WRFIL: JSR PC,SACK ;ISSUE CONNECT REQUEST JSR PC,XFRDSP ;XFR DSPT AND DATA SET DESC MOV MYUIC,HDR+XQDUIC ;INSERT MY DEFAULT UIC MOV #XQOPEN,HDR+XQSTYP ;BLOCK OPEN FOR READ MOV #XQRBAS,HDR+XQFST ;F.FACC+(F.RACC)400 JSR PC,SREQ ;SEND OPEN REQUEST WAIT FOR REPLY MOV #FDB,R0 ;GET FDB ADDRESS MOV HDR+XQCNTG,F.CNTG(R0) ;FILE LENGTH MOVB HDR+XQRTYP,F.RTYP(R0) ;RECORD TYPE MOVB HDR+XQRATT,F.RATT(R0) ;RECORD ATTRIBUTES MOV HDR+XQRSIZ,F.RSIZ(R0) ;RECORD SIZE OPEN$W R0 ;OPEN FOR WRITE BCC .+6 ;OK SKIP JSR PC,ERR2 ;FILE OPEN ERROR MOV #XQRDBK,HDR+XQSTYP ;READ BLOCK CODE CLR HDR+XQSEQ ;RESET RECORD NUMBER 10$: INC HDR+XQSEQ ;BUMP RECORD NUMBER JSR PC,SREQ ;SEND READ REQUEST WAIT FOR REPLY CMP HDR+XQSTYP,#XQCLSF ;END OF FILE ? BEQ CLOS2 ;YES WRITE$ #FDB ;WRITE BLOCK BCC .+6 ;OK SKIP JSR PC,ERR2 ;WRITE FILE ERROR WAIT$ R0 ;WAIT ON I/O BR 10$ ;ONE MORE TIME ; ;CLOSE FILE AND EXIT ; CLOS1: MOV #XQCLSF,HDR+XQSTYP ;CLOSE SUB-TYPE CODE MOV EFBK,HDR+XQEFBK ;GET EOF BLOCK NUMBER(HIGH) MOV EFBK+2,HDR+XQEFBK+2 ;GET EOF BLOCK NUMBER(LO) MOV FFBY,HDR+XQFFBY ;GET FIRST FREE BYTE MOV #LACK,R0 ;CLOSE PACKET LENGTH IN BYTES MOV R0,WDPB+Q.IOPL+2 ;QIO BYTE COUNT ASR R0 ;MAKE IT WORD COUNT MOV R0,HDR+XQWC ;PACKET WORD COUNT DIR$ #WDPB ;SEND CLOSE REQUEST BR CLOSE ;CLOSE AND EXIT CLOS2: MOV HDR+XQEFBK,FDB+F.EFBK ;RESTORE EOF BLOCK NUMBER(HIGH) MOV HDR+XQEFBK+2,FDB+F.EFBK+2 ;RESTORE EOF BLOCK NUMBER(LO) MOV HDR+XQFFBY,FDB+F.FFBY ;RESTORE FIRST FREE BYTE CLOSE: CLOSE$ #FDB ;CLOSE FILE EXIT: EXIT$S ;EXIT ; ;FIND NODE ADDRESS ; ; R0=NODE DSPT(INPUT) ; R0=NODE ADDRESS(OUTPUT) ; -1=NO MATCH ; +N=NODE ADDRESS ; IF NONE SPECIFIED MYNOD IS SUBSTITUTED ; ; R1-R5 ARE DESTROYED ; FNODA: MOV 2(R0),R2 ;GET NODE STRING ADDRESS BNE 1$ ;NODE NAME WAS SPECIFIED MOV MYNOD,R0 ;NONE SPECIFIED BR 10$ ;EXIT 1$: MOV #NODES+2,R0 ;NODE TABLE ADDRESS MOV NODES,R1 ;NUMBER OF NODES MOV #1,R4 ;INITIAL NODE ADDRESS MOV R2,R5 ;SAVE NODE STRING ADDRESS 2$: MOV #XQLNOD,R3 ;NODE NAME LENGTH 3$: CMPB (R0)+,(R2)+ ;EQUAL ? BNE 7$ ;NO SKIP SOB R3,3$ ;TRY NEXT CHARACTER MOV R4,R0 ;FOUND A MATCH BR 10$ ;EXIT 7$: DEC R0 ;ADJUST ADDRESS ADD R3,R0 ;UPDATE TABLE ADDRESS MOV R5,R2 ;RESET NODE STRING ADDRESS INC R4 ;INCREMENT NODE ADDRESS SOB R1,2$ ;TRY NEXT NODE MOV #-1,R0 ;NO MATCH 10$: RTS PC ; ;XFR DSPT AND DATA SET DESCRIPTER ; ; XFRDSP: MOV #HDR+XQDSPT,R4 ;DSPT DESTINATION MOV #IDSPT,R0 ;GET INPUT DSPT ADDRESS MOV #ODSPT,R1 ;GET OUTPUT DSPT ADDRESS MOV #XQDSPL-2,R2 ;OFFSET IN DSPT BLOCK MOV #4,R3 ;NUMBER OF ENTRIES TST 10(R0) ;INPUT FILE NAME SPECIFIED ? BNE 2$ ;YES JSR PC,ERR1 ;NO FILE NAME ERROR 2$: TST 10(R1) ;OUTPUT FILE NAME SPECIFIED ? BNE 3$ ;YES MOV 10(R0),10(R1) ;XFR FILE NAME LENGTH MOV 12(R0),12(R1) ;XFR FILE NAME ADDRESS 3$: CMP MYNOD,ONODE ;WRITE LOCAL/READ REMOTE ? BEQ 4$ ;YES MOV R0,-(SP) ;NO SWAP R0<-->R1 MOV R1,R0 ;R1 TO R0 MOV (SP)+,R1 ;R0 TO R1 4$: MOV R1,FDB+F.DSPT ;SET LOCAL DSPT POINTER 5$: MOV (R0)+,(R4)+ ;TRANSFER DSPT ENTRY LENGTH MOV (R0)+,(R4)+ ;TRANSFER DSPT ENTRY ADDRESS BEQ 9$ ;SKIP IF ZERO SUB #CMDLIN,-2(R4) ;OFFSET INTO CMDLIN BUFFER ADD R2,-2(R4) ;ADD IN DSPT OFFSET 9$: CMP -(R2),-(R2) ;DSPT OFFSET -4 SOB R3,5$ MOV #CMDLIN,R0 ;GMCR BUFFER MOV #HDR+XQDESC,R1 ;GMCR XFR BUFFER MOV #XQDESL-XQDSPL/2,R2 ;GMCR BUFFER LENGTH 10$: MOV (R0)+,(R1)+ ;TRANSFER CMDLIN SOB R2,10$ RTS PC ; ;SWAP TO/FROM FIELDS ; SWAP: MOV #HDR,R0 ;GET HDR ADDRESS MOV XQDST+4(R0),R1 ;GET OLD DEST MOV XQSRC+4(R0),XQDST+4(R0) ;GET NEW DEST MOV R1,XQSRC+4(R0) ;GET NEW SOURCE MOV XQDTSK(R0),R1 ;SAVE DEST. TASK NAME(1) MOV XQSTSK(R0),XQDTSK(R0) ;SWAP SRC/DEST. TASK NAME(1) MOV R1,XQSTSK(R0) ;SWAP DEST./SRC TASK NAME(1) MOV XQDTSK+2(R0),R1 ;SAVE DEST. TASK NAME(2) MOV XQSTSK+2(R0),XQDTSK+2(R0) ;SWAP SRC/DEST. TASK NAME(2) MOV R1,XQSTSK+2(R0) ;SWAP DEST./SRC TASK NAME(2) RTS PC ; ; ;SEND PACKET AND WAIT FOR REPLY ; SREQ: MOV #LREQ,R0 ;REQUEST BYTE COUNT BR SRX SACK: MOV #LACK,R0 ;REPLY BYTE COUNT BR SRX SBLK: MOV #LBFX,R0 ;SEND BLOCK BYTE COUNT SRX: MOV R0,WDPB+Q.IOPL+2 ;QIO BYTE COUNT ASR R0 MOV R0,HDR+XQWC ;PACKET WORD COUNT SRPKT: DIR$ #WDPB ;SEND PACKET AND WAIT DIR$ #RDPB ;RECEIVE OR TIME OUT DIR$ #TMO ;SET TIME OUT WTLO$S 0,#TMMSK ;WAIT FOR RECEIVE/TIME OUT CMKT$S #WTEF ;CANCEL MARK TIME TST IOSB2 ;ETHERNET RECEIVE ? BNE 5$ ;YES CONTINUE JSR PC,ERR3 ;NO TIME OUT 5$: TST HDR+XQSTYP ;REMOTE FILE ERROR ? BPL 10$ ;NO CONTINUE JSR PC,RERR ;REMOTE FILE ERROR 10$: JSR PC,SWAP ;SWAP FROM/TO FIELDS RTS PC ; ;GENERAL ERROR ROUTINE ; RERR: MOV #HDR+XQFERR,R4 ;GET ERROR DATA BLOCK ADDRESS MOV (R4)+,R0 ;ERROR CODE MOV (R4)+,R3 ;FILE ACCESS ERROR CODE(F.ERR) MOV #MS4X,R5 ;GET REMOTE TYPE/FUNC. CODE CB CMP R0,#-2 ;REMOTE FILE ACCESS ERROR ? BNE ERRZ ;NO MUST BE TYPE/FUNC. CODE MOV #MS5X,R5 ;GET REMOTE FILE ACCESS CODE CB BR ERRZ ;COMMON ERROR CODE ERR1: MOV #MS1X,R5 ;GET SYNTAX ERROR CONTROL BLOCK BR ERRX ;ERROR COMMON CODE ERR2: MOV #MS2X,R5 ;GET LOCAL FILE ACCESS CB BR ERRX ;ERROR COMMON CODE ERR3: MOV #MS3X,R5 ;GET TIME-OUT CONTROL BLOCK BR ERRX ;ERROR COMMON CODE ERR6: MOV #MS6X,R5 ;GET BAD NODE ADDRESS CONTROL BLOCK ERRX: MOV FDB+F.ERR,R3 ;GET LOCAL FILE ACCESS ERROR(F.ERR) ERRZ: MOV 4(R5),R4 ;GET ARGUMENT BUFFER ADDRESS BEQ 5$ ;NO ARGS TO PROCESS MOV R3,R0 ;GET F.ERR VALUE JSR PC,OCT ;CONVERT IT TO OCTAL 5$: MOV R5,R0 ;GET BUFFER ADDRESS JSR PC,TYPE ;TYPE OUT MESSAGE JMP CLOSE ;CLOSE AND EXIT ; ;TYPE ERROR MESSAGE(R0=POINTER TO MESSAGE CONTROL BLOCK) ; TYPE: MOV (R0)+,TTDPB+Q.IOPL ;BUFFER ADDRESS MOV (R0),TTDPB+Q.IOPL+2 ;BYTE COUNT DIR$ #TTDPB RTS PC ; ;OCTAL CONVERSION ROUTINE ; ; R0=INPUT WORD TO BE CONVERTED ; R4=OUTPUT BUFFER POINTER ; R0,R1 ARE DISTROYED ; OCT: MOV R2,-(SP) ;SAVE R2(CHARACTER COUNTER) MOV #6,R2 ;GET CHARACTER COUNT CLR R1 ;CLEAR NEW CHARACTER REGISTER BR 10$ ;START WITH HIGH ORDER BIT 5$: CLR R1 ;CLEAR NEW CHARACTER REGISTER ROL R0 ;BIT-1 TO C-BIT ROL R1 ;C-BIT TO R1 ROL R0 ;BIT-2 TO C-BIT ROL R1 ;C-BIT TO R1 10$: ROL R0 ;BIT-3 TO C-BIT ROL R1 ;C-BIT TO R1 BIS #60,R1 ;MAKE IT ASCII MOVB R1,(R4)+ ;STORE BYTE IN OUTPUT BUFFER SOB R2,5$ ;LOOP ON WORD COUNT MOVB #40,(R4)+ ;STORE TRAILING SPACE MOV (SP)+,R2 ;RESTORE R2 RTS PC ; IOSB1: .BLKW 2 IOSB2: .BLKW 2 EFBK: .BLKW 2 ;END OF FILE BLOCK NUMBER FFBY: .BLKW 1 ;FIRST FREE BYTE IDS: .BLKW 1 MYUIC: .BLKW 1 ;MY TASK UIC(LOG-IN) MYNOD: .BLKW 1 ;MY NODE ADDRESS INODE: .BLKW 1 ;INPUT-NODE ADDRESS ONODE: .BLKW 1 ;OUTPUT-NODE ADDRESS DTASK: .RAD50 /LWT.../ ;CONNECT DESTINATION TASK NAME NODES: XQNODS ;BUILD XQ NODE NAME TABLE PBLK: .WORD 5,CMDLIN,ODSPT,IDSPT,IDS GMCR: GMCR$ ;GET MCR CMDLIN DPB CMDLIN=GMCR+2 ;COMMAND LINE BUFFER ADR STBLK: .BLKW 5 ;STATISTICS BLOCK RDPB: QIO$ IO.RLB,L2,EF2,,IOSB2,, ;READ QIO DPB WDPB: QIOW$ IO.WLB,L2,EF2,,IOSB2,, ;WRITE QIO DPB GDPB: QIOW$ IO.GLI,L2,EF2,,IOSB2,, ;LINK INFO QIO DPB TTDPB: QIOW$ IO.WLB,L3,EF3,,IOSB2,,<0,0,40> ;TYPE ERROR MESSAGE TMO: MRKT$ WTEF,12,2 ;EF=14.,DT=TEN SECONDS ; ;ERROR MESSAGE CONTROL BLOCKS ; MS1X: .WORD MS1,MS1L,0 MS2X: .WORD MS2,MS2L,MS2BF MS3X: .WORD MS3,MS3L,0 MS4X: .WORD MS4,MS4L,0 MS5X: .WORD MS5,MS5L,MS5BF MS6X: .WORD MS6,MS6L,0 ; MS1: .ASCII /NFC--SYNTAX ERROR/ MS1L=.-MS1 MS2: .ASCII /NFC--LOCAL FILE ACCESS ERROR(F.ERR) / MS2BF: .BLKB 6 MS2L=.-MS2 MS3: .ASCII /NFC--TIME-OUT/ MS3L=.-MS3 MS4: .ASCII /NFC--REMOTE TYPE-FUNCTION CODE ERROR/ MS4L=.-MS4 MS5: .ASCII /NFC--REMOTE FILE ACCESS ERROR(F.ERR) / MS5BF: .BLKB 6 MS5L=.-MS5 MS6: .ASCII /NFC--BAD NODE ADDRESS/ MS6L=.-MS6 .EVEN ; ;START OF FDB SECTION ; FSRSZ$ 0 ;INITIALIZE FSR FOR BLOCK I/O ONLY FDB: FDBDF$ ;ALLOCATE FDB FOR INPUT/OUTPUT FDRC$A FD.RWM ;INIT RECORD ACCESS FDBK$A BUF,512.,,EF1,IOSB1 ;INIT BLOCK ACCESS FDOP$A L1,IDSPT ;INIT FILE OPEN IDSPT: .BLKW 2 ;INPUT DEVICE NAME DATA SET DESC. .BLKW 2 ;DIRECTORY STRING DATA SET DESC. .BLKW 2 ;INPUT FILE NAME DATA SET DESC. .BLKW 2 ;INPUT NODE NAME DATA SET DESC. ODSPT: .BLKW 2 ;OUTPUT DEVICE NAME DATA SET DESC. .BLKW 2 ;DIRECTORY STRING DATA SET DESC. .BLKW 2 ;OUTPUT FILE NAME DATA SET DESC. .BLKW 2 ;OUTPUT NODE NAME DATA SET DESC. HDR: .BLKB LBFX ;HEADER + DATA BUFFER BUF=HDR+LHDR ;DATA BUFFER STARTING ADDRESS TNODE=HDR+XQDST+4 ;TO-NODE ADDRESS FNODE=HDR+XQSRC+4 ;FROM-NODE ADDRESS TSKUIC=HDR+XQSTSK+G.TSPC ;GET TASK PARM. DEFAULT UIC END:: .END START