/****************************************************************************
*	timer.h																	*
*	$Id: timer.h 1.2 93/07/16 11:51:38 ROOT_DOS Exp $
*	04 Jul 93	1.2		GT	Fix warnings.									*
*
*  ATARI Version by David Nash - dnash@chaos.demon.co.uk
*
*  Adjust MSPTICK and add extern int to Tick, Cfunct
*  pause -> Pause to prevent conflict with Lattice C V5.6
*
****************************************************************************/

#ifndef	_TIMER_H
#define	_TIMER_H

#ifndef	_GLOBAL_H
#include "global.h"
#endif

/* Software timers
 * There is one of these structures for each simulated timer.
 * Whenever the timer is running, it is on a linked list
 * pointed to by "Timers". The list is sorted in ascending order of
 * expiration, with the first timer to expire at the head. This
 * allows the timer process to avoid having to scan the entire list
 * on every clock tick; once it finds an unexpired timer, it can
 * stop searching.
 *
 * Stopping a timer or letting it expire causes it to be removed
 * from the list. Starting a timer puts it on the list at the right
 * place.
 */
struct timer {
	struct timer *next;	/* Linked-list pointer */
	int32 duration;		/* Duration of timer, in ticks */
	int32 expiration;	/* Clock time at expiration */
	void (*func) __ARGS((void *));	/* Function to call at expiration */
	void *arg;		/* Arg to pass function */
	char state;		/* Timer state */
#define	TIMER_STOP	0
#define	TIMER_RUN	1
#define	TIMER_EXPIRE	2
};
#define	NULLTIMER	(struct timer *)0
#define	MAX_TIME	(int32)4294967295	/* Max long integer */
#ifndef	MSPTICK
#ifndef  ATARI
#define	MSPTICK		55		/* Milliseconds per tick */
#else
#define  MSPTICK		20		/* Milliseconds per tick */
#endif
#endif
/* Useful user macros that hide the timer structure internals */
#define	dur_timer(t)	((t)->duration*MSPTICK)
#define	run_timer(t)	((t)->state == TIMER_RUN)

#ifndef ATARI
extern int Tick;
extern void (*Cfunc[]) __ARGS((void));	/* List of clock tick functions */
#else
volatile extern int Tick;
extern void (*Cfunc[]) (void);	/* List of clock tick functions */
#endif

/* In timer.c: */
void alarm __ARGS((int32 ms));

#ifndef ATARI
int pause __ARGS((int32 ms));
#else
int Pause __ARGS((int32 ms));
#endif

int32 read_timer __ARGS((struct timer *t));
void set_timer __ARGS((struct timer *t,int32 x));
void start_timer __ARGS((struct timer *t));
void stop_timer __ARGS((struct timer *timer));
char *tformat __ARGS((int32 t));

/* In hardware.c: */
int32 msclock __ARGS((void));
int32 secclock __ARGS((void));

#endif	/* _TIMER_H */
