10 REM ASCII TETRIS FOR MICROBEE MICROWORLD BASIC
20 REM 20 BY 14 FIELD - FAST INCREMENTAL DRAWING
30 REM A=ROTATE Z=DOWN ,=LEFT .=RIGHT SPACE=DROP
40 DIM B(279),X(111),Y(111)
50 STRS(300)
60 GOSUB 8000
70 GOTO 100
100 CLS
110 PRINT
120 PRINT "             T E T R I S"
130 PRINT
140 PRINT "       MICROBEE MICROWORLD BASIC"
150 PRINT
160 PRINT "       A       ROTATE"
170 PRINT "       Z       MOVE DOWN"
180 PRINT "       , <     MOVE LEFT"
190 PRINT "       . >     MOVE RIGHT"
200 PRINT "       SPACE   HARD DROP"
210 PRINT "       ARROWS AND JOYSTICK"
220 PRINT
230 PRINT "       P=PAUSE       Q=QUIT"
240 PRINT
250 PRINT "       PRESS ANY KEY TO START";
260 A0$=KEY
270 IF A0$="" THEN GOTO 260
280 GOTO 1000
300 REM DRAW EMPTY FIELD AND STATUS
310 CLS
320 PRINT "+----------------------------------------+   SCORE";O
330 FOR R=1 TO 13
340 PRINT "|                                        |"
350 NEXT R
360 PRINT "+----------------------------------------+";
370 CURS 46,3:PRINT "LINES";P;
380 CURS 46,5:PRINT "LEVEL";Q;
390 CURS 46,7:PRINT "A ROTATE";
400 CURS 46,8:PRINT "Z DOWN";
410 CURS 46,9:PRINT ", LEFT";
420 CURS 46,10:PRINT ". RIGHT";
430 CURS 46,11:PRINT "SPACE DROP";
440 CURS 46,13:PRINT "P PAUSE";
450 CURS 46,14:PRINT "Q QUIT";
460 RETURN
500 REM READ KEYBOARD AND JOYSTICK
510 A0$=KEY
520 IF A0$="" THEN GOTO 650
530 IF A0$="Q" OR A0$="q" THEN GOTO 10000
540 IF A0$="P" OR A0$="p" THEN GOSUB 9000:RETURN
550 IF A0$="A" OR A0$="a" OR A0$=CHR$(5) OR A0$=CHR$(11) THEN GOSUB 2000:RETURN
560 IF A0$="Z" OR A0$="z" OR A0$=CHR$(24) OR A0$=CHR$(10) THEN GOSUB 2200:RETURN
570 IF A0$="<" OR A0$="," OR A0$=CHR$(60) OR A0$=CHR$(19) OR A0$=CHR$(8) THEN LET H=-1:GOSUB 2100:RETURN
580 IF A0$=">" OR A0$="." OR A0$=CHR$(62) OR A0$=CHR$(4) OR A0$=CHR$(9) THEN LET H=1:GOSUB 2100:RETURN
590 IF A0$=" " THEN GOSUB 2300:RETURN
600 RETURN
650 A=IN(0)
660 IF A<128 THEN LET A=A+128
662 IF A=255 THEN LET V=255:RETURN
664 IF A=V THEN RETURN
666 V=A
670 IF A=254 OR A=250 OR A=246 THEN GOSUB 2000:RETURN
680 IF A=253 OR A=249 OR A=245 THEN GOSUB 2200:RETURN
690 IF A=251 OR A=250 OR A=249 THEN LET H=-1:GOSUB 2100:RETURN
700 IF A=247 OR A=246 OR A=245 THEN LET H=1:GOSUB 2100:RETURN
710 RETURN
1000 REM NEW GAME
1010 FOR I=0 TO 279:B(I)=0:NEXT I
1020 O=0:P=0:Q=1:N=25:M=0:U=0:V=255
1030 OUT 1,255
1040 GOSUB 300
1050 GOSUB 1500
1060 REM MAIN FALL TIMER
1065 IF U=1 THEN GOTO 7000
1070 GOSUB 500
1080 M=M+1
1090 IF M<N THEN GOTO 1065
1100 M=0
1110 GOSUB 2200
1120 GOTO 1065
1500 REM NEW PIECE
1510 E=INT(RND*7)+1:F=0:C=9:D=1
1520 GOSUB 3000
1530 IF G=0 THEN GOTO 1540
1535 U=1:GOSUB 3100:RETURN
1540 GOSUB 3100
1550 RETURN
2000 REM ROTATE PIECE
2010 GOSUB 3200
2020 R=F:F=F+1
2030 IF F>3 THEN LET F=0
2040 GOSUB 3000
2050 IF G=0 THEN GOTO 2080
2060 F=R
2080 GOSUB 3100
2090 RETURN
2100 REM MOVE PIECE LEFT OR RIGHT
2110 GOSUB 3200
2120 C=C+H
2130 GOSUB 3000
2140 IF G=0 THEN GOTO 2170
2150 C=C-H
2170 GOSUB 3100
2180 RETURN
2200 REM MOVE PIECE DOWN OR LOCK IT
2210 GOSUB 3200
2220 D=D+1
2230 GOSUB 3000
2240 IF G=0 THEN GOTO 2280
2250 D=D-1
2260 GOSUB 3100
2270 GOSUB 3300:RETURN
2280 GOSUB 3100
2290 M=0:RETURN
2300 REM HARD DROP
2310 GOSUB 3200
2320 D=D+1
2330 GOSUB 3000
2340 IF G=0 THEN GOTO 2320
2350 D=D-1
2360 GOSUB 3100
2370 GOSUB 3300
2380 RETURN
3000 REM TEST CURRENT PIECE - G=1 MEANS COLLISION
3010 G=0:J=(E-1)*16+F*4
3020 FOR I=0 TO 3
3030 K=C+X(J+I):L=D+Y(J+I)
3040 IF K<1 OR K>20 OR L<1 OR L>14 THEN LET G=1:GOTO 3060
3050 IF B((L-1)*20+K-1)=1 THEN LET G=1
3060 NEXT I
3070 RETURN
3100 REM DRAW CURRENT PIECE
3110 J=(E-1)*16+F*4
3120 FOR I=0 TO 3
3130 K=C+X(J+I):L=D+Y(J+I)
3140 CURS K*2,L+1:PRINT "##";
3150 NEXT I
3160 RETURN
3200 REM ERASE CURRENT PIECE
3210 J=(E-1)*16+F*4
3220 FOR I=0 TO 3
3230 K=C+X(J+I):L=D+Y(J+I)
3240 CURS K*2,L+1:PRINT "  ";
3250 NEXT I
3260 RETURN
3300 REM LOCK PIECE INTO BOARD
3310 J=(E-1)*16+F*4
3320 FOR I=0 TO 3
3330 K=C+X(J+I):L=D+Y(J+I)
3340 B((L-1)*20+K-1)=1
3350 NEXT I
3360 O=O+4
3370 GOSUB 4000
3380 GOSUB 1500
3390 RETURN
4000 REM FIND AND REMOVE FULL LINES
4010 R=14
4020 IF R<1 THEN GOTO 4200
4030 T=0
4040 FOR C=1 TO 20
4050 T=T+B((R-1)*20+C-1)
4060 NEXT C
4070 IF T<20 THEN LET R=R-1:GOTO 4020
4075 PRINT CHR$(7);
4080 REM SHIFT ALL ROWS ABOVE DOWN
4090 FOR S=R TO 2 STEP -1
4100 FOR C=1 TO 20
4110 B((S-1)*20+C-1)=B((S-2)*20+C-1)
4120 NEXT C
4130 NEXT S
4140 FOR C=1 TO 20:B(C-1)=0:NEXT C
4150 P=P+1:O=O+100*Q
4160 IF P<10*Q THEN GOTO 4180
4170 Q=Q+1:N=N-2:IF N<5 THEN LET N=5
4180 GOSUB 4300
4190 GOTO 4020
4200 CURS 46,1:PRINT "SCORE";O;"      ";
4210 CURS 46,3:PRINT "LINES";P;"      ";
4220 CURS 46,5:PRINT "LEVEL";Q;"      ";
4230 RETURN
4300 REM REDRAW BOARD AFTER A LINE CLEAR
4310 FOR L=1 TO 14
4320 FOR K=1 TO 20
4330 CURS K*2,L+1
4340 IF B((L-1)*20+K-1)=1 THEN PRINT "##";:GOTO 4360
4350 PRINT "  ";
4360 NEXT K
4370 NEXT L
4380 RETURN
7000 REM GAME OVER
7010 CURS 46,7:PRINT "GAME OVER ";
7020 CURS 46,8:PRINT "SCORE";O;"   ";
7030 CURS 46,10:PRINT "PRESS A KEY";
7040 A0$=KEY
7050 IF A0$="" THEN GOTO 7040
7060 GOTO 100
8000 REM LOAD 7 PIECES X,Y - 4 ROTATIONS EACH
8010 FOR I=0 TO 111:READ X(I),Y(I):NEXT I
8020 RETURN
8100 REM I PIECE
8110 DATA 0,1,1,1,2,1,3,1,2,0,2,1,2,2,2,3
8120 DATA 0,2,1,2,2,2,3,2,1,0,1,1,1,2,1,3
8130 REM O PIECE
8140 DATA 1,0,2,0,1,1,2,1,1,0,2,0,1,1,2,1
8150 DATA 1,0,2,0,1,1,2,1,1,0,2,0,1,1,2,1
8160 REM T PIECE
8170 DATA 1,0,0,1,1,1,2,1,1,0,1,1,2,1,1,2
8180 DATA 0,1,1,1,2,1,1,2,1,0,0,1,1,1,1,2
8190 REM S PIECE
8200 DATA 1,0,2,0,0,1,1,1,1,0,1,1,2,1,2,2
8210 DATA 1,1,2,1,0,2,1,2,0,0,0,1,1,1,1,2
8220 REM Z PIECE
8230 DATA 0,0,1,0,1,1,2,1,2,0,1,1,2,1,1,2
8240 DATA 0,1,1,1,1,2,2,2,1,0,0,1,1,1,0,2
8250 REM J PIECE
8260 DATA 0,0,0,1,1,1,2,1,1,0,2,0,1,1,1,2
8270 DATA 0,1,1,1,2,1,2,2,1,0,1,1,0,2,1,2
8280 REM L PIECE
8290 DATA 2,0,0,1,1,1,2,1,1,0,1,1,1,2,2,2
8300 DATA 0,1,1,1,2,1,0,2,0,0,1,0,1,1,1,2
9000 REM PAUSE
9010 CURS 46,7:PRINT "PAUSED    ";
9020 CURS 46,8:PRINT "PRESS A KEY";
9030 A0$=KEY
9040 IF A0$="" THEN GOTO 9030
9050 CURS 46,7:PRINT "A ROTATE  ";
9060 CURS 46,8:PRINT "Z DOWN     ";
9070 RETURN
9500 REM WAIT FOR JOYSTICK RELEASE
9510 A=IN(0)
9520 IF A=255 OR A=127 THEN RETURN
9530 GOTO 9510
10000 CLS
10010 END
