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));
}