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