Subversion Repositories Kolibri OS

Rev

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

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