/***********************************
*                                  *
* Janus.h aus Amiga INTERN         *
*                                  *
***********************************/

#ifndef JANUS
#define JANUS
#define RPTR SHORT

#include <SetupSig.h>
#include <Services.h>

struct JanusRemember
{
	RPTR	NextRemember;
	RPTR	Offset;
	USHORT	Size;
	USHORT	Type;
	};

#define	MEM_TYPEMASK		0x00FF
#define	MEMF_PARAMETER		1
#define	MEMF_BUFFER		2
#define	MEM_ACCESSMASK		0x3000
#define	MEM_BYTEACCESS		0x0000
#define	MEM_WORDACCESS		0x1000
#define	MEM_GRAPHICACCESS	0x2000
#define	MEM_IOACCESS		0x3000

extern SHORT	AddService(struct ServiceData **data, ULONG appID, USHORT locID, USHORT size, USHORT type, SHORT sigNr, USHORT flags);
extern void	CallService(struct ServiceData *data);
extern void	DeleteService(struct ServiceData *data);
extern SHORT	GetService(struct ServiceData **data, ULONG appID, USHORT locID, SHORT sigNr, USHORT flags);
extern void	ReleaseService(struct ServiceData *data);
extern void	UnlockServiceData(struct ServiceData *data);
extern void	LockServiceData(struct ServiceData *data);
extern APTR	AllocJanusMem(ULONG size, ULONG type);
extern APTR	AllocJRemember(struct JanusRemember **jrememberkey, USHORT size, USHORT type);
extern APTR	AllocServiceMem(struct ServiceData *data, USHORT size, USHORT type);
extern void	AttachRemember(struct JanusRemember **tokey, struct JanusRemember **fromkey);
extern void	FreeJanusMem(APTR ptr, ULONG size);
extern void	FreeJRemember(struct JanusRemember **jrememberkey, BOOL reallyforget);
extern void	FreeServiceMem(struct ServiceData *data, APTR ptr);
extern APTR	GetJanusStart(void);
extern APTR	JanusMemBase(ULONG type);
extern USHORT	JanusMemToOffset(APTR ptr);
extern ULONG	JanusMemType(APTR ptr);
extern APTR	JanusOffsetToMem(USHORT offset, USHORT type);
extern void	JBCopy(APTR source, APTR dest, ULONG len);
extern void	JanusLock(UBYTE *byteptr);
extern BOOL	JanusLockAttempt(UBYTE *byteptr);
extern void	JanusUnlock(UBYTE *byteptr);
extern BYTE *	MakeBytePtr(APTR ptr);
extern BYTE *	MakeWordPtr(APTR ptr);
extern APTR	TranslateJanusPtr(APTR ptr, USHORT type);
extern ULONG	CheckJanusInt(ULONG janusintnr);
extern void	CleanupJanusSig(struct SetupSig *setupsig);
extern SHORT	GetParamOffset(ULONG janusintnr);
extern void	SendJanusInt(ULONG janusintnr);
extern ULONG	SetJanusEnable(ULONG janusintnr, ULONG enable);
extern APTR	SetJanusHandler(ULONG janusintnr, APTR inthandler);
extern ULONG	SetJanusRequest(ULONG janusintnr, ULONG request);
extern USHORT	SetParamOffset(ULONG janusintnr, USHORT offset);
extern struct SetupSig *	SetupJanusSig(USHORT janusintnr, USHORT signr, ULONG size, ULONG type);

#endif
