.TITLE COMND .IDENT /M3.0/ ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * ;* General permission to copy (but not for profit) is hereby * ;* granted, provided that reference is made to the fact that * ;* reproduction privileges were granted by DECUS. * ;* * ;* The information in this document is subject to change with- * ;* out notice and should not be construed as a commitment by * ;* the contributor(s), DECUS or Digital Equipment Corporation. * ;* * ;* These parties make no warranty as to the suitability of this * ;* material for use by the recipient, nor as to the accuracy or * ;* functioning of the software or related material, and no * ;* responsibility is assumed in connection therewith. * ;* * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; 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, Dec. '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 ; chs78a Add BLOCK ; ; INPUTS: ; ; R1 = Period character ; R5 = Address of flag word (F.1) ; RETRY: .BLKW 1 ;TEMP. SWITCH 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? SEC ; YES, TAKE SPECIAL RETURN BR 32$ 3$: .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 8$: MOV SP,RETRY ;SET FLAG TO NOT ADVANCE IN TABLE BR CM4 ;GET USER'S NEXT CHARACTER 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? .IF NZ BLKCMD ;chs78a+ BITEQ #BLKF,(R5),30$ ;CONTINUE IF NOT PROCESSING BLOCK BITNEB #FOTF,(R2),ILCM1 ;CHECK FOR COMMAND NOT OK IN BLOCK .ENDC ; NZ BLKCMD ;chs78a- 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+ .IF NZ BLKCMD ;chs78a BITEQ #BLKF!FOTF,(R5),31$ ;PROCESSING FOOTNOTE OR BLOCK? ;chs78a .IFF ;chs78a BITEQ #FOTF,(R5),31$ ;PROCESSING FOOTNOTE? .ENDC ; -NZ BLKCMD ;chs78a SUB R4,FOOTP1 ; YES, ADJUST FOOTNOTE BUFFER POINTER BR 32$ 31$: ; NO, ADJUST FILE-INPUT POINTERS .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 ; GET A COMMAND CHARACTER CMCIN: CALL CCIN ;READ FROM INPUT FILE CALL 70$ ;WRITE CHARACTER INTO SECONDARY BUFFER CMP R1,#172 ;CHECK FOR LOWERCASE LETTERS BGT 60$ CMP R1,#140 BLE 60$ BIC #40,R1 ;CONVERT TO UPPERCASE 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 JMP ILCM2 ;DISPLAY "ILLEGAL COMMAND" ERROR ;chs42 50$: TST (SP)+ ;CLEAN STACK COMB $SDISW ;SET SECONDARY INPUT FLAG JMP TEXT ;PROCESS TEXT ; Local routine to store character in buffer 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