.TITLE INDRCT - MCR INDIRECT FILE PROCESSOR .IDENT /03.GE/ ; ;**-1 ; ; ; VERSION: 03 ;HJL007 ; BY: H.LEV ;**-1 ; DATE: 1/31/74 ; MODIFIED: 8/9/74 ; SEPARATED FCS CONTROL BLOCKS INTO SEPARATE MODULE ; 9/9/74 ; ADDED CONDITIONAL BRANCHES AND LABELS ; 10/28/74 ; ADDED AND, OR, IFDF, IFNDF, WAIT ; REVERSE BRANCHING, DYNAMIC SYMBOL TABLE ; MULTI-CHARACTER SYMBOLS ; 11/4/74 ; MULTI-LEVEL INDIRECTION ; 12/30/74 ; ADDED XQT COMMAND ; 2/12/75 ; ADDED IFACT, IFNACT, IFINS, IFNINS, AND ONERR ; 2/16/75 ; ADDED SPECIAL SYMBOLS BRACKETED WITH < > ; 3/6/75 ; CHANGED PAUSE TO PRINT IND'S REAL TASK NAME ; 5/22/75 ; ADD SETT AND SETF COMMANDS ; 6/16/75 ; BREAK UP INTO 3 SEPARATE MODULES ; ;HJL007 ; HJL007 4/9/76 ADD OPEN, CLOSE, DATA, ENABLE AND DISABLE ;HJL007 ; ;HJL007 ; HJL024 2/15/76 ADD STRING SUBSTITUTION ;HJL007 ; ;HJL007 ; HJL025 3/7/76 CHANGE PCB, TCB AND TASK HEADER FORMAT ;HJL007 ; ;HJL007 ; HJL030 6/9/76 CHANGE INTERFACE TO MCR, MCR WILL STOP ITSELF ;HJL007 ; RATHER THAN EXIT ;HJL007 ; ;HJL007 ; JMM031 6/11/76 INCLUDE RSX-11D CONDITIONAL CODE ;JMM031 ; ;JMM031 ; ;JMM031 ; WTH 20/OCT/77 IGNORE LEADING BLANKS, ALL SYMBOLS GLOBAL ;WTH ; WTH1 25/OCT/77 PASS LOWER CASE ;WTH1 ; ; THIS PROGRAM PROVIDES A MEANS OF GIVING MCR COMMANDS FROM ;**-1 ; A FILE. ; ; ; MACRO LIBRARY CALLS ; .MCALL GCMLD$ GCMLD$ DEF$L .MCALL DIR$,EXIT$S,RETURN,WTSE$S .IF DF M$$FCS .MCALL FINIT$,CLOSE$,PUT$ ;HJL007 .ENDC ;**-1 .MCALL MRKT$ ; ; EQUATED SYMBOLS ; CR = 15 ; CARRIAGE RETURN ESC = 33 ; ESCAPE LUN1 = 1 ; "TI" LUN LUN2 = 2 ; FILE LUN EFN1 = 1 ; EVENT FLAG TO WAIT ON SYMSIZ = 6. ; SYMBOL SIZE IN CHARACTERS STRLEN = 16. ; MAX LENGTH OF STRING ;HJL024 ; ;HJL024 ; SYMBOL TYPE ;HJL024 ; ;HJL024 TF = 1 ; LOGICAL (TRUE/FALSE) ;HJL024 NUM = 2 ; NUMERIC ;HJL024 STR = 3 ; STRING ;HJL024 ; ; BIT DEFINITIONS FOR LIFLG ; NOLIST == 1 ; NOLISTING DESIRED NOTRAC == 2 ; NO TRACE LISTING DESIRED DELETE == 4 ; DELETE FILE ON CLOSING DEFSUB = 200 ; DEFAULT TO STRING SUBSTITUTION ;HJL007 DEFDAT = 400 ; DEFAULT TO DATA ;HJL007 STRNG = 1000 ; STRING SYMBOL ;HJL007 DATFIL = 2000 ; DATA FILE OPEN ;HJL007 FLUSH = 4000 ; DATA FILE BEING FLUSHED ;HJL007 SPCSYM = 10000 ; SPECIAL SYMBOL BEING PROCESSED ERPROC = 20000 ; ERROR PROCESSING ACTIVE IMXQT = 40000 ; IMMEDIATE EXECUTION OF MCR COMMAND, DON'T SET U2.AT. SKIP = 100000 ; SKIPPING TO LABEL ; ; BIT DEFINITIONS FOR $LOGFL ; LGCL = 1 ; LOGICAL FUNCTION IN PROGRESS 1=YES AND = 2 ; FUNCTION IS AND 1=YES GO = 4 ; ALLOW COMMAND TO EXECUTE 1=YES IFTST = 10 ; IF SEEN PREVIOUS TO CURRENT COMMAND 1=YES .PSECT DATA,RW .SBTTL LOCAL DATA CMDNAM: .BLKW 2 ; COMMAND NAME INDTI: .WORD 0 ; TASK "TI" UCB ADDRESS INDMCR: .WORD 0 ; MCR INPUT BUFFER ADDRESS INDDEP: .WORD 0 ; INDIRECT FILE CURRENT DEPTH ERRFLG: .WORD 0 ; ERROR FLAG, PLACE TO SAVE CARRY BIT LIMIT: .LIMIT ; LIMITS OF TASK LINBUF: .BLKB 80. ; LINE BUFFER ;HJL024 CMDBUF: .BLKB 80. ; COMMAND BUFFER (LINE AFTER SUBSTITUTION) ;HJL024 EXFLG: .WORD 0 ; EXIT FLAG ;HJL024 CARRET: .BYTE 15,0 ; CARRIAGE RETURN ;HJL024 .IF DF R$$11D ;JMM031 REQDPB: RQST$ ...XXX ; REQUEST DPB FOR MCR TASKS ;JMM031 STSIZ =2048. ; SIZE OF SYMBOL TABLE IN BYTES SYMTAB: .ASCII /CMDLIN/ ;INPUT COMMAND LINE FROM MCR CMDTXT==.+1 .BYTE STR,0 ;STRING. STRLEN BYTES OF NULLS .BLKB .ASCII /LSTCMD/ LSTCMD==.+1 .BYTE TF,1 ; LIST/DON'T LIST COMMANDS .ASCII /DQUOTE/ ; DOUBLE QUOTE CHARACTER .BYTE STR,'" .BLKB ; NULL FILLED .ASCII /SQUOTE/ ; SINGLE QUOTE CHARACTER .BYTE STR,'' .BLKB ; USE THE DQUOTE AND SQUOTE CHARACTERS TO MAKE UP STRINGS WITH ; THOSE SPECIAL CHARACTERS. CLSIZ=.-SYMTAB .EVEN .BLKB STSIZ ; SYMBOL TABLE ;JMM031 STBNDE: .ENDC ;JMM031 .SBTTL GLOBAL DATA ;**-1 $TSKNM:: .BLKW 2 ; TASK NAME FOR WAIT COMMAND $TSKTB:: .WORD 0 ; TASK TCB FOR WAIT COMMAND ; ; TI DPB ; $TIDPB:: .BYTE 1.,12. ; DIC AND LENGTH .WORD IO.WVB ; WRITE VIRTUAL FUNCTION .WORD LUN1 ; TI LUN .WORD EFN1 ; EVENT FLAG .WORD $TIOST ; I/O STATUS BLOCK ADDRESS .WORD 0 ; AST ADDRESS $TIBUF:: .WORD 0 ; BUFFER ADDRESS .WORD 0 ; LENGTH .WORD 0 ; CARRIAGE CONTROL .BLKW 3 ; $TIOST:: .BLKW 2 ; I/O STATUS BLOCK $BUF:: .BLKB 80. ; BUFFER FOR ASK PROCESSOR .PSECT CODE,RO ; ; INDIRECT FILE PROCESSOR COMMANDS ; $CMDTB:: .ASCIZ /DELAY/ ; .ASCIZ /PAUSE/ ; .ASCIZ /WAIT/ ; .ASCIZ /XQT/ ; .ASCIZ /ASKN/ ; ;HJL024 .ASCIZ /ASKS/ ; ;HJL024 .ASCIZ /ASK/ ; .ASCIZ /SETT/ ; .ASCIZ /SETF/ ; .ASCIZ /SETN/ ; ;HJL024 .ASCIZ /SETS/ ; ;HJL024 .ASCIZ /IFDF/ ; .ASCIZ /IFNDF/ ; .ASCIZ /IFT/ ; .ASCIZ /IFF/ ; .ASCIZ /IFACT/ ; .ASCIZ /IFNACT/ ; .ASCIZ /IFINS/ ; .ASCIZ /IFNINS/ ; .ASCIZ /IF/ ; ;HJL024 .ASCIZ /INC/ ; ;HJL024 .ASCIZ /DEC/ ; ;HJL024 .ASCIZ /GOTO/ ; .ASCIZ /ONERR/ ; .ASCIZ /AND/ ; .ASCIZ /OR/ ; .ASCIZ /OPEN/ ; ;HJL007 .ASCIZ /CLOSE/ ; ;HJL007 .ASCIZ /DATA/ ; ;HJL007 .ASCIZ /ENABLE/ ; ;HJL007 .ASCIZ /DISABLE/ ; ;HJL007 .BYTE 0 ; END OF TABLE .EVEN ; ; ADDRESS OF COMMAND PROCESSING ROUTINES ; $PROTB:: .WORD $DELAY ; .WORD $PAUSE ; .WORD $WAIT ; .WORD $XQT ; .WORD $ASKN ; ;HJL024 .WORD $ASKS ; ;HJL024 .WORD $ASK ; .WORD $SETT ; .WORD $SETF ; .WORD $SETN ; ;HJL024 .WORD $SETS ; ;HJL024 .WORD $IFDF ; .WORD $IFNDF ; .WORD $IFT ; .WORD $IFF ; .WORD $IFACT ; .WORD $IFNAC ; .WORD $IFINS ; .WORD $IFNIN ; .WORD $IF ; ;HJL024 .WORD $INC ; ;HJL024 .WORD $DEC ; ;HJL024 .WORD $GOTO ; .WORD $ONERR ; .WORD $BOLAN ; .WORD $BOLOR ; .WORD $OPEN ; ;HJL007 .WORD $CLOSE ; ;HJL007 .WORD $DATA ; ;HJL007 .WORD $ENABL ; ;HJL007 .WORD $DSABL ; ;HJL007 .WORD $LABEL ; .PSECT DATA,RW ; ; MARK TIME DPB ; $MKTIM:: MRKT$ 1,0,0 ; ; ; CONTROL VARIABLES ; $CMDFL:: .WORD 0 ; COMMAND IN PROGRESS FLAG $LIFLG::.WORD 0 ; SWITCH WORD FOR CSI .LIFLG:: .WORD 0 ; COMMAND LISTING FLAG $LOGFL:: .WORD 0 ; LOGICAL OPERATION FLAGS $IFCNT:: .WORD 0 ; COUNT OF IFS SEEN ; ; SYMBOL TABLE FOR TRUE/FALSE FLAGS ; ; FORMAT: ; BYTES 0-SYMSIZ SYMBOL IN ASCII ; BYTE SYMSIZ VALUE OF SYMBOL ; $SYMTB:: .WORD 0 ; ADDRESS OF START OF SYMBOL TABLE $SYMND:: .WORD 0 ; END OF SYMBOL TABLE+2 $SYMFR:: .WORD 0 ; FIRST FREE ELEMENT IN SYMBOL TABLE $COND:: .WORD 0 ; CONDITION WE ARE TRYING TO SATISFY $LINDS:: .WORD 0 ; LINE DISPLAYED FLAG (0=NO, 1=YES) $ERLBL:: .BLKB 6 ; ERROR ROUTINE LABEL $LABL:: .BLKB 6 ; SEARCH LABEL $LBLND:: .BYTE 0 ; END OF LABEL $CRNTS:: .BLKB SYMSIZ ; CURRENT SYMBOL ;HJL024 .BYTE 0 ; END OF SYMBOL ;HJL024 $SYMTP:: .BYTE 0 ; SYMBOL TYPE ;HJL024 .EVEN ;HJL024 $LINLN:: .WORD 0 ; LINE LENGTH ;HJL024 $SBFLG:: .WORD 0 ; SUBSTITUTION FLAG ;HJL024 ; 0 - NO SUB OCCURED, 1 -SUB OCCURED ;HJL024 $SBERR:: .WORD 0 ; SUBSTITUTION ERROR FLAG 0=NO, 1=YES ;HJL024 .PSECT DATA,RW .SBTTL ERROR MESSAGES .NLIST BEX ERR2: .ASCIZ <15><12>/AT. -- SYNTAX ERROR/ ERR4: .ASCIZ <15><12>/AT. -- FILE NOT FOUND/ ERR5: .ASCIZ <15><12>/AT. -- NO POOL SPACE/ ERR6: .ASCIZ <15><12>/AT. -- FILE READ ERROR/ ERR7: .ASCIZ <15><12>/AT. -- RECORD LARGER THAN 80. BYTES/ ERR8: .ASCIZ <15><12>/AT. -- MAXIMUM INDIRECT FILES EXCEEDED/ ERR10: .ASCIZ /@ / ERR12: .ASCIZ <15><12>/AT. -- BAD COMMAND OR SYNTAX/ ERR13: .ASCII <15><12>/AT. -- PAUSING. TO CONTINUE TYPE "RES / .IF DF R$$11D ;JMM031 $SYM13::.ASCIZ /XXXXXX"/ ;JMM031 .IFF ;JMM031 $SYM13:: .ASCIZ /XXXXXX"/ .ENDC ;JMM031 ERR14: .ASCIZ <15><12>/AT. -- CONTINUING/ ERR15: .ASCIZ <15><12>/AT. -- DELAYING/ ERR16: .ASCIZ <15><12>/AT. -- INVALID KEYWORD/ ERR17: .ASCII <15><12>/AT. -- SYMBOL TABLE OVERFLOW / $SYM17:: .BLKB SYMSIZ+1 ERR18: .ASCIZ <15><12>/AT. -- INVALID ANSWER/ ERR19: .ASCII <15><12>/AT. -- UNDEFINED SYMBOL / $SYM19:: .BLKB SYMSIZ+3 ERR20: .ASCII <15><12>/AT. -- TASK NOT IN SYSTEM / $SYM20:: .ASCIZ /TTTTTT/ ERR21: .ASCII <15><12>/AT. -- UNDEFINED LABEL ./ $SYM21:: .ASCIZ /LABELX: / ERR22: .ASCIZ <15><12>/AT. -- BINARY OPERATOR ERROR/ ERR23: .ASCIZ <15><12>/AT. -- REDEFINING SPECIAL SYMBOL/ ERR24: .ASCII <15><12>/AT. -- DATA FILE ERROR/ ;HJL007 $SYM24:: .BLKB 5 ;HJL007 ERR25: .ASCII <15><12>/AT. -- REDEFINING SYMBOL TO DIFFERENT TYPE / ;HJL007 $SYM25:: .BLKB SYMSIZ+1 ; ;HJL007 ERR26: .ASCII <15><12>/AT. -- SYMBOL TYPE ERROR / ;HJL007 $SYM26:: .BLKB SYMSIZ+1 ; ;HJL007 ERR27: .ASCIZ <15><12>/AT. -- STRING SUBSTITUTION ERROR/ ;HJL007 .LIST BEX .EVEN .SBTTL PROCESS INDIRECT FILE ;+ ; *** - $INDEP PROCESS INDIRECT FILE FOR MCR COMMANDS. ; THIS PROGRAM RECEIVES A COMMAND FROM MCR OF THE FORMAT: ; @FILSPEC[/XX] ; WHERE: ; FILSPEC IS A VALID FILE SPECIFIER ; /XX IS A VALID KEYWORD ; LI - LIST MCR COMMANDS ON TI ; TR - LIST AT. COMMANDS ON TI ; DE - DELETE FILE WHEN DONE ; DEFAULT IS /LI/NOTR/NODE ; ; ; THIS FILE CONTAINS VARIABLE LENGTH ASCII RECORDS WHICH ARE MCR ; COMMANDS. THE PROGRAM TAKES ONE RECORD ; AT A TIME AND INSERTS IT INTO THE MCR MESSAGE LIST. IT THEN ; REQUESTS THE EXECUTION OF ...MCR. WHEN IT IS PROCESSED BY ; MCR, ANOTHER MESSAGE IS PUT INTO MCR'S MESSAGE LIST. THE ; PROGRAM SHOULD BE EXECUTING AS A TASK OF PRIORITY 1. TO ALLOW ; MCR AND ALL OTHER TASKS TO PROCESS THE COMMAND BEFORE THE NEXT ; ONE IS DISPATCHED TO MCR. ; ; ; AT. WILL ACCEPT COMMANDS TO IT RATHER THAN MCR IF THEY ARE ; PRECEDED WITH A PERIOD (.). THESE COMMANDS WILL NOT BE ; DISPLAYED ON THE CONSOLE UNLESS THE /TR SWITCH IS SET. ; COMMANDS ARE: ; .PAUSE - WAIT FOR >RES ...AT. ; .DELAY NNU - WAIT NN TIME UNITS U ; WHERE U IS (T, S, M, OR H) ; .WAIT TTTTTT - WAIT UNTIL TASK TTTTTT EXITS ; .XQT CC...CC - EXECUTE COMMAND CC...CC AND DON'T WAIT ; FOR COMPLETION. THIS ALLOWS THE ; STARTUP OF MORE THAN ONE MCR FUNCTION ; THE .WAIT COMMAND CAN BE USED TO RESYNCHRONIZE THE CO ; .ASK X AAA...AA - ASK QUESTION WHOSE TEXT IS ; AAA...AAA AND STORE A TRUE/FALSE IN ; SYMBOL X. ; .ASKS X AA...AA - ASK QUESTION WHOSE TEXT IS ;HJL024 ; AA...AA AND STORE STRING IN SYMBOL X ;HJL024 ; .ASKN X AA...AA - ASK QUESTION WHOSE TEXT IS ;HJL024 ; AA...AA AND STORE NUMBER IN X ;HJL024 ; .SETT X - SET SYMBOL X TO TRUE ; .SETF X - SET SYMBOL X TO FALSE ; .SETN X N - SET SYMBOL X TO NUMBER N ;HJL024 ; .SETS X "AA...AA" - SET SYMBOL X TO STRING AA...AA ;HJL024 ; .INC X - INCREMENT NUMERIC SYMBOL X ;HJL024 ; .DEC X - DECREMENT NUMERIC SYMBOL X ;HJL024 ; .IF X OP Y CCCC - EXECUTE STATEMENT CCCC IF THE ;HJL024 ; RELATION OP IS TRUE FOR X AND Y ;HJL024 ; WHERE OP CAN BE EQ, NE, LT, LE, GT, OR GE ;HJL024 ; OR =, <>, <=, >=, <, OR >. ;HJL024 ; .OPEN FILE - OPEN FILE FOR OUTPUT ;HJL024 ; .CLOSE FILE - CLOSE FILE ;HJL024 ; .DATA XXX...XXX - OUTPUT XXX...XXX TO CURRENTLY OPEN FILE ;HJL024 ; .ENABLE OPTION - ENABLE OPTION - WHERE OPTION IS ;HJL024 ; SUBSTITUTION - STRING SUBSTITUTION ;HJL024 ; DATA - ALL LINES ARE DATA UNTIL ;HJL024 ; DISABLE IS SEEN ;HJL024 ; .DISABLE OPTION - DISABLE OPTION ENABLED BY .ENABLE ;HJL024 ; .IFDF X CC...CC - EXECUTE COMMAND CC...CC IF SYMBOL X IS DEFINED ; .IFNDF X CC...CC- EXECUTE COMMAND CC...CC IF SYMBOL X IS NOT DEFINED ; .IFT X CC...CC - EXECUTE COMMAND CC...CC IF SYMBOL X IS TRUE ; .IFF X CC...CC - EXECUTE COMMAND CC...CC IF SYMBOL X IS FALSE ; .IFACT TT CC...CC - EXECUTE COMMAND CC...CC IF TASK TT IS ACTIVE ; .IFNACT TT CC...CC - EXECUTE COMMAND CC...CC IF TASK TT IS NOT ACTIVE ; .IFINS TT CC...CC - EXECUTE COMMAND CC...CC IF TASK TT IS INSTALLED ; .IFNINS TT CC...CC - EXECUTE COMMAND CC...CC IF TASK TT IS NOT INSTALLED ; .AND - BINARY OPERATOR AND'S PREVIOUS WITH NEXT .IF ; .OR - BINARY OPERATOR OR'S PREVIOUS WITH NEXT .IF ; .GOTO X - GOTO LABEL .X: ; .ONERR X - GOTO LABEL .X: IF AN ERROR IS DETECTED ; .X: - LABEL FOR BRANCHING TO ; SUBSTITUTED CHARACTER STRINGS ARE INCLUDED WITHIN SINGLE ; QUOTES (') IF SUBSTITUTION IS ENABLED. ; ; INDMCR WILL REQUEST A FILE IN [2,1] IF IT DOES NOT RECOGNIZE A ; COMMAND OF APPARENTLY VALID TYPE, AND THHIS PROGRAM WILL STORE ; THE FIRST 16 CHARACTERS OF THE COMMAND LINE PAST THE FIRST SPACE ; IN THE STRING "CMDLIN" (FOR PASSING ARGUMENTS). ; THE PRINTOUT OF PROMPTS AND SUCH MAY BE DISABLED FROM WITHIN ; A PROCEDURE BY THE COMMAND ".SETF LSTCMD" AND REENABLED BY ; ".SETT LSTCMD". ; THE STRINGS DQUOTE AND SQUOTE ARE DOUBLE AND SINGLE QUOTE ; CHARACTERS (" AND ') FOR USE IN CONSTRUCTING COMMAND LINES. THESE ; ARE PRESET AND NEED ONLY BE USED. ; ;- .PSECT CODE,RO $INDEP:: ; ENTRY POINT FINIT$ ; INITIALIZE FCS .IF DF R$$11D ;JMM031 MOV .CRTSK,R1 ; GET OUR ATL NODE ADDRESS ;JMM031 MOV A.TI(R1),INDTI ; SAVE OUR TI ADDRESS ;JMM031 MOV #SYMTAB,$SYMTB ; SET START OF SYMBOL TABLE ;JMM031 MOV #STBNDE,$SYMND ; SET END OF SYMBOL TABLE ;JMM031 .IFF ;JMM031 CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $HEADR,R0 ; GET ADDRESS OF OUR HEADER MOV H.WND(R0),R0 ; GET WINDOW BLOCK ADDRESS ;HJL025 TST (R0)+ ; SKIP TO FIRST WINDOW ;HJL025 MOV W.BHVR(R0),$SYMND ; SET TOP OF TASK PARTITION ;HJL025 RETURN ; RETURN TO USER STATE ;**-1 10$: MOV LIMIT+2,$SYMTB ; SET START OF SYMBOL TABLE .ENDC ;JMM031 CLR EXFLG ; SET NOT TO EXIT ON ERROR ;HJL024 20$: MOV $SYMTB,$SYMFR ; SET ADDRESS OF FIRST FREE ENTRY ;**-7 .IF DF,R$$11D ADD #CLSIZ,$SYMFR ;PASS CMD LINE FOR RSX11D VERSION .ENDC BISB #GE.FOP,G.MODE+$GCML ; SET TO RETURN ON FILE OPEN BICB #GE.CLO!GE.COM,G.MODE+$GCML ; CLEAR FILE CLOSE BIT BISB #GE.LC, G.MODE+$GCML ; SET PASS LC ;WTH1 ; ALLOW COMMENTS TO COME THROUGH CLR INDMCR ; SHOW NO MCR BUFFER IN USE CLR $ERLBL ; SHOW NO ERROR PROCESSING ROUTINE SPECIFIED MOV #NOTRAC,$LIFLG ; INITIALIZE NO TRACE OPTION .IF NDF R$$11D ;JMM031 MOV $TKTCB,R1 ; GET OUR TCB ADDRESS MOV T.UCB(R1),INDTI ; GET TI UCB ADDRESS .ENDC ;JMM031 CLR INDDEP ; ZERO CURRENT INDIRECT FILE DEPTH .IF DF R$$11D ;JMM031 CALL $PRMPT ; PRINT INITIAL PROMPT ;JMM031 .ENDC ;JMM031 ; ; GET BUFFER TO GIVE MCR THE NEXT COMMAND IN ; $INDRD:: MOV #CMDBUF,$TIBUF ; SET OUTPUT BUFFER ADDRESS ;HJL024 MOV #GO,$LOGFL ; SET GO AND NO LOGICAL FUNCTION IN PROGRESS ;**-14 CLR $IFCNT ; ZERO COUNT OF IFS SEEN ; ; GET COMMAND LINE ; MOV #LINBUF,G.RBUF+$GCML ; SET BUFFER ADDRESS ;HJL024 MOV #$GCML,R0 ; POINT TO GCML CONTROL BLOCK ;**-1 CALL $MGCL1 ; CALL GCML .ENABL LSB INDRD1: BCC 15$ ; SKIP IF NO ERRORS CMPB #GE.IOR,G.ERR(R0) ; I/O ERROR? BNE 10$ ; NO JMP $ATER6 ; YES 10$: CMPB #GE.OPR,G.ERR(R0) ; OPEN ERROR? BNE 11$ ; NO JMP $ATER4 ; YES 11$: CMPB #GE.BIF,G.ERR(R0) ; SYNTAX ERROR? BNE 12$ ; NO JMP $ATER2 ; YES 12$: CMPB #GE.MDE,G.ERR(R0) ; MAX DEPTH EXCEEDED? BNE 15$ ; NO JMP $ATER8 ; YES ; ; GOOD COMMAND ; 15$: CMPB G.CDEP(R0),INDDEP ; HAS FILE DEPTH CHANGED? BEQ 30$ ; NO BIT #FLUSH!DATFIL,.LIFLG ; DATA FILE IN PROGRESS? ;HJL007 BEQ 16$ ; NO ;HJL007 CLOSE$ #$DATF ; YES, CLOSE FILE ;HJL007 BIC #FLUSH!DATFIL,.LIFLG ; AND CLEAR DATA FILE BITS ;HJL007 16$: CMPB G.CDEP(R0),INDDEP ; HAS DEPTH CHANGED ;HJL007 BGT 20$ ; YES, IT INCREASED ; ; OLD INDIRECT FILE CLOSED ; BIT #SKIP,.LIFLG ; SKIPPING TO LABEL? BEQ 17$ ; NO MOV #$SYM21,R1 ; YES, LABEL NOT FOUND MOV #$LABL,R2 ; GET LABEL ADDRESS CALL $MOVE ; MOVE IT INTO ERROR MESSAGE MOVB #':,(R1)+ ; MOVE IN TERMINATOR CLRB (R1)+ ; AND SET END OF LABEL JMP $ATE21 ; ISSUE ERROR MESSAGE 17$: MOV (SP)+,$ERLBL+4 ; RESTORE ERROR PROCESSING ROUTINE MOV (SP)+,$ERLBL+2 ; LABEL MOV (SP)+,$ERLBL ; MOV (SP)+,.LIFLG ; RESTORE LISTING FLAGS ; MOV (SP)+,$SYMFR ;RESTORE FREE SPACE POINTER ;WTH MOV (SP)+,$SYMTB ; POP OFF FREE SPACE POINTER-KEEP SP CORRECT ;WTH MOV (SP)+,$SYMTB ; RESTORE SYMBOL TABLE START DEC INDDEP ; DECREMENT INDIRECT FILE DEPTH BNE 15$ ; TRY UNTIL LEVEL GOES TO ZERO JMP $ATE10 ; END OF FILE ; ; NEW INDIRECT FILE OPENED ; 20$: MOV $SYMTB,-(SP) ; SAVE POINTER TO START OF SYMBOL TABLE MOV $SYMFR,-(SP) ; SAVE POINTER TO FIRST FREE SPOT MOV .LIFLG,-(SP) ; SAVE LISTING CONTROL FLAGS MOV $ERLBL,-(SP) ; SAVE ERROR PROCESSING ROUTINE MOV $ERLBL+2,-(SP) ; LABEL MOV $ERLBL+4,-(SP) ; CLR $ERLBL ; SET NO ERROR PROCESSING LABEL ; MOV $SYMFR,$SYMTB ; SET START OF NEW SYMBOL TABLE--NOPPED ;WTH INC INDDEP ; INCREMENT INDIRECT FILE DEPTH MOV $LIFLG,.LIFLG ; SET NEW LISTING CONTROL FLAGS MOV #NOTRAC,$LIFLG ; INIT NEXT LISTING CONTROL FLAGS BR 50$ ; GET NEXT REAL COMMAND ; ; COMMAND READY ; 30$: BITB #GE.IEF,G.MODE(R0) ; INTERMEDIATE EOF? BEQ 40$ ; NO BIT #SKIP,.LIFLG ; SKIPPING TO LABEL? BEQ 40$ ; NO BICB #GE.RWD,G.MODE(R0) ; SET TO NOT REWIND 40$: MOV G.CMLD(R0),R1 ; GET BUFFER LENGTH ;HJL024 MOV G.CMLD+2(R0),R0 ; GET BUFFER ADDRESS ;HJL024 ADD R0,R1 ; GET ADDRESS OF LAST BYTE ;HJL024 405$: CMPB -(R1),#40 ; TRAILING BLANK? ;HJL024 BEQ 405$ ; YES ;HJL024 INC R1 ; NO ;HJL024 4055$: CMPB (R0)+,#40 ;LEADING BLANK? ;WTH BEQ 4055$ ;YES ;WTH DEC R0 ;NO, FIX POINTER ;WTH CLRB (R1) ; SET END OF BUFFER ;HJL024 MOV #CMDBUF,R1 ; GET OUTPUT BUFFER ADDRESS ;HJL024 MOV #80.,$LINLN ; SET LINE LENGTH ;HJL024 CLR $SBFLG ; SET NO SUBSTITUTION OCCURRED ;HJL024 CLR $SBERR ; CLEAR SUBSTITUTION ERROR FLAG ;HJL024 CALL $STRSB ; SUBSTITUTE STRINGS IN LINE ;HJL024 BCC 406$ ; NO ERRORS ENCOUNTERED ;HJL024 INC $SBERR ; SET SUBSTITUTION ERROR OCCURRED ;HJL024 BIT #SKIP,.LIFLG ; SEARCHING FOR LABEL? ;HJL024 BNE 406$ ; YES, LET IT PASS FOR NOW ;HJL024 BR 60$ ; NO, ISSUE THE ERROR ;HJL024 406$: MOV R1,R0 ; COPY ADDRESS OF END OF BUFFER ;HJL024 MOV R0,$TIBUF+2 ; SET LAST ADDRESS ;**-6 SUB $TIBUF,$TIBUF+2 ; COMPUTE BUFFER LENGTH INC $TIBUF+2 ; INCLUDE NEW TERMINATOR CMP $TIBUF+2,#80. ; BUFFER TOO BIG? BLE 408$ ; NO JMP $ATER7 ; YES, ERROR 408$: MOVB #CR,(R0) ; GET CARRIAGE RETURN .IF DF R$$11D ;JMM031 BIT #NOLIST!IMXQT,.LIFLG ; LISTING ENABLED? ;JMM031 .IFF ;JMM031 BIT #NOLIST,.LIFLG ; LISTING ENABLED? .ENDC ;JMM031 BEQ 42$ ; YES MOVB #ESC,(R0) ; NO, SUPPRESS PROMPT 42$: CLR $LINDS ; RESET LINE DISPLAYED FLAG BIC #IMXQT,.LIFLG ; CLEAR IMMEDIATE EXECUTION FLAG MOV $TIBUF,R0 ; GET BUFFER ADDRESS BIT #DEFDAT,.LIFLG ; DEFAULT ALL LINES TO DATA? ;HJL007 BEQ $INTST ; NO ;HJL007 BIT #DATFIL!FLUSH,.LIFLG ; IS FILE OPEN OR FLUSH IN PROGRESS ;HJL007 BEQ $INTST ; NO, NO NEED TO WRITE TO FILE ;HJL007 CMPB (R0),#'. ; YES, COMMAND? ;HJL007 BEQ $INTST ; YES, LOOK FOR DISABLE DATA OR CLOSE ;HJL007 BIT #FLUSH,.LIFLG ; NO, FLUSHING FILE? ;HJL007 BNE 425$ ; YES, SKIP DATA ;HJL007 420$: DEC $TIBUF+2 ; DISCOUNT TERMINATOR ;HJL007 PUT$ #$DATF,$TIBUF,$TIBUF+2 ; WRITE LINE TO FILE ;HJL007 BCC 425$ ; OKAY ;HJL007 JMP $DATER ; NO, ERROR ;HJL007 425$: JMP $INDRD ; GET NEXT LINE ;HJL007 $INTST:: CMPB (R0),#'. ; INDIRECT FILE COMMAND? BNE 43$ ; NO JMP $PRCMD ; YES 43$: BIT #SKIP,.LIFLG ; SEARCHING FOR LABEL? BEQ INDSND ; NO 50$: JMP $INDRD ; YES, READ NEXT LINE 60$: JMP $ATE27 ; SUBSTITUTION ERROR ;HJL024 .DSABL LSB ; ; WRITE OUT COMMAND TO TI THEN PASS IT TO MCR ; INDSND: CALL $GOTST ; TEST IF ALL CONDITIONS GO BCC 10$ ; YES JMP $INDRD ; NO, GET NEXT COMMAND 10$: CLR $TIBUF+4 ; SET NO CARRIAGE CONTROL CMP R0,$TIBUF ; AT START OF BUFFER? BEQ 20$ ; YES MOVB #'!,-1(R0) ; NO, PUT IN COMMENT DELIMITER MOV R0,$TIBUF ; SET STARTING BUFFER ADDRESS 20$: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#CR ; END OF BUFFER? BEQ 25$ ; YES CMPB #ESC,R2 ; BNE 20$ ; NO, TRY NEXT CHARACTER 25$: BIT #IMXQT,.LIFLG ; YES, IMMEDIATE EXECUTION? .IF NDF R$$11D ;JMM031 BEQ 30$ ; NO .ENDC ;JMM031 MOVB #ESC,-1(R0) ; YES, SET TO NO PROMPT ON EXIT 30$: SUB $TIBUF,R0 ; COMPUTE LENGTH OF BUFFER MOV R0,$TIBUF+2 ; SET IT FOR WRITE CMPB @$TIBUF,#'@ ; INDIRECT FILE COMMAND? BNE 35$ ; NO MOV $TIBUF,R1 ; GET BUFFER POINTER MOV $TIBUF+2,R2 ; GET BUFFER LENGTH DEC R2 ; DON'T COUNT MOV #$GCML,R0 ; GET GCML CONTROL BLOCK ADDRESS MOV R0,R5 ; COPY IT CALL $MGCL4 ; OPEN NEXT LEVEL OF INDIRECT FILE JMP INDRD1 ; LOOP 35$: BIT #NOLIST,.LIFLG ; LISTING DESIRED? BNE 48$ ; NO, SKIP OUTPUTING IT .IF DF R$$11D ;JMM031 BITB #1,LSTCMD ; SEE IF LISTING TURNED OFF BY PROC BEQ 48$ ; IF OFF, NO LISTS (CONTROLLED BY PROC) MOV $TIBUF+4,-(SP) ; SAVE CURRENT CCW ;JMM031 MOV #'+,$TIBUF+4 ; SET FOR CR AT END ;JMM031 .IFTF ;JMM031 CALL $TIIO ; ISSUE WRITE .IFT ;JMM031 MOV (SP)+,$TIBUF+4 ; RESTORE CCW ;JMM031 .ENDC ;JMM031 BCC 40$ ; GOOD JMP $INRLS ; ERROR 40$: INC $LINDS ; SHOW LINE DISPLAYED 48$: CMPB @$TIBUF,#'/ ; END OF COMMAND FILE? BNE 50$ ; NO JMP $INRLS ; YES, RELEASE MCR COMMAND BUFFER 50$: MOV $TIBUF,R0 ; GET ADDRESS OF COMMAND CALL $CAT5 ; GET COMMAND NAME IN RAD 50 MOV R1,CMDNAM ; STORE IT CLR CMDNAM+2 ; .IF DF R$$11D ;JMM031 60$: CMP $TIBUF+2,#1 ; ONLY ONE CHARACTER IN BUFFER? ;JMM031 BEQ 105$ ; YES -- END OF LINE ;JMM031 CMPB @$TIBUF,#'; ; IS FIRST CHARACTER A SEMI-COLON? ;JMM031 BEQ 105$ ; YES IF EQ -- COMMENT LINE ;JMM031 CMPB @$TIBUF,#'! ; NO -- IS IT EXCLAMATION POINT? ;JMM031 BEQ 105$ ; YES IF EQ -- COMMENT LINE ;JMM031 CMP CMDNAM,(PC)+ ; NO -- IS TASK "LOG"? ;JMM031 .RAD50 /LOG/ ;JMM031 BEQ 105$ ; YES IF EQ -- COMMENT LINE ;JMM031 MOV CMDNAM,REQDPB+R.QSTN+2 ; SET TASK NAME IN DPB ;JMM031 MOV #REQDPB+2,R1 ; SET R1 WITH ADDRESS OF TASK NAME ;JMM031 CALL ..FSTD ; SEARCH FOR TASK NAME IN STD ;JMM031 ; TST R2 ; IS TASK INSTALLED? ;JMM031 BNE 63$ ; YES IF NE 0 ;JMM031 MOV #$SYM20,R0 ; GET ADDRESS TO STORE ASCII TASK NAME ;JMM031 MOV CMDNAM,R1 ; GET FIRST HALF OF NAME ;JMM031 CALL $C5TA ; CONVERT TO ASCII ;JMM031 CLRB @R0 ; SECOND HALF OF NAME IS BLANK ;JMM031 INC $CMDFL ; PRETEND WE'RE EXECUTING A COMMAND ;JMM031 MOV #-1,$SBFLG ; SUPPRESS PRINTING COMMAND LINE ;JMM031 CALL $ATE20 ; GO PRINT ERROR MESSAGE ;JMM031 JMP $INDRD ; PROCESS NEXT COMMAND ;JMM031 ; ;JMM031 63$: CLR INDMCR ; CLEAR COMMAND LINE BUFFER ADDRESS ;JMM031 MOV #6,R3 ; SET UP FOR 96-BYTE NODE ;JMM031 CALL ..PICV ; TRY TO PICK NODE ;JMM031 BCS 85$ ; PICK FAILED IF CARRY SET ;JMM031 MOV R4,INDMCR ; SAVE BUFFER ADDRESS ;JMM031 MOV INDTI,R2 ; GET OUR TI ADDRESS ;JMM031 MOV R2,M.TI(R4) ; SET TI IN MCR NODE ;JMM031 MOV U.UI(R2),REQDPB+R.QSPC ; SET UIC IN REQUEST DPB ;JMM031 .INH0 ; INHIBIT TASK SWITCHING ;JMM031 DIR$ #REQDPB ; REQUEST THE TASK ;JMM031 BCC 65$ ; OK IF CARRY CLEAR ;JMM031 .ENB0 ; ELSE ENABLE TASK SWITCHING ;JMM031 JMP $ATER5 ; NO NODES IF CARRY SET ;JMM031 ; ;JMM031 65$: MOV $TIBUF,R3 ; GET ADDRESS OF COMMAND BUFFER ;JMM031 MOV $TIBUF+2,R2 ; GET COMMAND LINE LENGTH ;JMM031 DEC R2 ; DON'T INCLUDE TERMINATOR ;JMM031 MOV R2,M.BC(R4) ; SET LENGTH IN MCR NODE ;JMM031 INC R2 ; INCLUDE TERMINATOR ;JMM031 MOV CMDNAM,M.TN(R4) ; SET TASK NAME IN MCR NODE ;JMM031 ADD #M.BF,R4 ; SET R4 TO START OF BUFFER IN NODE ;JMM031 70$: ;JMM031 MOVB (R3)+,(R4)+ ; TRANSFER COMMAND LINE ;JMM031 SOB R2,70$ ; LOOP TIL DONE ;JMM031 MOV INDMCR,R1 ; GET MCR NODE ADDRESS ;JMM031 MOV #.MCRLH,R4 ; GET ADDRESS OF MCR LISTHEAD ;JMM031 CALL ..NADD ; ADD NODE TO LIST ;JMM031 .ENB0 ; ENABLE TASK SWITCHING ;JMM031 85$: ;JMM031 TST INDMCR ; DID COMMAND GET SENT? ;JMM031 BEQ $ATER5 ; NO, NO POOL SPACE ;JMM031 CLR INDMCR ; YES -- CLEAR BUFFER ADDRESS ;JMM031 90$: ;JMM031 MOV #CMDNAM,R3 ; GET TASK NAME IN R3 ;JMM031 CALL $CKTSK ; SEARCH FOR TASK IN ATL & MRL'S ;JMM031 BCC 95$ ; FOUND TASK IF CARRY CLEAR ;JMM031 CALL $NULSB ; ELSE NOT IN EXECUTION -- WAIT A BIT ;JMM031 BR 90$ ; TRY AGAIN ;JMM031 ; ;JMM031 95$: BIT #IMXQT,.LIFLG ; IMMEDIATE EXECUTION? ;JMM031 BNE 110$ ; YES -- CONTINUE ;JMM031 100$: ;JMM031 MOV #CMDNAM,R3 ; NO -- GET TASK NAME ;JMM031 CALL $CKTSK ; LOOK FOR IT ;JMM031 BCS 110$ ; NOT FOUND -- MUST HAVE FINISHED ;JMM031 CALL $NULSB ; STILL IN EXECUTION -- WAIT A BIT ;JMM031 BR 100$ ; TRY AGAIN ;JMM031 ; ;JMM031 105$: BIT #NOLIST,.LIFLG ; LISTING DESIRED? ;JMM031 BNE 115$ ; IF NOT DON'T PROMPT ;JMM031 110$: ;JMM031 CALL $PRMPT ; WRITE THE PROMPT ;JMM031 115$: ;JMM031 JMP $INDRD ; PROCESS NEXT COMMAND ;JMM031 .IFF ;JMM031 60$: CALL $SWSTK,85$ ; SWITCH TO SYSTEM STACK ;HJL024 CLR INDMCR ; ZERO MCR COMMAND LINE BUFFER ADDRESS ;HJL024 MOV #84.,R1 ; SET LENGTH OF MCR COMMAND LINE ;HJL024 CALL $ALOCB ; TRY TO GET ONE ;HJL024 BCS 75$ ; ERROR, NO POOL SPACE ;HJL024 MOV INDTI,R2 ; GET TI UCB ADDRESS ;HJL024 BIT #IMXQT,.LIFLG ; IMMEDIATE EXECUTION? ;HJL024 BNE 65$ ; YES ;HJL024 BIS #U2.AT.,U.CW2(R2) ; SET INDIRECT FILE FLAG ;HJL024 65$: MOV R0,INDMCR ; SAVE MCR BUFFER ADDRESS ;HJL024 CLR (R0)+ ; ZERO LINK WORD ;HJL024 MOV R2,(R0)+ ; SET TI UCB ADDRESS ;HJL024 MOV #80.,R2 ; SET CHARACTERS TO MOVE ;HJL024 MOV #CMDBUF,R1 ; GET COMMAND ADDRESS ;HJL024 70$: MOVB (R1)+,(R0)+ ; MOVE NEXT CHARACTER ;HJL024 DEC R2 ; DONE? ;HJL024 BGT 70$ ; NO, LOOP ;HJL024 MOV INDMCR,R1 ; LINK BUFFER ONTO MCR LIST ;HJL024 CALL $QMCRL ; ;HJL024 75$: RETURN ; RETURN TO USER STATE ;HJL024 ; ;**-7 ; WAIT FOR COMMAND TO BE PROCESSED ; 85$: TST INDMCR ; DID COMMAND GET SENT? ;HJL024 BEQ $ATER5 ; NO, NO POOL SPACE ;HJL024 CLR INDMCR ; ZERO COMMAND BUFFER ADDRESS ;HJL024 MOV $MCRPT,R1 ; GET MCR TCB ADDRESS ;HJL024 87$: TST T.STAT(R1) ; IS TASK IN EXECUTION? ;**-1 BMI 90$ ; NO BIT #TS.STP,T.STAT(R1) ; IS MCR STOPPED? ;HJL030 BNE 90$ ; YES, COMMAND WAS PROCESSED ;HJL030 CALL $NULSB ; YES, WAIT BR 87$ ; TRY AGAIN 90$: BIT #IMXQT,.LIFLG ; IMMEDIATE EXECUTION? BNE 107$ ; YES 95$: MOV #CMDNAM,R3 ; POINT TO TASK NAME CALL $GTTSK ; SEARCH FOR TASK BCS 100$ ; DIDN'T FIND IT MOV R0,R1 ; COPY TCB ADDRESS CMP INDTI,T.UCB(R1) ; IS TASK RUNNING FROM OUR TI? BNE 100$ ; NO TST T.STAT(R1) ; IN EXECUTION? BMI 100$ ; NO CALL $NULSB ; YES, WAIT BR 95$ ; TRY AGAIN 100$: MOV INDTI,R3 ; GET TI UCB ADDRESS 105$: BIT #U2.AT.,U.CW2(R3) ; HAS PROMPT BEEN SENT OUT? BEQ 110$ ; YES CALL $NULSB ; NO, WAIT FOR IT BR 105$ ; TRY AGAIN 107$: CALL $PRMPT ; ISSUE PROMPT 110$: JMP $INDRD ; PROCESS NEXT COMMAND ;HJL024 .ENDC ;JMM031 .SBTTL ERROR PROCESSING AND EXIT ;**-3 GXXX: RETURN $ATE27:: MOV #ERR27,R0 ; STRING SUBSTITUTION ERROR ;HJL007 BR $ATERR ; ;HJL007 $ATE26:: MOV #ERR26,R0 ; SYMBOL TYPE ERROR ;HJL007 BR $ATERR ; ;HJL007 $ATE25:: MOV #ERR25,R0 ; REDEFINING SYMBOL TO DIFFERENT TYPE ;HJL007 BR $ATERR ; ;HJL007 $ATE24:: MOV #ERR24,R0 ; DATA FILE ERROR ;HJL007 BR $ATERR ; ;HJL007 $ATE23:: MOV #ERR23,R0 ; REDEFINING SPECIAL SYMBOL BR $ATERX ; $ATE22:: MOV #ERR22,R0 ; BINARY OPERATOR ERROR BR $ATERX ; $ATE21:: MOV #ERR21,R0 ; UNDEFINED LABEL BR $ATERX ; $ATE20:: MOV #ERR20,R0 ; TASK NOT IN SYSTEM BR $ATERR ; $ATE19:: MOV #ERR19,R0 ; UNDEFINED SYMBOL BR $ATERR ; $ATE18:: MOV #ERR18,R0 ; INVALID ANSWER BR $ATERR ; $ATE17:: MOV #ERR17,R0 ; SYMBOL TABLE OVERFLOW BR $ATERX ; $ATE15:: BITB #1,LSTCMD ; (PRINT OFF?) BEQ GXXX ; IF SO RETURN NOW... MOV #ERR15,R0 ; DELAYING BR $ATERR ; $ATE14:: BITB #1,LSTCMD ; PRINT OFF? BEQ GXXX ; YES, BRANCH MOV #ERR14,R0 ; CONTINUING BR $ATERR ; $ATE13:: BITB #1,LSTCMD ; PRINT OFF? BEQ GXXX ; YES, RETURN MOV #ERR13,R0 ; PAUSING BR $ATERR ; $ATE12:: MOV #ERR12,R0 ; BAD COMMAND OR SYNTAX BR $ATERR ; $ATE10:: MOV #ERR10,R0 ; EOF INC EXFLG ; SET TO EXIT ;HJL024 BR $ATERX ; $ATER8:: MOV #ERR8,R0 ; MULTI-LEVEL INDIRECTION BR $ATERX ; $ATER7:: MOV #ERR7,R0 ; RECORD > 80. BYTES BR $ATERX ; $ATER6:: MOV #ERR6,R0 ; READ ERROR BR $ATERX ; $ATER5:: MOV #ERR5,R0 ; NO POOL SPACE BR $ATERX ; $ATER4:: MOV #ERR4,R0 ; FILE NOT FOUND BR $ATERX ; $ATER2:: MOV #ERR2,R0 ; SYNTAX ERROR $ATERX: CLR $ERLBL ; SET SO NO ERROR PROCESSING IS ALLOWED $ATERR: CLR $TIBUF+4 ; SET NO CARRIAGE CONTROL $ATER: MOV R0,$TIBUF ; SET BUFFER ADDRESS IN DPB CLR R1 ; ZERO MESSAGE LENGTH 10$: TSTB (R0)+ ; IS NEXT CHARACTER ZERO? BEQ 20$ ; YES, IT'S END OF MESSAGE INC R1 ; NO, INCREMENT MESSAGE LENGTH BR 10$ ; LOOP 20$: MOV R1,$TIBUF+2 ; SET LENGTH OF BUFFER MOV #IO.WVB,$TIDPB+2 ; SET WRITE FUNCTION CODE .IF DF R$$11D ;JMM031 MOV $TIBUF+4,-(SP) ; SAVE CCW ;JMM031 MOV #'+,$TIBUF+4 ; SET FOR CR AT END ;JMM031 .IFTF ;JMM031 CALL $TIIO ; ISSUE WRITE .IFT ;JMM031 MOV (SP)+,$TIBUF+4 ; RESTORE CCW ;JMM031 .ENDC ;JMM031 BCS $INRLS ; ERROR TST EXFLG ; EXIT (EOF)? ;HJL024 BNE 60$ ; YES ;HJL024 TST $SBFLG ; IS IT OPERATOR ERROR? ;HJL024 BMI 60$ ; YES, DON'T PRINT COMMAND LINE ;HJL024 MOV #CARRET,$TIBUF ; SET BUFFER ADDRESS ;HJL024 MOV #1,$TIBUF+2 ; SET CHARACTERS TO WRITE ;HJL024 CALL $TIIO ; WRITE IT OUT ;HJL024 MOV #40,$TIBUF+4 ; SET NORMAL CARRIAGE CONTROL ;HJL024 MOV #LINBUF,R0 ; GET INPUT BUFFER ADDRESS ;HJL024 MOV R0,$TIBUF ; STORE IT IN DPB ;HJL024 30$: TSTB (R0)+ ; END OF BUFFER ;HJL024 BNE 30$ ; NO, LOOP ;HJL024 SUB $TIBUF,R0 ; COMPUTE NUMBER OF CHARACTERS ;HJL024 MOV R0,$TIBUF+2 ; SET IT IN DPB ;HJL024 CALL $TIIO ; WRITE IT OUT ;HJL024 TST $SBFLG ; DID SUBSTITUTION OCCUR? ;HJL024 BEQ 55$ ; NO, NO NEED TO PRINT NEW LINE ;HJL024 MOV #CMDBUF,R0 ; GET COMMAND BUFFER ADDRESS ;HJL024 MOV R0,$TIBUF ; SET BUFFER ADDRESS ;HJL024 MOV #80.,R1 ; SET MAX CHARACTERS IN LINE ;HJL024 40$: CMPB (R0)+,#15 ; EOL? ;HJL024 BEQ 50$ ; YES ;HJL024 DEC R1 ; DONE ? ;HJL024 BGT 40$ ; NO, LOOP ;HJL024 50$: SUB $TIBUF,R0 ; COMPUTE NUMBER OF CHARACTERS ;HJL024 MOV R0,$TIBUF+2 ; SET IT IN DPB ;HJL024 CALL $TIIO ; PRINT IT OUT ;HJL024 55$: CLR $TIBUF+4 ; RESTORE CARRIAGE CONTROL TO NULL ;HJL024 60$: ;HJL024 CLR $SBFLG ; RESET SUBSTITUTION FLAG TO NULL ;HJL024 .IF NDF R$$11D ;JMM031 CALL $PRMPT ; ISSUE PROMPT ;JMM031 .ENDC ;JMM031 ; ;HJL024 ; CLEAN UP BEFORE EXITING ;HJL024 ; ;HJL024 $INRLS:: ;HJL024 $INXIT:: TST $CMDFL ; AT. COMMAND IN PROGRESS? ;**-10 BEQ 10$ ; NO CLR $CMDFL ; YES, ZERO FLAG .IF DF R$$11D ;JMM031 CMP @SP,#$$PAUS ; WAS THIS CALL FROM '$PAUSE'? ;JMM031 BEQ 5$ ; YES -- DON'T PROMPT ;JMM031 CALL $PRMPT ; NO -- ISSUE PROMPT ;JMM031 5$: ;JMM031 .ENDC ;JMM031 RETURN ; RETURN 10$: BIT #ERPROC,.LIFLG ; PROCESSING AN ERROR? BNE 20$ ; YES TST $ERLBL ; NO, IS ERROR ROUTINE SPECIFIED? BEQ 20$ ; NO .IF DF R$$11D ;JMM031 CALL $PRMPT ; ISSUE PROMPT ;JMM031 .ENDC ;JMM031 BIS #ERPROC!SKIP,.LIFLG ; YES, SET LOOKING FOR LABEL MOV $ERLBL,$LABL ; SET UP LABEL TO SEARCH FOR MOV $ERLBL+2,$LABL+2 ; MOV $ERLBL+4,$LABL+4 ; JMP $SERCH ; START SEARCH 20$: CLOSE$ #$GCML ; CLOSE FILE CLOSE$ #$DATF ; CLOSE DATA FILE IF OPEN ;HJL007 INEXIT: ;JMM031 .IF NDF R$$11D ;JMM031 MOV $TKTCB,R1 ; GET OUR TCB ADDRESS ;JMM031 BIC #T3.MCR,T.ST3(R1) ; CLEAR OUR MCR FLAG ;HJL025 .ENDC ;JMM031 EXIT$S ; EXIT ;JMM031 .END $INDEP ;**-3