.TITLE PRNT ; JEFFREY KODOSKY ARL NOV75 ; ; UTILITY: OUTPUT ASCIZ BUFFER ; ENTRY: R3 POINTS TO ASCIZ BUFFER ; (IF R3=0 THEN ANY REMAINING CHARS ARE OUTPUT) ; EXIT: R3 POINTS PAST ZERO BYTE (OR R3=0 IF CALLED WITH0) ; ERRORS: O2, OUTPUT ERROR ; CALLS: .TTYOUT ; .WRITW .GLOBL PRNT,APVAL,QO2ERR,AREA,OUTSYS,DEVTBL,BLKTBL .GLOBL PTRTBL,BFRTBL,WSWVAL .MCALL .WRITW,.TTYOUT PRNT: MOV OUTSYS,R1 ;GET SYSOUT CHANNEL BMI .+4 SWAB R1 ;USE CURRENT OUTPUT CHANNEL IF ANY BIC #177760,R1 MOV R1,OCHANL ASL R1 MOV R3,R2 BEQ PRNT30 ;JUMP IF FORCED OUTPUT MOV #80.,-(SP) ;GET LINE WIDTH TST WSWVAL BEQ .+6 MOV #132.,@SP MOV @SP,R0 SUB CCNT,@SP ;REMAINING SPACE ON CURRENT LINE BGT PRNT05 ;JUMP IF SPACE REMAINING CMPB @R2,#15 ;IF NOT, OUTPUT CRLF UNLESS BEQ PRNT10 ;1ST CHAR OF BUFFER IS A LINE TERMINATOR BR PRNT09 PRNT05: CMPB @R2,#15 ;TEST FOR ROOM ENOUGH ON LINE BEQ PRNT07 ;LOOK FOR TERMINATOR OR END OF BUFFER TSTB (R2)+ BEQ PRNT07 DEC @SP DEC R0 BMI PRNT10 ;JUMP IF BUFFER IS TOO LONG FOR EVEN A BR PRNT05 ;WHOLE LINE (JUST OUTPUT IT) PRNT07: TST @SP ;IF BUFFER WILL FIT ON A NEW LINE BUT BPL PRNT10 ;NOT ON PRESENT LINE THEN DO A CRLF PRNT09: MOV #5015,R2 JSR PC,OUTC SWAB R2 JSR PC,OUTC CLR CCNT PRNT10: TST (SP)+ ;DISCARD COUNTER PRNT13: MOVB (R3)+,R2 ;END OF BUFFER? BEQ PRNT25 ;JUMP IF SO TST CCNT BNE PRNT14 CMPB R2,#240 ;IGNORE "MARKED" SPACES AT START OF LINE BEQ PRNT13 PRNT14: BIC #177600,R2 CMP R2,#40 BGE PRNT16 ;JUMP IF PRINTABLE CMP R2,#11 BEQ PRNT15 ;COUNT IN A SPECIAL WAY FOR TABS CMP R2,#15 ;DON'T COUNT ANY OTHER CONTROL CHARS BNE PRNT17 CLR CCNT BR PRNT17 PRNT15: ADD #8.,CCNT BIC #7,CCNT BR PRNT17 PRNT16: INC CCNT PRNT17: JSR PC,OUTC BR PRNT13 PRNT30: JSR PC,OUTL PRNT25: JMP @-(R4) OUTC: CMP DEVTBL(R1),(PC)+ .RAD50 /TT/ BNE OUTC1 ;STORE CHAR IF NOT TT: .TTYOUT R2 RTS PC OUTC1: MOV PTRTBL(R1),R0 ADD BFRTBL(R1),R0 MOVB R2,@R0 ;STORE CHAR IN OUTPUT BUFFER INC PTRTBL(R1) CMP PTRTBL(R1),#512. BLT OUTE ;IF IT FILLS WRITE IT OUT WRITE: .WRITW #AREA,OCHANL,BFRTBL(R1),#256.,BLKTBL(R1) BCC .+4 QO2ERR CLR PTRTBL(R1) ;RESET BUFFER POINTER INC BLKTBL(R1) ;POINT TO NEXT RELATIVE BLOCK OUTE: RTS PC OUTL: CMP DEVTBL(R1),(PC)+ .RAD50 /TT/ BEQ OUTE ;NO BUFFER IF TT: MOV PTRTBL(R1),R0 ;FORCE OUTPUT OF EXISTING BUFFER BEQ OUTE MOV R0,R2 ;NULL FILL TO END OF BUFFER SUB #512.,R2 ADD BFRTBL(R1),R0 OUT1: CLRB (R0)+ INC R2 BLT OUT1 BR WRITE ; OCHANL: .WORD 0 ;OUTPUT CHANNEL CCNT: .WORD 0 ;NUMBER OF CHARS ON PRESENT LINE .END