8999  REM HP CONTRIBUTED LIBRARY, REV. B, 2/75
9000  MAT A=CON
9001  D$="0123456789"
9002  IF Z9<1 OR Z9>4 THEN 9038
9003  GOSUB 9086
9004  MAT B=A
9005  Y$=Z$
9006  GOSUB 9086
9007  MAT C=A
9008  GOSUB Z9 OF 9051,9082,9140,9157
9009  Z$=""
9010  A=ABS(A[1])
9011  A1=(A[1]<0)+4*(A-3 MAX 0)+1+(D>0)+D-(A >= 4)*(2+(A[A]<100)+(A[A]<10))
9012  IF A[1] >= 0 THEN 9014
9013  Z$[1,1]="-"
9014  A2=3
9015  IF A >= 4 THEN 9018
9016  Z$[LEN(Z$)+1,LEN(Z$)+1]="0"
9017  GOTO 9019
9018  GOSUB 9040
9019  A1=0
9020  FOR A=A-1 TO 4 STEP -1
9021  GOSUB 9040
9022  NEXT A
9023  IF D=0 THEN 9031
9024  Z$[LEN(Z$)+1,LEN(Z$)+1]="."
9025  A2=D MIN 3
9026  A=3
9027  GOSUB 9040
9028  A2=(D-3) MIN 3
9029  A=2
9030  GOSUB 9040
9031  Z8=0
9032  FOR A6=1 TO LEN(Z$)
9033  IF Z$[A6,A6]>"9" THEN 9036
9034  IF Z$[A6,A6]<"0" THEN 9036
9035  Z8=Z8+1
9036  NEXT A6
9037  RETURN 
9038  PRINT "INVALID OPERAND PASSED TO CALCULATOR IN Z9"
9039  RETURN 
9040  A3=A[A]*(A <= ABS(A[1]))
9041  A4=INT(A3/100)
9042  A5=INT((A3-100*A4)/10)
9043  A6=A3-100*A4-10*A5
9044  IF A4=0 AND A1 OR A2<1 THEN 9046
9045  Z$[LEN(Z$)+1,LEN(Z$)+1]=D$[A4+1,A4+1]
9046  IF A3<10 AND A1 OR A2<2 THEN 9048
9047  Z$[LEN(Z$)+1,LEN(Z$)+1]=D$[A5+1,A5+1]
9048  IF A2<3 THEN 9050
9049  Z$[LEN(Z$)+1,LEN(Z$)+1]=D$[A6+1,A6+1]
9050  RETURN 
9051  B=ABS(B[1])
9052  C=ABS(C[1])
9053  A1=0
9054  IF B[1]*C[1]<0 THEN 9064
9055  FOR A=2 TO B MAX C
9056  A2=A1+B[A]*(A <= B)+C[A]*(A <= C)
9057  A1=(A2>999)
9058  A[A]=A2-1000*A1
9059  NEXT A
9060  IF  NOT A1 THEN 9062
9061  A[A]=1
9062  A[1]=(A-( NOT A1))*SGN(B[1])
9063  RETURN 
9064  A3=1
9065  GOTO SGN(B-C)+2 OF 9071,9066,9072
9066  FOR A=B TO 2 STEP -1
9067  GOTO SGN(B[A]-C[A])+2 OF 9071,9068,9072
9068  NEXT A
9069  A[1]=1
9070  RETURN 
9071  A3=-1
9072  FOR A=2 TO B MAX C
9073  A2=A1+(B[A]*(B >= A)-C[A]*(C >= A))*A3
9074  A1=-(A2<0)
9075  A[A]=A2-1000*A1
9076  NEXT A
9077  FOR A=A-1 TO 2 STEP -1
9078  IF A[A]>0 THEN 9080
9079  NEXT A
9080  A[1]=A*A3*SGN(B[1])
9081  RETURN 
9082  C[1]=-C[1]
9083  GOSUB 9051
9084  C[1]=-C[1]
9085  RETURN 
9086  A9=1
9087  A3=A[2]=A[3]=0
9088  A[1]=3
9089  FOR A1=1 TO LEN(Y$)
9090  IF Y$[A1,A1] <> " " THEN 9094
9091  NEXT A1
9092  Y$="0"
9093  GOTO 9089
9094  IF Y$[A1,A1] <> "-" THEN 9098
9095  A9=-1
9096  A1=A1+1
9097  GOTO 9094
9098  IF Y$[A1,A1] <> " " THEN 9101
9099  Y$=Y$[A1]
9100  GOTO 9135
9101  IF A3=.1 THEN 9096
9102  IF Y$[A1,A1]>"5" THEN 9108
9103  IF Y$[A1,A1]>"2" THEN 9106
9104  A2=1
9105  GOTO 9110
9106  A2=4
9107  GOTO 9110
9108  IF Y$[A1,A1]>"8" THEN 9114
9109  A2=7
9110  FOR A2=A2 TO A2+2
9111  IF Y$[A1,A1]=D$[A2,A2] THEN 9119
9112  NEXT A2
9113  GOTO 9116
9114  A2=10
9115  IF Y$[A1,A1]="9" THEN 9119
9116  IF Y$[A1,A1] <> "." THEN 9096
9117  A3=100000.
9118  GOTO 9096
9119  A2=A2-1
9120  IF A3=0 THEN 9126
9121  A4=INT(A3/1000)
9122  A[3]=A[3]+A2*A4
9123  A[2]=A[2]+A2*(A3-1000*A4)
9124  A3=A3/10
9125  GOTO 9096
9126  FOR A4=4 TO A[1]
9127  A5=10*A[A4]+A2
9128  A2=INT(A5/1000)
9129  A[A4]=A5-1000*A2
9130  NEXT A4
9131  IF A2=0 THEN 9096
9132  A[1]=A[1]+1
9133  A[A[1]]=A2
9134  GOTO 9096
9135  IF A[A[1]] THEN 9138
9136  A[1]=A[1]-1
9137  GOTO 9135
9138  A[1]=A[1]*A9
9139  RETURN 
9140  A[1]=1
9141  IF ABS(B[1])=1 OR ABS(C[1])=1 THEN 9156
9142  MAT A=ZER
9143  A[1]=INT(B[2]*C[2]/1000)
9144  A1=3
9145  FOR C=2 TO ABS(C[1])
9146  A2=0
9147  FOR B=A1 TO ABS(B[1])
9148  A3=C[C]*B[B]+A2+A[B+C-4]
9149  A2=INT(A3/1000)
9150  A[B+C-4]=A3-1000*A2
9151  NEXT B
9152  A1=2
9153  A[B+C-4]=A2
9154  NEXT C
9155  A[1]=(B+C-5-(A[B+C-5]=0))*SGN(B[1]*C[1])
9156  RETURN 
9157  IF C[1] <> 1 THEN 9160
9158  PRINT "DIVISION BY ZERO ATTEMPTED"
9159  RETURN 
9160  B=ABS(B[1])+2
9161  C=ABS(C[1])
9162  IF C>1 THEN 9165
9163  PRINT "*** DIVISION BY ZERO ***"
9164  STOP 
9165  A[1]=1
9166  IF B>3 THEN 9168
9167  RETURN 
9168  FOR B1=B TO 4 STEP -1
9169  B[B1]=B[B1-2]
9170  NEXT B1
9171  B[2]=B[3]=0
9172  IF C=2 THEN 9216
9173  B1=INT(1000/(C[C]+1))
9174  B[B+1]=0
9175  IF B1=1 THEN 9189
9176  B2=0
9177  FOR B3=4 TO B
9178  B4=B1*B[B3]+B2
9179  B2=INT(B4/1000)
9180  B[B3]=B4-1000*B2
9181  NEXT B3
9182  B[B3]=B2
9183  B2=0
9184  FOR B3=2 TO C
9185  B4=B1*C[B3]+B2
9186  B2=INT(B4/1000)
9187  C[B3]=B4-1000*B2
9188  NEXT B3
9189  FOR B1=B+1 TO C+1 STEP -1
9190  A=INT((1000*B[B1]+B[B1-1])/C[C]) MIN 999
9191  IF C[C-1]*A-B[B1-2] <= (B[B1]*1000+B[B1-1]-A*C[C])*1000 THEN 9194
9192  A=A-1
9193  GOTO 9191
9194  B2=0
9195  B5=B1-C-1
9196  FOR B3=2 TO C
9197  B4=B2+B[B5+B3]-A*C[B3]
9198  B2=INT(B4/1000)
9199  B[B5+B3]=B4-1000*B2
9200  NEXT B3
9201  IF B2+B[B1] >= 0 THEN 9209
9202  A=A-1
9203  B2=0
9204  FOR B3=2 TO C
9205  B4=B2+B[B5+B3]+C[B3]
9206  B2=INT(B4/1000)
9207  B[B5+B3]=B4-1000*B2
9208  NEXT B3
9209  A[B5+2]=A
9210  NEXT B1
9211  A=B+2-C MAX 1
9212  IF A=1 THEN 9215
9213  A=(A-(A[A]=0)-(A[A]+A[A-1]=0))*SGN(B[1]*C[1])
9214  A[1]=A+2*(A=-1)
9215  RETURN 
9216  C1=C[2]
9217  B2=0
9218  FOR B1=B TO 2 STEP -1
9219  B3=1000*B2+B[B1]
9220  A[B1]=INT(B3/C1)
9221  B2=B3-A[B1]*C1
9222  NEXT B1
9223  GOTO 9211
9999  END 
