Subversion Repositories Kolibri OS

Rev

Rev 7495 | Rev 7504 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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