/*************************************************
/*
/* This code © 1989 by W. Roger uzun
/* This code is for Lattice 5.0X
/* compile using - lc -v -cf -L -O Rubik3D (for 68000 version)
/* or lc -v -cf -L -m2 -O -dCPU020 Rubik3D (for 68020 version)
/*
/*************************************************/


#include <proto/exec.h>
#include <exec/memory.h>
#ifdef CPU020
#include <exec/execbase.h>
#endif
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <graphics/gfxmacros.h>
#include <proto/dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define WIDTH 640
#define SIZE 200
#define HEIGHT 400
#define X0 90
#define Y0 70

struct Point{
long x,y;
};

struct Rect{
long x1,y1,x2,y2;
};

WORD areabuffer[250];

struct ParaGram{
long x1,y1,x2,y2,x3,y3,x4,y4;
};

struct Point FFills[18]={
{228,30},
{307,30},
{387,30},
{187,64},
{266,64},
{346,64},
{147,97},
{226,97},
{306,97},
{386,98},
{426,65},
{467,31},
{386,165},
{426,132},
{467,98},
{386,232},
{426,199},
{467,165}
};

struct ParaGram Areas[18]={
{228,29,187,63,266,63,307,29},
{307,29,266,63,346,63,387,29},
{387,29,346,63,427,63,468,29},
{187,63,148,96,227,96,266,63},
{266,63,227,96,307,96,346,63},
{346,63,307,96,388,96,427,63},
{147,96,108,129,187,129,226,96},
{226,96,187,129,267,129,306,96},
{306,96,267,129,348,129,387,96},
{387,96,348,129,348,196,387,163},
{427,63,387,97,387,164,427,130},
{468,29,427,64,427,130,468,96},
{387,163,348,196,348,263,387,230},
{427,130,387,164,387,231,427,197},
{468,96,427,130,427,197,468,163},
{387,231,348,263,348,329,387,297},
{427,197,387,230,387,297,427,263},
{468,163,427,197,427,263,468,229}
};

struct Rect RFills[9]={
{109,130,186,195},
{188,130,266,195},
{268,130,347,195},
{109,197,186,262},
{188,197,266,262},
{268,197,347,262},
{109,264,186,328},
{188,264,266,328},
{268,264,347,328}};

#define WINDOWSIGNAL (1L<<(wG->UserPort->mp_SigBit))


/* data for cube */

int aborted=0;
char q[50];
BPTR fh;
int PlotOn=1;
ULONG speed=0L;
ULONG *xchg1,*xchg2;
ULONG upperface[9],leftface[9],frontface[9],rightface[9],backface[9];
ULONG downface[9],x[9],y[9];
int onepoint=0;
int a,c,e,k;

UWORD chip WaitPtr[]={
0x0000,0x0000,      /* Position pad bytes */
0x0038,0x0000,0x0024,0x0000,0x0024,0x0000,0x0038,0x0000,
0x0024,0x0000,0x0024,0x0000,0x0038,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0024,0x0000,0x0024,0x0000,
0x0024,0x0000,0x0024,0x0000,0x0024,0x0000,0x0024,0x0000,
0x0018,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0018,0x0000,0x0024,0x0000,0x0020,0x0000,0x0018,0x0000,
0x0004,0x0000,0x0024,0x0000,0x0018,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0024,0x0000,0x0024,0x0000,
0x0024,0x0000,0x0018,0x0000,0x0018,0x0000,0x0018,0x0000,
0x0018,0x0000,
0x0000,0x0000,      /* Linkage pad bytes */

};
/* ht = 25 */


UWORD chip PickPtr[]={
0x0000,0x0000,      /* Position pad bytes */
0x0000,0x7090,0x0000,0x4810,0x0000,0x4892,0x0000,0x7094,
0x0000,0x4098,0x0000,0x4094,0x0000,0x4092,0x0000,0x0000,

0x0000,0x0000,      /* Linkage pad bytes */

};

/* sizebody=           0x20 HEX     ....32 decimal */
/* width=              0x10 HEX     ....16 decimal */
/* Width in WORDS=     0x1 HEX      ....1 decimal */
/* height=             0x8 HEX     ....8 decimal */
/* number of planes=   0x2 HEX */

void Draw3D(int,int,int);
void Move3D(int,int,int);
void DrawCube(void);
void __regargs CalcRealXY(int,int,int,long *,long *);
void FillCube(void);
ULONG __regargs *MatchBox(int,int);
void DoALayer(void);
void SolveCorners(void);
void Parse(void);
void DoVertical(void);
void DoHorizontal(void);
void Space2(void);
void FinishLayers(void);
void FaceRotate(void);
void Plot(void);
void __regargs PrintText(int,int,char *);
void Init(void);
void main(void);
void __regargs HandleEvent(APTR);
void DoQuit(void);
void DoSolve(void);
void DoRight(void);
void ClearUpperCorners(void);
void DoLeft(void);
void DoUp(void);
void DoDown(void);
void DoAbout(void);
void DoForward(void);
void DoBack(void);

int done=0;
struct RastPort *rpG;
struct TextFont *myTextFont;
struct Screen *sC;
struct Window *wG;

struct TextAttr TOPAZ80 = {
	(STRPTR)"topaz.font",
	TOPAZ_EIGHTY,0,0
};

struct NewScreen NewScreenStructure = {
	0,0,	/* screen XY origin relative to View */
	WIDTH,HEIGHT,	/* screen width and height */
	3,	/* screen depth (number of bitplanes) */
	0,1,	/* detail and block pens */
	LACE|HIRES,	/* display modes for this screen */
	CUSTOMSCREEN,	/* screen type */
	&TOPAZ80,	/* pointer to default screen font */
	"Rubiks Cube",	/* screen title */
	NULL,	/* first in list of custom screen gadgets */
	NULL	/* pointer to custom BitMap structure */
};

#define NEWSCREENSTRUCTURE NewScreenStructure

#define GREEN 2
#define ORANGE 3
#define WHITE 4
#define BLUE 5
#define RED 6
#define YELLOW 7

USHORT Palette[] = {
	0x0777,	/* color #0 */
	0x0000,	/* color #1 */
	0x00B0,	/* color #2 green */
	0x0F82,	/* color #3 orange */
	0x0FFF,	/* color #4 white */
	0x006F,	/* color #5 blue */
	0x0F33,	/* color #6 Red */
	0x0FF0	/* color #7 Yellow */
#define PaletteColorCount 8
};

#define PALETTE Palette

UBYTE MyMyGadget3SIBuff[20]={'2','5','5','\0'};
struct StringInfo MyMyGadget3SInfo = {
	MyMyGadget3SIBuff,	/* buffer where text will be edited */
	NULL,	/* optional undo buffer */
	0,	/* character position in buffer */
	4,	/* maximum number of characters to allow */
	0,	/* first displayed character buffer position */
	0,0,0,0,0,	/* Intuition initialized and maintained variables */
	0,	/* Rastport of gadget */
	0,	/* initial value for integer gadgets */
	NULL	/* alternate keymap (fill in if you set the flag) */
};

SHORT MyBorderVectors1[] = {
	0,0,
	71,0,
	71,13,
	0,13,
	0,0
};
struct Border MyBorder1 = {
	-1,-1,	/* XY origin relative to container TopLeft */
	3,0,JAM1,	/* front pen, back pen and drawmode */
	5,	/* number of XY vectors */
	MyBorderVectors1,	/* pointer to XY vectors */
	NULL	/* next border in list */
};

struct Gadget MyGadget3 = {
	NULL,	/* next gadget */
	42,65,	/* origin XY of hit box relative to window TopLeft */
	70,12,	/* hit box width and height */
	NULL,	/* gadget flags */
	RELVERIFY,	/* activation flags */
	STRGADGET,	/* gadget type flags */
	(APTR)&MyBorder1,	/* gadget border or image to be rendered */
	NULL,	/* alternate imagery for selection */
	NULL,	/* first IntuiText structure */
	NULL,	/* gadget mutual-exclude long word */
	(APTR)&MyMyGadget3SInfo,	/* SpecialInfo structure */
	NULL,	/* user-definable data */
	NULL	/* pointer to user-definable data */
};

UBYTE MyMyGadget2SIBuff[20];
struct StringInfo MyMyGadget2SInfo = {
	MyMyGadget2SIBuff,	/* buffer where text will be edited */
	NULL,	/* optional undo buffer */
	0,	/* character position in buffer */
	20,	/* maximum number of characters to allow */
	0,	/* first displayed character buffer position */
	0,0,0,0,0,	/* Intuition initialized and maintained variables */
	0,	/* Rastport of gadget */
	0,	/* initial value for integer gadgets */
	NULL	/* alternate keymap (fill in if you set the flag) */
};

SHORT MyBorderVectors2[] = {
	0,0,
	147,0,
	147,13,
	0,13,
	0,0
};
struct Border MyBorder2 = {
	-1,-1,	/* XY origin relative to container TopLeft */
	3,0,JAM1,	/* front pen, back pen and drawmode */
	5,	/* number of XY vectors */
	MyBorderVectors2,	/* pointer to XY vectors */
	NULL	/* next border in list */
};

struct Gadget MyGadget2 = {
	&MyGadget3,	/* next gadget */
	8,33,	/* origin XY of hit box relative to window TopLeft */
	146,12,	/* hit box width and height */
	NULL,	/* gadget flags */
	RELVERIFY,	/* activation flags */
	STRGADGET,	/* gadget type flags */
	(APTR)&MyBorder2,	/* gadget border or image to be rendered */
	NULL,	/* alternate imagery for selection */
	NULL,	/* first IntuiText structure */
	NULL,	/* gadget mutual-exclude long word */
	(APTR)&MyMyGadget2SInfo,	/* SpecialInfo structure */
	NULL,	/* user-definable data */
	NULL	/* pointer to user-definable data */
};

SHORT MyBorderVectors3[] = {
	0,0,
	46,0,
	46,22,
	0,22,
	0,0
};
struct Border MyBorder3 = {
	-1,-1,	/* XY origin relative to container TopLeft */
	3,0,JAM1,	/* front pen, back pen and drawmode */
	5,	/* number of XY vectors */
	MyBorderVectors3,	/* pointer to XY vectors */
	NULL	/* next border in list */
};

struct IntuiText MyIText1 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	14,7,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"OK",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct Gadget MyGadget1 = {
	&MyGadget2,	/* next gadget */
	53,106,	/* origin XY of hit box relative to window TopLeft */
	45,21,	/* hit box width and height */
	NULL,	/* gadget flags */
	RELVERIFY,	/* activation flags */
	BOOLGADGET,	/* gadget type flags */
	(APTR)&MyBorder3,	/* gadget border or image to be rendered */
	NULL,	/* alternate imagery for selection */
	&MyIText1,	/* first IntuiText structure */
	NULL,	/* gadget mutual-exclude long word */
	NULL,	/* SpecialInfo structure */
	NULL,	/* user-definable data */
	NULL	/* pointer to user-definable data */
};

#define MyGadgetList1 MyGadget1

struct IntuiText MyIText3 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	56,54,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"Speed",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct IntuiText MyIText2 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	41,17,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"File Name",	/* pointer to text */
	&MyIText3	/* next IntuiText structure */
};

#define MyIntuiTextList1 MyIText2

struct NewWindow MyNewWindowStructure1 = {
	80,30,	/* window XY origin relative to TopLeft of screen */
	160,135,	/* window width and height */
	0,1,	/* detail and block pens */
	GADGETUP,	/* IDCMP flags */
	ACTIVATE+NOCAREREFRESH,	/* other window flags */
	&MyGadget1,	/* first gadget in gadget list */
	NULL,	/* custom CHECKMARK imagery */
	"Solve The Cube!",	/* window title */
	NULL,	/* custom screen pointer */
	NULL,	/* custom bitmap */
	5,5,	/* minimum width and height */
	-1,-1,	/* maximum width and height */
	CUSTOMSCREEN	/* destination screen type */
};

struct IntuiText IText1 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Quit",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem MenuItem4 = {
	NULL,	/* next MenuItem structure */
	0,24,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	80,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText1,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'Q',	/* alternate command-key */
	NULL,	/* SubItem list */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText2 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Solve",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem MenuItem3 = {
	&MenuItem4,	/* next MenuItem structure */
	0,16,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	80,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText2,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'S',	/* alternate command-key */
	NULL,	/* SubItem list */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText3b = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Vert",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem8 = {
	NULL, /* next SubItem structure */
	65,48,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText3b,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'C',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};


struct IntuiText IText3a = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Horiz",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem7 = {
	&SubItem8, /* next SubItem structure */
	65,40,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText3a,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'H',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};



struct IntuiText IText3 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Back",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem6 = {
	&SubItem7, /* next SubItem structure */
	65,32,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText3,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'B',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText4 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Forward",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem5 = {
	&SubItem6,	/* next SubItem structure */
	65,24,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText4,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'F',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText5 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Down",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem4 = {
	&SubItem5,	/* next SubItem structure */
	65,16,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText5,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'D',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText6 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Up",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem3 = {
	&SubItem4,	/* next SubItem structure */
	65,8,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText6,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'U',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText7 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Left",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem2 = {
	&SubItem3,	/* next SubItem structure */
	65,0,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText7,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'L',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText8 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Right",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem SubItem1 = {
	&SubItem2,	/* next SubItem structure */
	65,-8,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	96,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText8,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'R',	/* alternate command-key */
	NULL,	/* no SubItem list for SubItems */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText9 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"Move",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem MenuItem2 = {
	&MenuItem3,	/* next MenuItem structure */
	0,8,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	80,8,	/* hit box width and height */
	ITEMTEXT+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText9,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	NULL,	/* alternate command-key */
	&SubItem1,	/* SubItem list */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct IntuiText IText10 = {
	3,1,COMPLEMENT,	/* front and back text pens, drawmode and fill byte */
	0,0,	/* XY origin relative to container TopLeft */
	&TOPAZ80,	/* font pointer or NULL for default */
	"About",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct MenuItem MenuItem1 = {
	&MenuItem2,	/* next MenuItem structure */
	0,0,	/* XY of Item hitbox relative to TopLeft of parent hitbox */
	80,8,	/* hit box width and height */
	ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,	/* Item flags */
	0,	/* each bit mutually-excludes a same-level Item */
	(APTR)&IText10,	/* Item render  (IntuiText or Image or NULL) */
	NULL,	/* Select render */
	'A',	/* alternate command-key */
	NULL,	/* SubItem list */
	MENUNULL	/* filled in by Intuition for drag selections */
};

struct Menu Menu1 = {
	NULL,	/* next Menu structure */
	0,0,	/* XY origin of Menu hit box relative to screen TopLeft */
	63,0,	/* Menu hit box width and height */
	MENUENABLED,	/* Menu flags */
	"Project",	/* text of Menu name */
	&MenuItem1	/* MenuItem linked list pointer */
};

#define MenuList1 Menu1

struct NewWindow NewWindowStructure1 = {
	0,0,	/* window XY origin relative to TopLeft of screen */
	WIDTH,HEIGHT,	/* window width and height */
	0,1,	/* detail and block pens */
	MOUSEBUTTONS|MENUPICK,	/* IDCMP flags */
	BACKDROP+BORDERLESS+ACTIVATE+NOCAREREFRESH,	/* other window flags */
	NULL,	/* first gadget in gadget list */
	NULL,	/* custom CHECKMARK imagery */
	"Rubiks Cube",	/* window title */
	NULL,	/* custom screen pointer */
	NULL,	/* custom bitmap */
	320,200,	/* minimum width and height */
	-1,-1,	/* maximum width and height */
	CUSTOMSCREEN	/* destination screen type */
};

SHORT BorderVectors1[] = {
	0,0,
	51,0,
	51,25,
	0,25,
	0,0
};
struct Border Border1 = {
	-1,-1,	/* XY origin relative to container TopLeft */
	3,0,JAM1,	/* front pen, back pen and drawmode */
	5,	/* number of XY vectors */
	BorderVectors1,	/* pointer to XY vectors */
	NULL	/* next border in list */
};

struct IntuiText IText11 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	16,10,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"OK",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct Gadget Gadget1 = {
	NULL,	/* next gadget */
	54,101,	/* origin XY of hit box relative to window TopLeft */
	50,24,	/* hit box width and height */
	NULL,	/* gadget flags */
	RELVERIFY,	/* activation flags */
	BOOLGADGET,	/* gadget type flags */
	(APTR)&Border1,	/* gadget border or image to be rendered */
	NULL,	/* alternate imagery for selection */
	&IText11,	/* first IntuiText structure */
	NULL,	/* gadget mutual-exclude long word */
	NULL,	/* SpecialInfo structure */
	NULL,	/* user-definable data */
	NULL	/* pointer to user-definable data */
};

#define GadgetList2 Gadget1

struct IntuiText IText14 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	33,40,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"Version 0.0",	/* pointer to text */
	NULL	/* next IntuiText structure */
};

struct IntuiText IText13 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	19,61,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"By W. Roger Uzun",	/* pointer to text */
	&IText14	/* next IntuiText structure */
};

struct IntuiText IText12 = {
	3,0,JAM2,	/* front and back text pens, drawmode and fill byte */
	26,15,	/* XY origin relative to container TopLeft */
	NULL,	/* font pointer or NULL for default */
	"Rubiks3D Solve",	/* pointer to text */
	&IText13	/* next IntuiText structure */
};

#define IntuiTextList2 IText12

struct NewWindow NewWindowStructure2 = {
	80,30,	/* window XY origin relative to TopLeft of screen */
	160,135,	/* window width and height */
	0,1,	/* detail and block pens */
	GADGETUP,	/* IDCMP flags */
	ACTIVATE+NOCAREREFRESH,	/* other window flags */
	&Gadget1,	/* first gadget in gadget list */
	NULL,	/* custom CHECKMARK imagery */
	"About Rubiks Solve",	/* window title */
	NULL,	/* custom screen pointer */
	NULL,	/* custom bitmap */
	160,135,	/* minimum width and height */
	-1,-1,	/* maximum width and height */
	CUSTOMSCREEN	/* destination screen type */
};


void __regargs HandleEvent(object)
APTR object;
{
  if (object == (APTR)&MenuItem1) { DoAbout(); return; }
  if (object == (APTR)&SubItem1) { DoRight(); return; }
  if (object == (APTR)&SubItem2) { DoLeft(); return; }
  if (object == (APTR)&SubItem3) { DoUp(); return; }
  if (object == (APTR)&SubItem4) { DoDown(); return; }
  if (object == (APTR)&SubItem5) { DoForward(); return; }
  if (object == (APTR)&SubItem6) { DoBack(); return; }
  if (object == (APTR)&SubItem7) { DoHorizontal(); return; }
  if (object == (APTR)&SubItem8) { DoVertical(); return; }
  if (object == (APTR)&MenuItem3) { DoSolve(); return; }
  if (object == (APTR)&MenuItem4) { DoQuit(); return; }
}
#define HANDLEEVENT HandleEvent

/* end of PowerWindows source generation */



ULONG __regargs *MatchBox(x,y)
int x,y;
{
 ULONG *temp;
 
 if ((x >= 90)&&(x <= 109)&&(y >= 16)&&(y <= 32))
  temp = &upperface[0];
 else if ((x >= 111)&&(x <= 130)&&(y >= 16)&&(y <= 32))
  temp = &upperface[1];
 else if ((x >= 132)&&(x <= 151)&&(y >= 16)&&(y <= 32))
  temp = &upperface[2];
 else if ((x >= 90)&&(x <= 109)&&(y >= 34)&&(y <= 50))
  temp = &upperface[3];
 else if ((x >= 111)&&(x <= 130)&&(y >= 34)&&(y <= 50))
  temp = &upperface[4];
 else if ((x >= 132)&&(x <= 151)&&(y >= 34)&&(y <= 50))
  temp = &upperface[5];
 else if ((x >= 90)&&(x <= 109)&&(y >= 52)&&(y <= 68))
  temp = &upperface[6];
 else if ((x >= 111)&&(x <= 130)&&(y >= 52)&&(y <= 68))
  temp = &upperface[7];
 else if ((x >= 132)&&(x <= 151)&&(y >= 52)&&(y <= 68))
  temp = &upperface[8];
 else if ((x >= 20)&&(x <= 39)&&(y >= 76)&&(y <= 92))
  temp = &leftface[0];
 else if ((x >= 41)&&(x <= 60)&&(y >= 76)&&(y <= 92))
  temp = &leftface[1];
 else if ((x >= 62)&&(x <= 81)&&(y >= 76)&&(y <= 92))
  temp = &leftface[2];
 else if ((x >= 20)&&(x <= 39)&&(y >= 94)&&(y <= 110))
  temp = &leftface[3];
 else if ((x >= 41)&&(x <= 60)&&(y >= 94)&&(y <= 110))
  temp = &leftface[4];
 else if ((x >= 62)&&(x <= 81)&&(y >= 94)&&(y <= 110))
  temp = &leftface[5];
 else if ((x >= 20)&&(x <= 39)&&(y >= 112)&&(y <= 128))
  temp = &leftface[6];
 else if ((x >= 41)&&(x <= 60)&&(y >= 112)&&(y <= 128))
  temp = &leftface[7];
 else if ((x >= 62)&&(x <= 81)&&(y >= 112)&&(y <= 128))
  temp = &leftface[8];
 else if ((x >= 90)&&(x <= 109)&&(y >= 76)&&(y <= 92))
  temp = &frontface[0];
 else if ((x >= 111)&&(x <= 130)&&(y >= 76)&&(y <= 92))
  temp = &frontface[1];
 else if ((x >= 132)&&(x <= 151)&&(y >= 76)&&(y <= 92))
  temp = &frontface[2];
 else if ((x >= 90)&&(x <= 109)&&(y >= 94)&&(y <= 110))
  temp = &frontface[3];
 else if ((x >= 111)&&(x <= 130)&&(y >= 94)&&(y <= 110))
  temp = &frontface[4];
 else if ((x >= 132)&&(x <= 151)&&(y >= 94)&&(y <= 110))
  temp = &frontface[5];
 else if ((x >= 90)&&(x <= 109)&&(y >= 112)&&(y <= 128))
  temp = &frontface[6];
 else if ((x >= 111)&&(x <= 130)&&(y >= 112)&&(y <= 128))
  temp = &frontface[7];
 else if ((x >= 132)&&(x <= 151)&&(y >= 112)&&(y <= 128))
  temp = &frontface[8];
 else if ((x >= 160)&&(x <= 179)&&(y >= 76)&&(y <= 92))
  temp = &rightface[0];
 else if ((x >= 181)&&(x <= 200)&&(y >= 76)&&(y <= 92))
  temp = &rightface[1];
 else if ((x >= 202)&&(x <= 221)&&(y >= 76)&&(y <= 92))
  temp = &rightface[2];
 else if ((x >= 160)&&(x <= 179)&&(y >= 94)&&(y <= 110))
  temp = &rightface[3];
 else if ((x >= 181)&&(x <= 200)&&(y >= 94)&&(y <= 110))
  temp = &rightface[4];
 else if ((x >= 202)&&(x <= 221)&&(y >= 94)&&(y <= 110))
  temp = &rightface[5];
 else if ((x >= 160)&&(x <= 179)&&(y >= 112)&&(y <= 128))
  temp = &rightface[6];
 else if ((x >= 181)&&(x <= 200)&&(y >= 112)&&(y <= 128))
  temp = &rightface[7];
 else if ((x >= 202)&&(x <= 221)&&(y >= 112)&&(y <= 128))
  temp = &rightface[8];
 else if ((x >= 230)&&(x <= 249)&&(y >= 76)&&(y <= 92))
  temp = &backface[0];
 else if ((x >= 251)&&(x <= 270)&&(y >= 76)&&(y <= 92))
  temp = &backface[1];
 else if ((x >= 272)&&(x <= 291)&&(y >= 76)&&(y <= 92))
  temp = &backface[2];
 else if ((x >= 230)&&(x <= 249)&&(y >= 94)&&(y <= 110))
  temp = &backface[3];
 else if ((x >= 251)&&(x <= 270)&&(y >= 94)&&(y <= 110))
  temp = &backface[4];
 else if ((x >= 272)&&(x <= 291)&&(y >= 94)&&(y <= 110))
  temp = &backface[5];
 else if ((x >= 230)&&(x <= 249)&&(y >= 112)&&(y <= 128))
  temp = &backface[6];
 else if ((x >= 251)&&(x <= 270)&&(y >= 112)&&(y <= 128))
  temp = &backface[7];
 else if ((x >= 272)&&(x <= 291)&&(y >= 112)&&(y <= 128))
  temp = &backface[8];
 else if ((x >= 90)&&(x <= 109)&&(y >= 136)&&(y <= 152))
  temp = &downface[0];
 else if ((x >= 111)&&(x <= 130)&&(y >= 136)&&(y <= 152))
  temp = &downface[1];
 else if ((x >= 132)&&(x <= 151)&&(y >= 136)&&(y <= 152))
  temp = &downface[2];
 else if ((x >= 90)&&(x <= 109)&&(y >= 154)&&(y <= 170))
  temp = &downface[3];
 else if ((x >= 111)&&(x <= 130)&&(y >= 154)&&(y <= 170))
  temp = &downface[4];
 else if ((x >= 132)&&(x <= 151)&&(y >= 154)&&(y <= 170))
  temp = &downface[5];
 else if ((x >= 90)&&(x <= 109)&&(y >= 172)&&(y <= 188))
  temp = &downface[6];
 else if ((x >= 111)&&(x <= 130)&&(y >= 172)&&(y <= 188))
  temp = &downface[7];
 else if ((x >= 132)&&(x <= 151)&&(y >= 172)&&(y <= 188))
  temp = &downface[8];
 else
  temp = 0L;
 return(temp);
}

void DoQuit()
{
 done = 1;
}


void Space2()
{
 SetAPen(rpG,0L);
 RectFill(rpG,0L,390L,319L,399L);
 Move(rpG,0L,397L);
 SetAPen(rpG,1L);
}

void Parse()
{
 int i;
 int j,count;
 char c;

 PlotOn = 0;
 for(i=0;i<strlen(q);i++)
  {
   c = q[i];
   count = 1;
   if (q[i+1] == 39)
    {
     i++;
     count = 3;
    }
   switch(c)
    {
     case 'r' : for(j=0;((j<count)&&(!aborted));j++)
		 DoRight();
		break; 
     case 'l' : for(j=0;((j<count)&&(!aborted));j++)
		 DoLeft();
		break; 
     case 'u' : for(j=0;((j<count)&&(!aborted));j++)
		 DoUp();
		break; 
     case 'd' : for(j=0;((j<count)&&(!aborted));j++)
		 DoDown();
		break; 
     case 'f' : for(j=0;((j<count)&&(!aborted));j++)
		 DoForward();
		break; 
     case 'b' : for(j=0;((j<count)&&(!aborted));j++)
		 DoBack();
		break; 
     case 'h' : for(j=0;((j<count)&&(!aborted));j++)
		 DoHorizontal();
		break; 
     case 'c' : for(j=0;((j<count)&&(!aborted));j++)
		 DoVertical();
		break; 
    }
  if (aborted)
   {
    PlotOn = 1;
    return;
   }
  }
 PlotOn = 1;
 Plot();
 if (speed > 15L)
  Delay((speed/4L));
}

void ClearUpperCorners()
{
 char str[80];

   Space2();
   strcpy(str,"No Solved Sides - clear upper corners");
   Text(rpG,str,strlen(str));
   strcat(str,"\n");
   if (fh)
    Write(fh,str,strlen(str));
   for(k=0;k<4;k++)
    {
a1660:
     if ((upperface[8] != a)&&(frontface[2] != a)&&(rightface[0] != a))
      {
       strcat(q,"c\n");
       if (fh)
        Write(fh,q,strlen(q));
       goto a1820;
      }
     else
      {/* Move out of top layer */
a1720:
       q[0] = '\0';
       if ((frontface[8] == a)||(rightface[6] == a)||(downface[2] == a))
        {
         strcpy(q,"d");
        }
       if (q[0] != '\0')
        {
         if (fh)
          Write(fh,q,strlen(q));
         Parse();if (aborted) return;
         goto a1720;
        }
a1790:
       strcpy(q,"r'd'rd");
       if (fh)
        Write(fh,q,strlen(q));
       Parse();if (aborted) return;
       q[0] = '\0';
       goto a1660;
      }
a1820:
       Parse();if (aborted) return;
       q[0] = '\0';
    }
}


void SolveCorners()
{
 int temp;

 k = 0;
a1850:
 temp = 0;
 a = upperface[4];
 c = frontface[4];
 e = rightface[4];
 if ((downface[2] == e)&&(frontface[8] == c))
  strcpy(q,"dfd'f'");
 else if ((frontface[8] == e)&&(rightface[6] == c))
  strcpy(q,"r'drfddf'");
 else if ((rightface[6] == e)&&(downface[2] == c))
  strcpy(q,"d'r'dr");
 if (q[0] != '\0')
  k++;
 else
  {
   temp = 1;
   strcpy(q,"d'");
  }
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 if (!(temp))
  {
   strcpy(q,"c");
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   if (k == 4)
    {
     return;
    }
  }
 q[0] = '\0';
 goto a1850;
}

void DoALayer()
{ /* 2340 stuff here */
 char str[80];
 int l;

 strcpy(str,"Layer unfinished, Clear edges");
 Space2();
 Text(rpG,str,strlen(str));
 strcat(str,"\n");
 if (fh)
  Write(fh,str,strlen(str));
 strcpy(str,"begin by removing centers from upper layer\n");
 if (fh)
  Write(fh,str,strlen(str));
 q[0] = '\0';
 for(l=1;l<5;l++)
  {
a2390:
   if ((upperface[4] == upperface[7])||(upperface[4] == frontface[1]))
    strcpy(q,"f'u'dcf");
   if (q[0] == '\0')
    {
     strcpy(q,"c");
    }
   else
    {
     if (fh)
      Write(fh,q,strlen(q));
     Parse();if (aborted) return;
     q[0] = '\0';
     goto a2390;
    }
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
  }
 strcpy(str,"\nNow replace centers from center layer\n");
 if (fh)
  Write(fh,str,strlen(str));
 strcpy(str,"Edges Cleared - Solve Edges");
 Space2();
 Text(rpG,str,strlen(str));
 strcat(str,"\n");
 if (fh)
  Write(fh,str,strlen(str));
 q[0] = '\0';
 for(l=1;l<5;l++)
  {
   if ((upperface[4] == upperface[7])&&(frontface[1] == frontface[0]))
    {
     goto a2600;
    }
a2520:
   if ((upperface[4] == leftface[5])&&(frontface[3] == frontface[0]))
    strcpy(q,"u'r'ud'f");
   if ((upperface[4] == frontface[3])&&(leftface[5] == frontface[0]))
    strcpy(q,"u'ruuddl'u'");
   if ((upperface[4] == downface[1])&&(frontface[7] == frontface[0]))
    strcpy(q,"rl'fflr'");
   if ((upperface[4] == frontface[7])&&(downface[1] == frontface[0]))
    strcpy(q,"drl'f'lr'");
   if (q[0] != '\0')
    goto a2590;
   strcpy(q,"cu'");
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
   goto a2520;
a2590:
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
a2600:
   strcpy(q,"c");
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';   
  } 
}

void FinishLayers()
{
 char str[80];
 int i,temp,l;

 temp = 0;
 for(i=0;i<9;i++)
  {
    if (upperface[i] != upperface[4])
     temp = 1;
  }
 if (temp)
  DoALayer(); /* this is 2340 */
 else
  {
    for(i=0;i<3;i++)
     if ((leftface[i] != leftface[0])||(rightface[i] != rightface[0])||
        (backface[i] != backface[0]))
      {
       temp = 1;
      }
    if (temp)
     DoALayer(); 
  }
 if (!temp)
  {
   strcpy(str,"Top Layer Finished - Go to Middle Layer\n");
   if (fh)
    Write(fh,str,strlen(str));
   strcpy(str,"Go To Middle Layer");
   Space2();
   Text(rpG,str,strlen(str));
  }
/* 2630 stuff goes here */
/* missing a4070 and a4080 routines! */
 Space2();
 strcpy(str,"\n");
 if (fh)
  Write(fh,str,1L);
 strcpy(str,"First Layer Complete");
 Text(rpG,str,strlen(str));
 strcat(str,"\n");
 if (fh)
  Write(fh,str,strlen(str));
 strcpy(str,"Color align cubes of middle layer with top layer\n");
 if (fh)
  Write(fh,str,strlen(str));
 q[0] = '\0';
a2660:
 if (frontface[0]  != frontface[4])
  {
   strcpy(q,"cu'");
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
   goto a2660;
  }
 Space2();
 strcpy(str,"\nTop and Middle Layers aligned - is middle layer finished?\n");
 if (fh)
  Write(fh,str,strlen(str));
 strcpy(str,"- is middle layer finished?");
 Text(rpG,str,strlen(str));
 for(l=3;l<6;l++)
  {
   if ((leftface[l] != leftface[4])||(frontface[l] != frontface[4])||
      (rightface[l] != rightface[4])||(backface[l] != backface[4]))
    {
     goto a2790;
    }
  }
 goto a3120;
a2790:
 strcpy(str,"Middle Layer Unfinished - clear middle layer edge cubes\n");
 if (fh)
  Write(fh,str,strlen(str));
 Space2();
 strcpy(str,"- clear middle layer edge cubes");
 Text(rpG,str,strlen(str));
 q[0] = '\0';
 for(k=1;k<5;k++)
  {
a2830:
   if ((frontface[3] == downface[4])||(leftface[5] == downface[4]))
    goto a2900;
   if ((downface[5] == downface[4])||(rightface[7] == downface[4]))
    strcpy(q,"ldl'd'f'd'f");
   else
    {
     strcpy(q,"d");
     if (fh)
      Write(fh,q,strlen(q));
     Parse();if (aborted) return;
     q[0] = '\0';
     goto a2830;
    }
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
 a2900:
   q[1] = '\0';
   q[0] = 'c';
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
  }
 /* Middle Layer Edge Destoryed */
 Space2();
 strcpy(str,"Edge Cubes Cleared - replace them");
 Text(rpG,str,strlen(str));
 strcat(str,"\n");
 if (fh)
  Write(fh,str,strlen(str));
 for(l=1;l<5;l++)
  {
   q[0] = '\0';
a2960:
   if ((downface[5] == leftface[4])&&(rightface[7] == frontface[4]))
    strcpy(q,"ldl'd'f'd'f");
   if ((downface[5] == frontface[4])&&(rightface[7] == leftface[4]))
    strcpy(q,"ldl'd'f'd'f");
   if (q[0] == '\0')
    {
     strcpy(q,"d");
     if (fh)
      Write(fh,q,strlen(q));
     Parse();if (aborted) return;
     q[0] = '\0';
     goto a2960;
    }
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = 'c';
   q[1] = '\0';
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
  }
  /* Top and Middle layers are complete */
 strcpy(str,"\nTop and Middle Layers are complete\n");
 if (fh)
  Write(fh,str,strlen(str));
 Space2();
 strcpy(str,"Color Align edge cubes");
 Text(rpG,str,strlen(str));
 strcpy(str,"edge cubes replaced - color align them\n");
 if (fh)
  Write(fh,str,strlen(str));
 for(k=1;k<5;k++)
  {
   q[0] = '\0';
   if ((leftface[5] == leftface[4])&&(frontface[3] == frontface[4]))
    strcpy(q,"c");
   else
    {
     strcpy(q,"drdu'rdu'bdu'lld'ubd'urd'uffr'd'");
     if (fh)
      Write(fh,q,strlen(q));
     Parse();if (aborted) return;
     strcpy(q,"c");
    }
   if (fh)
    Write(fh,q,strlen(q));
   Parse();if (aborted) return;
   q[0] = '\0';
  }
 /* Middle Layer finished */
a3120:
 Space2();
 strcpy(str,"- place corners in bottom layer");
 Text(rpG,str,strlen(str));
 strcpy(str,"\nMiddle Layer finished - place corners in bottom layer\n");
a3140:
 if ((downface[2] == rightface[4])&&(rightface[6] == frontface[4]))
  goto a3180;
 if ((rightface[6] == rightface[4])&&(frontface[8] == frontface[4]))
  goto a3180;
 if ((frontface[8] == rightface[4])&&(downface[2] == frontface[4]))
  goto a3180;
 q[0] = 'd';
 q[1] = '\0';
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3140;
a3180:
 if ((downface[0] == frontface[4])&&(frontface[6] == leftface[4]))
  goto a3300;
 if ((frontface[6] == frontface[4])&&(leftface[8] == leftface[4]))
  goto a3300;
 if ((leftface[8] == frontface[4])&&(downface[0] == leftface[4]))
  goto a3300;
 if ((downface[6] == leftface[4])&&(leftface[6] == backface[4]))
  goto a3340;
 if ((leftface[6] == leftface[4])&&(backface[8] == backface[4]))
  goto a3340;
 if ((backface[8] == leftface[4])&&(downface[6] == backface[4]))
  goto a3340;
 if ((downface[8] == rightface[4])&&(rightface[8] == backface[4]))
  goto a3350;
 if ((rightface[8] == rightface[4])&&(backface[6] == backface[4]))
  goto a3350;
 if ((backface[6] == rightface[4])&&(downface[8] == backface[4]))
  goto a3350;
 strcpy(q,"dfd'b'df'd'b");
a3290:
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3180;
a3300:
 if ((downface[6] == leftface[4])&&(leftface[6] == backface[4]))
  goto a3360;
 if ((leftface[6] == leftface[4])&&(backface[8] == backface[4]))
  goto a3360;
 if ((backface[8] == leftface[4])&&(downface[6] == backface[4]))
  goto a3360;
 strcpy(q,"fd'b'df'd'bdd");
 goto a3290;
a3340:
 strcpy(q,"dldbd'b'l'");
 goto a3290;
a3350:
 strcpy(q,"rd'l'dr'd'ldd");
  goto a3290;
a3360:
 /* corners are in place */
  strcpy(str,"Corners in place align corner colors");
  Space2();
  Text(rpG,str,strlen(str));
  strcat(str,"\n");
  if (fh)
   Write(fh,"\n",1L);
  if (fh)
   Write(fh,str,strlen(str));
a3380:
  a = 0;
  if (downface[0] == downface[4])
   a++;
  if (downface[2] == downface[4])
   a++;
  if (downface[6] == downface[4])
   a++;
  if (downface[8] == downface[4])
   a++;
  if (a==1)
   goto a3500;
  if (a != 0)
   goto a3530;
a3450:
 if (downface[4] != backface[8])
  {
   q[0] = 'c';
   q[1] = '\0';
   if (fh)
    Write(fh,q,1L);
   Parse();if (aborted) return;
   goto a3450;
  }
a3480:
 strcpy(q,"ldl'dlddl'dd");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3380;
a3500:
 if (downface[2] == downface[4])
  goto a3480;
 strcpy(q,"c");
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 goto a3500;
a3530:
 if (a==4)
  goto a3610;
 if (a==2)
  goto a3570;
 if (downface[0] != downface[4])
  goto a3480;
 goto a3590;
a3570:
 if ((downface[6] == downface[4])&&(downface[8] == downface[4]))
  goto a3480;
 if ((downface[2] == downface[4])&&(downface[6] == downface[4]))
  goto a3480;
a3590:
 q[0] = 'c';
 q[1] = '\0';
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 goto a3380;
a3610:
 strcpy(str,"- color align bottom face");
 Space2();
 Text(rpG,str,strlen(str));
 strcpy(str,"\nCorners are now aligned - color align bottom face\n");
 if (fh)
  Write(fh,str,strlen(str));
 for(k=1;k<5;k++)
  {
   if (downface[1] != downface[7])
    goto a3750;
a3650:
    if (downface[1] != downface[3])
     goto a3830;
a3660:
    q[0] = 'c';
    q[1] = '\0';
    if (fh)
     Write(fh,q,strlen(q));
    Parse();if (aborted) return;
  }
  strcpy(str,"- check edges for color alignment");
  Space2();
  Text(rpG,str,strlen(str));
  strcpy(str,"\nBottom face aligned - check edges for color alignment\n");
  if (fh)
   Write(fh,str,strlen(str));
a3680:
 if ((frontface[7] != frontface[4]))
  goto a3870;
 if (leftface[7] != leftface[4])
  goto a4030;
 if (rightface[7] != rightface[4])
  goto a4070;
 if (backface[7] != backface[4])
  goto a4080;
 strcpy(str,"\n- - Edges OK!\n");
 if (fh)
  Write(fh,str,strlen(str));
 strcpy(str,"Solution to Rubiks Cube completed\n");
 if (fh)
  Write(fh,str,strlen(str));
 Space2();
 strcpy(str,"Cube Solved!");
 Text(rpG,str,strlen(str));
 return;
a3750:
 if ((downface[1] != downface[4])&&(downface[7] != downface[4]))
  goto a3770;
 goto a3650;
a3770:
 q[0] = 'c';
 q[1] = '\0';
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 strcpy(q,"hdu'rdu'bdu'lld'ubd'urd'uffh'");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 strcpy(q,"c'");
 if (fh)
  Write(fh,q,2L);
 Parse();if (aborted) return;
 goto a3650;
a3830:
 if ((downface[1] != downface[4])&&(downface[3] != downface[4]))
  goto a3850;
 goto a3660;
a3850:
 strcpy(q,"f'r'hdu'rdu'bdu'lld'ubd'urd'uffh'rf");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3660;
a3870:
 if (leftface[7] == leftface[4])
  goto a3920;
 if (rightface[7] == rightface[4])
  goto a3930;
 if (backface[7] == backface[4])
  goto a3970;
 q[0] = 'c';
 q[1] = '\0';
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 strcpy(q,"rrdbf'rrfb'drr");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3680;
a3920:
 strcpy(q,"rrdbf'rrfb'drr");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3680;
a3930:
 strcpy(q,"cc");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 strcpy(q,"rrdbf'rrfb'drr");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 strcpy(q,"cc");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 goto a3680;
a3970:
 strcpy(q,"c'");
 if (fh)
  Write(fh,q,2L);
 Parse();if (aborted) return;
 strcpy(q,"rrdbf'rrfb'drr");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 strcpy(q,"c");
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 goto a3680;
a4030:
 strcpy(q,"c");
 if (fh)
  Write(fh,q,1L);
 Parse();if (aborted) return;
 strcpy(q,"rrdbf'rrfb'drr");
 if (fh)
  Write(fh,q,strlen(q));
 Parse();if (aborted) return;
 strcpy(q,"c'");
 if (fh)
  Write(fh,q,2L);
 Parse();if (aborted) return;
 goto a3680;
a4070:
a4080:
 strcpy(str,"Cannot Solve Cube");
 Space2();
 Text(rpG,str,strlen(str));
 strcpy(str,"\nCannot solve cube because of its structure!\n");
 if (fh)
  Write(fh,str,strlen(str));
}

void DoSolve()
{
 register int i;
 struct Window *wG3;
 struct IntuiMessage *message;
 int done2=0;
 UWORD code;
 ULONG class,s1,s2,m1,m2;
 APTR object;
 char str[80];
 

 aborted = 0;
 i = 255 - speed;
 sprintf(MyMyGadget3SIBuff,"%d",i);
 if (!(wG3 = OpenWindow(&MyNewWindowStructure1)))
  return;
 PrintIText(wG3->RPort,&MyIntuiTextList1,0L,0L);
 Delay(10L);
 ActivateGadget(&MyGadget2,wG3,NULL);
 while (!done2)
  {
   WaitPort(wG3->UserPort);
   while(message = (struct IntuiMessage *)GetMsg(wG3->UserPort))
    {
     class = message->Class;
     code = message->Code;
     object = message->IAddress;
     ReplyMsg((struct Message *)message);
     if (object == (APTR)&MyGadget1)
      done2 = 1;
     else if (object == (APTR)&MyGadget2)
      ActivateGadget(&MyGadget3,wG3,NULL);
     else if (object == (APTR)&MyGadget3)
      ActivateGadget(&MyGadget2,wG3,NULL);
    }
  }
 CloseWindow(wG3);
 speed = atol(MyMyGadget3SIBuff);
 for(done2=0;done2<strlen(MyMyGadget3SIBuff);done2++)
  {
   if ((MyMyGadget3SIBuff[done2] > '9')||(MyMyGadget3SIBuff[done2] < '0'))
    {
     speed = 255L;
    }
  }
 if (speed > 255L)
  speed = 255L;
 speed = 255L - speed; /* speed is the delay factor from 0 - 255 */
 fh = 0L;
 if (strlen(MyMyGadget2SIBuff) > 0)
  {
   if (!(fh = Open(MyMyGadget2SIBuff,MODE_NEWFILE)))
    {
     DisplayBeep(0L);
     Delay(30L);
     DisplayBeep(0L);
    }
  }
 CurrentTime(&s1,&m1);
/* solve cube goes here */
 SetAPen(rpG,1L); /* Black */
 Space2();
 strcpy(str,"check for one side solved");
 Text(rpG,str,strlen(str));
 if (fh)
  {
   strcat(str,"\n");
   Write(fh,str,strlen(str));
  }
 done2 = 1;
 for(i=0;i<9;i++)
  if (upperface[i] != upperface[4])
   done2 = 0;
 if (!done2)
  {
   done2 = 2;
   for(i=0;i<9;i++)
    if (leftface[i] != leftface[4])
     done2 = 0;
  }
 if (!done2)
  {
   done2 = 3;
   for(i=0;i<9;i++)
    if (frontface[i] != frontface[4])
     done2 = 0;
  }
 if (!done2)
  {
   done2 = 4;
   for(i=0;i<9;i++)
    if (rightface[i] != rightface[4])
     done2 = 0;
  }
 if (!done2)
  {
   done2 = 5;
   for(i=0;i<9;i++)
    if (backface[i] != backface[4])
     done2 = 0;
  }
 if (!done2)
  {
   done2 = 6;
   for(i=0;i<9;i++)
    if (downface[i] != downface[4])
     done2 = 0;
  }
 if (done2)
  {/* a side is done */
   switch(done2)
    {
     case 1 :	Space2();
		strcpy(str,"Upper Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		break;
     case 2 :	Space2();
		strcpy(str,"Left Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		strcpy(q,"c'h");
		if (fh)
		 Write(fh,q,strlen(q));
		Parse();if (aborted) return;
		if (aborted)
		 return;
		break;
     case 3 :	Space2();
		strcpy(str,"Front Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		strcpy(q,"h");
		if (fh)
		 Write(fh,q,strlen(q));
		Parse();if (aborted) return;
		break;
     case 4 :	Space2();
		strcpy(str,"Right Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		strcpy(q,"ch");
		if (fh)
		 Write(fh,q,strlen(q));
		Parse();if (aborted) return;
		break;
     case 5 :	Space2();
		strcpy(str,"Back Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		strcpy(q,"h'");
		if (fh)
		 Write(fh,q,strlen(q));
		Parse();if (aborted) return;
		break;
     case 6 :	Space2();
		strcpy(str,"Down Side Solved");
		Text(rpG,str,strlen(str));
		strcat(str,"\n");
		if (fh)
		 Write(fh,str,strlen(str));
		strcpy(q,"hh");
		if (fh)
		 Write(fh,q,strlen(q));
		Parse();if (aborted) return;
		break;
    }
  }
 else
  {
   q[0] = '\0';
   a = upperface[4];
   c = frontface[4];
   e = rightface[4];
   ClearUpperCorners();
   strcpy(str,"Corners are Cleared, solve Corners");
   Space2();
   Text(rpG,str,strlen(str));
   strcat(str,"\n");
   if (fh)
    Write(fh,str,strlen(str));
   SolveCorners();
   strcpy(str,"\nCorners Finished\n");
   if (fh)
    Write(fh,str,strlen(str));
   strcpy(str,"Check For Finished Layers");
   Space2();
   Text(rpG,str,strlen(str));
   strcat(str,"\n");
   if (fh)
    Write(fh,str,strlen(str));
  }
 strcpy(str,"Now finish Centers of Upper layer\n");
 if (fh)
 Write(fh,str,strlen(str));
 FinishLayers(); /* this is sub 2240 */
 CurrentTime(&s2,&m2);
 s2 -= s1;
 sprintf(str,"Cube solved in %d secs.",s2);
 Space2();
 Text(rpG,str,strlen(str));
 strcat(str,"\n");
 if (fh)
  Write(fh,str,strlen(str));
 if (fh)
  Close(fh);
 fh = 0L;
}



void DoHorizontal()
{
 int i;

 PlotOn = 0;
 DoRight();
 DoLeft();
 DoLeft();
 DoLeft();
 for(i=0;i<9;i++)
  x[i] = frontface[i];
 frontface[1] = downface[1];
 frontface[4] = downface[4];
 frontface[7] = downface[7];
 downface[1] = backface[7];
 downface[4] = backface[4];
 downface[7] = backface[1];
 backface[1] = upperface[7];
 backface[4] = upperface[4];
 backface[7] = upperface[1];
 upperface[1] = x[1];
 upperface[4] = x[4];
 upperface[7] = x[7];
 PlotOn = 1;
 Plot();
}

void DoVertical()
{
 int i;

 PlotOn = 0;
 DoUp();
 DoDown();
 DoDown();
 DoDown();
 for(i=0;i<9;i++)
  x[i] = leftface[i];
 for(i=3;i<6;i++)
  {
   leftface[i] = frontface[i];
   frontface[i] = rightface[i];
   rightface[i] = backface[i];
   backface[i] = x[i];
  }
 PlotOn = 1;
 Plot();
}

void DoForward()
{
 int i;

 for(i=0;i<9;i++)
  x[i] = frontface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  frontface[i] = x[i];
 for(i=0;i<9;i++)
  x[i] = upperface[i];
 upperface[6] = leftface[8];
 upperface[7] = leftface[5];
 upperface[8] = leftface[2];
 leftface[2] = downface[0];
 leftface[5] = downface[1];
 leftface[8] = downface[2];
 downface[0] = rightface[6];
 downface[1] = rightface[3];
 downface[2] = rightface[0];
 rightface[0] = x[6];
 rightface[3] = x[7];
 rightface[6] = x[8];
 Plot();
}

void DoBack()
{
 int i;
 
 for(i=0;i<9;i++)
  x[i] = backface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  backface[i] = x[i];
 for(i=0;i<9;i++)
  x[i] = upperface[i];
 upperface[0] = rightface[2];
 upperface[1] = rightface[5];
 upperface[2] = rightface[8];
 rightface[2] = downface[8];
 rightface[5] = downface[7];
 rightface[8] = downface[6];
 downface[6] = leftface[0];
 downface[7] = leftface[3];
 downface[8] = leftface[6];
 leftface[0] = x[2];
 leftface[3] = x[1];
 leftface[6] = x[0];
 Plot();
}

void DoRight()
{
 int i;
 
 for(i=0;i<9;i++)
  x[i] = rightface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  rightface[i] = x[i];
 for(i=0;i<9;i++)
  x[i] = upperface[i];
 for(i=2;i<9;i+=3)
  {
   upperface[i] = frontface[i];
   frontface[i] = downface[i];
  }
 downface[2] = backface[6];
 downface[5] = backface[3];
 downface[8] = backface[0];
 backface[0] = x[8];
 backface[3] = x[5];
 backface[6] = x[2];
 Plot();
}

void DoLeft()
{
 int i;

 for(i=0;i<9;i++)
  x[i] = leftface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  leftface[i] = x[i];
 for(i=0;i<9;i++)
  x[i] = upperface[i];
 upperface[0] = backface[8];
 upperface[3] = backface[5];
 upperface[6] = backface[2];
 backface[2] = downface[6];
 backface[5] = downface[3];
 backface[8] = downface[0];
 for(i=0;i<7;i+=3)
  {
   downface[i] = frontface[i];
   frontface[i] = x[i];
  }
 Plot();
}

void FaceRotate()
{
 int i;

 y[0] = x[6];
 y[1] = x[3];
 y[2] = x[0];
 y[3] = x[7];
 y[4] = x[4];
 y[5] = x[1];
 y[6] = x[8];
 y[7] = x[5];
 y[8] = x[2];
 for(i=0;i<9;i++)
  x[i] = y[i];
}

void DoUp()
{
 register long i;

 for(i=0;i<9;i++)
  x[i] = upperface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  upperface[i] = x[i];
 for(i=0;i<9;i++)
  x[i] = leftface[i];
 for(i=0;i<3;i++)
  {
   leftface[i] = frontface[i];
   frontface[i] = rightface[i];
  }
 for(i=0;i<3;i++)
  {
   rightface[i] = backface[i];
   backface[i] = x[i];
  }
 Plot();
}

void DoDown()
{
 int i;
 for(i=0;i<9;i++)
  x[i] = downface[i];
 FaceRotate();
 for(i=0;i<9;i++)
  downface[i] = x[i];
 for(i=0;i<6;i++)
  x[i] = 0;
 x[6] = leftface[6];
 x[7] = leftface[7];
 x[8] = leftface[8];
 for(i=6;i<9;i++)
  {
   leftface[i] = backface[i];
   backface[i] = rightface[i];
  }
 for(i=6;i<9;i++)
  {
   rightface[i] = frontface[i];
   frontface[i] = x[i];
  }
 Plot();
}

void DoAbout()
{
 struct Window *wG3;
 struct IntuiMessage *message;

 if (!(wG3 = OpenWindow(&NewWindowStructure2)))
  return;
 PrintIText(wG3->RPort,&IntuiTextList2,0L,0L);
 WaitPort(wG3->UserPort);
 while(message = (struct IntuiMessage *)GetMsg(wG3->UserPort))
  ReplyMsg((struct Message *)message);
 CloseWindow(wG3);
}

void __regargs PrintText(Line,Row,str)
int Line,Row;
char *str;
{

 Move(rpG,(Row*7L),(Line*10L+2L+200L));
 Text(rpG,str,strlen(str));
}

void Plot()
{
 int i;
 UWORD code;
 ULONG class;
 char str[80];
 struct IntuiMessage *message;

 if ((message = (struct IntuiMessage *)GetMsg(wG->UserPort)))
  {
   class = message->Class;
   code = message->Code;
   ReplyMsg((struct Message *)message);
   if ((class == MOUSEBUTTONS)&&(code == SELECTDOWN))
    {
     aborted = 1;
     for(i=0;i<9;i++)
      {
       upperface[i] = 2;
       leftface[i] = 3;
       frontface[i] = 4;
       rightface[i] = 5;
       backface[i] = 6;
       downface[i] = 7;
      }
    strcpy(str,"\nAborted\n");
    if (fh)
     Write(fh,str,strlen(str));
    PlotOn = 1;
   }
  }
 if (!PlotOn)
  return;
 SetPointer(wG,WaitPtr,0x25L,0x10L,0L,0L);
 for(i=0;i<9;i++)
  {
   SetOPen(rpG,frontface[i]);
   SetAPen(rpG,frontface[i]);
   RectFill(rpG,RFills[i].x1,RFills[i].y1,RFills[i].x2,RFills[i].y2);
  }
 SetOPen(rpG,1L);
 for(i=0;i<9;i++)
  {
   if (ReadPixel(rpG,FFills[i].x,FFills[i].y) != upperface[i])
    {
     SetAPen(rpG,upperface[i]);
     AreaMove(rpG,Areas[i].x1,Areas[i].y1);
     AreaDraw(rpG,Areas[i].x2,Areas[i].y2);
     AreaDraw(rpG,Areas[i].x3,Areas[i].y3);
     AreaDraw(rpG,Areas[i].x4,Areas[i].y4);
     AreaEnd(rpG);
    }
  }
 for(i=9;i<18;i++)
  {
   if (ReadPixel(rpG,FFills[i].x,FFills[i].y) != rightface[(i-9)])
    {
     SetAPen(rpG,rightface[(i-9)]);
     AreaMove(rpG,Areas[i].x1,Areas[i].y1);
     AreaDraw(rpG,Areas[i].x2,Areas[i].y2);
     AreaDraw(rpG,Areas[i].x3,Areas[i].y3);
     AreaDraw(rpG,Areas[i].x4,Areas[i].y4);
     AreaEnd(rpG);
    }
  }
 SetOPen(rpG,0L);
 ClearPointer(wG);
}

void Init()
{
 ULONG *temp;
 unsigned char c;
 BPTR fh;
 register ULONG i;
 short done=0;
 short more;

 if ((fh = Open("InitCube",MODE_OLDFILE)))
  {
   i = 0;
   temp = &upperface[0];
   while(!done)
    {
     if (Read(fh,&c,1L) != 1L)
      {
       done = 1;
       for(i=0;i<9;i++)
        {
         upperface[i] = 2;
         leftface[i] = 3;
         frontface[i] = 4;
         rightface[i] = 5;
         backface[i] = 6;
         downface[i] = 7;
        }
       DisplayBeep(0L);
      }
     else
      {
       c = toupper(c);
       switch(c)
        {
         case 'G' : temp[i%9] = GREEN;
		    i++;
		    break;
         case 'O' : temp[i%9] = ORANGE;
		    i++;
		    break;
         case 'W' : temp[i%9] = WHITE;
		    i++;
		    break;
         case 'B' : temp[i%9] = BLUE;
		    i++;
		    break;
         case 'R' : temp[i%9] = RED;
		    i++;
		    break;
         case 'Y' : temp[i%9] = YELLOW;
		    i++;
		    break;
         case ';' : 
                    more = 1;
                    while(more)
                    {
	            if (Read(fh,&c,1L) != 1L)
                     {
		       done = 1;
		       for(i=0;i<9;i++)
		        {
		         upperface[i] = 2;
		         leftface[i] = 3;
		         frontface[i] = 4;
		         rightface[i] = 5;
		         backface[i] = 6;
		         downface[i] = 7;
		        }
		       DisplayBeep(0L);
                     }
                    else
                     {
                      if (c == '\n')
                       more = 0;
                     }
                    }
                    break;
        }
       if (i==9)
        temp = &leftface[0];
       else if (i==18)
        temp = &frontface[0];
       else if (i==27)
        temp = &rightface[0];
       else if (i==36)
        temp = &backface[0];
       else if (i==45)
        temp = &downface[0];
       else if (i==54)
        done = 1;
      }
    }
   Close(fh);
  }
 else
  {
   for(i=0;i<9;i++)
    {
     upperface[i] = 2;
     leftface[i] = 3;
     frontface[i] = 4;
     rightface[i] = 5;
     backface[i] = 6;
     downface[i] = 7;
    }
  }
 DrawCube();
 Plot();
}



void __regargs CalcRealXY(x,y,z,realx,realy)
int x,y,z;
long *realx,*realy;
{
 x = x + X0;
 y = y + Y0;
 *realx = x+(z)/2;
 *realy = y+(z)/2;
 *realy = abs(*realy - HEIGHT + 1);
 *realx *= 6;
 *realx /= 5;
}

void Draw3D(x,y,z)
int x,y,z;
{
 long realx,realy;

 CalcRealXY(x,y,z,&realx,&realy);
 Draw(rpG,realx,realy);
}


void Move3D(x,y,z)
int x,y,z;
{
 long realx,realy;

 CalcRealXY(x,y,z,&realx,&realy);
 Move(rpG,realx,realy);
}

void DrawCube()
{
 /* Plot y + 2/3z and x + 2/3z for 3d point */

 SetAPen(rpG,1L);
 Move3D(0,0,0);
 Draw3D(SIZE,0,0);
 Draw3D(SIZE,SIZE,0);
 Draw3D(0,SIZE,0);
 Draw3D(0,0,0);
/* for outline of rubik */
 Move3D(0,SIZE,0);
 Draw3D(0,SIZE,SIZE);
 Draw3D(SIZE,SIZE,SIZE);
 Draw3D(SIZE,SIZE,0);
 Move3D(SIZE,SIZE,SIZE);
 Draw3D(SIZE,0,SIZE);
 Draw3D(SIZE,0,0);
/* for full outline
 Draw3D(0,0,SIZE);
 Draw3D(SIZE,0,SIZE);
 Draw3D(SIZE,0,0);
 Move3D(0,SIZE,0);
 Draw3D(0,SIZE,SIZE);
 Draw3D(SIZE,SIZE,SIZE);
 Draw3D(SIZE,SIZE,0);
 Move3D(0,SIZE,SIZE);
 Draw3D(0,0,SIZE);
 Move3D(SIZE,SIZE,SIZE);
 Draw3D(SIZE,0,SIZE);
*/

/* Draw Lines in Cube */
 Move3D(SIZE/3,0,0);
 Draw3D(SIZE/3,SIZE,0);
 Move3D(SIZE*2/3,0,0);
 Draw3D(SIZE*2/3,SIZE,0);
 Move3D(0,SIZE/3,0);
 Draw3D(SIZE,SIZE/3,0);
 Move3D(0,SIZE*2/3,0);
 Draw3D(SIZE,SIZE*2/3,0);
 Move3D(SIZE/3,SIZE,0);
 Draw3D(SIZE/3,SIZE,SIZE);
 Move3D(SIZE*2/3,SIZE,0);
 Draw3D(SIZE*2/3,SIZE,SIZE);
 Move3D(0,SIZE,SIZE/3);
 Draw3D(SIZE,SIZE,SIZE/3);
 Move3D(0,SIZE,SIZE*2/3);
 Draw3D(SIZE,SIZE,SIZE*2/3);
 Move3D(SIZE,SIZE/3,0);
 Draw3D(SIZE,SIZE/3,SIZE);
 Move3D(SIZE,SIZE*2/3,0);
 Draw3D(SIZE,SIZE*2/3,SIZE);
 Move3D(SIZE,0,SIZE/3);
 Draw3D(SIZE,SIZE,SIZE/3);
 Move3D(SIZE,0,SIZE*2/3);
 Draw3D(SIZE,SIZE,SIZE*2/3);

}




void main()
{
 PLANEPTR temp_bitplane;
 struct TmpRas *temp_buffer,temp_rast;
 int Mx,My;
 UWORD code;
 ULONG class;
#ifdef ASSd
 ULONG temp;
#endif
 APTR object;
 ULONG signals;
 struct AreaInfo myAreaInfo;
 struct IntuiMessage *message;	/* the message the IDCMP sends us */

#ifdef CPU020

 struct ExecBase **execbaseptr=(struct ExecBase **)4L;
 UWORD cpuid;
 struct ExecBase *execbase;

 execbase = *execbaseptr;
 cpuid = execbase->AttnFlags;
 if (!(cpuid & AFF_68020))
  {
   exit(0);
  }
#endif



 if (!(IntuitionBase = 
    (struct IntuitionBase *)OpenLibrary("intuition.library", 33L)))
  {
   exit(0);
  }
 if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 33L)))
  {
   CloseLibrary((struct Library *)IntuitionBase);
   exit(0);
  }
 if (!(myTextFont = OpenFont(&TOPAZ80)))
  {
   CloseLibrary((struct Library *)GfxBase);
   CloseLibrary((struct Library *)IntuitionBase);
   exit(0);
  }
 if (!(sC = OpenScreen(&NewScreenStructure)))
  {
   CloseFont(myTextFont);
   CloseLibrary((struct Library *)GfxBase);
   CloseLibrary((struct Library *)IntuitionBase);
   exit(0);
  }
 LoadRGB4(&(sC->ViewPort),Palette,PaletteColorCount);
 MyNewWindowStructure1.Screen = NewWindowStructure2.Screen = 
  NewWindowStructure1.Screen = sC;
 if (!(wG = OpenWindow(&NewWindowStructure1)))	/* open the window */
  {
   CloseScreen(sC);
   CloseFont(myTextFont);
   CloseLibrary((struct Library *)GfxBase);
   CloseLibrary((struct Library *)IntuitionBase);
   exit(0);
   }
  rpG = wG->RPort;	/* get a rastport pointer for the window */
  temp_buffer = rpG->TmpRas;
  if (!(temp_bitplane = AllocRaster(WIDTH,HEIGHT)))
   {
    CloseScreen(sC);
    CloseFont(myTextFont);
    CloseLibrary((struct Library *)GfxBase);
    CloseLibrary((struct Library *)IntuitionBase);
    exit(0);
   }
  rpG->TmpRas = InitTmpRas(&temp_rast,temp_bitplane,RASSIZE(WIDTH,HEIGHT));
  InitArea(&myAreaInfo,areabuffer,100L);
  rpG->AreaInfo = &myAreaInfo;
  SetFont(rpG,myTextFont);
  SetMenuStrip(wG,&MenuList1);	/* attach any Menu */
  Init();
  do
   {
	signals = Wait(WINDOWSIGNAL);
	if (signals & WINDOWSIGNAL)
		while( (message = (struct IntuiMessage *)
		GetMsg(wG->UserPort) ) != NULL)
		{
			Mx = message->MouseX;
			My = message->MouseY;
			class = message->Class;
			code = message->Code;
			object = message->IAddress;  /* Gadget */
			ReplyMsg((struct Message *)message);
			if ( class == MENUPICK )	/* MenuItems */
			 HandleEvent((APTR)ItemAddress(&MenuList1,code));
                        else if ((class == MOUSEBUTTONS)&&(code == SELECTDOWN))
                         {
#ifdef ASSd
			  onepoint++;
			  if (onepoint == 1)
			   {
			    xchg1 = MatchBox(Mx,My);
		   	    if (xchg1)
 			     SetPointer(wG,PickPtr,8L,0x10L,0L,0L);
			    else
			     onepoint = 0;
			   }
                          else
                           {
			    onepoint = 0;
			    ClearPointer(wG);
			    xchg2 = MatchBox(Mx,My);
			    if (xchg2)
			     {
			      temp = *xchg1;
			      *xchg1 = *xchg2;
			      *xchg2 = temp;
			      Plot();
			     }
                           }
#endif
                         }
		}
   } while (!done);
  rpG->TmpRas = temp_buffer;
  FreeRaster(temp_bitplane,WIDTH,HEIGHT);
  CloseWindow(wG);
  CloseFont(myTextFont);
  CloseScreen(sC);
  CloseLibrary((struct Library *)GfxBase);
  CloseLibrary((struct Library *)IntuitionBase);
}
