/* COMPILEER : ex amyatom !!!!!!! voor chipmem !!!! */

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

struct IntuitionBase *IntuitionBase = 0L;
struct GfxBase *GfxBase = 0L;
struct Window *ControlWindow = NULL;
struct ViewPort *vp;
struct RastPort *rp;
struct IntuiMessage *MyIntuiMessage;
struct UCopList *cl;

#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
}; 

 struct NewWindow NewControlWindow =
 { 
  0,0,
  640,200,
  0,0,
  MOUSEBUTTONS, /* !!!!!! IDCMP Flags !!!!!!!! */
  BORDERLESS|ACTIVATE|SMART_REFRESH,
  NULL, /* pointer to first gadget */
  NULL,
  (UBYTE *) "",
  NULL,
  NULL,
  0,0,
  640,200,
  WBENCHSCREEN
 };

LONG s1=10,s2=23428,ss=23428-10;
 /* s1 en s2 moeten hier geinit worden ! 
    Want verschillende functies gebruiken deze constante waarden ! */
int per=500, soundstopped=1;
short *sndbuffer;

main(argc,argv)
int argc;
char *argv[];
{
 LONG i;
 UWORD jm;
 VOID OpenALL(), CloseALL(), CleanUp(),StopSound();
 OpenALL();

 if(!(ControlWindow = (struct Window *) OpenWindow(&NewControlWindow))) CloseALL();

 rp=ControlWindow->RPort;
 vp=ViewPortAddress(ControlWindow);

 while((MyIntuiMessage = (struct IntuiMessage *)
         GetMsg(ControlWindow->UserPort))==NULL)
  {
      custom.aud[0].ac_per = per;
      custom.aud[1].ac_per = per;
      usecopper(jm++);
  }

    while(MyIntuiMessage=(struct IntuiMessage *)
     GetMsg(ControlWindow->UserPort)) ReplyMsg(MyIntuiMessage);
    CleanUp();
}
/* ************************************** end *************************** */

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

 if(!(IntuitionBase=(struct IntuitionBase *) OpenLibrary( "intuition.library",(LONG)LIBRARY_VERSION) ));
 {
   CloseALL();
 }

 /*==Graphics Library==*/

 if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",(LONG)LIBRARY_VERSION)));
 {
   CloseALL();
 }
}

VOID CloseALL()
{
 if(ControlWindow) CloseWindow(ControlWindow);
 if(GfxBase) CloseLibrary(GfxBase);
 if(IntuitionBase) CloseLibrary(IntuitionBase);
} 

VOID StopSound()
{
 if(soundstopped == 0)
 {
 custom.dmacon = 0x0003;
 FreeMem(sndbuffer,(long)ss);
 soundstopped = 1;
 }
}

VOID CleanUp()
{
 StopSound();
 FreeVPortCopLists(vp);RemakeDisplay();
 CloseALL();
}


MakeSound()
{
LoadSound();
if (soundstopped==0) PlaySong();
/* soundstopped=0 staat nu in PlaySong() */
}  

LoadSound()
{
FILE *fopen(), *fp;
SHORT *ptr, *AllocMem();
LONG i;

custom . dmacon = 0x0003;

fp = fopen("taon_3!","r");
if (fp == NULL) return(0);

sndbuffer = AllocMem((long)(ss),MEMF_CHIP);
ptr = sndbuffer;

for (i=0; i<s1; i++)
	getc(fp);

for (i=s1/2; i<s2/2; i++)
	{
	*ptr++ = getc(fp)*256 + getc(fp);
	}

fclose (fp);
soundstopped=0;
}

PlaySong()
{
custom . aud[0].ac_ptr = (UWORD *)sndbuffer;
custom . aud[0].ac_len = s2/2-s1/2;
custom . aud[0].ac_per = per;
custom . aud[0].ac_vol = 64;

custom . aud[1].ac_ptr = (UWORD *)sndbuffer;
custom . aud[1].ac_len = s2/2-s1/2;
custom . aud[1].ac_per = per;
custom . aud[1].ac_vol = 64;

custom . dmacon = 0x8203;
}


usecopper(j)
UWORD j;
{
  UWORD i;
  void *dspins,*sprins,*clrins;  

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

    for(i=0;i<AANTCOL*2-1;i++)
    {
    CWAIT(cl,100-45*2+i,i);
    CMOVE(cl,custom.color[0],colors[(i+j) % AANTCOL]);
    }

/*    for(i=50;i<151;i++)
    {
    CWAIT(cl,i,319);
    CMOVE(cl,custom.color[0],0x00F);
    CWAIT(cl,i,639);
    CMOVE(cl,custom.color[0],0x000);
    }
*/
    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();
}  


