.TITLE PRINT .GLOBL .PS,.PL,.PB,.LENTH,.MARG,.LINES,.TOPMG .MCALL .PB,.PS ; .MACRO .PS S ;PRINT STRING S: .BLKW 1 .PS: MOV R0,-(SP) MOV S,R0 LOOP: TSTB (R0) BEQ BYTE0 .PB (R0)+ BR LOOP BYTE0: MOV (SP)+,R0 RETURN ; .MACRO .PL S ;PRINT LINE WITH CR-LF SS: .BLKW 1 .PL: .PS SS .PB #15 .PB #12 RETURN ; .MACRO .PB B ;PRINT BYTE .MACRO XMT BYTE MOVB BYTE,XMT-2 CALL XMT .ENDM .MACRO SEND BYTE MOVB BYTE,SEND-2 CALL SEND .ENDM B: .BLKW 1 .PB: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) TST LINE BGT NOMARG CALL TOPMAR NOMARG: CMPB B,#15 ;CR? BNE NOCR SEND #15 BR RET NOCR: CMPB B,#14 ;FF? BEQ FF ;REPLACE FF WITH LFs FOR OLD PRINTERS CMPB B,#12 ;LF? BNE NOLF SEND #12 MOV .LINES,R2 ;AT BOTTOM MARGIN? ADD .TOPMG,R2 CMP LINE,R2 BLT RET FF: SEND #15 ;CR MOV .LENTH,R2 SUB LINE,R2 LFF: TST R2 BEQ RET SEND #12 ;LF DEC R2 BR LFF NOLF: TST COLUMN ;AT LEFT? BGT S9 TST .MARG BEQ S9 MOV .MARG,R2 ;MAKE LEFT MARGIN L2: XMT #40 ;SP SOB R2,L2 S9: CMPB B,#11 ;TAB? BNE NOTAB MOV COLUMN,R2 ;REPLACE TAB WITH SPACES BIC #177770,R2 ;COUNT SPs; TAB=8 SPs SUB #8.,R2 NEG R2 ;R2=8-(COLUMN MOD 8) L: SEND #40 ;SP SOB R2,L BR RET NOTAB: SEND B RET: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ;------------------------- TOPMAR: MOV .TOPMG,R2 ;SUBROUTINE MAKES TOP MARGIN LTOP: TST R2 BLE RREETT SEND #12 ;SEND LF DEC R2 BR LTOP RREETT: RETURN BBB: .BLKW 1 ;KEEP TRACK OF COLUMN & LINE NUMBERS SEND: XMT BBB CMPB BBB,#15 ;CR? BNE S2 CLR COLUMN RETURN S2: CMPB BBB,#12 ;LF? BNE S7 INC LINE MOV LINE,R1 ;LINE=LINE MOD .LENTH CLR R0 DIV .LENTH,R0 MOV R1,LINE RETURN S7: INC COLUMN RETURN RCSR=176500 ;TRANSMIT BYTE RBUF=RCSR+2 XCSR=RCSR+4 XBUF=RCSR+6 BB: .BLKW 1 XMT: TSTB RCSR ;TEST BIT 7 OF RECEIVER (DONE BIT) BGE CHECK MOVB RBUF,BYT CMPB BYT,#23 ;XOFF? BNE CHECK WAIT: TSTB RCSR ;TEST BIT7 OF RECEIVER BGE WAIT ;WAIT UNTIL XON RECEIVED MOVB RBUF,BYT CMPB BYT,#21 ;KEEP CHECKING FOR XON BNE WAIT CHECK: TSTB XCSR ;TEST BIT7 OF XCSR FOR READY BGE CHECK MOVB BB,XBUF ;MOVE BYTE TO XBUF FOR TRANSMISSION RETURN COLUMN: .WORD 0 LINE: .WORD 0 .LENTH: .WORD 66. .LINES: .WORD 66. .MARG: .WORD 0 ;WIDTH OF LEFT MARGIN .TOPMG: .WORD 0 ;MARGIN AT TOP OF PAGE BYT: .BLKW 1 .END