/*
** ppc.library emulation
** (c)1998-99 Frank Wille <frank@phoenix.owl.de>
**
** PowerUp Message System
**
** V0.5d (27.03.1999) phx
**       Created.
*/

#ifndef MSGSYSTEM_H
#define MSGSYSTEM_H

#ifndef EXEC_LISTS_H
#include <exec/lists.h>
#endif

#ifndef MPSEMA_H
#include "mpsema.h"
#endif


struct PPCMsgPort {
  struct Node n;
  UBYTE flags;
  BYTE sigBit;
  void *sigTask;                        /* M68k or PPC task structure */
  struct MPSemaphore mpSema;            /* CPU and task arbitration */
  UBYTE reserved1[32];                  /* security gap */
  struct List msgList;                  /* list of PPCMessage structures */
  ULONG obtaincnt;                      /* port can only deleted if 0 */
  UBYTE reserved2[32];                  /* security gap */
};


struct PPCMessage {
  struct Node n;
  UWORD reserved;
  struct PPCMsgPort *replyPort;
  ULONG maxdatasize;
  ULONG msgid;
  void *data;
  ULONG datasize;
};


/* prototypes: PPC message system */
struct PPCMsgPort *createPPCMsgPort(struct PPCLibBase *,char *,ULONG *);
BOOL deletePPCMsgPort(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMsgPort *obtainPPCMsgPort(struct PPCLibBase *,char *);
BOOL releasePPCMsgPort(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMessage *waitPPCMessage(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMessage *getPPCMessage(struct PPCLibBase *,struct PPCMsgPort *);
BOOL putPPCMessage(struct PPCLibBase *,struct PPCMsgPort *,
                   struct PPCMessage *);
BOOL replyPPCMessage(struct PPCLibBase *,struct PPCMessage *);

#endif /* MSGSYSTEM_H */
