#ifndef OS_H
#define OS_H

#include <proto/exec.h>
#include <exec/memory.h>
#include <proto/dos.h>

#include <string.h>


#define OS_Malloc(x)	AllocVec( x, MEMF_CLEAR )
#define OS_Free(x)		FreeVec( x )

#define OS_Delay(x)		Delay( (x) / 20 )

#define OS_sprintf sprintf


/*
**	Datentypen
*/

/*	Aus exec/types.h:
typedef void				VOID;
typedef unsigned short		BOOL;
 define TRUE				1
 define FALSE				0
*/

typedef signed char			S8;			/*  8 bit mit Vorzeichen */
typedef unsigned char		U8;			/*  8 bit ohne Vorzeichen */
typedef signed short		S16;		/* 16 bit mit Vorzeichen */
typedef unsigned short		U16;		/*  8 bit ohne Vorzeichen */ 		
typedef signed long			S32;		/* 32 bit mit Vorzeichen */
typedef unsigned long		U32;		/* 32 bit ohne Vorzeichen */

typedef unsigned char 		*LPBYTE;	/* Pointer to application memory */
typedef VOID				*LPVOID;	/* Far pointer to void */

typedef VOID				(*CSS_CALLBACK)( U16, U32 );


/*
**	Gemeinsame Sachen
*/
#ifndef NULL
#define NULL			((VOID *)0L)
#endif

#ifndef FAR
#define FAR				/* Far-Attribut */
#endif


#ifdef NO_ODD_MEM_ACCESS
#define GET_U16(a)		(((U16)(*(U8 *)(a)) << 8) + ((U16)(*((U8 *)(a)+1))))
#else
#define GET_U16(a)		(*(U16 *)(a))
#endif


/*
**	Interrupt Control
*/
#define USES_DISABLE
#define DISABLE				Disable()
#define ENABLE				Enable()


/*
**	Lists and nodes
*/

typedef struct _Node
{
	struct _Node	*Succ;
	struct _Node	*Pred;
} IC_NODE;


typedef struct
{
	IC_NODE	*Head;
	IC_NODE	*Tail;
	IC_NODE	*TailPred;
} IC_LIST;

#define NEW_LIST(l) IC_LIST l = { (VOID *)&l.Tail, NULL, (VOID *)&l.Head }

#define DOLIST(list, node) \
	for (node=(VOID *)(list)->Head; ((IC_NODE *)(node))->Succ; \
	(node) = (VOID *)(((IC_NODE *)(node))->Succ))

#define ISLISTEMPTY(l)	(((l)->TailPred) == (IC_NODE *)(l))
#define NEWLIST(l)		{(l)->Head = (IC_NODE *)&(l)->Tail; (l)->Tail = NULL; (l)->TailPred = (IC_NODE *)&(l)->Head; }
#define ADDHEAD(l,n)	{IC_NODE *_s=(l)->Head; (l)->Head=(n); (n)->Succ=_s; (n)->Pred=(IC_NODE *)&(l)->Head; _s->Pred=(n);}
#define ADDTAIL(l,n)	{IC_NODE *_p=(l)->TailPred; (l)->TailPred=(n); (n)->Succ=(IC_NODE *)&(l)->Tail; (n)->Pred=_p; _p->Succ=(n);}
#define REMOVE(n)		{IC_NODE *_s=(n)->Succ, *_p=(n)->Pred; _p->Succ=_s; _s->Pred=_p;}


/*
**	Memory-Funktionen
*/
#define OS_memcpy( d, s, l )	memcpy( (d), (s), (size_t)(l) )
#define OS_memset( d, v, l )	memset( (d), (v), (size_t)(l) )
#define OS_memcmp( d, s, l )	memcmp( (d), (s), (size_t)(l) )


/*
**	Makro INTERNAL_ERROR
*/

#ifdef VERBOSE
#define INTERNAL_ERROR OS_InternalError( __FILE__, __LINE__ )
#else
#define INTERNAL_ERROR
#endif


#endif
