.TITLE MICCSI .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$ .PSECT DATA,D CSBLK: .BLKB C.SIZE .EVEN MAXIN=4 ;MAX # INPUT FILES ;NOTE WE ALLOW MULTIPLE INPUT FILES ACTUALLY, ALL ON 1 LINE. MAXOUT=3 ;MAX # OUTPUT FILES TFIL==MAXIN+MAXOUT+2 ; ALLOW EXTRA MAXFILES FOR CMD LINE AND TEMPS ;GLOBALIZE TFIL TO LET US TEST IN GETFDB FOR ILLEGAL LUN NUMBERS ;***** FSRSZ$ TFIL ;5 FILES AT A TIME MAX ;CMD ON LUN 5 (= DEFAULT TI:) ; CHANGE PROMPT FROM "MAC" TO WHATEVER DESIRED... .PSECT DATA,D CMD: GCMLB$ 1,MIC,,5 GCMLD$ ;DEFINE OFFSETS TO ERROR BYTES .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 20. ;TEMP., FOR INITIALIZATION PURPOSES. ;(CALLER SHOULD SPECIFY A BUFFER ON GET$ OR PUT$) .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. DFIN: DIFN: .WORD DF0,DF1,DF2,DF3,DF4,DF5,DF6 DF0: NMBLK$ MICOUT,RUN,,SY,0 DF1: NMBLK$ MICOUT,LST,,TI,0 ;DEFAULT OUTPUT TO CONSOLE DF2: NMBLK$ MICOUT,INS,,SY,0 ;OPTIONAL OUTPUT .INS FILE DF3: NMBLK$ USRSRC,SRC,,SY,0 DF4: NMBLK$ SYSTEM,SRC,,SY,0 DF5: NMBLK$ MICOUT,SRC,,SY,0 DF6: NMBLK$ SYSTEM,SRC,,SY,0 .BLKW 11 ; ; HOW TO OPEN FLAGS ; SET TO EITHER 0 FOR NORMAL SEQUENTIAL FILES OR TO FD.RWM FOR ; BLOCK MODE OPENS. ; NOTE THAT WE MAP THE RT11 LUN 0 INTO LUN 8 HERE SO MUST ; ALTER OPENS ACCORDINGLY. ; IN THIS CASE RT11 LUNS 0,1, AND 2 ARE OPEN BLOCK, NORMAL, AND BLOCK ; THUS RSX LUNS 8 AND 2 ARE OPEN BLOCK, THE REST NORMALLY HOW: .WORD FD.RWM,0,FD.RWM,0,0,FD.RWM,0,0 ; READ$/WRITE$ VS GET$/PUT$ ;NOTE WE MAPPED RT LUNS TO RSX LUNS ;3RD INPUT (IF PRESENT) IS FD.RWM (BLOCK MODE) ; ; PER LUN .WORD 0,0,0,0,0,0,0 ;SAFETY ;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. ; ;SAVE STATUS AREA FOR INPUT FILES. FORMAT: ; FILE ID (3 WORDS) ; DEVICE NAME (ASCII) (IF IN FDB) ; UNIT NUMBER (ASCII) (IF IN FDB) INFIDP:: .WORD INFIDS INFIDS:: .BLKW 5*40 ;ALLOW 32 INPUT FILES MAX. INFIDE:: .WORD 0 ;TERMINATOR 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 INSEEN: .WORD 0 OUTSEN: .WORD 0 ;COUNT ACTUALLY OPENED FILES FPTRS: .WORD FILE0,FILE1,FILE2,FILE3,FILE4,FILE5 ; ABOVE POINT TO RT11 STRUCTURES FOR FILE OPEN FLAGS IF NONZERO .EVEN .SBTTL COMMAND STRING PROCESSING .MCALL FINIT$ .PSECT CODE,I ; GET COMMAND LINE, ; SET UP CHANNELS ; OPEN FILES, PROCESS SWITCHES... RETURN WITH FDBTBL SET UP ; AND FILES OPEN. ERRXXJ: JMP ERRXXX MICCSI:: CLR INSEEN CLR OUTSEN ;ZERO COUNTS OF FILES OPEN .MCALL QIOW$S CLR G ;SET G FOR NEXT RUNTHROUGH CLR MODE2 ;ALSO MODE2 (BITS 0,1 MEANINGFUL) MOV #INFIDS,INFIDP ;SET UP FID POINTER ; FINIT$ CLR SWITCH ;RESET SWITCHES TO DEFAULTS ;OBTAIN CHANNELS MOV #TFIL,R5 ;SET UP FOR "TFIL" CHANNELS MOV #FDBLST,R1 100$: JSR PC,IGETC ;GET A CHANNEL (ALSO SET UP FDBTBL) ; CHANNEL RETURNS IN R0 AS LUN NUMBER MOV R0,(R1) ;SAVE LUN NUMBER RETURNED DEC R0 ASL R0 ;GET LUN OFFSET CMP R0,#2* ;PAST LEGAL LIMIT? (ACCOUNTING FOR RESERVED) BLOS 430$ ; BHI ERRXXJ ;IF SO, ERROR JMP ERRXXX ; THIS BLOCK SETS UP FDBLST ARRAY FOR THIS PROGRAM. 430$: MOV FDBTBL(R0),R0 ;THENCE GET FDB MOV R0,(R1)+ ;SAVE FDB ADDRESS SOB R5,100$ ;DO FOR ALL CHANNELS ; ; NOW ACTUALLY PARSE THE FILESPECS AND GET THE FILES OPEN THE WAY THEY ; NEED TO BE FOR THE REST OF THE PROGRAM. THAT WAY, A CALL HERE RETURNS ; WITH ALL FILES OPEN AND READY TO USE. ; 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 .MCALL FDBK$R,FDBF$R MOV R2,-(SP) MOV #DIFN,R2 ;DEFAULT FNM BLKS MOV R3,-(SP) MOV #LUNLST,R3 101$: MOV (R4)+,R0 ;POINT AT AN FDB NOW ; FDAT$R R0,#R.VAR,#FD.CR,#MAXWID,#-5,#-5 SET;SIZES, INCS ; INITIALLY SET UP FOR BLOCK MODE 512 BYTE FIXED RECORD LENGTH ; IF THE HOW - OPEN TABLE FLAG IS 0 RESET TO VARIABLE RECORD LENGTH ; BELOW. FDAT$R R0,#R.FIX,,#MAXWID,#-5,#-5 MOV R4,-(SP) MOV (R4),R4 FDRC$R R0,R4,#BUF,#MAXWID ;SET MAX RECORD SIZE AT 1 BLOCK MOV (SP)+,R4 TST (R4) ;THIS A BLOCK OPEN? BEQ 311$ ;IF NOT SKIP FDBK$R FDBK$R R0,#BUF,#512.,,@R3,#BUF ;USE BUF AS IOSB BR 211$ 311$: FDAT$R R0,#R.VAR,#FD.CR,#MAXWID,#-5,#-5 211$: ;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)+ ; THIS LOOP INITIALIZES ALL FDB'S THE WAY THEY HAVE TO BE DEC R5 BGT 101$ ; 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$ ; SIMPLE BEHAVIOR ... EXIT ON ERROR READING COMMAND FOR WHATEVER REASON. 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... ; NOTE THIS WINDS UP WITH FDBLST LOOKING LIKE: ; ; FDBLST: ; OUTPUT FILE #1 ; OUTPUT FILE #2 ; ... ; FDBLST+2*MAXOUT: ; INPUT FILE #1 ; INPUT FILE #2 ; INPUT FILE #3 ; ; SINCE MAXOUT IS 3 WE GET 1ST INPUT FILE IN 4TH SLOT MOV #MAXIN,R5 ;MAXIN OF THEM. CLR IOFLG ;START WITH INPUT .IIF EQ,MAXIN, INC IOFLG ;DO OUTPUT ONLY IF NO INPUT 102$: TST IOFLG BNE 70$ ;ON OUTPUT DO OUTPUT SPECS ; HANDLING INPUT FILE SPECIFIERS HERE ; PARSE AS INPUTS... CSI$2 #CSBLK,INPUT,#SWTBL BIT #SW.HX,SWITCH BEQ 452$ BIS #37,L 452$: BITB #CS.EQU,CSBLK+C.STAT ;ANY INPUTS THERE? BNE 432$ JMP ERRXXX 432$: ; BEQ ERRXXJ ;IF NONE, GO RETURN AN ERROR. BR 71$ ; AT 70$ HANDLING OUTPUT FILE SPECS SO PARSE AS OUTPUTS 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 ; THIS FLAGS THE FILE AS NOT OPENED FOR THE REST OF THE ; PROGRAM 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 ; HERE ALL IS WELL SO FAR AND WE HAVE A FILENAME IN THE ; COMMAND LINE. GET IT SET UP IN THE FDB. 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$ ; INPUT FILE SPECS HERE. ; OPEN THE FILES FOR READ OPEN$R R0,R4,#DTIDSP,,#BUF,#MAXWID,ERR1;OPEN INPUT LU3 INC INSEEN ; COUNT INPUT FILES ACTUALLY OPENED BR 74$ ; COMMON AFTER OPEN FOR READ 73$: ; OUTPUT FILES HERE ; JUST OPEN FOR WRITE OPEN$W R0,R4,#DTODSP,,#BUFA,#MAXWID,ERR2 ;OUT LU4 INC OUTSEN ;COUNT OUTPUT FILES 74$: MOV (SP)+,R4 ;RESTORE R4 104$: BITB #CS.MOR,C.STAT+CSBLK ;MORE FILES SEEN? ;IF SO (NE), THEN GO GET MORE FILES. BEQ 105$ DEC R5 ;COUNT DOWN UNITS LEFT. ;TEST IOFLG ETC LATER IF DESIRED TO ALWAYS CHECK THIS... BLE 105$ ; SEE IF WE MUST FLUSH REST OF INPUTS JMP 102$ ; IF MORE OK, GO GET THE 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 # ;TABLES HERE ARE PARTLY IN GETSTR ROUTINE 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$: ;NOW SET UP AND OPEN SYSTEM.INS ON LUN USED AT T.LUNS+10 TF.OFS=10 ; T.LUNS+6 WILL BE 1ST INPUT FILE ; T.LUNS+10 SHOULD BE SECOND ONE. ; IF INSEEN > 1 THEN SKIP THIS SINCE THE OTHER FORM SHOULD HAVE ; ALL THE STUFF OPEN ONE NEEDS. CMP INSEEN,#1 ;DID USER GIVE AT LEAST 2 INPUT FILES? BGT 640$ ;SKIP SPECIAL CASE OPEN IF 2 OR MORE INPUTS MOV T.FDBS+TF.OFS,R0 ;GET THE FDB MOV R0,R1 MOV #DF4,R3 ;GET CHIPS.DAT FILE ADD #F.FNB,R1 ;GET FDB FNB MOV #CHPSD,R2 ;FILENAME STRING ASCII JSR PC,.PARSE ;DO THE SETUP MOV #7,R4 ;SET INPUT LUN 7 OPEN$R R0,T.LUNS+TF.OFS,#CHPSD,,#BUF,#MAXWID,ERR2 ;LEAVE THE FILE OPEN ; ; NOW DONE SETUP, SO RETURN TO CALLER ; 640$: TST MODE2 ;WAS /AL:N SWITCH USED? BEQ 376$ ;IF EQ NO BIC #3,MODE ;IF NE YES, CLR MODE BITS 0,1 BIC #^C3,MODE2 BIS MODE2,MODE ;THEN SET /AL:NN VALUE INTO MODE WORD 376$: ; MUST FLAG TO OLDER PARTS OF PROGRAM WHAT WE GOT OPEN SO ; COPY FLAGS IN. MOV #FDBLST,R0 MOV #FPTRS,R1 ;COPY FDBLST STUFF INTO FILE0, FILE1, ... MOV #6,R2 ;6 POINTERS (0-5) 475$: MOV (R0)+,@(R1)+ ; COPY ALL THIS STUFF FOR POINTERS 0-5 SOB R2,475$ ;SO RT11 FILE0 THRU FILE5 ALL HAVE INDICATORS ;OF FILES THERE. CLC ;SAY NO ERRORS RTS PC ;BACK TO CALLER .PSECT DATA,D CHPS: .ASCII /SYSTEM.SRC/ CHPSS=.-CHPS .EVEN BP.CHP:: CHPSD: .WORD 0,0 ;NO DEVICE SPEC .WORD 0,0 ;NO UIC SPEC .WORD CHPSS,CHPS ;DATASET DESCRIPTOR ; ERTXT: .ASCII /MICASM - ERR INPUT FILE LUN=/ ETIN: .BYTE 60 ;LUN ERSIZ=.-ERTXT .EVEN ERTXTO: .ASCII /MICASM - ERR OUTPUT FILE LUN=/ ETON: .BYTE 60 ;LUN ETOSIZ=.-ERTXTO .EVEN FCMS: .ASCII /MICASM / FCML=.-FCMS .EVEN ERNM: .WORD 0 ;LUN OF ERROR .MCALL QIOW$S .PSECT CODE,I 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> CMP (SP)+,(SP)+ ;JUNK CALL VIA JSR PC. AND 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> CMP (SP)+,(SP)+ ;JUNK CALL VIA JSR PC. AND 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. .PSECT DATA,D .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.LI=1 ;/LI:NNN LIST CONTROL SW.DO=2 ;/DO (EQUIVALENT TO RT11 /$ SWITCH) SW.GL=4 ;/GL= RT11 /G SW.AL=10 ;/AL = RT11 /A SW.NU=20 ;/NU = RT11 /N SW.WI=40 ;/WI = RT11 /W:N SWITCH SW.HX=100 ;/HX HEX LISTING SWTBL: CSI$SW LI,SW.LI,SWITCH,,,LETBL ;/LI:NNN CSI$SW DO,SW.DO,SWITCH CSI$SW GL,1,G ;/GL SETS G CSI$SW AL,SW.AL,SWITCH,,,ALTBL ;/AL:NN SETS MODE NN CSI$SW NU,SW.NU,SWITCH,,,NUTBL CSI$SW WI,SW.WI,SWITCH,,,WITBL CSI$SW HX,SW.HX,SWITCH CSI$ND ;END TABLE ;SWITCH VALUES .GLOBL L ;/LI:VALUE GOES TO VARIABLE L. .GLOBL W ;W VARIABLE GETS WIDTH .GLOBL A,N CSI$SV DECIMAL,L,2,LETBL CSI$SV DECIMAL,N,2,NUTBL CSI$SV DECIMAL,W,2,WITBL ;WIDTH CSI$SV DECIMAL,A,2,ALTBL ;MODE2 GETS MODE BITS CSI$ND OUTCSW: OUTSWS: CSI$SW SP,2,OSMSK,,,SPCPY ;/SP:N SPOOL N COPIES CSI$ND CSI$SV DECIMAL,SPCNT,2,SPCPY CSI$ND SPCNT: .WORD 0 ;NUMBER OF SPOOLED COPIES... OSMSK: .WORD 0 ;OUTPUT SWITCH MASK WORD MODE2:: .WORD 0 ;AUX MODE AREA .END