.TITLE RNFIO .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 I/O ROUTINES ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 14-SEP-75 ; ; C. H. Spalding, Unimation, Dec. '82 ; ; SIG MODIFICATION ; ; SIG01 CHANGE DEVICE FOR WAIT TO TI ; SIG02 INCORPORATE RSTS CHANGES ; chs59 Add limit on chapters output ; chs Protect R0 during terminal output ; chs88b Add ENABLE/DISABLE OUTPUT ; chs89 Cleaned up file I/O to save space ; ; MACRO LIBRARY CALLS ; ;SIG02 .MCALL GET$S,PUT$S ;SIG02 ; FILE INPUT/OUTPUT ROUTINES ;SIG02 .ENABL LSB FMSGL: INC S1 FMSG:: MOVB @S1,R1 BEQ 40$ ;IF EQ NULL CALL FOUT ;OUTPUT CHARACTER BR FMSGL ;LOOP CRLF:: MOV (PC)+,R1 ;GET CARRIAGE RETURN AND LINE FEED .BYTE LF,CR ; MOV PC,-(SP) ;SET TO REPEAT OUTPUT TWICE SWAB R1 ;SWAP CHARACTER TO RIGHT BYTE FOUT:: MOVB R1,@HFOUT+2 ;STORE CHARACTER IN BUFFER INC HFOUT+2 ;INCREMENT BUFFER POINTER DEC HFOUT+4 ;ANY MORE ROOM IN BUFFER? BEQ OUTPUT ;IF EQ NO RETURN FIN:: DEC HFIN+4 ;ANYTHING IN BUFFER? BGT 30$ ;IF GT YES ;; GET$S #TTLDMY,#INBUF,HFIN ;INPUT A RECORD ;chs89 GET$S #TTLDMY ;INPUT A RECORD ;chs89 BCC 20$ ;BR IF I/O OK CMPNEB #IE.EOF,F.ERR(R0),RDERR3 ;NOT END OF FILE? 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 BNE 25$ ;IF NE NOT NULL LINE MOVB #' ,@F.NRBD+2(R0) ;INSERT A BLANK INC (SP) ;INCREMENT BYTE COUNT 25$: 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 ;GET NEXT CHARACTER FROM INPUT RECORD BIC #^C<177>,R1 ;CLEAR EXCESS BITS BEQ FIN ;IF EQ NULL CMPEQ R1,#177,FIN ;RUBOUT? 40$: RETURN .DSABL LSB ; OUTPUT THE CURRENT CONTENTS OF THE LINE BUFFER ;SIG02 OUTPUT::MOV HFOUT,LSTBLK+F.NRBD ;CALC LENGTH OF LINE TO OUTPUT ;SIG02 SUB HFOUT+4,LSTBLK+F.NRBD ; ;SIG02 BEQ OUT3 ;IF EQ EMPTY BUFFER ;SIG02 .IF NZ CHSW ;chs59+ CMPB CHPTN,LOCHAP ;WITHIN THE SELECTED CHAPTER RANGE? BLO OUT1 ; NOT YET, DON'T OUTPUT CMPB CHPTN,HICHAP ;BEYOND THE DESIRED RANGE? BHI OUT2 ; YES, QUIT .ENDC ; NZ CHSW ;chs59- CMP PAGENO,LOWPAG ;ONLY PRINT IN THE SELECTED PAGE BLO OUT1 ;RANGE CMP PAGENO,HGHPAG BHI OUT2 ;QUIT IF BEYOND RANGE .IIF NZ ENAOUT, TSTEQB $OUTSW,OUT1 ;SKIP IF OUTPUT DISABLED ;chs88b ;; PUT$S #LSTBLK,#OUBUF ;OUTPUT LINE ;SIG02 PUT$S #LSTBLK ;OUTPUT LINE ;chs89 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 TSTEQ HGHPAG,OUT3 ;SECOND TIME THROUGH? CLR HGHPAG JMP ENDFIL ;OTHERWISE INITIATE TERMINATION ; ; I/O ERROR EXITS ; ;SIG02 WRERR3: CALL $ERMSG .WORD OUTERR WRERR4: JMP RUNOFF ;RESTART RDERR3: CALL $ERMSG .WORD INPERR BR WRERR4 ;RESTART ;SIG02 ; 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:: MOV R0,-(SP) ;SAVE R0 ;chs PUT$S #TTBLK,#TTBUF MOV (SP)+,R0 ;RESTORE R0 ;chs CLR TTBLK+F.NRBD ;MAKE THE LINE EMPTY RETURN ; READ TERMINAL INPUT RECORD TTC4N:: GET$S #TTBLK ;GET A RECORD SIG01 CLR TTBLK+F.NRBD ;MAKE LINE EMPTY SIG01 RETURN ; Simulate 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