#include "exec/types.h"
#include "exec/memory.h"
#include "graphics/gfxmacros.h"
#include "graphics/copper.h"
#include "intuition/intuition.h"

#include "hardware/custom.h"


struct IntuitionBase *IntuitionBase;
struct Window *NoBorder;
struct GfxBase *GfxBase;
struct Screen *Scrn;
struct IntuiMessage *mesg;
struct RastPort *r;
struct ViewPort *vp;

#define MAXW  320 /* max width van window ! */
#define MAXH  200 /* max height van window ! */
#define HALFMAXH MAXH/2-1

struct NewScreen NewScrn = {
        0, 0,           /* LeftEdge, TopEdge */
        320,200,       /* Width, Height */
        5,              /* Depth */
        0, 1,           /* DetailPen, BlockPen */
        NULL,           /* ViewModes ... value of 0 = low resolution */
        CUSTOMSCREEN,   /* Type of screen */
        NULL,           /* Font to be used as default for this screen */
        NULL,           /* DefaultTitle for its title bar */
        NULL,           /* screens user-gadgets, always NULL, ignored */
        NULL };         /* address of custom bitmap for screen */

struct NewWindow NewNoBorder = {
        0,              /* LeftEdge */
        0,              /* TopEdge  */
        MAXW, MAXH,     /* Width, Height of this window */
        -1,             /* DetailPen */
        -1,             /* BlockPen */
        MOUSEBUTTONS,   /* IDCMP Flags */
        ACTIVATE|NOCAREREFRESH|BORDERLESS|GIMMEZEROZERO|BACKDROP,
                        /* Window Flags:  (see below for more info) */
        NULL,           /* FirstGadget */
        NULL,           /* CheckMark   */
        NULL,           /* Window title */
        NULL,           /* Pointer to Screen if not workbench */
        NULL,           /* Pointer to BitMap if a SUPERBITMAP window */
        0, 0,           /* minimum width, minimum height */
        0,0,            /* maximum width, maximum height */
        CUSTOMSCREEN    /* type waarin window opend */
        };


#define INTUITION_REV 29
#define GRAPHICS_REV 29

#define AANTCOL 90

 UWORD colors[AANTCOL] =
 {
 0X100,0X200,0X300,0X420,0X520,
 0X620,0X740,0X840,0X940,0Xa60,
 0Xb60,0Xc60,0Xd80,0Xe80,0Xf80,

 0Xf80,0Xe80,0Xd80,0Xc60,0Xb60,
 0Xa60,0X940,0X840,0X740,0X620,
 0X520,0X420,0X300,0X200,0X100,

 0X100,0X200,0X300,0X420,0X520,
 0X620,0X740,0X840,0X940,0Xa60,
 0Xb60,0Xc60,0Xd80,0Xe80,0Xf80,

 0Xf80,0Xe80,0Xd80,0Xc60,0Xb60,
 0Xa60,0X940,0X840,0X740,0X620,
 0X520,0X420,0X300,0X200,0X100,

 0X100,0X200,0X300,0X420,0X520,
 0X620,0X740,0X840,0X940,0Xa60,
 0Xb60,0Xc60,0Xd80,0Xe80,0Xf80,

 0Xf80,0Xe80,0Xd80,0Xc60,0Xb60,
 0Xa60,0X940,0X840,0X740,0X620,
 0X520,0X420,0X300,0X200,0X100
 }; 


main()
{
 ULONG mclass;
 SHORT len,einde,i,j,k,zijde,xnul,ynul;
 UWORD jm;
 char *txt[10];



 VOID OpenALL();

 OpenALL();

 if((Scrn = (struct Screen *) OpenScreen(&NewScrn)) == 0) exit(10);
 
 NewNoBorder.Screen = Scrn;

 if((NoBorder = (struct Window *) OpenWindow(&NewNoBorder)) == 0) exit(20);

 /* ======geen screentitel====== */

 ShowTitle(Scrn,0);

 /* ======definitie van RPort !====== */

 r=NoBorder->RPort;
 vp=ViewPortAddress(NoBorder);


  for(i=1;i<32;i++) SetRGB4(vp,i,0,i%16,16-i%16);

  SetRGB4(vp,0,0,0,0);

/* init variabelen */

 zijde = 10;

 for(j=0;j<10;j++)
 {
  for(i=0;i<10;i++)
  {
   SetAPen(r,1+((i+j)%31));
   xnul = 59;ynul = 0;
   RectFill(r,xnul+zijde*i,ynul+zijde*j,xnul+zijde*(i+1),ynul+zijde*(j+1));
   RectFill(r,xnul+zijde*j,ynul+zijde*i,xnul+zijde*(j+1),ynul+zijde*(i+1));

   xnul = 259;ynul = 0;
   RectFill(r,xnul-zijde*(i+1),ynul+zijde*j,xnul-zijde*i,ynul+zijde*(j+1));
   RectFill(r,xnul-zijde*(j+1),ynul+zijde*i,xnul-zijde*j,ynul+zijde*(i+1));
   
   xnul = 59;ynul = 200;
   RectFill(r,xnul+zijde*i,ynul-zijde*(j+1),xnul+zijde*(i+1),ynul-zijde*j);
   RectFill(r,xnul+zijde*j,ynul-zijde*(i+1),xnul+zijde*(j+1),ynul-zijde*i);

   xnul = 259;ynul = 200;
   RectFill(r,xnul-zijde*(i+1),ynul-zijde*(j+1),xnul-zijde*i,ynul-zijde*j);
   RectFill(r,xnul-zijde*(j+1),ynul-zijde*(i+1),xnul-zijde*j,ynul-zijde*i);
  }
 }

  
 


 /* ======einde in stijl !====== */
einde=0;
while(!einde)
 {
  while((mesg=(struct IntuiMessage *)
    GetMsg(NoBorder->UserPort))==NULL)
  {
     for(j=0;j<20;j++)
      for(i=1;i<32;i++) SetRGB4(vp,i,0,(i+j)%16,16-(i+j)%16);
     for(j=19;j>=0;j--)
      for(i=31;i>=1;i--) SetRGB4(vp,i,0,(i+j)%16,16-(i+j)%16);
  }

  ReplyMsg(mesg);
  mclass=mesg->Class;


  if(mclass==MOUSEBUTTONS)
   {
     einde=1;

     txt[1]="\n\nBAMIGA SECTOR ONE : \nYou'd better contact us ... at POSTBUS 163, 2018 ANTWERP, BELGIUM!\n";
     txt[2]="Greetings go to :\n";
     txt[3]="THE KENT TEAM, RGB CANADA, THE GENERAL, ADJ, TLC, DESTROYER,";
     txt[4]="THE MOVERS, HOTLINE, BST (Fine imports !), ACTION 2009, DANISH GOLD,";
     txt[5]="THE WEB INC., IRATA, 1001 CREW, JOSTEIN, ACS and all good friends!\n";
     txt[6]="Special Greetings go to :\n";
     txt[7]="THE STARFRONTIERS and JEFF in Kentucky, USA!";
     txt[8]="";
     txt[9]="BAMIGA SECTOR ONE : Leading the way for Belgium on the Amiga!\n\n";

     for(i=1;i<10;i++)puts(txt[i]);
 

     SetAPen(r,0);
     SetDrPt(r,0xAAAA);
     for(i=0;i<160;i+=2)
     {
      Move(r,159-i,0);Draw(r,159-i,MAXH);
      Move(r,160+i,0);Draw(r,160+i,MAXH);
     }
     for(i=1;i<160;i+=2)
     {
      Move(r,159-i,0);Draw(r,159-i,MAXH);
      Move(r,160+i,0);Draw(r,160+i,MAXH);
     }

     SetDrPt(r,0xffff);
     for(i=0;i<160;i+=2)
     {
      Move(r,159-i,0);Draw(r,159-i,MAXH);
      Move(r,160+i,0);Draw(r,160+i,MAXH);
     }
     for(i=1;i<160;i+=2)
     {
      Move(r,159-i,0);Draw(r,159-i,MAXH);
      Move(r,160+i,0);Draw(r,160+i,MAXH);
     }
     

     FreeVPortCopLists(vp);RemakeDisplay();
     CloseWindow(NoBorder);
     CloseScreen(Scrn);
     CloseLibrary(GfxBase);

   }
 }

} 
/********************************** einde van main **********************/

VOID OpenALL()
{
 /*==Intuition==*/

 IntuitionBase=(struct IntuitionBase *)
            OpenLibrary("intuition.library",INTUITION_REV);

 if(IntuitionBase==NULL)
    exit(FALSE);

 /*==Graphics Library==*/

 GfxBase=(struct GfxBase *)
          OpenLibrary("graphics.library",GRAPHICS_REV);

 if(GfxBase==NULL)
    exit(FALSE);

}


PrintAt(rast,x,y,s)
struct RastPort *rast;
int x,y;
char *s;
{
 Move(rast,x,y);
 Text(rast,s,strlen(s));
}

usecopper(j)
UWORD j;
{
  UWORD i;
  struct UCopList *cl;
  void *dspins,*sprins,*clrins;
  short k,n;

  cl = AllocMem(sizeof(struct UCopList),MEMF_PUBLIC|MEMF_CLEAR,MEMF_CHIP);


     for(n=0;n<100;n++)
     {
      CWAIT(cl,n,0); 
      CMOVE(cl,custom.color[5],colors[(n+j) % 50]);
     }

     for(n=0;n<100;n++)
     {
      CWAIT(cl,100+n,0); 
      CMOVE(cl,custom.color[5],colors[49-((n+j) % 50)]);
     }


    CEND(cl);

    dspins=vp->DspIns; sprins=vp->SprIns; clrins=vp->ClrIns;

    Forbid();
     vp->DspIns=vp->SprIns=vp->ClrIns=0;
     FreeVPortCopLists(vp);
     vp->DspIns=dspins; vp->SprIns = sprins; vp->ClrIns=clrins;
     vp->UCopIns=cl;
    Permit();
 
    RethinkDisplay();
}  






