www.pudn.com > GOS.rar > HAL.cpp


#include "stdafx.h" 
#include "HAL.h" 
 
typedef void (*ptr_func) (void);  
 
extern void WinMain(void); 
extern "C" void IntSchedule(void); 
extern "C" void SoftSchedule(void); 
extern "C" int TOUCH_GetState(int* x,int* y); 
extern "C" void set_wait_32k_clock_time_irq(ptr_func); 
extern "C" void set_time_tick(int Tick_Ps); 
extern int Image$$ZI$$Limit[]; 
extern int* pOsHeap; 
 
DWORD _ISR_STARTADDRESS=0; 
DWORD nHalTickCount=0; 
 
USHORT aHalAD[256]; 
 
void EnableFIQ(BOOL bEnable) 
{ 
	int tmp; 
	__asm{mrs tmp,CPSR} 
	if(bEnable) 
	{ 
		__asm{bic tmp,tmp,#0x40} 
	} 
	else 
	{ 
		__asm{orr tmp,tmp,#0x40} 
	} 
	__asm{msr CPSR_c,tmp} 
} 
 
typedef  enum {         // Value used for ILRX.FIQ 
  INTH_IRQ = 0,         // IT routed to IRQ 
  INTH_FIQ = 1          // IT routed to FIQ 
} INTH_InterruptKind_t; 
 
extern "C" UINT INTH2_GetCurrentIt (INTH_InterruptKind_t Fiq_or_Irq); 
extern "C" void INTH2_ValidNextInterrupt (INTH_InterruptKind_t Fiq_or_Irq); 
 
extern "C" __irq void SWI_Tick() 
{ 
	nHalTickCount++; 
	if(GetNextThread()) 
	{ 
		IntSchedule(); 
	} 
	INTH2_GetCurrentIt (INTH_FIQ); 
	INTH2_ValidNextInterrupt(INTH_FIQ);; 
} 
 
void IRQ_Tick(void) 
{ 
/* 
	__asm{ 
		swi 0; 
	}; 
*/ 
} 
void Idle() 
{ 
	while(1) 
	{ 
		Sleep(1000); 
		if(GWnd::m_nWndCount) 
		{ 
			GWnd::m_aWnd[0]->PostMessage(WM_TIMER,100,GetTickCount()); 
		} 
	} 
} 
extern "C" int HAL_ENTRY() 
{ 
    int aHeap[0x40000]; 
    set_time_tick(100); 
    set_wait_32k_clock_time_irq(&IRQ_Tick); 
     
while(1) 
{ 
    pOsHeap = aHeap; 
    //pOsHeap= Image$$ZI$$Limit; 
	OS_Init(); 
	//KFile::Init(); 
	CreateThread(Idle,0); 
	EnableFIQ(TRUE); 
	WinMain(); 
	//KFile::Unload(); 
	Sleep(5000); 
	EnableFIQ(FALSE); 
} 
return 0; 
} 
void HAL_OnIdle(void) 
{ 
	static int i=0,ax[3],ay[3]; 
	int x,y,j; 
	 
	if(TOUCH_GetState(&x,&y)) 
	{ 
		for(j=0;j<2;j++) 
		{ 
			ax[j]=ax[j+1]; 
			ay[j]=ay[j+1]; 
		} 
		ax[2]=x; 
		ay[2]=y; 
		i++; 
		if(i==3) 
		{ 
			GWnd::WM_Click(x,y,TRUE); 
		} 
	} 
	else if(i) 
	{ 
		if(i>=3) 
		{ 
			GWnd::WM_Click(ax[0],ay[0],FALSE); 
		} 
		i=0; 
	} 
} 
 
void Sleep(DWORD nMilliseconds) 
{ 
	nMilliseconds+=GetTickCount(); 
	GetCurThread()->nTick=nMilliseconds; 
	if(GetNextThread()) 
	{ 
		SoftSchedule(); 
	} 
	while(GetTickCount()