.TITLE CSIOPS .IDENT /GCE001/ ;G. EVERHART 8 / 17/ 1981 ;CSI SKELETON ROUTINE TO GET A COMMAND LINE, PARSE IT INCLUDING ;SWITCHES, OPEN FILES, AND SET SWITCH MASKS AND VALUES. ; ;N.B. - IT IS EXPECTED THIS ROUTINE WILL BE MODIFIED TO ;CUSTOMIZE IT FOR PARTICULAR PROGRAMS. ; ; CALL: JSR PC, CMDCSI ; RETURNS CS IF ERROR (OR EXITS) ; RETURNS CC IF ALL OK ; T.LUNS AND T.FDBS TABLES CONTAIN LUN AND FDB ASSIGNMENTS ; AND FILES ARE OPENED. MAXIN FILES ARE OPENED FOR INPUT IF ;PRESENT AND MAXOUT FILES OPENED FOR WRITE. THE PRESENT VERSION ;OPENS ALL FOR GET$ / PUT$ TYPE I/O. ; MODIFY THE CSI$ LOOP FOR REVISED TYPES OF OPENS. ;SEVERAL EXTRA FDBS WILL BE ALLOCATED PAST THE SUM (MAXIN+MAXOUT) ;FOR USE AS SCRATCH FDBS. THESE MAY BE OPENED BY THE CALLER. ZERO ;IN THE LUN CELL IMPLIES NO FDB THERE. LUN NUMBERS (1,2,3,4,5,...) ;AND FDB ADDRESSES ARE IN T.LUNS AND T.FDBS RESPECTIVELY. ; .MCALL CSI$,FSRSZ$,GCMLB$,GCMLD$;RSX11D MACROS .MCALL CSI$1,CSI$2,RCML$,GCML$,OPEN$R,OPEN$W .MCALL CLOSE$,GET$,PUT$ .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A;FDB MACROS CSI$ CSBLK: .BLKB C.SIZE .EVEN ; *** SET THE MAX NUMBER IN AND OUT FILES ALLOWED BELOW: MAXIN=2 ;MAX # INPUT FILES MAXOUT=3 ;MAX # OUTPUT FILES ;TFIL MAY BE MAXIN+MAXOUT OR MORE...ADJUST TFIL=MAXIN+MAXOUT+3 ; ALLOW EXTRA MAXFILES FOR CMD LINE AND TEMPS ;***** FSRSZ$ TFIL ;5 FILES AT A TIME MAX ;CMD ON LUN 5 (= DEFAULT TI:) ; CHANGE PROMPT FROM "MOD" TO WHATEVER DESIRED... CMD: GCMLB$ 1,MOD,,5 GCMLD$ ;DEFINE OFFSETS TO ERROR BYTES .PSECT DATA,RW .MCALL FDOF$L,FCSBT$,FDBDF$,FDRC$A,FDAT$A,NMBLK$ .MCALL CSI$1,CSI$2,OPEN$R,OPEN$W .MCALL CSI$SW,CSI$ND,CSI$SV FDOF$L ;LOCAL OFFSET DEFS FCSBT$ ;DEFINE BIT NAMES MAXWID=512. BUFA: BUF: .BLKB 4 ;TEMP., FOR INITIALIZATION PURPOSES. ;BUFFER HERE IS A DUMMY...USE ONE IN GET$ AND PUT$ ;MAY BE USED FOR READ$/WRITE$ IOSB IF DESIRED ;(CALLER SHOULD SPECIFY A BUFFER ON GET$ OR PUT$) .EVEN .MCALL NBOF$L NBOF$L ;LOCALLY DEFINED NAMEBLK OFSETS ;DEFAULT FILENAME BLOCK LIST. SET UP AS NEEDED FOR DESIRED FILE NAME ;EXTENSION, ETC. BLOCK DEFAULTS. ; *** SET YOUR OWN DEFAULT NAME BLOCKS *** ; NOTE THE LIST MUST HAVE 1 FILENAME BLK PER LUN, THOUGH THEY MAY ;POINT AT THE SAME ONES... DFIN: DIFN: .REPT MAXOUT .WORD DTOFNB .ENDR .REPT MAXIN .WORD DTIFNB .ENDR .BLKW 10 ;DEFAULT FILENAME BLOCKS. ;MODIFY TO SUIT YOURSELF DTIFNB: NMBLK$ DATA,TMP,,SY,0 DTOFNB: NMBLK$ DATA,LST,,SY,0 ;DEFAULT FILENAME BLOCKS ;FDBLST IS MASTER LIST OF FDB ENTRIES. FIRST WORD IS LUN 1, ; NEXT IS LUN 2, AND SO ON. A ZERO IN A LUN ENTRY MEANS FILE ; IS NOT OPEN (GENERALLY BEACUSE IT WAS LEFT OUT OF THE ; FILE SPECS AT CSI TIME.) ;GLOBAL NAMES T.LUNS AND T.FDBS ARE TO AVOID NAME CONFLICTS WITH ;NAMES IN OTHER ROUTINES. ; ;THIS CODE DESIGNED FOR USE WITH ROUTINES AND TABLES IN ;THE "GETSTR" ROUTINE. ; T.LUNS:: LUNLST: .BLKW TFIL+4 ;LIST OF LUNS WE HAVE T.FDBS:: FDBLST: .BLKW TFIL+4 ;OUR LIST OF FDB ADDRESSES IOFLG: .WORD 0 ;INPUT OR OUTPUT FLAG .SBTTL COMMAND STRING PROCESSING .MCALL FINIT$ .PSECT CODE,RO ; GET COMMAND LINE, ; SET UP CHANNELS ; OPEN FILES, PROCESS SWITCHES... RETURN WITH FDBTBL SET UP ; AND FILES OPEN. ERRXXJ: JMP ERRXXX CMDCSI:: ; FINIT$ CLR SWITCH ;RESET SWITCHES TO DEFAULTS ;OBTAIN CHANNELS ; NOTE WE JUST FILL IN FDBLST AND FDBTBL HERE. THESE BITS OF ; LOGIC CAN BE REPLACED EASILY IF DESIRED. MOV #TFIL,R5 ;SET UP FOR "TFIL" CHANNELS MOV #FDBLST,R1 100$: JSR PC,IGETC ;GET A CHANNEL (ALSO SET UP FDBTBL) MOV R0,(R1) ;SAVE LUN NUMBER RETURNED DEC R0 ASL R0 ;GET LUN OFFSET CMP R0,#2* ;PAST LEGAL LIMIT? (ACCOUNTING FOR RESERVED) BHI ERRXXJ ;IF SO, ERROR MOV FDBTBL(R0),R0 ;THENCE GET FDB MOV R0,(R1)+ ;SAVE FDB ADDRESS SOB R5,100$ ;DO FOR ALL CHANNELS MOV #TFIL,R5 ;SET UP A PRIORI RUNTIME INFO FOR IN, OUT FILE MOV #FDBLST,R4 ;ALSO SET UP POINTER TO FDB LIST HERE ;THIS ASSUMES WE WILL FILL IN FDB'S FROM THE START ;WE WILL CLEAR FDBTBL OF THE FDB IF WE CANNOT OPEN THE ;FDB, RELEASING IT FOR LATER USE... .MCALL FDAT$R,FDRC$R,FDOP$R,FDBF$R MOV R2,-(SP) MOV #DIFN,R2 ;DEFAULT FNM BLKS MOV R3,-(SP) MOV #LUNLST,R3 ;***** ; HERE INITIALIZE THE FDBS WE HAVE. ANY DIFFERENT INITIALIZATION MUST ; MODIFY THIS CODE... ;***** 101$: MOV (R4)+,R0 ;POINT AT AN FDB NOW FDAT$R ,#R.VAR,#FD.CR,#MAXWID,#-5,#-5 ;SET SIZES, INCS ;SET FD.RWM IN FDRC$R AND CALL FDBK$R TO USE READ$/WRITE$ MODE ;ALWAYS NEED FDRC$R. NOTE EF # = LUN # (FOR CONVENIENCE ONLY) FDRC$R R0,,#BUF,#MAXWID ;SET MAX RECORD SIZE AT 1 BLOCK ;NOTE FOR BLOCK OPS WE MUST SPECIFY FD.RWM IN ARG 2 AND CALL FDBK$R TOO. FDOP$R R0,(R3),#CSBLK+C.DSDS,(R2)+ ;INIT LUN, D/S SPECS FDBF$R R0,(R3)+ SOB R5,101$ MOV (SP)+,R3 MOV (SP)+,R2 ; ; ADD RUNTIME FDB INITIALISE ROUTINES ; GET THE COMMAND LINE OR EXIT IF CONTROL Z GCML$ #CMD ;USE RSX FACILITY BCC 47$ RCML$ #CMD .MCALL EXIT$S EXIT$S ;LEAVE WHEN SEE EOF 47$: TSTB CMD+G.ERR ;SEE IF ERROR ON READ BPL 48$ EXIT$S ;EXIT TASK ON I/O ERR IN CMD 48$: ; ISSUE CSI COMMANDS AND OPEN FILES HERE. ;(LOSE IF FILES DON'T EXIST!) MOV #CMD+G.CMLD,R0 ;LEN, ADDR OF STRING READ IN MOV @R0,R1 ;LENGTH MOV 2(R0),R2 ;ADDR CSI$1 #CSBLK,R2,R1 ;COMPRESS OUT SPACES, TABS, ETC. ;NOW PROCESS I/O SPECIFICATIONS. ;NO WILD-CARDS HERE! DTIDSP=C.DSDS+CSBLK DTODSP=DTIDSP ;NOW GET INPUT SPECS AND SWITCHES ; ;GET INPUT FIRST IN CASE USER ALSO HAS SAME FILENAME ON OUTPUT. MOV #FDBLST+<2*MAXOUT>,R4 ;GET INPUT FILES HERE... MOV #MAXIN,R5 ;MAXIN OF THEM. CLR IOFLG ;START WITH INPUT .IIF EQ,MAXIN, INC IOFLG ;DO OUTPUTS ONLY IF NO INPUTS ; *** *** ; BEGINNING OF FILE OPEN LOOP. OPEN INPUT FILES FIRST PASS (IOFLG=0) ; AND THEN OUTPUT FILES (IOFLG=1). ERROR IF NO = SIGN SEEN, UNLESS ; MAXIN=0. ; *** *** 102$: TST IOFLG BNE 70$ ;ON OUTPUT DO OUTPUT SPECS CSI$2 #CSBLK,INPUT,#SWTBL ;TEST FOR = SIGN AND IF NONE, EXIT SINCE NO INPUTS ARE PRESENT... .IF GT,MAXIN BITB #CS.EQU,CSBLK+C.STAT ;ANY INPUTS THERE? BEQ ERRXXJ ;IF NONE, GO RETURN AN ERROR. .ENDC BR 71$ 70$: CSI$2 #CSBLK,OUTPUT,#OUTCSW 71$: ;GET INPUT FILES IF PRESENT AND REQUIRE THEY BE PRESENT! ;IF NOT PRESENT ZERO FDBTBL GLOBALLY AND FDBLST LOCALLY ;TO FLAG THEM MISSING. BITB #,CSBLK+C.STAT ;ANY FILENAME THERE? ;NOTE ALLOW DEVICE TO FILL IN TOO, IN CASE NAME DEFAULT IS OK. BNE 202$ ;IF SO, BRANCH ;NO FILENAME WAS THERE. FLAG BY ZEROING THE LISTS. MOV @R4,R0 ;GET THE FDB ADDRESS CLR (R4)+ ;CLEAR LOCAL TABLE MOV R4,R1 TST -(R1) ;POINT AT FDBLST ADD #,R1 ;NOW AT LUNLST MOV R1,R0 ;COPY ADDR IN LUNLST MOV @R1,R1 ;GET LUN # CLR @R0 ;ZERO LUNLST OUT DEC R1 ASL R1 CLR FDBTBL(R1) ;CLEAR FDBTBL BR 104$ ;CHECK FOR ANOTHER FILE THEN. 202$: MOV (R4)+,R0 ;GET OUR FDB ADDRESS .SBTTL PROCESS (INPUT) SWITCHES DTODSP=DTIDSP MOV R0,R1 MOV R0,R2 ;SET UP DEFAULT INPUT DATASET BLOCK MOV R4,-(SP) SUB #<2+FDBLST>,R4 MOV DFIN(R4),R3 ;GET DEFAULT NAME BLOCK MOV (SP)+,R4 ADD #F.DSPT,R2 MOV @R2,R2 ;GET DS ADDR ADD #F.FNB,R1 JSR PC,.PARSE ;FILL IN DEFAULTS MOV R4,-(SP) SUB #FDBLST+2,R4 ;MAKE R4 AN OFFSET. THEN... MOV T.LUNS(R4),R4 ;GET ACTUAL LUN NUMBER TST IOFLG ;INPUT THIS PASS? BNE 73$ OPEN$R R0,R4,#DTIDSP,,#BUF,#MAXWID,ERR1;OPEN INPUT LU3 BR 74$ 73$: OPEN$W R0,R4,#DTODSP,,#BUFA,#MAXWID,ERR2 ;OUT LU4 74$: MOV (SP)+,R4 ;RESTORE R4 104$: BITB #CS.MOR,C.STAT+CSBLK ;MORE FILES SEEN? BEQ 105$ ;NO, SEE IF WE MUST FLUSH THE REST. DEC R5 ;COUNT DOWN INPUTS ALLOWED BGT 102$ ;IF MORE OK, GET NEXT ONE 105$: DEC R5 ;COUNT DOWN UNITS TO DO BLE 106$ ;IF DONE ALL, NO CLEANUP NEEDED. ;CLEAN UP UNITS NOT SPECIFIED FOR INPUT HERE. MOV @R4,R0 ;GET THE FDB ADDRESS CLR (R4)+ ;CLEAR LOCAL TABLE MOV R4,R1 TST -(R1) ;POINT AT FDBLST ADD #,R1 ;NOW AT LUNLST MOV R1,R0 ;SAVE LUNLST CELL MOV @R1,R1 ;GET LUN # CLR @R0 ;CLEAR LUNLST CELL DEC R1 ASL R1 CLR FDBTBL(R1) ;CLEAR FDBTBL BR 105$ ;KEEP CLEARING ALL WE HAVE TO DO 106$: INC IOFLG ;SAY DOING OUTPUT NOW MOV #FDBLST,R4 ;POINT AT OUTPUTS MOV #MAXOUT,R5 ;AND COUNT THESE CMP IOFLG,#1 ;DONE OUTPUT YET? BHI 107$ JMP 102$ ;IF NOT, GO DO IT NOW 107$: ; ***** END OF FILE OPENS. CLC ;SAY NO ERRORS RTS PC ;BACK TO CALLER ; ERTXT: .ASCII /MOD - ERR INPUT FILE LUN=/ ETIN: .BYTE 60 ;LUN ERSIZ=.-ERTXT .EVEN ERTXTO: .ASCII /MOD - ERR OUTPUT FILE LUN=/ ETON: .BYTE 60 ;LUN ETOSIZ=.-ERTXTO .EVEN FCMS: .ASCII /MOD / FCML=.-FCMS .EVEN ERNM: .WORD 0 ;LUN OF ERROR .MCALL QIOW$S ERR1: MOV R4,ERNM ;SAVE ERROR NUMBER OF LUN (INPUTS) ADD #60,R4 ;MAKE NUMBER MOVB R4,ETIN QIOW$S #IO.WVB,#5,#5,,,,<#ERTXT,#ERSIZ,#40> TST (SP)+ ;JUNK CALL VIA JSR PC. MOV (SP)+,R4 ;RESTORE CALL R4 MOV #FCMS,R1 ;FNAME MOV #FCML,R2 ;SIZE JSR PC,.PRFCS ;DIAGNOSE FCS ERROR BR DONE ERR2: MOV R4,ERNM ;SAVE ERR LUN NUMBER. (OUTPUTS) ADD #60,R4 MOVB R4,ETON ;SAVE ERR LUN IN MSG QIOW$S #IO.WVB,#5,#5,,,,<#ERTXTO,#ETOSIZ,#40> TST (SP)+ ;JUNK CALL VIA JSR PC. MOV (SP)+,R4 ;RESTORE CALL R4 MOV #FCMS,R1 ;FNAME MOV #FCML,R2 ;SIZE JSR PC,.PRFCS ;DIAGNOSE FCS ERROR .SBTTL COMPLETION PROCESSING .SBTTL CLOSE FILES ERRXXX: DONE: MOV #TFIL,R5 MOV #FDBLST,R4 100$: MOV (R4)+,R0 ;GET AN FDB TO CLOSE BEQ 101$ CLOSE$ R0,SCRAM BCS SCRAM ;CAN'T CLOSE--EXIT. .SBTTL CLOSE OUTPUT FILE MOV R4,R1 TST -(R1) ;POINT AT FDBLST ADD #,R1 ;NOW AT LUNLST MOV R1,R0 MOV @R1,R1 ;GET LUN # CLR @R0 ;CLEAR LUN OUT DEC R1 ASL R1 CLR FDBTBL(R1) ;CLEAR FDBTBL 101$: DEC R5 BGT 100$ ;TRY TO CLOSE ALL FILES SEC ;SAY WE HAD AN ERROR RTS PC ;AND RETURN SCRAM: EXIT$S ;LEAVE. DOESN'T RE-INITIALIZE CORRECTLY. .SBTTL SWITCHES .EVEN ;***************** ;NOTE THE EXAMPLES HERE ARE PURELY FOR INSTRUCTION. REPLACE WITH ;YOUR OWN DESIRED SWITCH VALUES. ;***************** .GLOBL SWITCH SWITCH: .WORD 0 ;SWITCH FLAGS SW.CT=400 ;CHANGE TAB TO SPACE SW.ED=200 ;USE CHAR. INSTEAD OF FF (/ED:N) SW.WI= 40 ;WIDTH OPTION SW.LE= 20 ;LENGTH OPTION SW.CO= 10 ;# COLUMNS SW.FF =4 ;RETAIN FF OPTION SW.NH =2 ;NO HEADER OPTION SW.TR =1 ;TRUNCATE OPTION .PSECT CODE,RO SWTBL: CSI$SW CT,SW.CT,SWITCH ;COMPRESS TABS /CT CSI$SW ED,SW.ED,SWITCH,,,EDTBL ; /ED:NNN (NNN=CHAR OCT) CSI$SW WI,SW.WI,SWITCH,,,WITBL ;/WI:NNN CSI$SW LE,SW.LE,SWITCH,,,LETBL ;/LE:NNN CSI$SW CO,SW.CO,SWITCH,,,COTBL ;/CO:N CSI$SW FF,SW.FF,SWITCH ;/FF CSI$SW NH,SW.NH,SWITCH ;/NH NO HDR CSI$SW TR,SW.TR,SWITCH ;/TRUNCATE COL CSI$ND ;END TABLE ;SWITCH VALUES CSI$SV OCTAL,EDVAL,2,EDTBL CSI$SV DECIMAL,LINSIZ,2,WITBL CSI$SV DECIMAL,PAGSIZ,2,LETBL CSI$SV DECIMAL,CMAX,2,COTBL CSI$ND OUTCSW: OUTSWS: CSI$SW AP,1,OSMSK ;/AP OPEN OUTPUT FOR APPEND CSI$SW SP,2,OSMSK,,,SPCPY ;/SP:N SPOOL N COPIES CSI$ND CSI$SV DECIMAL,SPCNT,2,SPCPY CSI$ND .PSECT DATA,RW SPCNT: .WORD 0 ;NUMBER OF SPOOLED COPIES... OSMSK: .WORD 0 ;OUTPUT SWITCH MASK WORD .PAGE .END