.TITLE RNFIO .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 14-SEP-75 ; ; F.BORGER MAY 77 (ADD 2-HEAD CENTRONICS SUPPORT) ; ; RUNOFF I/O ROUTINES ; ; MACRO LIBRARY CALLS ; .MCALL GET$S,PUT$S,WRITE$,WTSE$S ; ; LOCAL DATA ; ; I/O STATUS BLOCK ; .IF DF RSTS IOSB: .BLKW 2 ; .ENDC ;+ ; FILE INPUT/OUTPUT ROUTINES ;- .ENABL LSB FMSGL: INC S1 FMSG:: MOVB @S1,R1 BNE 1$ ;A NULL CHARACTER ? JMP 40$ ;JMP IF YES 1$: CALL FOUT ;OUTPUT CHARACTER BR FMSGL ;LOOP CRLF:: MOV (PC)+,R1 ;GET CARRIAGE RETURN AND LINE FEED .BYTE CR,LF ; CALL FOUT ;OUTPUT CARRIAGE RETURN SWAB R1 ;SWAP LINE FEED TO RIGHT BYTE ;AND FALL INTO FOUT ROUTINE FOUT:: MOVB R1,@HFOUT+2 ;STORE CHARACTER IN BUFFER TST SPECHR ;DIABLO OUTPUT ? BEQ 5$ ;BR IF NOT TST PROSIZ ;NEED TO CHANGE SPACING BACK TO PREVIOUS ? BEQ 2$ ;NO CMPB R1,#40 ;PRINTING CHARACTER ? BLT 2$ ;IF NOT, DON'T COUNT DEC PROSIZ ;COUNT ONE CHARACTER BNE 2$ ;AND SKIP IF NOT YET TIME INC HFOUT+2 DEC HFOUT+4 MOVB #33,@HFOUT+2 ;PUT IN ESC INC HFOUT+2 DEC HFOUT+4 MOVB #CH.SPA,@HFOUT+2 ;PUT IN SPACING SELECT INC HFOUT+2 DEC HFOUT+4 CMP PROSPA,#15 ;DON'T DECREMENT BELOW 12/100" BLE 111$ DEC PROSPA ;DECREMENT SPACING SIZE 111$: MOVB PROSPA,@HFOUT+2 ;AND PUT CHAR IN OUTPUT BUFFER TST HFOUT+4 BGT 2$ ;BR IF OK JMP OUTPUT ;ELSE OUTPUT BUFFER 2$: CMPB R1,#TC.RED ;SHIFT TO RED ? BNE 3$ ;BR IF NOT MOVB #33,@HFOUT+2 ;CHANGE TOKEN TO AN "ESC" INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;DEC ROOM COUNTER MOVB #'A,@HFOUT+2 ;AND PUT IN AN "A" INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;ANY MORE ROOM IN BUFFER ? BGT 6$ ;BR IF OK,SKIPPING TESTS JMP OUTPUT ;ELSE OUTPUT BUFFER 3$: CMPB R1,#TC.BLK ;SHIFT TO BLACK ? BNE 4$ ;SKIP IF NOT MOVB #33,@HFOUT+2 ;CHANGE TOKEN TO AN "ESC" INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;DEC ROOM COUNTER MOVB #'B,@HFOUT+2 ;AND PUT IN AN "B" INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;ANY MORE ROOM IN BUFFER ? BLE OUTPUT ;OUTPUT BUFFER IF FILLED BR 6$ ;ELSE OUTPUT, SKIPPING TESTS 4$: CMPB R1,#TC.SPA ;SELECT PROPORTIONAL SPACING ? BNE 5$ ;BR IF NOT MOVB #33,@HFOUT+2 ;CHANGE TOKEN TO AN ESC INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;DECREMENT ROOM COUNTER MOVB #CH.SPA,@HFOUT+2 ;ADD SPACING SELECT CHARACTER INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;DECREASE ROOM COUNTER MOVB PROSPA,@HFOUT+2 ;PUT IN SPACING CHARACTER INC HFOUT+2 ;BUMP POINTER DEC HFOUT+4 ;DECREASE ROOM COUNTER BLE OUTPUT ;OUTPUT BUFFER IF FILLED BR 6$ ;ELSE OUTPUT, SKIPPING TESTS 5$: INC HFOUT+2 ;INCREMENT BUFFER POINTER DEC HFOUT+4 ;ANY MORE ROOM IN BUFFER? BEQ OUTPUT ;IF EQ NO CMPB R1,#CR ;END OF LINE ? BEQ OUTPUT ;IF YES, OUTPUT IT 6$: .IF DF S2HEAD ;A TWO HEADED CENTRONICS ?? TST THILIN ;WILL THIS LINE BE WIDE CHARACTERS ? BEQ 10$ ;BR IF NOT INC THICNT ;ELSE COUNT ONE CMP THICNT,#33. ;REACHED PLACE WHERE WE PUT IN NULLS ? BNE 10$ ;BR IF NOT MOV R5,-(SP) MOV #33.,R5 ;SET UP COUNT 7$: MOVB #40,@HFOUT+2 ;FILL IN A DUMMY CHARACTER DEC HFOUT+4 ;KEEP COUNTERS UP TO DATE INC HFOUT+2 SOB R5,7$ ;LOOP TILL 33 FILLED IN MOV (SP)+,R5 ;RESTORE REG CLR THILIN ;AND CLEAR FLAG CLR THICNT ;AND COUNTER 10$: .ENDC RETURN ; FIN:: DEC HFIN+4 ;ANYTHING IN BUFFER? BGT 30$ ;IF GT YES GET$S #TTLDMY,#INBUF,HFIN ;INPUT A RECORD BCC 20$ ;BR IF I/O OK CMPB #IE.EOF,F.ERR(R0) BEQ 222$ ;IF EQ, JUST END OF INPUT FILE JMP RDERR3 ;IF NE ERROR 222$: MOV #1,F.NRBD(R0) ;SET BYTE COUNT TO 1 MOVB #EOF,INBUF ;SET EOF BYTE 20$: MOV F.NRBD(R0),-(SP) ;GET BYTE COUNT OF LINE MOV F.NRBD+2(R0),R0 ;AND GET THE BUFFER ADDRESS ADD (SP),R0 ;ADVANCE POINTER TO END OF CHARACTERS MOVB #CR,(R0)+ ;SET CR/LF AT END OF LINE MOVB #LF,(R0)+ ; ADD #2,(SP) ;AND ADJUST BYTE COUNT MOV (SP)+,HFIN+4 ;SET COMMON HEADER MOV #INBUF-1,HFIN+2 ;RESET POINTER FOR EMPTY 30$: INC HFIN+2 ;POINT TO CHARACTER MOVB @HFIN+2,R1 ;NO. GET CHAR BEQ FIN ;IF EQ NULL CMP R1,#177 ;RUBOUT? BEQ FIN ;GET ANOTHER 40$: RETURN ; .DSABL LSB ; ; THIS ROUTINE OUTPUTS THE CURRENT CONTENTS OF THE LINE BUFFER ; .IF DF RSTS OUTPUT::MOV HFOUT+4,-(SP) ;GET REMAINING SPACE IN BUFFER BEQ 20$ ;IF EQ NONE 10$: CLRB @HFOUT+2 ;CLEAR BUFFER INC HFOUT+2 ;INCREMENT BUFFER ADDRESS DEC (SP) ;ANY MORE TO CLEAR? BGT 10$ ;IF GT YES 20$: TST (SP)+ ;CLEAN STACK .IFF OUTPUT:: CLR THILIN ;CLEAR FLAG CLR THICNT ;AND COUNT CLR PROFLG ;CLEAR PROP SPACING FLAG MOV HFOUT,LSTBLK+F.NRBD ;CALCULATE LENGTH OF LINE TO OUTPUT SUB HFOUT+4,LSTBLK+F.NRBD ; BEQ OUT3 ;IF EQ EMPTY BUFFER .IFTF TSTB CHPTN ;CHAPTER MODE ON ? BEQ 1$ ;BR IF NOT CHAPTER ORIENTED CMPB CHPTN,LOWCHA ;ELSE CHECK FOR CHAPTER RANGE BLO OUT1 ;SKIP IF TOO LOW CMPB CHPTN,HGHCHA ;IF TOO BIG BHI OUT2 ;QUIT IF TOO HIGH 1$: CMP PAGENO,LOWPAG ;ONLY PRINT IN THE SELECTED PAGE BLO OUT1 ;RANGE CMP PAGENO,HGHPAG BHI OUT2 ;QUIT IF BEYOND RANGE .IFT WRITE$ #LSTBLK,#OUBUF,#512.,,#1,#IOSB ;OUTPUT BUFFER BCS WRERR3 ;IF CS ERROR WTSE$S #1 ;WAITFOR I/O TO COMPLETE .IFF ;CHANGED TO DO RECORD TYPE PUTS. THIS WILL DISABLE OVERPRINTING ;SO CAN'T DO UNDERLINES WITH OVERPRINTING LINES, BUT HAVE NO TERMINALS ;THAT CAN DO IT, SO NO REAL LOSS ;ALSO CHANGED LSTBLK IN RNORSX TO BE RECORD ORIENTED CMP LSTBLK+F.NRBD,#2 ;ONE OR 2 CHARACTER OUTPUT ? BGT PRINT ;NO SO SKIP ALL TESTS CMP LSTBLK+F.NRBD,#1 ;YES, IS I 1 CHARACTER ? BEQ ONECHR ;YES, DO IT CMPB OUBUF+1,#15 ;IS IT LF-CR OR FF-CR ? BNE PRINT ;NO, SO OUTPUT CMPB OUBUF,#14 ;A FORM-FEED,CARRET ? BNE CKLF ;NO CHECK FOR LF,CARRET ;MOD TO NOT OUTPUT FF7'S IF PAUSING BETWEEN ;PAGES, OTHERWISE FF EJECTS FIRST SHEET OF ;PAPER BIT #PAUSW,$SWTCH ;IS PAUSE SWITCH ON BEQ 11$ ;BR IF NOT MOVB #40,OUBUF ;ELSE CHANGE TO A SPACE 11$: BR PRINT1 ;YES, PRINT ONE CHARACTER RECORD CKLF: CMPB OUBUF,#12 ;A LINE-FEED,CARRET BNE PRINT ;NO SO PRINT IT MOVB #40,OUBUF ;YES, CHANGE TO 1 SPACE PRINT1: DEC LSTBLK+F.NRBD ;CHANGE TO PRINT 1 CHARACTER RECORD BR PRINT ;AND PRINT IT ONECHR: CMPB OUBUF,#15 ;JUST PRINTING CARRET ? BEQ OUT1 ;YES, SO IGNORE CMPB OUBUF,#12 ;OR JUST A LINE-FEED BEQ OUT1 ;IGNORE ALSO PRINT: MOV R5,-(SP) ;SAVE REG MOV #OUBUF,R5 ;GET START OF OUTPUT BUFFER ADD LSTBLK+F.NRBD,R5 ;ADD LENGT OF RECORD DEC R5 ;HAVE POINTER TO LAST CHARACTER CMPB (R5),#15 ;CARRET AT END BNE NOCR ;NO DEC LSTBLK+F.NRBD ;YES, DON'T DO IT NOCR: MOV (SP)+,R5 ;RESTORE REGISTER CMPB OUBUF,#12 ;LEADING LF ? BEQ PRINLF ;IF SO, DON'T PRINT IT PUT$S #LSTBLK,#OUBUF ;OUTPUT LINE BR PRDONE ;AND SKIP NEXT PRINLF: PUT$S #LSTBLK,#OUBUF+1 ;OUTPUT LINE SKIPPING LEADING LF PRDONE: ;WE PUT THE RECORD .ENDC BCS WRERR3 ;IF CS ERROR OUT1: MOV HFOUT,HFOUT+4 MOV #OUBUF,HFOUT+2 OUT3: RETURN ; OUT2: CALL OUT1 ;RESET POINTERS TO AVOID SIDE EFFECTS TST HGHPAG ;SEE IF WE HAVE BEEN HERE BEFORE BEQ OUT3 ;IF SO JUST RETURN CLR HGHPAG JMP ENDFIL ;OTHERWISE INITIATE TERMINATION ; ; I/O ERROR EXITS ; WRERR3: CALL $ERMSG .WORD OUTERR WRERR4: JMP RUNOFF ;RESTART RDERR3: CALL $ERMSG .WORD INPERR BR WRERR4 ;RESTART ; ; TERMINAL I/O ROUTINES ; ; THIS ROUTINE PERFORMS THE EQUIVALENT OF THE TTCALL 3, ; OF THE PDP-10. ; TTC3:: MOV @(SP),R0 ;GET ADDRESS OF INPUT STRING ADD #2,(SP) ;SKIP OVER STRING ADDRESS MOV #TTBUF,R1 ;ADDRESS OF OUTPUT STRING 10$: MOVB (R0)+,(R1)+ BNE 10$ SUB #TTBUF,R1 MOV R1,TTBLK+F.NRBD ;SET COUNT OF CHARACTERS TTC33:: PUT$S #TTBLK,#TTBUF CLR TTBLK+F.NRBD ;MAKE THE LINE EMPTY RETURN ; ;+ ; READ TERMINAL INPUT RECORD ;- TTC4N:: GET$S #TTIBLK ;GET A RECORD RETURN ; ;THIS ROUTINE SIMULATES TTCALL 1, WHICH OUTPUTS ONE ;CHARACTER AT A TIME TTC1:: CMP #TTLIN,TTBLK+F.NRBD ;CHECK FOR FULL BUFFER BGT 10$ ;IF GT NO CALL TTC33 ;OUTPUT THE LINE 10$: MOVB R1,@TTBLK+F.NRBD+2 INC TTBLK+F.NRBD+2 INC TTBLK+F.NRBD RETURN ; .END