Program slot 0 can be used for fast saving user program with command SAVE (no argument is needed) into internal Flash. Program slots 1..32 are located in external EEPROM. Character '\' in program listing means Shift before letter ("\A" means: press and hold Shift, press A, release Shift). Character '&' in program listing means 'pound' (Shift+space). --------------------------------------------------------- 1) Print charset program 45 bytes 10 REM PRINT CHARSET 20 FOR I=0 TO 255 30 PRINT CHR$(I); 40 NEXT I --------------------------------------------------------- 2) High precision division (ZX80 Operation Manual, page 63) program 192 bytes This program does a long division in exactly the same way as we would do it on paper. 10 REM HIGH PRECISION DIVISION 20 PRINT "HOW MANY DECIMAL PLACES?" 30 INPUT D 40 PRINT "DIVIDEND?" 50 INPUT R 60 PRINT "DIVISOR?" 70 INPUT Y 80 LET Z=R/Y 90 LET R=R-Z*Y 100 PRINT "QUOTIENT IS ";Z;"."; 110 FOR J=1 TO D 120 LET Z=10*R/Y 130 LET R=10*R-Z*Y 140 PRINT Z; 150 NEXT J Example: PLACES = 20 DIVIDEND = 12345 DIVISOR = 571 QUOTIENT = 21.61996497373029772329 --------------------------------------------------------- 3) Square root routine (ZX80 Operation Manual, page 48) program 200 bytes 10 REM SQUARE ROOT ROUTINE 20 PRINT "ENTER THE NUMBER TO BE ROOTED" 30 INPUT X 40 LET J=0 50 LET K=J*J 60 LET D=X-K 70 IF D=0 THEN GO TO 110 80 IF D<0 THEN GO TO 130 90 LET J=J+1 100 GO TO 50 110 PRINT "THE ROOT IS ";J 120 GO TO 140 130 PRINT "THE ROOT LIES BETWEEN ";J-1;" AND ";J 140 STOP Example 1: NUMBER = 17161 ROOT = 131 Example 2: NUMBER = 1234 ROOT LIES BETWEEN 35 AND 36 --------------------------------------------------------- 4) Die throwing (ZX80 Operation Manual, page 52) program 383 bytes Instead of 'o' you can use graphics character Shift+A. Hit NEWLINE to throw again or enter some character to break. 10 REM DIE THROWING 20 LET A$="\A \A" 30 LET B$=" \A" 40 LET C$="\A" 50 LET D$=" \A" 60 RANDOMISE 70 LET X=RND(6) 80 PRINT "YOUR THREW IS ";X 90 GO TO X*100 100 PRINT "" 110 PRINT "" 120 PRINT B$ 130 PRINT "" 140 PRINT "" 150 GO TO 700 200 PRINT C$ 210 PRINT "" 220 PRINT "" 230 PRINT "" 240 PRINT D$ 250 GO TO 700 300 PRINT D$ 310 PRINT "" 320 PRINT B$ 330 PRINT "" 340 PRINT C$ 350 GO TO 700 400 PRINT A$ 410 PRINT "" 420 PRINT "" 430 PRINT "" 440 PRINT A$ 450 GO TO 700 500 PRINT A$ 510 PRINT "" 520 PRINT B$ 530 PRINT "" 540 PRINT A$ 550 GO TO 700 600 PRINT A$ 610 PRINT "" 620 PRINT A$ 630 PRINT "" 640 PRINT A$ 700 PRINT "HIT NEWLINE TO THROW AGAIN" 710 INPUT X$ 720 CLS 730 IF X$="" THEN GO TO 70 --------------------------------------------------------- 5) Reaction timer (ZX80 Operation Manual, page 88) program 198 bytes 10 REM REACTION TIMER 20 PRINT "PREPARE..." 30 FOR I=1 TO 3000+RND(10000) 40 NEXT I 50 POKE 16414,0 60 POKE 16415,0 70 PRINT "HIT NEWLINE" 80 INPUT C$ 90 LET A=PEEK(16414) 100 LET B=PEEK(16415) 110 PRINT "YOUR REACTION TIME WAS ";(B*256+A-4)*17;" MILLISECS" --------------------------------------------------------- 6) Histogram of random number program 226 bytes 10 REM RND HISTOGRAM 20 DIM A(20) 30 RANDOMISE 40 FAST 50 PRINT "CALCULATING..." 60 FOR K=1 TO 5000 70 LET N=RND(20) 80 LET A(N)=A(N)+1 90 NEXT K 100 SLOW 110 CLS 120 FOR K=1 TO 20 130 LET A(K)=A(K)/20 140 IF K<10 THEN PRINT " "; 150 PRINT K;" "; 160 IF A(K)<1 THEN GO TO 210 170 IF A(K)>29 THEN LET A(K)=29 180 FOR P=1 TO A(K) 190 PRINT "\A"; 200 NEXT P 210 PRINT 220 NEXT K --------------------------------------------------------- 7) Leap frog (30 Programs for the Sinclair ZX80 1K, page 7) program 474 bytes This is a nice simple program, testing the player's logic. The object is to move all the frogs on the left to the right, and vice versa. Frogs can only leap over one frog or move to an adjacent empty space. X X X X O O O O 1 2 3 4 5 6 7 8 9 The first move could be 35, 45, 65 or 75. Variables: P position of frogs C number of moves to date F from T to 10 REM LEAP FROG 100 DIM P(9) 200 LET P(5)=0 210 FOR I=1 TO 4 220 LET P(I)=129 230 LET P(I+5)=128 240 NEXT I 250 LET C=0 300 CLS 310 FOR I=1 TO 9 320 PRINT CHR$(P(I));" "; 330 NEXT I 340 PRINT 350 FOR I=1 TO 9 360 PRINT I;" "; 370 NEXT I 500 PRINT "ENTER MOVE" 510 INPUT A 520 IF A=0 THEN GO TO 900 530 LET F=A/10 540 IF F=0 THEN GO TO 510 550 IF P(F)=0 THEN GO TO 510 560 LET T=A-10*F 570 IF T=0 THEN GO TO 510 580 IF P(T)>0 THEN GO TO 510 590 IF ABS(T-F)>2 THEN GO TO 510 600 LET C=C+1 610 LET P(T)=P(F) 620 LET P(F)=0 700 LET X=0 710 FOR I=1 TO 9 720 IF I=5 THEN GO TO 740 730 IF NOT P(I)=128-(I>5) THEN LET X=1 740 NEXT I 750 LET X=X+P(5) 760 IF X>0 THEN GO TO 300 800 PRINT "YOU DID IT IN ";C;" MOVES" 810 PRINT "ANOTHER GO? (Y)" 820 INPUT A$ 830 IF CODE(A$)=62 THEN GO TO 200 900 PRINT "BYEBYE" --------------------------------------------------------- 8) Encoding (30 Programs for the Sinclair ZX80 1K, page 10) program 355 bytes An absolutely unbeatable methos of producing secret messages! As the key to the coding is the ZX-80 random number generator, is would be impossible for anyone without a ZX-80 (and a lot of patience) to crack such a message. To decode, just enter the negative of the code number that produced the message. 10 REM ENCODING 100 PRINT "ENTER MESSAGE" 110 INPUT A$ 120 PRINT A$ 130 PRINT "ENTER CODE NUMBER (1 - 256)", 140 INPUT T 150 PRINT T 160 RANDOMISE ABS(T) 170 IF T<0 THEN PRINT "DE"; 180 PRINT "CODED MESSAGE IS" 190 LET R=RND(26) 200 IF T<0 THEN LET R=26-R 210 IF A$="" THEN GO TO 300 220 LET B=CODE(A$) 230 LET A$=TL$(A$) 240 IF B=0 THEN GO TO 280 250 LET B=B+R-38 260 LET B=B-26*(B/26) 270 LET B=B+38 280 PRINT CHR$(B); 290 GO TO 190 300 PRINT 310 PRINT "ANY OTHER MESSAGE? (Y)" 320 INPUT A$ 330 IF NOT CODE(A$)=62 THEN GO TO 360 340 CLS 350 GO TO 100 360 PRINT "BYEBYE" Example1: message: HELLO WORLD code number: 80 coded message: KLTGB XWRFQ decode number: -80 decoded message: HELLO WORLD Example2: encoded message: XJYF BZ TRDUBXA decode number: -100 decoded message: THIS IS AMAZING --------------------------------------------------------- 9) Horse Race (30 Programs for the Sinclair ZX80 1K, page 13) program 571 bytes You have $100 and you can bet on 4 horses A, B, C, D. 60 DIM O(4) 70 DIM D(4) 80 LET A$="\F\T\S" 90 LET B$=" \S\G\Q" 100 LET C$="\R \E" 110 LET M=100 120 GO TO 200 130 FOR C=1 TO D 140 PRINT " "; 150 NEXT C 160 RETURN 170 FOR I=0 TO 4 180 LET D(I)=0 190 NEXT I 200 PRINT "BANK$";M 210 PRINT "BET?" 220 PRINT 230 PRINT "ODDS" 240 FOR I=1 TO 4 250 LET O(I)=RND(9)+1 260 PRINT CHR$(I+37),O(I);"/1" 270 NEXT I 280 INPUT B 290 IF B=0 THEN GO TO 999 300 PRINT "HORSE?" 310 INPUT H$ 320 FOR L=1 TO 4 330 CLS 340 PRINT "LAP ";L 350 FOR I=1 TO 4 360 LET D(I)=D(I)+5+7/O(I)+RND(2*O(I)/3) 370 IF D(I)>D(0) THEN LET D(0)=D(I) 380 IF D(0)=D(I) THEN LET J=I 390 NEXT I 400 FOR I=1 TO 4 410 PRINT CHR$(I+37) 420 LET D=D(I)-D(0)+15 430 GO SUB 130 440 PRINT A$ 450 GO SUB 130 460 PRINT B$ 470 GO SUB 130 480 PRINT C$ 490 PRINT 500 NEXT I 510 PRINT "N/L" 520 INPUT D$ 530 NEXT L 540 CLS 550 PRINT "WINNER ";CHR$(J+37) 560 LET S=0 570 IF CODE(H$)=J+37 THEN LET S=1 580 LET M=M-B+S*B*O(J) 590 IF M<1 THEN GO TO 999 600 GO TO 170 999 STOP --------------------------------------------------------- 10) Lunar Lander (30 Programs for the Sinclair ZX80 1K, page 17) program 504 bytes, variables 65 bytes A real live Lunar Lander that comes down to (hopefully) land safely on the Moon. Program is saved with variables. If you load program using "LOAD 10", then just type "GO TO 100" and play. Do not use RUN nor CLEAR. If creating new program, write program at following steps: 90 DIM A(19) 100 LET V=-50 110 LET H=1500 120 LET R=7000 200 FOR I=0 TO 19 210 PRINT I, 220 INPUT X 230 LET A(I)=X 240 PRINT A(I) 250 NEXT I Run program with RUN and enter following values: 0, 0, 156, 0, 0, 0, 8, 3, 136, 0, 0, 2, 3, 130, 0, 134, 131, 3, 131, 135 Add following lines: 200 FOR I=0 TO 3 210 FOR X=0 TO 4 220 PRINT CHR$(A(X+5*I)); 230 NEXT X 240 PRINT 250 NEXT I Run program using GOTO 100 and check lunar lander shape. Add following lines, save program and run using GO TO 100: 130 GO TO 500 260 RETURN 300 PRINT "THRUST (0-99)?", 310 INPUT F 320 PRINT F 330 PRINT "DURATION (1-10)?", 340 INPUT T 350 CLS 360 IF F*T>R/10 THEN LET F=R/10*T 370 LET R=R-F*T*10 400 LET A=F-32 410 LET H=A*T**2+V*T+H 420 LET V=2*A*T+V 500 LET L=H/100 510 IF L<0 THEN LET L=0 520 IF L>12 THEN LET L=12 530 FOR I=L TO 12 540 PRINT 550 NEXT I 560 IF L>8 THEN GO SUB 200 570 PRINT ,"VELOC","HEIGHT","FUEL" 580 PRINT ,V,H,R 600 IF L<9 THEN GO SUB 200 610 IF L=0 THEN GO TO 650 620 FOR I=1 TO L-1 630 PRINT 640 NEXT I 650 IF H<0 THEN PRINT "**CRASH**" 660 FOR I=1 TO 16 670 PRINT "\A\T"; 680 NEXT I 690 IF L>0 THEN GO TO 300 700 IF H<0 OR V<-99 THEN GO TO 730 710 PRINT 100+V;" PERCENT OK" 720 STOP 730 PRINT "TERRIBLE" --------------------------------------------------------- 11) Mazes (30 Programs for the Sinclair ZX80 1K, page 21) program 330 bytes Maze generator. Not guarantee that a solution is available. 100 DIM W(32) 110 PRINT 140 LET W(1)=2 150 LET W(32)=130 160 FOR I=2 TO 31 170 LET W(I)=3 180 NEXT I 190 LET X=RND(20) 200 LET W(X)=2 210 LET W(X+6)=130 220 FOR I=2 TO 5 230 LET W(X+I)=0 240 NEXT I 300 FOR L=1 TO 15 310 FOR I=1 TO 32 320 PRINT CHR$(W(I)); 330 IF I=1 OR I=32 THEN GO TO 500 340 IF W(I)<3 THEN GO TO 450 350 IF W(I)>3 THEN GO TO 400 360 LET X=RND(8) 370 IF X<3 THEN LET W(I)=2 380 IF X=8 THEN LET W(I)=7 390 GO TO 500 400 LET W(I)=1+RND(2) 410 GO TO 500 450 LET X=RND(5) 460 LET W(I)=1+X/2 470 IF X=1 THEN LET W(I)=7 500 NEXT I 510 NEXT L --------------------------------------------------------- 12) Noughts and Crosses (30 Programs for the Sinclair ZX80 1K, page 24) program 596 bytes Tic Tac Toe game. Computer always starts first. 100 DIM A(9) 110 FOR J=0 TO 2 120 FOR I=1 TO 3 130 LET A(I+3*J)=28+I+4*J+2*I*(J>1) 140 NEXT I 150 NEXT J 160 LET A(4)=36 170 LET A(5)=61 180 LET A(6)=32 190 GO TO 400 200 FOR I=1 TO 9 210 IF A(I)=M+28 THEN LET A(I)=V 220 NEXT I 230 FOR I=0 TO 2 240 FOR J=1 TO 3 250 PRINT CHR$(A(J+3*I));" "; 260 NEXT J 270 PRINT 280 PRINT 290 NEXT I 300 PRINT 310 RETURN 400 LET A=0 410 LET E=0 420 PRINT "I WENT FIRST" 430 GO SUB 230 440 PRINT "ENTER MOVE" 450 INPUT R 460 CLS 470 IF R=2*(R/2) THEN LET E=-1 480 LET M=R 490 LET V=28 500 GO SUB 200 510 LET P=R 520 FOR T=1 TO 4 530 PRINT "I MOVED" 540 LET V=61 550 LET A=A+1 560 IF T=1 OR R=P+4 OR R=P-4 THEN GO TO 620 570 LET P=P+4 580 IF P>8 THEN LET P=P-8 590 LET M=P 600 GO SUB 200 610 GO TO 790 620 IF A=3 AND E THEN LET A=7 630 IF A=4 THEN LET A=6 640 LET P=P+A 650 IF P>8 THEN LET P=P-8 660 LET M=P 670 GO SUB 200 680 IF A=7 THEN GO TO 790 690 IF T=4 THEN GO TO 770 700 PRINT "YOUR MOVE" 710 INPUT R 720 CLS 730 LET M=R 740 LET V=28 750 GO SUB 200 760 NEXT T 770 PRINT "DRAW" 780 STOP 790 PRINT "ATX80 WINS" --------------------------------------------------------- 13) Dr. ATX80 (30 Programs for the Sinclair ZX80 1K, page 28) program 162 bytes, variables 402 bytes Dr. ATX80 is your psycho therapist. Program is saved with variables. If you load program using "LOAD 13", then just type "GO TO 120" and play. Do not use RUN nor CLEAR. If creating new program, write program at following steps: 100 LET A$="A ACCEPTABLE AGAIN BYEBYE COME DID DO ENOUGH FEEL FIND FOR FRIENDS HELLO HERE HOW I IS I/M LIKE NAME NORMAL REASONABLE SAY THAT/S THERAPIST THERE THINK THIS TO TODAY WAS WAY WHAT WHEN WHY WOULD YOU YOUR " 110 DIM P(90) 120 LET S=PEEK(16392)+256*PEEK(16393) 200 FOR I=0 TO 90 210 PRINT I, 220 INPUT B 230 LET P(I)=B 240 PRINT P(I) 250 IF B=0 THEN CLS 260 NEXT I Type RUN and enter following values: 68,141,88,199,131,175,85,199,97,0 ; index 0..9 175,32,195,120,199,97,167,14,0 ; index 10..18 79,36,195,46,161,0 ; index 19..24 36,195,147,153,85,109,0 ; index 25..31 185,36,195,147,195,46,153,171,0 ; index 32..40 36,199,60,51,153,3,0 ; index 41..47 36,195,27,74,158,51,60,0 ; index 48..55 36,195,147,153,85,102,0 ; index 56..62 36,199,60,51,153,3,0 ; index 63..69 83,147,124,39,56,161,180,189,195,92,158,27,74,14,0 ; index 70..84 124,109,20,0,0,0 ; index 85..90 Delete lines 100 and 110 and replace lines 200 onwards with following: 200 FOR I=0 TO 88 210 LET J=-1 220 LET J=J+1 230 IF P(I)=0 THEN GO TO 270 240 PRINT CHR$(PEEK(S+P(I)+J)); 250 IF PEEK(S+P(I)+J)>0 THEN GO TO 220 260 IF P(I)>0 THEN GO TO 300 270 PRINT "?" 280 INPUT B$ 290 CLS 300 NEXT I --------------------------------------------------------- 14) NIM game (30 Programs for the Sinclair ZX80 1K, page 32) program 708 bytes There are 3 rows of matches with count 7, 5 and 3. The object is to take matches away in turn, but any player can remove matches from only onerow at a time. From 1 to the number of matches in the row can be removed. The player to take the last match wins. 100 DIM T(3) 110 DIM N(3) 120 DIM X(3) 130 LET N(1)=7 140 LET N(2)=5 150 LET N(3)=3 160 GO TO 500 200 FOR R=1 TO 3 210 FOR M=1 TO N(R) 220 IF N(R)=0 THEN GO TO 250 230 PRINT " \A"; 240 NEXT M 250 PRINT 260 PRINT 270 NEXT R 280 RETURN 300 FOR S=0 TO 3 310 LET T(S)=0 320 NEXT S 330 FOR S=1 TO 3 340 LET T(1)=T(1)+(X(S) AND 4)/4 350 LET T(2)=T(2)+(X(S) AND 2)/2 360 LET T(3)=T(3)+(X(S) AND 1) 370 NEXT S 380 FOR S=1 TO 3 390 IF T(S)=2 THEN LET T(S)=0 400 LET T(0)=T(0)+T(S) 410 NEXT S 420 RETURN 500 GO SUB 200 510 PRINT "ENTER ROW AND HOW MANY" 520 INPUT Y 530 IF Y=0 THEN GO TO 900 540 IF Y<0 OR Y>33 THEN GO TO 520 550 LET M=Y/10 560 LET Y=Y-10*M 570 IF Y>N(M) THEN GO TO 520 580 LET N(M)=N(M)-Y 590 CLS 600 GO SUB 200 610 FOR R=1 TO 3 620 LET X(R)=N(R) 630 NEXT R 640 GO SUB 300 650 IF T(0)=0 THEN GO TO 670 660 PRINT "I BET I WILL WIN" 670 PRINT "PRESS N/L" 680 INPUT X$ 690 IF T(0)>0 THEN GO TO 750 700 FOR R=1 TO 3 710 LET M=N(R)-1 720 IF N(R)>0 THEN GO TO 820 730 NEXT R 740 GO TO 900 750 FOR R=1 TO 3 760 FOR M=0 TO N(R) 770 LET X(R)=M 780 GO SUB 300 790 IF T(0)=0 THEN GO TO 820 800 NEXT M 810 NEXT R 820 IF R>3 THEN GO TO 900 830 LET N(R)=M 840 IF N(1)+N(2)+N(3)=0 THEN GO TO 900 850 GO TO 500 900 PRINT "WHO WON?" --------------------------------------------------------- 15) Blackjack (30 Programs for the Sinclair ZX80 1K, page 36) program 757 bytes Program uses first row with REM as container for cards. It will be modified with shuffling. Save it before you run it. 100 REM 23456789TJQKA23456789TJQKA23456789TJQKA23456789TJQKA 110 DIM N(3) 120 LET S=16427 130 LET M=100 140 GO TO 310 150 LET X=PEEK(S+6*I+N(I))-28 160 LET N(I+2)=N(I+2)-10*(X>10)-X*(X<10)-11*(X=10) 170 LET A=A-(X=10) 180 RETURN 200 PRINT "YOURS",,"ATX80" 210 FOR K=0 TO 1 220 FOR L=6*K TO 6*K+N(K) 230 LET X=PEEK(S+L) 240 PRINT CHR$(X);" "; 250 NEXT L 260 PRINT ,, 270 NEXT K 300 RETURN 310 FOR I=0 TO 51 320 LET J=RND(52)-1 330 LET X=PEEK(S+J) 340 POKE S+J,PEEK(S+I) 350 POKE S+I,X 360 NEXT I 370 FOR I=0 TO 1 380 LET N(I)=0 390 LET N(I+2)=0 400 LET A=0 410 GO SUB 150 420 NEXT I 430 PRINT "BET:$";M 440 INPUT B 450 CLS 500 FOR I=0 TO 1 510 LET W=2*I-1 520 LET A=N(I+2)/10 530 GO SUB 200 540 IF I=0 THEN PRINT "H OR S?" 550 IF I=1 THEN PRINT "N/L" 560 LET I$="S" 570 INPUT I$ 580 CLS 590 IF CODE(I$)=56 THEN GO TO 700 600 LET N(I)=N(I)+1 610 GO SUB 150 620 IF N(I+2)<22 THEN GO TO 660 630 IF A=0 THEN GO TO 800 640 LET A=A-1 650 LET N(I+2)=N(I+2)-10 660 IF N(I)=4 THEN GO TO 700 670 IF I=0 OR N(I+2)<17 THEN GO TO 530 700 NEXT I 750 GO SUB 200 760 LET W=-1 770 IF (N(0)=4 AND N(1)<4) OR N(2)>N(3) THEN LET W=1 780 IF N(2)=21 AND N(0)=1 THEN LET W=2 800 LET M=M+W*B 810 IF M<1 THEN STOP 820 GO TO 310 --------------------------------------------------------- 16) Bubble sort (30 Programs for the Sinclair ZX80 1K, page 41) program 246 bytes 10 REM BUBBLE SORT 20 PRINT "COUNT?" 30 INPUT N 40 DIM P(N) 50 FOR I=1 TO N 60 CLS 70 PRINT "NUMBER(";I;")?" 80 INPUT P(I) 90 NEXT I 100 CLS 110 PRINT "SORTING..." 120 FAST 130 FOR J=1 TO N-1 140 LET K=J+1 150 FOR I=K TO N 160 LET L=N+K-I 170 IF P(L)>P(J) THEN GO TO 210 180 LET T=P(L) 190 LET P(L)=P(J) 200 LET P(J)=T 210 NEXT I 220 NEXT J 230 SLOW 240 CLS 250 FOR I=1 TO N 260 PRINT P(I);" "; 270 NEXT I --------------------------------------------------------- 17) Line renumber (30 Programs for the Sinclair ZX80 1K, page 43) program 231 bytes Routine renumbers whole program starting with line number 10, except routine itself. Remember that you cannot load this routine to an existing program, you must write new program in front of this routine. Routine does not touch parameters of GO TO and GO SUB, but it prints lines with these commands. Lines 5, 12 and 18 are there only for testing purposes, you can delete them. Start routine with command GO TO 9987. 5 REM LINE RENUMBER 12 GO TO 18 18 GO SUB 9987 9987 LET L=20 9988 POKE 16424,0 9989 POKE 16425,10 9990 FOR N=16426 TO 17400 9991 IF PEEK(N)=251 THEN PRINT L-10,CHR$(251) 9992 IF PEEK(N)=236 THEN PRINT L-10,CHR$(236) 9993 IF NOT PEEK(N)=118 THEN GO TO 9999 9994 IF PEEK(N+1)>38 THEN STOP 9995 POKE N+1,L/256 9996 POKE N+2,L AND 255 9997 LET N=N+2 9998 LET L=L+10 9999 NEXT N --------------------------------------------------------- 18) Draw a picture (30 Programs for the Sinclair ZX80 1K, page 45) program 378 bytes If you want to restore saved image, run "GO TO 200" after loading. Example: size pad = 5 5: 0, 0, 0, 0, 0, 4: 0, 0, 156, 0, 0, 3: 0, 8, 3, 136, 0, 2: 0, 2, 3, 130, 0, 1: 134, 131, 3, 131, 135 1: 2: 3: 4: 5: 100 PRINT 110 PRINT 120 PRINT "SIZE PAD (3-7)?" 130 INPUT N 140 IF N<3 OR N>7 THEN GO TO 120 150 DIM A(N*N-1) 200 CLS 210 FOR K=1 TO N 220 LET J=N+1-K 230 PRINT J, 240 FOR I=1 TO N 250 PRINT CHR$(A(J-N-1+N*I)); 260 NEXT I 270 PRINT 280 NEXT K 290 PRINT 300 PRINT , 310 FOR I=1 TO N 320 PRINT I; 330 NEXT I 340 PRINT 400 PRINT "ENTER COORD" 410 INPUT X 420 IF X=0 THEN GO TO 500 430 PRINT X 440 LET J=X/10 450 LET I=X-10*J 460 PRINT "ENTER CHAR CODE" 470 INPUT X 480 LET A(J-N-1+N*I)=X 490 GO TO 200 500 PRINT "CODES USED:" 510 FOR K=1 TO N 520 LET J=N+1-K 530 PRINT "LINE:";J, 540 FOR I=1 TO N 550 PRINT A(J-N-1+N*I);" "; 560 NEXT I 570 PRINT 580 NEXT K --------------------------------------------------------- 19) Day of the week (30 Programs for the Sinclair ZX80 1K, page 56) program 580 bytes 100 PRINT "I CALCULATE DAY YOU WERE BORN" 110 LET D$=" SUNMONTUEWEDTHUFRISAT" 120 PRINT "PLEASE ENTER YOUR NAME" 130 INPUT A$ 140 PRINT "HELLO ";A$ 150 PRINT "ENTER DATE OF BIRTH:" 155 PRINT "DAY", 160 INPUT D 170 IF D<1 OR D>31 THEN GO TO 160 180 PRINT D 185 PRINT "MONTH", 190 INPUT M 200 PRINT M 205 PRINT "YEAR", 210 INPUT Y 220 PRINT Y 230 IF Y<1700 THEN PRINT A$," IS TOO OLD FOR ME" 240 IF Y<1700 THEN GO TO 440 250 LET K=0 260 IF M=1 OR M=2 THEN LET K=1 270 LET L=Y-K 280 LET O=M+12*K 290 LET P=L/100 300 LET Z=(13*(O+1))/5+(5*L)/4-P+P/4+D-1 310 LET Z=Z-7*(Z/7)+1 320 FOR I=1 TO Z*3 330 LET D$=TL$(D$) 340 NEXT I 400 PRINT A$;" WAS BORN ON ";CHR$(CODE(D$)); 410 LET D$=TL$(D$) 420 PRINT CHR$(CODE(D$));CHR$(CODE(TL$(D$))) 430 PRINT 440 PRINT "ANYONE ELSE? (Y)" 450 INPUT A$ 455 CLS 460 IF CODE(A$)=62 THEN GO TO 110 470 PRINT "ATX80 SAYS BYEBYE" --------------------------------------------------------- 20) Chinese remainder (30 Programs for the Sinclair ZX80 1K, page 59) program 354 bytes Think of a number, divide by 5, tell me remainder, divide the original number by 7, tell me remainder, divide your original number by 9 and tell me the remainder - I'll tell you what number you thought of. 10 REM CHINESE REMAINDER 100 DIM R(3) 110 PRINT "THINK OF A NUMBER BETWEEN 1 AND 316" 120 PRINT "PRESS N/L WHEN READY" 130 INPUT A$ 200 LET A=3 210 FOR I=1 TO 3 220 LET A=A+2 230 PRINT "NOW DIVIDE YOUR ORIGINAL NUMBER BY ";A 240 PRINT "PLEASE ENTER REMAINDER" 250 INPUT R(I) 260 PRINT R(I) 270 NEXT I 300 LET A=126*R(1)+225*R(2)+280*R(3) 310 LET A=A-315*(A/315) 320 PRINT "YOUR NUMBER WAS ";A 330 PRINT "ANOTHER? (Y)" 340 INPUT A$ 350 CLS 360 IF CODE(A$)=62 THEN GO TO 100 370 PRINT "BYEBYE" Example: think number: 231 divide 5, remainder: 1 divide 7, remainder: 0 divide 9, remainder: 6 result number: 231 --------------------------------------------------------- 21) Simple Simon (30 Programs for the Sinclair ZX80 1K, page 61) program 431 bytes The computer generates a random sequence of letters that you have to remember and copy. Program uses huge graphics with ROM fonts. 10 REM SIMPLE SIMON 100 DIM A(30) 110 LET J=-1 120 RANDOMISE 130 DIM P(7) 140 FOR I=0 TO 7 150 LET P(I)=2**(7-I) 160 NEXT I 200 LET X=RND(26)+37 210 CLS 220 PRINT "NEXT CHAR IS" 230 FOR L=0 TO 7 240 LET V=PEEK(3584+L+8*X) 250 FOR K=0 TO 7 260 LET G=(V AND P(K))>0 270 PRINT CHR$(-128*G); 280 NEXT K 290 PRINT 300 NEXT L 400 IF X=15 THEN GO TO 700 410 LET J=J+1 420 IF J=31 THEN GO TO 800 430 LET A(J)=X 440 PRINT "PRINT ENTIRE SEQUENCE" 450 INPUT A$ 460 PRINT A$ 470 FOR I=0 TO J 480 LET X=CODE(A$) 490 IF NOT A(I)=X THEN GO TO 600 500 LET A$=TL$(A$) 510 NEXT I 520 GO TO 200 600 LET X=15 610 GO TO 230 700 PRINT "SORRY IT WAS:" 710 FOR I=0 TO J 720 PRINT CHR$(A(I)); 730 NEXT I 740 STOP 800 PRINT "I GIVE UP" --------------------------------------------------------- 22) Hangman (30 Programs for the Sinclair ZX80 1K, page 64) program 739 bytes One person thinks of a secret word and the other has to guess the letters that make up the word. After 10 wrong letter guesses, person is hung. Do not renumber lines 10 to 200. They are called by index from line 230. 5 GO TO 300 10 PRINT "\A\A\A"; 20 RETURN 30 PRINT "\A\A\A" 40 RETURN 50 PRINT " \Q" 60 RETURN 70 PRINT " \Q" 80 RETURN 90 PRINT " ";CHR$(135);CHR$(135);"\Q" 100 RETURN 110 PRINT " ";CHR$(134); 120 RETURN 130 PRINT CHR$(134);"\E" 140 RETURN 150 PRINT " ";CHR$(130);CHR$(128) 160 RETURN 170 PRINT " ";CHR$(132); 180 RETURN 190 PRINT CHR$(130);"\D" 200 RETURN 210 FOR L=1 TO G 220 IF G=0 THEN GO TO 250 230 GO SUB 20*L-10 240 NEXT L 250 PRINT 260 PRINT 270 IF G=10 THEN GO TO 290 280 GO TO 500 290 PRINT "TOO BAD" 300 PRINT "ENTER NEW WORD" 310 INPUT X$ 320 LET W=1 330 LET A$=X$ 340 FOR L=1 TO 20 350 LET A$=TL$(A$) 360 IF A$="" THEN GO TO 390 370 LET W=W+1 380 NEXT L 390 DIM A(W) 400 FOR L=1 TO W 410 LET A(L)=0 420 NEXT L 430 PRINT "LETTERS=";W 440 LET G=0 500 PRINT "INPUT GUESS" 510 INPUT A$ 520 CLS 530 IF A$="" THEN GO TO 999 540 LET B=CODE(A$) 550 LET A$=X$ 560 LET C=0 570 FOR L=1 TO W 580 IF B=CODE(A$) THEN LET A(L)=B 590 IF A(L)=B THEN LET C=1 600 LET A$=TL$(A$) 610 NEXT L 620 IF C=0 THEN LET G=G+1 630 LET N=W 640 FOR L=1 TO W 650 IF A(L)=0 THEN PRINT "-"; 660 IF A(L)=0 THEN GO TO 690 670 LET N=N-1 680 PRINT CHR$(A(L)); 690 NEXT L 700 PRINT 710 PRINT 720 IF NOT N=0 THEN GO TO 210 730 PRINT "BRILLIANT" 740 GO TO 300 999 PRINT "THANKS FOR THE GAME" --------------------------------------------------------- 23) Maths drill (30 Programs for the Sinclair ZX80 1K, page 68) program 458 bytes This program is designed to learn younger children to add or subtract 2 numbers between 1 and 49. Program uses huge graphics with ROM fonts. 100 RANDOMISE 110 DIM C(3) 120 DIM P(7) 130 FOR J=0 TO 7 140 LET P(J)=2**(7-J) 150 NEXT J 160 GO TO 400 200 IF S=-1 THEN LET C(1)=18 210 LET C(2)=X/10 220 LET C(3)=X-10*C(2)+28 230 IF C(2)>0 THEN LET C(2)=C(2)+28 240 FOR L=0 TO 6 250 FOR I=1 TO 3 260 LET V=PEEK(3584+L+8*C(I)) 270 FOR J=0 TO 7 280 LET G=(V AND P(J))>0 290 PRINT CHR$(-128*G); 300 NEXT J 310 NEXT I 320 PRINT 330 NEXT L 340 PRINT 350 RETURN 400 LET K=0 410 LET C(1)=0 420 LET S=1 430 LET A=RND(49) 440 LET X=A 450 GO SUB 200 460 LET C(1)=19 470 LET S=2*RND(2)-3 480 LET B=RND(49) 490 LET X=B 500 GO SUB 200 600 INPUT C 610 IF C=A+S*B THEN GO TO 700 620 LET K=K+1 630 IF K>2 THEN GO TO 660 640 PRINT "TRY AGAIN" 650 GO TO 600 660 PRINT "ANSWER WAS ";A+S*B 670 STOP 700 PRINT "THAT/S RIGHT" --------------------------------------------------------- 24) Capitals of the World (30 Programs for the Sinclair ZX80 1K, page 71) program 676 bytes Another learning program - world capitals. 100 DIM Q(10) 110 LET C=0 120 LET Q=0 130 PRINT "THIS IS A TEST OF CAPITALS" 140 PRINT "WHAT IS THE CAPITAL OF" 150 LET X=RND(10) 160 LET A=10 170 IF Q(X)<0 THEN GO TO 150 180 LET Q(X)=-1 190 GO SUB 500+20*X 200 FOR I=1 TO 30 210 LET X=CODE(A$) 220 PRINT CHR$(X); 230 LET A$=TL$(A$) 240 IF X=15 THEN GO TO 300 250 NEXT I 300 INPUT B$ 310 IF NOT A$=B$ THEN GO TO 400 320 LET C=C+A 330 LET Q=Q+1 340 IF Q=10 THEN GO TO 490 350 IF A=0 THEN GO TO 140 360 CLS 370 GO TO 140 400 PRINT " TRY AGAIN" 410 INPUT B$ 420 LET A=5 430 IF B$=A$ THEN GO TO 320 440 PRINT "IT IS ";A$ 450 LET A=0 460 GO TO 320 490 CLS 500 PRINT "YOU GOT ";C;" PERCENT RIGHT" 510 STOP 520 LET A$="CZECHIA?PRAGUE" 530 RETURN 540 LET A$="TURKEY?ISTANBUL" 550 RETURN 560 LET A$="USA?WASHINGTON" 570 RETURN 580 LET A$="HOLLAND?AMSTERDAM" 590 RETURN 600 LET A$="AUSTRALIA?CANBERRA" 610 RETURN 620 LET A$="JAPAN?TOKYO" 630 RETURN 640 LET A$="INDIA?NEW DEHLI" 650 RETURN 660 LET A$="POLAND?WARSAW" 670 RETURN 680 LET A$="SWEDEN?STOCKHOLM" 690 RETURN 700 LET A$="PORTUGAL?LISBON" 710 RETURN --------------------------------------------------------- 25) Life (30 Programs for the Sinclair ZX80 1K, page 76) program 427 bytes New cell is born if has 3 neighbours. Cell dies if has more than 3 or less than 2 neighbours. 100 DIM A(63) 110 FOR I=1 TO 63 120 LET A(I)=128*(RND(2)-1) 130 NEXT I 200 FOR L=0 TO 8 210 FOR J=1 TO 7 220 LET I=J+7*L 230 PRINT CHR$(A(I)); 240 NEXT J 250 PRINT 260 NEXT L 270 PRINT "PRESS N/L" 280 INPUT A$ 285 IF NOT A$="" THEN STOP 290 CLS 300 FOR I=9 TO 55 310 LET X=0 320 IF ((I+1) AND 7)=0 THEN GO TO 350 330 LET X=(A(I+1)>127) 340 IF ((I-1) AND 7)=0 THEN GO TO 360 350 LET X=X+(A(I-1)>127) 360 FOR J=7 TO 9 370 FOR R=-1 TO 1 380 IF R=0 THEN GO TO 420 390 LET K=I+R*J 400 IF (K AND 7)=0 THEN GO TO 420 410 LET X=X+(A(K)>127) 420 NEXT R 430 NEXT J 440 LET A(I)=A(I)-X 450 NEXT I 460 FOR I=9 TO 55 470 IF A(I)=3 OR A(I)=130 OR A(I)=131 THEN GO TO 500 480 LET A(I)=0 490 GO TO 510 500 LET A(I)=128 510 NEXT I 520 GO TO 200 --------------------------------------------------------- 26) Prime numbers (30 Programs for the Sinclair ZX80 1K, page 78) program 134 bytes Program generates prime number from 2 to 300. 100 DIM A(75) 110 LET R=1 120 LET A(1)=2 130 FOR X=3 TO 300 140 FOR Y=1 TO R 150 IF X/A(R)>A(R) THEN GO TO 180 160 IF X=(X/A(Y))*A(Y) THEN GO TO 210 170 NEXT Y 180 LET R=R+1 190 LET A(R)=X 200 PRINT X, 210 LET X=X+1 220 NEXT X --------------------------------------------------------- 27) Simultaneous equations (30 Programs for the Sinclair ZX80 1K, page 81) program 466 bytes Program solves simultaneous linear equations ax + by + c = 0, dx + ey + f = 0 . Example: x + 2*y - 6 = 0 x - y - 3 = 0 result: x = 4, y = 1 2*x + 3*y - 7 = 0 3*x + 2*y - 3 = 0 result: x = -1, y = 3 100 DIM X(6) 110 DIM A(2) 120 PRINT "SOLUTIONS TO 2 EQUATIONS:" 130 PRINT "A*X + B*Y + C = 0" 140 PRINT 150 PRINT "ENTER DATA" 160 FOR I=1 TO 6 170 PRINT CHR$(37+I-((I-1)/3)*3), 180 INPUT X(I) 190 PRINT X(I) 200 NEXT I 300 LET D=X(1)*X(5)-X(2)*X(4) 310 IF D=0 THEN GO TO 900 320 LET A(1)=X(3)*X(5)-X(2)*X(6) 330 LET A(2)=-X(3)*X(4)+X(1)*X(6) 340 PRINT 350 PRINT "SOLUTIONS ARE" 360 LET D=-D 370 LET S=D/ABS(D) 400 FOR I=1 TO 2 410 LET B=ABS(D) 420 LET A=ABS(A(I)) 500 LET Q=A/B 510 LET R=A-Q*B 520 LET A=B 530 LET B=R 540 IF R>0 THEN GO TO 500 550 LET GCD=A 600 PRINT S*A(I)/GCD; 610 IF NOT D/GCD=S THEN PRINT "/";ABS(D/GCD) 620 PRINT , 630 NEXT I 640 STOP 900 PRINT "- DEGENERATE: NO SOLUTIONS" --------------------------------------------------------- 28) Square root to 3 decimal places (30 Programs for the Sinclair ZX80 1K, page 83) program 548 bytes Example: number 13 result 3.606 100 PRINT "INPUT NUMBER" 110 INPUT A 120 CLS 130 PRINT "SQUARE ROOT OF ";A;" IS" 140 LET U=174 150 LET L=0 160 LET FRAC=0 170 LET DELTA=0 200 LET NEW=(U+L)/2 210 IF (NEW-1)**2A THEN GO TO 250 220 IF NEW**2>A THEN LET U=NEW 230 IF NEW**2A THEN LET NEW=NEW-1 300 LET ERROR=100*(A-NEW**2) 310 IF ERROR<2 THEN GO TO 470 320 LET FRAC=(ERROR/NEW)/2 330 LET FSQ=FRAC**2 340 LET ERROR=ERROR-2*NEW*FRAC 350 IF ERROR>0 THEN GO TO 390 360 LET FRAC=FRAC-1 370 LET ERROR=100*(A-NEW**2) 380 GO TO 330 390 LET ERROR=10*ERROR-FSQ/10 400 IF ERROR<0 THEN GO TO 360 410 LET DELTA=(ERROR/NEW)/2 420 LET EDASH=ERROR-(2*FRAC*DELTA)/2 430 IF EDASH>0 THEN GO TO 460 440 LET DELTA=DELTA-1 450 GO TO 420 460 LET DELTA=(EDASH/NEW)/2 470 PRINT NEW;".";FRAC;DELTA --------------------------------------------------------- 29) Pontoon (30 Programs for the Sinclair ZX80 1K, page 90) program 512 bytes 2-player version of BLACKJACK with nicer graphics (unplayable semi-finished program). 100 DIM N(2) 110 DIM V(9) 120 RANDOMISE 130 FOR I=1 TO 2 140 LET N(I)=1 150 LET V(5*I-5)=RND(13) 160 NEXT I 170 LET I=1 200 LET P=I 210 FOR L=1 TO 7 220 FOR C=1 TO N(P) 230 LET J=C-6+5*P 240 IF L=1 OR L=7 THEN GO TO 420 250 IF L=4 THEN GO TO 270 260 GO TO 440 270 PRINT " \A "; 280 IF V(J)<2 OR V(J)>10 THEN GO TO 330 290 PRINT V(J); 300 IF V(J)<10 THEN PRINT " "; 310 PRINT "\A"; 320 GO TO 450 330 LET A$=" AJQK" 340 LET M=V(J) 350 IF M>10 THEN LET M=M-9 360 FOR K=1 TO M-1 370 LET A$=TL$(A$) 380 NEXT K 390 PRINT CHR$(CODE(A$)); 400 PRINT " \A"; 410 GO TO 450 420 PRINT " \A\A\A\A\A"; 430 GO TO 450 440 PRINT " \A \A"; 450 NEXT C 460 PRINT 470 NEXT L 480 PRINT 490 PRINT 600 PRINT "PLAYER";I;":HIT OR STAY?" 610 INPUT A$ 620 CLS 630 IF CODE(A$)=56 THEN GO TO 670 640 LET N(I)=N(I)+1 650 LET V(N(I)-6+5*I)=RND(13) 660 GO TO 200 670 IF I=2 THEN STOP 680 LET I=I+1 690 GO TO 200 --------------------------------------------------------- 30) Chomp (30 Programs for the Sinclair ZX80 1K, page 92) program 436 bytes Game for 2 or more players. Object of the game is to take 'bite' out of a grid, starting from right bottom corner 17. Last bite 71 (left top corner) is poisoned. 100 DIM A(48) 110 FOR I=0 TO 48 120 LET A(I)=6 130 NEXT I 140 LET A(0)=53 150 PRINT "HOW MANY PLAYERS?" 160 INPUT N 170 LET T=0 200 LET T=T+1 210 FOR L=0 TO 6 220 LET J=7-L 230 PRINT J, 240 FOR C=0 TO 6 250 PRINT CHR$(A(C+7*L)); 260 NEXT C 270 PRINT 280 NEXT L 290 PRINT , 300 FOR C=1 TO 7 310 PRINT C; 320 NEXT C 330 PRINT 340 PRINT "PLAYER:";T 410 PRINT "INPUT COORD" 420 INPUT A 430 IF A=0 THEN GO TO 999 440 LET J=A/10 450 LET C=A-10*J-1 460 LET L=7-J 470 LET P=C+7*L 480 IF P<0 OR P>48 THEN GO TO 420 490 IF A(P)>0 THEN GO TO 600 500 PRINT "EMPTY SPACE" 510 GO TO 410 600 IF P=0 THEN GO TO 700 610 FOR J=L TO 6 620 FOR I=C TO 6 630 LET A(I+7*J)=0 640 NEXT I 650 NEXT J 660 CLS 670 IF T=N THEN LET T=0 680 GO TO 200 700 PRINT "PLAYER";T;":YOU LOST" --------------------------------------------------------- 31) Mastermind (30 Programs for the Sinclair ZX80 1K, page 96) program 445 bytes Guess digits of 3 to 7-digit number. 100 PRINT "WELCOME TO MASTERMIND" 110 PRINT "ENTER NUMBER OF DIGITS (3-7)" 120 INPUT N 130 LET N=N-1 140 DIM A(N) 200 FOR I=0 TO N 210 LET X=RND(10)-1 220 FOR J=0 TO I 230 IF X=A(J) THEN GO TO 210 240 NEXT J 250 LET A(I)=X 260 NEXT I 270 LET G=0 280 GO TO 530 300 INPUT B$ 310 IF B$="" THEN STOP 320 CLS 330 PRINT B$ 340 LET R=0 350 LET C=0 360 LET G=G+1 370 FOR I=0 TO N 380 LET X=CODE(B$)-28 390 IF X=A(I) THEN LET C=C+1 400 FOR J=0 TO N 410 IF X=A(J) THEN LET R=R+1 420 NEXT J 430 LET B$=TL$(B$) 440 NEXT I 450 IF C=N+1 THEN GO TO 600 500 PRINT "NUMBERS RIGHT=";R 510 PRINT "CORRECT POSITIONS=";C 520 PRINT 530 PRINT "ENTER ";N+1;"-DIGIT GUESS" 540 GO TO 300 600 PRINT "YOU DID IT IN ";G;" GUESSES" --------------------------------------------------------- 32) Pinch (30 Programs for the Sinclair ZX80 1K, page 100) program 589 bytes Object of the game is capture oponent by surounding his stones on both sides (or one side on edge). 100 DIM G(9) 110 PRINT "ENTER PLAYER 1 NAME" 120 INPUT Y$ 130 PRINT "PLAYER 2 NAME?" 140 INPUT Z$ 150 LET A$=Y$ 160 LET B=2 170 GO TO 600 200 LET C=G(I) 210 IF C=0 THEN RETURN 220 FOR S=-1 TO 1 230 IF S=0 THEN GO TO 330 240 FOR J=1 TO 6 250 LET K=I+S*J 260 IF K=9 OR K=0 THEN GO TO 300 270 IF G(K)=0 OR G(K)=C THEN GO TO 290 280 NEXT J 290 IF J=1 OR G(K)=0 THEN GO TO 330 300 FOR K=1 TO J-1 310 LET G(I+S*K)=0 320 NEXT K 330 NEXT S 340 CLS 350 PRINT 360 PRINT "PINCH" 370 PRINT 380 PRINT 390 FOR J=1 TO 8 400 PRINT " ";CHR$(27+G(J)); 410 NEXT J 420 PRINT 430 PRINT " "; 440 FOR J=1 TO 8 450 PRINT "\A\T\A"; 460 NEXT J 470 PRINT 480 PRINT 490 FOR J=1 TO 8 500 PRINT " ";J; 510 NEXT J 520 RETURN 600 GO SUB 340 610 PRINT 620 PRINT A$;":ENTER MOVE" 630 INPUT I$ 640 LET I=CODE(I$)-28 650 IF I=0 THEN GO TO 999 660 IF I>0 AND I<9 THEN GO TO 680 670 GO TO 630 680 IF NOT G(I)=0 THEN GO TO 630 690 LET G(I)=B 700 GO SUB 200 710 LET I=I+1 720 IF I=9 THEN LET I=7 730 GO SUB 200 740 LET B=B+1 750 IF B=3 THEN LET B=1 760 IF B=2 THEN LET A$=Y$ 770 IF B=1 THEN LET A$=Z$ 780 GO TO 610