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


// KCore.cpp: implementation of the KCore class. 
// 
////////////////////////////////////////////////////////////////////// 
 
 
#include "..\stdafx.h" 
#include "KCore.h" 
 
POS_TCB pOsNextThread; 
POS_TCB pOsCurThread; 
int* pOsHeap; 
int nOsThreadCount=0; 
OS_TCB aOsThread[OS_MAXTHREAD]; 
 
void OS_Init() 
{ 
	pOsHeap[0]=OS_HEAPSIZE; 
	GWnd::m_aMsg=(MSG*)HeapAlloc(GUI_MAXMSG*sizeof(MSG)); 
	GWnd::m_aWnd=(GWnd**)HeapAlloc(GUI_MAXWND*sizeof(GWnd*)); 
	pOsCurThread=aOsThread; 
	pOsNextThread=aOsThread; 
	nOsThreadCount=1; 
} 
 
void OS_OnIdle(void) 
{ 
	HAL_OnIdle(); 
} 
 
LPVOID HeapAlloc(int nBytes) 
{ 
	int i,i2,x2,nNeeds; 
	nNeeds=nBytes>>2; 
	nNeeds+=(nBytes & 0x03)?2:1; 
	i=0; 
	do 
	{ 
		i2=ABS(pOsHeap[i]); 
		if(pOsHeap[i]>0 && i2-i>=nNeeds) 
		{ 
			if(i2-i-nNeeds>16) 
			{ 
				x2=i2-nNeeds; 
				pOsHeap[x2]=-i2; 
				pOsHeap[i]=x2; 
				i=x2; 
			} 
			else 
			{ 
				pOsHeap[i]=-i2; 
			} 
			break; 
		} 
		i=i2; 
	}while(i-1 && pOsHeap[i0]>0 && i20) 
				pOsHeap[i0]=pOsHeap[i2]; 
			else if(i0>-1 && pOsHeap[i0]>0) 
				pOsHeap[i0]=i2; 
			else if(i20) 
				pOsHeap[i]=pOsHeap[i2]; 
			else pOsHeap[i]=i2; 
			break; 
		} 
		i0=i;i=i2; 
	}while(ipSrc) 
		{ 
			p=DWORD(pDest); 
			s=DWORD(pSrc)+nLength-p; 
			while(nLength>p) 
			{ 
				nLength--;s--; 
				*PBYTE(nLength)=*PBYTE(s); 
			} 
		} 
	} 
	else if(pDestpSrc) 
	{ 
		nLength=DWORD(pDest)+nLength; 
		p=nLength & ~0x03; 
		s=DWORD(pSrc)+p-DWORD(pDest); 
		i=nLength & 0x03; 
		if(i) 
		{ 
			i=(1<<(i<<3))-1; 
			*PDWORD(p) &= ~i; 
			*PDWORD(p) |= i & *PDWORD(s); 
		} 
		i=(DWORD(pDest) & ~0x03)+4; 
		while(p>i) 
		{ 
			p-=4;s-=4; 
			*PDWORD(p)=*PDWORD(s); 
		} 
		p-=4;s-=4; 
		i=DWORD(pDest) & 0x03; 
		if(i) 
		{ 
			i=(1<<(i<<3))-1; 
			*(PDWORD)p &= i; 
			*(PDWORD)p |= ~i & *PDWORD(s); 
		} 
		else 
		{ 
			*PDWORD(p)=*PDWORD(s); 
		} 
	} 
} 
 
BOOL MessageBeep(int nType) 
{ 
	switch(nType & 0xf0) 
	{ 
	case MB_ICONERROR: 
		break; 
	case MB_ICONQUESTION: 
		break; 
	case MB_ICONWARNING: 
		break; 
	case MB_ICONINFORMATION: 
		break; 
	} 
	HAL_Beep(nType); 
	Sleep(10); 
	HAL_Beep(0); 
	return TRUE; 
} 
 
POS_TCB GetCurThread() 
{ 
	return pOsCurThread; 
} 
 
POS_TCB GetNextThread() 
{ 
	int i=nOsThreadCount; 
	DWORD t=GetTickCount(); 
	while(i--) 
	{ 
		if(t>=aOsThread[i].nTick) 
		{ 
			pOsNextThread=aOsThread+i; 
			break; 
		} 
	} 
	return pOsNextThread==pOsCurThread?NULL:pOsNextThread; 
} 
 
void CreateThread(OS_THREADPROC pThreadProc,int nStackSize) 
{ 
	OS_TCB& tcb=aOsThread[nOsThreadCount]; 
	PVOID sp1,sp2; 
	tcb.nTick=0; 
	if(nStackSize<1)nStackSize=0x4000; 
	sp1=HeapAlloc(nStackSize); 
	nStackSize=HeapAllocSize(sp1)-sizeof(int); 
	sp2=(PBYTE)sp1+sizeof(BYTE)*nStackSize; 
	nOsThreadCount++; 
	HAL_CreateThread(int(&tcb.sp),int(sp1),int(sp2),int(pThreadProc)); 
}