/*      MIDI.C

   Bibliothek zur Benutzung der
   Midi-Schnittstelle des Amiga

   Version für Aztec C3.4,16Bit

   (C) 1988 O.Wagner
            Landsberge 5
            4322 Sprockhövel 2

*/

#include "midi.h"
#include <functions.h> 

static char *sername=SERIALNAME;
static struct MsgPort *ReadPort,*WritePort,*CreatePort();
static struct IOExtSer *Read_Request,*Write_Request,*CreateExtIO();
static unsigned char ReadB,WriteB;

/* (int)midiopen()
   öffnet und initialisiert die Serielle Schnittstelle
   zum Midi-Betrieb */

int midiopen()
{
 Read_Request=CreateExtIO((ReadPort=CreatePort(0L,0L)),(LONG)sizeof(struct IOExtSer));
 Read_Request->io_SerFlags=SERF_SHARED|SERF_RAD_BOOGIE;
 if(OpenDevice(sername,NULL,Read_Request,NULL)) {
  DeleteExtIO(Read_Request);
  DeletePort(ReadPort);
  return(ERROR_NO_READ_DEVICE);
 }
 Read_Request->IOSer.io_Length =1;
 Read_Request->IOSer.io_Data   =(APTR)&ReadB;
 Read_Request->io_Baud         =31250;
 Read_Request->io_ReadLen      =8;
 Read_Request->io_WriteLen     =8;
 Read_Request->io_CtlChar      =0xf4f4f4f4L;
 Read_Request->IOSer.io_Command=SDCMD_SETPARAMS;
 DoIO(Read_Request); 
 Read_Request->IOSer.io_Command=CMD_READ;
 Write_Request=CreateExtIO((WritePort=CreatePort(0L,0L)),(LONG)sizeof(struct IOExtSer));
 Write_Request->io_SerFlags=SERF_SHARED|SERF_RAD_BOOGIE;
 Write_Request->io_StopBits=1;
 if(OpenDevice(sername,NULL,Write_Request,NULL)) {
  DeleteExtIO(Read_Request);
  DeletePort(ReadPort);
  DeleteExtIO(Write_Request);
  DeletePort(WritePort);
  return(ERROR_NO_WRITE_DEVICE);
 }
 Write_Request->IOSer.io_Command=CMD_WRITE;
 Write_Request->IOSer.io_Length =1;
 Write_Request->IOSer.io_Data   =(APTR)&WriteB;
 Write_Request->io_SerFlags     =SERF_SHARED|SERF_XDISABLED;
 BeginIO(Read_Request);
 return(ERROR_OK);
}

/* schliesst die Schnittstelle */
void midiclose()
{ 
 CloseDevice(Read_Request); 
 CloseDevice(Write_Request);
 DeleteExtIO(Read_Request);
 DeletePort(ReadPort);
 DeleteExtIO(Write_Request);
 DeletePort(WritePort);
} 

/* gibt ein zeichen (unsigned, int) aus */
void midiput(c)
register int c;
{
 WriteB=c;
 DoIO(Write_Request);
}

/* gibt einen string bekannter länge aus
   midiwrite(string,(int)länge) */
void midiwrite(s,l)
register char *s;
register int l;
{
 Write_Request->IOSer.io_Length=l;
 Write_Request->IOSer.io_Data=(APTR)s;
 DoIO(Write_Request);
 Write_Request->IOSer.io_Length=1;
 Write_Request->IOSer.io_Data=(APTR)&WriteB;
}


/* wartet und empfängt ein zeichen
   (unsigned, int) */
int midiget()
{
 register int c;

 WaitIO(Read_Request);
 c=ReadB;
 BeginIO(Read_Request);
 return(c);
}

/* testet, ob Zeichen empfangen, ansonsten -1 */
int midimayget()
{
 register int c;

 if(!CheckIO(Read_Request)) return(-1);
 WaitIO(Read_Request);
 c=ReadB;
 BeginIO(Read_Request);
 return(c);
} 

