.TITLE WRTBUF - CONVERT SPECIAL CHAR AND WRITE BUFFER .IDENT /01/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: WRTBUF ; Author: Robin Miller ; Date: October 29, 1981 ; ; Description: ; ; This routine is used to convert special characters and then write ; the buffer to the terminal. Special characters are control characters ; and vertical format characters for the line printer. ; ; Modification History: ; ;- .ENABL AMA .MCALL QIOW$S ; Special characters. NULL = 0 ; ASCII FOR NULL BELL = 7 ; ASCII FOR BELL BS = 10 ; ASCII FOR BACKSPACE HT = 11 ; ASCII FOR HORIZONTAL TAB LF = 12 ; ASCII FOR LINE FEED VT = 13 ; ASCII FOR VERTICAL TAB FF = 14 ; ASCII FOR FORM FEED CR = 15 ; ASCII FOR CARRIAGE RETURN ESC = 33 ; ASCII FOR ESCAPE SPACE = 40 ; ASCII FOR SPACE DEL = 177 ; ASCII FOR DELETE SPCTBL: .BYTE ,,,,,,NULL ; Special character output strings. Same as EDT. .NLIST BEX SPCSTR: .ASCIZ "" SPCLEN = .-SPCSTR .ASCIZ "" .ASCIZ "" .ASCIZ "" .ASCIZ "" .ASCIZ "" .EVEN ;+ ; ; WRTBUF - Convert special characters and write buffer to terminal. ; ; Inputs: ; R0 - Buffer address ; R1 - Bytecount ; ; Outputs: ; All registers are preserved. ; ;- WRTBUF:: CALL $SAVAL ; SAVE R0 - R5 MOV #TYOBUF,R2 ; TYPEOUT BUFFER 10$: TST R1 ; GOT A BYTE COUNT ? BGT 20$ ; IF GT, YES MOVB #NULL,(R2)+ ; SET FOR NULL RECORD JMP DOQIO ; GO OUTPUT THE BUFFER 20$: MOV MARGIN,R4 ; INDENT THE MARGIN ? BEQ 100$ ; IF EQ, NO MOV #10,R5 ; INITIALIZE TAB COUNT ; Indent the margin. 30$: CMPB (R0),#HT ; HORIZONTAL TAB ? BNE 50$ ; IF NE, NO SUB R5,R4 ; SUBTRACT THE COUNT BMI 100$ ; IF MI, NO MORE 40$: MOV #10,R5 ; RESET TAB COUNT BR 60$ ; CONTINUE ... 50$: DEC R5 ; ADJUST TAB COUNT BEQ 40$ ; IF EQ, RESET COUNT 60$: INC R0 ; POINT TO NEXT DEC R1 ; DECREMENT BC BEQ 10$ ; IF EQ, NO MORE DEC R4 ; ADJUST MARGIN COUNT BGT 30$ ; IF GT, MORE 100$: MOV LINWID,R3 ; COPY THE LINE WIDTH ; Format characters for output. FMTBUF: BIT #SESW,SWMASK ; SEE-ALL MODE ? BNE 200$ ; IF NE, YES ; Check for line printer VFU byte. 100$: BITB #200,(R0) ; IS IT A VFU BYTE ? BEQ 200$ ; IF EQ, NO BITB #100,(R0) ; SKIP FUNCTION (Data Printer) ? BEQ 120$ ; IF EQ, NO ; Change VFU skip function to a form feed. 110$: MOVB #FF,(R0) ; CHANGE IT TO FORM FEED BR 200$ ; AND PROCESS IT ; Data Printer skip to channel 1 = 301, space 1 = 201. ; Data Products skip to channel 1 = 200, space 1 = 221. 120$: BITB #37,(R0) ; SKIP CHANNEL 1 (Data Products) ? BEQ 110$ ; IF EQ, PRESUME YES ; Change VFU space function to 's. MOVB (R0),R4 ; GET THE SPACE BYTE BIC #^C17,R4 ; ISOLATE THE COUNT DEC R4 ; BIAS BY -1 BLE NXTBYT ; IF LE, DO NEXT CAHR 130$: CMP #2,R3 ; ROOM IN OUTPUT BUFFER ? BGT 140$ ; IF GT, NO (TYPE IT) MOVB #CR,(R2)+ ; MOVE IN CARRIAGE RETURN MOVB #LF,(R2)+ ; AND THE LINE FEED INC LINCNT ; COUNT THIS LINE SUB #2,R3 ; ADJUST BYTE COUNT BEQ 140$ ; IF EQ, TYPE IT CMP LINCNT,MAXLIN ; EXCEED LINE COUNT ? BGE 140$ ; IF GE, TIME TO STOP SOB R4,130$ ; AND LOOP TILL DONE BR NXTBYT ; DO THE NEXT BYTE 140$: JMP DOQIO ; GO OUTPUT THE BUFFER ; Not a VFU byte, check for special characters. 200$: MOV #SPCTBL,R4 ; SPECIAL CHARACTERS TABLE BICB #200,(R0) ; CLEAR THE PARITY BIT CMPB (R0),#DEL ; DELETE CHARACTER ? BEQ 210$ ; IF EQ, YES CMPB (R0),#SPACE ; CONTROL CHARACTER ? BGE 300$ ; IF GE, NO CMPB (R0),#HT ; HORIZONTAL TAB ? BEQ 300$ ; YES, DON'T FLAG ; Got a special character. 210$: TSTB CRTFLG ; OUTPUT TO CRT ? BNE 220$ ; IF NE, YES ; Special hardcopy processing. CMPB (R0),#FF ; IS THIS A FORM FEED ? BEQ 300$ ; IF EQ, YES (PASS IT) 220$: BIT #SESW,SWMASK ; SEE-ALL MODE ? BNE 230$ ; IF NE, YES CMPB (R0),#CR ; CARRIAGE RETURN ? BEQ 300$ ; IF EQ, YES (ALLOW OVERPRINT) CMPB (R0),#BS ; BACKSPACE ? BEQ 300$ ; IF EQ, YES (ALLOW OVERPRINT) CMPB (R0),#BELL ; RING THE BELL ? BEQ 300$ ; IF EQ, YES (ALLOW THIS) CMPB (R0),#ESC ; IS IT ESCAPE ? BEQ 300$ ; IF EQ, YES (ALLOW THIS ?) CMPB (R0),#LF ; LINE FEED ? BEQ DOQIO ; YES, OUTPUT THE BUFFER BR NXTBYT ; IGNORE ALL OTHERS 230$: TSTB (R4) ; END OF TABLE ? BEQ 260$ ; IF EQ, YES CMPB (R0),(R4)+ ; SPECIAL CHARACTER ? BNE 230$ ; IF NE, NO DEC R4 ; POINT AT ACTUAL CHAR SUB #SPCTBL,R4 ; SUBTRACT OUT BASE MUL #SPCLEN,R4 ; CALCULATE THE OFFSET ADD #SPCSTR,R5 ; ADD IN START OF TABLE 245$: CMP #,R3 ; ROOM IN THE BUFFER ? BGT DOQIO ; IF GT, NO (TYPE IT) ; Move special character string. 250$: MOVB (R5)+,(R2) ; COPY SPECIAL STRING BEQ NXTBYT ; IF EQ, DO NEXT BYTE INC R2 ; NEXT OUTPUT POSITION DEC R3 ; ADJUST THE BYTE COUNT BR 250$ ; DO NEXT CHARACTER ; Convert control character to ^char. 260$: CMP #2,R3 ; ROOM IN OUTPUT BUFFER ? BGT DOQIO ; IF GT, NO (TYPE IT) MOVB #'^,(R2)+ ; MOVE THE UP ARROW MOVB (R0),R4 ; COPY THE CONTROL CHAR ADD #64.,R4 ; MAKE IT PRINTABLE MOVB R4,(R2)+ ; MOVE IT SUB #2,R3 ; ADJUST BYTE COUNT BEQ DOQIO ; IF EQ, BUFFER FULL JMP NXTBYT ; ELSE, DO NEXT BYTE 300$: MOVB (R0),(R2)+ ; COPY TO OUTPUT BUFFER DEC R3 ; ADJUST THE BYTE COUNT ; Process next character. NXTBYT: INC R0 ; POINT TO NEXT CHARACTER DEC R1 ; DECREMENT THE BYTE COUNT BLE DOQIO ; IF LE, ALL DONE TST R3 ; EXCEEDING LINE WIDTH ? BLE DOQIO ; IF LE, YES JMP FMTBUF ; ELSE, FORMAT NEXT CHAR ; Do QIO to write buffer to terminal. DOQIO: SUB #TYOBUF,R2 ; CALCULATE THE BYTE COUNT CMP R2,LINWID ; EXCEEDING LINE WIDTH ? BLE 10$ ; IF LE, NO MOV LINWID,R2 ; SET THE MAXIMUM WIDTH 10$: QIOW$S #IO.WAL,#OUTLUN,#OUTEFN,,#TIOSB,,<#TYOBUF,R2,#40> INC LINCNT ; BUMP THE LINE COUNT RETURN .END