.TITLE INDSUB - INDIRECT FILE PROCESSOR SUBROUTINES .IDENT /30DEC7/ ;MPK001 ; ;**-1 ; ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE ; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION ; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT ; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ;VERSION: 30DEC7 ;MPK001 ; BY: H.LEV ;**-1 ; DATE: 6/16/75 THIS MODULE WAS CREATED BY BREAKING OFF THE ; SUBROUTINES FROM MODULE INDRCT ; ;HJL007 ; HJL007 4/9/76 ADD OPEN, CLOSE, DATA, ENABLE, AND DISABLE ;HJL007 ; ;HJL007 ; HJL024 2/15/76 ADD STRING SUBSTITUTION ;HJL007 ; ;HJL007 ; JMM031 6/11/76 INCLUDE RSX-11D CONDITIONAL CODE ;JMM031 ; ;JMM031 ; ;JMM031 ; RSK001 01-DEC-76 R. KITTELL, LASL MP-3 -- PURE PSECT ; MPK001 30-DEC-77 ADD GLOBAL SYMBOL CAPABILITY AND FIXES ; FROM 11M V3 RELEASE VERSION ; CHAGE PSEUDO-PROMPT FOR 11D FROM 'MCR>' TO '@@@>' ; TO HELP AVOID OPERATOR CONFUSION ; ; THIS PROGRAM PROVIDES A MEANS OF GIVING MCR COMMANDS FROM ;**-1 ; A FILE. ; ; ; MACRO LIBRARY CALLS ; .MCALL DIR$,RETURN,WTSE$S .MCALL WSIG$S ; ; 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 STRING LENGTH ;HJL024 ; ;HJL024 ; SYMBOL TYPE ;HJL024 ; ;HJL024 TF = 1 ; LOGICAL ;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 ; LOCAL DATA ; COMFLG: .WORD 0 ; COMMENT FLAG 0=NONE, 1=COMMENT IN PROGRESS ;HJL025 ;JMM031 .IF DF R$$11D ;JMM031 ;JMM031 BITPAT: .WORD 77,0 ; NULL TASK BIT PATTERN ;JMM031 .PSECT PURE,RO,I,GBL,CON ;RSK001 $PMPT:: .ASCIZ <15><12>/@@@>/ ; PROMPT STRING ;MPK001 .EVEN .PSECT ;RSK001 ;JMM031 .IFF ;JMM031 ;JMM031 BITPAT: .WORD 7760 ; NULL BIT PATTERN $PMPT:: .ASCIZ <15><12>/>/ ; PROMPT STRING ; ; SPECIAL SYMBOL TABLE ; THESE ARE SYMBOLS BARCKETED BY <> ; SPCTAB: .ASCII /MAPPED/ ; .BYTE TF ; SYMBOL TYPE ;HJL024 .IF DF M$$MGE .BYTE 1 ; .IFF .BYTE 0 ; .ENDC ;JMM031 .IFT ;JMM031 ;JMM031 SPCTAB: .ASCII /RSX11D/ ; SPECIAL SYMBOL FOR RSX-11D ;JMM031 .BYTE TF,1 ;JMM031 ;JMM031 .ENDC ;JMM031 SPCEND: .EVEN .SBTTL SUBROUTINES ;+ ; *** - $NULSB THIS SUBROUTINE SIMULATES THE NULL TASK ; ;- .PSECT PURE $NULSB:: ;JMM031 .IF DF R$$11D ;JMM031 MOVB BITPAT+2,@#177776 ; RESTORE CARRY ;JMM031 MOV BITPAT,R0 ; GET PATTERN ;JMM031 ROR R0 ; MAKE THE LIGHTS MOVE ;JMM031 .IFF ;JMM031 ASLB BITPAT+1 ; MAKE THE ;JMM031 RORB BITPAT ; LIGHTS MOVE ;**-1 ADCB BITPAT+1 ; MOV BITPAT,R0 ; DISPLAY IT ON AN 11/45 WAIT ; WAIT ; .IFTF ;JMM031 WAIT ; WAIT ; .IFT ;JMM031 MOV R0,BITPAT ; SAVE PATTERN FOR NEXT TIME ;JMM031 MOV @#177776,BITPAT+2 ; SAVE CARRY TOO ;JMM031 .ENDC ;JMM031 RETURN ; ;+ ; *** - $CMPAR - COMPARES TWO STRINGS ; ; INPUT: ; R2 - TEMPLATE, ENDS WITH ZERO BYTE ; R3 - STRING TO BE COMPARED ; ; OUTPUT: ; CARRY CLEAR ; R2 - END OF STRING ; R3 - UPDATED PAST LAST CAHARCTER OF STRING ; CARRY SET ; R2 - CHARACTER AFTER FIRST NON-MATCHING ONE ; R3 - CHARACTER AFTER FIRST NON-MATCHING ONE ; ;- $CMPAR:: CMPB (R3)+,(R2)+ ; DO THEY MATCH? SEC ; ASSUME NO MATCH BNE 10$ ; NO TSTB (R2) ; END OF STRING? BNE $CMPAR ; NO, LOOP 10$: RETURN ; ;+ ; *** - $MOVE - MOVE CHARACTERS INTO BUFFER ; ; INPUT: ; R1 - OUTPUT BUFFER POINTER ; R2 - INPUT BUFFER POINTER - ENDS IN ZERO BYTE ; ; OUTPUT: ; R1, R2 - UPDATED ; ;- .ENABL LSB 10$: MOVB (R2)+,(R1)+ ; MOVE CHARACTER $MOVE:: TSTB (R2) ; END OF STRING? BNE 10$ ; NO, GET NEXT CHARACTER RETURN ; .DSABL LSB ;+ ; *** - $GOTST - TEST FOR CONDITIONS TO PROCESS REST OF LINE ; ; OUTPUT: ; CARRY CLEAR - OKAY TO GO ; CARRY SET - SKIP REST OF LINE ;- $GOTST:: SEC ; ASSUME NO GO BIT #LGCL,$LOGFL ; BINARY OPERATOR IN PROGRESS BNE 10$ ; YES BIT #GO,$LOGFL ; NO, CONDITIONS TRUE FOR GO? BEQ 10$ ; NO CLC ; YES 10$: RETURN ; ;+ ; *** - $GTLBL - GET LABEL FROM BUFFER ; ; INPUT: ; R0 - BUFFER ADDRESS ; ; OUTPUT: ; R0 - BUFFER UPDATED ; R1 - USED ; R2 - USED ; R3 - USED ; CARRY CLEAR - GOT A GOOD LABEL ; CARRY SET - SYNTAX ERROR ;- $GTLBL:: CALL $GNBLK ; GET NEXT NON-BLANK BCS 40$ ; EOL IS ERROR TST R1 ; BLANK SEEN? BEQ 40$ ; NO, ERROR 10$: MOV #$LABL,R3 ; GET ADDRESS OF SEARCH ARGUMENT 20$: CMP R3,#$LBLND ; END OF LABEL? BEQ 50$ ; YES, USE FIRST SIX CHARACTERS MOVB R2,(R3)+ ; STORE NEXT CHARACTER CALL $GNBLK ; GET NEXT NON-BLANK BCS 30$ ; EOL TST R1 ; BLANK? BEQ 20$ ; NO, LOOP 30$: CMP R3,#$LBLND ; END OF LABEL? BEQ 50$ ; YES CLRB (R3)+ ; ZERO OUT REST OF LABEL BR 30$ ; LOOP 40$: SEC ; SET ERROR 50$: RETURN ; ;+ ; *** - $GETTK - FIND TASK WHOSE NAME IS SPECIFIED ON COMMAND ; ; INPUT: ; R0 - BUFFER ADDRESS ; ; OUTPUT: ; R0 -BUFFER ADDRESS UPDATED ; R1 - USED ; R2 - 0 OR TCB ADDRESS (RSX-11D -- STD ADDRESS) ;JMM031 ; R3 -USED ;**-1 ; R4 - USED ; CARRY SET - SYNTAX ERROR ; CARRY CLEAR - OK ; ZERO SET - NOT INSTALLED ; ZERO CLEAR - INSTALLED ;- $GETTK:: CALL $DSPLY ; DISPLAY LINE IF NEEDED CALL $GNBLK ; GET NEXT NON-BLANK CHARACTER BCS 50$ ; EOL IS ERROR TST R1 ; ANY BLANKS? BNE 5$ ; YES, GOOD SEPARATOR SEC ; NO, ERROR BR 50$ ; 5$: DEC R0 ; POINT TO IT MOV #$TSKNM+4,R4 ; GET ADDRESS OF TASK NAME PLACE CLR -(R4) ; ZERO IT OUT CLR -(R4) ; MOV PC,R1 ; SET TO ALLOW PERIODS CALL $CAT5 ; CONVERT IT TO RAD50 MOV R1,(R4)+ ; AND STORE IT BCS 10$ ; LESS THAN 3 CHARACTERS CALL $CAT5 ; GET NEXT 3 CHARACTERS MOV R1,(R4)+ ; STORE THEM TOO BCC 20$ ; GOT 6 CHARACTERS 10$: DEC R0 ; POINT TO TERMINATOR IF NOT 20$: CLR $TSKTB ; ZERO TASK TCB ADDRESS MOV R0,-(SP) ; SAVE BUFFER POINTER .IF DF R$$11D ;JMM031 MOV $TSKNM,TSKNAM+2 ; GET TASK NAME ;JMM031 MOV $TSKNM+2,TSKNAM+4 ; TWO WORDS ;JMM031 MOV #TSKNAM+2,R1 ; GET ADDRESS OF TASK NAME ;JMM031 CALL ..FSTD ; LOOK FOR TASK IN STD ;JMM031 BNE 30$ ; FOUND TASK IF NE 0 ;JMM031 TST TSKNAM+4 ; NOT FOUND -- IS IT MCR TASK? ;JMM031 BNE 30$ ; NO IF SECOND HALF NE 0 ;JMM031 MOV #TSKNAM,R1 ; MIGHT BE -- LOOK FOR IT ;JMM031 CALL ..FSTD ; CHECK STD ;JMM031 30$: ;JMM031 MOV R2,R0 ; R2=0 IF NOT INSTALLED ;JMM031 .IFF ;JMM031 MOV #$TSKNM,R3 ; POINT TO TASK NAME CALL $GTTSK ; SEARCH FOR TASK TCB BCS 40$ ; NOT IN SYSTEM .ENDC ;JMM031 MOV R0,$TSKTB ; SAVE TCB ADDRESS 40$: MOV (SP)+,R0 ; RESTORE BUFFER POINTER CALL $GNBLK ; GET NEXT NON-BLANK ;HJL024 DEC R0 ; BACK UP TO FIRST NON-BLANK ;HJL024 MOV $TSKTB,R2 ; GET TCB ADDRESS CLC ; NO SYNTAX ERROR 50$: RETURN ; ;+ ; *** - $SRSYM - SEARCH SYMBOL TABLE ; IF SPCSYM IN .LIFLG IS SET, SEARCH SPECIAL SYMBOL TABLE ; ; INPUT: ; $CRNTS - SYMBOL WE'RE LOOKING FOR ; ; OUTPUT: ; R4 - FIRST FREE HOLE ; CARRY SET ; R5 - END OF SYMBOL TABLE ; CARRY CLEAR ; R5 - ENTRY FOR SYMBOL ; ;- $SRSYM:: BIT #SPCSYM,.LIFLG ; SEARCHING FOR SPECIAL SYMBOL? BEQ 5$ ; NO MOV #SPCTAB,R5 ; YES SET START OF TABLE MOV #SPCEND,R4 ; SET END OF TABLE BR 10$ ; 5$: MOV $SYMND,R5 ; START OF GLOBAL SYMBOL TABLE ;MPK001 MOV $GSYME,R4 ; END OF SAME ;MPK001 CALL 10$ ; TRY TO FIND SYMBOL IN GLOBAL TABLE ;MPK001 BCC 30$ ; FOUND - EXIT ;MPK001 ; ELSE TRY LOCAL SYMBOL TABLE ;MPK001 MOV $SYMTB,R5 ; START OF LOCAL TABLE ;MPK001 MOV $SYMFR,R4 ; SET ADDRESS OF FREE SPACE 10$: CMP R5,R4 ; END OF DEFINED SYMBOLS? BHIS 25$ ; YES MOV #$CRNTS,R2 ; POINT TO SYMBOL WE'RE LOOKING FOR MOV R5,R3 ; COPY ENTRY ADDRESS CALL $CMPAR ; DO THEY MATCH? BCS 20$ ; NO SUB R5,R3 ; YES, COMPUTE LENGTH OF SYMBOL CMP R3,#SYMSIZ ; IS IT MAX LENGTH BEQ 30$ ; YES ADD R5,R3 ; NO, GET ADDRESS OF SYMBOL TSTB (R3) ; END OF IT? BEQ 30$ ; YES 20$: MOV #SYMSIZ+2,R3 ; DEFAULT TO LOGICAL OR NUMERIC ;HJL024 CMPB #TF,SYMSIZ(R5) ; IS IT LOGICAL? ;HJL024 BEQ 23$ ; YES ;HJL024 CMPB #NUM,SYMSIZ(R5) ; NO, IS IT NUMERIC? ;HJL024 BEQ 23$ ; YES ;HJL024 MOV #SYMSIZ+STRLEN+1,R3 ; NO, IT MUST BE STRING ;HJL024 23$: ADD R3,R5 ; POINT TO NEXT ENTRY ;HJL024 BR 10$ ; LOOP ;**-1 25$: SEC ; YES, SET NOT FOUND 30$: RETURN ; ;+ ; *** - $DSPLY DISPLAY COMMAND LINE ; ; INPUT: ; $LINDS=0 LINE SHOULD BE DISPLAYED ; $LINDS<>0 LINE ALREADY DISPLAYED ; ; ASSUMES $TIDPB IS SET UP FOR WRITE VIRTUAL ; ;- $DSPLY:: BIT #NOTRAC,.LIFLG ; IN TRACE MODE? BNE 10$ ; NO TST $LINDS ; LINE DISPLAYED? BNE 10$ ; YES MOVB #'!,@$TIBUF ; NO, TREAT AS COMMENT CALL $TIIO ; WRITE IT OUT INC $LINDS ; SHOW LINE IS DISPLAYED MOV $TIBUF,-(SP) ; SAVE BUFFER ADDRESS MOV $TIBUF+2,-(SP) ; SAVE BUFFER LENGTH CALL $PRMPT ; ISSUE PROMPT MOV (SP)+,$TIBUF+2 ; AND RESTORE BUFFER LENGTH MOV (SP)+,$TIBUF ; AND BUFFER ADDRESS 10$: RETURN ; ;+ ; *** - $GTSYM -- GET SYMBOL FROM INPUT BUFFER ; SPECIAL SYMBOLS ARE DEFINED BY BEING BRACKETED WITH <> ; ; INPUT: ; R0 - ADDRESS OF INPUT STRING ; ; OUTPUT: ; R0 - UPDATED ; $CRNTS - SYMBOL ; CARRY CLEAR SYNTAX GOOD ; CARRY SET - SYNTAX BAD ; SPCSYM IN .LIFLG IS SET IF SYMBOL IS A SPECIAL ; ;- $GTSYM:: MOV #SYMSIZ,R4 ; GET MAX SYMBOL LENGTH ;HJL024 MOV #$CRNTS,R5 ; POINT TO CURRENT SYMBOL AREA ;**-1 BIC #SPCSYM!STRNG,.LIFLG ; CLEAR SPECIAL FLAGS ;HJL024 10$: CLRB (R5)+ ; ZERO IT OUT ;**-1 DEC R4 ; DONE? BNE 10$ ; NO, LOOP MOV #SYMSIZ,R4 ; GET SYMBOL SIZE MOV #$CRNTS,R5 ; GET SYMBOL AREA ADDRESS CALL $GNBLK ; GET NEXT NON-BLANK BCS 50$ ; EOL IS SYNTAX ERROR ;HJL024 CMPB R2,#'' ; STRING SYMBOL? ;HJL024 BNE 15$ ; NO ;HJL024 BIS #STRNG,.LIFLG ; YES, SET FLAG ;HJL024 BR 20$ ; ;HJL024 15$: TST R1 ; A BLANK SEEN ;HJL024 BEQ 40$ ; NO, SYNTAX ERROR ;**-2 CMPB R2,#'< ; YES, START OF A SPECIAL SYMBOL? BNE 17$ ; NO ;HJL024 BIS #SPCSYM,.LIFLG ; YES, SET SPECIAL SYMBOL FLAG ;**-1 BR 20$ ; 17$: MOVB R2,(R5)+ ; STORE FIRST CHARACTER ;HJL024 DEC R4 ; ANY MORE SPACE ;**-1 20$: CALL $GNBLK ; GET NEXT CHARACTER BCS 36$ ; EOL ;HJL024 TST R1 ; BLANK SEEN? ;**-1 BNE 35$ ; YES ;HJL024 CMPB #'',R2 ; END OF STRING SYMBOL? ;HJL024 BEQ 24$ ; YES ;HJL024 CMPB R2,#'> ; END OF SPECIAL SYMBOL? ;**-1 BEQ 23$ ; YES ;HJL024 MOVB R2,(R5)+ ; NO, STORE CHARACTER ;**-1 DEC R4 ; DONE? BGT 20$ ; NO, GET NEXT CHARACTER BIT #SPCSYM,.LIFLG ; SPECIAL SYMBOL? ;HJL024 BEQ 26$ ; NO ;HJL024 CMPB (R0)+,#'> ; YES, DOES IT END CORRECTLY? ;**-2 BNE 40$ ; NO BR 37$ ; YES ;HJL024 23$: CMPB (R0),#40 ; YES, NEXT CHARACTER A BLANK ;HJL024 BNE 40$ ; NO, SYNTAX ERROR ;**-1 BR 50$ ; YES 24$: BIT #STRNG,.LIFLG ; STRING SYMBOL? ;HJL024 BEQ 40$ ; NO ;HJL024 BNE 37$ ; YES ;HJL024 26$: BIT #STRNG,.LIFLG ; STRING SYMBOL? ;HJL024 BEQ 37$ ; NO ;HJL024 CMPB (R0)+,#'' ; YES, END CORRECTLY? ;HJL024 BNE 40$ ; NO ;HJL024 BR 37$ ; YES ;HJL024 35$: DEC R0 ; BACK OFF TO CURRENT CHARACTER ;HJL024 36$: DEC R0 ; BACK OFF TO PREVIOUS SPACE ;HJL024 BIT #SPCSYM!STRNG,.LIFLG ; STRING OR SPECIAL IN PROGRESS ;HJL024 BNE 40$ ; YES, ERROR ;**-3 37$: CLC ; ;HJL024 BR 50$ ; ;**-1 40$: SEC ; SET ERROR FLAG 50$: RETURN ; ;+ ; *** - $PRSYM - PARSE SYMBOL NAME FROM COMMAND, SEARCH SYMBOL ; TABLE FOR IT, IF FOUND USE IT, IF NOT FOUND ; MAKE ENTRY IN TABLE. IF ERRORS ARE FOUND ; EXIT DIRECTLY TO ERROR ROUTINE. ; ; INPUT: ; R0 - BUFFER POINTER ; ; OUTPUT: ; R0 - UPDATED BEYOND SYMBOL ; R5 - SYMBOL TABLE ENTRY ADDRESS ; ERRORS EXIT DIRECTLY TO ERROR ROUTINE - THEREFORE ; A CALL TO THIS ROUTINE MAY COME ONLY FROM DIRECT ; CODE. NOT FROM A SUBROUTINE. ; ;- $PRSYM:: CALL $GOTST ; CAN WE GO? BCC 2$ ; YES TST (SP)+ ; NO, POP RETURN ADDRESS JMP $INDRD ; GET NEXT LINE 2$: CALL $GTSYM ; GET SYMBOL BCC 5$ ; OKAY TST (SP)+ ; POP RETURN ADDRESS JMP $SYNER ; SYNTAX ERROR 5$: BIT #SPCSYM,.LIFLG ; TRYING TO REDEFINE SPECIAL SYMBOL? BEQ 6$ ; NO TST (SP)+ ; YES, POP RETURN ADDRESS JMP $ATE23 ; ERROR 6$: CALL $SRSYM ; SEARCH SYMBOL TABLE FOR SYMBOL BCS 601$ ; DIDN'T FIND IT ;HJL024 CMPB $SYMTP,SYMSIZ(R5) ; SYMBOL TYPES MATCH ;HJL024 BEQ 600$ ; YES ;HJL024 TST (SP)+ ; NO, SYMBOL BE REDEFINED ;HJL024 JMP $REDEF ; ISSUE ERROR ;HJL024 600$: CALL GETSIZ ; GET SIZE OF SYMBOL ENTRY ;HJL024 BR 10$ ; ;HJL024 601$: CALL GETSIZ ; GET SIZE OF SYMBOL ENTRY ;MPK001 CMPB $CRNTS,#'$ ; WAS FIRST CHAR. IN SYMBOL NAME "$"? ;MPK001 BNE 603$ ; N - JUMP ;MPK001 BIT #DEFGLS,.LIFLG ; Y - GLOBAL SYMBOLS ENABLED? ;MPK001 BEQ 603$ ; N - JUMP ;MPK001 MOV $SYMND,R5 ; Y - GET START OF GLOBAL SYMBOL TABLE ;MPK001 SUB R2,R5 ; EXPAND IT DOWNWARDS ;MPK001 CMP R5,$SYMFR ; OVERFLOWED INTO LOCAL SYMBOL TABLE? ;MPK001 BLO 604$ ; Y - JUMP ;MPK001 MOV R5,$SYMND ; N - OK, SET NEW END OF LOCAL TABLE ;MPK001 BR 10$ ;MPK001 603$: MOV R4,R5 ; GET START OF LOCAL SYMBOL TABLE ;MPK001 ; AND ENTER SYMBOL THERE ;MPK001 ADD R2,R4 ; POINT TO FREE AREA ;MPK001 CMP R4,$SYMND ; ANY SPACE LEFT? ;**-1 BLO 7$ ; YES 604$: ;MPK001 TST (SP)+ ; NO, POP RETURN ADDRESS JMP $SMOFL ; SYMBOL TABLE OVERFLOW 7$: MOV R4,$SYMFR ; SET ADDRESS OF NEXT FREE SLOT ;HJL024 ; ;**-2 ; SLOT FOUND ; 10$: MOV R5,R1 ; GET ADDRESS OF TABLE ENTRY 15$: CLRB (R1)+ ; ZERO IT OUT ;**-1 DEC R2 ; DONE? BNE 15$ ; NO, LOOP MOV #$CRNTS,R2 ; YES, POINT TO SYMBOL NAME MOV R5,R1 ; COPY SYMBOL TABLE ADDRESS CALL $MOVE ; MOVE SYMBOL INTO TABLE ADD #SYMSIZ,R5 ; POINT TO SYMBOL TYPE ;HJL024 MOVB $SYMTP,(R5)+ ; SET IT AND POINT TO SYMBOL VALUE ;HJL024 CALL $DSPLY ; DISPLAY COMMAND ;**-1 RETURN ; ;+ ; *** - $TIIO - PERFORM I/O TO TI: ; ; INPUT: ; $TIDPB - SET UP CORRECTLY FOR I/O USING EFN1 ; ; OUTPUT: ; CARRY CLEAR - I/O COMPLETE ; CARRY SET - I/O ERROR ; ;- $TIIO:: DIR$ #$TIDPB ; ISSUE QIO BCC 10$ ; NO ERROR CMP #IE.UPN,$DSW ; OUT OF POOL SPACE? BNE 20$ ; NO, OTHER ERROR BR 15$ ; YES 10$: WTSE$S #EFN1 ; WAIT FOR DONE BCC 16$ ; OKAY CMP #IE.NOD,$TIOST ; ERROR, OUT OF POOL SPACE? BNE 20$ ; NO, OTHER I/O ERROR 15$: WSIG$S ; YES, WAIT FOR SPACE TO BECOME AVAILBLE BR $TIIO ; LOOP 16$: CMP #IE.EOF,$TIOST ; END-OF-FILE? BNE 30$ ; NO 20$: SEC ; SET ERROR 30$: RETURN ; ;+ ; *** - $PRMPT - ISSUE MCR COMMAND PROMPT ; ;- $PRMPT:: MOV #$PMPT,$TIBUF ; SET ADDRESS OF PROMPT STRING .IF DF R$$11D ;JMM031 MOV #6,$TIBUF+2 ; SET LENGTH OF STRING ;JMM031 .IFF ;JMM031 MOV #3,$TIBUF+2 ; SET LENGTH OF STRING .ENDC ;JMM031 CALL $TIIO ; PRINT IT RETURN ; RETURN ;+ ;HJL024 ; *** - $STRSB - STRING SUBSTITUTION ;HJL024 ; ;HJL024 ; INPUT: ;HJL024 ; R0 - INPUT BUFFER (WITH POSSIBLE STRING SYMBOLS) ;HJL024 ; R1 - OUTPUT BUFFER ;HJL024 ; ;HJL024 ; OUTPUT: ;HJL024 ; R0 - END OF INPUT STRING ;HJL024 ; R1 - END OF OUTPUT STRING (STRINGS SUBSTITUTED FOR SYMBOLS) ;HJL024 ; CARRY - SET: STRING OVERFLOW OR SYNTAX ERROR ;HJL024 ; CARRY - CLEAR: OKAY ;HJL024 ;- ;HJL024 $STRSB:: CLR COMFLG ; SET NO COMMENT IN PROGRESS ;HJL024 CMPB (R0),#'; ; COMMENT? ;HJL024 BNE 5$ ; NO ;HJL024 DEC COMFLG ; YES, SET LINE COMMENT ;HJL024 5$: MOVB (R0)+,R2 ; GET NEXT CHARACTER ;HJL024 BEQ 50$ ; ZERO IS END OF LINE ;HJL024 BIT #DEFSUB,.LIFLG ; IS SUBSTRITUTION ENABLED? ;HJL024 BEQ 40$ ; NO ;HJL024 CMPB R2,#'! ; YES, COMMENT FLAG? ;MPK001 BNE 7$ ; NO ;HJL024 TST COMFLG ; YES, COMMENT IN PROGRESS? ;HJL024 BMI 7$ ; YES, FOR WHOLE LINE ;HJL024 BGT 6$ ; NO, END OF COMMENT ;HJL024 INC COMFLG ; SET START OF COMMENT ;HJL024 BR 7$ ; ;HJL024 6$: DEC COMFLG ; SET NO COMMENT IN PROGRESS ;HJL024 7$: CMPB R2,#'' ; BEGINNING OF STRING SYMBOL? ;HJL024 BNE 40$ ; NO ;HJL024 CMPB (R0),#'' ; IS NEXT CHARACTER APOSTROPHE? ;HJL024 BNE 10$ ; NO ;HJL024 MOVB (R0)+,R2 ; YES, GET IT ;HJL024 BR 40$ ; AND PUT IT IN THE LINE ;HJL024 10$: INC $SBFLG ; SET FLAG THAT SUBSTITUTION OCCURED ;HJL024 MOVB #15,(R1) ; SET TEMPORARY END OF COMMAND BUFFER ;HJL024 DEC R0 ; BACKUP OVER SINGLE QUOTE ;HJL024 MOV R0,-(SP) ; SAVE INPUT BUFFER ADDRESS ;HJL024 MOV R1,-(SP) ; SAVE OUTPUT BUFFER ADDRESS ;HJL024 CALL $GTSYM ; GET SYMBOL ;HJL024 BCC 15$ ; OKAY ;MPK001 MOV (SP)+,R1 ; RESTORE R1 ;MPK001 13$: MOV (SP)+,R0 ; RESTORE INPUT BUFFER ADDRESS ;MPK001 MOVB (R0)+,R2 ; GET CHARACTER FROM BUFFER ;HJL024 TST COMFLG ; COMMENT IN PROGRESS? ;HJL024 BNE 40$ ; YES, SKIP SYNTAX ERROR ;HJL024 BR 60$ ; NO, WE GOT A SYNTAX ERROR ;HJL024 15$: CALL $SRSYM ; SEARCH SYMBOL TABLE FOR SYMBOL ;MPK001 MOV (SP)+,R1 ; RESTORE R1 ;HJL024 BCS 13$ ; UNDEFINED SYMBOL ;MPK001 TST (SP)+ ; CLEAN STACK ;MPK001 CMPB SYMSIZ(R5),#STR ; IS IT A STRING SYMBOL? ;HJL024 BNE 60$ ; NO ;HJL024 MOV #STRLEN,R3 ; SET MAX STRING SIZE ;HJL024 ADD #SYMSIZ+1,R5 ; GET ADDRESS OF STRING ;HJL024 20$: MOVB (R5)+,R2 ; GET CHARACTER FROM STRING ;HJL024 BEQ 5$ ; ZERO IS END ;HJL024 30$: DEC $LINLN ; ROOM FOR ANOTHER CHARACTER? ;HJL024 BMI 60$ ; NO, ERROR ;HJL024 MOVB R2,(R1)+ ; YES, STORE IN OUTPUT BUFFER ;HJL024 DEC R3 ; ANY MORE CHARACTERS TO GET IN STRING? ;HJL024 BGT 20$ ; YES, GET NEXT ONE ;HJL024 BR 5$ ; NO, GET NEXT ONE FROM INPUT BUFFER ;HJL024 40$: MOV #1,R3 ; SET ONLY ONE CHARACTER TO MOVE ;HJL024 BR 30$ ; ;HJL024 50$: CLC ; SET SUCCESS ;HJL024 BR 70$ ; ;HJL024 60$: SEC ; SET ERROR ;HJL024 70$: RETURN ; ;HJL024 ;HJL024 ;+ ;HJL024 ; *** - GETSIZ - GET SIZE OF SYMBOL ENTRY ;HJL024 ; ;HJL024 ; INPUT: ;HJL024 ; $SYMTP - SYMBOL TYPE ;HJL024 ; OUTPUT: ;HJL024 ; R2 - SIZE IN BYTES OF SYMBOL TABLE ENTRY ;HJL024 ;- ;HJL024 GETSIZ: MOV #SYMSIZ+2,R2 ; DEFAULT TO LOGICAL OR NUMERIC ;HJL024 CMPB #TF,$SYMTP ; IS IT LOGICAL? ;HJL024 BEQ 10$ ; YES ;HJL024 CMPB #NUM,$SYMTP ; NO, IS IT NUMERIC? ;HJL024 BEQ 10$ ; YES ;HJL024 MOV #SYMSIZ+STRLEN+1,R2 ; NO, IT MUST BE STRING ;HJL024 10$: RETURN ; ;HJL024 ;HJL024 ;HJL024 ;HJL024 ;+ ;HJL024 ; *** - $TBSRC - SEARCH STRING TABLE FOR MATCH WITH INPUT BUFFER ;HJL024 ; INPUT: ;HJL024 ; R0 - BUFFER ADDRESS ;HJL024 ; R2 - START OF TABLE, TABLE ENTRIES END WITH ZERO BYTE AND TABLE ;HJL024 ; ENDS WITH ZERO BYTE ;HJL024 ; ;HJL024 ; OUTPUT: ;HJL024 ; R1 - INDEX INTO TABLE*2 ;HJL024 ; CARRY CLEAR MATCH FOUND ;HJL024 ; R0 - UPDATED ;HJL024 ; CARRY SET NO MATCH FOUND ;HJL024 ; R0 - UNCHANGED ;HJL024 ;- ;HJL024 $TBSRC:: CLR R1 ; ZERO TABLE INDEX ;HJL024 10$: MOV R0,R3 ; COPY BUFFER POINTER ;HJL024 CALL $CMPAR ; IS THIS A MATCH? ;HJL024 BCC 30$ ; YES ;HJL024 20$: TSTB (R2)+ ; NO, SKIP TO NEXT COMMAND ;HJL024 BNE 20$ ; ;HJL024 TST (R1)+ ; UPDATE INDEX BY TWO ;HJL024 TSTB (R2) ; END OF TABLE? ;HJL024 BNE 10$ ; NO, TRY NEXT ENTRY ;HJL024 SEC ; YES, ERROR ;HJL024 BR 40$ ; ;HJL024 30$: MOV R3,R0 ; UPDATE R0 ;HJL024 40$: RETURN ; ;HJL024 ;JMM031 .IF DF R$$11D ;JMM031 ;JMM031 ;+ ;JMM031 ; *** - $GTTSK - SEARCH FOR A TASK IN ATL AND MRL'S ;JMM031 ; ;JMM031 ; ;JMM031 ; INPUT: ;JMM031 ; R3 -- ADDRESS OF 2 WORD TASK NAME ;JMM031 ; ;JMM031 ; ;JMM031 ; OUTPUT: ;JMM031 ; R0 -- ATL/MRL NODE ADDRESS IF TASK ACTIVE ;JMM031 ; CC-C -- CLEARED IF TASK ACTIVE ;JMM031 ; CC-C -- SET IF TASK NOT ACTIVE ;JMM031 ; ;JMM031 ; ;JMM031 ;- ;JMM031 ; ;JMM031 ; ;JMM031 ; ;JMM031 ; LOCAL DATA ;JMM031 ; ;JMM031 .PSECT TSKNAM: .RAD50 /... / ;JMM031 .PSECT PURE ; ;JMM031 ; ;JMM031 ; ;JMM031 ; ;JMM031 ; ;JMM031 ; ;JMM031 $GTTSK::MOV R4,-(SP) ; SAVE SOME REGISTERS ;JMM031 MOV R3,-(SP) ;JMM031 MOV R2,-(SP) ;JMM031 MOV R1,-(SP) ;JMM031 MOV (R3)+,TSKNAM+2 ; GET TASK NAME ;JMM031 MOV (R3),TSKNAM+4 ; TWO WORDS ;JMM031 MOV #TSKNAM+2,R1 ; TRY GIVEN NAME FIRST ;JMM031 CALL GETTSK ; LOOK FOR TASK ;JMM031 BCC 10$ ; CARRY CLEAR IF TASK FOUND ;JMM031 MOV #TSKNAM,R1 ; NEXT TRY "...XXX" FORM OF NAME ;JMM031 CALL GETTSK ; LOOK FOR TASK ;JMM031 10$: ;JMM031 MOV (SP)+,R1 ; RESTORE REGISTERS ;JMM031 MOV (SP)+,R2 ;JMM031 MOV (SP)+,R3 ;JMM031 MOV (SP)+,R4 ;JMM031 RETURN ; EXIT ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;+ ;JMM031 ; *** - $CKTSK - SEARCH FOR A TASK IN ATL AND MRL'S ;JMM031 ; ;JMM031 ; ;JMM031 ; INPUT: ;JMM031 ; R3 -- ADDRESS OF 2 WORD TASK NAME ;JMM031 ; ;JMM031 ; ;JMM031 ; OUTPUT: ;JMM031 ; CC-C -- CLEARED IF TASK ACTIVE ;JMM031 ; CC-C -- SET IF TASK NOT ACTIVE ;JMM031 ; ;JMM031 ; ;JMM031 ;- ;JMM031 $CKTSK::MOV R0,-(SP) ; SAVE R0 ;JMM031 CALL $GTTSK ; LOOK FOR TASK ;JMM031 MOV (SP)+,R0 ; RESTORE R0 ;JMM031 RETURN ; RETURN WITH CARRY ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;+ ;JMM031 ; *** - GETTSK - PRIVATE SUBROUTINE OF '$GTTSK' TO SEARCH ATL AND ;JMM031 ; MRL'S FOR A TASK WITH TI MATCH. ;JMM031 ; ;JMM031 ; ;JMM031 ; INPUT: ;JMM031 ; R1 -- ADDRESS OF TWO WORD TASK NAME ;JMM031 ; ;JMM031 ; ;JMM031 ; OUTPUT: ;JMM031 ; R0 -- ATL/MRL NODE ADDRESS IF TASK ACTIVE ;JMM031 ; CC-C -- CLEARED IF TASK ACTIVE ;JMM031 ; CC-C -- SET IF TASK NOT ACTIVE ;JMM031 ; ;JMM031 ; ;JMM031 ;- ;JMM031 GETTSK: CALL ..FSTD ; FIND STD ENTRY OF TASK ;JMM031 SEC ; ASSUME FAILURE ;JMM031 BEQ 20$ ; TASK NOT INSTALLED IF EQ 0 ;JMM031 MOV .CRTSK,R0 ; GET OUR ATL ADDRESS FOR TI MATCH ;JMM031 MOV #.ATLLH,R4 ; GET ATL LISTHEAD ADDRESS ;JMM031 .INH0 ; INHIBIT TASK SWITCHING ;JMM031 CALL SRCH ; SEARCH ATL ;JMM031 BCC 10$ ; TASK FOUND IF CARRY CLEAR ;JMM031 CALL FTPD ; ELSE LOOK IN MRL'S ;JMM031 10$: ;JMM031 MOV @#177776,R3 ; GET PS TO SAVE CARRY ;JMM031 .ENB0 ; ENABLE TASK SWITCHING ;JMM031 BIC #177776,R3 ; DISCARD ALL BUT CARRY BIT ;JMM031 CLC ; CLEAR CARRY BIT IN PS ;JMM031 BIS R3,@#177776 ; RESTORE CARRY ;JMM031 MOV R4,R0 ; PUT NODE ADDRESS IN R0 ;JMM031 20$: ;JMM031 RETURN ; EXIT ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;+ ;JMM031 ; *** - SRCH - PRIVATE SUBROUTINE OF 'GETTSK' TO SEARCH A LIST FOR ;JMM031 ; A TI AND STD MATCH. ;JMM031 ; ;JMM031 ; ;JMM031 ; INPUT: ;JMM031 ; R0 -- ATL ADDRESS FOR TI MATCH ;JMM031 ; R2 -- STD ADDRESS TO MATCH ;JMM031 ; R4 -- LISTHEAD ADDRESS ;JMM031 ; ;JMM031 ; ;JMM031 ; OUTPUT: ;JMM031 ; R4 -- NODE ADDRESS IF FOUND ;JMM031 ; CC-C -- CLEARED IF FOUND ;JMM031 ; CC-C -- SET IF NOT FOUND ;JMM031 ; ;JMM031 ; ;JMM031 ;- ;JMM031 SRCH: MOV R4,-(SP) ; SAVE LISTHEAD FOR LATER ;JMM031 10$: ;JMM031 MOV @R4,R4 ; GET NEXT ENTRY ;JMM031 CMP R4,@SP ; END OF LIST? ;JMM031 SEC ; ASSUME IT IS ;JMM031 BEQ 30$ ; IF SO EXIT WITH CARRY SET ;JMM031 CMP R2,A.TD(R4) ; DO STD'S MATCH? ;JMM031 BNE 10$ ; NO -- TRY NEXT ENTRY ;JMM031 BIT #SF.MU,S.FW(R2) ; IS THIS A MULTI-USER TASK? ;JMM031 BEQ 20$ ; NO -- THEN THIS ENTRY IS GOOD ;JMM031 CMP N.TI(R0),N.TI(R4) ; YES -- DO TI'S MATCH? ;JMM031 BNE 10$ ; NO -- TRY NEXT ENTRY ;JMM031 20$: ;JMM031 CLC ; SUCCESSFUL RETURN ;JMM031 30$: ;JMM031 INC (SP)+ ; CLEAN STACK -- DON'T TOUCH CARRY ;JMM031 RETURN ; EXIT ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;JMM031 ;+ ;JMM031 ; *** - FTPD - PRIVATE SUBROUTINE OF 'GETTSK' TO SEARCH FOR A TASK ;JMM031 ; IN THE MRL'S. ;JMM031 ; ;JMM031 ; ;JMM031 ; INPUT: ;JMM031 ; R0 -- ATL NODE ADDRESS FOR TI MATCH ;JMM031 ; R2 -- STD ADDRESS TO MATCH ;JMM031 ; ;JMM031 ; ;JMM031 ; OUTPUT: ;JMM031 ; R4 -- NODE ADDRESS IF FOUND ;JMM031 ; CC-C -- CLEARED IF FOUND ;JMM031 ; CC-C -- SET IF NOT FOUND ;JMM031 ; ;JMM031 ; ;JMM031 ;- ;JMM031 FTPD: MOV .TPDBA,R4 ; GET BASE ADDRESS OF PARTITIONS ;JMM031 ADD #T.RF,R4 ; POINT TO FIRST MRL LISTHEAD ;JMM031 10$: ;JMM031 MOV R4,R3 ; SAVE LISTHEAD ADDRESS ;JMM031 CALL SRCH ; SEARCH MRL FOR TASK ;JMM031 BCC 20$ ; FOUND IF CARRY CLEAR ;JMM031 ADD #T.SZ,R4 ; ELSE ADVANCE TO NEXT MRL LISTHEAD ;JMM031 CMP .TPDEA,R4 ; ANY MORE TPD'S? ;JMM031 BHI 10$ ; CONTINUE IF MORE -- NOTE: THE ABOVE ;JMM031 ; COMPARE CORRECTLY SETS CARRY BIT ;JMM031 20$: ;JMM031 RETURN ; EXIT ;JMM031 ;JMM031 ;JMM031 .ENDC ;JMM031 ;JMM031 ;JMM031 .END ;JMM031