10 REM TETRIS 20 PRINTRND(-TIME):REM Randomise 30 VDU26:CLS:VDU23;8202;0;0;0; 40 *FX4 1 50 MOVE 0,0:DRAW 0,1000:DRAW 1200,1000 60 DRAW 1200,0:DRAW 0,0 70 MOVE 8,8:DRAW 8,992:DRAW 1192,992:DRAW 1192,8:DRAW 8,8 80 MOVE 8,12:DRAW 1192,12 90 MOVE 8,16:DRAW 1192,16:MOVE 8,20:DRAW 1192,20 100 MOVE430,8 110 DRAW430,990 120 MOVE 438,8 130 DRAW 438,990 140 PRINTTAB(2,0);"{ }" 150 VDU23,150,255,128,191,160,225,1,1,1 160 VDU23,151,255,1,253,5,199,64,64,64 170 VDU23,152,1,1,1,1,1,7,4,7 180 VDU23,153,64,64,64,64,64,112,16,240 190 PRINTTAB(19,2)CHR$150;CHR$151;TAB(19,3)CHR$152;CHR$153;TAB(23,2)CHR$150;CHR$151;TAB(23,3)CHR$152;CHR$153 200 VDU23,150,63,32,57,9,9,9,9,9 210 VDU23,151,254,2,250,14,0,0,0,120 220 VDU23,152,9,9,9,9,9,57,32,63 230 VDU23,153,72,120,0,0,14,250,2,254 240 PRINTTAB(21,2)CHR$150;CHR$151;TAB(21,3)CHR$152;CHR$153 250 VDU23,150,63,32,59,10,10,10,11,8 260 VDU23,151,252,4,228,36,76,152,48,16 270 VDU23,152,9,9,9,9,9,57,32,63 280 VDU23,153,216,76,102,51,25,12,7,1 290 PRINTTAB(25,2)CHR$150;CHR$151;TAB(25,3)CHR$152;CHR$153 300 VDU23,150,63,32,57,9,9,9,9,9 310 VDU23,151,207,72,201,9,4,2,1,0 320 VDU23,152,9,9,9,9,137,249,0,255 330 VDU23,153,0,0,0,0,14,203,72,207 340 PRINTTAB(27,2)CHR$150;CHR$151;TAB(27,3)CHR$152;CHR$153 350 VDU23,150,254,2,250,14,128,64,32,144 360 VDU23,151,72,36,18,10,10,250,2,254 370 PRINTTAB(29,2)CHR$150;TAB(29,3)CHR$151 380 S%=0:L%=0:V%=1:F%=36 390 PRINTTAB(22,7)"SCORE" 400 MOVE 665,748 410 DRAW 900,748 420 DRAW 900,700 430 DRAW 665,700 440 DRAW 665,748 450 PRINTTAB(22,12)"LINES" 460 MOVE 665,588 470 DRAW 900,588 480 DRAW 900,540 490 DRAW 665,540 500 DRAW 665,588 510 PRINTTAB(22,17)"LEVEL" 520 MOVE 755,425:DRAW 840,425 530 DRAW 840,380:DRAW 755,380:DRAW 755,425 540 PRINTTAB(20,22)"NEXT SHAPE" 550 MOVE 670,270 560 DRAW 900,270 570 DRAW 900,120 580 DRAW 670,120 590 DRAW 670,270 600 PROCAssemble_Mcode 610 ?&CF1=RND(6+V%):REM Choose next shape type 620 ?&CE9=RND(4):REM RND Rotate Number 630 REPEAT 640 ?&CF0=?&CF1:REM Current shape=Next Shape 650 ?&CB5=RND(3):REM Choose colour 660 ?&CB6=251+RND(4):REM Choose Block Type 670 X%=0:Y%=?&CF0:CALL Download:REM X%=0 Means Current Shape, @ &0B00; Y%=Shape type 680 ?&CD2=0:FORI%=1TO?&CE9:CALLRotate:NEXT 690 ?&CF1=RND(6+V%):REM Choose next shape type 700 ?&CE9=RND(4) 710 X%=16:Y%=?&CF1:CALL Download:REM X%=16 Means Next Shape, @ &0B10; Y%=Shape type 720 PROCDisplay_Next_shape 730 H%=3:O%=1:REM Set X & Y 740 ?&CE8=0:REM Zero Contents Constant 750 IFNOTFNFit2 PROCDisplay_current_shape2:CLEAR:GOTO3130 760 PROCPlace_shape 770 PROCDisplay_current_shape 780 FORG%=1TO2 790 REPEAT 800 COLOUR3 810 PRINTTAB(21,9)STRING$(7-LENSTR$(S%),"0");S%; 820 PRINTTAB(21,14)STRING$(7-LENSTR$(L%),"0");L%; 830 PRINTTAB(24,19)STRING$(2-LENSTR$(V%),"0");V%; 840 TIME=0:B%=0 844 REM ADDED BY CJR 845 *FX 21 850 REPEAT 860 PROCKey_check 870 UNTILTIME>F% ORB% 880 IFFNFit(0,1) ?&78=0:CALLMove:REM 0=Down 890 PROCKey_check 900 UNTIL NOTFNFit(0,1) 910 IFB% G%=2 920 NEXT 930 S%=S%+30 940 E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 950 IF?FNScreen_array=1 ?FNScreen_array=2 960 E%=E%+1:NEXT, 970 FORJ%=O%TOO%+3 980 IFJ%>30 J%=O%+3:GOTO1030 990 D%=0:FORK%=1TO12 1000 IF?FNScreen_array=2 D%=D%+1 1010 NEXT 1020 IFD%>11 PROCDelete_line(J%) 1030 NEXT 1040 UNTIL0 1050 DEFPROCPlace_shape 1060 E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 1070 ?FNScreen_array=?(&B00+E%) 1080 E%=E%+1:NEXT, 1090 ENDPROC 1100 DEFFNScreen_array 1110 LOCAL X%,Y% 1120 X%=K%:Y%=J%:CALLGetValue 1130 =?&71*256+?&70 1140 DEFFNScreen_array2 1150 IF(K%<1 ORK%>12 ORJ%>30):=&CE8 ELSE:=&B4A+((J%-1)*12)+K% 1160 DEFPROCKey_check 1165 REM *FX21 ADDED BY CJR 1170 A$=INKEY$(0):*FX21 1180 IFA$="ˆ" ANDFNFit(-1,0) ?&78=1:CALLMove 1190 IFA$="‰" ANDFNFit(1,0) ?&78=2:CALLMove 1200 IFA$="X" ?&CF4=1:CALLDo_Rotate 1210 IFA$="Z" ?&CF4=3:CALLDo_Rotate 1220 IFA$=CHR$27 CLEAR:GOTO3130 1230 IFA$="Š" PROCDrop:B%=-1 1240 ENDPROC 1250 DEFFNFit2 1260 Z%=-1 1270 E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 1280 IF?(&B00+E%)=1 AND?FNScreen_array>0 Z%=0 1290 IF?(&B00+E%)=1 AND(J%>30 ORK%>12) Z%=0 1300 E%=E%+1:NEXT, 1310 =Z% 1320 DEFPROCMove(Q%) 1330 CALLBlank_Shape 1340 IFQ%>0 GOTO1400 1350 FORJ%=O%+3TOO% STEP-1:FORK%=H%TOH%+3 1360 IF?FNScreen_array=1 J%=J%+1:?FNScreen_array=1:J%=J%-1:?FNScreen_array=0 1370 NEXT, 1380 O%=O%+1 1390 GOTO1510 1400 IFQ%>1 GOTO1470 1410 FORK%=H%TOH%+3:FORJ%=O%TOO%+3 1420 IF?FNScreen_array=1 ANDK%-1<1 VDU7:PRINT"ERROR2!":END 1430 IF?FNScreen_array=1 K%=K%-1:?FNScreen_array=1:K%=K%+1:?FNScreen_array=0 1440 NEXT, 1450 H%=H%-1 1460 GOTO1510 1470 FORK%=H%+3TOH% STEP-1:FORJ%=O%TOO%+3 1480 IF?FNScreen_array=1 K%=K%+1:?FNScreen_array=1:K%=K%-1:?FNScreen_array=0 1490 NEXT, 1500 H%=H%+1 1510 PROCDisplay_current_shape 1520 ENDPROC 1530 DEFPROCDisplay_Next_shape 1540 COLOUR3:E%=0:FORN%=24TO27:FORM%=22TO25 1550 IF?(&B10+E%)=1 PRINTTAB(M%,N%)CHR$252 ELSEIF?(&B10+E%)=0 PRINTTAB(M%,N%)" " 1560 E%=E%+1 1570 NEXT, 1580 ENDPROC 1590 DEFPROCDisplay_current_shape2 1600 COLOUR?&CB5:E%=0:FORN%=O%TOO%+3:FORM%=H%TOH%+3 1610 IF?(&B00+E%)=1 PRINTTAB(M%,N%)CHR$?&CB6 1620 E%=E%+1 1630 NEXT, 1640 ENDPROC 1650 DEFPROCDisplay_current_shape 1660 CALLDisplay_Curr_Shape 1670 ENDPROC 1680 DEFPROCOrig_Display_current_shape 1690 COLOUR?&CB5:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 1700 IF?FNScreen_array=1 PRINTTAB(K%,J%)CHR$?&CB6 1710 NEXT, 1720 ENDPROC 1730 DEFFNFit(R%,T%) 1740 ?&76=R%:?&77=T% 1750 CALL Fit:=?&CE6=255 1760 DEFFNFit8(R%,T%) 1770 Z%=-1 1780 FORJ%=O%TOO%+3:FORK%=H%TOH%+3 1790 Y%=J%:X%=K%:IF?FNScreen_array=1 J%=J%+T%:K%=K%+R%:IF?FNScreen_array=2 Z%=0 1800 J%=Y%:K%=X% 1810 IF?FNScreen_array=1 AND((J%+T%)>30 OR(K%+R%)>12 OR(K%+R%)<1) Z%=0 1820 NEXT, 1830 =Z% 1840 DEFPROCDrop 1850 REPEAT 1860 IFFNFit(0,1) ?&78=0:CALLMove 1870 UNTILNOTFNFit(0,1) 1880 ENDPROC 1890 DEFPROCDelete_line(U%) 1900 LOCAL J%,K% 1910 COLOUR3:PRINTTAB(1,U%)STRING$(12,CHR$255) 1920 FORJ%=U%-1 TO1 STEP-1:FORK%=12TO1 STEP-1 1930 W%=FNScreen_array:?(W%+12)=?W% 1940 NEXT, 1950 IFU%<15 FORW%=1TO130*(15-(U%-1)):NEXT 1960 SOUND1,-15,46,4 1970 J%=1:FORK%=1TO12:?FNScreen_array=0:NEXT 1980 PRINTTAB(1,U%)STRING$(12," ") 1990 VDU28,1,U%,12,1 2000 PRINTTAB(0,0);CHR$8; 2010 VDU26 2020 L%=L%+1:IFL%MOD13=0 V%=V%+1:F%=F%-3:S%=S%+180:IF(V%+6)>?&7D V%=(?&7D-6) 2030 ENDPROC 2040 DEFPROCRotate(?&CF4) 2050 LOCALI% 2060 E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 2070 ?(&B00+E%)=?FNScreen_array 2080 IF?(&B00+E%)=1 PRINTTAB(K%,J%)" " 2090 E%=E%+1:NEXT, 2100 ?&CD2=0:FORI%=1TO?&CF4:CALLRotate:NEXT 2110 Z%=-1:E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 2120 IF?(&B00+E%)=1 AND(J%>30 OR(K%MOD256)>12OR(K%MOD256)<1) Z%=0:IFJ%>30 GOTO2170 2130 E%=E%+1:NEXT,:IFNOTZ% GOTO2170 2140 E%=0:FORJ%=O%TOO%+3:FORK%=H%TOH%+3 2150 ?FNScreen_array=?(&B00+E%) 2160 E%=E%+1:NEXT, 2170 PROCDisplay_current_shape 2180 ENDPROC 2190 DEFPROCAssemble_Mcode 2200 FORPASS%=0TO2STEP2 2210 P%=&900:[OPT PASS% 2220 .Rotate:LDX#15:.Loop1:STZ&CC0,X 2230 DEX:BPL Loop1:LDA&CD2:CLC:ADC#15 2240 STA&CD3:TAX:.Loop2 2250 LDA&B00,X:CMP#2:BEQ Store:.T1 2260 DEX:BPL Loop2 2270 BRA Cont:.Store:STA&CC0,X 2280 BRA T1:.Cont:LDA#3:STA&CD0 2290 LDX#0:.Next4:LDY&CD0:.NextPiece 2300 LDA&B00,X:CMP#1:BEQ Rotate_it 2310 BRA AdvanceX 2320 .Rotate_it:PHA:LDA&CC0,Y 2330 CMP#2:BEQSpecialExit:PLA:STA&CC0,Y 2340 .AdvanceX:INX:INY:INY:INY:INY 2350 CPX#16:BCS CopyBack:CPY#17:BCS DecCD0 2360 BRA NextPiece:.DecCD0:DEC &CD0:BPL Next4 2370 .CopyBack:LDY#15:LDX&CD3:.Loop5:LDA&CC0,Y 2380 STA&B00,X:DEX:DEY:BPLLoop5 2390 BRA Exit 2400 .SpecialExit:PLA:.Exit:RTS 2410 .Download:LDA#7:STA&CD8 2420 DEY:TYA:ASL A:TAY 2430 LDA&FA2,Y:.Loop6:ASL A:PHA 2440 BCC ST0:BCS ST1:.Cont1 2450 DEC&CD8:LDA&CD8:BMI Over1 2460 PLA:BRALoop6 2470 .Over1:PLA:LDA#15:STA&CD8:INY:LDA&FA2,Y 2480 .Loop7:ASL A:PHA 2490 BCC S0:BCS S1:.Cont2 2500 DEC&CD8:LDA&CD8:CMP#7:BEQ Over 2510 PLA:BRALoop7 2520 .Over:PLA:RTS 2530 .ST0:TXA:CLC:ADC&CD8:PHX:TAX 2540 STZ&B00,X:PLX:BRACont1 2550 .ST1:TXA:CLC:ADC&CD8:PHX:TAX 2560 LDA#1:STA&B00,X:PLX:BRACont1 2570 .S0:TXA:CLC:ADC&CD8:PHX:TAX 2580 STZ&B00,X:PLX:BRACont2 2590 .S1:TXA:CLC:ADC&CD8:PHX:TAX 2600 LDA#1:STA&B00,X:PLX:BRACont2 2610 .GetValue:CPX#1:BCC StoreZero:CPX#13:BCS StoreZero:CPY#31:BCS StoreZero 2620 LDA#&B:STA&71:LDA#&4A:STA&70:STZ&73:DEY:STY&72 2630 PHX:LDX#11:.CalcLoop:TYA:CLC 2640 ADC&72:STA&72:BCC NoOverflow:INC&73 2650 .NoOverflow:DEX:BNE CalcLoop 2660 PLX:TXA:CLC:ADC&72:STA&72:BCC NoOverflow2:INC&73 2670 .NoOverflow2:CLC:LDA&72:ADC&70:STA&70:LDA&73:ADC&71:STA&71 2680 RTS:.StoreZero:LDA#&C:STA&71:LDA#&E8:STA&70:RTS 2690 .Fit:LDA#255:STA&CE6 2700 LDY&43C:STZ&75:.Loop1F:LDX&420:STZ&74 2710 .Loop2F:PHY:PHX:JSR GetValue:LDA(&70):CMP#1:BEQ Testif2 2720 PLX:PLY:BRA Cont_F1 2730 .Testif2:PLA:STA&78:CLC:ADC&76:TAX:PLA:STA&79:CLC:ADC&77:TAY:PHY:PHX 2740 JSR GetValue:LDA(&70):CMP#2:BEQ NoGood2:PLX:PLY:CPY#31:BCS NoGood:CPX#13:BCS NoGood:CPX#1:BCC NoGood 2750 LDX&78:LDY&79 2760 .Cont_F1:INX:INC &74:LDA&74:CMP#4:BCC Loop2F 2770 INY:INC&75:LDA&75:CMP#4:BCC Loop1F 2780 RTS:.NoGood:STZ&CE6:RTS:.NoGood2:PLX:PLY:BRA NoGood 2790 .Display_Curr_Shape:LDA#17:JSR&FFEE:LDA&CB5:JSR&FFEE 2800 LDY&43C:STZ&77:.Loop1DCS:LDX&420:STZ&76 2810 .Loop2DCS:PHX:PHY:JSR GetValue:PLY:PLX:LDA(&70):CMP#1:BNE ContDCS 2820 LDA#31:JSR&FFEE:TXA:JSR&FFEE:TYA:JSR&FFEE:LDA&CB6:JSR&FFEE 2830 .ContDCS:INX:INC&76:LDA&76:CMP#4:BCC Loop2DCS 2840 INY:INC&77:LDA&77:CMP#4:BCC Loop1DCS:RTS 2850 .Blank_Shape 2860 LDA&CB6:PHA:LDA#32:STA&CB6:JSR Display_Curr_Shape:PLA:STA&CB6:RTS 2870 .Move:JSR Blank_Shape:LDA&78:BNE Cont1_Move:JMP Move0:.Cont1_Move:CMP#1:BNE Cont2_Move:JMP Move1:.Cont2_Move:CMP#2:BNE Err_Exit:JMP Move2:.Err_Exit:RTS 2880 ]:P%=&E00:[OPT PASS% 2890 .Move0:LDY&43C:INY:INY:INY:STZ&75:.Loop1M0:LDX&420:STZ&74:.Loop2M0 2900 PHY:PHX:JSR GetValue:PLX:PLY:LDA(&70):CMP#1:BNE Cont_M0 2910 INY:PHY:PHX:JSR GetValue:PLX:PLY:LDA#1:STA(&70):DEY:PHY:PHX:JSR GetValue:PLX:PLY:LDA#0:STA(&70) 2920 .Cont_M0:INX:INC&74:LDA&74:CMP#4:BCC Loop2M0 2930 DEY:INC&75:LDA&75:CMP#4:BCC Loop1M0:INC&43C:JMP Disp_Exit 2940 .Move1:LDX&420:STZ&74:.Loop1M1:LDY&43C:STZ&75:.Loop2M1 2950 PHY:PHX:JSR GetValue:PLX:PLY:LDA(&70):CMP#1:BNE Cont_M1 2960 DEX:PHY:PHX:JSR GetValue:PLX:PLY:LDA#1:STA(&70):INX:PHY:PHX:JSR GetValue:PLX:PLY:LDA#0:STA(&70) 2970 .Cont_M1:INY:INC&75:LDA&75:CMP#4:BCC Loop2M1 2980 INX:INC&74:LDA&74:CMP#4:BCC Loop1M1:DEC&420:BRA Disp_Exit 2990 .Move2:LDX&420:INX:INX:INX:STZ&74:.Loop1M2:LDY&43C:STZ&75:.Loop2M2 3000 PHY:PHX:JSR GetValue:PLX:PLY:LDA(&70):CMP#1:BNE Cont_M2 3010 INX:PHY:PHX:JSR GetValue:PLX:PLY:LDA#1:STA(&70):DEX:PHY:PHX:JSR GetValue:PLX:PLY:LDA#0:STA(&70) 3020 .Cont_M2:INY:INC&75:LDA&75:CMP#4:BCC Loop2M2 3030 DEX:INC&74:LDA&74:CMP#4:BCC Loop1M2:INC&420 3040 .Disp_Exit:JSR Display_Curr_Shape:RTS 3041 .Do_Rotate:STZ&78:LDY&43C:STZ&75:.Loop1Rot:LDX&420:STZ&74:.Loop2Rot:PHY:PHX:JSR GetValue:LDA(&70):LDY&78:STA&B00,Y:PLX:PLY:CMP#1:BNE Cont1Rot 3042 LDA#31:JSR&FFEE:TXA:JSR&FFEE:TYA:JSR&FFEE:LDA#32:JSR&FFEE:.Cont1Rot:INC&78:INX:INC&74:LDA&74:CMP#4:BCC Loop2Rot:INY:INC&75:LDA&75:CMP#4:BCC Loop1Rot 3043 STZ&CD2:LDX#0:.Loop3Rot:PHX:JSR Rotate:PLX:INX:CPX&CF4:BCC Loop3Rot 3044 STZ&78:LDY&43C:STZ&75:.Loop4Rot:LDX&420:STZ&74:.Loop5Rot:PHY:LDY&78:LDA&B00,Y:PLY:CMP#1:BNE Cont2Rot:CPY#31:BCC Cont3Rot:JMP Display_Shape_Exit:.Cont3Rot:CPX#13:BCC Cont4Rot:JMP Display_Shape_Exit:.Cont4Rot:CPX#1:BCS Cont2Rot 3045 JMP Display_Shape_Exit:.Cont2Rot:INC&78:INX:INC&74:LDA&74:CMP#4:BCC Loop5Rot:INY:INC&75:LDA&75:CMP#4:BCC Loop4Rot 3046 STZ&78:LDY&43C:STZ&75:.Loop6Rot:LDX&420:STZ&74:.Loop7Rot:PHY:PHX:JSR GetValue:LDY&78:LDA&B00,Y:STA(&70):PLX:PLY 3047 INC&78:INX:INC&74:LDA&74:CMP#4:BCC Loop7Rot:INY:INC&75:LDA&75:CMP#4:BCC Loop6Rot 3048 .Display_Shape_Exit:JSR Display_Curr_Shape:RTS 3050 ]:NEXT 3060 ENDPROC 3070 DEFPROCCreate_New_Tetfile 3080 TETFILE=OPENOUT("TETFILE") 3090 FORI%=1TO10:PRINT#TETFILE,"COMPUTER ",0,0 3100 NEXT 3110 CLOSE#TETFILE 3120 ENDPROC 3130 FORI%=220 TO 4 STEP-12:SOUND1,-15,I%,2:NEXT 3140 FORI%=4 TO 28:PRINTTAB(16,I%);SPC(15):NEXT 3150 PRINTTAB(16,5);"You Scored ";L%;" Lines" 3160 PRINTTAB(16,6);"and a Score of ";S% 3170 DIM N$(10),L(10),S(10) 3180 TETFILE=OPENIN("TETFILE") 3190 COLOUR3 3200 PRINTTAB(16,8)"TOP TEN SCORE TABLE" 3210 PRINTTAB(16,9)"___________________" 3220 PRINTTAB(16,12)"NAME LINES SCORE" 3230 PRINTTAB(16,13)"_____________________" 3240 FORI%=1 TO 10 3250 INPUT#TETFILE,N$(I%),L(I%),S(I%) 3260 PRINTTAB(16,13+I%)LEFT$(N$(I%),10);TAB(27,13+I%)STR$(L(I%));TAB(32,13+I%)STR$(S(I%)) 3270 NEXT 3280 CLOSE#TETFILE 3290 IFL%>L(10) OR(L%=L(10) AND S%>S(10)) PROCNew_Name 3300 PRINTTAB(16,28)"Another go? (Y/N) ";:REPEATA$=GET$:UNTILA$="Y"ORA$="y"ORA$="N"ORA$="n":PRINTA$;:IFA$="Y"ORA$="y" CHAIN"TITLE" ELSECLS:PRINT"END.":END 3310 END 3320 DEFPROCNew_Name 3330 *FX15,1 3340 PRINTTAB(16,25);"You're in the Top Ten" 3350 PRINTTAB(16,26);"Enter Name>"; 3360 C%=0:NAME$=" ":NAME$="" 3370 REPEAT 3380 REPEATA$=GET$:UNTILA$=CHR$13 OR (A$>CHR$31 AND A$0 C%=C%-1:NAME$=LEFT$(NAME$,C%):VDU127 3400 IFA$<>CHR$127 AND A$<>CHR$13 AND C%<10 C%=C%+1:NAME$=NAME$+A$:PRINTA$; 3410 UNTILA$=CHR$13 3420 I%=10 3430 REPEAT 3440 IF(L%>L(I%) OR (L%=L(I%) ANDS%>S(I%))) ANDI%>1 N$(I%)=N$(I%-1):L(I%)=L(I%-1):S(I%)=S(I%-1) 3450 I%=I%-1 3460 UNTIL I%=0 OR L%