Subversion Repositories Kolibri OS

Rev

Rev 1764 | Rev 7495 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1764 Rev 2750
1
#include "kosSyst.h"
1
#include "kosSyst.h"
2
#include "func.h"
2
#include "func.h"
3
#include 
3
#include 
4
 
4
 
5
#define atexitBufferSize	32
5
#define atexitBufferSize	32
6
 
6
 
7
// Autobuild uses FASM method for exe->kos,
7
// Autobuild uses FASM method for exe->kos,
8
// MENUET01 header should be present in EXE.
8
// MENUET01 header should be present in EXE.
9
#ifdef AUTOBUILD
9
#ifdef AUTOBUILD
10
char kosExePath[1024];
10
char kosExePath[1024];
11
char exeStack[16384];
11
char exeStack[16384];
12
// must be alphabetically first in the image
12
// must be alphabetically first in the image
13
#pragma data_seg(".1seg")
13
#pragma data_seg(".1seg")
14
extern "C" struct
14
extern "C" struct
15
{
15
{
16
	char header[8];
16
	char header[8];
17
	int headerver;
17
	int headerver;
18
	void* entry;
18
	void* entry;
19
	void* i_end;
19
	void* i_end;
20
	void* memsize;
20
	void* memsize;
21
	void* stack;
21
	void* stack;
22
	void* params;
22
	void* params;
23
	void* icon;
23
	void* icon;
24
} header = {
24
} header = {
25
	{'M', 'E', 'N', 'U', 'E', 'T', '0', '1'},
25
	{'M', 'E', 'N', 'U', 'E', 'T', '0', '1'},
26
	1,
26
	1,
27
	&crtStartUp,
27
	&crtStartUp,
28
	0,	// filled by doexe2.asm
28
	0,	// filled by doexe2.asm
29
	0,	// filled by doexe2.asm
29
	0,	// filled by doexe2.asm
30
	exeStack + sizeof(exeStack),
30
	exeStack + sizeof(exeStack),
31
	NULL,
31
	NULL,
32
	kosExePath
32
	kosExePath
33
};
33
};
34
#pragma data_seg()
34
#pragma data_seg()
35
#else
35
#else
36
char *kosExePath = NULL;
36
char *kosExePath = NULL;
37
#endif
37
#endif
38
 
38
 
39
char pureCallMessage[] = "PURE function call!";
39
char pureCallMessage[] = "PURE function call!";
40
 
40
 
41
//
41
//
42
void (__cdecl *atExitList[atexitBufferSize])();
42
void (__cdecl *atExitList[atexitBufferSize])();
43
int atExitFnNum = 0;
43
int atExitFnNum = 0;
44
//
44
//
45
int __cdecl atexit( void (__cdecl *func )( void ))
45
int __cdecl atexit( void (__cdecl *func )( void ))
46
{
46
{
47
	//
47
	//
48
	if ( atExitFnNum < atexitBufferSize )
48
	if ( atExitFnNum < atexitBufferSize )
49
	{
49
	{
50
		//
50
		//
51
		atExitList[atExitFnNum++] = func;
51
		atExitList[atExitFnNum++] = func;
52
		return 0;
52
		return 0;
53
	}
53
	}
54
	else
54
	else
55
	{
55
	{
56
		return 1;
56
		return 1;
57
	}
57
	}
58
}
58
}
59
 
59
 
60
 
60
 
61
//
61
//
62
Dword RandomSeed = 1;
62
Dword RandomSeed = 1;
63
//
63
//
64
void rtlSrand( Dword seed )
64
void rtlSrand( Dword seed )
65
{
65
{
66
	RandomSeed = seed;
66
	RandomSeed = seed;
67
}
67
}
68
//
68
//
69
Dword rtlRand( void )
69
Dword rtlRand( void )
70
{
70
{
71
  //ìàñêà 0x80000776
71
  //ìàñêà 0x80000776
72
 
72
 
73
  Dword dwi, i;
73
  Dword dwi, i;
74
 
74
 
75
  for ( i = 0; i < 32; i++ )
75
  for ( i = 0; i < 32; i++ )
76
  {
76
  {
77
 
77
 
78
    dwi = RandomSeed & 0x80000776;
78
    dwi = RandomSeed & 0x80000776;
79
  
79
  
80
      __asm{
80
      __asm{
81
            mov   eax, dwi
81
            mov   eax, dwi
82
            mov   edx, eax
82
            mov   edx, eax
83
            bswap eax
83
            bswap eax
84
            xor   eax, edx
84
            xor   eax, edx
85
            xor   al, ah
85
            xor   al, ah
86
            setpo al
86
            setpo al
87
            movzx eax, al
87
            movzx eax, al
88
            mov   dwi, eax
88
            mov   dwi, eax
89
    }
89
    }
90
 
90
 
91
    RandomSeed = ( RandomSeed << 1 ) | ( dwi & 1 );
91
    RandomSeed = ( RandomSeed << 1 ) | ( dwi & 1 );
92
  }
92
  }
93
  
93
  
94
 return RandomSeed;
94
 return RandomSeed;
95
}
95
}
96
 
96
 
97
#ifdef AUTOBUILD
97
#ifdef AUTOBUILD
98
// Well, not really related to auto-build, but some compilation issue
98
// Well, not really related to auto-build, but some compilation issue
99
void memcpy( void *dst, const void *src, size_t bytesCount )
99
void memcpy( void *dst, const void *src, size_t bytesCount )
100
{
100
{
101
	__asm{
101
	__asm{
102
		mov edi, dst
102
		mov edi, dst
103
//		mov eax, dst
103
//		mov eax, dst
104
		mov esi, src
104
		mov esi, src
105
		mov ecx, bytesCount
105
		mov ecx, bytesCount
106
		rep movsb
106
		rep movsb
107
	}
107
	}
108
}
108
}
109
 
109
 
110
//
110
//
111
void memset( Byte *dst, Byte filler, Dword count )
111
void memset( Byte *dst, Byte filler, Dword count )
112
{
112
{
113
	//
113
	//
114
	__asm{
114
	__asm{
115
		mov edi, dst
115
		mov edi, dst
116
		mov al, filler
116
		mov al, filler
117
		mov ecx, count
117
		mov ecx, count
118
		rep stosb
118
		rep stosb
119
	}
119
	}
120
}
120
}
121
#endif
121
#endif
122
 
122
 
123
 
123
 
124
//
124
//
125
Dword rtlInterlockedExchange( Dword *target, Dword value )
125
Dword rtlInterlockedExchange( Dword *target, Dword value )
126
{
126
{
127
//	Dword result;
127
//	Dword result;
128
 
128
 
129
	//
129
	//
130
	__asm{
130
	__asm{
131
		mov eax, value
131
		mov eax, value
132
		mov ebx, target
132
		mov ebx, target
133
		xchg eax, [ebx]
133
		xchg eax, [ebx]
134
//		mov result, eax
134
//		mov result, eax
135
	}
135
	}
136
	//
136
	//
137
//	return result;
137
//	return result;
138
}
138
}
139
 
139
 
140
 
140
 
141
//////////////////////////////////////////////////////////////////////
141
//////////////////////////////////////////////////////////////////////
142
//
142
//
143
// êîïèðîâàíèå ñòðîêè
143
// êîïèðîâàíèå ñòðîêè
144
//
144
//
145
 
145
 
146
char * __cdecl strcpy( char *target, const char *source )
146
char * __cdecl strcpy( char *target, const char *source )
147
{
147
{
148
	char *result = target;
148
	char *result = target;
149
 
149
 
150
	while( target[0] = source[0] )
150
	while( target[0] = source[0] )
151
	{
151
	{
152
		target++;
152
		target++;
153
		source++;
153
		source++;
154
	}
154
	}
155
 
155
 
156
	return result;
156
	return result;
157
}
157
}
158
 
158
 
159
 
159
 
160
//////////////////////////////////////////////////////////////////////
160
//////////////////////////////////////////////////////////////////////
161
//
161
//
162
// ðåâåðñèâíûé ïîèñê ñèìâîëà
162
// ðåâåðñèâíûé ïîèñê ñèìâîëà
163
//
163
//
164
 
164
 
165
char * __cdecl strrchr( const char * string, int c )
165
char * __cdecl strrchr( const char * string, int c )
166
{
166
{
167
	char *cPtr;
167
	char *cPtr;
168
 
168
 
169
	//
169
	//
170
	for ( cPtr = (char *)string + strlen( string ); cPtr >= string; cPtr-- )
170
	for ( cPtr = (char *)string + strlen( string ); cPtr >= string; cPtr-- )
171
	{
171
	{
172
		//
172
		//
173
		if ( *cPtr == c ) return cPtr;
173
		if ( *cPtr == c ) return cPtr;
174
	}
174
	}
175
	//
175
	//
176
	return NULL;
176
	return NULL;
177
}
177
}
178
 
178
 
179
 
179
 
180
//////////////////////////////////////////////////////////////////////
180
//////////////////////////////////////////////////////////////////////
181
//
181
//
182
// îïðåäåëåíèå äëèíû ñòðîêè
182
// îïðåäåëåíèå äëèíû ñòðîêè
183
//
183
//
184
 
184
 
185
int __cdecl strlen( const char *line )
185
int __cdecl strlen( const char *line )
186
{
186
{
187
  int i;
187
  int i;
188
 
188
 
189
  for( i=0; line[i] != 0; i++ );
189
  for( i=0; line[i] != 0; i++ );
190
  return i;
190
  return i;
191
}
191
}
192
 
192
 
193
 
193
 
194
 
194
 
195
//////////////////////////////////////////////////////////////////////
195
//////////////////////////////////////////////////////////////////////
196
//
196
//
197
// ïåðåâîä øåñòíàäöàòèðè÷íîãî ÷èñëà â ñèìâîë
197
// ïåðåâîä øåñòíàäöàòèðè÷íîãî ÷èñëà â ñèìâîë
198
//
198
//
199
 
199
 
200
unsigned int num2hex( unsigned int num )
200
unsigned int num2hex( unsigned int num )
201
{
201
{
202
  if( num < 10 )
202
  if( num < 10 )
203
    return num + '0';
203
    return num + '0';
204
  return num - 10 + 'A';
204
  return num - 10 + 'A';
205
}
205
}
206
 
206
 
207
 
207
 
208
//////////////////////////////////////////////////////////////////////
208
//////////////////////////////////////////////////////////////////////
209
//
209
//
210
// âûâîä ñòðîêè íà ïå÷àòü. barsuk äîáàâèë %f 
210
// âûâîä ñòðîêè íà ïå÷àòü. barsuk äîáàâèë %f 
211
 
211
 
212
//#define PREC 2
212
//#define PREC 2
213
//#define HALF 0.499
213
//#define HALF 0.499
214
#define PREC 6
214
#define PREC 6
215
#define HALF 0.4999999
215
#define HALF 0.4999999
216
 
216
 
217
double double_tab[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
217
double double_tab[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
218
1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30};
218
1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30};
219
 
219
 
220
 
220
 
221
//
221
//
222
 
222
 
223
Dword dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000,
223
Dword dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000,
224
                   10000, 1000, 100, 10, 0 };
224
                   10000, 1000, 100, 10, 0 };
225
 
225
 
226
//
226
//
227
void sprintf( char *Str, char* Format, ... )
227
void sprintf( char *Str, char* Format, ... )
228
{
228
{
229
	int i, fmtlinesize, j, k, flag;
229
	int i, fmtlinesize, j, k, flag;
230
	Dword head, tail;
230
	Dword head, tail;
231
	char c;
231
	char c;
232
	va_list arglist;
232
	va_list arglist;
233
	//
233
	//
234
	va_start(arglist, Format);
234
	va_start(arglist, Format);
235
 
235
 
236
	//
236
	//
237
	fmtlinesize = strlen( Format );
237
	fmtlinesize = strlen( Format );
238
	//
238
	//
239
	if( fmtlinesize == 0 ) return;
239
	if( fmtlinesize == 0 ) return;
240
  
240
  
241
	//
241
	//
242
	for( i = 0, j = 0; i < fmtlinesize; i++ )
242
	for( i = 0, j = 0; i < fmtlinesize; i++ )
243
	{
243
	{
244
		//
244
		//
245
		c = Format[i];
245
		c = Format[i];
246
		//
246
		//
247
		if( c != '%' )
247
		if( c != '%' )
248
		{
248
		{
249
			Str[j++] = c;
249
			Str[j++] = c;
250
			continue;
250
			continue;
251
		}
251
		}
252
		//
252
		//
253
		i++;
253
		i++;
254
		//
254
		//
255
		if( i >= fmtlinesize ) break;
255
		if( i >= fmtlinesize ) break;
256
 
256
 
257
		//
257
		//
258
		flag = 0;
258
		flag = 0;
259
		//
259
		//
260
		c = Format[i];
260
		c = Format[i];
261
		//
261
		//
262
		switch( c )
262
		switch( c )
263
		{
263
		{
264
		//
264
		//
265
		case '%':
265
		case '%':
266
			Str[j++] = c;
266
			Str[j++] = c;
267
			break;
267
			break;
268
		// âûâîä ñòðîêè
268
		// âûâîä ñòðîêè
269
		case 'S':
269
		case 'S':
270
			Byte* str;
270
			Byte* str;
271
			str = va_arg(arglist, Byte*);
271
			str = va_arg(arglist, Byte*);
272
			for( k = 0; ( c = str[k] ) != 0; k++ )
272
			for( k = 0; ( c = str[k] ) != 0; k++ )
273
			{
273
			{
274
				Str[j++] = c;
274
				Str[j++] = c;
275
			}
275
			}
276
			break;
276
			break;
277
		// âûâîä áàéòà
277
		// âûâîä áàéòà
278
		case 'B':
278
		case 'B':
279
			k = va_arg(arglist, int) & 0xFF;
279
			k = va_arg(arglist, int) & 0xFF;
280
			Str[j++] = num2hex( ( k >> 4 ) & 0xF );
280
			Str[j++] = num2hex( ( k >> 4 ) & 0xF );
281
			Str[j++] = num2hex( k & 0xF );
281
			Str[j++] = num2hex( k & 0xF );
282
			break;
282
			break;
283
		// âûâîä ñèìâîëà
283
		// âûâîä ñèìâîëà
284
		case 'C':
284
		case 'C':
285
			Str[j++] = va_arg(arglist, int) & 0xFF;
285
			Str[j++] = va_arg(arglist, int) & 0xFF;
286
			break;
286
			break;
287
		// âûâîä äâîéíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
287
		// âûâîä äâîéíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
288
		case 'X':
288
		case 'X':
289
			Dword val;
289
			Dword val;
290
			val = va_arg(arglist, Dword);
290
			val = va_arg(arglist, Dword);
291
			for( k = 7; k >= 0; k-- )
291
			for( k = 7; k >= 0; k-- )
292
			{
292
			{
293
				//
293
				//
294
				c = num2hex ( ( val >> (k * 4) ) & 0xF );
294
				c = num2hex ( ( val >> (k * 4) ) & 0xF );
295
				//
295
				//
296
				if( c == '0' )
296
				if( c == '0' )
297
				{
297
				{
298
					if( flag ) Str[j++] = c;
298
					if( flag ) Str[j++] = c;
299
				}
299
				}
300
				else
300
				else
301
				{
301
				{
302
					flag++;
302
					flag++;
303
					Str[j++] = c;
303
					Str[j++] = c;
304
				}
304
				}
305
			}
305
			}
306
			//
306
			//
307
			if( flag == 0 ) Str[j++] = '0';
307
			if( flag == 0 ) Str[j++] = '0';
308
			break;
308
			break;
309
		// âûâîä äâîéíîãî ñëîâà â äåñÿòè÷íîì âèäå
309
		// âûâîä äâîéíîãî ñëîâà â äåñÿòè÷íîì âèäå
310
		case 'U':
310
		case 'U':
311
			head = va_arg(arglist, Dword);
311
			head = va_arg(arglist, Dword);
312
			tail = 0;
312
			tail = 0;
313
			for( k = 0; dectab[k] != 0; k++ )
313
			for( k = 0; dectab[k] != 0; k++ )
314
			{
314
			{
315
				tail = head % dectab[k];
315
				tail = head % dectab[k];
316
				head /= dectab[k];
316
				head /= dectab[k];
317
				c = head + '0';
317
				c = head + '0';
318
				if( c == '0' )
318
				if( c == '0' )
319
				{
319
				{
320
					if( flag ) Str[j++] = c;
320
					if( flag ) Str[j++] = c;
321
				}
321
				}
322
				else
322
				else
323
				{
323
				{
324
					flag++;
324
					flag++;
325
					Str[j++] = c;
325
					Str[j++] = c;
326
				}
326
				}
327
				//
327
				//
328
				head = tail;
328
				head = tail;
329
			}
329
			}
330
			//
330
			//
331
			c = head + '0';
331
			c = head + '0';
332
			Str[j++] = c;
332
			Str[j++] = c;
333
			break;
333
			break;
334
		// âåùåñòâåííîå ÷èñëî â ôîðìàòå 7.2
334
		// âåùåñòâåííîå ÷èñëî â ôîðìàòå 7.2
335
		case 'f':
335
		case 'f':
336
		case 'F':
336
		case 'F':
337
		case 'g':
337
		case 'g':
338
		case 'G':
338
		case 'G':
339
			{
339
			{
340
			double val, w;
340
			double val, w;
341
			int p;
341
			int p;
342
			val = va_arg(arglist, double);
342
			val = va_arg(arglist, double);
343
			if (val < 0.0)
343
			if (val < 0.0)
344
			{
344
			{
345
				Str[j++] = '-';
345
				Str[j++] = '-';
346
				val = -val;
346
				val = -val;
347
			}
347
			}
348
			for (k = 0; k < 30; k++)
348
			for (k = 0; k < 30; k++)
349
				if (val < double_tab[k])
349
				if (val < double_tab[k])
350
					break;
350
					break;
351
 
351
 
352
			if (val < 1.0)
352
			if (val < 1.0)
353
			{
353
			{
354
				Str[j++] = '0';
354
				Str[j++] = '0';
355
			}
355
			}
356
			
356
			
357
			for (p = 1; p < k + 1; p++)
357
			for (p = 1; p < k + 1; p++)
358
			{
358
			{
359
				int d = (int)di(val / double_tab[k - p] - HALF) % 10;
359
				int d = (int)di(val / double_tab[k - p] - HALF) % 10;
360
				Str[j++] = '0' + d;
360
				Str[j++] = '0' + d;
361
				val -= d * double_tab[k - p];
361
				val -= d * double_tab[k - p];
362
			}
362
			}
363
			Str[j++] = '.';
363
			Str[j++] = '.';
364
			w = 0.1;
364
			w = 0.1;
365
			for (p = 0; p < PREC - 1; p++)
365
			for (p = 0; p < PREC - 1; p++)
366
			{
366
			{
367
				val-=floor(val);
367
				val-=floor(val);
368
				Str[j++] = '0' + di(val / w - HALF) % 10;
368
				Str[j++] = '0' + di(val / w - HALF) % 10;
369
				w /= 10.0;
369
				w /= 10.0;
370
			}
370
			}
371
			}
371
			}
372
			break;
372
			break;
373
 
373
 
374
		// âûâîä 64-áèòíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
374
		// âûâîä 64-áèòíîãî ñëîâà â øåñòíàäöàòèðè÷íîì âèäå
375
		case 'Q':
375
		case 'Q':
376
			unsigned int low_dword, high_dword;
376
			unsigned int low_dword, high_dword;
377
			low_dword = va_arg(arglist, unsigned int);
377
			low_dword = va_arg(arglist, unsigned int);
378
			high_dword = va_arg(arglist, unsigned int);
378
			high_dword = va_arg(arglist, unsigned int);
379
			for( k = 7; k >= 0; k-- )
379
			for( k = 7; k >= 0; k-- )
380
			{
380
			{
381
				//
381
				//
382
				c = num2hex ( ( ( high_dword + 1) >> (k * 4) ) & 0xF );
382
				c = num2hex ( ( ( high_dword + 1) >> (k * 4) ) & 0xF );
383
				//
383
				//
384
				if( c == '0' )
384
				if( c == '0' )
385
				{
385
				{
386
					if( flag ) Str[j++] = c;
386
					if( flag ) Str[j++] = c;
387
				}
387
				}
388
				else
388
				else
389
				{
389
				{
390
					flag++;
390
					flag++;
391
					Str[j++] = c;
391
					Str[j++] = c;
392
				}
392
				}
393
			}
393
			}
394
			//
394
			//
395
			for( k=7; k >= 0; k-- )
395
			for( k=7; k >= 0; k-- )
396
			{
396
			{
397
				//
397
				//
398
				c = num2hex ( ( low_dword >> (k * 4) ) & 0xF );
398
				c = num2hex ( ( low_dword >> (k * 4) ) & 0xF );
399
				//
399
				//
400
				if( c == '0' )
400
				if( c == '0' )
401
				{
401
				{
402
					if( flag ) Str[j++] = c;
402
					if( flag ) Str[j++] = c;
403
				}
403
				}
404
				else
404
				else
405
				{
405
				{
406
					flag++;
406
					flag++;
407
					Str[j++] = c;
407
					Str[j++] = c;
408
				}
408
				}
409
			}
409
			}
410
			//
410
			//
411
			if( flag == 0 ) Str[j++] = '0';
411
			if( flag == 0 ) Str[j++] = '0';
412
			//
412
			//
413
			break;
413
			break;
414
		//
414
		//
415
		default:
415
		default:
416
			break;
416
			break;
417
		}
417
		}
418
	}
418
	}
419
	//
419
	//
420
	Str[j] = 0;
420
	Str[j] = 0;
421
}
421
}
422
 
422
 
423
 
423
 
424
// ôóíêöèÿ -1 çàâåðøåíèÿ ïðîöåññà
424
// ôóíêöèÿ -1 çàâåðøåíèÿ ïðîöåññà
425
void kos_ExitApp()
425
void kos_ExitApp()
426
{
426
{
427
	int i;
427
	int i;
428
 
428
 
429
	//
429
	//
430
	for ( i = atExitFnNum - 1; i >= 0; i-- )
430
	for ( i = atExitFnNum - 1; i >= 0; i-- )
431
	{
431
	{
432
		//
432
		//
433
		atExitList[i]();
433
		atExitList[i]();
434
	}
434
	}
435
	//
435
	//
436
	__asm{
436
	__asm{
437
		mov eax, -1
437
		mov eax, -1
438
		int 0x40
438
		int 0x40
439
	}
439
	}
440
}
440
}
441
 
441
 
442
 
442
 
443
// ôóíêöèÿ 0
443
// ôóíêöèÿ 0
444
void kos_DefineAndDrawWindow(
444
void kos_DefineAndDrawWindow(
445
	Word x, Word y,
445
	Word x, Word y,
446
	Word sizeX, Word sizeY,
446
	Word sizeX, Word sizeY,
447
	Byte mainAreaType,
447
	Byte mainAreaType,
448
	Dword mainAreaColour,
448
	Dword mainAreaColour,
449
	Byte headerType,
449
	Byte headerType,
450
	Dword headerColour,
450
	Dword headerColour,
451
	Dword borderColour
451
	Dword borderColour
452
	)
452
	)
453
{
453
{
454
	Dword arg1, arg2, arg3, arg4;
454
	Dword arg1, arg2, arg3, arg4;
455
 
455
 
456
	//
456
	//
457
	arg1 = ( x << 16 ) + sizeX;
457
	arg1 = ( x << 16 ) + sizeX;
458
	arg2 = ( y << 16 ) + sizeY;
458
	arg2 = ( y << 16 ) + sizeY;
459
	arg3 = ( mainAreaType << 24 ) | mainAreaColour;
459
	arg3 = ( mainAreaType << 24 ) | mainAreaColour;
460
	arg4 = ( headerType << 24 ) | headerColour;
460
	arg4 = ( headerType << 24 ) | headerColour;
461
	//
461
	//
462
	__asm{
462
	__asm{
463
		mov eax, 0
463
		mov eax, 0
464
		mov ebx, arg1
464
		mov ebx, arg1
465
		mov ecx, arg2
465
		mov ecx, arg2
466
		mov edx, arg3
466
		mov edx, arg3
467
		mov esi, arg4
467
		mov esi, arg4
468
		mov edi, borderColour
468
		mov edi, borderColour
469
		int 0x40
469
		int 0x40
470
	}
470
	}
471
}
471
}
472
 
472
 
473
 
473
 
474
// ôóíêöèÿ 1 ïîñòàâèòü òî÷êó
474
// ôóíêöèÿ 1 ïîñòàâèòü òî÷êó
475
void kos_PutPixel( Dword x, Dword y, Dword colour )
475
void kos_PutPixel( Dword x, Dword y, Dword colour )
476
{
476
{
477
	//
477
	//
478
	__asm{
478
	__asm{
479
		mov eax, 1
479
		mov eax, 1
480
		mov ebx, x
480
		mov ebx, x
481
		mov ecx, y
481
		mov ecx, y
482
		mov edx, colour
482
		mov edx, colour
483
		int 0x40
483
		int 0x40
484
	}
484
	}
485
}
485
}
486
 
486
 
487
 
487
 
488
// ôóíêöèÿ 2 ïîëó÷èòü êîä íàæàòîé êëàâèøè
488
// ôóíêöèÿ 2 ïîëó÷èòü êîä íàæàòîé êëàâèøè
489
bool kos_GetKey( Byte &keyCode )
489
bool kos_GetKey( Byte &keyCode )
490
{
490
{
491
	Dword result;
491
	Dword result;
492
 
492
 
493
	//
493
	//
494
	__asm{
494
	__asm{
495
		mov eax, 2
495
		mov eax, 2
496
		int 0x40
496
		int 0x40
497
		mov result, eax
497
		mov result, eax
498
	}
498
	}
499
	//
499
	//
500
	keyCode = result >> 8;
500
	keyCode = result >> 8;
501
	//
501
	//
502
	return ( result & 0xFF ) == 0;
502
	return ( result & 0xFF ) == 0;
503
}
503
}
504
 
504
 
505
 
505
 
506
// ôóíêöèÿ 3 ïîëó÷èòü âðåìÿ
506
// ôóíêöèÿ 3 ïîëó÷èòü âðåìÿ
507
Dword kos_GetSystemClock()
507
Dword kos_GetSystemClock()
508
{
508
{
509
//	Dword result;
509
//	Dword result;
510
 
510
 
511
	//
511
	//
512
	__asm{
512
	__asm{
513
		mov eax, 3
513
		mov eax, 3
514
		int 0x40
514
		int 0x40
515
//		mov result, eax
515
//		mov result, eax
516
	}
516
	}
517
	//
517
	//
518
//	return result;
518
//	return result;
519
}
519
}
520
 
520
 
521
 
521
 
522
// ôóíêöèÿ 4
522
// ôóíêöèÿ 4
523
void kos_WriteTextToWindow(
523
void kos_WriteTextToWindow(
524
	Word x,
524
	Word x,
525
	Word y,
525
	Word y,
526
	Byte fontType,
526
	Byte fontType,
527
	Dword textColour,
527
	Dword textColour,
528
	char *textPtr,
528
	char *textPtr,
529
	Dword textLen
529
	Dword textLen
530
	)
530
	)
531
{
531
{
532
	Dword arg1, arg2;
532
	Dword arg1, arg2;
533
 
533
 
534
	//
534
	//
535
	arg1 = ( x << 16 ) | y;
535
	arg1 = ( x << 16 ) | y;
536
	arg2 = ( fontType << 24 ) | textColour;
536
	arg2 = ( fontType << 24 ) | textColour;
537
	//
537
	//
538
	__asm{
538
	__asm{
539
		mov eax, 4
539
		mov eax, 4
540
		mov ebx, arg1
540
		mov ebx, arg1
541
		mov ecx, arg2
541
		mov ecx, arg2
542
		mov edx, textPtr
542
		mov edx, textPtr
543
		mov esi, textLen
543
		mov esi, textLen
544
		int 0x40
544
		int 0x40
545
	}
545
	}
546
}
546
}
547
 
547
 
548
 
548
 
549
// ôóíêöèÿ 5 ïàóçà, â ñîòûõ äîëÿõ ñåêóíäû
549
// ôóíêöèÿ 5 ïàóçà, â ñîòûõ äîëÿõ ñåêóíäû
550
void kos_Pause( Dword value )
550
void kos_Pause( Dword value )
551
{
551
{
552
	//
552
	//
553
	__asm{
553
	__asm{
554
		mov eax, 5
554
		mov eax, 5
555
		mov ebx, value
555
		mov ebx, value
556
		int 0x40
556
		int 0x40
557
	}
557
	}
558
}
558
}
559
 
559
 
560
 
560
 
561
// ôóíêöèÿ 7 íàðèñîâàòü èçîáðàæåíèå
561
// ôóíêöèÿ 7 íàðèñîâàòü èçîáðàæåíèå
562
void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y )
562
void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y )
563
{
563
{
564
	Dword arg1, arg2;
564
	Dword arg1, arg2;
565
 
565
 
566
	//
566
	//
567
	arg1 = ( sizeX << 16 ) | sizeY;
567
	arg1 = ( sizeX << 16 ) | sizeY;
568
	arg2 = ( x << 16 ) | y;
568
	arg2 = ( x << 16 ) | y;
569
	//
569
	//
570
	__asm{
570
	__asm{
571
		mov eax, 7
571
		mov eax, 7
572
		mov ebx, imagePtr
572
		mov ebx, imagePtr
573
		mov ecx, arg1
573
		mov ecx, arg1
574
		mov edx, arg2
574
		mov edx, arg2
575
		int 0x40
575
		int 0x40
576
	}
576
	}
577
}
577
}
578
 
578
 
579
 
579
 
580
 
580
 
581
// ôóíêöèÿ 8 îïðåäåëèòü êíîïêó
581
// ôóíêöèÿ 8 îïðåäåëèòü êíîïêó
582
void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour )
582
void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour )
583
{
583
{
584
	Dword arg1, arg2;
584
	Dword arg1, arg2;
585
 
585
 
586
	//
586
	//
587
	arg1 = ( x << 16 ) | sizeX;
587
	arg1 = ( x << 16 ) | sizeX;
588
	arg2 = ( y << 16 ) | sizeY;
588
	arg2 = ( y << 16 ) | sizeY;
589
	//
589
	//
590
	__asm{
590
	__asm{
591
		mov eax, 8
591
		mov eax, 8
592
		mov ebx, arg1
592
		mov ebx, arg1
593
		mov ecx, arg2
593
		mov ecx, arg2
594
		mov edx, buttonID
594
		mov edx, buttonID
595
		mov esi, colour
595
		mov esi, colour
596
		int 0x40
596
		int 0x40
597
	}
597
	}
598
}
598
}
599
 
599
 
600
 
600
 
601
// ôóíêöèÿ 9 - èíôîðìàöèÿ î ïðîöåññå
601
// ôóíêöèÿ 9 - èíôîðìàöèÿ î ïðîöåññå
602
Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID )
602
Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID )
603
{
603
{
604
//	Dword result;
604
//	Dword result;
605
 
605
 
606
	//
606
	//
607
	__asm{
607
	__asm{
608
		mov eax, 9
608
		mov eax, 9
609
		mov ebx, targetPtr
609
		mov ebx, targetPtr
610
		mov ecx, processID
610
		mov ecx, processID
611
		int 0x40
611
		int 0x40
612
//		mov result, eax
612
//		mov result, eax
613
	}
613
	}
614
	//
614
	//
615
//	return result;
615
//	return result;
616
}
616
}
617
 
617
 
618
 
618
 
619
// ôóíêöèÿ 10
619
// ôóíêöèÿ 10
620
Dword kos_WaitForEvent()
620
Dword kos_WaitForEvent()
621
{
621
{
622
//	Dword result;
622
//	Dword result;
623
 
623
 
624
	__asm{
624
	__asm{
625
		mov eax, 10
625
		mov eax, 10
626
		int 0x40
626
		int 0x40
627
//		mov result, eax
627
//		mov result, eax
628
	}
628
	}
629
	
629
	
630
//	return result;
630
//	return result;
631
}
631
}
632
 
632
 
633
 
633
 
634
// ôóíêöèÿ 11
634
// ôóíêöèÿ 11
635
Dword kos_CheckForEvent()
635
Dword kos_CheckForEvent()
636
{
636
{
637
//	Dword result;
637
//	Dword result;
638
 
638
 
639
	__asm{
639
	__asm{
640
		mov eax, 11
640
		mov eax, 11
641
		int 0x40
641
		int 0x40
642
//		mov result, eax
642
//		mov result, eax
643
	}
643
	}
644
	
644
	
645
//	return result;
645
//	return result;
646
}
646
}
647
 
647
 
648
 
648
 
649
// ôóíêöèÿ 12
649
// ôóíêöèÿ 12
650
void kos_WindowRedrawStatus( Dword status )
650
void kos_WindowRedrawStatus( Dword status )
651
{
651
{
652
	__asm{
652
	__asm{
653
		mov eax, 12
653
		mov eax, 12
654
		mov ebx, status
654
		mov ebx, status
655
		int 0x40
655
		int 0x40
656
	}
656
	}
657
}
657
}
658
 
658
 
659
 
659
 
660
// ôóíêöèÿ 13 íàðèñîâàòü ïîëîñó
660
// ôóíêöèÿ 13 íàðèñîâàòü ïîëîñó
661
void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour )
661
void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour )
662
{
662
{
663
	Dword arg1, arg2;
663
	Dword arg1, arg2;
664
 
664
 
665
	//
665
	//
666
	arg1 = ( x << 16 ) | sizeX;
666
	arg1 = ( x << 16 ) | sizeX;
667
	arg2 = ( y << 16 ) | sizeY;
667
	arg2 = ( y << 16 ) | sizeY;
668
	//
668
	//
669
	__asm{
669
	__asm{
670
		mov eax, 13
670
		mov eax, 13
671
		mov ebx, arg1
671
		mov ebx, arg1
672
		mov ecx, arg2
672
		mov ecx, arg2
673
		mov edx, colour
673
		mov edx, colour
674
		int 0x40
674
		int 0x40
675
	}
675
	}
676
}
676
}
677
 
677
 
678
 
678
 
679
// ôóíêöèÿ 17
679
// ôóíêöèÿ 17
680
bool kos_GetButtonID( Dword &buttonID )
680
bool kos_GetButtonID( Dword &buttonID )
681
{
681
{
682
	Dword result;
682
	Dword result;
683
 
683
 
684
	//
684
	//
685
	__asm{
685
	__asm{
686
		mov eax, 17
686
		mov eax, 17
687
		int 0x40
687
		int 0x40
688
		mov result, eax
688
		mov result, eax
689
	}
689
	}
690
	//
690
	//
691
	buttonID = result >> 8;
691
	buttonID = result >> 8;
692
	//
692
	//
693
	return (result & 0xFF) == 0;
693
	return (result & 0xFF) == 0;
694
}
694
}
695
 
695
 
696
 
696
 
697
// ôóíêöèÿ 23
697
// ôóíêöèÿ 23
698
Dword kos_WaitForEvent( Dword timeOut )
698
Dword kos_WaitForEventTimeout( Dword timeOut )
699
{
699
{
700
//	Dword result;
700
//	Dword result;
701
 
701
 
702
	__asm{
702
	__asm{
703
		mov eax, 23
703
		mov eax, 23
704
		mov ebx, timeOut
704
		mov ebx, timeOut
705
		int 0x40
705
		int 0x40
706
//		mov result, eax
706
//		mov result, eax
707
	}
707
	}
708
	
708
	
709
//	return result;
709
//	return result;
710
}
710
}
711
 
711
 
712
 
712
 
713
// ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37
713
// ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37
714
void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY )
714
void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY )
715
{
715
{
716
	Dword mB;
716
	Dword mB;
717
	Word curX;
717
	Word curX;
718
	Word curY;
718
	Word curY;
719
	sProcessInfo sPI;
719
	sProcessInfo sPI;
720
 
720
 
721
	//
721
	//
722
	__asm{
722
	__asm{
723
		mov		eax, 37
723
		mov		eax, 37
724
		mov		ebx, 0
724
		mov		ebx, 0
725
		int		0x40
725
		int		0x40
726
		mov		curY, ax
726
		mov		curY, ax
727
		shr		eax, 16
727
		shr		eax, 16
728
		mov		curX, ax
728
		mov		curX, ax
729
		mov		eax, 37
729
		mov		eax, 37
730
		mov		ebx, 2
730
		mov		ebx, 2
731
		int		0x40
731
		int		0x40
732
		mov		mB, eax
732
		mov		mB, eax
733
	}
733
	}
734
	//
734
	//
735
	kos_ProcessInfo( &sPI );
735
	kos_ProcessInfo( &sPI );
736
	//
736
	//
737
	buttons = mB;
737
	buttons = mB;
738
	cursorX = curX - sPI.processInfo.x_start;
738
	cursorX = curX - sPI.processInfo.x_start;
739
	cursorY = curY - sPI.processInfo.y_start;
739
	cursorY = curY - sPI.processInfo.y_start;
740
}
740
}
741
 
741
 
742
 
742
 
743
// ôóíêöèÿ 40 óñòàíîâèòü ìàñêó ñîáûòèé
743
// ôóíêöèÿ 40 óñòàíîâèòü ìàñêó ñîáûòèé
744
void kos_SetMaskForEvents( Dword mask )
744
void kos_SetMaskForEvents( Dword mask )
745
{
745
{
746
	//
746
	//
747
	__asm{
747
	__asm{
748
		mov eax, 40
748
		mov eax, 40
749
		mov ebx, mask
749
		mov ebx, mask
750
		int 0x40
750
		int 0x40
751
	}
751
	}
752
}
752
}
753
 
753
 
754
 
754
 
755
// ôóíêöèÿ 47 âûâåñòè â îêíî ïðèëîæåíèÿ ÷èñëî
755
// ôóíêöèÿ 47 âûâåñòè â îêíî ïðèëîæåíèÿ ÷èñëî
756
void kos_DisplayNumberToWindow(
756
void kos_DisplayNumberToWindow(
757
   Dword value,
757
   Dword value,
758
   Dword digitsNum,
758
   Dword digitsNum,
759
   Word x,
759
   Word x,
760
   Word y,
760
   Word y,
761
   Dword colour,
761
   Dword colour,
762
   eNumberBase nBase,
762
   eNumberBase nBase,
763
   bool valueIsPointer
763
   bool valueIsPointer
764
   )
764
   )
765
{
765
{
766
	Dword arg1, arg2;
766
	Dword arg1, arg2;
767
 
767
 
768
	//
768
	//
769
	arg1 = ( valueIsPointer ? 1 : 0 ) |
769
	arg1 = ( valueIsPointer ? 1 : 0 ) |
770
		( ((Byte)nBase) << 8 ) |
770
		( ((Byte)nBase) << 8 ) |
771
		( ( digitsNum & 0x1F ) << 16 );
771
		( ( digitsNum & 0x1F ) << 16 );
772
	arg2 = ( x << 16 ) | y;
772
	arg2 = ( x << 16 ) | y;
773
	//
773
	//
774
	__asm{
774
	__asm{
775
		mov eax, 47
775
		mov eax, 47
776
		mov ebx, arg1
776
		mov ebx, arg1
777
		mov ecx, value
777
		mov ecx, value
778
		mov edx, arg2
778
		mov edx, arg2
779
		mov esi, colour
779
		mov esi, colour
780
		int 0x40
780
		int 0x40
781
	}
781
	}
782
}
782
}
783
 
783
 
784
 
784
 
785
// ôóíêöèÿ 70 äîñòóï ê ôàéëîâîé ñèñòåìå
785
// ôóíêöèÿ 70 äîñòóï ê ôàéëîâîé ñèñòåìå
786
Dword kos_FileSystemAccess( kosFileInfo *fileInfo )
786
Dword kos_FileSystemAccess( kosFileInfo *fileInfo )
787
{
787
{
788
//	Dword result;
788
//	Dword result;
789
 
789
 
790
	//
790
	//
791
	__asm{
791
	__asm{
792
		mov eax, 70
792
		mov eax, 70
793
		mov ebx, fileInfo
793
		mov ebx, fileInfo
794
		int 0x40
794
		int 0x40
795
//		mov result, eax
795
//		mov result, eax
796
	}
796
	}
797
	//
797
	//
798
//	return result;
798
//	return result;
799
}
799
}
800
 
800
 
801
 
801
 
802
// ôóíêöèÿ 63 âûâîä ñèìâîëÿ â îêíî îòëàäêè
802
// ôóíêöèÿ 63 âûâîä ñèìâîëÿ â îêíî îòëàäêè
803
void kos_DebugOutChar( char ccc )
803
void kos_DebugOutChar( char ccc )
804
{
804
{
805
	//
805
	//
806
	__asm{
806
	__asm{
807
		mov eax, 63
807
		mov eax, 63
808
		mov ebx, 1
808
		mov ebx, 1
809
		mov cl, ccc
809
		mov cl, ccc
810
		int 0x40
810
		int 0x40
811
	}
811
	}
812
}
812
}
813
 
813
 
814
 
814
 
815
// ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû
815
// ôóíêöèÿ 66 ðåæèì ïîëó÷åíèÿ äàííûõ îò êëàâèàòóðû
816
void kos_SetKeyboardDataMode( Dword mode )
816
void kos_SetKeyboardDataMode( Dword mode )
817
{
817
{
818
	//
818
	//
819
	__asm{
819
	__asm{
820
		mov eax, 66
820
		mov eax, 66
821
		mov ebx, 1
821
		mov ebx, 1
822
		mov ecx, mode
822
		mov ecx, mode
823
		int 0x40
823
		int 0x40
824
	}
824
	}
825
}
825
}
826
 
826
 
827
 
827
 
828
// âûâîä ñòðîêè â îêíî îòëàäêè
828
// âûâîä ñòðîêè â îêíî îòëàäêè
829
void rtlDebugOutString( char *str )
829
void rtlDebugOutString( char *str )
830
{
830
{
831
	//
831
	//
832
	for ( ; str[0] != 0; str++ )
832
	for ( ; str[0] != 0; str++ )
833
	{
833
	{
834
		kos_DebugOutChar( str[0] );
834
		kos_DebugOutChar( str[0] );
835
	}
835
	}
836
	//
836
	//
837
	kos_DebugOutChar( 13 );
837
	kos_DebugOutChar( 13 );
838
	kos_DebugOutChar( 10 );
838
	kos_DebugOutChar( 10 );
839
}
839
}
840
 
840
 
841
 
841
 
842
// ôóíêöèÿ 64 èçìåíåíèå êîëè÷åñòâà ïàìÿòè, âûäåëåííîé äëÿ ïðîãðàììû
842
// ôóíêöèÿ 64 èçìåíåíèå êîëè÷åñòâà ïàìÿòè, âûäåëåííîé äëÿ ïðîãðàììû
843
bool kos_ApplicationMemoryResize( Dword targetSize )
843
bool kos_ApplicationMemoryResize( Dword targetSize )
844
{
844
{
845
	Dword result;
845
	Dword result;
846
 
846
 
847
	//
847
	//
848
	__asm{
848
	__asm{
849
		mov eax, 64
849
		mov eax, 64
850
		mov ebx, 1
850
		mov ebx, 1
851
		mov ecx, targetSize
851
		mov ecx, targetSize
852
		int 0x40
852
		int 0x40
853
		mov result, eax
853
		mov result, eax
854
	}
854
	}
855
	//
855
	//
856
	return result == 0;
856
	return result == 0;
857
}
857
}
858
 
858
 
859
 
859
 
860
// ôóíêöèÿ 67 èçìåíèòü ïàðàìåòðû îêíà, ïàðàìåòð == -1 íå ìåíÿåòñÿ
860
// ôóíêöèÿ 67 èçìåíèòü ïàðàìåòðû îêíà, ïàðàìåòð == -1 íå ìåíÿåòñÿ
861
void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY )
861
void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY )
862
{
862
{
863
	//
863
	//
864
	__asm{
864
	__asm{
865
		mov eax, 67
865
		mov eax, 67
866
		mov ebx, x
866
		mov ebx, x
867
		mov ecx, y
867
		mov ecx, y
868
		mov edx, sizeX
868
		mov edx, sizeX
869
		mov esi, sizeY
869
		mov esi, sizeY
870
		int 0x40
870
		int 0x40
871
	}
871
	}
872
}
872
}
873
 
873
 
874
void kos_InitHeap()
874
void kos_InitHeap()
875
{
875
{
876
	__asm{
876
	__asm{
877
		mov eax, 68
877
		mov eax, 68
878
		mov ebx, 11
878
		mov ebx, 11
879
		int 0x40
879
		int 0x40
880
	}
880
	}
881
}
881
}
882
 
882
 
883
 
883
 
884
 
884
 
885
// âûçîâ àáñòðàêòíîãî ìåòîäà
885
// âûçîâ àáñòðàêòíîãî ìåòîäà
886
int __cdecl _purecall()
886
int __cdecl _purecall()
887
{
887
{
888
	rtlDebugOutString( pureCallMessage );
888
	rtlDebugOutString( pureCallMessage );
889
	kos_ExitApp();
889
	kos_ExitApp();
890
	return 0;
890
	return 0;
891
}
891
}
892
 
892
 
893
 
893
 
894
// âûçîâ ñòàòè÷åñêèõ èíèöèàëèçàòîðîâ
894
// âûçîâ ñòàòè÷åñêèõ èíèöèàëèçàòîðîâ
895
// çàîäíî èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë
895
// çàîäíî èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë
896
//#pragma section(".CRT$XCA",long,read,write)
896
//#pragma section(".CRT$XCA",long,read,write)
897
//#pragma section(".CRT$XCZ",long,read,write)
897
//#pragma section(".CRT$XCZ",long,read,write)
898
#pragma data_seg(".CRT$XCA")
898
#pragma data_seg(".CRT$XCA")
899
#pragma data_seg(".CRT$XCZ")
899
#pragma data_seg(".CRT$XCZ")
900
typedef void (__cdecl *_PVFV)(void);
900
typedef void (__cdecl *_PVFV)(void);
901
//__declspec(allocate(".CRT$XCA"))  _PVFV __xc_a[1] = { NULL };
901
//__declspec(allocate(".CRT$XCA"))  _PVFV __xc_a[1] = { NULL };
902
//__declspec(allocate(".CRT$XCZ"))  _PVFV __xc_z[1] = { NULL };
902
//__declspec(allocate(".CRT$XCZ"))  _PVFV __xc_z[1] = { NULL };
903
//
903
//
904
extern void ALMOST_HALF_init();
904
extern void ALMOST_HALF_init();
905
#pragma comment(linker, "/merge:.CRT=.rdata")
905
#pragma comment(linker, "/merge:.CRT=.rdata")
906
//
906
//
907
void crtStartUp()
907
void crtStartUp()
908
{
908
{
909
#ifdef AUTOBUILD
909
#ifdef AUTOBUILD
910
// linker will try to remove unused variables; force header to be included
910
// linker will try to remove unused variables; force header to be included
911
	header.header;
911
	header.header;
912
#endif
912
#endif
913
	// âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì
913
	// âûçûâàåì èíèöèàëèçàòîðû ïî ñïèñêó, NULL'û èãíîðèðóåì
914
	/*for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ )
914
	/*for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ )
915
	{
915
	{
916
		//
916
		//
917
		if ( *pbegin != NULL )
917
		if ( *pbegin != NULL )
918
			(**pbegin)();
918
			(**pbegin)();
919
	}*/
919
	}*/
920
	ALMOST_HALF_init();
920
	ALMOST_HALF_init();
921
	// èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
921
	// èíèöèàëèçèðóåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
922
	rtlSrand( kos_GetSystemClock() );
922
	rtlSrand( kos_GetSystemClock() );
923
#ifndef AUTOBUILD
923
#ifndef AUTOBUILD
924
	// ïóòü ê ôàéëó ïðîöåññà
924
	// ïóòü ê ôàéëó ïðîöåññà
925
	kosExePath = *((char **)0x20);
925
	kosExePath = *((char **)0x20);
926
#endif
926
#endif
927
	// âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ
927
	// âûçîâ ãëàâíîé ôóíêöèè ïðèëîæåíèÿ
928
	kos_Main();
928
	kos_Main();
929
	// âûõîä
929
	// âûõîä
930
	kos_ExitApp();
930
	kos_ExitApp();
931
}
931
}