Rev 1005 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1005 | Rev 1764 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include "kosSyst.h" |
1 | #include "kosSyst.h" |
- | 2 | #include "func.h" |
|
2 | #include |
3 | #include |
Line 3... | Line 4... | ||
3 | 4 | ||
Line -... | Line 5... | ||
- | 5 | #define atexitBufferSize 32 |
|
- | 6 | ||
- | 7 | // Autobuild uses FASM method for exe->kos, |
|
- | 8 | // MENUET01 header should be present in EXE. |
|
- | 9 | #ifdef AUTOBUILD |
|
- | 10 | char kosExePath[1024]; |
|
- | 11 | char exeStack[16384]; |
|
- | 12 | extern char params[1024]; |
|
- | 13 | // must be alphabetically first in the image |
|
- | 14 | #pragma data_seg(".1seg") |
|
- | 15 | extern "C" struct |
|
- | 16 | { |
|
- | 17 | char header[8]; |
|
- | 18 | int headerver; |
|
- | 19 | void* entry; |
|
- | 20 | void* i_end; |
|
- | 21 | void* memsize; |
|
- | 22 | void* stack; |
|
- | 23 | void* params; |
|
- | 24 | void* icon; |
|
- | 25 | } header = { |
|
- | 26 | {'M', 'E', 'N', 'U', 'E', 'T', '0', '1'}, |
|
- | 27 | 1, |
|
- | 28 | &crtStartUp, |
|
- | 29 | 0, // filled by doexe2.asm |
|
- | 30 | 0, // filled by doexe2.asm |
|
- | 31 | exeStack + sizeof(exeStack), |
|
- | 32 | params, |
|
- | 33 | kosExePath |
|
- | 34 | }; |
|
- | 35 | #pragma data_seg() |
|
- | 36 | #else |
|
Line 4... | Line 37... | ||
4 | #define atexitBufferSize 32 |
37 | char *kosExePath = NULL; |
Line 5... | Line -... | ||
5 | - | ||
6 | - | ||
7 | char pureCallMessage[] = "PURE function call!"; |
38 | #endif |
8 | 39 | ||
9 | char *kosExePath = NULL; |
40 | char pureCallMessage[] = "PURE function call!"; |
10 | 41 | ||
11 | // |
42 | // |
Line 62... | Line 93... | ||
62 | } |
93 | } |
Line 63... | Line 94... | ||
63 | 94 | ||
64 | return RandomSeed; |
95 | return RandomSeed; |
Line 65... | Line 96... | ||
65 | } |
96 | } |
66 | - | ||
- | 97 | ||
67 | #if _MSC_VER >= 1400 |
98 | #ifdef AUTOBUILD |
68 | // |
99 | // Well, not really related to auto-build, but some compilation issue |
69 | void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount ) |
100 | void memcpy( void *dst, const void *src, size_t bytesCount ) |
70 | { |
101 | { |
71 | __asm{ |
102 | __asm{ |
72 | mov edi, dst |
103 | mov edi, dst |
73 | mov eax, dst |
104 | // mov eax, dst |
74 | mov esi, src |
105 | mov esi, src |
75 | mov ecx, bytesCount |
106 | mov ecx, bytesCount |
76 | rep movsb |
107 | rep movsb |
Line 88... | Line 119... | ||
88 | rep stosb |
119 | rep stosb |
89 | } |
120 | } |
90 | } |
121 | } |
91 | #endif |
122 | #endif |
Line -... | Line 123... | ||
- | 123 | ||
92 | 124 | ||
93 | // |
125 | // |
94 | Dword rtlInterlockedExchange( Dword *target, Dword value ) |
126 | Dword rtlInterlockedExchange( Dword *target, Dword value ) |
95 | { |
127 | { |
Line 815... | Line 847... | ||
815 | //#pragma section(".CRT$XCA",long,read,write) |
847 | //#pragma section(".CRT$XCA",long,read,write) |
816 | //#pragma section(".CRT$XCZ",long,read,write) |
848 | //#pragma section(".CRT$XCZ",long,read,write) |
817 | #pragma data_seg(".CRT$XCA") |
849 | #pragma data_seg(".CRT$XCA") |
818 | #pragma data_seg(".CRT$XCZ") |
850 | #pragma data_seg(".CRT$XCZ") |
819 | typedef void (__cdecl *_PVFV)(void); |
851 | typedef void (__cdecl *_PVFV)(void); |
820 | __declspec(allocate(".CRT$XCA")) _PVFV __xc_a[1] = { NULL }; |
852 | //__declspec(allocate(".CRT$XCA")) _PVFV __xc_a[1] = { NULL }; |
821 | __declspec(allocate(".CRT$XCZ")) _PVFV __xc_z[1] = { NULL }; |
853 | //__declspec(allocate(".CRT$XCZ")) _PVFV __xc_z[1] = { NULL }; |
822 | // |
854 | // |
823 | #pragma comment(linker, "/merge:.CRT=.rdata") |
855 | #pragma comment(linker, "/merge:.CRT=.rdata") |
824 | // |
856 | // |
825 | void crtStartUp() |
857 | void crtStartUp() |
826 | { |
858 | { |
- | 859 | #ifdef AUTOBUILD |
|
- | 860 | // linker will try to remove unused variables; force header to be included |
|
- | 861 | header.header; |
|
- | 862 | #endif |
|
827 | // âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì |
863 | // âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì |
828 | for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ ) |
864 | /*for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ ) |
829 | { |
865 | { |
830 | // |
866 | // |
831 | if ( *pbegin != NULL ) |
867 | if ( *pbegin != NULL ) |
832 | (**pbegin)(); |
868 | (**pbegin)(); |
833 | } |
869 | }*/ |
834 | // èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
870 | // èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë |
835 | rtlSrand( kos_GetSystemClock() ); |
871 | rtlSrand( kos_GetSystemClock() ); |
- | 872 | #ifndef AUTOBUILD |
|
836 | // ïóòü ê ôàéëó ïðîöåññà |
873 | // ïóòü ê ôàéëó ïðîöåññà |
837 | kosExePath = *((char **)0x20); |
874 | kosExePath = *((char **)0x20); |
- | 875 | #endif |
|
838 | // âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ |
876 | // âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ |
839 | kos_Main(); |
877 | kos_Main(); |
840 | // âûõîä |
878 | // âûõîä |
841 | kos_ExitApp(); |
879 | kos_ExitApp(); |
842 | }>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>>><>>> |
880 | }>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>>><>>> |