#include "mungal4.h"
#pragma hdrstop

#include "l4time.h"
//#include <bios.h>
//#include <sos.h>
#include <intrin.h>
#include <windows.h>

//#############################################################################
//###########################    System Clock    ##############################
//#############################################################################

SystemClock SystemClock::timer;
long SystemClock::ticksPerSecond;
__int64 SystemClock::perfCounterFreq;

//RB 1/20/07
//volatile long fast_time = 0L;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//void outportb(short portid, unsigned char value)
//{
//	__asm
//	{
//		MOV		DX, portid
//		MOV		AL, value
//		OUT		DX, AL
//	}
//	__outbyte(portid, value);
//}
////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
////
//unsigned char inportb(short portid)
//{
//	unsigned char retVal;
//	__asm
//	{
//		MOV		DX, portid
//		IN		AL, DX
//		MOV		retVal, AL
//	}
//	return retVal;
//}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
/*TIME RB 1/20/07
void Timer_Handler()
{
	++fast_time;
}*/

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
long SystemClock::GetRTC()
{
	LARGE_INTEGER count;
	QueryPerformanceCounter(&count);
	return (long)((count.QuadPart * (__int64)1000) / SystemClock::perfCounterFreq);
}

double SystemClock::GetHiRes()
{
   LARGE_INTEGER count;
   QueryPerformanceCounter(&count);
   return (count.QuadPart / (double)SystemClock::perfCounterFreq);
}

__int64 SystemClock::GetHiResTicks()
{
   LARGE_INTEGER count;
   QueryPerformanceCounter(&count);
   return count.QuadPart;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SystemClock::SystemClock()
{
	//
	//-------------------------------
	// Initialize the timer variables
	//-------------------------------
	//
	pauseStart = 0;
	pauseTime = 0;

	//
	//------------------------------
	// Initialize the platform timer
	//------------------------------
	//
	// query the performance counter for its frequency
	LARGE_INTEGER freq;
	QueryPerformanceFrequency(&freq);
	//SystemClock::ticksPerSecond = freq.QuadPart;
	SystemClock::perfCounterFreq = freq.QuadPart;
	SystemClock::ticksPerSecond = 1000L;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void SystemClock::Shutdown()
{
	/*STUBBED: TIME RB 1/20/07
	if (timer_handler_handle != 0xFFFF)
	{
	#if DEBUG_LEVEL>0
		WORD err = sosTIMERRemoveEvent(timer_handler_handle);
		Verify(err == _ERR_NO_ERROR);
		err = sosTIMERUnInitSystem(0);
		Verify(err == _ERR_NO_ERROR);
	#else
		sosTIMERRemoveEvent(timer_handler_handle);
		sosTIMERUnInitSystem(0);
	#endif
	}
	*/
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
#define TIMER_CONTROL		0x43
#define GET_TIMER0			0xC2
#define TIMER0_PORT			0x40
#define OUTPUT_BIT			0x80

#undef inportb
#undef outportb

float Get_Frame_Percent_Used()
{
	//STUBBED: SOS RB 1/14/07
		
	///*	RB 1/11/07
	//outportb(TIMER_CONTROL, GET_TIMER0);
	//int half = inportb(TIMER0_PORT) & OUTPUT_BIT;
	//int subtick = ((int)inportb(TIMER0_PORT)) >> 1;
	//subtick += (((int)inportb(TIMER0_PORT)) << 7);
	//*/

	//__outbyte(TIMER_CONTROL, GET_TIMER0);
	//int half = __inbyte(TIMER0_PORT) & OUTPUT_BIT;
	//int subtick = ((int)__inbyte(TIMER0_PORT)) >> 1;
	//subtick += (((int)__inbyte(TIMER0_PORT)) << 7);

	//if (timer_handler_handle == 0xFFFF)
	//{
	//	subtick += half << 8;
	//	return (65535 - subtick) / 65536.0f;
	//}
	//else
	//{
	//	if (half)
	//	{
	//		subtick += _wTIMERValue >> 1;
	//	}
	//	return (_wTIMERValue - 1 - subtick) / (float)_wTIMERValue;
	//}
	return 0.0f;
}
