#ifndef __KS8695PX_H__
#define __KS8695PX_H__

#include <stdint.h>

enum CLOCK_SPEED
{
  MHz_166	= 0,
  MHz_100	= 1,
  MHz_62	= 2,
  MHz_50	= 3,
  MHz_42	= 4,
  MHz_33	= 5,
  MHz_31	= 6,
  MHz_25	= 7
};

enum CYCLES
{
  ONE		= 0,
  TWO		= 1,
  THREE		= 2,
  FOUR		= 3,
  FIVE		= 4,
  SIX		= 5,
  SEVEN		= 6,
  EIGHT		= 7
};

enum BUS_WIDTH
{
  DISABLED 	= 0,
  BYTE		= 1,	
  HALFWORD	= 2,
  WORD		= 3
};


class CPU
{
	public:
		static void SetSystemClockSpeed(CLOCK_SPEED speed);
		static void Reset(void);
		static void InitializeChipSelectZero(uint32_t   baseAddress, 
									  		 uint32_t   size,
									  		 BUS_WIDTH  width,
									  		 CYCLES     time_OE_or_WE_Asserted,
									  		 CYCLES     addressHoldTimeAfter_CS_Negated, 
									  		 CYCLES     addressSetupTimeBefore_CS_Asserted,
									   		 CYCLES     addressSetupTimeBefore_OE_or_WE_Asserted);
									   		 
		static void InitializeChipSelectOne(uint32_t 	baseAddress, 
									  		uint32_t 	size,
									  		BUS_WIDTH	width,
									  		CYCLES 		time_OE_or_WE_Asserted,
									  		CYCLES 		addressHoldTimeAfter_CS_Negated, 
									  		CYCLES 		addressSetupTimeBefore_CS_Asserted,
									   		CYCLES 		addressSetupTimeBefore_OE_or_WE_Asserted);		
									   		 
		static void InitializeChipSelectTwo(uint32_t 	baseAddress, 
									  		uint32_t 	size,
									  		BUS_WIDTH	width,
									  		CYCLES 		time_OE_or_WE_Asserted,
									  		CYCLES 		addressHoldTimeAfter_CS_Negated, 
									  		CYCLES 		addressSetupTimeBefore_CS_Asserted,
									   		CYCLES 		addressSetupTimeBefore_OE_or_WE_Asserted);						   		 
									   		
		static void EnableMMU(void);
		static void EnableICache(void);
		static void EnableDCache(void);
		static void EnableFastContextSwitch(void);
		static void DisableMMU(void);
		static void DisableICache(void);
		static void DisableDCache(void);
		static void DisableFastContextSwitch(void);
		
    private:
    	static void setCoprocessorRegisterBits(uint32_t mask);
    	static void clearCoprocessorRegisterBits(uint32_t mask);
};

#endif // __KS8695PX__
