.TITLE RNCMD .IDENT /M01/ ; ; 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 M01 ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 27-JUL-75 ; ; F. BORGER MAY 77 ; ; .MCALL GTIM$C ; RUNOFF COMMANDS ; ; ALL COMMAND ROUTINES ARE ENTERED WITH: ; ; R4=ADDRESS OF NUMBER CONVERSION ROUTINE. ; R5=ADDRESS OF FLAG WORD F.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 ; ; ; INDENT COMMAND ; WIDE:: ;CENTRONICS TYPE INDENT TST WIDCHR ;ARE WE FLAGED TO DO THIS ? BEQ INDENT ;SKIP IF NOT INC WIDLIN ;SET FLAG 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 TST WIDLIN ;CURRENT TO BE WIDE INDENT BEQ 20$ ;BR IF NOT CLR WIDLIN ;CLEAR THIS FLAG MOV #CH.WID,R1 ;GET WIDE PROMPT FOR CENTRONICS CALL FOUT ;OUTPUT HIM INC THILIN ;SHOW THIS LINE TO BE WIDE 20$: ; ; BREAK COMMAND ; BREAK:: RETURN ; ; ; CASE SELECTION COMMANDS ; .ENABL LSB LWCAS:: MOV #40,R1 ;SET FOR LOWER CASE BIT #UPCSW,$SWTCH ;FORCE ALL UPPER CASE? BEQ 10$ ;IF EQ NO 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 JMP PAGEC ;OK BREAK PAGE 20$: RETURN ; ; ; SUB PAGE COMMAND ; SPAGE:: CMP $HDRSW,LINEC ;IN HEADER REGION OF PAGE? BGE 20$ ; IF GE YES JMP TPAGE ;OK BREAK PAGE 20$: RETURN ; ; SET SUBPAGE ROUTINE ; SETSB:: MOV SP,$SBPSW ;SET SUBPAGE FLAG INC SUBPGE ;COUNT A SUBPAGE RETURN ;THATS ALL ; ; END SUBPAGE COMMAND ; CLRSB:: CLR $SBPSW ;CLEAR SUBPAGE FLAG MOV #SPC,SUBPGE ;RESET SUBPAGE COUNT RETURN ;AND 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 SINGLE SPACING CLR LMARG ;SET LEFT MARGIN TO ZERO MOV #SPARIN,PARIND ;SET INITIAL PARAGRAPH INDENT MOV #SDLPG,R3 ;SET 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 SPACING? BHI 10$ ;IF HI NO TST R3 ;LEGAL SPACING? BEQ 10$ ;IF EQ NO MOV R3,PARSP ;SET NEW PARAGRAPH SPACING MOV PARTP,R3 ;GET CURRENT TEST PAGE COUNT CALL RCNR ;GET RELATIVE ARGUMENT JMP 30$ ;IF NONE NO TEST 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 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 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 COMAND ; SSP:: CALL (R4) ;GET ARGUMENT OF SPACING COMMAND 10$: JMP ILCM ;MUST BE ONE CMP R3,#5 ;MUST BE IN RANGE 1 TO 5 BGT 10$ TST R3 ;.. BLE 10$ ;IF LE ERROR 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 9$ ;AND JOIN TITLE SEQUENCE ; ; FIRST TITLE COMMAND ; FTITL:: CLRB $HDSSW ;ENABLE HEADER ON FIRST PAGE ; ; TITLE COMMAND ; SETTL:: MOV #TTLP1,R5 ;SET FOR TITLE BUFFER 9$: CMP HEADFL,#UPPER ;WANT UPPER CASE HEADER ? BNE 10$ ;IF NOT, SKIP NEXT CALL SHFUC ;SHIFT TO UPPER CASE FOR TITLE 10$: MOV (R5),2(R5) ;INITIALIZE DESCRIPTOR SETBF:: CALL GCIN ;READ CHARACTER AFTER COMMAND CMP #' ,R1 ;SPACE? BNE 30$ ;IF NE NO 20$: CALL GCIN ;READ A CHARACTER FROM TITLE OR SUBTITLE 30$: CMP #CR,R1 ;CARRIAGE RETURN? BEQ 40$ ;IF EQ YES MOV R5,R4 ;POINT TO BUFFER POINTER CALL WCI ;WRITE CHARACTER IN BUFFER BR 20$ ; 40$: JMP ULBSET ;RESET UNDERLINE BUFFER .DSABL LSB ; ; DATE COMMAND (ADDED BY F. BORGER) ; DATE:: CALL GCIN ;GET POSSIBLE NEXT CHARACTER CMP R1,#C.SP ;A SPACE IMPLYING SPECIFIED DATE ? BNE DATE1 ;NO GET CURRENT DATE CLR TIMSIZ ;YES CLEAR COUNT OF DATE STRING MOV #TIMTAG,R0 ;AND SET STRING POINTER 1$: CALL GCIN ;GET NEXT CHARACTER CMP R1,#C.CR ;END OF STRING ? BEQ 2$ ;YES MOVB R1,(R0)+ ;NO STORE CHARACTER INC TIMSIZ ;COUNT IT CMP TIMSIZ,#9. ;MAX STRING SIZE REACHED ? BGE 2$ ;YES BR 1$ ;NO, GET ANOTHER CHARACTER 2$: CLRB (R0) ;SET END OF STRING NULL BR ENDDAT ;AND RETURN DATE1: .IF NDF RSTS GTIM$C TIMBUF ;GET CURRENT TIME & DATE MOV #TIMTAG,R0 ;BUFFER ADDRESS TO R0 MOV G.TIDA+TIMBUF,R1 ;DAY TO R1 CLR R2 ;SUPRESS LEADING ZERO'S JSR PC,$CBDMG ;CONVERT DAY TO ASCII MOVB #'-,(R0)+ ;INSERT "-" MOV G.TIMO+TIMBUF,R1 ;MOVE MONTH TO R1 DEC R1 ;MASSAGE HIM TO BE TABLE OFFSET MUL #3,R1 ;INTO ASCII MONTH TABLE ADD #MONTAB,R1 ;ADD TABLE BASE MOVB (R1)+,(R0)+ ;AND FILL IN 3 LETTERS MOVB (R1)+,(R0)+ MOVB (R1)+,(R0)+ MOVB #'-,(R0)+ ;INSERT ANOTHER "-" MOV G.TIYR+TIMBUF,R1 ;YEAR TO R1 JSR PC,$CBDMG ;CONVERT TO ASCII SUB #TIMTAG,R0 ;SUB START OF STRING MOV R0,TIMSIZ ;SAVE SIZE OF STRING FOR LATER PRINT .ENDC ENDDAT: RETURN ;AND RETURN ; ; ;NO DATE COMMAND NODATE:: CLR TIMSIZ ;CLEAR STRING SIZE MOV #TIMTAG,R0 ;POINT AT STRING 1$: MOVB #40,(R0)+ ;FILL IN A SPACE INC TIMSIZ ;COUNT 1 CMP TIMSIZ,#9. ;ALL NINE CHARACTERS ? BGE 2$ ;YES BR 1$ ;NO DO AGAIN 2$: CLRB (R0) ;TERMINATE STRING RETURN ;AND RETURN ; ;BUFFER OF MONTH NAMES MONTAB: .ASCII /JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC/ ; ; 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,NLPG ;CHECK FOR RATIONAL ARGUMENT BGT ..109 TST R3 ;.. BGT ..110 ..109: JMP ILCM ;BAD. ERROR ..110: 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 BIT #PJUSTF,(R5) ;COPY PERMANENT FLAG BNE 10$ 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 ; ADD #2,NTABS ;GET POINTER MOV NTABS,R0 MOV R3,TABTAB-2(R0) ;STORE THIS TABSTOP CMP R0,#TABTL-2 ;CHECK TABLE SIZE BLO SETT1 ;OK. JMP ILCM ;TOO MANY TABS ; ; CENTER COMMAND ; CENWID:: ;CENTER CENTRONICS STYLE TST WIDCHR ;SWITCH SET FOR CENTRONICS OUTPUT ? BEQ CENTER ;IF NOT, DEFAULT TO NORMAL INC WIDLIN ;ELSE SET FLAG FOR WIDE LINE CENTER::MOV RMARG,R3 ;GET PERMANENT RIGHT MARGIN CALL (R4) ;GET RELATIVE ARGUMENT MOV PRMRG,R3 ;DEFAULT IS PERMANENT RIGHT MARGIN MOV R3,-(SP) ;STORE ..127: CALL GCIN ;DISCARD REST OF THIS COMMAND CMP R1,#LF ; .. BNE ..127 ; .. CENT1: CALL GCIN ;READ LINE TO BE CENTERED CMP R1,#CR ;THROUGH CR BEQ CENT2 ; CR DONE. CALL WLNIN1 ;PUT IN LINE INPUT BUFFER BR CENT1 ;LOOP FOR MORE CENT2: MOV (SP)+,R2 ;COMPUTE SPACING BEFORE LINE MOV LMARG,-(SP) ;SAVE LEFT MARGIN IN CASE WE DIDDLE HIM TST WIDLIN ;WIDE CHARACTERS ?? BEQ 1$ ;BR IF NOT MOV #CH.WID,R1 ;WIDE CHARACTER FLAG FOR CENTRONICS CALL FOUT ;OUTPUT HIM FIRST INC THILIN ;SHOW THIS LINE WILL BE WIDE CLR WIDLIN ;AND CLEAR WIDE CENTER FLAG ASR R2 ;AND USE HALF RIGHT MARGIN MOV LMARG,R1 ;GET LEFT MARGIN ASR R1 ;AND MAKE HIM HALF MOV R1,LMARG 1$: 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 MOV (SP)+,LMARG ;RESTORE 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 MOV NSPNG,R0 ;RESERVE N TIMES SPACING MOV R3,R1 CALL $MUL ;MULTIPLY ADD R1,FOOTC ;ADD TO RESERVED FOOTNOTE LINES 10$: CALL CCIN ;SKIP REST OF COMMAND LINE CMP R1,#LF ; .. BNE 10$ BR 40$ ;YES. END OF LINE. 20$: CALL CCIN ;READ A CHARACTER 30$: CALL WCIFTN ;WRITE CHARACTER IN BUFFER CMP R1,#LF ;END OF LINE? BNE 20$ 40$: CALL CCIN ;YES. SEE WHAT CHAR AFTER LF IS CMP R1,#EOF ;END OF FILE? BEQ 50$ ;IF EQ YES CMP #'!,R1 ;END OF FOOTNOTE? BNE 30$ ;NO. STORE ANOTHER LINE MOV #EOF,R1 ;SET END OF FOOTNOTE 50$: MOVB #LF,GCSCH ;SET FINAL CHARACTER TO LINE FEED JMP WCIFTN ;YES. 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