.TITLE RNCMD .IDENT /M02.4/ ; ; 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 ; ; Bradford A. Lubell 10-Oct-81 ;M2.4 ; ;**-1 ; RUNOFF COMMANDS ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ;M2.4 ; ;**-2 ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ;M2.4 ; R5=ADDRESS OF FLAG WORD F.1. ;M2.4 ; ;**-1 ; AUTOPARAGRAPH COMMANDS ;M2.4 ; ;M2.4 ;M2.4 AUTOP:: MOV SP,$AUTSW ;SET AUTOPARAGRAPH MODE ;**-1 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 #ILMRG,R3 ;IF NONE, INITIALIZE CMP R3,RMARG ;MUST BE LESS THAN RIGHT MARGIN? BGE 10$ ;IF GE NO MOV R3,LMARG ;OK SAVE AS LEFT MARGIN RETURN ; ; ; STANDARD COMMAND ; STAND:: MOV #SPCNG,NSPNG ;SET STANDARD SPACING MOV #ILMRG, LMARG ;INITIALIZE LEFT MARGIN MOV #IPARIN,PARIND ;SET INITIAL PARAGRAPH INDENT MOV #INLPG,R3 ;SET INITIAL PAGE LENGTH PARAMETER 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 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 ; ; Pitch command ;M2.4 ; ;**-1 PITSET::TSTEQ TT$SWT,PITRET ; Check for valid terminal type ;M2.4 CALL (R4) ; Fetch horizontal pitch specification ;M2.4 JMP 20$ ;M2.4 TSTEQ R3,10$ ; Check for legal value ;M2.4 CMP R3,#60. ; 0 < X < 60. ;M2.4 BLE 30$ ;M2.4 10$: JMP ILCM ;M2.4 20$: MOV #-1,R3 ;M2.4 30$: MOV R3,-(SP) ; Save pitch on the stack ;M2.4 ;M2.4 CALL (R4) ; Fetch the vertical pitch specification ;M2.4 JMP BASET ;M2.4 TSTEQ R3,10$ ; Test for valid range ;M2.4 CMP R3,#48. ; 0 < X < 48. ;M2.4 BGT 10$ ;M2.4 MOV R3,R1 ; Divide into 48 for motion index ;M2.4 MOV #48.,R0 ;M2.4 CALL $DIV ;M2.4 MOV R0,VP$LPI ; Save the vertical pitch count ;M2.4 ;M2.4 BASET:: MOV (SP)+,R1 ; Fetch the horizontal pitch ;M2.4 BLE PITRET ;M2.4 MOV #60.,R0 ; 1/60 for AJ ;M2.4 CMPEQ #1,TT$SWT,10$ ;M2.4 ROL R0 ; 1/120 for Diablo ;M2.4 10$: CALL $DIV ;M2.4 CMPEQ #1,TT$SWT,20$ ;M2.4 INC R0 ; Diablo is off by one ;M2.4 20$: MOV R0,VP$BAS ;M2.4 PITRET::RETURN ;M2.4 ;M2.4 ; ;**-10 ; TEST PAGE COMMAND ;M2.4 ; ;**-1 .ENABL LSB ;M2.4 TSTPG:: CALL (R4) ;GET ARGUMENT OF TEST ;M2.4 JMP ILCM ;MUST BE ONE ;M2.4 CMP R3,PNLPG ;VALUE WITHIN REASON? ;M2.4 BHI 10$ ;IF HI NO ;M2.4 TESTP:: ADD LINEC,R3 ;ADD ON CURRENT LINE POSITION ;M2.4 CMP R3,NLPG ;COMPARE TO LENGTH W/O FOOTNOTES ;M2.4 BLE 20$ ;M2.4 JMP BPAGE ;TEST SHOWS NEAR END. BREAK PAGE. ;M2.4 ;M2.4 ; ;**-9 ; SPACING COMMAND ;M2.4 ; ;**-1 SSP:: CALL (R4) ;GET ARGUMENT OF SPACING COMMAND ;M2.4 10$: JMP ILCM ;MUST BE ONE ;M2.4 CMP R3,#5 ;MUST BE IN RANGE 1 TO 5 ;M2.4 BHI 10$ ;M2.4 TSTEQ R3,10$ ;ILLEGAL VALUE? ;M2.4 MOV R3,NSPNG ;OK. STORE AS NORMAL SPACING ;M2.4 20$: RETURN ; ;M2.4 .DSABL LSB ;M2.4 ;M2.4 ; ;**-4 ; SUBTITLE COMMAND ;M2.4 ; ;**-1 .ENABL LSB ;M2.4 SETSTL::MOV #STTLP1,R5 ;SET FOR SUBTITLE BUFFER ;M2.4 BR 10$ ; ;M2.4 ;M2.4 ; ;**-2 ; FIRST TITLE COMMAND ;M2.4 ; ;**-1 FTITL:: CLRB $HDSSW ;ENABLE HEADER ON FIRST PAGE ;M2.4 ;M2.4 ; ;M2.4 ; TITLE COMMAND ;M2.4 ; ;M2.4 ;M2.4 SETTL:: MOV #TTLP1,R5 ;SET FOR TITLE BUFFER CALL SHFUC ;SHIFT TO UPPER CASE FOR TITLE 10$: MOV (R5),2(R5) ;INITIALIZE DESCRIPTOR 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 CMP LINEC,$HDRSW ;AT TOP OF PAGE? BLE 30$ ;IF LE YES MOV R3,R1 CALL $MUL ;MULTIPLY MOV R1,R2 ;CHECK IF ROOM ON PAGE ADD LINEC,R1 ;ADD CURRENT LINE 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 CALL TESTP ;TEST IF PAGE SHOULD BE BROKEN MOV (SP)+,R2 ;GET BACK DESIRED SIZE JMP SKIPN ;SPACE THAT OUT ; ; 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 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