7001  COM H[300,3],A$[24],R$[32],J[45],X2,X3,Y2,Y3,X4,Y4
7002  REM
7003  REM  ****  HP BASIC PROGRAM LIBRARY  *****************************
7004  REM
7005  REM        PLOT33:  KEYBOARD ENTRY MULTIPLE FUNCTION PLOTTER
7006  REM
7007  REM        36659  REV A  --  10/73   PART 1 OF 2
7008  REM
7009  REM  ****  CONTRIBUTED PROGRAM  ***********************************
7010  REM
7011  REMEMBER PAUL VOJTA, SOUTHWEST SR. HIGH, MPLS, MN, WHO WROTE THIS
7012  REM
7013  DIM D$[9],E$[72],F$[33],G[114],K$[22]
7014  DEF FNL()=1 MAX INT((-10*INT(/10))/2) MIN 3
7015  A$=""
7016  F$="SINCOSTANATNLOGEXPRNDABSSGNINTSQR"
7017  K$="0123456789.E+-*/^()X "
7018  H=Y1=0
7019  MAT H=ZER
7020  PRINT "Y=";
7021  ENTER 255,J,E$
7022  PRINT 
7023  MAT G=ZER
7024  MAT J=ZER
7025  IF LEN(E$)=0 OR J<0 THEN 7021
7026  R=E=P=0
7027  G=G[1]=1
7028  GOSUB 7379
7029  IF K=0 THEN 7109
7030  IF K=14 THEN 7054
7031  IF K<12 THEN 7066
7032  GOTO 23-K OF 7033,7028,7057,7046,7061
7033  FOR L=1 TO 31 STEP 3
7034  IF E$[E,E+2]=F$[L,L+2] THEN 7048
7035  NEXT L
7036  IF E$[E,E]<"A" THEN 7046
7037  IF E$[E,E]>"Z" THEN 7046
7038  FOR L=1 TO LEN(A$)
7039  IF A$[L,L]=E$[E,E] THEN 7042
7040  NEXT L
7041  A$[L,L]=E$[E,E]
7042  G=G+1+(G[G]#7)
7043  G[G-1]=11+(G[G-1]=7)
7044  G[G]=L+1
7045  GOTO 7059
7046  PRINT E$;LIN(1);TAB(E-1);"^";LIN(1);"ILLEGAL CHARACTER"
7047  GOTO 7020
7048  E=E+2
7049  GOSUB 7379
7050  IF K#18 THEN 7046
7051  G=G+1
7052  G[G]=100+(L+2)/3
7053  GOTO 7063
7054  G=G+1
7055  G[G]=7
7056  GOTO 7028
7057  G=G+(G[G]#7)
7058  G[G]=9+(G[G]=7)
7059  GOSUB 7379
7060  GOTO 7098
7061  G=G+1
7062  G[G]=100
7063  P=P+1
7064  R=R MAX P
7065  GOTO 7028
7066  S=0
7067  IF K=11 THEN 7073
7068  IF K=12 THEN 7079
7069  IF K>12 OR K=0 THEN 7092
7070  S=S*10+K-1
7071  GOSUB 7379
7072  GOTO 7067
7073  T=.1
7074  GOSUB 7379
7075  IF K=0 OR K>10 THEN 7067
7076  S=S+(K-1)*T
7077  T=T/10
7078  GOTO 7074
7079  T=1
7080  GOSUB 7379
7081  IF K=13 THEN 7079
7082  IF K#14 THEN 7085
7083  T=-1
7084  GOTO 7080
7085  U=0
7086  IF K>10 OR K=0 THEN 7090
7087  U=U*10+K-1
7088  GOSUB 7379
7089  GOTO 7086
7090  S=S*10^(T*U)
7091  GOTO 7067
7092  IF G[G]#7 THEN 7095
7093  G=G-1
7094  S=-S
7095  G=G+2
7096  G[G]=S
7097  G[G-1]=8
7098  IF K=0 THEN 7109
7099  IF K<13 THEN 7046
7100  GOTO 23-K OF 7046,7059,7046,7104,7046
7101  G=G+1
7102  G[G]=K-11
7103  GOTO 7028
7104  IF P<1 THEN 7046
7105  G=G+1
7106  G[G]=-100
7107  P=P-1
7108  GOTO 7059
7109  IF P=0 THEN 7112
7110  PRINT "MISSING RIGHT PARENTHESIS"
7111  GOTO 7020
7112  L=1
7113  L=L+1
7114  IF P=R THEN 7119
7115  P=P+(G[L]>99)-(G[L]=-100)
7116  L=L+(G[L]=8)
7117  IF L>G THEN 7209
7118  GOTO 7113
7119  S=L-1
7120  V=3
7121  G[S]=G[S]-50
7122  H=H+1
7123  FOR T=26 TO 45
7124  IF J[T]=0 THEN 7128
7125  NEXT T
7126  PRINT "TOO COMPLEX"
7127  GOTO 7020
7128  H[H,1]=T
7129  H[H,2]=J[T]=1
7130  L=L-1
7131  U=1
7132  L=L+1
7133  IF G[L]=8 THEN 7142
7134  IF G[L]>49 THEN 7153
7135  IF G[L]>10 THEN 7149
7136  IF G[L]>8 THEN 7146
7137  IF G[L]=7 THEN 7140
7138  PRINT L;"???";G[L];"R=";R
7139  GOTO 1+(L>G) OF 7132,7209
7140  U=-1
7141  GOTO 7132
7142  H[H,2]=H[H,2]+10
7143  L=L+1
7144  H[H,3]=G[L]
7145  GOTO 7163
7146  H[H,3]=1
7147  H[H,2]=H[H,2]+20*(G[L]=10)
7148  GOTO 7163
7149  H[H,2]=H[H,2]+20*(G[L]=12)
7150  L=L+1
7151  H[H,3]=G[L]
7152  GOTO 7163
7153  IF U>0 THEN 7155
7154  H[H,2]=H[H,2]+20
7155  IF H[H,2]#1 THEN 7160
7156  H=H-1
7157  J[T]=0
7158  T=G[L+1]
7159  GOTO 7162
7160  H[H,3]=G[L+1]
7161  J[G[L+1]]=0
7162  L=G[L+2]
7163  L=L+1
7164  U=L+1+(G[L+1]=7)
7165  IF G[U]<50 THEN 7168
7166  U=G[G[U+2]+1]
7167  GOTO 7172
7168  U=G[L+(G[L+1]=8 OR G[L+1]=11 OR G[L+1]=12)+2]
7169  IF U#-100 THEN 7172
7170  U=1
7171  GOTO 7173
7172  U=FNL(U)
7173  X=V
7174  V=FNL(G[L])
7175  IF X <= V THEN 7189
7176  IF G[108+X]=0 THEN 7189
7177  W=FNL(G[G[108+X]])
7178  IF W<V THEN 7187
7179  H=H+1
7180  H[H,1]=G[111+W]
7181  H[H,2]=G[G[108+X]]
7182  H[H,3]=T
7183  J[T]=G[111+W]=G[108+X]=0
7184  T=H[H,1]
7185  X=W
7186  GOTO 7175
7187  G[108+V]=G[108+X]
7188  G[108+X]=0
7189  IF G[L]=-100 THEN 7200
7190  IF U>V THEN 7196
7191  IF L>G THEN 7209
7192  H=H+1
7193  H[H,1]=T
7194  H[H,2]=G[L]
7195  GOTO 7131
7196  G[111+V]=T
7197  G[108+U]=L
7198  L=L+1
7199  GOTO 7122
7200  P=P-1
7201  G[L]=-50
7202  G[S+1]=T
7203  G[S+2]=L
7204  IF G[S]<51 THEN 7113
7205  H=H+1
7206  H[H,1]=T
7207  H[H,2]=G[S]
7208  GOTO 7113
7209  P=0
7210  R=R-1
7211  FOR S=109 TO 114
7212  G[S]=0
7213  NEXT S
7214  IF R >= 0 THEN 7112
7215  H=H+1
7216  H[H,1]=T
7217  H[H,2]=62
7218  Y1=Y1+1
7219  PRINT "WHAT WILL BE THE PRINTED CHARACTER? ";
7220  ENTER 255,X2,R$[Y1]
7221  PRINT 
7222  IF LEN(R$)#Y1 OR X2<0 THEN 7219
7223  IF R$[Y1,Y1]<" " THEN 7219
7224  PRINT "IS THERE ANOTHER FUNCTION TO BE PLOTTED";
7225  INPUT E$
7226  IF E$[1,1]="Y" THEN 7020
7227  H[H,3]=1
7228  PRINT "ARE YOU USING A DIGILOG 33";
7229  INPUT T$[1,1]
7230  D$="123456789"
7231  F$='8'9'10'11
7232  K$='11'11'11'11'11'11'11'11'11'11'11'11'11'11'11'11
7233  E$="++++++++++++++++++++++++++++++++++++++++"
7234  RESTORE 
7235  PRINT "X LIMITS";
7236  INPUT X2,X3
7237  PRINT "Y LIMITS";
7238  INPUT Y2,Y3
7239  IF T$#"Y" THEN 7295
7240  X4=(X3-X2)/79
7241  Y4=(Y3-Y2)/15
7242  PRINT "X-SPACING=";X4
7243  PRINT "Y-SPACING=";Y4
7244  GOSUB 7347
7245  PRINT '12;
7246  IF Y2*Y3>0 THEN 7251
7247  FOR T=1 TO INT(Y3/Y4+.5)
7248  PRINT  USING "#,A";F$[3,3]
7249  NEXT T
7250  PRINT  USING "+,40A,40A,15A";E$[1,40],E$[1,40],K$[1,15]
7251  IF X2*X3>0 THEN 7256
7252  FOR T=1 TO INT(.5-X2/X4)
7253  PRINT  USING "#,A";F$[2,2]
7254  NEXT T
7255  PRINT "+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'8'10"+"'11'11'11'11'11'11'11'11'11'11'11'11'11'11'11'11'13;
7256  X1=Y1=Y=P=R=0
7257  FOR X=-9 TO 9
7258  IF X=0 THEN 7262
7259  P$=D$[ABS(X),ABS(X)]
7260  GOSUB 7362
7261  GOTO 7270
7262  FOR Y=-9 TO 9
7263  IF Y=0 THEN 7266
7264  P$=D$[ABS(Y),ABS(Y)]
7265  GOTO 7267
7266  P$="O"
7267  GOSUB 7362
7268  NEXT Y
7269  Y=0
7270  NEXT X
7271  P=P+1
7272  PRINT  USING "+,A";B$[2,2]
7273  X1=0
7274  P$=R$[P,P]
7275  FOR X0=0 TO 79
7276  J[1]=X2+X0*X4
7277  H=R
7278  GOSUB 7388
7279  GOSUB 7364
7280  NEXT X0
7281  R=H
7282  IF  NOT H[H,3] THEN 7271
7283  P$="O"
7284  GOTO TYP(0) OF 7286,7285,7289
7285  READ P$
7286  READ X,Y
7287  GOSUB 7362
7288  GOTO 7284
7289  PRINT  USING "+,15A";K$[1,15]
7290  GOTO 7343
7291  R$[LEN(R$)+1,32]=""
7292  R$[13]=R$[1,20]
7293  R$[1,12]=" 0123456789+"
7294  D$=""
7295  IF LEN(D$) THEN 7291
7296  PRINT "DO YOU WANT THE GRAPH TO BE HORIZONTAL OR VERTICAL";
7297  INPUT E$
7298  IF E$[1,1]="V" THEN 7304
7299  IF E$[1,1]#"H" THEN 7296
7300  X4=(X3-X2)/71
7301  Y4=(Y3-Y2)/46
7302  PRINT "X-SPACING=";X4
7303  GOTO 7305
7304  Y4=(Y3-Y2)/71
7305  PRINT "Y-SPACING=";Y4
7306  IF E$[1,1]="H" THEN 7309
7307  PRINT "X-SPACING";
7308  INPUT X4
7309  GOSUB 7347
7310  IF E$[1,1]="V" THEN 7312
7311  CHAIN "$PLOTTY"
7312  PRINT LIN(-10)
7313  FOR X=X2 TO X3 STEP X4
7314  E$[1,72]=""
7315  E=1
7316  IF INT(X/X4+.5) THEN 7326
7317  FOR T=1 TO 72
7318  E$[T,T]="+"
7319  NEXT T
7320  FOR Y=-9 TO 9
7321  G=ABS(Y)+2
7322  GOSUB 7357
7323  NEXT Y
7324  E=72
7325  GOTO 7333
7326  G=12
7327  T=INT(X+.5)
7328  Y=0
7329  IF ABS(T)>9 THEN 7332
7330  IF INT((X-T)/X4+.5) THEN 7332
7331  G=ABS(T)+2
7332  GOSUB 7357
7333  J[1]=X
7334  G=12
7335  H=0
7336  G=G+1
7337  GOSUB 7388
7338  GOSUB 7357
7339  IF  NOT H[H,3] THEN 7336
7340  PRINT E$[1,E]
7341  NEXT X
7342  PRINT LIN(-10)
7343  PRINT "AGAIN";
7344  INPUT P$[1,1]
7345  IF P$="Y" THEN 7234
7346  STOP 
7347  IF  NOT LEN(A$) THEN 7354
7348  PRINT "CONSTANT DATA:"
7349  FOR T=1 TO LEN(A$)
7350  PRINT A$[T,T];"=";
7351  INPUT J[T+1]
7352  NEXT T
7353  RETURN 
7354  IF T$#"Y" THEN 7356
7355  PRINT '16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16'16;
7356  RETURN 
7357  U=INT((Y-Y2)/Y4+1.5)
7358  IF U<1 OR U>72 THEN 7361
7359  E$[U,U]=R$[G,G]
7360  E=E MAX U
7361  RETURN 
7362  X0=INT(.5+(X-X2)/X4)
7363  IF X0<0 OR X0>79 THEN 7377
7364  Y0=INT(.5+(Y3-Y)/Y4)
7365  IF Y0<0 OR Y0>15 THEN 7377
7366  C=1+(X0>X1)
7367  FOR B=1 TO ABS(X0-X1)
7368  PRINT  USING "#,A";F$[C,C]
7369  NEXT B
7370  C=3+(Y1>Y0)
7371  FOR B=1 TO ABS(Y1-Y0)
7372  PRINT  USING "#,A";F$[C,C]
7373  NEXT B
7374  PRINT  USING "#,A";P$
7375  X1=X0+1 MIN 79
7376  Y1=Y0
7377  RETURN 
7378  E$[E,E]=" "
7379  E=E+1
7380  IF E <= LEN(E$) THEN 7383
7381  K=0
7382  RETURN 
7383  IF E$[E,E]<"!" THEN 7378
7384  FOR K=1 TO 21
7385  IF E$[E,E]=K$[K,K] THEN 7387
7386  NEXT K
7387  RETURN 
7388  H=H+1
7389  S=J[H[H,1]]
7390  T=H[H,2]
7391  U=H[H,3]
7392  IF T<50 THEN 7395
7393  GOTO T-50 OF 7419,7422,7425,7428,7432,7435
7394  GOTO T-56 OF 7438,7440,7442,7444,7446,7450
7395  IF T>10 AND T<20 THEN 7401
7396  U=J[U]
7397  T=T+10
7398  IF T<30 THEN 7401
7399  U=-U
7400  T=T-20
7401  GOTO T-10 OF 7402,7404,7406,7408,7410,7413
7402  S=U
7403  GOTO 7448
7404  S=S+U
7405  GOTO 7448
7406  S=S-U
7407  GOTO 7448
7408  S=S*U
7409  GOTO 7448
7410  IF  NOT U THEN 7452
7411  S=S/U
7412  GOTO 7448
7413  IF  NOT S THEN 7448
7414  IF ABS(LOG(ABS(S))*U)>85 THEN 7452
7415  IF S>0 THEN 7417
7416  U=INT(U+.5)
7417  S=S^U
7418  GOTO 7448
7419  IF ABS(S)>100000. THEN 7452
7420  S=SIN(S)
7421  GOTO 7448
7422  IF ABS(S)>100000. THEN 7452
7423  S=COS(S)
7424  GOTO 7448
7425  IF ABS(S)>50000. THEN 7452
7426  S=TAN(S)
7427  GOTO 7448
7428  IF S=0 THEN 7430
7429  IF ABS(LOG(ABS(S)))>40 THEN 7452
7430  S=ATN(S)
7431  GOTO 7448
7432  IF S <= 0 THEN 7452
7433  S=LOG(S)
7434  GOTO 7448
7435  IF S>85 THEN 7452
7436  S=EXP(S)
7437  GOTO 7448
7438  S=RND(S)
7439  GOTO 7448
7440  S=ABS(S)
7441  GOTO 7448
7442  S=SGN(S)
7443  GOTO 7448
7444  S=INT(S)
7445  GOTO 7448
7446  IF S<0 THEN 7452
7447  S=SQR(S)
7448  J[H[H,1]]=S
7449  GOTO 7388
7450  Y=J[H[H,1]]
7451  RETURN 
7452  Y=Y3+Y4
7453  IF H[H,2]=62 THEN 7451
7454  H=H+1
7455  GOTO 7453
7456  END 
