.TITLE COMND .IDENT /M03X/ ; COMMAND SCANNER -- READ AND DISPATCH ON COMMAND ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; C. H. SPALDING, UNIMATION, APR. '82 ; ; MODIFICATIONS ; ; SIG02 - DON'T LOSE CHARACTERS FROM THE COMMAND TABLE LOOKUP ; CHS17 - IGNORE WHITE SPACE IN COMMAND NAMES/REDUCE COMMAND TABLE ; CHS20 - ADD OPTIONAL-TEXT COMMANDS (EFFECTS COMMENT COMMANDS) ; CHS33 - MISC. FIXES TO FOOTNOTE PROCESSING ; CHS42 - DISTINGUISH BETWEEN "ILLEGAL COMMAND" AND "BAD PARAMETER" ; CHS44 - ADD "!" COMMENT COMMAND AND FLAG ; ; INPUTS: ; ; R1=PERIOD CHARACTER. ; R5=ADDRESS OF FLAG WORD (F.1). ; RETRY: .BLKW 1 ;TEMP. SW. FOR RETESTING TABLE CHAR. ;CHS17 .ENABL LSB CMN:: MOV #CMBF-1,CMSTP ;INITIALIZE DESCRIPTOR MOV #CMBF-1,CMST2 ; CLR RETRY ;CLEAR SWITCH ;CHS17 MOV #SDINP+2,R4 ;POINT TO SECONDARY INPUT LINE DESCRIPTOR MOV #SDBUF-1,(R4) ;INITIALIZE DESCRIPTOR MOV (R4),-(R4) ; CALL 70$ ;WRITE PERIOD INTO SECONDARY BUFFER CALL CMCIN ;GET FIRST CHARACTER OF COMMAND .IIF NZ EXCMNT, CMPEQ #EXCL,R1,1$ ;A COMMENT? ;CHS44 CMPNE #SEMI,R1,5$ ;NOT A COMMENT? 1$: ;CHS44 .IF NZ OPTTXT ;CHS20 TSTEQB OPTACT,3$ ;IS AN OPTION SCAN ACTIVE? ;CHS20 SEC ; YES, TAKE SPECIAL RETURN ;CHS20 BR 32$ ;CHS20 3$: ;CHS20 .ENDC ; NZ OPTTXT ;CHS20 JMP COMNT ;PROCESS COMMENT 5$: MOV #/4,NCNT ;SET LENGTH OF COMMAND TABLE MOV #CMTAB,R3 ;POINT TO COMMAND TABLE CM2: MOV 2(R3),R2 ;PREPARE TO READ DEFINED COMMAND MOV CMSTP,T1 ;PREPARE POINTER TO READ USER'S COMMAND CM4: MOV CMST2,T2 ; .. MOV #T1,R4 ;GET USER'S COMMAND CHARACTER CALL GCI ; .. .WORD CM5 ;NEED MORE FROM FILE TSTEQ RETRY,6$ ;SKIP IF RETRYING ;CHS17 CLR RETRY ;CLEAR FLAG ;CHS17 BR 7$ ;CHS17 6$: MOVB (R2)+,R0 ;GET NEXT COMMAND CHARACTER BMI CM6 ;IF MI END OF COMMAND 7$: CMPEQ R1,R0,CM4 ;CHARACTERS MATCH? CMPEQB #SPC,R1,8$ ;IGNORE SPACE CHARACTERS ;CHS17 CMPNEB #TAB,R1,9$ ;IGNORE TAB CHARACTERS ;CHS17 8$: MOV SP,RETRY ;SET FLAG TO NOT ADVANCE IN TABLE ;CHS17 BR CM4 ;GET USER'S NEXT CHARACTER ;CHS17 9$: CMPEQB #SPC,R0,6$ ;IGNORE SPACE CHARACTERS IN TABLE ;CHS17 10$: CMP (R3)+,(R3)+ ;NO. TRY NEXT COMMAND. DEC NCNT BGT CM2 BR ILCM1 ;NO MORE TO TRY. ERROR CM5: CALL CMCIN ;READ USER'S COMMAND FROM FILE CMPEQ R1,#LF,40$ ;END OF LINE? BR CM4 ;GO CHECK NEW CHARACTER CM6: CALL ALPH1 ;ALPHABETIC? BCC 10$ ;IF CC YES TSTB -(R2) ;POINT TO TERMINAL BYTE .IIF NZ OPTTXT, TSTNEB OPTACT,30$ ;SCANNING FOR END OPTION? ;CHS20 BITEQ #SPECF,(R5),23$ ;NO SPECIAL PROCESSING ACTIVE? CMPEQ (R3),CMADR,30$ ;COMMAND ADDRESS MATCH? BITNE #LITFG,(R5),50$ ;LITERAL PROCESSING ACTIVE? 23$: BITNEB #ENDF,(R2),ILCM1 ;UNEXPECTED END DIRECTIVE? 27$: BITNEB (R2),(R5),ILCM1 ;COMMAND NOT LEGAL IN CURRENT CONTEXT? 30$: MOVB R1,GCSCH ;SAVE TERMINAL BYTE MOV T2,R4 ;ANY CHARACTERS LEFT IN COMMAND BUFFER? ;SIG02 SUB T1,R4 ; ;SIG02 BLE 32$ ; ;SIG02 .IF NZ FNFIX ;CHS33 BITEQ #FOTF,F.1,31$ ;PROCESSING FOOTNOTE? ;CHS33 SUB R4,FOOTP1 ; YES, ADJUST FOOTNOTE BUFFER POINTER ;CHS33 BR 32$ ;CHS33 31$: ; NO, ADJUST FILE-INPUT POINTERS ;CHS33 .ENDC ; NZ FNFIX ;CHS33 SUB R4,HFIN+2 ;IF SO, PUT THEM BACK IN THE INPUT ;SIG02 ADD R4,HFIN+4 ; BUFFER ;SIG02 32$: ; ;SIG02 RETURN ; CMCIN: CALL CCIN ;READ FROM INPUT FILE CALL 70$ ;WRITE CHARACTER INTO SECONDARY BUFFER CMP R1,#172 ;CHECK FOR LOWER CASE LETTERS BGT 60$ CMP R1,#140 BLE 60$ BIC #40,R1 ;CONVERT TO UPPER CASE BR 60$ ; ILCM1: CALL CMCIN ;NOW ADD REST OF LINE CMPNE R1,#LF,ILCM1 ;NOT END OF LINE? 40$: BITNE #LITFG,(R5),50$ ;LITERAL PROCESSING ACTIVE? MOVB R1,GCSCH ;SAVE LINE FEED CHARACTER CLR R1 ;CONVERT STRING TO ASCIZ CALL 60$ ;STORE NULL CHARACTER IN BUFFER .IF NZ BADPRM ;CHS42 JMP ILCM2 ;DISPLAY "ILLEGAL COMMAND" ERROR ;CHS42 .IFF ;CHS42 JMP ILCM ; .ENDC ; -NZ BADPRM ;CHS42 50$: TST (SP)+ ;CLEAN STACK COMB $SDISW ;SET SECONDARY INPUT FLAG JMP TEXT ;PROCESS TEXT 60$: MOV #CMSTP,R4 ;POINT TO COMMAND DESCRIPTOR BR 80$ ; 70$: MOV #SDINP,R4 ;POINT TO SECONDARY INPUT DESCRIPTOR 80$: JMP WCI ;WRITE CHARACTER IN COMMAND BUFFER .DSABL LSB .END