# if _MSC_VER < 600
	#define _fastcall
#endif

void far * dosalloc(long anzahl_bytes);
int        dosfree(void far * memory_ptr);
int        dosrealloc(void far * memory_ptr,long anzahl_bytes);

struct queue
    {
    unsigned short datalen;
    unsigned short wrp;         /* write pointer    */
    unsigned short rdp;         /* read pointer     */
    unsigned short count;       /* number of free chars */
    unsigned short stop:1;		/* nicht verwendet  */
    unsigned short xoffsend:1;	/* XON / XOFF gesendet */
	unsigned short reserved:14;
    unsigned char data[1];      /* raw data         */
    } ;

typedef struct queue far * QUEUE;


QUEUE qopen  (int queue_length_in_bytes);
int   qwrite (QUEUE qptr,void* buffer,int anzbytes);
int   qwritec(QUEUE qptr,char writeval);
int   qwritei(QUEUE qptr,int  writeval);
int   qread  (QUEUE qptr,void* buffer,int anzbytes);
int   qreadc (QUEUE qptr);
int   qreadi (QUEUE qptr);
# define qempty(QUEUE) (QUEUE->wrp == QUEUE->rdp)
# define qfree(QUEUE) (QUEUE->count)
int   qclose (QUEUE qptr);
void  qflush (QUEUE qptr);


#define T_PRALPHA  0
#define T_PRGRAFIK 1
#define T_PRCOPYSTART 2
#define T_PRCOPYEND   3
#define T_PRALPHASTART 4
#define T_PRALPHAEND   5
#define T_PRGELB	   6
#define T_PRROT		   7
#define T_PRBLAU   	   8
#define T_PRSCHW   	   9
#define T_PRGRLF   10
#define T_PRDISITALPHA  11

int t_print(char* buffer,int anzbytes,int printmode);
int t_print_clear();					/* clear output buffer		*/

int  t_create(int (*) (void),int,... );	/* returns TASK ID			*/
void t_next(void);						/* goto next task			*/
void t_nextn(int t_nextcount);			/* goto next task, n times 	*/
void t_sleep(int anz_milliseconds);		/* sleep (milliseconds), res. TICKTIME */
int  t_ownid(void);						/* return your own ID number */
void t_delete(int taskid);				/* delete TASK ID			*/

void ontimer     (int,void (*) (void));	/* every tick call function */
void ontimer_inc (int* memptr);			/* every tick increment var */

#define TICKTIME 55						/* 1 system interrupt = 55 millisec */

#define NORMAL 		0x0a				/* videoattribute */
#define INVERS 		0x70
#define DUNKEL 		0x02
#define BLINKEN  	0x80
#define HINTERLEGT 	0x2a
#define GRAU 		0x07
#define SCHWARZ_CYAN 0x30

#define MAX_LINES    50
#define MAX_COLUMNS  132
#define V_MAXCOL     132

int  v_dispats	(int zeile,int spalte,char* buffer,int attribute);
int  v_dispats_blank(int zeile,int spalte,char* buffer,int attribute,int length);
void v_dispat	(int zeile,int spalte,char* buffer,int attribute,int length);
void v_dispatc	(int zeile,int spalte,int c,int attribute);
void v_disset	(int zeile,int spalte,char  setval,int attribute,int length);
void vo_disset	(int offset,          char  setval,int attribute,int length);
void v_disget	(int zeile,int spalte,char* buffer,int length);
void vo_disget	(int offset,          char* buffer,int length);
void v_disgetw	(int zeile,int spalte,int * buffer,int length);
void vo_disgetw (int offset,          int * buffer,int length);
void v_dispatw	(int zeile,int spalte,int * buffer,int length);	
void vo_dispatw	(int offset          ,int * buffer,int length);	

void v_cls		(int attribute);
void v_cursto	(int zeile,int spalte);
int  v_printf   (int zeile,int spalte,int attribute,char* formatstring,...);
void v_selpage	(int pageno, int zeilen, int spalten);
void v_restorevideo(void);
void v_charset  (int block,int zeichenhoehe,char far *zeichensatz_ptr);
void v_charload (int block,int first,int anzchars,int zeichenhoehe
											,char far *zeichensatz_ptr);
void v_charread (int block,int first,char far * bufferptr);

void v_hexw		(int zeile,int spalte,int* buffer,int attribute,int length);

int hexd(void *array);
int hexdn(register void *array,register int anz);
int hexsd(register void *dest,void *src,int anz);





#define V_USE_NORMCURS  0					/* v_param() */
#define V_USE_BLOCKCURS 1
#define V_USE_SHOWCURS  2

void v_param(int);			

#define V_OUT(base,select,data) outpw(base,(select) | ((data) <<8))



long mikro_diff(void);		/* return mikroseconds since last call	*/
long mikro_abs(void);		/* return mikroseconds absolut since ?? */
long ticks_abs(void);		/* same for system ticks = 865 nanoseconds */

void push (void*,int);
int  pop  (void*);

int readstr (int,int,int,char*,char*,int,int,int (*) (void) );

void checkchg(long *);
void nullchk (long *,long,int,void (*) (int,...));

void meicpyf (void far *destptr,void far *srcptr,int length);
void meisetf (void far *destptr,int value       ,int length);
void meicpyfb(void far *destptr,void far *srcptr,int length);
int  meicmpf (void far *destptr,void far *srcptr,int length); /* -1 or index */
int  meixchg (void far *destptr,void far *srcptr,int length); /* -1 or index */

char *ignspace(char*);

int BIOS(int biosinterrupt,int functioncode,...);
extern char BIOS_FLAGS;
#define CARRY_FLAG 0x01
#define ZERO_FLAG  0x40


							/* low memory defines */
#define __ACT_VIDEOMODE    (*(unsigned char far *)0x00000449l)
#define __SHIFT_STATUS     (*(unsigned char far *)0x00000417l)
#define __EXTSHIFT_STATUS  (*(unsigned char far *)0x00000418l)


int far farcall(),far lfarcall();
void far *far pfarcall();
char *getargs(int*,char **,char*);

extern  int  far strm_init(unsigned int size);
extern  void far strm_close(void );
extern  void far strm_save  (int handle);
extern  int  far strm_resume(int handle);

extern  char far *far strm_search(int num);
extern  int far strm_get(int num,char *buffer);
extern  int far strm_append(char *buffer);
extern  int far strm_delete(int num);
extern  int far strm_deleten(int num,int anzlines);
#define DB(c) (*(char far *)0xb0000000l  = c)
int is_prim(long);

int far_read  (int handle,void far *buffer,int count);
int far_write (int handle,void far *buffer,int count);

#define MAXPATHLENGTH (64+1)	// maximale laenge eines DOS - Filenamens
#define MAXNAMELENGTH (8+1)		// laenge vor  '.'
#define MAXEXTLENGTH  (3+1)		// laenge nach '.'


struct dl_list{
	void *next,*prev;
	};

dl_link(void *header,void *next);
dl_unlink(void *Z);

int far detab(register char *dest, register char *src, int tablen,int maxlinlen);
int far nonewline(register char *d);

	
extern unsigned int 
	v_attr_normal ,
	v_attr_dunkel ,
	v_attr_invers ,
	v_attr_uline  ;

#ifdef FILE
FILE *weopen(char *name,char *extension,int mode1,char *m1,...);
FILE *wedefopen(char *extension,char *open_mode);
#endif

#define OPEN_CURRENT 1
#define OPEN_WE75    2
#define OPEN_EXE     3

char *exename(void);

int get_volatile(void far *value);
void far *dv_get_segment(void far *ptr);


# define TRUE 	1
# define FALSE 	0

#define max(a,b)    (((a) > (b)) ? (a) : (b))
#define min(a,b)    (((a) < (b)) ? (a) : (b))

#define LENGTH(x) (sizeof(x)/sizeof(x[0]))
