/**************************************************************************** Author: Fred Cassirer Date: January 24, 1987 This program is placed in the public domain, and from what I understand that means anyone can do whatever they want with it. That's fine because they are fairly trivial anyway ... If you can get someone to pay you for them, you must be doing something right. ****************************************************************************/ /* compiler directives to fetch the necessary header files */ #include #include #include #include #include #include #include #include "midi.h" #undef NULL #define NULL ((void *)0) extern long SetSignal(); breakcheck() { if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C ) return ( 1 ); else return( 0 ); } breakreset() { SetSignal(0L, SIGBREAKF_CTRL_C); } /* this routine causes manx to use this Chk_Abort() rather than it's own */ /* otherwise it resets our ^C when doing any I/O (even when Enable_Abort */ /* is zero). Since we want to check for our own ^C's */ Chk_Abort() { return(0); } /* declarations for the serial stuff */ extern struct MsgPort *CreatePort(); struct IOExtSer *Read_Request; static unsigned char rs_in[2]; struct IOExtSer *Write_Request; static unsigned char rs_out[2]; void initmidi() { Read_Request = (struct IOExtSer *)AllocMem((long)sizeof(*Read_Request),MEMF_PUBLIC|MEMF_CLEAR); Read_Request->io_SerFlags = SERF_SHARED | SERF_RAD_BOOGIE; Read_Request->IOSer.io_Message.mn_ReplyPort = CreatePort("Read_RS",0); if(OpenDevice(SERIALNAME,NULL,Read_Request,NULL)) { puts("Cant open Read device\n"); DeletePort(Read_Request->IOSer.io_Message.mn_ReplyPort); FreeMem(Read_Request,(long)sizeof(*Read_Request)); exit(TRUE); } Read_Request->IOSer.io_Length = 1; Read_Request->IOSer.io_Data = (APTR) &rs_in[0]; Read_Request->io_Baud = 31250; Read_Request->io_ReadLen = 8; Read_Request->io_WriteLen = 8; Read_Request->io_CtlChar = 1L; Read_Request->IOSer.io_Command = SDCMD_SETPARAMS; DoIO(Read_Request); Read_Request->IOSer.io_Command = CMD_READ; Write_Request = (struct IOExtSer *)AllocMem((long)sizeof(*Write_Request),MEMF_PUBLIC|MEMF_CLEAR); Write_Request->io_SerFlags = SERF_SHARED | SERF_RAD_BOOGIE; Write_Request->io_StopBits = 1; Write_Request->IOSer.io_Message.mn_ReplyPort = CreatePort("Write_RS",0); if(OpenDevice(SERIALNAME,NULL,Write_Request,NULL)) { puts("Can't open Write device\n"); DeletePort(Write_Request->IOSer.io_Message.mn_ReplyPort); FreeMem(Write_Request,(long)sizeof(*Write_Request)); DeletePort(Read_Request->IOSer.io_Message.mn_ReplyPort); FreeMem(Read_Request,(long)sizeof(*Read_Request)); exit(TRUE); } Write_Request->IOSer.io_Command = CMD_WRITE; Write_Request->IOSer.io_Length = 1; Write_Request->IOSer.io_Data = (APTR) &rs_out[0]; Write_Request->io_SerFlags = SERF_SHARED | SERF_XDISABLED; BeginIO(Read_Request); breakreset(); } void cleanup() { CloseDevice(Read_Request); DeletePort(Read_Request->IOSer.io_Message.mn_ReplyPort); FreeMem(Read_Request,(long)sizeof(*Read_Request)); CloseDevice(Write_Request); DeletePort(Write_Request->IOSer.io_Message.mn_ReplyPort); FreeMem(Write_Request,(long)sizeof(*Write_Request)); } /************************************************************/ /* send midi data to the serial port */ /************************************************************/ int putmidi(ch) int ch; { rs_out[0] = ch; DoIO(Write_Request); return(ch); } /******************************************************/ /* This routine will return an unsigned */ /* byte of midi data. */ /******************************************************/ int getmidi() { int c; Wait( (1L << Read_Request->IOSer.io_Message.mn_ReplyPort->mp_SigBit) | (SIGBREAKF_CTRL_C) ); if(CheckIO(Read_Request)) { WaitIO(Read_Request); c=rs_in[0]; BeginIO(Read_Request); } else c = NON_MIDI_EVENT; return(c); }