.TITLE COMND .IDENT /M02/ ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY ; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE ; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ; AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND ; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION 02 ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; J. CLEMENT AUGUST 82 ; ;MODIFACATIONS BY J. CLEMENT ; PARSING FOR ANY VARIANT OF COMMAND ; 1. MUTIPLE TABS, SPACES ALLOWED ; 2. RUNON SYNTAX ALLOWED ; 3. fast parsing (alphabetical table) ; ; COMMAND SCANNER ; ; READ AND DISPATCH ON COMMAND ; ; INPUTS: ; ; ; IMPURE STORAGE ; BUFSIZ=40. .PSECT $TEMP,D,RW,GBL,OVR TBUFF: .BLKB BUFSIZ .BLKB 2 .PSECT $CODE LCL,I,RO,CON CMN:: MOV #TBUFF,R2 ; COMMAND SAVE BUFFER CALL CMCIN ; GET FIRST CHARACTER OF COMMAND CMPNE #SEMI,R1,10$ ; NOT A COMMENT? JMP COMNT ; PROCESS COMMENT 10$: MOVB R1,(R2)+ ; SAVE IT CMP R2,#TBUFF+BUFSIZ ; at end of buffer? BHIS 30$ ; yes CMPEQ R1,#SPC,20$ ; SPACE? CMPB GCTABL(R1),#GC.LC ; ALPHABETIC? BHI 30$ ; NO, DONE 20$: CALL CMCIN ; NEXT INPUT CHAR BR 10$ 30$: MOVB TBUFF,R3 ; First char in buffer SUB #'A,R3 ; Convert it to table index BLT 100$ ; bad index? CMP R3,#26. ; too big? BGE 100$ ; yes ASL R3 ; now byte pointer MOV COMTAB(R3),R3 ; starting point MOV R2,-(SP) ; save it 50$: MOV #TBUFF,R4 ; BUFFER DATA MOV 2(R3),R2 ; POINTS TO COMMAND DEFINITION 60$: MOVB (R2)+,R1 ; TABLE CHAR TO TEST BMI 110$ ; END OF TABLE ENTRY 70$: MOVB (R4)+,R0 ; INPUT STRING CHAR TO TEST CMPNE R0,#SPC,80$ ; NOT SPACE? CMPEQB (R4),R0,70$ ; AND NEXT SPACE ALSO? 80$: CMPB R0,R1 ; MATCH? BEQ 60$ ; YES CMPNE R1,#SPC,90$ ; WAS TABLE CHAR SPACE? MOVB (R2)+,R1 ; YES, TRY THE NEXT BR 80$ ; TO ACCEPT RUN ON SYNTAX 90$: CMP (R3)+,(R3)+ ; NEXT COMMAND TSTNE (R3),50$ ; more entries in table? BITNE #LITFG,F.1,115$ ; literal processing active? 100$: CALL BKSPI ; Backspace for possible recovery JMP ILNAM ; ERROR IN INPUT COMMANDS 110$: TSTB -(R2) ; POINT TO TERMINAL BYTE MOVB (R4),R1 ; CHAR AT END OF STRING CMPB GCTABL(R1),#GC.LC ; alphabetic? BLOS 90$ ; YES, THIS IS NOT A GOOD MATCH SUB (SP)+,R4 ; number of char to backspace BITEQ #SPECF,F.1,120$ ; NO SPECIAL PROCESSING ACTIVE? CMPEQ (R3),CMADR,140$ ; COMMAND ADDRESS MATCH? BITEQ #LITFG,F.1,120$ ; LITERAL PROCESSING NOT ACTIVE? 115$: TST (SP)+ ; CLEAN STACK MOV BUFADD,R3 ; GET INPUT BUFFER ADDRESS CALL BEGBF ; SET TO TOP AGAIN JMP TEXT ; DO LITERAL 120$: BITEQB #ENDF,(R2),140$ ; NOT UNEXPECTED END DIRECTIVE? 130$: JMP ILCM 140$: BITEQB (R2),F.1,150$ ; Command legal in current context? JMP ILFCM ; either footnote or note in progress 150$: MOV R3,-(SP) ; SAVE TABLE ADDRESS MOV BUFADD,R3 ; INPUT BUFFER ADDRESS MOV BF.FUL(R3),R1 ; CHAR IN INPUT BUFFER ADD R4,R1 ; LOCATION IN INPUT BUFFER TO FIND CALL FNDIN MOV (SP)+,R3 ; RESTORE TABLE ADDRESS RETURN CMCIN: CALL CCIN ; GET 1 CHAR CMPNEB GCTABL(R1),#GC.LC,10$ ; not lower case? SUB #40,R1 ; SET TO UPPER CASE 10$: CMPNE R1,#TAB,20$ ; NOT TAB? MOV #SPC,R1 ; CONVERT TABS TO SPACES 20$: RETURN .END