.TITLE RNCMD .IDENT /M02/ .IDENT /M02.1/ ; ; 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 M02 ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; RUNOFF COMMANDS ; ; CARTS LUG MODIFICATIONS ; ; CAR 1 --> ADDED CHANGE BAR COMMANDS, FIXED BUG WITH SKIP AND BLANK ; WITH NEGATIVE NUMBERS AND, ADDED RELATIVE MARGEN ; ADJUSTMENT (+ OR -) CAUSES RELATIVE NORMAL OTHERWISE ; ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; R5=ADDRESS OF FLAG WORD F.1. ; ; ENABLE/DISABLE CHANGE BAR COMMADS (ALSO ON AND OFF) ;CAR 1 ; ;CAR 1 ENCBR:: CLR $CBON ;CLEAR ON ;CAR 1 MOV #CBNSP,EBSIZ ;NUMBER OF CHAR TO MOVE TO RIGHT ;CAR 1 RETURN ;CAR 1 DSCBR:: CLR EBSIZ ;SET OFFSET BACK TO ZERO ;CAR 1 CLR $CBON ;TURN OFF CANGE BAR ;CAR 1 RETURN ;CAR 1 ;CAR 1 BGBAR:: MOV #CBBIT,$CBON ;FLAG BAR ON ;CAR 1 RETURN ;CAR 1 ENBAR:: MOV #CBFBT,$CBON ;FLAG BAR OFF ;CAR 1 RETURN ;CAR 1 ;CAR 1 ; ;CAR 1 ; SET UNDERLINE LOCK, UNTIL END OF LINE ;CAR 1 LOCKUL:: ;CAR 1 BIS #2,$ULLSW ;CAR 1 CLR ULTYP ; UNDERLINE ;CAR 1 RETURN ;CAR 1 ;CAR 1 ; SET "DARK" LOCK ON, UNTIL END OF LINE ;CAR 1 LKDARK:: ;CAR 1 BIS #2,$ULLSW ;CAR 1 MOV SP,ULTYP ;OVERPRINT ;CAR 1 RETURN ;CAR 1 ;CAR 1 ; UNDERLINE BY "&" AND "\&" IS DONE BY .... ;CAR 1 SETUL:: CLR DFULT ; UNDERSCORE CHARACTER ;CAR 1 RETURN ;CAR 1 ;CAR 1 SETDK:: MOV SP,DFULT ; OVERPRINT ;CAR 1 RETURN ;CAR 1 ;CAR 1 ;****************** ;CAR 1 ; RELATIVE VS ABSOLUTE TAB STOPS ;CAR 1 ; RT N = TAB STOPS ARE RELATIVE TO COLUMN N (NORMALLY 0) ;CAR 1 ; RT -1 = TAB STOPS ARE RELATIVE TO THE LEFT MARGIN ON THE LINE ;CAR 1 ; THAT THE TAB IS ON ;CAR 1 ; RT (NOTHING) = TAB STOPS ARE RELATIVE TO THE LEFT MARGIN AT THE TIME OF THIS ;CAR 1 ; COMMAND ;CAR 1 RTAB:: CALL (R4) ;CAR 1 MOV LMARG,R3 ; NONE, USE CURRENT LEFT MARGIN ;CAR 1 MOV R3,RELTAB ;CAR 1 RETURN ;CAR 1 ;CAR 1 ; ROUTINES TO SET CHARACTER SIZE AND LINE SIZE FOR LA120 ;CAR 1 ;CAR 1 LA120:: ;CAR 1 CALL (R4) ; GET CHARACTERS PER INCH ;CAR 1 MOV #10.,R3 ; DEFAULT = 10 ;CAR 1 MOV R3,CPI ;CAR 1 CALL (R4) ; GET LINES PER INCH ;CAR 1 MOV #6.,R3 ; DEFAULT = 6 ;CAR 1 ;CAR 1 ; SEARCH LINES PER INCH CONVERSION ;CAR 1 MOV #LPITAB,R4 ;CAR 1 5$: TSTEQB (R4),ILCMJ ;CAR 1 CMPEQB (R4)+,R3,20$ ;CAR 1 INC R4 ;CAR 1 BR 5$ ;CAR 1 ;CAR 1 ; SEARCH CHARACTERS PER INCH CONVERSION TABLE ;CAR 1 20$: MOVB (R4),LPIMSG+2 ;CAR 1 MOV #CPITAB,R4 ;CAR 1 25$: TSTEQB (R4),ILCMJ ;CAR 1 CMPEQB (R4)+,CPI,30$ ;CAR 1 INC R4 ;CAR 1 BR 25$ ;CAR 1 ;CAR 1 30$: MOVB (R4),CPIMSG+2 ;CAR 1 MOV SP,NSLA120 ; SET FLAG SO IT CAN BE CLEARED AT END ;CAR 1 ;CAR 1 ;;;;;; ROUTINE TO SEND SIZE COMMAND TO ;CAR 1 ; LA 120 ;CAR 1 SET120::MOV #LPIMSG,R4 ;CAR 1 35$: MOVB (R4)+,R1 ;CAR 1 BEQ 40$ ;CAR 1 CALL FOUT ;CAR 1 BR 35$ ;CAR 1 40$: RETURN ;CAR 1 ;CAR 1 ILCMJ: JMP ILCM ;CAR 1 ;CAR 1 ; LINES PER INCH CONVERSION TABLE ;CAR 1 LPITAB: .BYTE 2.,'4 ;CAR 1 .BYTE 3.,'5 ;CAR 1 .BYTE 4.,'6 ;CAR 1 .BYTE 6.,'1 ;CAR 1 .BYTE 8.,'2 ;CAR 1 .BYTE 12.,'3 ;CAR 1 .WORD 0 ;CAR 1 ;CAR 1 ; CHARACTERS PER INCH CONVERSION TABLE ;CAR 1 CPITAB: .BYTE 5.,'5 ;CAR 1 .BYTE 6.,'6 ;CAR 1 .BYTE 7.,'7 ;CAR 1 .BYTE 8.,'8 ;CAR 1 .BYTE 10.,'1 ;CAR 1 .BYTE 12.,'2 ;CAR 1 .BYTE 13.,'3 ;CAR 1 .BYTE 16.,'4 ;CAR 1 .WORD 0 ;CAR 1 ;CAR 1 LPIMSG::.BYTE 33,133,'1,172 ;CAR 1 CPIMSG::.BYTE 33,133,'6,167 ;CAR 1 .WORD 0 ;CAR 1 ;CAR 1 ; AUTOPARAGRAPH COMMANDS ; AUTOP:: MOV SP,$AUTSW ;SET AUTOPARAGRAPH MODE RETURN ; NAUTO:: CLR $AUTSW ;CLEAR AUTOPARAGRAPH MODE RETURN ; ; ; DISABLE ALL FLAGS ; DSAFL:: CLR $CFLSW ;CLEAR FLAGS CAPITALIZE CLR $HFLSW ;CLEAR FLAGS HYPHENATE RETURN ; ; ; FLAG CAPITALIZE COMMANDS ; .ENABL LSB DSCFL:: CLR $CFLSW ;CLEAR WORD CAPITALIZE ENABLE BR 10$ ; ENCFL:: MOV SP,$CFLSW ;SET WORD CAPITALIZE ENABLE 10$: CLR WCAS ;CLEAR CASE CONVERSION VALUE RETURN ; .DSABL LSB ; ; FLAG HYPHENATE COMMANDS ; DSHFL:: CLR $HFLSW ;CLEAR HYPHENATE ENABLE RETURN ; ENHFL:: MOV SP,$HFLSW ;SET HYPHENATE ENABLE RETURN ; ; ; HYPHENATION COMMANDS ; HYPHN:: MOV SP,$HPHSW ;SET HYPHENATION ACTIVE RETURN ; NHYPH:: CLR $HPHSW ;CLEAR HYPHENATION ACTIVE RETURN ; ; ; INDENT COMMAND ; INDENT::CALL (R4) ;READ SIGNED DECIMAL NUMBER MOV PARIND,R3 ;NONE. USE CURRENT VALUE CMP R3,RMARG ;LEGITIMATE VALUE? BLE 10$ JMP ILCM ;NO. COMPLAIN 10$: MOV R3,INDCT ;YES. STORE ARGUMENT ; ; BREAK COMMAND ; BREAK:: RETURN ; ; ; CASE SELECTION COMMANDS ; .ENABL LSB LWCAS:: MOV #40,R1 ;SET FOR LOWER CASE BITEQ #UPCSW,$SWTCH,10$ ;DON'T FORCE ALL UPPER CASE? UPCAS:: CLR R1 ;SET FOR UPPER CASE 10$: MOV R1,CAS ;STORE RETURN ; .DSABL LSB ; ; PAGE NUMBER SELECTION COMMANDS ; NUMON:: CALL (R4) ;NUMBER PAGES. ANY PARTICULAR NUMBER? MOV PAGENO,R3 ;NO. LEAVE SAME AS BEFORE MOV R3,PAGENO ;STORE PAGE NUMBER MOV SP,$NUMSW ;TURN ON FLAG TO CAUSE NUMBERING RETURN ; NUMOF:: CLR $NUMSW ;TURN OFF NUMBERING. RETURN ; ; ; PAGE COMMAND ; CPAGE:: CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 20$ ;IF GE YES 10$: MOV SP,$PGPSW ;SET PAGE PENDING FLAG 20$: RETURN ; ; ; MARGIN SELECTION COMMANDS ; .ENABL LSB SETRM:: MOV RMARG,R3 ;GET CURRENT RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV PRMRG,R3 ;IF NONE, INITIALIZE CMP R3,LMARG ;MUST BE RIGHT OF LEFT MARGIN BGT 20$ ;IF GT OKAY 10$: JMP ILCM ;ILLEGAL COMMAND SETLM:: MOV LMARG,R3 ;GET CURRENT LEFT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV STDLM,R3 ;IF NONE, INITIALIZE ;CAR 1 CMP R3,RMARG ;MUST BE LESS THAN RIGHT MARGIN? ;**-1 BGE 10$ ;IF GE NO MOV R3,LMARG ;OK SAVE AS LEFT MARGIN RETURN ; ; ; STANDARD COMMAND ; STAND:: MOV #SPCNG,NSPNG ;SET STANDARD SPACING MOV STDLM,LMARG ; RESET LM TO STANDARD ;CAR 1 MOV #IPARIN,PARIND ;SET INITIAL PARAGRAPH INDENT ;**-1 MOV PNLPG,R3 ;SET INITIAL PAGE LENGTH PARAMETER ;CAR 1 BIS #FILLF!JUSTF!PJUSTF,(R5) ;SET TO FILL AND JUSTIFY ;**-1 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 CMP R3,#12 ;LONG ENOUGH TO BE REASONABLE FOR HEADING BLE 10$ ;IF LE ERROR 15$: MOV R3,NLPG ;SAVE AS LENGTH OF THIS PAGE MOV R3,PNLPG ;AND PERMANENT PAGE LENGTH CALL SETRM ;SET RIGHT MARGIN MOV R3,PRMRG ;SET NEW PERMANENT MARGIN 20$: MOV R3,RMARG RETURN ; ; ; PARAGRAPH COMMAND ; PARAG:: CALL (R4) ;OPTIONAL IDENTING ARGUMENT MOV PARIND,R3 ;NO. USE OLD VALUE CMP R3,RMARG ;REASONABLE VALUE? BGT 10$ ;IF GT NO MOV R3,INDCT ;SET PARAGRAPH INDENT MOV R3,PARIND ;STORE PARA INDENT VALUE CALL (R4) ;GET PARAGRAPH SPACING MOV PARSP,R3 ;DEFAULT TO NORMAL SPACING CMP R3,#5 ;LEGAL VALUE? BHI 10$ ;IF HI NO MOV R3,PARSP ;SET NEW PARAGRAPH SPACING CALL (R4) ;GET TEST PAGE COUNT JMP 30$ ;IF NONE NO TEST CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 10$ ;IF HI NO MOV R3,PARPT ;SET NEW PARAGRAPH PAGE TEST COUNT PARTP:: MOV PARPT,R3 ;GET PAGE TEST COUNT CALL TESTP ;TEST IF ROOM ON PAGE 30$: MOV PARSP,R1 ;GET CURRENT PARAGRAPH SPACING LSTTP:: BEQ 40$ ;IF EQ NO SPACING MOV NSPNG,R0 ;GET LINES PER LINE CALL $MUL ;CALCULATE ACTUAL NUMBER OF LINES TO SKIP CMP $HDRSW,LINEC ;ALREADY IN HEADING AREA? BGE 40$ ;IF GE YES MOV R1,R2 ;SET LINE SKIP COUNT CALL SKIPN ;SKIP LINES 40$: RETURN ; .DSABL LSB ; ; TEST PAGE COMMAND ; .ENABL LSB TSTPG:: CALL (R4) ;GET ARGUMENT OF TEST JMP ILCM ;MUST BE ONE CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 10$ ;IF HI NO TESTP:: ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION CMP R3,NLPG ;COMPARE TO LENGTH W/O FOOTNOTES BLE 20$ JMP BPAGE ;TEST SHOWS NEAR END. BREAK PAGE. ; ; SPACING COMMAND ; SSP:: CALL (R4) ;GET ARGUMENT OF SPACING COMMAND 10$: JMP ILCM ;MUST BE ONE CMP R3,#5 ;MUST BE IN RANGE 1 TO 5 BHI 10$ TSTEQ R3,10$ ;ILLEGAL VALUE? MOV R3,NSPNG ;OK. STORE AS NORMAL SPACING 20$: RETURN ; .DSABL LSB ; ; SUBTITLE COMMAND ; .ENABL LSB SETSTL::MOV #STTLP1,R5 ;SET FOR SUBTITLE BUFFER BR 10$ ; ; ; FIRST TITLE COMMAND ; FTITL:: CLRB $HDSSW ;ENABLE HEADER ON FIRST PAGE ; ; TITLE COMMAND ; SETTL:: MOV #TTLP1,R5 ;SET FOR TITLE BUFFER 10$: MOV (R5),2(R5) ;INITIALIZE DESCRIPTOR ;**-1 SETBF:: CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND 20$: CALL GCIN ;READ A CHARACTER FROM TITLE OR SUBTITLE CMPEQ #CR,R1,30$ ;CARRIAGE RETURN? MOV R5,R4 ;POINT TO BUFFER POINTER CALL WCI ;WRITE CHARACTER IN BUFFER BR 20$ ; 30$: JMP ULBSET ;RESET UNDERLINE BUFFER .DSABL LSB ; ; LINE SKIPPING COMMANDS ; .ENABL LSB SKIPL:: MOV NSPNG,-(SP) ;SKIP COMMAND. N CURRENT LINES BR 10$ LINSKP::MOV #1,-(SP) ;BLANK COMMAND. N REAL LINES 10$: CALL (R4) ;GET OPTIONAL ARGUMENT MOV #1,R3 ;IF NONE, ASSUME 1 MOV (SP)+,R0 ;RETRIEVE NUMBER OF LINE TO SKIP TST R3 ;CHECK IF ARGUMENT IS NEG ;CAR 1 BMI 15$ ;IF NEGATIVE DO NOT MAKE TOP OF PAGE CHECK ;CAR 1 ;CAR 1 CMP LINEC,$HDRSW ;AT TOP OF PAGE? ;CAR 1 BLE 30$ ;IF LE YES ;CAR 1 15$: MOV R3,R1 ;CAR 1 CALL $MUL ;MULTIPLY ;CAR 1 TST R1 ;CHECK IF RESULT IS + ;CAR 1 BPL 17$ ;AND IF SO CONTINUE AS NORMAL ;CAR 1 ;CAR 1 MOV R1,R2 ;GET THE NUMBER OF LINES FROM END OF PAGE ;CAR 1 ADD NLPG,R2 ;R2 NOW HAS LINE NUMBER THAT WE WANT TO GET TO ;CAR 1 CMP R2,LINEC ;BUT CHECK IF WE HAVE ALREADY PASSED THAT POINT ;CAR 1 BGT 16$ ; IF GT OK ;CAR 1 ;CAR 1 MOV #1,R2 ;ELSE JUST SKIP 1 LINE ;CAR 1 BR 20$ ; ;CAR 1 ;CAR 1 16$: SUB LINEC,R2 ;GENERATE NUMBER OF LINES TO SKIP ;CAR 1 BR 20$ ;CAR 1 ;CAR 1 17$: MOV R1,R2 ;CHECK IF ROOM ON PAGE ;CAR 1 ADD LINEC,R1 ;ADD CURRENT LINE ;**-5 CMP R1,NLPG ;ROOM FOR ANOTHER? BLE 20$ JMP BPAGE ;NO. MAKE A NEW PAGE 20$: CALL SKIPN ;YES. SPACE OUT C(R2) LINES 30$: RETURN ; .DSABL LSB ; ; FIGURE COMMAND ; FIGUR:: CALL (R4) ;GET ARGUMENT MOV #1,R3 ;IF NONE, ASSUME ONE LINE CMP R3,PNLPG ;CHECK FOR RATIONAL ARGUMENT BLOS 10$ ;IF LOS OKAY JMP ILCM ;ERROR 10$: MOV R3,-(SP) ;SAVE DESIRED SPACE ADD LINEC,R3 ; SEE IF THE FIGURE WILL FIT ON THIS PAGE ;CAR 1 CMP R3,NLPG ; IF NOT, SAVE IT FOR TOP OF NEXT PAGE ;CAR 1 BLE 12$ ; IT WILL FIT ;CAR 1 ;CAR 1 ; IT WON'T FIT. HOLD IT FOR THE NEXT PAGE. IF WE ARE ALREADY HOLDING ONE ;CAR 1 ; FOR THE NEXT PAGE, FORCE A NEW PAGE NOW. ;CAR 1 TST FIGSAV ; ALREADY HOLDING ONE OFF? ;CAR 1 BNE 15$ ; YES ;CAR 1 MOV (SP)+,FIGSAV ; NO, HOLD THIS ONE ;CAR 1 RETURN ;CAR 1 ;CAR 1 15$: CALL BPAGE ; NEW PAGE (INCLUDING SPACE FOR PREV FIGURE) ;CAR 1 12$: MOV (SP)+,R2 ; PUT THE FIGURE HERE ;CAR 1 JMP SKIPN ;CAR 1 ;CAR 1 ;**-3 ; ; LITERAL COMMAND ; LITRL:: MOV (R5),LITSV ;SAVE CURRENT FLAGS WORD BIS #LITFG!SPECF,(R5) ;SET LITERAL FLAG MOV CMADR,LITCM ;SAVE CURRENT EXPECTED COMMAND ADDRESS MOV ELCMD,CMADR ;SET ADDRESS OF EXPECTED COMMAND BR FILOF ;TURN OFF FILL AND JUSTIFY ; ; END LITERAL COMMAND ; ELTRL:: MOV LITSV,(R5) ;RESTORE PREVIOUS FLAGS WORD MOV LITCM,CMADR ;RESTORE PREVIOUS EXPECTED COMMAND ADDRESS RETURN ; ; ; FILL AND JUSTIFY COMMANDS ; JUSTN:: BIS #JUSTF+PJUSTF,(R5) ;TURN ON JUSTIFYING RETURN ; JUSOF:: BIC #PJUSTF+JUSTF,(R5) ;TURN OFF JUSTIFY BITS RETURN ; FILLN:: BIS #FILLF+JUSTF,(R5) ;TURN ON FILLING, COPY PJUSTF TO JUSTF BITNE #PJUSTF,(R5),10$ ;COPY PERMANENT FLAG BIC #JUSTF,(R5) ;TO CURRENT ONE. 10$: RETURN ; FILOF:: BIC #FILLF+JUSTF,(R5) ;TURN OFF FILLING AND JUSTIFYING RETURN ; ; ; TAB STOP SELECTION COMMAND ; SETTAB::CLR NTABS ;CLEAR NUMBER OF TABS SETT1: CALL (R4) ;GET ANOTHER STOP IF ANY NOP ; RETURN ; INC NTABS ;POINT TO NEXT ITEM MOV NTABS,R0 MOVB R3,TABTAB-1(R0) ;STORE THIS TABSTOP CMP R0,#TABTL-1 ;CHECK TABLE SIZE BLO SETT1 ;OK. JMP ILCM ;TOO MANY TABS ; ; CENTER COMMAND ; CENTER::MOV RMARG,R3 ;GET RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV RMARG,R3 ;DEFAULT IS RIGHT MARGIN MOV R3,-(SP) ;STORE CALL $FRCND ;FORCE TO LOGICAL END OF COMMAND CMPNE #CR,R1,CENT1 ;NOT END OF LINE? 10$: CALL GCIN ;DISCARD REST OF THIS COMMAND CMPNE R1,#LF,10$ ;NOT LINE FEED? CENT1: CALL GCIN ;READ LINE TO BE CENTERED CMPEQ R1,#CR,CENT2 ;CARRIAGE RETURN? CALL WLNIN1 ;PUT IN LINE INPUT BUFFER BR CENT1 ;LOOP FOR MORE CENT2: MOV (SP)+,R2 ;COMPUTE SPACING BEFORE LINE ADD LNIN1,R2 ;AS HALF RIGHT MARGIN SUB LNIN2,R2 ;MINUS HALF OF LINE SIZE SUB LMARG,R2 ;MINUS LEFT MARGIN ADD NSPCH,R2 ; INCLUDING UNDERLINES, ET ASR R2 ;TAKE HALF ADD LMARG,R2 ;ADD IN LEFT MARGIN ADD RIGSHI,R2 ;ADD ON RIGHT SHIFT SPACE ;CAR 1 ADD EBSIZ,R2 ;ADD ON CHANGE BAR AREA ;CAR 1 CALL NSPAC ;OUTPUT SPACES MOV #LNIN1,R4 ;THEN OUTPUT LINE BUFFER TO FILE CALL PSTRPA ; .. JMP SKIPS ; .. ; ; FOOTNOTE COMMAND ; FOOTN:: CALL (R4) ;HOW MANY LINES TO RESERVE? 5$: JMP ILCM ;MUST HAVE SPEC CMP R3,PNLPG ;VALUE WITHIN REASON? BHI 5$ ;IF HI NO MOV NSPNG,R0 ;RESERVE N TIMES SPACING MOV R3,R1 CALL $MUL ;MULTIPLY ADD R1,FOOTC ;ADD TO RESERVED FOOTNOTE LINES CALL $FRCND ;FORCE TO LOGICAL END OF LINE CLRB GCSCH ;CLEAR TERMINAL CHARACTER CMPNE #CR,R1,40$ ;NOT END OF LINE? 10$: CALL CCIN ;SKIP REST OF COMMAND LINE CMPNE R1,#LF,10$ ;NOT LINE FEED? BR 40$ ; 20$: CALL CCIN ;READ A CHARACTER 30$: CALL WCIFTN ;WRITE CHARACTER IN BUFFER CMPNE R1,#LF,20$ ;NOT END OF LINE? 40$: CALL CCIN ;SEE WHAT CHARACTER AFTER LINE FEED IS CMPEQ R1,#EOF,50$ ;END OF FILE? CMPNE #'!,R1,30$ ;NOT END OF FOOTNOTE? MOV #EOF,R1 ;SET END OF FOOTNOTE 50$: JMP WCIFTN ;STORE THIS CHARACTER ; ; PERIOD SPACING COMMANDS ; PERSP:: MOV SP,$PERSW ;ENABLE TWO SPACES AFTER PUNCTUATION RETURN ; NPERS:: CLR $PERSW ;DISABLE TWO SPACES AFTER PUNCTUATION RETURN ; ; ; COROUTINE TO SHIFT TO UPPER CASE TEMPORARILY ; SHFUC:: MOV (SP),-(SP) ;COPY RETURN ADDRESS MOV CAS,2(SP) ;SAVE CURRENT CASE CLR CAS ;SET FOR UPPER CASE CALL @(SP)+ ;CALL THE CALLER BACK MOV (SP)+,CAS ;RESTORE PREVIOUS CASE RETURN ; .END