.TITLE CSI ; ;+ ; ; CSI -- SUBROUTINE TO PROVIDE FORTRAN ACCESS TO THE SYSTEM ; COMMAND STRING INTERPRETER ROUTINES ; ; CALL CSI1 (BUFFER, LENGTH, NEWLEN, IEINDX) ; ; INITIALIZE CSI CONTROL BLOCK AND PRE-SCAN COMMAND STRING ; ; BUFFER - COMMAND-LINE TO BE PROCESSED (USUALLY RETURNED ; FROM GETCMD) ; LENGTH - LENGTH OF COMMAND-LINE (ALSO FROM GETCMD) ; NEWLEN - IF NO ERRORS, LENGTH OF COMPRESSED COMMAND-LINE; ; IF AN ERROR HAS BEEN DETECTED, LENGTH OF SEGMENT ; CONTAINING THE ERROR ; IEINDX - INDEX IN BUFFER OF SEGMENT IN ERROR, OR ZERO IF ; NO ERRORS DETECTED ; ;- ; .MCALL CSI$,CSI$1,CSI$2 ; CSI$ ;DEFINE AND ALLOCATE CSI CONTROL BLOCK .EVEN CSIBLK: .BLKB C.SIZE .EVEN ; CSI1:: CLR @6(R5) ;NEWLEN = 0 CLR @10(R5) ;IEINDX = 0 CSI$1 #CSIBLK,2(R5),@4(R5) ;INITIALIZE AND PRESCAN COMMAND-LINE BCS ERR1 ;ERROR RETURN MOV CSIBLK+C.CMLD,@6(R5) ;RETURN NEWLEN BR EXIT ;NORMAL RETURN ; ERR1: MOV CSIBLK+C.FILD+2,@10(R5) ;CALCULATE INDEX OF SEGMENT IN ERROR SUB 2(R5),@10(R5) INC @10(R5) MOV CSIBLK+C.FILD,@6(R5) ;RETURN LENGTH OF SEGMENT BR EXIT ; ; CALL CSI2I (LSTAT, DEVID, LDEVID, DIRD, LDIRD, FILE, LFILE, IERR) ; ; PARSE NEXT INPUT FILE SPECIFIER (NO SWITCHES ALLOWED) ; ; CALL CSI2IS (LSTAT, DEVID, LDEVID, DIRD, LDIRD, FILE, LFILE, ; * SWTAB, MASK1, MASK2, IERR) ; ; PARSE NEXT INPUT FILE SPECIFIER (WITH OPTIONAL SWITCHES) ; ; CALL CSI2O (LSTAT, DEVID, LDEVID, DIRD, LDIRD, FILE, LFILE, IERR) ; ; PARSE NEXT OUTPUT FILE SPECIFIER (NO SWITCHES ALLOWED) ; ; CALL CSI2OS (LSTAT, DEVID, LDEVID, DIRD, LDIRD, FILE, LFILE, ; * SWTAB, MASK1, MASK2, IERR) ; ; PARSE NEXT OUTPUT FILE SPECIFIER (WITH OPTIONAL SWITCHES) ; ; LSTAT = RETURNED STATUS BYTE ; DEVID = 5 BYTE BUFFER TO RECEIVE DEVICE-NAME STRING ; LDEVID = LENGTH OF DEVID ; DIRD = 9 BYTE BUFFER TO RECEIVE DIRECTORY STRING ; LDIRD = LENGTH OF DIRD ; FILE = 19 BYTE BUFFER TO RECEIVE FILENAME SPECIFIER ; LFILE = LENGTH OF FILE ; SWTAB = SWITCH DESCRIPTOR TABLE ; MASK1 = RESULTANT SWITCH MASK WORD ; MASK2 = RESULTANT POLARITY MASK WORD ; IERR = ERROR RETURN FLAG ; CSI2I:: CSI$2 #CSIBLK,INPUT ;PARSE NEXT INPUT FILE-SPEC (NO SW) BCS ERR2 ;ERROR RETURN BR NORM2 ;NORMAL RETURN ; CSI2O:: CSI$2 #CSIBLK,OUTPUT ;PARSE NEXT OUTPUT FILE-SPEC (NO SW) BCS ERR2 ;ERROR RETURN NORM2: CLR @20(R5) ;IERR = 0 BR RET2 ;NORMAL RETURN ERR2: MOV #1,@20(R5) ;IERR = 1 BR RET2 ;ERROR RETURN ; CSI2IS:: CSI$2 #CSIBLK,INPUT,20(R5) ;PARSE NEXT INPUT FILE-SPEC (W/SW) BCS ERR3 ;ERROR RETURN BR NORM3 ;NORMAL RETURN ; CSI2OS:: CSI$2 #CSIBLK,OUTPUT,20(R5) ;PARSE NEXT OUTPUT FILE-SPEC (W/SW) BCS ERR3 ;ERROR RETURN NORM3: CLR @26(R5) ;IERR = 0 BR RET1 ;NORMAL RETURN ERR3: MOV #1,@26(R5) ;IERR = 1 ; RET1: MOV CSIBLK+C.MKW1,@22(R5) ;RETURN MASK WORD 1 MOV CSIBLK+C.MKW2,@24(R5) ;RETURN MASK WORD 2 RET2: MOVB CSIBLK+C.STAT,@2(R5) ;RETURN CSI STATUS BYTE MOV CSIBLK+C.DEVD,R0 ;GET DEVICE I.D. LENGTH MOV CSIBLK+C.DEVD+2,R1 ;AND ITS ADDRESS IN CSIBLK MOV R0,@6(R5) ;RETURN ITS LENGTH TO USER BEQ NEXT1 ;SKIP LOOP IF ZERO MOV 4(R5),R2 ;GET RETURN STRING ADDRESS LOOP1: MOVB (R1)+,(R2)+ ;COPY DEVICE I.D. SOB R0,LOOP1 ;UNTIL DONE NEXT1: MOV CSIBLK+C.DIRD,R0 ;GET DIRECTORY LENGTH MOV CSIBLK+C.DIRD+2,R1 ;AND ITS ADDRESS IN CSIBLK MOV R0,@12(R5) ;RETURN ITS LENGTH TO USER BEQ NEXT2 ;SKIP LOOP IF ZERO MOV 10(R5),R2 ;GET RETURN STRING ADDRESS LOOP2: MOVB (R1)+,(R2)+ ;COPY DIRECTORY SOB R0,LOOP2 ;UNTIL DONE NEXT2: MOV CSIBLK+C.FILD,R0 ;GET FILENAME LENGTH MOV CSIBLK+C.FILD+2,R1 ;AND ITS ADDRESS IN CSIBLK MOV R0,@16(R5) ;RETURN ITS LENGTH TO USER BEQ EXIT ;SKIP LOOP IF ZERO MOV 14(R5),R2 ;GET RETURN STRING ADDRESS LOOP3: MOVB (R1)+,(R2)+ ;COPY FILENAME SOB R0,LOOP3 ;UNTIL DONE ; EXIT: RETURN ;RETURN TO CALLER ; .END