A collection of 37 short demonstrations of numerical methods, chosen from a menu by number (for example 6.1). They are arranged in eight groups: vector operations; plotting Cartesian, polar and parametric data, curves and contour maps; special functions (the complementary error function, gamma, Bessel functions and factorials); numerical derivatives and integration, including 10-point Gaussian quadrature; matrix inversion and multiplication; solving linear and nonlinear systems by Newton’s method, with linear, nonlinear and exponential least-squares regression; Runge-Kutta solutions of differential equations; and utilities including a ratio finder, a multiple-precision calculator, a base converter for fractional numbers, and a calculator. Many of the demonstrations let the user type in a function to plot, integrate, solve or fit.
The title screen reads “Applied Sinclair: Programs and Subroutines for the Mathematically-Minded. Demonstration programs for the TS2068. By Richard Booth”, and the opening REM is dated 4/10/85 with the filename DEMOS. Many lines carry a remark beginning *** FOR ZX81, USE *** with the equivalent ZX81 statement, which suggests the routines were written for both machines.
Program Analysis
Program Structure
- Title and menu (lines 1–70): a checkered border, the title text, then 37
DATAentries each giving a demo number, a title and a starting line. These are read intoQ$()andQ(), and the entered number is matched againstQ$before jumping to the stored line. - Demonstrations (lines 100–751): each one is a short driver that sets up test data or asks for input, calls the library routines and prints or plots the result.
- Library routines (lines 1000–8820): vector min/max and dot product, data input and function sampling, plot scaling, data plotting, curve and contour plotting, erfc, gamma, Bessel, derivatives, Simpson-type and Gaussian integration, matrix inverse and determinant, matrix multiplication, Newton root-finding, linear and nonlinear least squares, fourth-order Runge-Kutta, a ratio finder, multiple-precision arithmetic, base conversion and a calculator.
Notable Techniques
- Subroutines are called through named variables, for example
LET VDOTP=1100followed byGO SUB VDOTP, so each demo shows which routines it uses. - The library routines work on any expression passed in as a string. The dot product routine sums
VAL X$asIruns over the vector, so the same code gives the Euclidean norm (X$="X(I)*X(I)"), a covariance, a convolution term or a matrix product element. Functions typed in by the user are evaluated the same way, withVAL F$orVAL Y$. - The special functions use polynomial approximations: erfc as a 6-term polynomial raised to the power −16, and gamma as an 8-term polynomial combined with the recurrence relation. Bessel functions of integer order are summed from their series until a term falls below 1E-9.
- The multiple-precision calculator (lines 8100–8514) stores numbers as arrays of decimal digits with a sign and an exponent. Subtraction is done with ten’s complement, and digits are shifted to line up the exponents.
- The Gaussian integration result is printed beneath an integral sign built from block graphics (lines 4314–4322).
Potential Issues
- Line 6264 reads
LET Z(J,K)=Z(J,K)=G(J)*G(K). The second=is a comparison, so the off-diagonal terms of the normal matrix become 0 or 1. This was probably meant to be+, and it affects the nonlinear regression demos 6.6 and 6.7. - The calculator at line 8800 is headed “ZX81 CALCULATOR” and classifies keys with
CODE Y$-32, which uses ZX81 character codes. No TS2068 version of that line is given, so it will not sort digits and operators correctly on the 2068. - In the multiple-precision routine, any operation other than
>,+,-or*falls through into multiplication. Division is not supported. - The ratio finder (demo 8.1) loops forever on zero or a negative number, since it only ever increases the numerator or denominator starting from 1/1.
- Demo 1.2 sets
N=2but fills five-element vectors, so only the first two components are used. - Demos 4.6 and 4.7 both go to line 4300, and 6.1–6.3 all go to the same Newton solver at line 6000. Each pair or group runs the same code.
Source Code
1 REM DEMONSTRATION PROGRAMS; FILENAME="DEMOS";RICHARD BOOTH 4/10/85
2 LET Y$="::::.' '.::::"
3 LET Z$="::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
4 PRINT Z$: FOR I=1 TO 20: PRINT Y$: NEXT I: PRINT Z$
5 PRINT AT 5,5;"Applied Sinclair"
6 PRINT AT 6,5;"Programs and Subroutines"
7 PRINT AT 7,5;"for the"
8 PRINT AT 8,5;"Mathematically-Minded"
9 PRINT AT 10,5;"Demonstration programs"
10 PRINT AT 11,5;"for the TS2068"
11 PRINT AT 14,5;"By Richard Booth"
12 PAUSE 300
13 CLS
14 DIM Q$(37,3): DIM Q(37)
15 FOR I=1 TO 37: READ Q$(I),Y$,Q(I): PRINT "DEMO ";Q$(I);": ";Y$: NEXT I
16 DATA "1.1","VECTOR NORMS",100
17 DATA "1.2","SCALAR OPERATIONS",130
18 DATA "1.3","DISCRETE CONVOLUTION",170
19 DATA "1.4","GRAM-SCHMIDT ORTHONORM",190
20 DATA "2.1","PLOT CARTESIAN DATA",230
21 DATA "2.2","PLOT POLAR DATA",240
22 DATA "2.3","PLOT SAMPLED POLAR FN",260
23 DATA "2.4","PLOT PLANE CURVES",2500
24 DATA "2.5","PLOT CONTOURS",2600
25 DATA "3.1","PLOT ERFC(X)",280
26 DATA "3.2","PLOT GAMMA(X)",290
27 DATA "3.3","PLOT BESSEL'S FNS",300
28 DATA "3.4","FACTORIALS",310
29 DATA "4.1","PLOT DERIVATIVE",320
30 DATA "4.2","PLOT 1ST DERIVATIVE",340
31 DATA "4.3","INTEGRATION (=STEP)",360
32 DATA "4.4","INTEGRATION (<>STEP)",370
33 DATA "4.5","INTEGRATION (NOISY)",390
34 DATA "4.6","GAUSSIAN QUAD. (POLYN)",4300
35 DATA "4.7","GAUSSIAN QUAD.",4300
36 DATA "5.1","MATRIX INVERTER",410
37 DATA "5.2","MX-MX MULTIPLICATION",450
38 DATA "5.3","MX-VECTOR MULT.",480
39 DATA "5.4","VECTOR-MX MULT.",500
40 DATA "6.1","SYSTEM OF LINEAR EQNS",6000
41 DATA "6.2","SYSTEM OF NLIN. EQNS",6000
42 DATA "6.3","NON-LINEAR EQUATION",6000
43 DATA "6.4","GENERAL LIN.LST.SQRS.",530
44 DATA "6.5","LINEAR REGRESSION",580
45 DATA "6.6","GENERAL NLIN.LST.SQRS.",610
46 DATA "6.7","EXPONENTIAL REGRESSION",640
47 DATA "7.1","SYSTEMS OF DIFF.EQNS",670
48 DATA "7.2","1ST ORDER DIFF.EQNS.",710
49 DATA "8.1","RATIOS FOR IRRATIONALS",8000
50 DATA "8.2","MULT.PREC. CALCULATOR",740
51 DATA "8.3","BASE CHANGER",8600
52 DATA "8.4","SCIENTIFIC CALCULATOR",8800
60 INPUT "ENTER DEMO# (EX. ""6.1"")",Z$
61 CLS
62 FOR I=1 TO 37: IF Z$=Q$(I) THEN GO TO Q(I)
63 NEXT I
70 CLS : PRINT "TRY AGAIN!": GO TO 60
99 STOP
100 REM DEMO1.1
101 LET VINAX=1000
102 LET VDOTP=1100
103 LET N=5
104 DIM X(N)
105 LET X(1)=-1
106 LET X(2)=2
107 LET X(3)=5
108 LET X(4)=3
109 LET X(5)=-1
110 LET X$="X(I)*X(I)"
111 GO SUB VDOTP
112 PRINT "EUCLIDEAN NORM = ";SQR V
113 LET X$="ABS X(I)"
114 GO SUB VINAX
115 PRINT "MAXIMUM NORM = ";U
116 GO SUB VDOTP
117 PRINT "SUM NORM = ";V
118 LET X$="X(I)"
119 GO SUB VDOTP
120 LET M=V/N
121 LET X$="(X(I)-M)*(X(I)-M)"
122 GO SUB VDOTP
123 PRINT "MEAN = ";M
124 PRINT "STANDARD DEVIATION = ";SQR V
125 STOP
130 REM DEMO1.2
131 LET VDOTP=1100
132 LET N=2
133 DIM X(5)
134 DIM Y(5)
135 LET X(1)=-1
136 LET X(2)=2
137 LET X(3)=5
138 LET X(4)=3
139 LET X(5)=-1
140 LET Y(1)=2
141 LET Y(2)=5
142 LET Y(3)=7
143 LET Y(4)=-1
144 LET Y(5)=40
145 LET X$="X(I)*Y(I)"
146 GO SUB VDOTP
147 LET XY=V
148 PRINT "(X,Y) = ";XY
149 LET X$="X(I)"
150 GO SUB VDOTP
151 LET MX=V/N
152 LET X$="Y(I)"
153 GO SUB VDOTP
154 LET MY=V/N
155 LET X$="(X(I)-MX)*(Y(I)-MY)"
156 GO SUB VDOTP
157 PRINT "COV(X,Y) = ";V
158 LET X$="(X(I)-Y(I))*(X(I)-Y(I))"
159 GO SUB VDOTP
160 PRINT "DIST(X,Y) = ";SQR V
161 LET X$="X(I)*X(I)"
162 GO SUB VDOTP
163 LET XX=V
164 LET X$="Y(I)*Y(I)"
165 GO SUB VDOTP
166 LET YY=V
167 PRINT "ANGLE(X,Y) = ";ACS (XY/SQR (XX*YY))*180/PI;" DEGREES"
168 STOP
170 REM DEMO1.3
171 LET VDOTP=1100
172 LET N=60
173 DIM X(N)
174 DIM Y(N)
175 FOR I=1 TO N
176 LET X(I)=20/I
177 LET Y(I)=1
178 NEXT I
179 FOR J=1 TO N
180 LET N=J
181 LET X$="X(I)*Y(J-I+1)"
182 GO SUB VDOTP
183 PLOT J*4,V/3*4: REM *** FOR ZX81, USE *** PLOT J,V/3
184 NEXT J
185 STOP
190 REM DEMO1.4
191 LET VDOTP=1100
192 LET N=5
193 LET P=3
194 DIM X(N,P)
195 FOR J=1 TO P
196 FOR I=J TO N
197 LET X(I,J)=1
198 NEXT I
199 NEXT J
200 FOR J=1 TO P
201 FOR K=1 TO J-1
202 LET X$="X(I,J)*X(I,K)"
203 GO SUB VDOTP
204 FOR I=1 TO N
205 LET X(I,J)=X(I,J)-V*X(I,K)
206 NEXT I
207 NEXT K
208 LET X$="X(I,J)*X(I,J)"
209 GO SUB VDOTP
210 LET M=SQR V
211 FOR I=1 TO N
212 LET X(I,J)=X(I,J)/M
213 NEXT I
214 NEXT J
215 FOR J=1 TO P
216 FOR I=1 TO N
217 PRINT "E";J;"(";I;")= ";
218 PRINT SGN X(I,J)*INT (ABS X(I,J)*1E6)*1E-6
219 NEXT I
220 PRINT "**********"
221 NEXT J
222 STOP
230 REM DEMO2.1
231 LET POINT=2000
232 LET VINAX=1000
233 LET SCALE=2200
234 LET PLOTD=2400
235 GO SUB POINT
236 GO SUB PLOTD
237 STOP
240 REM DEMO2.2
241 LET POINT=2000
242 LET VINAX=1000
243 LET SCALE=2300
244 LET PLOTD=2400
245 GO SUB POINT
246 FOR I=1 TO N
247 LET M=X(I)*PI/180
248 LET X(I)=Y(I)*COS M
249 LET Y(I)=Y(I)*SIN M
250 NEXT I
251 GO SUB PLOTD
252 STOP
260 REM DEMO2.3
261 LET POINT=2100
262 LET VINAX=1000
263 LET SCALE=2300
264 LET PLOTD=2400
265 GO SUB POINT
266 FOR I=1 TO N
267 LET M=X(I)
268 LET X(I)=Y(I)*COS M
269 LET Y(I)=Y(I)*SIN M
270 NEXT I
271 GO SUB PLOTD
272 STOP
280 REM DEMO3.1
281 LET ERFCX=3000
282 FOR X=0 TO 2 STEP .02
283 GO SUB ERFCX
284 PLOT X*120,V*160: REM *** FOR ZX81, USE *** PLOT X*30,V*40
285 NEXT X
286 STOP
290 REM DEMO3.2
291 LET GAMAX=3100
292 FOR X=-3.9 TO 4 STEP .02
293 GO SUB GAMAX
294 IF V<-5 THEN LET V=-5
295 IF V>5 THEN LET V=5
296 PLOT (X+4)*30,(V+5)*16: REM *** FOR ZX81, USE *** PLOT (X+4)*7.5,(V+5)*4
297 NEXT X
298 STOP
300 REM DEMO3.3
301 LET BESEX=3200
302 PRINT "INPUT NU=(INTEGER>=0)"
303 INPUT N
304 CLS
305 FOR X=0 TO 10 STEP .1
306 GO SUB BESEX
307 PLOT X*24,(V+1)*80: REM *** FOR ZX81, USE *** PLOT X*6,(V+1)*20
308 NEXT X
309 STOP
310 REM DEMO3.4
311 LET GAMAX=3100
312 PRINT "INPUT INTEGER>=0"
313 INPUT INTEGER
314 LET X=INTEGER+1
315 GO SUB GAMAX
316 CLS
317 PRINT INTEGER;"! = ";V
318 STOP
320 REM DEMO4.1
321 LET DERIV=4000
322 DIM X(100)
323 DIM Y(100)
324 FOR I=1 TO 100
325 LET X(I)=.04*PI*I
326 LET Y(I)=SIN X(I)
327 NEXT I
328 LET G=6
329 FOR I=1 TO 100-G
330 PLOT 20*X(I),80*(Y(I)+1): REM *** FOR ZX81, USE *** PLOT 5*X(I),20*(Y(I)+1)
331 GO SUB DERIV
332 PLOT 20*X(I),80*(V+1): REM *** FOR ZX81, USE *** PLOT 5*X(I),20*(V+1)
333 NEXT I
334 STOP
340 REM DEMO4.2
341 LET DERIV=4000
342 LET POINT=2100
343 LET VINAX=1000
344 LET SCALE=2300
345 LET PLOTD=2400
346 GO SUB POINT
347 LET G=1
348 FOR I=1 TO N-G
349 GO SUB DERIV
350 LET Y(I)=V
351 NEXT I
352 GO SUB PLOTD
353 STOP
360 REM DEMO4.3
361 LET POINT=2100
362 LET DERIV=4000
363 LET INTEG=4200
364 PRINT "NUMBER OF POINTS MUST BE ODD"
365 GO SUB POINT
366 GO SUB INTEG
367 PRINT "INTEGRAL = ";S
368 PRINT "ERROR(EST) = ";Q
369 STOP
370 REM DEMO4.4
371 LET INTEG=4200
372 LET DERIV=4000
373 LET N=21
374 DIM X(N)
375 DIM Y(N)
376 LET X(1)=0
377 LET Y(1)=1
378 LET H=.1
379 FOR I=2 TO N
380 LET X(I)=X(I-1)+H
381 LET Y(I)=EXP -X(I)
382 LET H=H*1.2
383 NEXT I
384 GO SUB INTEG
385 PRINT "INTEGRAL = ";S
386 PRINT "ERROR(EST) =";R
387 STOP
390 REM DEMO4.5
391 LET INTEG=4200
392 LET DERIV=4000
393 LET POINT=2100
394 PRINT "NUMBER OF POINTS MUST BE ODD"
395 GO SUB POINT
396 FOR I=1 TO N
397 LET NOISE=RND/500*SGN (RND-.5)
398 LET Y(I)=Y(I)+NOISE
399 NEXT I
400 GO SUB INTEG
401 PRINT "INTEGRAL = ";S
402 PRINT "ERROR(EST) = ";ABS (S-T)
403 STOP
410 REM DEMO5.1
411 LET MXINV=5000
412 PRINT "INPUT DIM"
413 INPUT N
414 DIM A(N,N)
415 PRINT "INPUT MX ELEMENTS:"
416 FOR I=1 TO N
417 FOR J=1 TO N
418 REM *** FOR ZX81, USE *** SCROLL
419 PRINT "A(";I;",";J;")=? ";
420 INPUT A(I,J)
421 PRINT A(I,J)
422 NEXT J
423 REM *** FOR ZX81, USE *** SCROLL
424 PRINT "__________"
425 NEXT I
426 CLS
427 LET X$="A(I,J)"
428 GO SUB MXINV
429 PRINT "DETERMINANT = ";U
430 FOR I=1 TO N
431 FOR J=1 TO N
432 PRINT "A**-1(";I;",";J;")= ";V(I,J)
433 LET M=J+(I-1)*N
434 IF INT (M/15)*15<>M THEN GO TO 438
435 PRINT "PRESS ""ENTER"" FOR MORE"
436 INPUT X$
437 CLS
438 NEXT J
439 PRINT "__________"
440 NEXT I
441 STOP
450 REM DEMO5.2
451 LET MXMUT=5100
452 LET N=3
453 LET M=5
454 LET L=2
455 DIM B(N,M)
456 DIM A(M,L)
457 FOR J=1 TO M
458 FOR I=1 TO N
459 LET B(I,J)=I*.2+J*.4
460 NEXT I
461 LET A(J,1)=J-1
462 LET A(J,2)=1
463 NEXT J
464 LET X$="B(I,J)*A(J,K)"
465 GO SUB MXMUT
466 FOR I=1 TO N
467 FOR J=1 TO L
468 PRINT U(I,J)
469 NEXT J
470 PRINT "__________"
471 NEXT I
472 STOP
480 REM DEMO5.3
481 LET MXMUT=5100
482 LET N=3
483 LET M=5
484 LET L=1
485 DIM B(N,M)
486 DIM X(M)
487 FOR J=1 TO M
488 FOR I=1 TO N
489 LET B(I,J)=I*.2+J*.4
490 NEXT I
491 LET X(J)=J*2
492 NEXT J
493 LET X$="B(I,J)*X(J)"
494 GO SUB MXMUT
495 FOR I=1 TO N
496 PRINT U(I,1)
497 NEXT I
498 STOP
500 REM DEMO5.4
501 LET MXMUT=5100
502 LET N=1
503 LET M=3
504 LET L=5
505 DIM B(M,L)
506 DIM X(M)
507 FOR I=1 TO M
508 FOR J=1 TO L
509 LET B(I,J)=I*.2+J*.4
510 NEXT J
511 LET X(I)=1
512 NEXT I
513 LET X$="X(J)*B(J,K)"
514 GO SUB MXMUT
515 FOR I=1 TO N
516 FOR J=1 TO L
517 PRINT U(I,J)
518 NEXT J
519 PRINT "__________"
520 NEXT I
521 STOP
530 REM DEMO6.4
531 LET REGRP=6100
532 LET MXINV=5000
533 LET MXMUT=5100
534 PRINT "INPUT NO. DATA PTS."
535 INPUT P
536 PRINT "INPUT NO. BASIS FUNCTIONS"
537 INPUT N
538 PRINT "INPUT NO. INDEPENDENT VARIABLES"
539 INPUT E
540 DIM F$(N,50)
541 DIM X(E,P)
542 DIM Y(P)
543 FOR I=1 TO N
544 PRINT "INPUT F";I;"(X(1,I),...,X(N,I))"
545 INPUT F$(I)
546 NEXT I
547 CLS
548 FOR I=1 TO P
549 FOR J=1 TO E
550 PRINT "INPUT X";J;"(";I;")"
551 INPUT X(J,I)
552 NEXT J
553 PRINT "__________"
554 PRINT "INPUT Y(";I;")"
555 INPUT Y(I)
556 CLS
557 NEXT I
558 GO SUB REGRP
559 PRINT "J: COEFF(J):";TAB 18;"F(J):"
560 FOR J=1 TO N
561 PRINT AT J,0;J;TAB 3;W(J);TAB 18;F$(J)
562 NEXT J
563 PRINT
564 PRINT "I: Y(I):";TAB 18;"POLY(I):"
565 FOR I=1 TO P
566 LET M=0
567 FOR J=1 TO N
568 LET M=M+VAL F$(J)*W(J)
569 NEXT J
570 PRINT I;TAB 3;Y(I);TAB 18;M
571 NEXT I
572 STOP
580 REM DEMO6.5
581 LET REGRP=6100
582 LET MXINV=5000
583 LET MXMUT=5100
584 LET POINT=2000
585 LET PLOTD=2400
586 LET VINAX=1000
587 LET SCALE=2300
588 GO SUB POINT
589 GO SUB PLOTD
590 LET P=N
591 LET N=2
592 DIM F$(N,4)
593 LET F$(1)="1"
594 LET F$(2)="X(I)"
595 GO SUB REGRP
596 PRINT "SLOPE = ";W(2)
597 PRINT "Y-INT = ";W(1)
598 FOR X=A TO B STEP (B-A)/100
599 LET Y=W(1)+W(2)*X
600 IF Y<C OR Y>D THEN GO TO 602
601 PLOT 240*(X-A)/(B-A),160*(Y-C)/(D-C): REM *** FOR ZX81, USE *** PLOT 60*(X-A)/(B-A),40*(Y-C)/(D-C)
602 NEXT X
603 STOP
610 REM DEMO6.6
611 LET REGRN=6200
612 LET MXINV=5000
613 LET MXMUT=5100
614 PRINT "INPUT NO. DATA PTS."
615 INPUT P
616 PRINT "INPUT NO. PARAMETERS"
617 INPUT N
618 PRINT "INPUT NO. INDEPENDENT VARIABLES"
619 INPUT E
620 DIM W(N)
621 DIM X(E,P)
622 DIM Y(P)
623 PRINT "INPUT F(X(1,I),...,X(E,I);W(1),...,W(N))"
624 INPUT F$
625 FOR I=1 TO P
626 CLS
627 FOR J=1 TO E
628 PRINT "INPUT X";J;"(";I;")"
629 INPUT X(J,I)
630 NEXT J
631 PRINT "__________"
632 PRINT "INPUT Y(";I;")"
633 INPUT Y(I)
634 NEXT I
635 GO SUB REGRN
636 STOP
640 REM DEMO6.7
641 LET REGRN=6200
642 LET MXINV=5000
643 LET MXMUT=5100
644 LET POINT=2000
645 LET PLOTD=2400
646 LET VINAX=1000
647 LET SCALE=2300
648 GO SUB POINT
649 LET P=N
650 LET N=2
651 DIM W(N)
652 LET F$="W(1)*EXP (W(2)*X(I))"
653 GO SUB REGRN
654 CLS
655 LET N=P
656 GO SUB PLOTD
657 FOR X=A TO B STEP (B-A)/100
658 LET Y=W(1)*EXP (W(2)*X)
659 IF Y<C OR Y>D THEN GO TO 661
660 PLOT 240*(X-A)/(B-A),160*(Y-C)/(D-C): REM *** FOR ZX81, USE *** PLOT 60*(X-A)/(B-A),40*(Y-C)/(D-C)
661 NEXT X
662 STOP
670 REM DEMO7.1
671 LET RKUTT=7000
672 PRINT "INPUT NO. EQUATIONS"
673 INPUT E
674 PRINT "INPUT LOWER, UPPER LIMITS"
675 INPUT A
676 INPUT B
677 PRINT "INPUT STEP-SIZE"
678 INPUT H
679 DIM F$(E,50)
680 DIM Y(E)
681 FOR J=1 TO E
682 PRINT "INPUT F";J;"(X,Y(1),...,Y(N))"
683 INPUT F$(J)
684 PRINT "INPUT Y(";J;") AT X=";A
685 INPUT Y(J)
686 CLS
687 NEXT J
688 GO SUB RKUTT
689 LET C=1E23
690 LET D=-C
691 FOR J=1 TO E
692 FOR I=1 TO N
693 LET K=V(J,I)
694 IF K<C THEN LET C=K
695 IF K>D THEN LET D=K
696 NEXT I
697 NEXT J
698 FOR J=1 TO E
699 FOR I=1 TO N
700 PLOT 240*(I-1)/(N-1),160*(V(J,I)-C)/(D-C): REM *** FOR ZX81, USE *** PLOT 60*(I-1)/(N-1),40*(V(J,I)-C)/(D-C)
701 NEXT I
702 PRINT J
703 NEXT J
704 PRINT AT 0,0;"FROM (";A;",";C;") TO (";B;",";D;")"
705 STOP
710 REM DEMO7.2
711 LET RKUTT=7000
712 LET VINAX=1000
713 LET SCALE=2200
714 LET PLOTD=2400
715 LET E=1
716 DIM F$(E,50)
717 DIM Y(E)
718 PRINT "INPUT INTEGRAND=F(X,Y(1))"
719 INPUT F$(1)
720 PRINT "INPUT LOWER, UPPER LIMITS"
721 INPUT A
722 INPUT B
723 PRINT "INPUT Y(1) AT X=";A
724 INPUT Y(1)
725 LET H=(B-A)/50
726 GO SUB RKUTT
727 DIM X(N)
728 DIM Y(N)
729 FOR I=1 TO N
730 LET X(I)=A+H*(I-1)
731 LET Y(I)=V(1,I)
732 NEXT I
733 GO SUB PLOTD
734 STOP
740 REM DEMO8.2
741 LET OPERA=8100
742 PRINT "INPUT PRECISION"
743 INPUT N
744 DIM Z(8*N+2,2)
745 PRINT "INPUT NUMBER"
746 INPUT X$
747 PRINT "INPUT OPERATION"
748 INPUT Y$
749 CLS
750 GO SUB OPERA
751 GO TO 745
1000 REM VINAX (VECTOR MIN,MAX)
1002 LET V=1E37
1004 LET U=-V
1006 FOR I=1 TO N
1008 LET M=VAL X$
1010 IF M<V THEN LET V=M
1012 IF M>U THEN LET U=M
1014 NEXT I
1016 RETURN
1100 REM VDOTP (VECTOR DOT-PRODUCT)
1102 LET V=0
1104 FOR I=1 TO N
1106 LET V=V+VAL X$
1108 NEXT I
1110 RETURN
2000 REM POINT.1 (DATA INPUT)
2002 PRINT "INPUT NO. PTS."
2004 INPUT N
2006 DIM X(N)
2008 DIM Y(N)
2010 FOR I=1 TO N
2012 IF INT (I/15)*15=I THEN CLS
2014 PRINT "X(";I;"),Y(";I;")= ? ";
2016 INPUT X(I)
2018 INPUT Y(I)
2020 PRINT "(";X(I);",";Y(I);")"
2022 NEXT I
2024 RETURN
2100 REM POINT.2 (SAMPLE FUNCTION)
2102 PRINT "INPUT NO. PTS."
2104 INPUT N
2106 DIM X(N)
2108 DIM Y(N)
2110 PRINT "INPUT Y EXPRESSION=Y(X)"
2112 INPUT Y$
2114 PRINT "INPUT XMIN,XMAX"
2116 INPUT A
2118 INPUT B
2120 FOR I=1 TO N
2122 LET X=(B-A)*(I-1)/(N-1)+A
2124 LET X(I)=X
2126 LET Y(I)=VAL Y$
2128 NEXT I
2130 RETURN
2200 REM SCALE.1 (PLOTTING WINDOW 1)
2202 GO SUB VINAX
2204 LET M=U-V+(V=U)
2206 LET P=M
2208 IF ABS V>P THEN LET P=ABS V
2210 IF ABS U>P THEN LET P=ABS U
2212 LET P=10^INT (LN P/LN 10)
2214 LET V=INT (V/P)*P
2216 LET M=INT (M/P)*P+V
2218 IF M>=U THEN GO TO 2224
2220 LET M=M+P
2222 GO TO 2218
2224 LET U=M*(ABS M>1E-6)
2226 LET V=V*(ABS V>1E-6)
2228 RETURN
2300 REM SCALE.2 (PLOTTING WINDOW 2)
2302 GO SUB VINAX
2304 IF U<>V THEN RETURN
2306 LET V=INT V
2308 LET U=V+1
2310 RETURN
2400 REM PLOTD (PLOT DATA PTS.)
2402 LET X$="X(I)"
2404 GO SUB SCALE
2406 LET A=V
2408 LET B=U
2410 LET X$="Y(I)"
2412 GO SUB SCALE
2414 LET C=V
2416 LET D=U
2418 CLS
2420 FOR I=1 TO N
2422 PLOT 240*(X(I)-A)/(B-A),160*(Y(I)-C)/(D-C): REM *** FOR ZX81, USE *** PLOT 60*(X(I)-A)/(B-A),40*(Y(U)-C)/(D-C)
2424 NEXT I
2426 PRINT AT 0,0;"FROM (";A;",";C;") TO (";B;",";D;")"
2428 RETURN
2500 REM PROGRAM PLOT2 (PLOT CURVES)
2502 PRINT "CART,CART.PARA.,POLAR,OR POLAR PARA.?"
2504 PRINT "INPUT 1,2,3,OR 4"
2506 INPUT Z
2508 PRINT "PLOTTING WINDOW?"
2510 PRINT "INPUT XMIN,XMAX,YMIN,YMAX"
2512 INPUT A
2514 INPUT B
2516 INPUT C
2518 INPUT D
2520 LET E=A
2522 LET F=B
2524 IF Z=1 THEN GO TO 2542
2526 PRINT "PARAMETER/THETA RANGE?"
2528 PRINT "INPUT TMIN,TMAX"
2530 INPUT E
2532 INPUT F
2534 IF Z=3 THEN GO TO 2542
2536 PRINT "X/THETA EXPRESSION?"
2538 PRINT "INPUT X(T) OR THETA (T)"
2540 INPUT X$
2542 PRINT "Y/R EXPRESSION?"
2544 PRINT "INPUT Y(X) OR Y(T) OR R(T)"
2546 INPUT Y$
2548 CLS
2550 FOR T=E TO F STEP (F-E)/200
2552 LET X=T
2554 IF Z=2 OR Z=4 THEN LET X=VAL X$
2556 LET Y=VAL Y$
2558 IF Z<3 THEN GO TO 2566
2560 LET M=X
2562 LET X=Y*COS M
2564 LET Y=Y*SIN M
2566 IF X<A THEN LET X=A
2568 IF X>B THEN LET X=B
2570 IF Y<C THEN LET Y=C
2572 IF Y>D THEN LET Y=D
2574 PLOT 255*(X-A)/(B-A),175*(Y-C)/(D-C): REM *** FOR ZX81, USE *** PLOT 63*(X-A)/(B-A),43*(Y-C)/(D-C)
2576 NEXT T
2578 STOP
2600 REM PROGRAM PLOT3 (PLOT CONTOURS)
2602 PRINT "Z EXPRESSION?"
2604 PRINT "INPUT Z(X,Y)"
2606 INPUT Z$
2608 PRINT "CONTOUR-SPACING-PARAMETER?"
2610 PRINT "INPUT ORDER OF Z(X,Y)"
2612 INPUT M
2614 PRINT "PLOTTING WINDOW?"
2616 PRINT "INPUT XMIN,XMAX,YMIN,YMAX"
2618 INPUT A
2620 INPUT B
2622 INPUT C
2624 INPUT D
2626 LET E=(B-A)/255: REM *** FOR ZX81, USE *** LET E=(B-A)/63
2628 LET F=(D-C)/175: REM *** FOR ZX81, USE *** LET F=(D-C)/43
2630 LET M=10^(2-M)/(255/2*E): REM *** FOR ZX81, USE *** LET M=10**(2-M)/(63/2*E)
2632 CLS
2634 FOR X=A TO B STEP E
2636 FOR Y=C TO D STEP F
2638 LET Z=INT (M*VAL Z$)
2640 IF INT (Z/2)*2=Z THEN PLOT (X-A)/E,(Y-C)/F
2642 NEXT Y
2644 NEXT X
2646 PRINT AT 0,0;Z$;" UNITS/CONTOUR= ";2/M
2648 PRINT "(";A;",";C;") TO (";B;",";D;")"
2650 STOP
3000 REM ERFCX (COMPLEMENTARY ERROR FUNCTION)
3002 DIM W(6)
3004 LET W(6)=1
3006 LET W(5)=.0705230784
3008 LET W(4)=.0422820123
3010 LET W(3)=.0092705272
3012 LET W(2)=.0001520243
3014 LET W(1)=.0002765672
3016 LET V=.0000430638
3018 FOR I=1 TO 6
3020 LET V=V*X+W(I)
3022 NEXT I
3024 LET V=V^-16
3026 RETURN
3100 REM GAMAX (GAMMA FUNCTION)
3102 DIM W(8)
3104 LET W(8)=1
3106 LET W(7)=-.577191652
3108 LET W(6)=.988205891
3110 LET W(5)=-.897056937
3112 LET W(4)=.918206857
3114 LET W(3)=-.756704078
3116 LET W(2)=.482199394
3118 LET W(1)=-.193527818
3120 LET V=.035868343
3122 LET M=INT X
3124 FOR I=1 TO 8
3126 LET V=V*(X-M)+W(I)
3128 NEXT I
3130 IF X<1 THEN GO TO 3140
3132 FOR I=1 TO M-1
3134 LET V=V*(X-I)
3136 NEXT I
3138 RETURN
3140 FOR I=0 TO ABS M
3142 LET V=V/(X+I)
3144 NEXT I
3146 RETURN
3200 REM BESEX (INTEGER ORDER BESSEL FUNCTION OF 1ST KIND)
3202 LET U=-X*X/4
3204 LET M=1
3206 FOR I=1 TO N
3208 LET M=M/I
3210 NEXT I
3212 LET V=M
3214 FOR I=1 TO 100
3216 LET M=M*U/(I*(I+N))
3218 IF ABS M<1E-9 THEN GO TO 3224
3220 LET V=V+M
3222 NEXT I
3224 LET V=V*(X/2)^N
3226 RETURN
4000 REM DERIV.1 (GENERAL ORDER DERIVATIVES OF SAMPLED FUNCTION)
4002 DIM D(G+1)
4004 FOR J=0 TO G
4006 LET D(J+1)=Y(J+I)
4008 NEXT J
4010 LET V=1
4012 FOR K=0 TO G-1
4014 LET V=V*(K+1)
4016 FOR J=1 TO G-K
4018 LET D(J)=(D(J+1)-D(J))/(X(I+J+K)-X(I+J-1))
4020 NEXT J
4022 NEXT K
4024 LET V=V*D(1)
4026 RETURN
4200 REM INTEG.1 (GENERAL SIMPSON/S INTEGRATION)
4202 LET Q=0
4204 LET R=0
4206 LET S=0
4208 LET T=0
4210 FOR I=1 TO N-2 STEP 2
4212 LET I1=X(I+1)-X(I)
4214 LET I2=X(I+2)-X(I)
4216 LET I3=I2-I1
4218 LET D1=(Y(I+1)-Y(I))/I1
4220 LET D2=(Y(I+2)-Y(I+1))/I3
4222 IF I>N-4 THEN GO TO 4236
4224 LET G=3
4226 GO SUB DERIV
4228 LET D3=V
4230 LET G=4
4232 GO SUB DERIV
4234 LET D4=V
4236 LET S=S+I2*(Y(I)+.5*D1*I2+(2*I3-I1)*(D2-D1)/6)
4238 LET T=T+(I1*Y(I)+I2*Y(I+1)+I3*Y(I+2))*.5
4240 LET R=R+D3*(I3-I1)*I2^3/72
4242 LET Q=Q+D4*I1^5/90
4244 NEXT I
4246 RETURN
4300 REM INTEG.2 (INTEGRATION; 10 PT. GAUSS)
4302 PRINT "INPUT INTEGRAND=F(X)"
4304 INPUT Y$
4306 PRINT "INPUT LOWER,UPPER LIMITS"
4308 INPUT A
4310 INPUT B
4312 GO SUB 4326
4314 PRINT " .': ";B
4316 PRINT " : "
4318 PRINT " : dX (";Y$;") = ";S
4320 PRINT " : "
4322 PRINT ":.' ";A
4324 STOP
4326 REM GAUSS
4328 DIM X(5)
4330 DIM W(5)
4332 LET X(1)=.1488743390
4334 LET X(2)=.4333953941
4336 LET X(3)=.6794095683
4338 LET X(4)=.8650633667
4340 LET X(5)=.9739065285
4342 LET W(1)=.2955242247
4344 LET W(2)=.2692667193
4346 LET W(3)=.2190863625
4348 LET W(4)=.1494513492
4350 LET W(5)=.0666713443
4352 LET S=0
4354 FOR I=1 TO 5
4356 LET X=(A+B+(A-B)*X(I))/2
4358 LET S=S+W(I)*VAL Y$
4360 LET X=A+B-X
4362 LET S=S+W(I)*VAL Y$
4364 NEXT I
4366 LET S=(B-A)*S/2
4368 RETURN
5000 REM MXINV (MATRIX INVERSE,DETERMINANT)
5002 DIM U(N,2*N)
5004 DIM V(N,N)
5006 FOR I=1 TO N
5008 FOR J=1 TO N
5010 LET U(I,J)=VAL X$
5012 LET U(I,J+N)=0
5014 NEXT J
5016 LET U(I,I+N)=1
5018 NEXT I
5020 LET U=1
5022 FOR I=1 TO N
5024 LET L=0
5026 FOR J=I TO N
5028 IF ABS (U(J,I))<=L THEN GO TO 5034
5030 LET L=U(J,I)
5032 LET K=J
5034 NEXT J
5036 LET U=U*L*(2*(K=I)-1)
5038 IF L<>0 THEN GO TO 5044
5040 PRINT "SINGULAR MATRIX"
5042 GO TO 5072
5044 FOR J=I TO 2*N
5046 LET M=U(I,J)
5048 LET U(I,J)=U(K,J)
5050 LET U(K,J)=M
5052 LET U(I,J)=U(I,J)/L
5054 NEXT J
5056 FOR J=1 TO N
5058 LET L=U(J,I)
5060 IF J=I OR L=0 THEN GO TO 5068
5062 FOR K=I TO 2*N
5064 LET U(J,K)=U(J,K)-L*U(I,K)
5066 NEXT K
5068 NEXT J
5070 NEXT I
5072 FOR I=1 TO N
5074 FOR J=1 TO N
5076 LET V(I,J)=U(I,J+N)
5078 NEXT J
5080 NEXT I
5082 RETURN
5100 REM MXMUT (MATRIX-MULTIPLICATION)
5102 DIM U(N,L)
5104 FOR I=1 TO N
5106 FOR K=1 TO L
5108 FOR J=1 TO M
5110 LET U(I,K)=U(I,K)+VAL X$
5112 NEXT J
5114 NEXT K
5116 NEXT I
5118 RETURN
6000 REM PROGRAM ROOTN (NEWTON ROOT-FINDER)
6002 LET MXINV=5000
6004 LET MXMUT=5100
6006 PRINT "INPUT NO.EQNS./VARS."
6008 INPUT N
6010 DIM F$(N,50)
6012 DIM X(N)
6014 DIM F(N)
6016 DIM D(N)
6018 DIM A(N,N)
6020 FOR J=1 TO N
6022 PRINT "INPUT F";J;"(X(1),...,X(N))"
6024 INPUT F$(J)
6026 PRINT "INPUT INITIAL X(";J;")"
6028 INPUT X(J)
6030 CLS
6032 NEXT J
6034 LET P=0
6036 PRINT "ITER. ";P,,,,
6038 PRINT "J: X(J):";TAB 18;"FJ:"
6040 FOR J=1 TO N
6042 LET F(J)=VAL F$(J)
6044 LET D(J)=(X(J)+(ABS X(J)<.001))*.001
6046 PRINT J;TAB 3;X(J);TAB 18;F(J)
6048 NEXT J
6050 PRINT "-----------"
6052 PRINT "CONTINUE?"
6054 INPUT X$
6056 IF X$="N" THEN STOP
6058 CLS
6060 FOR J=1 TO N
6062 FOR K=1 TO N
6064 LET M=X(K)
6066 LET X(K)=M+D(K)
6068 LET A(J,K)=(VAL F$(J)-F(J))/D(K)
6070 LET X(K)=M
6072 NEXT K
6074 NEXT J
6076 LET X$="A(I,J)"
6078 GO SUB MXINV
6080 LET M=N
6082 LET L=1
6084 LET X$="V(I,J)*F(J)"
6086 GO SUB MXMUT
6088 FOR J=1 TO N
6090 LET X(J)=X(J)-U(J,1)
6092 NEXT J
6094 LET P=P+1
6096 GO TO 6036
6100 REM REGRP (LLS REGRESSION)
6102 DIM Z(N,N)
6104 DIM W(N)
6106 DIM G(N)
6108 FOR I=1 TO P
6110 FOR J=1 TO N
6112 LET G(J)=VAL F$(J)
6114 NEXT J
6116 FOR J=1 TO N
6118 FOR K=J+1 TO N
6120 LET Z(J,K)=Z(J,K)+G(J)*G(K)
6122 LET Z(K,J)=Z(J,K)
6124 NEXT K
6126 LET Z(J,J)=Z(J,J)+G(J)*G(J)
6128 LET W(J)=W(J)+G(J)*Y(I)
6130 NEXT J
6132 NEXT I
6134 LET X$="Z(I,J)"
6136 GO SUB MXINV
6138 LET M=N
6140 LET L=1
6142 LET X$="V(I,J)*W(J)"
6144 GO SUB MXMUT
6146 FOR J=1 TO N
6148 LET W(J)=U(J,1)
6150 NEXT J
6152 RETURN
6200 REM REGRN (NLLS REGRESSION)
6202 DIM D(N)
6204 FOR J=1 TO N
6206 PRINT "INPUT INITIAL PAR(";J;")"
6208 INPUT W(J)
6210 NEXT J
6212 LET Q=-1
6214 LET Q=Q+1
6216 CLS
6218 PRINT "ITER. ";Q
6220 PRINT "J: PAR(J):"
6222 FOR J=1 TO N
6224 PRINT J;TAB 4;W(J)
6226 LET D(J)=(W(J)+(ABS W(J)<.001))*.001
6228 NEXT J
6230 PRINT "----------"
6232 PRINT "CONTINUE?"
6234 INPUT X$
6236 IF X$="N" THEN RETURN
6238 DIM Z(N,N)
6240 DIM B(N)
6242 DIM G(N)
6244 FOR I=1 TO P
6246 LET F=VAL F$
6248 FOR J=1 TO N
6250 LET M=W(J)
6252 LET W(J)=M+D(J)
6254 LET G(J)=(VAL F$-F)/D(J)
6256 LET W(J)=M
6258 NEXT J
6260 FOR J=1 TO N
6262 FOR K=J+1 TO N
6264 LET Z(J,K)=Z(J,K)=G(J)*G(K)
6266 LET Z(K,J)=Z(J,K)
6268 NEXT K
6270 LET Z(J,J)=Z(J,J)+G(J)*G(J)
6272 LET B(J)=B(J)+G(J)*(Y(I)-F)
6274 NEXT J
6276 NEXT I
6278 LET X$="Z(I,J)"
6280 GO SUB MXINV
6282 LET M=N
6284 LET L=1
6286 LET X$="V(I,J)*B(J)"
6288 GO SUB MXMUT
6290 FOR J=1 TO N
6292 LET W(J)=W(J)+U(J,1)
6294 NEXT J
6296 GO TO 6214
7000 REM RKUTT (4TH ORDER RUNGE-KUTTA)
7002 LET N=INT ((B-A)/H)+1
7004 DIM V(E,N)
7006 DIM K(E,4)
7008 FOR J=1 TO E
7010 LET V(J,1)=Y(J)
7012 NEXT J
7014 LET X=A
7016 FOR I=1 TO N-1
7018 LET K=1
7020 LET X$="V(J,I)"
7022 GO SUB 7048
7024 LET X=X+H/2
7026 LET X$="V(J,I)+K(J,K-1)/2"
7028 GO SUB 7048
7030 GO SUB 7048
7032 LET X=X+H/2
7034 LET X$="V(J,I)+K(J,3)"
7036 GO SUB 7048
7038 FOR J=1 TO E
7040 LET V(J,I+1)=V(J,I)+(K(J,1)+K(J,4))/6+(K(J,2)+K(J,3))/3
7042 NEXT J
7044 NEXT I
7046 RETURN
7048 FOR J=1 TO E
7050 LET Y(J)=VAL X$
7052 NEXT J
7054 FOR J=1 TO E
7056 LET K(J,K)=H*VAL F$(J)
7058 NEXT J
7060 LET K=K+1
7062 RETURN
8000 REM PROGRAM RATIO (RATIO-FINDER)
8002 PRINT "INPUT NUMBER ";
8004 INPUT E
8006 PRINT E
8008 LET A=1
8010 LET B=A
8012 LET C=A/B
8014 IF ABS (C-E)>1E-6 THEN GO TO 8024
8016 PRINT "----------"
8018 PRINT A;"/";B;" = ";C
8020 PRINT "----------"
8022 STOP
8024 IF C<E THEN LET A=A+1
8026 IF C>E THEN LET B=B+1
8028 GO TO 8012
8100 REM OPERA (MULT. PREC. OPERATIONS)
8102 LET A=8*N
8104 LET B=LEN X$
8106 LET C=A+1
8108 LET D=0
8110 LET E=0
8112 LET F=1
8114 DIM X(A+2)
8116 LET X(A+1)=1
8118 IF X$(1 TO 1)="-" THEN LET X(A+1)=-1
8120 FOR I=1 TO B
8122 LET A$=X$(I TO I)
8124 IF A$<>"." THEN GO TO 8130
8126 LET F=0
8128 GO TO 8152
8130 IF A$<>"E" THEN GO TO 8136
8132 LET E=E+VAL X$(I+1 TO B)
8134 GO TO 8154
8136 IF ABS (CODE A$-52)>5 THEN GO TO 8152: REM *** FOR ZX81, USE *** IF ABS (CODE A$-32)>5 THEN GO TO 8152
8138 LET G=VAL A$
8140 LET D=D+G
8142 IF D=0 THEN GO TO 8150
8144 LET C=C-1
8146 IF C<1 THEN GO TO 8152
8148 LET X(C)=G
8150 LET E=E-(NOT (D OR F))+(D>0 AND F)
8152 NEXT I
8154 LET X(A+2)=E
8156 LET H=2
8158 IF Y$=">" THEN LET H=1
8160 FOR I=1 TO A+2
8162 LET Z(I,H)=X(I)
8164 NEXT I
8166 IF Y$=">" THEN GO TO 8500
8168 IF Y$="+" OR Y$="-" THEN GO TO 8300
8170 IF Y$="*" THEN GO TO 8200
8200 REM MULTX
8202 DIM Y(2*A)
8204 FOR J=1 TO A
8206 FOR I=1 TO A
8208 LET C=I+J-1
8210 LET Y(C)=Y(C)+Z(I,1)*Z(J,2)
8212 NEXT I
8214 NEXT J
8216 LET C=0
8218 FOR I=1 TO 2*A
8220 LET Y(I)=Y(I)+C
8222 LET C=INT (Y(I)/10)
8224 LET Y(I)=Y(I)-C*10
8226 NEXT I
8228 FOR I=1 TO 2*A
8230 LET J=2*A+1-I
8232 IF Y(J)<>0 THEN GO TO 8236
8234 NEXT I
8236 FOR I=1 TO A
8238 LET D=0
8240 IF I<J+1 THEN LET D=Y(J+1-I)
8242 LET Z(A+1-I,1)=D
8244 NEXT I
8246 LET Z(A+1,1)=Z(A+1,1)*Z(A+1,2)
8248 LET Z(A+2,1)=Z(A+2,1)+Z(A+2,2)+J-2*A
8250 GO TO 8500
8300 REM ADSUB
8302 IF Y$="-" THEN LET Z(A+1,2)=-Z(A+1,2)
8304 LET F=Z(A+2,2)-Z(A+2,1)
8306 LET H=(F>=0)+2*(F<0)
8308 LET F=ABS F
8310 GO SUB 8360
8312 FOR H=1 TO 2
8314 LET F=1
8316 GO SUB 8360
8318 LET D=Z(A+1,H)
8320 LET Z(A+1,H)=0
8322 IF D=-1 THEN GO SUB 8400
8324 NEXT H
8326 LET C=0
8328 FOR I=1 TO A+1
8330 LET Z(I,1)=Z(I,1)+Z(I,2)+C
8332 LET C=INT (Z(I,1)/10)
8334 LET Z(I,1)=Z(I,1)-C*10
8336 NEXT I
8338 LET H=1
8340 LET E=Z(A+1,1)
8342 IF E=9 THEN GO SUB 8400
8344 FOR I=1 TO A
8346 LET J=A+1-I
8348 IF Z(J,1)<>0 THEN GO TO 8352
8350 NEXT I
8352 LET F=J-A
8354 GO SUB 8360
8356 LET Z(A+1,1)=(E=0)-(E=9)
8358 GO TO 8500
8360 REM SHIFT
8362 IF F=0 THEN RETURN
8364 DIM Y(3*A)
8366 FOR I=1 TO A
8368 LET Y(I+A)=Z(I,H)
8370 NEXT I
8372 FOR I=1 TO A
8374 LET D=0
8376 IF ABS F<=A THEN LET D=Y(I+A+F)
8378 LET Z(I,H)=D
8380 NEXT I
8382 LET Z(A+2,H)=Z(A+2,H)+F
8384 RETURN
8400 REM COMPT
8402 FOR I=1 TO A+1
8404 LET Z(I,H)=9-Z(I,H)
8406 NEXT I
8408 LET C=1
8410 FOR I=1 TO A+1
8412 LET Z(I,H)=Z(I,H)+C
8414 LET C=INT (Z(I,H)/10)
8416 IF C=0 THEN RETURN
8418 LET Z(I,H)=Z(I,H)-C*10
8420 NEXT I
8422 RETURN
8500 REM DISPX
8502 IF Z(A+1,1)=-1 THEN PRINT "-";
8504 PRINT ".";
8506 FOR I=1 TO A
8508 PRINT Z(A-I+1,1);
8510 NEXT I
8512 PRINT "E";Z(A+2,1)
8514 RETURN
8600 REM BASER (BASE-CONVERSION)
8602 PRINT "INPUT BASE (TO)"
8604 INPUT A
8606 PRINT "INPUT BASE (FROM)"
8608 INPUT B
8610 PRINT "INPUT NUMBER IN BASE ";B
8612 INPUT X$
8614 PRINT "....."
8616 PRINT X$;" BASE ";B
8618 LET M=LEN X$
8620 FOR K=1 TO M
8622 IF X$(K TO K)="." THEN GO TO 8626
8624 NEXT K
8626 LET N=K-1
8628 IF N=0 THEN GO TO 8640
8630 DIM B(N)
8632 FOR I=1 TO K-1
8634 LET B(K-I)=CODE X$(I TO I)-48: IF B(K-I)>9 THEN LET B(K-I)=B(K-I)-7: REM *** FOR ZX81, USE *** LET B(K-I)=CODE X$(I TO I)-28
8636 NEXT I
8638 GO SUB 8660
8640 PRINT ".";
8642 LET N=M-K
8644 IF N=0 THEN GO TO 8656
8646 DIM B(N)
8648 FOR I=K+1 TO M
8650 LET B(I-K)=CODE X$(I TO I)-48: IF B(I-K)>9 THEN LET B(I-K)=B(I-K)-7: REM *** FOR ZX81, USE *** LET B(I-K)=CODE X$(I TO I)-28
8652 NEXT I
8654 GO SUB 8700
8656 PRINT " BASE ";A
8658 STOP
8660 REM INTBA
8662 DIM A(100)
8664 LET J=0
8666 LET J=J+1
8668 LET S=0
8670 LET R=0
8672 FOR I=N TO 1 STEP -1
8674 LET V=B(I)+R*B
8676 LET B(I)=INT (V/A)
8678 LET R=V-A*B(I)
8680 LET S=S+B(I)
8682 NEXT I
8684 LET A(J)=R
8686 IF S<>0 THEN GO TO 8666
8688 FOR I=J TO 1 STEP -1
8690 LET R=A(I)+48+7*(A(I)>9): PRINT CHR$ R;: REM *** FOR ZX81, USE *** PRINT CHR$(A(I)+28);
8692 NEXT I
8694 RETURN
8700 REM FRABA
8702 DIM A(100)
8704 LET J=0
8706 LET J=J+1
8708 LET S=N*LN B/LN A
8710 LET R=0
8712 FOR I=N TO 1 STEP -1
8714 LET V=A*B(I)+R
8716 LET R=INT (V/B)
8718 LET B(I)=V-B*R
8720 NEXT I
8722 LET A(J)=R
8724 IF J<S THEN GO TO 8706
8726 FOR I=1 TO J
8728 LET R=A(I)+48+7*(A(I)>9): PRINT CHR$ R;: REM *** FOR ZX81, USE *** PRINT CHR$ (A(I)+28);
8730 NEXT I
8732 RETURN
8800 REM PROGRAM ZXCAL (ZX81 CALCULATOR)
8802 LET X$=" "
8804 REM *** FOR ZX81, USE *** SCROLL
8806 INPUT Y$
8808 LET N=ABS (CODE Y$-32)
8810 IF N>12 THEN LET X$=Y$+X$
8812 IF N<12 THEN LET X$=X$+Y$
8814 IF N<6 THEN LET X$=Y$
8816 LET X$=STR$ VAL X$
8818 PRINT X$
8820 GO TO 8804
9000 SAVE "DEMOS" LINE 1
9002 SAVE "DEMOS" LINE 1Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


