.TITLE RNFIO .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 -- REVISION 1 (RAW TEXT FACILITY) ; ; AUTHOR: L. WADE 1-JUN-72 ; ; MODIFIED BY: ; ; E. POLLACK U. OF W. 19-DEC-73 ; ; D. N. CUTLER 14-SEP-75 ; ; SIG MODIFICATION ;**NEW** ; SIG01 CHANGE DEVICE FOR WAIT TO TI ;**NEW** ; SIG02 INCORPORATE RSTS CHANGES ;**NEW** ; ;M02.1 ; INCLUDE RAW TEXT FACILITY / AUGUST 1981 ;M02.1 ; ;M02.1 ; DAN DILL, CHEMISTRY DEPARTMENT, BOSTON UNIVERSITY ;M02.1 ; BOSTON, MASSACHUSETTS 02215 (617) 353-4277 ;M02.1 ; ;M02.1 ; RUNOFF I/O ROUTINES ; ; MACRO LIBRARY CALLS ; ;SIG02 .MCALL GET$S,PUT$S ;SIG02 ; ;SIG02 ;+ ;**-17 ; FILE INPUT/OUTPUT ROUTINES ;- .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:: TSTB $ESCSW ;CALLED BY RAWPUT ;M02.1 BNE 1$ ;YES ;M02.1 CMPB R1,#33 ;NO. RAW TEXT HEADER? ;M02.1 BNE 1$ ;NO ;M02.1 CALL RAWPUT ;YES. PUT RAW STRING IN OUTPUT ;M02.1 RETURN ;.. ;M02.1 1$: ;M02.1 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 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? TSTB $ESCSW ;CALLED BY RAWGET? ;M02.1 BNE 40$ ;YES ;M02.1 CMPB R1,#33 ;NO. RAW TEXT HEADER? ;M02.1 BNE 40$ ;NO ;M02.1 CALL RAWGET ;YES. GET RAW TEXT ;M02.1 TSTB $RAWSW ;GET A CHARACTER? ;M02.1 BNE FIN ;YES ;M02.1 40$: RETURN ; .DSABL LSB ; ; THIS ROUTINE OUTPUTS THE CURRENT CONTENTS OF THE LINE BUFFER ; ;SIG02 OUTPUT::MOV HFOUT,LSTBLK+F.NRBD ;CALCULATE LENGTH OF LINE TO OUTPUT ;SIG02 SUB HFOUT+4,LSTBLK+F.NRBD ; ;SIG02 BEQ OUT3 ;IF EQ EMPTY BUFFER ;SIG02 CMP PAGENO,LOWPAG ;ONLY PRINT IN THE SELECTED PAGE ;**-20 BLO OUT1 ;RANGE CMP PAGENO,HGHPAG BHI OUT2 ;QUIT IF BEYOND RANGE PUT$S #LSTBLK,#OUBUF ;OUTPUT LINE ;SIG02 BCS WRERR3 ;IF CS ERROR ;**-14 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 ;**-1 .WORD OUTERR WRERR4: JMP RUNOFF ;RESTART RDERR3: CALL $ERMSG .WORD INPERR BR WRERR4 ;RESTART ;SIG02 ; ;**-1 ; 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 #TTBLK ;GET A RECORD SIG01 CLR TTBLK+F.NRBD ;MAKE LINE EMPTY SIG01 RETURN ; ;**-1 ;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 ; .SBTTL Raw text routines ;M02.1 .SBTTL . Subroutine RAWGET ;M02.1 ; ;M02.1 ; If $RAWSW .eq. 0, pass n bytes following n directly to output ;M02.1 ; If $RAWSW .ne. 0, ignore n bytes following n ;M02.1 ; ;M02.1 ; Note that n is interpreted literally; e.g., 4 means n=46 raw bytes. ;M02.1 ; ;M02.1 RAWGET: ;M02.1 INCB $ESCSW ;Let caller know we're handling things ;M02.1 CALL FIN ;Get count byte n ;M02.1 MOV R1,RAWCNT ;Yes. Count into RAWCNT ;M02.1 TSTB $RAWSW ;Pass or ignore? ;M02.1 BEQ 20$ ; ;M02.1 10$: CALL FIN ;Ignore. Strip characters ;M02.1 DEC RAWCNT ;.. ;M02.1 BNE 10$ ;until done ;M02.1 BR 50$ ;.. ;M02.1 20$: CMP R1,RAWCTT ;Pass. Room for count byte plus string? ;M02.1 BGT 60$ ;No. Abort here. ;M02.1 MOVB R1,@RAWIN ;Yes. Insert count into ring buffer ;M02.1 INC RAWIN ;Point to next buffer position ;M02.1 CMP RAWIN,#RAWEND ;.. ;M02.1 BNE 30$ ;.. ;M02.1 MOV #RAWBUF,RAWIN ;.. ;M02.1 30$: CALL FIN ;Process raw text ;M02.1 MOVB R1,@RAWIN ;Into ring buffer ;M02.1 INC RAWIN ;Point to next buffer position ;M02.1 CMP RAWIN,#RAWEND ;.. ;M02.1 BNE 40$ ;.. ;M02.1 MOV #RAWBUF,RAWIN ;.. ;M02.1 40$: DEC RAWCTT ;Room for one less character (total) ;M02.1 DEC RAWCNT ;Downdate count ;M02.1 BNE 30$ ;Continue until done ;M02.1 MOVB #33,R1 ;Done. Insert signal byte for output ;M02.1 50$: CLRB $ESCSW ;Let caller handle things again ;M02.1 RETURN ;We're done ;M02.1 60$: CALL $ERMSG ;Signal abort ;M02.1 .WORD RAWERR ;.. ;M02.1 JMP RUNOFF ;Start anew ;M02.1 .SBTTL . Subroutine RAWPUT ;M02.1 ; ;M02.1 ; RAWPUT - Insert bytes from raw text ring buffer into output stream ;M02.1 ; ;M02.1 RAWPUT: INCB $ESCSW ;Tell caller we're here ;M02.1 MOVB @RAWOUT,RAWCNT ;Get number of bytes to insert ;M02.1 INC RAWCTT ;Room for one more character ;M02.1 INC RAWOUT ;Next character from here ;M02.1 CMP RAWOUT,#RAWEND ;.. ;M02.1 BNE 10$ ;.. ;M02.1 MOV #RAWBUF,RAWOUT ;.. ;M02.1 10$: MOVB @RAWOUT,R1 ;Get character ;M02.1 INC RAWCTT ;Room for one more character in ring ;M02.1 INC RAWOUT ;Next character from here ;M02.1 CMP RAWOUT,#RAWEND ;.. ;M02.1 BNE 20$ ;.. ;M02.1 MOV #RAWBUF,RAWOUT ;.. ;M02.1 20$: CALL FOUT ;Output character ;M02.1 DEC RAWCNT ;One less character to do ;M02.1 BNE 10$ ;Continue until done ;M02.1 CLRB $ESCSW ;Give it back to the caller ;M02.1 RETURN ;We're done ;M02.1 .SBTTL . Raw text ring buffer ;M02.1 RAWCNT: .WORD 0 ;String byte count ;M02.1 RAWCTT::.WORD 0 ;Bytes in ring buffer ;M02.1 RAWIN:: .WORD RAWBUF ;Save next raw text byte here ;M02.1 RAWOUT::.WORD RAWBUF ;Fetch next raw text byte here ;M02.1 RAWSIZ == 1024. ;Ring buffer size ;M02.1 RAWBUF::.BLKB RAWSIZ ;Many bytes an equation can make... ;M02.1 RAWEND: .WORD 0 ;Ring close marker ;M02.1 .END