PROCEDURE GOTOXY (X, Y : INTEGER); BEGIN {Top left corner of screen is position 1, 1} WRITE (CHR (27), '=', CHR (Y + 31), CHR (X + 31)) END; PROCEDURE DISPLAY; BEGIN WRITE (HOME); WRITELN (U.A:18); WRITELN; WRITELN (U.B:18); WRITELN; WRITELN (U.C:18); WRITELN; WRITELN; WRITELN (L.A, F.A:11, R.A:11, B.A:11); WRITELN; WRITELN (L.B, F.B:11, R.B:11, B.B:11); WRITELN; WRITELN (L.C, F.C:11, R.C:11, B.C:11); WRITELN; WRITELN; WRITELN (D.A:18); WRITELN; WRITELN (D.B:18); WRITELN; WRITELN (D.C:18); END; PROCEDURE CW (VAR X : FACE); BEGIN {Rotate a face clockwise without moving adjoining faces.} S := X; X.A[1] := S.C[1]; X.A[4] := S.B[1]; X.A[7] := S.A[1]; X.B[1] := S.C[4]; X.B[7] := S.A[4]; X.C[1] := S.C[7]; X.C[4] := S.B[7]; X.C[7] := S.A[7]; END; PROCEDURE CCW (VAR X : FACE); BEGIN {Rotate a face counterclockwise without moving adjoining faces.} S := X; X.A[1] := S.A[7]; X.A[4] := S.B[7]; X.A[7] := S.C[7]; X.B[1] := S.A[4]; X.B[7] := S.C[4]; X.C[1] := S.A[1]; X.C[4] := S.B[1]; X.C[7] := S.C[1]; END; { \NP } PROCEDURE VUP (POS : INTEGER); VAR I, J : INTEGER; BEGIN {Move a vertical slice up.} I := POS; J := 8 - I; S := B; B.C[J] := U.A[I]; B.B[J] := U.B[I]; B.A[J] := U.C[I]; U.A[I] := F.A[I]; U.B[I] := F.B[I]; U.C[I] := F.C[I]; F.A[I] := D.A[I]; F.B[I] := D.B[I]; F.C[I] := D.C[I]; D.A[I] := S.C[J]; D.B[I] := S.B[J]; D.C[I] := S.A[J]; END; PROCEDURE VDOWN (POS : INTEGER); VAR I, J : INTEGER; BEGIN {Move a vertical slice down.} I := POS; J := 8 - I; S := B; B.C[J] := D.A[I]; B.B[J] := D.B[I]; B.A[J] := D.C[I]; D.A[I] := F.A[I]; D.B[I] := F.B[I]; D.C[I] := F.C[I]; F.A[I] := U.A[I]; F.B[I] := U.B[I]; F.C[I] := U.C[I]; U.A[I] := S.C[J]; U.B[I] := S.B[J]; U.C[I] := S.A[J]; END; PROCEDURE HRIGHT (SLICE : INTEGER); BEGIN {Move a horizontal slice right.} S := B; CASE SLICE OF 1 : BEGIN B.A := R.A; R.A := F.A; F.A := L.A; L.A := S.A END; 2 : BEGIN B.B := R.B; R.B := F.B; F.B := L.B; L.B := S.B END; 3 : BEGIN B.C := R.C; R.C := F.C; F.C := L.C; L.C := S.C END; END; END; PROCEDURE HLEFT (SLICE : INTEGER); BEGIN {Move a horizontal slice left.} S := B; CASE SLICE OF 1 : BEGIN B.A := L.A; L.A := F.A; F.A := R.A; R.A := S.A END; 2 : BEGIN B.B := L.B; L.B := F.B; F.B := R.B; R.B := S.B END; 3 : BEGIN B.C := L.C; L.C := F.C; F.C := R.C; R.C := S.C END; END; END; { \NP } PROCEDURE ICW (SLICE : INTEGER); BEGIN {Move an invisible slice clockwise.} S := U; CASE SLICE OF 1 : BEGIN U.C[1] := L.C[7]; U.C[4] := L.B[7]; U.C[7] := L.A[7]; L.A[7] := D.A[1]; L.B[7] := D.A[4]; L.C[7] := D.A[7]; D.A[1] := R.C[1]; D.A[4] := R.B[1]; D.A[7] := R.A[1]; R.A[1] := S.C[1]; R.B[1] := S.C[4]; R.C[1] := S.C[7]; END; 2 : BEGIN U.B[1] := L.C[4]; U.B[4] := L.B[4]; U.B[7] := L.A[4]; L.A[4] := D.B[1]; L.B[4] := D.B[4]; L.C[4] := D.B[7]; D.B[1] := R.C[4]; D.B[4] := R.B[4]; D.B[7] := R.A[4]; R.A[4] := S.B[1]; R.B[4] := S.B[4]; R.C[4] := S.B[7]; END; 3 : BEGIN U.A[1] := L.C[1]; U.A[4] := L.B[1]; U.A[7] := L.A[1]; L.A[1] := D.C[1]; L.B[1] := D.C[4]; L.C[1] := D.C[7]; D.C[1] := R.C[7]; D.C[4] := R.B[7]; D.C[7] := R.A[7]; R.A[7] := S.A[1]; R.B[7] := S.A[4]; R.C[7] := S.A[7]; END; END; END; PROCEDURE ICCW (SLICE : INTEGER); BEGIN {Move an invisible slice counterclockwise.} S := U; CASE SLICE OF 1 : BEGIN U.C[1] := R.A[1]; U.C[4] := R.B[1]; U.C[7] := R.C[1]; R.A[1] := D.A[7]; R.B[1] := D.A[4]; R.C[1] := D.A[1]; D.A[1] := L.A[7]; D.A[4] := L.B[7]; D.A[7] := L.C[7]; L.A[7] := S.C[7]; L.B[7] := S.C[4]; L.C[7] := S.C[1]; END; 2 : BEGIN U.B[1] := R.A[4]; U.B[4] := R.B[4]; U.B[7] := R.C[4]; R.A[4] := D.B[7]; R.B[4] := D.B[4]; R.C[4] := D.B[1]; D.B[1] := L.A[4]; D.B[4] := L.B[4]; D.B[7] := L.C[4]; L.A[4] := S.B[7]; L.B[4] := S.B[4]; L.C[4] := S.B[1]; END; 3 : BEGIN U.A[1] := R.A[7]; U.A[4] := R.B[7]; U.A[7] := R.C[7]; R.A[7] := D.C[7]; R.B[7] := D.C[4]; R.C[7] := D.C[1]; D.C[1] := L.A[1]; D.C[4] := L.B[1]; D.C[7] := L.C[1]; L.A[1] := S.A[7]; L.B[1] := S.A[4]; L.C[1] := S.A[1]; END; END; END;