.TITLE SETUP .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. * ;* * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; RUNOFF commands related to basic format initialization ; (Formerly contained in RNCMD.MAC and FMTCM.MAC) ; ; AUTHOR: C. H. Spalding, Unimation, Apr. '83 ; ; MODIFIED BY ; ; ; MODIFICATIONS ; ; chs03 Reduce blank lines from CHAPTER, APPENDIX, & INDEX ; chs04 Add ALTERNATING HEADER ; chs05 Make page size settings available to task build ; chs10 Change default header type to "MIXED" ; chs11 Add header type "BLANK" ; chs14 Add ALTERNATING TITLE ; chs16 Use local symbols in place of constants ; chs36 Expand scope of STANDARD ; chs39 Add LAYOUT and related switches ; chs40 Expand HEADER ; chs42 Distinguish between "ILLEGAL COMMAND" and "BAD PARAMETER" ; chs46 Change ALTERNATING HEADER to ALTERNATE ; chs60 Make syntax for command arguments common ; chs78e Set number of text lines when page/header length changed ; chs84 Add exit status ; chs88 Add ENABLE and DISABLE ; chs91 Add LEVEL STYLE ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4 = Address of number conversion routine ; R5 = Address of flag word F.1 ; ; ASSEMBLER DIRECTIVES .ENABL LC ; LOCAL DATA ; ; Header styles .IF NZ ENADIS ;chs88+ ; Table of pointers to style keywords ; - First entry must be the default choice ; - List must end with NUL HDRLST: .WORD MIXED,BLANK,LOWER,UPPER,0 .ENDC ; NZ ENADIS ;chs88- BLANK: .ASCIZ /BLANK/<0>/ / ;BLANK OUT "PAGE" ;chs11 LOWER: .ASCIZ /LOWER/<0>/page / ;LOWER CASE PAGE MIXED: .ASCIZ /MIXED/<0>/Page / ;MIXED CASE PAGE UPPER: .ASCIZ /UPPER/<0>/PAGE / ;UPPER CASE PAGE ;LOWER:: .ASCIZ /LOWER/<0><'P+40><'A+40><'G+40><'E+40><' > ;LOWER CASE PAGE ;MIXED:: .ASCIZ /MIXED/<0><'P><'A+40><'G+40><'E+40><' > ;MIXED CASE PAGE ;UPPER:: .ASCIZ /UPPER/<0>/PAGE/<' > ;UPPER CASE PAGE ; Tables for ENABLE/DISABLE commands (MUST BE IN SAME ORDER) ;chs88+ ; ENASWC = Pointers to ENABLE/DISABLE internal switches ; ENALST = Pointers to keywords accepted by ENABLE/DISABLE ; (end marked with NUL) .IF NZ ENADIS ENASWC: .WORD $BLKSW ;POINTERS TO INTERNAL SWITCHES .IIF NZ ENAOUT, .WORD $OUTSW ;chs88b .IIF NZ ENAIDX, .WORD $IDXSW ;chs88c .IIF NZ ENATOC, .WORD $TOCSW ;chs88d ENALST: .WORD BLKWRD ;POINTERS TO KEYWORDS .IIF NZ ENAOUT, .WORD OUTWRD ;chs88b .IIF NZ ENAIDX, .WORD IDXWRD ;chs88c .IIF NZ ENATOC, .WORD TOCWRD ;chs88d .WORD 0 BLKWRD: .ASCIZ \BLOC\ ;"BLOCK" .IIF NZ ENAOUT, OUTWRD: .ASCIZ \OUT\ ;"OUTPUT" ;chs88b .IIF NZ ENAIDX, IDXWRD: .ASCIZ \IND\ ;"INDEXING" ;chs88c .IIF NZ ENATOC, TOCWRD: .ASCIZ \CON\ ;"CONTENTS" ;chs88d .EVEN .ENDC ; NZ ENADIS ;chs88- ; STANDARD, PAGE SIZE ; STANDARD command .ENABL LSB STAND:: .IF NZ BIGSTD ;chs36 CALL INITP ;INITIALIZE PARAMETERS ;chs36 .IFF ;chs36 MOV #SPCNG,NSPNG ;SET STANDARD SPACING MOV #IPARIN,PARIND ;SET INITIAL PARAGRAPH INDENT MOV #ILMRG,LMARG ;INITIALIZE LEFT MARGIN .ENDC ; -NZ BIGSTD ;chs36 MOV #INLPG$,R3 ;SET INITIAL PAGE LENGTH PARAMETER ;chs05 BIS #FILLF!JUSTF!PJUSTF,(R5) ;SET TO FILL AND JUSTIFY BR 15$ ;FINISH IN COMMON CODE ; PAGE SIZE command SETPG:: MOV PNLPG,R3 ;GET CURRENT PAGE LENGTH CALL (R4) ;GET RELATIVE ARGUMENT MOV PNLPG,R3 ;DEFAULT TO CURRENT LENGTH .IF NZ BLSW ; ;chs03 CMP R3,CHPSKP ;LENGTH REASONABLE FOR CHAPT. HEADING ;chs03 .IFF ; (THIS IS AN ODD CRITERION) ;chs03 CMP R3,#12 ;LENGTH REASONABLE FOR CHAPT. HEADING .ENDC ; -NZ BLSW ;chs03 BGT 15$ ; YES, CONTINUE ;chs79 JMP ILCM ; NO, ERROR ;chs79 15$: .IF NZ TXLTST ;chs78e+ CALL SETNLP ;SET PAGE LENGTH PARAMETERS .IFF ;chs78e- MOV R3,NLPG ;SAVE AS LENGTH OF THIS PAGE MOV R3,PNLPG ;AND PERMANENT PAGE LENGTH .ENDC ; -NZ TXLTST ;chs78e CALL SETRM ;SET RIGHT MARGIN MOV R3,PRMRG ;SET NEW PERMANENT MARGIN .IIF NZ EXTHDR, MOV R3,HRMARG ;SET NEW HEADER RIGHT MARGIN ;chs40 20$: MOV R3,RMARG RETURN .DSABL LSB ; SETNLP -- Subroutine to set page length parameters ; Entry points: SETNLP = Set NLPG, PNLPG and TXTLEN ; SETTXL = Set only TXTLEN ; On entry: R3 = New page length ; On exit: NLPG = PNLPG = New page length ; TXTLEN = New number of text lines per page ; Registers: None changed .IF NZ TXLTST ;chs78e+ SETNLP::MOV R3,NLPG ;SET LENGTH OF THIS PAGE MOV R3,PNLPG ;AND PERMANENT PAGE LENGTH SETTXL: MOV PNLPG,R3 ;GET PERMANENT PAGE LENGTH SUB $HDRSW,R3 ;SUBTRACT HEADER LENGTH MOVB R3,TXTLEN ;SET NUMBER OF TEXT LINES RETURN .ENDC ; NZ TXLTST ;chs78e- ; LAYOUT command ;chs39+ .IF NZ LAYOUT ; Start with top margin LYOUT:: MOV TOPMRG,R3 ;GET OLD TOP MARGIN CALL (R4) ;GET RELATIVE ARGUMENT JMP 40$ ;SKIP IF NONE PROVIDED .IF NZ LAYSW ;chs39a+ BITEQ #DWNSW,$SWTCH,10$ ;ALREADY SET VIA SWITCH? CALL 200$ ; YES, OUTPUT ERROR BR 40$ ;SKIP TO NEXT ARGUMENT .ENDC ; NZ LAYSW ;chs39a- 10$: TST R3 ;MUST BE AT LEAST POSITIVE BGE 30$ 20$: JMP ILCM ;DISPLAY ERROR 30$: MOV R3,TOPMRG ;STORE NEW VALUE ; Now get page length 40$: MOV PNLPG,R3 ;GET CURRENT PAGE LENGTH CALL (R4) ;GET RELATIVE ARGUMENT 50$: MOV PNLPG,R3 ;DEFAULT TO CURRENT LENGTH .IF NZ LAYSW ;chs39a+ CMPEQ R3,PNLPG,60$ ;TRYING TO CHANGE VALUE BITEQ #LNGSW,$SWTCH,60$ ;ALREADY SET VIA SWITCH? CALL 200$ ; YES, OUTPUT ERROR BR 50$ ;USE DEFAULT VALUE 60$: .ENDC ; NZ LAYSW ;chs39a- .IF NZ BLSW CMP R3,CHPSKP ;LENGTH REASONABLE FOR CHAPT. HEADING .IFF ; (THIS IS AN ODD CRITERION) CMP R3,#12 ;LENGTH REASONABLE FOR CHAPT. HEADING .ENDC ; -NZ BLSW BLE 20$ ;IF LE ERROR .IF NZ TXLTST ;chs78e+ CALL SETNLP ;SET PAGE LENGTH PARAMETERS .IFF ;chs78e- MOV R3,NLPG ;SAVE AS LENGTH OF THIS PAGE MOV R3,PNLPG ; AND PERMANENT PAGE LENGTH .ENDC ; -NZ TXLTST ;chs78e ; Base left margin is next MOV BASMRG,R3 ;GET CURRENT PERM. LEFT MARGIN .IF NZ ALTSHF ;chs46+ MOV ASHIFT,R2 ;GET ALTERNATE-PAGE OFFSET CALL LFTRGT ;ON RIGHT-HAND PAGE? BCC 70$ ; NO, BASE MARGIN OKAY SUB R2,R3 ; YES, MUST CONSIDER OFFSET 70$: .IFTF ;chs46- CALL (R4) ;GET RELATIVE ARGUMENT JMP 100$ ;DEFAULT TO CURRENT SETTING .IF NZ LAYSW ;chs39a+ BITEQ #LFTSW,$SWTCH,80$ ;ALREADY SET VIA SWITCH? CALL 200$ ; YES, OUTPUT ERROR BR 100$ ;SKIP TO NEXT ARGUMENT .ENDC ; NZ LAYSW ;chs39a- 80$: TST R3 ;NEW VALUE CANNOT BE NEGATIVE BLT 20$ .IFT ;chs46+ MOV R3,PBMRG ;SAVE AS PERMANENT VALUE CALL LFTRGT ;ON RIGHT-HAND PAGE? BCC 90$ ; NO, BASE MARGIN OKAY ADD R2,R3 ; YES, INCLUDE OFFSET 90$: .ENDC ; NZ ALTSHF ;chs46- MOV R3,BASMRG ;SAVE WORKING VALUE ; Finally, look for page width 100$: MOV PRMRG,R3 ;GET CURRENT PERMANENT RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT JMP 120$ ;IF NONE, LEAVE UNCHANGED .IF NZ LAYSW ;chs39a+ BITEQ #WIDSW,$SWTCH,110$ ;ALREADY SET VIA SWITCH? CALL 200$ ; YES, OUTPUT ERROR BR 120$ ;SKIP .ENDC ; NZ LAYSW ;chs39a- 110$: CMP R3,LMARG ;MUST BE RIGHT OF LEFT MARGIN BLE 20$ ;IF GT OKAY MOV R3,PRMRG ;SET NEW PERMANENT RIGHT MARGIN MOV R3,RMARG ;SET NEW RIGHT MARGIN .IIF NZ EXTHDR, MOV R3,HRMARG ;SET NEW HEADER RIGHT MARGIN ;chs40 120$: RETURN .IF NZ LAYSW ;chs39a+ ; Local subroutine to display warning message 200$: CALL $ERMSG ;OUTPUT MESSAGE ;chs84 .WORD LOKWRN ;ADDRESS OF MESSAGE ;; CALL ONPAG ;IDENTIFY OUTPUT PAGE ;chs84 RETURN .ENDC ; NZ LAYSW ;chs39a- .ENDC ; NZ LAYOUT ;chs39- ; NOHEADER, HEADER ; NOHEADER command NHEAD:: CLR $HDRSW ;SET TO NOT PRINT PAGE HEADERS .IF NZ TXLTST ;chs78e+ JMP SETTXL ;SET NEW TEXT LENGTH .IFF ;chs78e- RETURN .ENDC; -NZ TXLTST ;chs78e ; HEADER command HEADP:: CALL $FRCND ;FORCE TO LOGICAL END OF LINE .IF NZ ENADIS ;chs88+ CLR R0 ;ASSUME DEFAULT STYLE OFFSET CMPEQ #CR,R1,10$ ;CARRIAGE RETURN? CMPEQ #SEMI,R1,10$ ;SEMICOLON? .IIF NZ EXTHDR, CMPEQ #CMA,R1,10$ ;COMMA? ;chs40 MOV #HDRLST,R0 ;POINT TO LIST OF STYLE POINTERS CALL FNDMCH ;FIND THE MATCH 10$: MOV HDRLST(R0),R0 ;POINT TO THE SELECTED STYLE 20$: TSTNEB (R0)+,20$ ;SKIP TO PROTOTYPE MOV #PAGHD,R1 ;POINT TO PAGE HEADER AREA 30$: MOVB (R0)+,(R1)+ ;MOVE PROTOTYPE TO WORKING COPY BNE 30$ ;IF NE, MORE TO GO .IFF ;chs88- MOV #MIXED,R2 ;ASSUME MIXED CASE SPECIFIED ;chs10 CMPEQ #CR,R1,25$ ;CARRIAGE RETURN? CMPEQ #SEMI,R1,25$ ;SEMICOLON? .IIF NZ EXTHDR, CMPEQ #CMA,R1,25$ ;COMMA? ;chs40 CALL 50$ ;READ FIRST CHARACTER CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? MOV #UPPER,R2 ;ASSUME 'UPPER' KEYWORD ;chs10 CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? MOV #LOWER,R2 ;ASSUME 'LOWER' KEYWORD CMPEQB R1,(R2)+,10$ ;FIRST CHARACTER MATCH? ;chs11 MOV #BLANK,R2 ;ASSUME 'BLANK' KEYWORD ;chs11 CMPNEB R1,(R2)+,20$ ;FIRST CHARACTER MISMATCH? (BUG FIXED) ;chs 10$: TSTEQB (R2),30$ ;NO MORE CHARACTERS TO MATCH? CALL 50$ ;READ ANOTHER CHARACTER CMPEQB R1,(R2)+,10$ ;CHARACTER MATCH? 20$: JMP ILCM ;ILLEGAL COMMAND 25$: TSTNEB (R2)+,25$ ;SEARCH FOR END OF STRING DEC R2 ;ADJUST FOR FOLLOWING INCREMENT 30$: INC R2 ;POINT TO PAGE PROTOTYPE MOV #PAGHD,R1 ;POINT TO PAGE HEADER AREA 40$: MOVB (R2)+,(R1)+ ;MOVE PROTOTYPE BNE 40$ ;IF NE MORE TO GO .ENDC ; -NZ ENADIS ;chs88 .IF NZ EXTHDR ;chs40 41$: ;chs60+ .IF NZ GENSEP CALL SKPSEP ;SKIP TO NEXT ARGUMENT BCS 48$ ;SKIP IF CR FOUND CMPEQB #SEMI,R1,48$ ;SEMI INDICATES NO MORE .IFF ;chs60- CALL CCIN ;SKIP TO NEXT ARGUMENT ;chs40+ CMPEQB #CMA,R1,42$ ;MARKED BY COMMA CMPEQB #SEMI,R1,48$ ;SEMI INDICATES NO MORE CMPNEB #CR,R1,41$ ;SO DOES MOVB R1,GCSCH ; (BUT IT SHOULD BE SAVED) BR 48$ .ENDC ; -NZ GENSEP ;chs60 ; Get header length 42$: MOV HDRLEN,R3 ;GET OLD HEADER LENGTH CALL (R4) ;GET RELATIVE ARGUMENT JMP 44$ ;SKIP IF NONE PROVIDED .IF NZ XHDRSW ;chs40a+ BITEQ #HLNSW,$SWTCH,43$ ;ALREADY SET VIA SWITCH? CALL $ERMSG ;OUTPUT MESSAGE ;chs84 .WORD LOKWRN ;ADDRESS OF MESSAGE ;; CALL ONPAG ;IDENTIFY OUTPUT PAGE ;chs84 BR 44$ ;SKIP TO NEXT ARGUMENT .ENDC ; NZ XHDRSW ;chs40a- 43$: TST R3 ;IS IT REASONABLE? BLT 20$ ;CAN'T BE NEGATIVE MOV R3,HDRLEN ;STORE NEW VALUE ; Get header left margin 44$: MOV HLMARG,R3 ;GET CURRENT HEADER LEFT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT JMP 46$ ;DEFAULT TO CURRENT SETTING TST R3 ;IS IT REASONABLE? BLT 20$ ;CAN'T BE NEGATIVE CMP R3,HRMARG ;NOR GREATER THAN RIGH MARGIN BGE 20$ MOV R3,HLMARG ;SAVE NEW SETTING ; Get header right margin 46$: MOV HRMARG,R3 ;GET CURRENT HEADER RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT JMP 48$ ;DEFAULT TO CURRENT SETTING CMP R3,HLMARG ;IS IT REASONABLE? BLE 20$ ;CAN'T BE LESS THAN LEFT MARGIN MOV R3,HRMARG ;SAVE NEW SETTING 48$: MOV HDRLEN,$HDRSW ;SET TO PRINT PAGE HEADERS .IF NZ TXLTST ;chs78e+ CALL SETTXL ;SET NEW TEXT LENGTH .ENDC; NZ TXLTST ;chs78e- .IFF ;chs40- MOV #HDLEN,$HDRSW ;SET TO PRINT PAGE HEADERS ;chs16 .ENDC ; -NZ EXTHDR ;chs40 RETURN ; Local subroutine to convert alpha characters to UC .IF Z ENADIS ;chs88 50$: CALL CCIN ;READ NEXT CHARACTER CMP #'A+40,R1 ;LOWER CASE? BHI 60$ ;IF HI NO CMP #'Z+40,R1 ;LOWER CASE? BLO 60$ ;IF LO NO BIC #40,R1 ;CONVERT TO UPPER CASE 60$: RETURN .ENDC ; Z ENADIS ;chs88 ; (NO)ALTERNATE, (NO)ALTERNATING TITLE ; ALTERNATE commands ;chs04+ .IF NZ ALTHDR AHEAD:: BITEQ #ALHSW,$SWTCH,30$ ;ALTERNATING HEADER ENABLED? .IF NZ ALTSHF ;chs46+ MOV ASHIFT,R3 ;GET CURRENT SHIFT CALL (R4) ;GET NEW VALUE MOV #0,R3 ;DEFAULT TO ZERO TST R3 ;MAKE SURE ITS NOT NEGATIVE BGE 10$ JMP ILCM ; ELSE ERROR 10$: MOV PBMRG,BASMRG ;GET STANDARD BASE MARGIN CALL LFTRGT ;ON RIGHT-HAND PAGE? BCC 20$ ; NO, BASE MARGIN OKAY ADD R3,BASMRG ; YES, ADD IN OFFSET 20$: MOV R3,ASHIFT ;STORE NEW VALUE .ENDC ; NZ ALTSHF ;chs46- MOV SP,$ALHSW ;SET ALTERNATING HEADER MODE 30$: RETURN NAHEAD::CLR $ALHSW ;CLEAR ALTERNATING HEADER MODE .IIF NZ ALTSHF, CLR ASHIFT ;CLEAR ALTERNATE OFFSET ;chs46 .IF NZ ALTTIT ;chs14 JMP NATITL ;TURN OFF ALTERNATING TITLES ;chs14 .IFF ;chs14 RETURN .ENDC ; -NZ ALTTIT ;chs14 .ENDC ; NZ ALTHDR ;chs04- ; ALTERNATING TITLE commands ;chs14+ .IF NZ ALTTIT ATITL:: TST $ALHSW ;ALTERNATING HEADERS ACTIVE? BNE 10$ ; YES, COMMAND OKAY JMP ILCM2 ; NO, ILLEGAL IN THIS CONTEXT ;chs42 10$: MOV SP,$ALTSW ;SET ALTERNATING TITLE MODE RETURN NATITL::CLR $ALTSW ;CLEAR ALTERNATING TITLE MODE RETURN .ENDC ; NZ ALTTIT ;chs14- ; LEVEL STYLE command ;chs91+ .IF NZ HLSTYL LVLSTY::CLR R3 ;RELATIVE ARGUMENT BASE CALL (R4) ;GET LEVEL NUMBER 10$: JMP ILCM ;MUST BE ONE MOV R3,R2 ;SAVE COPY TSTNE R3,20$ ;CONTINUE IF NOT ZERO MOV #CHPTN+MAXHL+1,HLTYP2 ;SET CHANGE LEVEL VERY HIGH BR 50$ ;IGNORE REST OF COMMAND 20$: BGT 30$ ;SKIP IF POSITIVE NEG R2 ;MAKE COPY POSITIVE 30$: CMP R2,#MAXHL ;VALUE WITHIN RANGE? BGT 10$ ; NO, ERROR TST R3 ;INPUT POSITIVE? BGT 40$ ; YES, DON'T SET CHANGE LEVEL NEG R3 ; NO, MAKE POSITIVE ADD #CHPTN,R3 ;ADD OFFSET MOV R3,HLTYP2 ;SET CHANGE LEVEL ; Get number of lines to skip before heading 40$: MOVB (R2),R3 ;GET OLD VALUE CALL (R4) ;GET SKIP-COUNT ARGUMENT MOVB (R2),R3 ;USE DEFAULT MOVB R3,(R2) ;SET SKIP COUNT ; Get number of lines required to fit on page MOVB (R2),R3 ;GET OLD VALUE CALL (R4) ;GET TEST-PAGE ARGUMENT MOVB (R2),R3 ;USE DEFAULT MOVB R3,(R2) ;SET TEST PAGE VALUE 50$: RETURN .ENDC ; NZ HLSTYL ;chs91 ; ENABLE, DISABLE commands ;chs88+ .IF NZ ENADIS .ENABL LSB ENABLE::MOV #1,-(SP) ;SETUP TO TURN SWITCH ON BR 10$ DISABL::CLR -(SP) ;SETUP TO TURN SWITCH OFF 10$: MOV #ENALST,R0 ;POINT TO KEYWORD POINTERS CALL SKPSEP ;SKIP TO COMMAND ARGUMENT CALL FNDMCH ;MATCH KEYWORD IN COMMAND MOVB (SP)+,@ENASWC(R0) ;SET APPROPRIATE SWITCH ; Must process ENABLE BLOCK specially BEQ 20$ ;SKIP IF DISABLING CMPNE #$BLKSW,ENASWC(R0),20$ ; OR IF NOT "BLOCK" JMP EN$BLK ;CHECK FOR BLOCKS TO OUTPUT 20$: RETURN .DSABL LSB ; Subroutine to find keyword match from command line (match defined ; as command argument same as or longer than keyword) ; On entry: R0 = Address of table of pointers to keywords ; (end of table marked with NUL; ; each keyword ends with NUL) ; ; On exit: C bit set = no match found ; R0 = Table offset corresponding to match found ; ; Registers: R0-R3 changed FNDMCH: MOV R4,-(SP) ;SAVE REGISTER MOV R0,-(SP) ;SAVE INITIAL LIST POINTER ; Store command-line argument in temporary buffer MOV CMST2,-(SP) ;SAVE POINTER TO COMMAND ARGUMENT INC (SP) ;ADVANCE TO COMMAND ARGUMENT 10$: CALL CCIN ;GET AN INPUT CHARACTER CMPB #'A+40,R1 ;CONVERT LOWERCASE TO UPPERCASE BGT 20$ CMPB #'Z+40,R1 BLT 20$ BIC #40,R1 ;DO THE CONVERSION 20$: MOV #CMSTP,R4 ;POINT TO BUFFER POINTERS CALL WCI ;WRITE CHARACTER TO BUFFER CALL ALPH1 ;WAS IT A LETTER? BCC 10$ ; YES, CONTINUE TO LOOP MOVB R1,GCSCH ;SAVE BREAK CHARACTER ; Match argument with keyword in stored list 30$: MOV (SP),R1 ;POINT AT STORED COMMAND ARGUMENT MOV (R0)+,R2 ;GET POINTER TO NEXT KEYWORD IN LIST BNE 40$ ;CONTINUE IF NOT END OF LIST JMP ILCM ; ELSE, ERROR 40$: CMPEQB (R1)+,(R2)+,40$ ;LOOP UNTIL CHARACTERS DON'T MATCH ; A mismatch has been found TSTNEB -(R2),30$ ;TRY NEXT KEYWORD IF NOT AT END TST -(R0) ;POINT TO MATCHED KEYWORD TST (SP)+ ;THROW AWAY ARGUMENT POINTER SUB (SP)+,R0 ;DETERMINE TABLE OFFSET MOV (SP)+,R4 ;RESTORE REGISTER RETURN .ENDC ; NZ ENADIS ;chs88- .END