#include <exec/exec.h>
#include <exec/memory.h>
#include <libraries/dos.h>

#define IRQ_MUSIC_LEN   5066
#define CUSTOM_IRQ_LEN   254
#define MUSIC_LEN      38090
#define MUSIC_NAME  "Pink.a"
#define MUSIC_NUM          1

LONG *IRQ_Music,*Custom_IRQ,*Music;
UBYTE *Parameter;
LONG File;

/* Die nachfolgende Prozedur reserviert Speicher und liest alle */
/* drei Programmteile ein. Falls ein Fehler auftritt wird FALSE */
/* zurückgeliefert */

BOOL open_all()
{
   if((IRQ_Music=AllocMem(IRQ_MUSIC_LEN,MEMF_CHIP))==0)
      return(FALSE);
   if((Custom_IRQ=AllocMem(CUSTOM_IRQ_LEN,MEMF_CHIP))==0)
      return(FALSE);
   if((Music=AllocMem(MUSIC_LEN,MEMF_CHIP))==0)
      return(FALSE);
   if((File=Open("IRQ_Music.Code",MODE_OLDFILE))==0)
      return(FALSE);
   Read(File,IRQ_Music,IRQ_MUSIC_LEN);
   Close(File);
   if((File=Open("Custom_IRQ.Code",MODE_OLDFILE))==0)
      return(FALSE);
   Read(File,Custom_IRQ,CUSTOM_IRQ_LEN);
   Close(File);
   if((File=Open(MUSIC_NAME,MODE_OLDFILE))==0)
      return(FALSE);
   Read(File,Music,MUSIC_LEN);
   Close(File);
   return(TRUE);
}

/* Die nachfolgende Prozedur gibt sämtlichen schon belegten */
/* Speicherplatz wieder frei */

VOID close_all()
{
   if(IRQ_Music!=0)
      FreeMem(IRQ_Music,IRQ_MUSIC_LEN);
   if(Custom_IRQ!=0)
      FreeMem(Custom_IRQ,CUSTOM_IRQ_LEN);
   if(Music!=0)
      FreeMem(Music,MUSIC_LEN);
}

/* Ab hier Hauptprogramm */

main()
{
   if(open_all()==FALSE)
      {
         printf("Fehler beim Initialisieren!!\n");
         close_all();
         exit(FALSE);
      }
   *(Custom_IRQ+2)=IRQ_Music;
   *(Custom_IRQ+1)=Music;
   Parameter=(Custom_IRQ+3);
   *(Parameter)=MUSIC_NUM;
   printf("<%s> wird abgespielt\n",MUSIC_NAME);
   start_();
   getchar();
   stop_();
   printf("Musik gestoppt !\n");
   close_all();
   exit(TRUE);
}

/* Nun folgen noch die zwei Maschinenroutinen zum Starten und */
/* Stoppen der Musik */

#asm

_start_
         movem.l d0-d7/a0-a6,-(sp)
         move.l _Custom_IRQ,a1
         jsr (a1)
         movem.l (sp)+,d0-d7/a0-a6
         rts

_stop_
         movem.l d0-d7/a0-a6,-(sp)
         move.l _Custom_IRQ,a1
         jsr 2(a1)
         movem.l (sp)+,d0-d7/a0-a6
         rts

#endasm

/* ---------------------------------------------------------------- */
