.TITLE TABLET .ENABL LC ; ; CALL TABLET(X,Y,N) -- This subroutine provides a means of digitizing ; information through the use of a Tektronix 4954 Graphics Tablet. ; ; X, Y Arrays to contain the digitized data. ; N INPUT: In absolute value, the maximum number of points to ; be digitized. If positive, the screen's alpha cursor will ; follow; if negative, it will not. ; OUTPUT: Number of points actually digitized. ; ; NOTE: Digitizing may be stopped by typing two 's on the keyboard. ; .PSECT TABLET .MCALL QIOW$S,ASTX$S,QIO$S,STLO$S,CLEF$S,MRKT$S,CMKT$S F0=%0 ;DEFINE F1=%1 ;FLOATING POINT F2=%2 ;ACCUMULATORS ; TABLET::MOV @6(R5),R1 ;GET MAX NUMBER OF HITS BLT 1$ ;BRANCH IF NEGATIVE TO SET LOCAL OFF MOVB #'5,LOCAL ;SET LOCAL MODE ON BR 2$ ;BRANCH TO CONTINUE 1$: NEG R1 ;MAKE ABSOLUTE VALUE MOVB #'4,LOCAL ;SET LOCAL MODE OFF 2$: CLR @6(R5) ;ZERO COUNTER MOV 4(R5),R0 ;GET ADDRESS OF Y ARRAY FOR TEMP STORAGE ; QIOW$S #IO.ATA!TF.NOT,ILUN,#2,,,,<#DUMP> ;ATTACH THIS SUCKER TO ADVOID ; MCR ERRORS ; ; A: MOV #2,NESC ;SET TWO 'S FOR FINISH B: QIOW$S #IO.RPR!TF.BIN,ILun,#1,,#IOSB,,<#HEADER,#12.,,#PROMPT,#4,#0> CMPB #IE.EOF,IOSB ;READ TERMINATED BY AN ? BEQ AA ;BRANCH IF TRUE TO TRY AGAIN CMP #IS.CR,IOSB ;READ TERMINATED BY A ? BEQ C ;BRANCH IF TRUE TO DECODE CMP #IS.ESC,IOSB ;WAS IT AN ESCAPE BNE A ;NO DEC NESC ;DECREMENT NUMBER OF 'S BNE B ;BRANCH IF NOT ZERO JMP CONV ;ELSE BRANCH TO CONVERT ; ; AA: MRKT$S #3,#20.,#1,#CAN ;SET UP TIME OUT FOR 100 MILLSEC QIOW$S #IO.RLB,ILUN,#1,,,,<#HEADER,#12.> ;READ GARAGBE CMKT$S ;KILL MARK TIME BR A ;YES CAN: QIOW$S #IO.KIL,ILUN,#2 ;CANCEL READ TST (SP)+ ASTX$S ; C: CMP #6,NSENT ;SIX CHARACTERS SENT? BNE A ;BRANCH IF FALSE TO TRY AGAIN CMPB HEADER,#37 ;HEADER CHARACTER AN ? BEQ A ;BRANCH IF TRUE TO TRY AGAIN MOVB THIX,(R0) ;GET THIX BIC #177740,(R0) ;MASK OFF LOWER FIVE BITS SWAB (R0) ;SWAP BYTES AND SHIFT RIGHT TO ASR (R0) ;MULTIPLY BY 128. MOVB TLOX,R3 ;GET TLOX BIC #177740,R3 ;MASK OFF LOWER FIVE BITS ASL R3 ;SHIFT LEFT TWICE TO ASL R3 ;MULTIPLY BY 4 ADD R3,(R0) ;ADD LOX CONTRIBUTION MOVB TXLOY,R3 ;GET TXLOY BIC #177774,R3 ;GET LOWER TWO BITS ADD R3,(R0)+ ;ADD XLOY CONTRIBUTION AND INCREMENT ; MOVB THIY,(R0) ;GET THIY BIC #177740,(R0) ;MASK OFF LOWER FIVE BITS SWAB (R0) ;SWAP BYTES AND SHIFT RIGHT TO ASR (R0) ;MULTPLY BY 128. MOVB TLOY,R3 ;GET LOY BIC #177740,R3 ;MASK OFF LOWER FIVE BITS ASL R3 ;SHIFT LEFT TWICE TO ASL R3 ;MULTIPLY BY FOUR ADD R3,(R0) ;ADD LOY CONTRIBUTION MOVB TXLOY,R3 ;GET TXLOY BIC #177760,R3 ;MASK OFF LOWER FOUR BITS ASR R3 ;SHIFT RIGHT TWICE TO ASR R3 ;DIVIDE BY 4 ADD R3,(R0)+ ;ADD XLOY CONTRIBUTION AND INCREMENT ; QIOW$S #IO.WAL,ILun,#1,,,,<#RESETB,#4> ;RESET AND RING BELL INC @6(R5) ;INCREMENT HIT COUNTER CMP @6(R5),R1 ;DONE? BEQ AB ;BRANCH IF NOT JMP A AB: ; CONV: QIOW$S #IO.WAL,ILun,#1,,,,<#RESETA,#4> ;RESET TABLET QIOW$S #IO.DET,ILUN,#2 ;CANCEL AST CLR IMODE ;SET PLOT MODE FLAG TO ALPHA ; MOV 2(R5),R0 ;GET STARTING ADDRESS OF X ARRAY MOV 4(R5),R1 ;GET STARTING ADDRESS OF Y ARRAY MOV @6(R5),R2 ;GET NUMBER OF HITS BEQ DONE ;BRANCH IF NONE ; STF F0,-(SP) ;SAVE F0 STF F1,-(SP) ;SAVE F1 STF F2,-(SP) ;SAVE F2 STFPS -(SP) ;STORE FPP PROGRAM STATUS SETI ;SET INTEGER MODE SETF ;SET FLOATING MODE LDF TOINCH,F2 ;LOAD CONVERSION FACTOR ; DO: LDCIF (R1)+,F0 ;LOAD IX AND CONVERT TO F.P. MULF F2,F0 ;MULTIPLY BY CONVERSION FACTOR STF F0,(R0)+ ;STORE X ; LDCIF (R1)+,F1 ;LOAD IY AND CONVERT TO F.P. MULF F2,F1 ;MULTIPLY BY CONVERSION FACTOR STF F1,-4(R1) ;STORE Y ; SOB R2,DO ;BRANCH IF NOT DONE ; LDFPS (SP)+ ;RESTORE FPP PROGRAM STATUS LDF (SP)+,F2 ;RESTORE F2 LDF (SP)+,F1 ;RESTORE F1 LDF (SP)+,F0 ;RESTORE F0 ; DONE: JSR PC,CLRALL ;CLEAR SAVED PLOT COORDINATES. RTS PC ;RETURN ; ; DUMP: TST (SP)+ ;GET RID OF CHARACTER ASTX$S ;RETURN ; ; IOSB: .WORD 0 ;I/O RETURN STATUS NSENT: .WORD 0 ;NUMBER OF CHARACTERS SENT NESC: .WORD 0 ;NUMBER OF 'S COUNT DOWNER TOINCH: .FLT2 9.98543E-03 ;CONVERSION FACTOR HEADER: .BYTE 0 ;HEADER CHARACTER THIY: .BYTE TXLOY: .BYTE TLOY: .BYTE THIX: .BYTE TLOX: .BYTE .BLKB 6 PROMPT: .BYTE 37,33,41 ; !, ALPHA MODE - SINGLE POINT/PRESENCE LOCAL: .BYTE 0 ; = 4, LOCAL OFF; = 5, LOCAL ON RESETA: .BYTE 37 ; , ALPHA MODE RESETB: .BYTE 33,41,71,7 ; ! 9 , RESET TABLET - BELL