2,11 → 2,40 |
|
#define atexitBufferSize 32 |
|
// Autobuild uses FASM method for exe->kos, |
// MENUET01 header should be present in EXE. |
#ifdef AUTOBUILD |
char kosExePath[1024]; |
char exeStack[16384]; |
// must be alphabetically first in the image |
#pragma data_seg(".1seg") |
extern "C" struct |
{ |
char header[8]; |
int headerver; |
void* entry; |
void* i_end; |
void* memsize; |
void* stack; |
void* params; |
void* icon; |
} header = { |
{'M', 'E', 'N', 'U', 'E', 'T', '0', '1'}, |
1, |
&crtStartUp, |
0, // filled by doexe2.asm |
0, // filled by doexe2.asm |
exeStack + sizeof(exeStack), |
NULL, |
kosExePath |
}; |
#pragma data_seg() |
#else |
char *kosExePath = NULL; |
#endif |
|
char pureCallMessage[] = "PURE function call!"; |
|
char *kosExePath = NULL; |
|
// |
void (__cdecl *atExitList[atexitBufferSize])(); |
int atExitFnNum = 0; |
809,6 → 838,10 |
// |
void crtStartUp() |
{ |
#ifdef AUTOBUILD |
// linker will try to remove unused variables; force header to be included |
header.header; |
#endif |
// âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì |
for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ ) |
{ |
818,8 → 851,10 |
} |
// èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
rtlSrand( kos_GetSystemClock() ); |
#ifndef AUTOBUILD |
// ïóòü ê ôàéëó ïðîöåññà |
kosExePath = *((char **)0x20); |
#endif |
// âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ |
kos_Main(); |
// âûõîä |