📄 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<OS_HEAPSIZE);
return i<OS_HEAPSIZE?&pOsHeap[i+1]:NULL;
}
void HeapFree(PVOID pData)
{
int i,i0,i2;
i=0;
i0=-1;
do
{
i2=ABS(pOsHeap[i]);
if(&pOsHeap[i+1]==pData)
{
if(i0>-1 && pOsHeap[i0]>0 && i2<OS_HEAPSIZE && pOsHeap[i2]>0)
pOsHeap[i0]=pOsHeap[i2];
else if(i0>-1 && pOsHeap[i0]>0)
pOsHeap[i0]=i2;
else if(i2<OS_HEAPSIZE && pOsHeap[i2]>0)
pOsHeap[i]=pOsHeap[i2];
else pOsHeap[i]=i2;
break;
}
i0=i;i=i2;
}while(i<OS_HEAPSIZE);
}
int HeapAllocSize(PVOID pData)
{
int i;
int* aBuf;
aBuf=(int*)pData;
i=aBuf-1-pOsHeap;
i=-pOsHeap[i]-i-1;
i<<=2;
return i;
}
void FillMemory(LPVOID pDest,DWORD nLength,BYTE nFill)
{
DWORD p=DWORD(pDest);
DWORD i,nData=nFill;
nData=nFill;
nData=(nData<<8)|nData;
nData=(nData<<16)|nData;
nLength=DWORD(pDest)+nLength;
if((DWORD(pDest) & ~0x03) == (nLength & ~0x03))
{
i=DWORD(pDest) & 0x03;
if(i)
{
p-=i;
i=(1<<(i<<3))-1;
}
nLength &= 0x03;
nLength=(1<<(nLength<<3))-1;
i |= ~nLength;
*(PDWORD)p &= i;
*(PDWORD)p |= ~i & nData ;
}
else
{
i=DWORD(pDest) & 0x03;
if(i)
{
p-=i;
i=(1<<(i<<3))-1;
*(PDWORD)p &= i;
*(PDWORD)p |= ~i & nData ;
p+=4;
}
i=nLength & ~0x03;
while(p<i)
{
*PDWORD(p)=nData;
p+=4;
}
i=nLength & 0x03;
if(i)
{
i=(1<<(i<<3))-1;
*PDWORD(p) &= ~i;
*PDWORD(p) |= i & nData ;
}
}
}
void CopyMemory(LPVOID pDest,LPCVOID pSrc,DWORD nLength)
{
DWORD i,p,s;
if(nLength<4 || (DWORD(pDest) & 0x03)!=(DWORD(pSrc) & 0x03))
{
nLength=DWORD(pDest)+nLength;
if(pDest<pSrc)
{
p=DWORD(pDest);
s=DWORD(pSrc);
while(p<nLength)
{
*PBYTE(p)=*PBYTE(s);
p++;s++;
}
}
else if(pDest>pSrc)
{
p=DWORD(pDest);
s=DWORD(pSrc)+nLength-p;
while(nLength>p)
{
nLength--;s--;
*PBYTE(nLength)=*PBYTE(s);
}
}
}
else if(pDest<pSrc)
{
nLength=DWORD(pDest)+nLength;
p=DWORD(pDest);
s=DWORD(pSrc);
i=p & 0x03;
if(i)
{
p-=i;s-=i;
i=(1<<(i<<3))-1;
*(PDWORD)p &= i;
*(PDWORD)p |= ~i & *PDWORD(s);
p+=4;s+=4;
}
i=nLength & ~0x03;
while(p<i)
{
*PDWORD(p)=*PDWORD(s);
p+=4;s+=4;
}
i=nLength & 0x03;
if(i)
{
i=(1<<(i<<3))-1;
*PDWORD(p) &= ~i;
*PDWORD(p) |= i & *PDWORD(s);
}
}
else if(pDest>pSrc)
{
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));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -