10000 DEF FNT0%(X0,Y0,F%)\ ON 3%-ABS(F%) GOTO 10020,10010,10030 !INITIALIZATION FUNCTION: F= +/- 2 +/-1 0 (X0,Y0) ORIGIN OF FIGURE IN INCHES [ (0,0) IS LOWER LEFT CORNER] F% FLAG AS DEFINED BELOW 10010 OPEN 'KB:' FOR OUTPUT AS FILE 11%\ OPEN '$TEKSYM.STD' FOR INPUT AS FILE 12%\ FIELD#11%, 128% AS O1$ !ABS(F%)=1% CAUSES INITIALIZATION 10020 O1(1%)=X0\ O2(1%)=Y0\ O1(2%),O2(2%)=0\ O1(3%),O2(3%)=140\ O1(4%),O2(4%)=1%\ O0%=0%\ O1%,O5%=-1%\ O1(5%)=X0*140\ O2(5%)=Y0*140 !ABS(F%)=2% RESETS ORIGIN TO (X0,Y0) 10030 IF F%>=0% THEN O0%(1%)=155%\ O0%(2%)=140%\ O0%(O0%)=0% FOR O0%=3% TO 90%\ GOSUB 10950 \O0%=90% \GOSUB 10950 !F%>=0% CLEARS SCREEN; FILL FOR 1200 BAUD. 10040 FNEND !O1() AND O2() STOREPARAMETERS FOR X&Y RESP.; 0 - RESERVED; 1 - ORIGIN (INCHES), (X0,Y0); 2 - ORIGIN (USER UNITS); 3 - USER UNITS/INCH; 4,5 - CONVERSION FACTORS O0%-BYTES IN BUFFER; O1%-FLAG(-1 FOR ALPHA/0 FOR GRAPHIC) 10100 DEF FNT1%(P0,Q0,P1,Q1)\ O1(2%)=P0 \O2(2%)=Q0\ O1(3%)=P1 \O2(3%)=Q1\ O1(4%)=140/P1\O2(4%)=140/Q1\ O1(5%)=P1*O1(1%)-P0\ O2(5%)=Q1*O2(1%)-Q0 10110 FNEND !FUNCTION TO SCALE THE DATA\ (P0,Q0) ORIGIN IN USER UNITS (P1,Q1) USER UNITS/INCH IN X AND Y DIRECTION, RESP. THIS FUNCTION NOT USED IF PLOTTING IN PLOTTER UNITS 10200 DEF FNT2%(X,Y,F%,G%)\ GOSUB 10960\ IF O1% OR ABS(F%)<=1% THEN GOSUB 10880 !SEND CHR$(29+128) IF IN ALPHA MODE OR DARK VECTOR REQUESTED 10210 IF F% THEN O3%=O1(4%)*(X+O1(5%))\ O4%=O2(4%)*(Y+O2(5%))\ GOTO 10230 10220 O4%=789%-X*22%\ O3%=14%*Y-14% !F%= -2 LINE/ALPHA -1 DARK/ALPHA 0 CURSOR TO ROW X, COL Y 1 DARK/GRAPH 2 LINE/GRAPH 10230 O1=O3%/140.-O1(1%)\ O2=O4%/140.-O2(1%)\ GOSUB 10800\ FNT2%=FNT6%(O1,O2,0.,.10,CHR$(15%+G%)) IF G%\ IF F%<=0% THEN GOSUB 10890\ GOSUB 10950 !PRINT SYMBOL FOR G%>0; RETURN TO ALPHA MODE FOR F%<=0 10240 FNEND 10300 DEF FNT3%(F%)\ GOSUB 10960\ GOSUB 10890\ O0%=O0%+2%\ O0%(O0%-1%)=155%\ IF F% THEN O0%(O0%)=133% ELSE O0%(O0%)=154% !GRAPHIC INPUT; CROSSHAIR (F%=0%) OR CURSOR (F%=-1%) RETURNS LOCATION IN O1,O2 (USER UNITS) 10330 GOSUB 10950\ INPUT LINE#11%, O0$\ CHANGE O0$ TO O1%\ O3%=32%*(O1%(2%)AND31%)+(O1%(3%)AND31%)\ O4%=32%*(O1%(4%)AND31%)+(O1%(5%)AND31%) !O3% & O4% ARE ACTUAL CURSOR LOCATION IN PLOTTER UNITS 10340 GOSUB 10850\ IF F% THEN FNT3%=O1%(1%) AND 31% ELSE FNT3%=O1%(1%) AND 127% !CONVERT TO USER UNITS;RETURN CHARACTER STRUCK IF CROSSHAIR;STATUS WORD IF CURSOR 10350 FNEND 10400 DEF FNT4%(X0,Y0,A,L,L$)\ O1(0%)=X0\ O2(0%)=Y0\ O7=A*.0174533\ O8=SIN(O7)\ O7=COS(O7) !DRAW AXIS OF LENGTH ABS(L) THRU (X0,Y0) AT ANGLE A; LABEL L$ ON SGN(L) SIDE OF AXIS 10410 O0(0%)=SGN(L)*.1\ L=ABS(L)\ O0(1%)=-O8*O0(0%)\ O0(2%)=O7*O0(0%)\ FNT4%=FNT7%(X0+O0(1%),Y0+O0(2%),1%)\ FNT4%=FNT7%(X0,Y0,2%)\ GOSUB 10850\ O0(3%)=O1\ O0(4%)=O2 10420 FOR O7%=1% TO INT(L)\ X0=X0+O7\ Y0=Y0+O8\ FNT4%=FNT7%(X0,Y0,2%)+FNT7%(X0+O0(1%),Y0+O0(2%),2%)+FNT7%(X0,Y0,2%) !DRAW AXIS WITH TICKS AN INCH APART 10430 NEXT O7%\ FNT4%=FNT7%(O1(0%)+L*O7,O2(0%)+L*O8,-2%)\ GOTO 10480 UNLESS LEN(L$)\ Y0=O0(3%)\ X0=O1(3%)\ IF ABS(O8)==1 THEN Y0=O0(4%)\ X0=O2(3%) !FINISH AXIS; GET DXVAL FROM O1 UNLESS A Y-AXIS ASKED FOR 10440 O0(4%)=SGN(X0)\ X0=ABS(X0)\ X0=X0/10 FOR O7%=0% UNTIL X0<99\ X0=X0*10 FOR O8%=O7% STEP -1% UNTIL X0>.01\ O0(5%)=O8% !DETERMINE EXPONENT FOR AXIS LABELS (FROM CALCOMP) 10450 O0(3%)=Y0*10^-O8%\ O0(4%)=X0*O0(4%)\ Y0=O0(0%)*(2-5*O0(0%))\ X0=O1(0%)-.1*O7-O8*Y0\ Y0=O2(0%)-.1*O8+O7*Y0 !INIT FOR LABELING TICK MARKS 10460 FOR O9%=0% TO INT(L)\ FNT4%=FNT6%(X0,Y0,A,.12,FNT5$(O0(3%),2%))\ O0(3%)=O0(3%)+O0(4%)\ X0=X0+O7\ Y0=Y0+O8 !LABEL EACH TICK ON AXIS 10470 NEXT O9%\ L$=L$+' (X10^'+FNT5$(O0(5%),0%)+')' IF O0(5%)<>0\ Y0=O0(0%)*(3.7-O0(0%)*5)\ X0=.5*L-.0625*LEN(L$)\ FNT4%=FNT6%(O1(0%)+X0*O7-Y0*O8,O2(0%)+O7*Y0+O8*X0,A,.12,L$) !PRINT LABEL 10480 FNEND 10500 DEF FNT5$(N,D%)\ O2$=CVT$$(NUM$(INT(N*10.^D%+.5)/10.^D%),255%)\ IF D%<=0% THEN FNT5$=O2$ ELSE O1%(0%)=INSTR(1%,O2$,'.')\ IF O1%(0%) THEN FNT5$=O2$+STRING$(D%+O1%(0%)-LEN(O2$),48%) ELSE FNT5$=O2$+'.'+STRING$(D%,48%) 10510 FNEND !NUMBER SUBROUTINE FROM CALCOMP 10600 DEF FNT6%(X0,Y0,A,H,L$)\ H=H/6\ O0=.0625*H\ A=A*.0174533\ O3=COS(A)\ O4=SIN(A) !SYMBOL FUNCTION TO PRINT THE STRING L$ AT (X0,Y0) INCHES AT ANGLE A(DEGREES) AND HEIGHT H(INCHES). 10610 FOR O7%=1% TO LEN(L$)\ O1%(1%)=1%\ CHANGE O2$(ASCII(MID(L$,O7%,1%))) TO O2%\ IF O2%(1%)=255% THEN GOSUB 10660 !O2$() VIRTUAL STRING ARRAY CONTAINING PEN MOTIONS 10620 FOR O8%=O1%(1%) TO O2%(0%)\ O2%=O2%(O8%)\GOSUB 10680\ FNT6%=FNT7%(X0+O3*O5-O4*O6,Y0+O3*O6+O4*O5,2%-O2%/128%) !PLOT POINT AFTER DECODING IT 10630 NEXT O8%\ IF O2%(2%)=255% THEN GOSUB 10675 ELSE IF (O2% AND 128%)=0% THEN O5=6.*H !CHARACTER DONE; RESET ORIGIN IF SPECIAL CENTERED CHARACTER, ELSE SPACE OVER IF LAST MOTION PEN-DOWN 10640 X0=X0+O3*O5\ Y0=Y0+O4*O5 !ADJUST X0 AND Y0 TO ORIGIN OF NEXT CHARACTER 10650 NEXT O7%\ O1=X0\ O2=Y0\ FNT6%=FNT7%(X0,Y0,-1%) IF ASCII(L$)>31%\ GOTO 10690 !SAVE LAST LOCATION IN O1 AND O2 10660 O1%(1%)=3%\ IF O2%(2%)=255% THEN O5=3*H\ X0=X0-O5*(O3-O4)\ Y0=Y0-O5*(O4+O3) !SPECIAL WITH BYTE 2=255 ==> CENTERED SYMBOL 10670 RETURN 10675 O5=3*H\ X0=X0+O5*(O3-O4)\ Y0=Y0+O5*(O4+O3)\ RETURN !SUBROUTINE TO RESET ORIGIN AFTER PLOTTING A CENTERED SYMBOL 10680 O5=(O2% AND 112%)*O0\ O6=((O2% AND 7%)-(O2% AND 8%))*H\ RETURN 10690 FNEND 10700 DEF FNT7%(X0,Y0,F%)\ GOSUB 10960\ O3%=140*(X0+O1(1%))+.5\ O4%=140*(Y0+O2(1%))+.5\ GOSUB 10880 IF O1% OR ABS(F%)<=1%\ GOSUB 10800 10710 IF F%<=0% THEN GOSUB 10890\ GOSUB 10950 10720 FNEND !FUNCTION SIMILAR TO FNT2% -- X0,Y0 MEASURED IN INCHES 10799 DIM O0%(128%),O1%(7%),O2%(16%),O1(5%),O2(5%)\ DIM#12%, O2$(127%)=16%\ GOTO 10999 !FORCES USER PROGRAM TO SKIP OVER SUBROUTINES 10800 IF O3%<0% THEN O3%=0% ELSE IF O3%>1023% THEN O3%=1023% 10810 IF O4%<0% THEN O4%=0% ELSE IF O4%>780% THEN O4%=780% !FORCE POINT ONTO SCREEN 10820 IF O5%<0% THEN GOSUB 10910\ GOSUB 10920\ GOSUB 10930\ GOTO 10840 !IF NO PREVIOUS POINT IN BUFFER, THEN ALL 4 BYTES ARE SENT 10830 GOSUB 10910 IF (O4% AND 992%)<> (O6% AND 992%)\ IF (O3% AND 992%)=(O5% AND 992%) THEN GOSUB 10920 IF (O4% AND 31%)<>(O6% AND 31%) ELSE GOSUB 10920\ GOSUB 10930 !SEND BYTE 1; BYTE 2 IF CHANGED; BYTE 2&3 IF 3 CHANGED 10840 GOSUB 10900\ O0%(O0%)=64%+(O3% AND 31%)\ O5%=O3%\ O6%=O4%\ RETURN !SEND LOW X ALL THE TIME 10850 O1=O3%/O1(4%)-O1(5%)\ O2=O4%/O2(4%)-O2(5%)\ RETURN !CONVERTS RASTOR UNITS TO USER UNITS 10880 GOSUB 10900\ O0%(O0%)=157%\ O1%=0%\ O5%=-1%\ RETURN !TURN ON GRAPHICS MODE 10890 GOSUB 10900\ O0%(O0%)=159%\ O1%,O5%=-1%\ RETURN !TURN ON ALPHA MODE 10900 O0%=O0%+1%\ RETURN 10910 GOSUB 10900\ O0%(O0%)=32%+O4%/32%\ RETURN !SEND HIGH Y 10920 GOSUB 10900\ O0%(O0%)=96%+(O4%AND31%)\ RETURN !SEND LOW Y 10930 GOSUB 10900\ O0%(O0%)=32%+O3%/32%\ RETURN !SEND HIGH X 10950 RETURN UNLESS O0%\ O0%(0%)=O0%\ CHANGE O0% TO O0$\ LSET O1$=O0$\ PUT #11%, RECORD 1%, COUNT O0%\ O0%=0%\ RETURN !DUMP BUFFER IF ANYTHING THERE 10960 IF O0%>122% THEN 10950 ELSE RETURN !CHECK FOR FULL BUFFER (I.E., ROOM FOR ANOTHER POINT) 10999 ! PLOT10.BAS VERSION 6A EDIT 5 21-JUN-76 ! TEKTRONIX PLOTTING FUNCTIONS (SEE USER'S GUIDE FOR INSTRUCTIONS) 32767END