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 | }>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>>>>>>>>><>>> |