.TITLE CSINTF - CSI INTERFACE ROUTINES .IDENT /V3.2/ ;+ ; CSINTF - CSI INTERFACE ROUTINES ; ; AUTHOR: C. T. MICKELSON ; ; DATE: 16 FEB 83 ; ; PURPOSE: PROVIDE A FORTRAN CALLABLE INTERFACE TO PROGRAM COMMANDS VIA ; GCML AND CSI SOFTWARE ; ; FACILITIES: 1. GET A COMMAND LINE AND CHECK SYNTAX ; 2. GET A FILE SPECIFICATION, WITH OPTIONAL SWITCHES ; 3. RESET SCAN OF CURRENT COMMAND LINE ; ; CALLING SEQUENCES: ; ; 1. GET A COMMAND LINE AND CHECK SYNTAX ; ; CALL GETCMD ; ; RETURNS AFTER SUCCESSFULLY GETTING A SYNTACTICALLY VALID ; COMMAND LINE. COMMAND SYNTAX ERRORS ARE HANDLED BY GETCMD. ; ROUTINE PERFORMS A TASK EXIT ON RECEIPT OF CTRL Z AT ; COMMAND LEVEL ZERO. IT IS POSSIBLE TO CALL GETCMD AND ; NOT RETURN. THEREFORE, ALL TASK LUNS SHOULD BE CLOSED ; BEFORE CALLING GETCMD. ; ; NOTE THAT THE LUN (CMDLUN) USED BY GCML TO FETCH COMMAND ; LINES MAY BE USED BY THE CALLING PROGRAM, PROVIDED THE LUN ; IS OPENED, READ OR WRITTEN, AND CLOSED BEFORE GETCMD ; IS CALLED AGAIN. SUCH USE OF CMDLUN MUST INCLUDE AN EXPLICIT ; SPECIFICATION OF THE ENTIRE FILE DESCRIPTOR (DEVICE, UIC, ; FILENAME, AND EXTENSION) IF PREDICTABLE RESULTS ARE TO BE ; ACHIEVED. THIS IS REQUIRED BECAUSE GCML RE-ASSIGNS CMDLUN ; TO DIFFERENT DEVICES DEPENDING UPON THE LOCATION OF THE ; COMMAND FILE THE PROGRAM IS PROCESSING. ; ; 2. GET AN INPUT OR OUTPUT FILE SPECIFICATION ; ; INTEGER GETFIL,ISWIT(2),IDIR,RESULT ; BYTE FILE(40) ; ; RESULT=GETFIL(IFILE,ISWIT,IDIR) ; ; INPUTS: IDIR = 0 => GET INPUT FILE SPEC ; IDIR # 0 => GET OUTPUT FILE SPEC ; ; OUTPUTS: IFILE = NEXT FILE SPEC STRING OF DESIGNATED TYPE. ; = NL: FOR EMPTY OUTPUT FILE SPEC ; = NULL STRING FOR EMPTY INPUT FILE SPEC ; FILE SPEC STRING ENDS WITH A NULL BYTE. ; FILE SPEC STRING CAN BE USED IN A FORTRAN ; OPEN(FILE=IFILE) ; ; ISWIT(1) = BIT SET FOR CORRESPONDING SWITCH FOUND ; IN FILE SPECIFICATION. ; ; ISWIT(2) = BIT SET FOR ASSERTED BI-POLAR SWITCH. ; CLEAR FOR NEGATED SWITCH. IF SWITCH HAS ; ASSOCIATED NUMERIC OR ASCII VALUES, THEY ; WILL BE PLACED IN COMMON/SWTVAL/ ACCORDING ; TO THE STRUCTURE DEFINED BELOW. (SEE SWTVAL ; MACRO DEFINITION.) ; ; RESULT = -3 FOR SWITCH PROCESSING ERROR ; = -4 FOR WILDCARD'ED FILE SPEC ; = -7 FOR BOTH OF THE ABOVE ; = 12 (LINE FEED) END OF REQUESTED FILE SPECS ; = 0 IF NO ERRORS ; ; 3. RESET SCAN OF CURRENT COMMAND LINE ; ; CALL RSTCMD ; ; THIS SUBROUTINE WILL RESET THE SCAN OF THE CURRENT COMMAND ; LINE SO THAT SUBSEQUENT CALLS TO GETFIL WILL RE-PARSE THE ; COMMAND LINE AS IF IT HAD JUST BEEN TYPED BY THE USER. ; ; 4. THIS MODULE MAY BE USED TO PROCESS SWITCH TABLES CONTAINING ; MORE THAN 16 SWITCHES, PROVIDING THE FOLLOWING CONDITIONS ; ARE MET: ; ; A) THE LINE MULTAB=0 MUST EXIST IN THE USER'S SWITCH ; TABLE DATA BASE FILE. ; ; B) THE VECTOR ISWIT IS SIZED WITH TWO WORDS FOR EACH ; GROUP OF 16 SWITCHES OR LESS IN THE SWITCH TABLE. ; ISWIT(ODD OR EVEN) IS EQUIVALENT TO ISWIT(1 OR 2) FOR ; EACH 16 SWITCH GROUP. ; ; C) THE TASK IN WHICH THIS ASSEMBLED MODULE IS USED IS ; BUILT WITH A VERSION OF MODULE .CSI2 CONTAINING ; THE GAC MULTAB PATCH, AS APPLIED IN ; CADCSI2.MAC. ; ;- .NLIST ; ; MACRO CALLS ; .MCALL GCMLB$,GCML$ .MCALL CSI$,CSI$SW,CSI$SV,CSI$ND,CSI$1,CSI$2 .MCALL QIOW$,QIOW$S,DIR$,GLUN$C,ALUN$S .MCALL OLDPST,GCMLDF,SWTSRT,SWTEND,SWTNEG .MCALL SWTVAL,GENVAL,TMSGDF,CERRDF,FTYPDF ; ; PSECT DEFINITIONS ; .PSECT $CODE1,REL,RO,I,CON,LCL .PSECT $PDATA,REL,RO,D,CON,LCL .PSECT $IDATA,REL,RW,D,CON,LCL .PSECT $VARS,REL,RW,D,CON,LCL .PSECT $SWTDF,REL,RO,D,CON,LCL .PSECT SWTVAL,REL,RW,D,OVR,GBL .PSECT $SWTVL,REL,RO,D,CON,LCL .PSECT $SWTBL,REL,RO,D,OVR,GBL .PSECT $SWTMK,REL,RW,D,CON,LCL ; CSI$ ; ; PASS NUMBER SYMBOL ; .IF NDF PASS PASS=0 .ENDC PASS=PASS+1 ; ; SYSTEM MACRO EQUATES ; GERR=GCMD+G.ERR GMODE=GCMD+G.MODE GCMLD=GCMD+G.CMLD GCBUF=GCMD+G.DPRM-2 GSIZE=GCMD+G.SIZE CCMLD=CSIBF+C.CMLD CSTAT=CSIBF+C.STAT CDIRD=CSIBF+C.DIRD CFILD=CSIBF+C.FILD CDEVD=CSIBF+C.DEVD CSWAD=CSIBF+C.SWAD CMKW1=CSIBF+C.MKW1 CMKW2=CSIBF+C.MKW2 ; ; LOCAL EQUATES ; CMDSZ=80. ;LENGTH OF GCML COMMAND BUFFER NEWLIN=12 ;LINE FEED CHARACTER CODE SWTERR=-3 ;SWITCH ERROR CODE OK=0 ;NORMAL GETFIL RETURN IDIR=6 ;INPUT/OUTPUT DIRECTION PARAM OFFSET ISWT=4 ;SWITCH PARAM OFFSET IFIL=2 ;FILE PARAM OFFSET WLDERR=-4 ;WILDCARD STATUS CODE DFLNG=9. ;DEFAULT UIC STRING LENGTH .IF EQ PASS-1 SWTNUM=0 ;INITIALIZE NUMBER OF SWITCH DESCRIPTOR TABLES MASKAD=0 ;SET INITIAL MASK WORD ADDRESS (NONE) .ENDC ;IN PASS 1 ONLY ; ; VARIABLE AND CONSTANT DEFINITIONS ; .PSECT $SWTBL SWTBLS: ;SET STARTING ADDRESS OF SWITCH TABLE ADDRESS LIST .PSECT $PDATA EXTPAR: .WORD 0 ;CALL EXIT PARAMETER LIST NLADR: .ASCII /NL/ NLENG=.-NLADR .EVEN SYDEV: .WORD SYLNG .WORD SYADR SYADR: .ASCII /SY:/ SYLNG=.-SYADR .EVEN ; ; BEGINNING OF CODE ; .PSECT $CODE1 .ENABL LSB GETCMD:: TST DFDON ;TEST IF UIC SETUP DONE BNE 5$ ;YES, CONTINUE INC DFDON ;SET FLAG JSR PC,.RDFUI ;GET DEFAULT UIC MOV R1,R3 ;MOV IT TO R3 MOV #DFADR,R2 ;SET STRING ADDRESS IN R2 CLR R4 ;CLEAR CONTROL FLAGS JSR PC,.PPASC ;CONVERT UIC TO ASCII SUB #DFADR,R2 ;COMPUTE LENGTH OF STRING MOV R2,DFUIC ;SAVE IN UIC DESCRIPTOR .IF EQ PASS-1 ;IF PASS 1 .=.+12. ;LEAVE ROOM FOR NEXT TWO INSTRUCTIONS .IFF ;ELSE DURING PASS 2 .IF DF LOCASE ;IF USER WANTS LOWER CASE IN COMMAND LINE BISB #GE.LC,GMODE ;SET LOWER CASE MODE BIT .IFF ;ELSE BICB #GE.LC,GMODE ;FORCE UPPER CASE ONLY .ENDC ;DF LOCASE .IF DF COMENT ;IF USER WANTS COMMENTS PASSED TO CALLER BICB #GE.COM,GMODE ;CLEAR COMMENT SUPPRESS BIT .IFF ;ELSE BISB #GE.COM,GMODE ;SET COMMENT SUPPRESS BIT .ENDC ;DF COMENT .ENDC ;EQ PASS-1 5$: ALUN$S #CMDLUN,LUNDAT,LUNDAT+2 ;ASSIGN COMMAND DEVICE TO LUN 6$: MOV #CMDBF,R0 ;GET COMMAND ADDRESS MOV #CMDSZ,R1 ;AND LENGTH 10$: CLRB (R0)+ ;CLEAR BUFFER SOB R1,10$ ;LOOP GCML$ #GCMD ;GET A COMMAND BCC 40$ ;IF CC, SKIP ERROR TESTS MOVB GERR,R0 ;GET ERROR FLAG FROM GCML CMPB #GE.EOF,R0 ;TEST FOR CTRL Z BNE 20$ ;IF NOT SET, CONTINUE MOV #EXTPAR,R5 ;CTRL Z, EXIT TASK JSR PC,EXIT 20$: CLR R1 ;CLEAR MESSAGE POINTER CMPB #GE.BIF,R0 ;TEST FOR ERROR BEQ 30$ ;IF SET, FOUND ERROR INC R1 ;BUMP MESSAGE POINTER CMPB #GE.MDE,R0 BEQ 30$ INC R1 CMPB #GE.RBG,R0 BEQ 30$ INC R1 CMPB #GE.IOR,R0 BEQ 30$ INC R1 CMPB #GE.OPR,R0 BNE 40$ 30$: ASL R1 ;DOUBLE POINTER MOV GEERSM(R1),R0 ;GET MESSAGE ADDRESS MOV GEERSL(R1),R1 ;GET MESSAGE LENGTH QIOW$S #IO.WVB,#TILUN,#QIOEFG,,,, BR 6$ 40$: TST GCMLD ;TEST FOR NO INPUT BEQ 6$ ;IF NONE, GET NEW LINE CSI$1 #CSIBF,GCMLD+2,GCMLD BCC 60$ ;IF CC, CONTINUE MOV #CS1BF,R1 ;GET OUTPUT MESSAGE ADDRESS MOV GCMLD+2,R2 ;GET ADDRESS OF BAD LINE MOV CFILD+2,R3 ;GET LENGTH OF BAD LINE SUB R2,R3 ADD CFILD,R3 MOV #CS1MSL,R0 ;GET LENGTH OF MESSAGE START ADD R3,R0 ;COMPUTE LENGTH OF WHOLE MESSAGE MOV R0,CS1QIO+Q.IOPL+2 ;STORE IN QIO 50$: MOVB (R2)+,(R1)+ ;MOVE A CHARACTER SOB R3,50$ ;LOOP DIR$ #CS1QIO ;OUTPUT MESSAGE BR 6$ ;GET NEW COMMAND 60$: MOV CCMLD,GCMLD ;RESET COMMAND LENGTH IF CSI$1 COMPRESSED IT GLUN$C CMDLUN,LUNDAT,$CODE1 ;SAVE LUN ASSIGNMENT DATA CLRB LUNDAT+3 CLR OUTCTR ;CLEAR OUTPUT FILE CTR RTS PC ;RETURN .DSABL LSB RSTCMD:: CSI$1 #CSIBF,GCMLD+2,GCMLD ;RESET CSI TO BEGINNING OF CURRENT COMMAND CLR OUTCTR ;CLEAR FILE COUNTER RTS PC .ENABL LSB GETFIL:: MOV #OK,RTNVAL ;CLEAR RETURN VALUE TST @IDIR(R5) ;GET DIRECTION PARAMETER BEQ INFILE ;IF ZERO, GET INPUT SPEC OTFILE: CSI$2 #CSIBF,OUTPUT,SWTBLS BCC 10$ ;TEST FOR SWITCH ERRORS MOV #SWTERR,RTNVAL ;SET ERROR RETURN VALUE 10$: INC OUTCTR ;COUNT OUTPUT FILES CMP OUTCTR,#TYPNUM ;TEST FOR TOO MANY BLE 20$ ;OK MOV #TYPNUM,OUTCTR ;CLAMP AT MAXIMUM 20$: MOV CDIRD,-(SP) ;SAVE DIRECTORY STRING LENGTH MOV CFILD,-(SP) ;SAVE FILE STRING LENGTH MOV CDEVD,-(SP) ;SAVE DEVICE DESCRIPTOR MOV CDEVD+2,-(SP) BITB #CS.WLD,CSTAT ;TEST FOR WILDCARD SPECIFIER BEQ 25$ ;IF EQ, CONTINUE ADD #WLDERR,RTNVAL ;INDICATE WILDCARD ERROR 25$: BITB #CS.NMF!CS.DIF!CS.DVF,CSTAT ;TEST FOR ANY FILE SPEC BNE 30$ ;CONTINUE FOR OUTPUT FILE CLR CDIRD ;CLEAR DIRECTORY SPEC CLR CFILD ;CLEAR FILE SPEC MOV #NLENG,CDEVD ;SET DEVICE TO NL: MOV #NLADR,CDEVD+2 BITB #CS.MOR,CSTAT ;ANY MORE OUTPUT FILES BNE 30$ ;IF NE, YES CMP #OK,RTNVAL ;TEST FOR PREVIOUS ERRORS BNE 30$ ;YES, SAVE THEM MOV #NEWLIN,RTNVAL ;ELSE, RETURN NEWLINE 30$: MOV OUTCTR,TYPPTR ;SET DEFAULT FILE TYPE POINTER MOV IFIL(R5),R1 ;GET FILE PARAM ADDRESS BR 50$ INFILE: CSI$2 #CSIBF,INPUT,SWTBLS BCC 40$ ;TEST FOR SWITCH ERRORS MOV #SWTERR,RTNVAL ;SET ERROR RETURN VALUE 40$: MOV CDIRD,-(SP) ;SAVE DIRECTORY STRING LENGTH MOV CFILD,-(SP) ;SAVE FILE STRING LENGTH MOV CDEVD,-(SP) ;SAVE DEVICE DESCRIPTOR MOV CDEVD+2,-(SP) BITB #CS.WLD,CSTAT ;TEST FOR WILCARD SPECIFIER BEQ 45$ ;IF EQ, CONTINUE ADD #WLDERR,RTNVAL ;INDICATE WILDCARD ERROR 45$: MOV IFIL(R5),R1 ;GET FILE PARAM ADDRESS CLR TYPPTR ;CLEAR DEFAULT FILE TYPE POINTER BITB #CS.NMF!CS.DIF!CS.DVF,CSTAT BNE 50$ ;CONTINUE FOR INPUT FILE BITB #CS.MOR,CSTAT ;TEST FOR FOR INPUT FILES BNE 90$ ;IF CS.MOR SET, MORE FILES MOV #NEWLIN,RTNVAL ;SET END OF COMMAND LINE BR 90$ ;PACK SWITCHES 50$: MOV #CDEVD,R2 ;GET ADDRESS OF DEVICE DESC TST (R2) ;IF NO DEVICE STRING BNE 52$ MOV #SYDEV,R2 ;FORCE SY: 52$: JSR PC,MOVSTG ;OUTPUT DEVICE STRING TST CDEVD ;TEST FOR DEVICE NAME SPECIFIED BEQ 55$ ;IF EQ, CONTINUE MOVB #72,(R1)+ ;OUTPUT DEVICE DELIMITER ':' 55$: MOV #CDIRD,R2 ;GET ADDRESS OF UIC DESC TST (R2) ;IF NO UIC STRING BNE 57$ MOV #DFUIC,R2 ;FORCE DEFAULT 57$: JSR PC,MOVSTG ;OUTPUT UIC STRING TST CFILD ;TEST LENGTH OF FILE STRING BEQ 90$ ;IF ZERO, FINISH FILE SPEC MOV CFILD+2,R3 ;GET FILE STRING ADDRESS MOV CFILD,R2 ;GET FILE STRING LENGTH CLR DOTFLG ;CLEAR EXTENSION FLAG 60$: CMPB #73,(R3) ;TEST NEXT CHARACTER FOR ';' BNE 70$ ;IF NE, CONTINUE JSR PC,INSTYP ;FORCE FILE TYPE BEFORE ';' 70$: MOVB (R3)+,R0 ;GET NEXT CHARACTER MOVB R0,(R1)+ ;OUTPUT TO FILE STRING CMPB #56,R0 ;COMPARE WITH '.' BNE 80$ ;IF NE, CONTINUE INC DOTFLG ;SET EXTENSION FLAG 80$: SOB R2,60$ ;LOOP JSR PC,INSTYP ;INSERT DEFAULT FILE TYPE 90$: CLRB (R1) ;PACK A NULL INTO STRING MOV ISWT(R5),R1 ;GET SWITCH PARAMETER ADDRESS .IF EQ PASS-1 ;IF PASS 1 .=.+8. ;LEAVE ROOM FOR NEXT TWO INSTRUCTIONS .IFF ;ELSE .IF DF MULTAB ;IF ALLOWING MULTIPLE SWITCH MASKS MOV #SWTBLS,R0 ;POINT AT SWITCH DESCRIPTOR TABLE JSR PC,MVMSKS ;MOVE SWITCH MASKS AND POLARITIES TO USER SPACE .IFF ;ELSE, ONLY ONE SWITCH MASK MOV CMKW1,(R1)+ ;OUTPUT SWITCH MASK MOV CMKW2,(R1) ;OUTPUT SWITCH POLARITY .ENDC ;DF MULTAB .ENDC ;EQ PASS-1 100$: MOV (SP)+,CDEVD+2 ;RESTORE DEVICE DESCRIPTOR MOV (SP)+,CDEVD MOV (SP)+,CFILD ;RESTORE FILE STRING LENGTH MOV (SP)+,CDIRD ;RESTORE DIRECTORY STRING LENGTH MOV RTNVAL,R0 ;SET UP RETURN VALUE SXT R1 ;SIGN EXTEND RTS PC ;RETURN .DSABL LSB .ENABL LSB MOVSTG: MOV 2(R2),R3 ;GET STRING ADDRESS MOV (R2),R2 ;GET STRING LENGTH 10$: MOVB (R3)+,(R1)+ ;MOVE A CHARACTER SOB R2,10$ ;LOOP RTS PC ;RETURN .DSABL LSB .ENABL LSB INSTYP: TST DOTFLG ;TEST FOR PREVIOUS TYPE BNE 20$ INC DOTFLG ;SET EXTENSION FLAG MOV R3,-(SP) ;SAVE R3 MOV R2,-(SP) ;SAVE R2 MOV #TYPLEN,R2 ;GET EXTENSION LENGTH MOV TYPPTR,R3 ;GET EXTENSION POINTER ASL R3 ;DOUBLE IT MOV TYPTAB(R3),R3 ;GET ADDRESS OF EXTENSION 10$: MOVB (R3)+,(R1)+ ;MOVE A CHARACTER SOB R2,10$ ;LOOP MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R3 ;RESTORE R3 20$: RTS PC ;RETURN .DSABL LSB .ENABL LSB MVMSKS: CLR (R1) ;CLEAR SWITCH PRESENT WORD 10$: TST (R0)+ ;TEST SWITCH NAME WORD BEQ 50$ ;IF ZERO, END OF SWITCHES, EXIT BMI 10$ ;IF NEGATIVE, MORE FOLLOWS TST (R0)+ ;SKIP OVER SWITCH MASK WORD 20$: MOV (R0),R2 ;GET SWITCH MASK WORD ADDRESS BIC #1,R2 ;CLEAR 'SET'/'CLEAR' BIT MOV (R2),(R1)+ ;MOVE SWITCH PRESENT MASK MOV 2(R2),(R1)+ ;MOVE SWITCH POLARITY WORD 30$: ADD #4,R0 ;POINT TO NEXT SWITCH TABLE ENTRY 40$: TST (R0)+ ;TEST SWITCH NAME WORD BEQ 50$ ;IF ZERO, END OF SWITCHES, EXIT BMI 40$ ;IF NEGATIVE, MORE FOLLOWS TST (R0)+ ;SKIP OVER SWITCH MASK WORD MOV (R0),-(SP) ;SAVE SWITCH MASK ADDRESS BIC #1,(SP) ;CLEAR 'SET'/'CLEAR' BIT CMP (SP)+,R2 ;COMPARE WITH LAST MASK ADDRESS BEQ 30$ ;IF EQ, CHECK NEXT SWITCH BR 20$ ;ELSE, SAVE NEXT SET OF MASK WORDS 50$: RTS PC ;DONE, EXIT .DSABL LSB .LIST