.TITLE BUFOUT .IDENT /V01A/ .ENABL LC ; ;Calling sequence: CALL BUFOUT(NBYTES,BUFF,IBLK) ; ;Fortran called subroutine to pack NBYTES starting at BUFF into ;an output buffer. If NBYTES < 1, the output buffer is flushed. ;If the output buffer is full, it is written to the plotting device. ;If IBLK = 0 output is in continuous mode. ;If IBLK = 1 output is in block mode. ; ;No argument checking. ; ;Note: In block mode for the 4662 flatbed plotter, a maximum of ; 72 characters may be sent in a block. ; ;Programmer: P. Austin Date: December 1982 ; PLOTLU = 10 ;logical unit number OUTSIZE = 130 ;Maximum buffer size ; .MCALL QIOW$S,EXIT$S .GLOBL BUFOUT ; BUFOUT: TST (R5)+ ;point at argument list MOV @(R5)+,R4 ;NBYTES MOV (R5)+,R3 ;BUFF ; ;commence byte transfer ; MOV BUFPNT,R0 ;output buffer pointer CMP R4,#1 ;flush buffer? BGE LOOP1 ;no! ; CMP R0,#OUTBUF ;is buffer empty? BNE SEND ;no! RETN: RTS PC ;yes! return ; LOOP1: MOVB (R3)+,(R0)+ ;transfer bytes from BUFF SOB R4,LOOP1 ;to the output buffer ; ;byte transfer complete ; MOV R0,BUFPNT ;save output buffer pointer CMP R0,#OUTBUF+OUTSIZ ;buffer full? BLO RETN ;no! return ; ;send out the buffer ; SEND: MOV #OUTBUF,BUFPNT ;reset output buffer pointer TST @(R5)+ ;block mode? BEQ NOBLK ;no! ; ;terminate block with sequence: ESC DEV ) ; MOVB #33,(R0)+ ;ESC MOVB #104,(R0)+ ;DEV MOVB #'),(R0)+ ;) ; MOV #BLOCK,PSAD ;start address for output ; ;calculate checksum using 12-bit end-around carry ; MOV #BLOCK+2,R1 ;start of checksummed buffer MOV R0,R2 SUB R1,R2 ;number of bytes to sum CLR R3 ; LOOP2: MOVB (R1)+,R4 ADD R4,R3 ;sum byte values SOB R2,LOOP2 ; MOV R3,R1 BIC #170000,R1 ;perform end-around carry ASH #-14,R3 ADD R3,R1 ; CMP #10000,R1 ;sum > 4095? BGT CONVRT ;no! SUB #7777,R1 ;yes! subtract 4095 ; ;convert checksum to left justified ASCII string ; CONVRT: CLR R2 ;suppress leading zeros CALL $CBDMG ; MOVB #37,(R0)+ ;output buffer terminator BR SYNC ; ;continuous mode ; NOBLK: MOV #OUTBUF,PSAD ;start address for output ; ;place a SYNC byte at end of output buffer ; SYNC: MOVB #26,(R0)+ ; ;write output buffer to plotting device ; SUB PSAD,R0 ;number of bytes for transfer MOV R0,BCNT ; MOV PSAD,R1 MOV BCNT,R2 QIOW$S #IO.WLB,#PLOTLU,#1,,#IOSTAT,, CMPB #IS.SUC,IOSTAT ;any errors? 20$: BEQ RETN ;no! return MOV #PLTERR+22.,R0 ;error code buffer MOVB IOSTAT,R1 ;binary status value MOV #1,R2 ;enable leading zeros CALL $CBDSG ;convert to ASCII ; QIOW$S #IO.WLB,#5,#1,,,,<#PLTERR,#35.> QIOW$S #IO.RLB,#5,#1,,,,<#INBUF,#1> CMPB INBUF,#15 ;CR? BEQ 20$ ;yes! return EXIT$S ;no! stop execution ; ;data area ; BLOCK: .BYTE 33,104,50,12 ;ESC DEV ( LF OUTBUF: .BLKB OUTSIZE+6 .BLKB 10 ;end-of-block bytes ; BUFPNT: .WORD OUTBUF PSAD: .WORD 0 BCNT: .WORD 0 IOSTAT: .WORD 0,0 INBUF: .WORD 0 ; PLTERR: .ASCIZ <15><12>/Plotter write error - PAUSE/ .EVEN .END