#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif
typedef	void (*__fptr)();
/*------ special functions ---------------------------------------------*/
ULONG	Supervisor( ULONG(*)() );
void	InitCode(ULONG, ULONG);
void	InitStruct(char *, char *, ULONG);
struct	Library *MakeLibrary(ULONG**, char *, __fptr, ULONG, char *);
void	MakeFunctions(char *, ULONG**, ULONG);
struct	Resident *FindResident(char *);
void	InitResident(struct Resident *, char *);
void	Alert(ULONG);
void	Debug(ULONG);
/*------ interrupts ----------------------------------------------------*/
void	Disable(void);
void	Enable(void);
void	Forbid(void);
void	Permit(void);
ULONG	SetSR(ULONG, ULONG);
void *	SuperState(void);
void	UserState(void *);
struct	Interrupt *SetIntVector(long, struct Interrupt *);
void	AddIntServer(long, struct Interrupt *);
void	RemIntServer(long, struct Interrupt *);
void	Cause(struct Interrupt *);
/*------ memory allocation: ---------------------------------------------*/
void  *	Allocate(struct MemHeader *, ULONG);
void	Deallocate(struct MemHeader *, void *, ULONG);
void  *	AllocMem(ULONG, ULONG);
void  *	AllocAbs(ULONG, void *);
void	FreeMem(void *, ULONG);
ULONG	AvailMem(ULONG);
struct	MemList * AllocEntry(struct MemList *);
void	FreeEntry(struct MemList *);
/*------ lists: ---------------------------------------------------------*/
void	Insert(struct List *, struct Node *, struct Node *);
void	AddHead(struct List *, struct Node *);
void	AddTail(struct List *, struct Node *);
void	Remove(struct Node *);
struct	Node *RemHead(struct List *);
struct	Node *RemTail(struct List *);
void	Enqueue(struct List *, struct Node *);
struct	Node *FindName(struct List *, char *);
/*------ tasks: ---------------------------------------------------------*/
ULONG AddTask(struct Task *, void *, void *);
void	RemTask(struct Task *);
struct Task *FindTask(char *);
long	SetTaskPri(struct Task *, long);
ULONG	SetSignal(ULONG, ULONG);
ULONG	SetExcept(ULONG, ULONG);
ULONG	Wait(ULONG);
void	Signal(struct Task *, ULONG);
long	AllocSignal(long);
void	FreeSignal(long);
long	AllocTrap(long);
void	FreeTrap(long);
/*------ messages: ------------------------------------------------------*/
void	AddPort(struct MsgPort *);
void	RemPort(struct MsgPort *);
void	PutMsg(struct MsgPort *, struct Message *);
struct	Message *GetMsg(struct MsgPort *);
void	ReplyMsg(struct Message *);
struct Message *WaitPort(struct MsgPort *);
struct MsgPort *FindPort(char *);
/*------ libraries: -----------------------------------------------------*/
void	AddLibrary(struct Library *);
void	RemLibrary(struct Library *);
struct Library *OldOpenLibrary(char *);
void	CloseLibrary(struct Library *);
__fptr SetFunction(struct Library *, ULONG, __fptr);
void	SumLibrary(struct Library *);
/*------ devices: -------------------------------------------------------*/
void	AddDevice(struct Device *);
void	RemDevice(struct Device *);
struct Device *OpenDevice(char *, ULONG, struct IORequest *, ULONG);
void	CloseDevice(struct IORequest *);
LONG	DoIO(struct IORequest *);
void	SendIO(struct IORequest *);
ULONG CheckIO(struct IORequest *);
ULONG WaitIO(struct IORequest *);
void AbortIO(struct IORequest *);
/*------ resources: ----------------------------------------------------*/
void	AddResource(struct Resource *);
void	RemResource(struct Resource *);
struct Resource *OpenResource(char *);
/*------ new functions:*/
void RawDoFmt(char *,void *,void(*)(),char *);
ULONG	GetCC(void);
ULONG	TypeOfMem(void *);
ULONG Procure(struct Semaphore *, struct Message *);
void Vacate(struct Semaphore *);
struct Library *OpenLibrary(char *, ULONG);
/*------ 1.2 new semaphore support*/
void	InitSemaphore(struct SignalSemaphore *);
void	ObtainSemaphore(struct SignalSemaphore *);
void	ReleaseSemaphore(struct SignalSemaphore *);
ULONG AttemptSemaphore(struct SignalSemaphore *);
void	ObtainSemaphoreList(struct List *);
void	ReleaseSemaphoreList(struct List *);
struct SignalSemaphore *FindSemaphore(char *);
void	AddSemaphore(struct SignalSemaphore *);
void	RemSemaphore(struct SignalSemaphore *);
/*------ 1.2 rom "kickstart" support + memory support*/
void	SumKickData(void);
ULONG	AddMemList(ULONG, ULONG, ULONG, char *, char *);
void	CopyMem(void *, void *, ULONG);
void	CopyMemQuick(void *, void *, ULONG);
/*------ V1.4 functions ---------------------*/
void	CacheFlushU(ULONG);
void	CacheFlushE(ULONG);
ULONG	CacheControl(ULONG,ULONG);
void  *	CreateIORequest(struct MsgPort *,ULONG);
void	DeleteIORequest(void *);
struct MsgPort * CreateMsgPort(void);
void	DeleteMsgPort(struct MsgPort *);
void	ObtainSemaphoreShared(struct SignalSemaphore *);
/*------ more memory tools (note strange register on FreeVec() -------*/
void  *	AllocVec(ULONG,ULONG);
void	FreeVec(void *);
void	ExecReserved00(ULONG);
void	ExecReserved01(ULONG);
void	ExecReserved02(ULONG);
void	ExecReserved03(ULONG);

/*------ Common support library functions ---------*/
void	BeginIO(struct IORequest *);
struct	IORequest *CreateExtIO(struct MsgPort *, ULONG);
struct	MsgPort *CreatePort(char *, ULONG);
struct	IOStdReq *CreateStdIO(struct MsgPort *);
struct	Task *CreateTask(char *, unsigned char, APTR, ULONG);
void	DeleteExtIO(struct IORequest *);
void	DeletePort(struct MsgPort *);
void	DeleteStdIO(struct IOStdReq *);
void	DeleteTask(struct Task *);
void	NewList(struct List *);
