.TITLE PLOT .MCALL EXIT$S,QIOW$C ; ; ; SUBROUTINE TO READ THE ADM3A RETROGRAPHICS BOARD AND ; PLOT THE RESULT ON THE VERSATEC 1200 PRINTER PLOTER ; ; LUN5 = ADM3A ; LUN4 = TEMPORARILY ASSIGNED TO THE LP: ; ; EVENT FLAGS 1,2 ARE USED ; FLAG 1 IS USED FOR UNPUT ; FLAG 2 FOR OUTPUT ; I/O IS DOUBLE BUFFERED FOR MAX SPEED ; ; J. CLEMENT JUNE 1981 ; .MCALL QIO$,QIO$S,QIOW$S,QIO$C,QIOW$C,ALUN$C,DSCP$S,ENCP$S .MCALL WTSE$S,CLEF$S,SETF$S,ASTX$S .PSECT SCRAT,D,OVR,GBL ADDR: .BLKW 1 ;INPUT HALF LINE NUMBER OUTCNT: .BLKW 1 ;NUMBER OF BYTES TO PLOT/LINE LINCNT: .BLKW 1 ;NUMBER OF LINES TO PLOT ZCOUNT: .BLKW 1 ;LAST NON ZERO BYTE TO OUTPUT INBUF1: .BLKB 70. ;2 INPUT BUFFERS INBUF2: .BLKB 70. OUBUF1: .BLKB 258. ;2 OUTPUT BUFFERS OUBUF2: .BLKB 258. .PSECT ; ; PLOT: QIOW$C IO.ATT,5 ; Attach the terminal CALL SCOPE TSTB PLOTEN ; ARE PLOTS ENABLED BNE 1$ ; YES RTS PC ; NO 1$: DSCP$S ; DISABLE CHECKPOINTING ALUN$C 4,LP,0 ; ASSIGN UNIT 4 TO PRINTER QIOW$C IO.ATA,4,1 ; ATTACH PRINTER QIOW$C IO.ATA,5,1 ; ATTACH TERMINAL QIO$C IO.WVB,6,1,,,, ; WRITE 1 FORM FEED SETF$S #2 ; SET EVENT FLAG #2 QIOW$C IO.WAL,5,1,,,, ; PUT TERMINAL INTO 4010 CHAR MODE CLR ADDR ; FIRST HALF LINE IS 0 MOV #INBUF1,R4 ; NEXT BUFFER TO READ JSR PC,CNVADD READ: WTSE$S #1 ; WAIT FOR FIRST HALF LINE INPUT MOV #INBUF2,R4 ; READ INTO BUFFER #2 MOV #INBUF1,R3 ; BUFFER TO CONVERT MOV OUTSAV,R2 ; OUTPUT BUFFER MOV R2,ZCOUNT INC ZCOUNT JSR PC,CNVADD ; GET SECOND INPUT HALF LINE JSR PC,CNVLIN MOV #INBUF2,R3 ; NEXT LINE TO CONVERT MOV #INBUF1,R4 ; NEXT BUFFER TO READ INTO WTSE$S #1 ; WAIT FOR SECOND HALF LINE JSR PC,CNVADD ; GET NEXT ADDRESS JSR PC,CNVLIN ; CONVERT LAST HALF OF LINE WTSE$S #2 ; WAIT FOR OUTPUT BUFFER FREE MOV OUTBUF,R2 ; SAVE OUTPUT BUFF ADDRESS MOV OUTSAV,OUTBUF ; SWAP BUFFERS MOV R2,OUTSAV ; NOW SWAPPED OUTPUT BUFFERS MOV #6,LINCNT ; 4 DOTS PER LINE MOV ZCOUNT,R0 ; LAST NON ZERO BYTE SUB OUTBUF,R0 ; NUMBER OF BYTES MOV R0,OUTCNT CLEF$S #2 ; CLEAR FLAG 2 JSR PC,PLOTLN ; PLOT 1 LINE CMP ADDR,#499. ; ARE WE DONE BLE READ ; CONTINUE TILL DONE WTSE$S #2 ; WAIT FOR PRINTER DONE QIOW$C IO.WLB!30,4,1,,,, ; TERMINATE PLOT MODE QIOW$C IO.DET,4,1 ; DETACH THE LP: QIOW$C IO.WAL,5,1,,,, ; RETURN TO ADM MODE ENCP$S ; ENABLE CHECKPOINTING EXIT$S ; Done with potting ; ; ASYNCHRONOUS ROUTINE FOR OUTPUT BUFFERING ; AST1: TST (SP)+ ;POP STATUS BLOCK DEC LINCNT ;DONE? BLE ASTEND ;YES JSR PC,PLOTLN ;NO, WRITE THE LINE AGAIN BR ASTXIT ASTEND: SETF$S #2 ;SET EVENT FLAG 2 (LP: DONE) ASTXIT: ASTX$S ;EXIT ; ; ROUTINE TO OUTPUT 1 PLOT LINE TO LP: ; PLOTLN: QIO$S #IO.WLB!20,#4,,,,, ;WRITE LINE TO PLOTTER QIO$C IO.WLB!30,4,,,,AST1, ;TERMINATE LINE RTS PC ; ; DOUBLE BUFFER ADDRESSES ; OUTBUF: OUBUF1 ;FIRST OUTPUT BUFFER OUTSAV: OUBUF2 ;SECOND OUTPUT BUFFER ; ; ROUTINE TO CONVERT A LINE OF INPUT TO PLOT LINE ; R3 = INPUT BUFFER ADDRESS ; R2 = OUTPUT BUFFER ; R4 = COUNT ; CNVLIN: MOV #64.,R4 ;MAX NUMBER OF BYTES TO INPUT MOV #6,R0 ;MAX NUMBER OF CHAR TO SEARCH 1$: CMPB (R3)+,#'= ;IS IT CORRECT FIRST CHARACTER BEQ 3$ ;YES SOB R0,1$ ;NO BR 12$ ;BLANK LINE 3$: MOVB (R3)+,R0 ;GET CHARACTER CMPB R0,#'; ;IS IT END OF BUFF? BEQ 12$ ;YES CMPB R0,#'# ;IS IT ZERO COUNT? BNE 5$ ;NO MOVB (R3)+,R0 ;GET COUNT BIC #177300,R0 ;GET COUNT BEQ 3$ ;IT IS NFG ASL R0 2$: CLR (R2)+ DEC R4 BLE 13$ SOB R0,2$ BR 3$ 5$: CMPB R0,#'A ;IS CHAR A TO F (HEX INPUT)? BGE 6$ ;YES SUB #'0,R0 ;CONVERT 0 TO 9 TO BINARY BR 7$ 6$: SUB #67,R0 ;CONVERT A TO F TO BINARY 7$: BIC #177760,R0 ASL R0 ;NOW IS WORD ADDRESS MOV TABL(R0),(R2)+ ;INTO OUTPUT BUFFER BEQ 11$ ;NO DATA IN BYTE MOV R2,ZCOUNT ;SAVE ADDRESS IN OUT BUFF. 11$: SOB R4,3$ ;CONTINUE TILL DONE BR 13$ 12$: CLR (R2)+ ;CLEAR REST OF BUFF SOB R4,12$ 13$: RTS PC ; ; ROUTINE TO GENERATE HALF LINE ADDRESS ; THEN START THE OUTPUT ; R0,R1 ARE USED FOR SCRATCH ; R4 = THE BUFFER ADDRESS FOR INPUT ; CNVADD: CMP ADDR,#499. ;ADDRESS TOO BIG? BLE 1$ RTS PC ;YES 1$: MOV ADDR,R1 ;GET HALF LINE NO. MOV R1,R0 ASH #-5,R0 ;SPLIT INTO 2 5 BIT ADDRESSES BIC #177740,R0 BIC #177740,R1 BIS #100,R0 BIS #100,R1 MOVB R0,ADD1 MOVB R1,ADD1+1 ; READ A HALF LINE ; READ NO ECHO (RNE) AFTER BINARY (BIN) PROMPT (RPR) ; QIO$S #IO.RPR!TF.RNE!TF.BIN,#5,#1,,,, INC ADDR ;NEXT HALF LINE ADDRESS RTS PC ; ; IMPURE DATA TABLE ; FF: .BYTE 14,15 ;FORM FEED PLMODE: .BYTE 17,34,37,0 ;LOCK KB,4010 MODE,4010 CHAR MODE ADMODE: .BYTE 37,30,16,0 ;PLOT MODE,ADM MODE,UNLOCK KB: RQBUF: .BYTE 33,21 ;REQUEST INPUT DATA ADD1: .WORD 0 ;LINE NUMBER REQUESTED ; ; DATA TABLE OF BITS TO PLOT ; TABL: .WORD 0, 7400,170000,177400 .WORD 17, 7417,170017,177417 .WORD 360, 7760,170360,177760 .WORD 377, 7777,170377,177777 .END PLOT