#include <stdio.h>
#include <stdlib.h>

#include <exec/types.h>
#include <graphics/rastport.h>
#include <devices/timer.h>

#include <proto/exec.h>
#include <proto/timer.h>
#include <proto/graphics.h>

#include <exec/memory.h>

#include "SH_timer.h"

#include "/tools.h"

struct Library *TimerBase = NULL;
TIMER *Timer;

BOOL InitTimer(VOID)
{

  if((Timer = AllocVec(sizeof(TIMER),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
    return FALSE;

  if((Timer->TimeIO = AllocVec(sizeof(struct timerequest),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
  {
    RemoveTimer();
    return FALSE;
  }

  if(OpenDevice(TIMERNAME, UNIT_ECLOCK, (struct IORequest *)Timer->TimeIO, 0))
  {
    RemoveTimer();
    return FALSE;
  }

  TimerBase = (struct Library *)Timer->TimeIO->tr_node.io_Device;

  Timer->EClockFreq = ReadEClock(&Timer->LastFrameTime);

  return TRUE;
}


VOID RemoveTimer(VOID)
{

  if(Timer)
  {
    if(Timer->TimeIO)
    {
      if(TimerBase)
        CloseDevice((struct IORequest *)Timer->TimeIO);

      FreeVec(Timer->TimeIO);
    }

    FreeVec(Timer);
  }
}


VOID FrameEvent(VOID)
{
struct EClockVal TmpEClock;

  ReadEClock(&TmpEClock);

  DiffEClock(&Timer->LastFrameTime, &TmpEClock);

	Timer->FrameTime = TmpEClock.ev_lo;
}


VOID XEvent(VOID)
{
struct EClockVal TmpEClock;

  ReadEClock(&TmpEClock);

  DiffEClock(&Timer->LastXTime, &TmpEClock);

	Timer->XTime = TmpEClock.ev_lo;
}

ULONG GetCurrentXTime(VOID)
{
struct EClockVal TmpEClock;
struct EClockVal Tmp2EClock;

  ReadEClock(&TmpEClock);

	Tmp2EClock.ev_hi = Timer->LastXTime.ev_hi;
	Tmp2EClock.ev_lo = Timer->LastXTime.ev_lo;

  DiffEClock(&Tmp2EClock, &TmpEClock);

	return TmpEClock.ev_lo;
}
