10 REM RUBIK'S CUBE SIMULATION PROGRAM 20 REM COPYRIGHT (c) 1981 HAWKEYE GRAFIX 30 REM 40 REM HAWKEYE GRAFIX 50 REM 23914 MOBILE 60 REM CANOGA PARK, CA. 91307 70 REM 80 VA=PEEK(&105)+256*PEEK(&106):POKE VA+&7FF,12 90 BS=PEEK(&103)+256*PEEK(&104):POKE BS+9,255 100 CS$=CHR$(27)+CHR$(75) 110 FAST 120 FILL 32 130 DIM P(53),C(54),CL(53),S(53),C$(5,2),R(5,25),L(100),CM$(17),MV$(11) 140 FOR I=0 TO 39:READ P(I):READ C(I):NEXT I 150 FOR I=0 TO 19 160 DRAW P(I),C(I),P(I+20),C(I+20),1 170 DRAW 77+P(I),64-C(I),77+P(I+20),64-C(I+20),1 180 NEXT I 190 DRAW P(9),C(9),P(12),C(12),1 200 DRAW 77+P(9),64-C(9),77+P(12),64-C(12),1 210 VPRINT 370,"R":VPRINT 390,"B":VPRINT 412,"U" 220 VPRINT 1691,"L":VPRINT 1713,"F":VPRINT 1732,"D" 230 FOR I=0 TO 53:READ P(I):C(I)=I:NEXT I 240 FOR I=0 TO 53:READ CL(I):NEXT I 250 FOR J=0 TO 2:FOR I=0 TO 5:READ C$(I,J):NEXT I,J 260 C$(5,0)=CHR$(127)+CHR$(127)+CHR$(127) 270 FOR I=0 TO 5:FOR J=0 TO 25:READ R(I,J):NEXT J,I 280 FOR I=0 TO 17:READ CM$(I):NEXT I 290 FOR I=0 TO 11:READ MV$(I):NEXT I 300 MO=1:MP=0:L(MP)=-1:ST=1 310 PRINT CS$:PRINT " RUBIK'S CUBE SIMULATION":PRINT 320 PRINT " ' - Next Rotation is counterclockwise" 330 PRINT " U - Rotate upside surface" 340 PRINT " D - Rotate downside surface" 350 PRINT " L - Rotate leftside surface" 360 PRINT " R - Rotate rightside surface" 370 PRINT " F - Rotate frontside surface" 380 PRINT " B - Rotate backside surface" 390 PRINT " S - Save current configuration" 400 PRINT " C - Compare current and saved configurations" 410 PRINT " M - Reset move list" 420 PRINT " E - Erase last move from list and restore cube" 430 PRINT " N - New cube" 440 PRINT " Q - Quit" 450 PRINT " P - Print move list and effect on cube" 460 PRINT " 0 - Set symbolic display mode" 470 PRINT " 1 - Set color code display mode" 480 PRINT " 2 - Set side identification display mode" 490 PRINT " 3 - Set numeric display mode" 500 GOTO 1060 510 GOSUB 10000 520 VPRINT 1910,"Ready" 530 I$=CHR$(CINP(3)) 540 VPRINT 1910," " 550 FOR I=0 TO 17:IF CM$(I)=I$ THEN 560 ELSE NEXT I:GOTO 520 560 ON I GOTO 1000,1010,1020,1030,1040,1050,1060,1070,2000,3000,4000,5000,6000,7000,7000,7000,7000 570 ST=-1:GOTO 510 1000 RK=4:GOTO 8000 1010 RK=5:GOTO 8000 1020 RK=1:GOTO 8000 1030 RK=0:GOTO 8000 1040 RK=2:GOTO 8000 1050 RK=3:GOTO 8000 1060 FOR I=0 TO 53:S(I)=C(I):NEXT I:ST=1:GOTO 510 1070 FOR I=0 TO 53:IF C(I)<>S(I) THEN VPRINT P(I)," " 1080 NEXT I 1090 VPRINT 1910,"Ready":IF CINP(0)=1 THEN 510 1100 FOR I=0 TO 53 1110 IF C(I)=S(I) THEN 1150 1120 IF MO<2 THEN VPRINT P(I),C$(CL(C(I)),MO) 1130 IF MO=3 THEN VPRINT P(I),LEFT$(STR$(I)+" ",3) 1140 IF MO=4 THEN VPRINT P(I)," " 1150 NEXT I 1160 IF CINP(0)=1 THEN 510 ELSE 1070 2000 MP=0:GOTO 8030 3000 IF MP=0 THEN 510 3010 MP=MP-1:RK=L(MP):ST=-1 3020 IF RK>5 THEN RK=RK-6:ST=1 3030 GOSUB 9000:GOTO 8030 4000 FOR I=0 TO 53:C(I)=I:NEXT I:GOTO 2000 5000 POKE BS+9,0:END 6000 VPRINT 0,SPC(200) 6010 VINPUT 0,"Enter Series Identification: ";, LINE H$ 6020 VPRINT 0,SPC(200):LPRINT CHR$(12) 6030 HL=LEN(H$):LPRINT 6040 LPRINT SPC((80-LEN("RUBIK'S CUBE"))/2);"RUBIK'S CUBE" 6050 LPRINT :LPRINT SPC((80-HL)/2);H$:LPRINT 6060 LPRINT "+----------+" 6070 LPRINT "! 0 1 2 !" 6080 LPRINT "! 3 4 5 !" 6090 LPRINT "! 6 7 8 !" 6100 LPRINT "+----------+----------+----------+----------+" 6110 LPRINT "! 9 10 11 ! 12 13 14 ! 15 16 17 ! 18 19 20 !" 6120 LPRINT "! 21 22 23 ! 24 25 26 ! 27 28 29 ! 30 31 32 !" 6130 LPRINT "! 33 34 35 ! 36 37 38 ! 39 40 41 ! 42 43 44 !" 6140 LPRINT "+----------+----------+----------+----------+" 6150 LPRINT "! 45 46 47 !" 6160 LPRINT "! 48 48 50 !" 6170 LPRINT "! 51 52 53 !" 6180 LPRINT "+----------+" 6190 LPRINT 6200 FOR I=0 TO 100:IF L(I)=-1 THEN 6220 ELSE LPRINT MV$(L(I));" "; 6210 NEXT I 6220 LPRINT :LPRINT :LPRINT "SURFACES MOVED:":LPRINT 6230 FOR I=0 TO 53:IF C(I)<>S(I) THEN LPRINT C(I);" TO ";I,; 6240 NEXT I 6250 LPRINT :LPRINT :GOTO 510 7000 MO=VAL(I$):GOTO 510 8000 GOSUB 9000 8010 IF ST=-1 THEN RK=RK+6 8020 L(MP)=RK:MP=MP+1 8030 L(MP)=-1:ST=1 8040 VPRINT 0,SPC(200) 8050 FOR I=0 TO 100:IF L(I)=-1 THEN 510 ELSE VPRINT I*3,MV$(L(I)) 8060 NEXT I 8070 GOTO 510 9000 I1=0:I2=24:IF ST=-1 THEN I1=25:I2=1 9010 FOR I=I1 TO I2 STEP ST:C(R(RK,I))=C(R(RK,I+ST)):NEXT I 9020 RETURN 10000 IF MO=3 THEN 10020 ELSE IF MO=4 THEN 10030 10010 FOR I=0 TO 53:VPRINT P(I),C$(CL(C(I)),MO):NEXT I:RETURN 10020 FOR I=0 TO 53:VPRINT P(I),LEFT$(STR$(I)+" ",3):NEXT I:RETURN 10030 FOR I=0 TO 53:VPRINT P(I)," ":NEXT I:RETURN 11000 REM POINT POSITIONS FOR CUBE DRAWING 11010 DATA 44,60,32,56,20,50,8,46,8,36,8,26,8,16,20,10,32,6,44,0,56,6,68,10 11020 DATA 80,16,80,26,80,36,80,46,68,50,56,56,44,60,8,46,80,46,68,40,56,36 11030 DATA 44,30,44,20,44,10,44,0,20,40,32,36,44,30,56,36,68,40,80,46,44,10 11040 DATA 44,20,44,30,32,36,20,40,8,46,8,16 11050 REM PRINT ADDRESSES FOR CUBE COLOR DISPLAYS 11060 DATA 421,587,673,575,661,827,649,815,981,886,1052,1138,1144,990,916 11070 DATA 684,610,456,462,548,714,1126,1292,1458,1464,1310,1156,1004,850 11080 DATA 696,702,868,1034,1366,1532,1698,1704,1550,1396,1244,1090,1016 11090 DATA 1023,1108,1274,1179,1345,1431,1333,1419,1585,1407,1573,1739 11100 REM CUBE SURFACE STARTING COLORS 11110 DATA 0,0,0,0,0,0,0,0,0 11120 DATA 1,1,1,2,2,2,3,3,3,4,4,4 11130 DATA 1,1,1,2,2,2,3,3,3,4,4,4 11140 DATA 1,1,1,2,2,2,3,3,3,4,4,4 11150 DATA 5,5,5,5,5,5,5,5,5 11160 REM COLOR DISPLAY MODES 11170 DATA "@@@","^^^","+++","!!!","[*]"," " 11180 DATA "WHI","YEL","RED","GRE","ORA","BLU" 11190 DATA " U "," L "," F "," R "," B "," D " 11200 REM DATA FOR ROTATIONS 11210 DATA 54,15,39,41,17,54,16,27,40,29,54,51,42,0,14,54,48,30,1,26,54,45 11220 DATA 18,2,38,54,54,9,33,35,11,54,10,21,34,23,54,6,44,53,12,54,7,32,50 11230 DATA 24,54,8,20,47,36,54,54,12,36,38,14,54,13,24,37,26,54,8,35,51,15 11240 DATA 54,5,23,52,27,54,2,11,53,39,54,54,18,42,44,20,54,19,30,43,32,54 11250 DATA 0,41,47,9,54,3,29,46,21,54,6,17,45,33,54,54,0,6,8,2,54,1,3,7,5 11260 DATA 54,17,20,11,14,54,16,19,10,13,54,15,18,9,12,54,54,45,51,53,47,54 11270 DATA 46,48,52,50,54,42,39,36,33,54,43,40,37,34,54,44,41,38,35,54 11280 REM DATA FOR COMMAND SERIES 11290 DATA ',U,D,L,R,F,B,S,C,M,E,N,Q,P,0,1,2,3 11300 REM DATA FOR MOVE DISPLAY 11310 DATA R,L,F,B,U,D,'R,'L,'F,'B,'U,'D 11320 GOTO 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000