Rev 376 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
165 | serge | 1 | format MS COFF |
2 | |||
3 | include "proc32.inc" |
||
4 | |||
5 | section '.text' code readable executable |
||
6 | |||
7 | public _InitHeap@4 |
||
8 | public _UserAlloc@4 |
||
9 | public _CreateThread@8 |
||
10 | public _GetMousePos@4 |
||
11 | public _get_fileinfo@8 |
||
12 | public _read_file@20 |
||
376 | serge | 13 | public _get_key@4 |
165 | serge | 14 | public _get_button_id |
15 | public _DrawWindow@36 |
||
16 | public _make_button@24 |
||
17 | public _draw_bar@20 |
||
18 | public _write_text@20 |
||
19 | public _debug_out@4 |
||
20 | public _debug_out_hex@4 |
||
570 | serge | 21 | public _create_thread@12 |
165 | serge | 22 | |
570 | serge | 23 | |
165 | serge | 24 | public _memset |
25 | |||
26 | struc FILEIO |
||
27 | { .cmd dd ? |
||
28 | .offset dd ? |
||
29 | dd ? |
||
30 | .count dd ? |
||
31 | .buff dd ? |
||
32 | db ? |
||
33 | .name dd ? |
||
34 | }; |
||
35 | |||
36 | align 4 |
||
570 | serge | 37 | _create_thread@12: |
38 | .thr_proc equ esp+4 |
||
39 | .param equ esp+8 |
||
40 | .stack_size equ esp+12 |
||
41 | |||
42 | mov eax, 68 |
||
43 | mov ebx, 12 |
||
44 | mov ecx, [.stack_size] |
||
45 | add ecx, 4095 |
||
46 | and ecx, -4096 |
||
47 | int 0x40 |
||
48 | test eax, eax |
||
49 | jz .fail |
||
50 | |||
51 | lea edx, [eax+ecx-12] |
||
52 | mov [edx], dword .exit_point |
||
53 | mov ebx, [.param] |
||
54 | mov [edx+4], ebx |
||
55 | mov [edx+8], ecx |
||
56 | |||
57 | mov eax, 51 |
||
58 | mov ebx, 1 |
||
59 | mov ecx, [.thr_proc] |
||
60 | int 0x40 |
||
61 | ret 12 |
||
62 | .fail: |
||
63 | not eax |
||
64 | ret 12 |
||
65 | align 4 |
||
66 | .exit_point: |
||
67 | pop ecx |
||
68 | mov eax, 68 |
||
69 | mov ebx, 13 |
||
70 | int 0x40 |
||
71 | mov eax, -1 |
||
72 | int 0x40 |
||
73 | |||
74 | restore .thr_proc |
||
75 | restore .param |
||
76 | restore .stack_size |
||
77 | |||
78 | |||
79 | align 4 |
||
165 | serge | 80 | proc _get_button_id |
81 | mov eax,17 |
||
82 | int 0x40 |
||
83 | test al,al |
||
84 | jnz @F |
||
85 | shr eax,8 |
||
86 | ret |
||
87 | @@: |
||
88 | xor eax,eax |
||
89 | dec eax |
||
90 | ret |
||
91 | endp |
||
92 | |||
93 | align 4 |
||
94 | proc _get_fileinfo@8 stdcall, name:dword, info:dword |
||
95 | push ebx |
||
96 | push esi |
||
97 | push edi |
||
98 | xor eax, eax |
||
99 | mov ebx, [name] |
||
100 | mov ecx, [info] |
||
101 | |||
102 | mov [fileio.cmd], 5 |
||
103 | mov [fileio.offset], eax |
||
104 | mov [fileio.offset+4], eax |
||
105 | mov [fileio.count], eax |
||
106 | mov [fileio.buff], ecx |
||
107 | mov byte [fileio.buff+4], al |
||
108 | mov [fileio.name], ebx |
||
109 | |||
110 | mov eax, 70 |
||
111 | lea ebx, [fileio] |
||
112 | int 0x40 |
||
113 | pop edi |
||
114 | pop esi |
||
115 | pop ebx |
||
116 | ret |
||
117 | endp |
||
118 | |||
119 | align 4 |
||
120 | proc _read_file@20 stdcall,name:dword, buff:dword, offset:dword,\ |
||
121 | count:dword,reads:dword |
||
122 | push ebx |
||
123 | push esi |
||
124 | push edi |
||
125 | xor eax, eax |
||
126 | mov ebx, [name] |
||
127 | mov edx, [offset] |
||
128 | mov esi, [buff] |
||
129 | mov edi, [count] |
||
130 | |||
131 | mov [fileio.cmd], eax |
||
132 | mov [fileio.offset], edx |
||
133 | mov [fileio.offset+4], eax |
||
134 | mov [fileio.count], edi |
||
135 | mov [fileio.buff], esi |
||
136 | mov byte [fileio.buff+4], al |
||
137 | mov [fileio.name], ebx |
||
138 | |||
139 | mov eax, 70 |
||
140 | lea ebx, [fileio] |
||
141 | int 0x40 |
||
142 | mov esi, [reads] |
||
143 | test esi, esi |
||
144 | jz @f |
||
145 | mov [esi], ebx |
||
146 | @@: |
||
147 | pop edi |
||
148 | pop esi |
||
149 | pop ebx |
||
150 | ret |
||
151 | endp |
||
152 | |||
153 | align 4 |
||
376 | serge | 154 | proc _get_key@4 stdcall, key:dword |
155 | push ebx |
||
156 | push ecx |
||
165 | serge | 157 | mov eax, 2 |
158 | int 0x40 |
||
376 | serge | 159 | mov ebx, [key] |
160 | mov ecx, eax |
||
161 | shr ecx, 8 |
||
162 | mov [ebx], ecx |
||
163 | movzx eax, al |
||
164 | pop ecx |
||
165 | pop ebx |
||
165 | serge | 166 | ret |
167 | endp |
||
168 | |||
376 | serge | 169 | |
165 | serge | 170 | align 4 |
171 | proc _InitHeap@4 stdcall, heap_size:dword |
||
228 | serge | 172 | push ebx |
173 | mov eax, 68 |
||
174 | mov ebx, 11 |
||
165 | serge | 175 | mov ecx, [heap_size] |
228 | serge | 176 | int 0x40 |
177 | pop ebx |
||
178 | ret |
||
165 | serge | 179 | endp |
180 | |||
181 | align 4 |
||
182 | proc _UserAlloc@4 stdcall, alloc_size:dword |
||
228 | serge | 183 | push ebx |
184 | mov eax, 68 |
||
185 | mov ebx, 12 |
||
165 | serge | 186 | mov ecx, [alloc_size] |
228 | serge | 187 | int 0x40 |
188 | pop ebx |
||
189 | ret |
||
165 | serge | 190 | endp |
191 | |||
192 | align 4 |
||
193 | proc _CreateThread@8 stdcall, fn:dword, p_stack:dword |
||
194 | push ebx |
||
195 | mov eax, 51 |
||
196 | mov ebx, 1 |
||
197 | mov ecx, [fn] |
||
198 | mov edx,[p_stack] |
||
228 | serge | 199 | int 0x40 |
200 | pop ebx |
||
201 | ret |
||
165 | serge | 202 | endp |
203 | |||
204 | align 4 |
||
205 | proc _GetMousePos@4 stdcall,rel_type:dword |
||
570 | serge | 206 | push ebx |
165 | serge | 207 | mov eax, 37 |
208 | mov ebx, [rel_type] |
||
376 | serge | 209 | int 0x40 |
165 | serge | 210 | pop ebx |
376 | serge | 211 | ret |
165 | serge | 212 | endp |
213 | |||
214 | |||
215 | align 4 |
||
216 | proc _DrawWindow@36 stdcall, x:dword, y:dword, sx:dword, sy:dword,\ |
||
217 | workcolor:dword, style:dword, captioncolor:dword,\ |
||
570 | serge | 218 | windowtype:dword, bordercolor:dword |
165 | serge | 219 | push ebx edi esi |
220 | mov ebx, [x] |
||
221 | mov ecx, [y] |
||
222 | shl ebx, 16 |
||
223 | shl ecx, 16 |
||
224 | mov bx, word [sx] |
||
225 | mov cx, word [sy] |
||
226 | mov edx,[style] |
||
227 | shl edx,24 |
||
228 | add edx,[workcolor] |
||
229 | mov esi,[windowtype] |
||
230 | shl esi,24 |
||
231 | add esi,[captioncolor] |
||
232 | mov edi,[bordercolor] |
||
233 | xor eax,eax |
||
234 | int 0x40 |
||
235 | pop esi edi ebx |
||
236 | ret |
||
237 | endp |
||
238 | |||
239 | align 4 |
||
240 | _make_button@24: |
||
241 | ;arg1 - x |
||
242 | ;arg2 - y |
||
243 | ;arg3 - xsize |
||
244 | ;arg4 - ysize |
||
245 | ;arg5 - id |
||
246 | ;arg6 - color |
||
570 | serge | 247 | |
165 | serge | 248 | push ebx esi |
249 | mov ebx,[esp+12] |
||
250 | shl ebx,16 |
||
251 | mov bx,[esp+20] |
||
252 | mov ecx,[esp+16] |
||
253 | shl ecx,16 |
||
254 | mov cx,[esp+24] |
||
255 | mov edx,[esp+28] |
||
256 | mov esi,[esp+32] |
||
257 | mov eax,8 |
||
258 | int 0x40 |
||
259 | pop esi ebx |
||
260 | ret 24 |
||
261 | |||
262 | align 4 |
||
263 | _draw_bar@20: |
||
264 | ;arg1 - x |
||
265 | ;arg2 - y |
||
266 | ;arg3 - xsize |
||
267 | ;arg4 - ysize |
||
268 | ;arg5 - color |
||
269 | push ebx |
||
270 | mov eax,13 |
||
271 | mov ebx,[esp+8] |
||
272 | shl ebx,16 |
||
273 | mov bx,[esp+16] |
||
274 | mov ecx,[esp+12] |
||
275 | shl ecx,16 |
||
276 | mov cx,[esp+20] |
||
277 | mov edx,[esp+24] |
||
278 | int 0x40 |
||
279 | pop ebx |
||
280 | ret 20 |
||
281 | |||
282 | _write_text@20: |
||
283 | ;arg1 - x |
||
284 | ;arg2 - y |
||
285 | ;arg3 - color |
||
286 | ;arg4 - text |
||
287 | ;arg5 - len |
||
288 | push ebx esi |
||
289 | mov eax,4 |
||
290 | mov ebx,[esp+12] |
||
291 | shl ebx,16 |
||
292 | mov bx,[esp+16] |
||
293 | mov ecx,[esp+20] |
||
294 | mov edx,[esp+24] |
||
295 | mov esi,[esp+28] |
||
296 | int 0x40 |
||
297 | pop esi ebx |
||
298 | ret 20 |
||
299 | |||
300 | align 4 |
||
301 | proc _debug_out@4 stdcall, val:dword |
||
302 | push ebx |
||
228 | serge | 303 | mov ecx,[val] |
304 | mov ebx,1 |
||
305 | mov eax,63 |
||
306 | int 0x40 |
||
165 | serge | 307 | pop ebx |
308 | ret |
||
570 | serge | 309 | endp |
165 | serge | 310 | |
311 | align 4 |
||
312 | proc _debug_out_hex@4 stdcall val:dword |
||
313 | locals |
||
314 | count dd ? |
||
315 | endl |
||
316 | |||
317 | mov [count], 8 |
||
318 | .new_char: |
||
319 | rol [val], 4 |
||
320 | mov ecx, [val] |
||
321 | and ecx, 0x0f |
||
322 | mov cl,byte [__hexdigits+ecx] |
||
323 | mov eax, 63 |
||
324 | mov ebx, 1 |
||
325 | int 0x40 |
||
326 | dec [count] |
||
327 | jnz .new_char |
||
328 | ret |
||
329 | endp |
||
570 | serge | 330 | |
165 | serge | 331 | align 4 |
332 | _memset: |
||
333 | mov edx,[esp + 0ch] |
||
570 | serge | 334 | mov ecx,[esp + 4] |
165 | serge | 335 | |
570 | serge | 336 | test edx,edx |
337 | jz short toend |
||
338 | |||
165 | serge | 339 | xor eax,eax |
340 | mov al,[esp + 8] |
||
341 | |||
570 | serge | 342 | push edi |
343 | mov edi,ecx |
||
165 | serge | 344 | |
345 | cmp edx,4 |
||
570 | serge | 346 | jb tail |
347 | |||
165 | serge | 348 | neg ecx |
570 | serge | 349 | and ecx,3 |
350 | jz short dwords |
||
351 | |||
352 | sub edx,ecx |
||
165 | serge | 353 | adjust_loop: |
354 | mov [edi],al |
||
355 | add edi,1 |
||
356 | sub ecx,1 |
||
357 | jnz adjust_loop |
||
358 | |||
359 | dwords: |
||
570 | serge | 360 | mov ecx,eax |
361 | shl eax,8 |
||
362 | add eax,ecx |
||
363 | mov ecx,eax |
||
364 | shl eax,10h |
||
365 | add eax,ecx |
||
165 | serge | 366 | |
570 | serge | 367 | mov ecx,edx |
368 | and edx,3 |
||
369 | shr ecx,2 |
||
370 | jz tail |
||
371 | |||
372 | cld |
||
165 | serge | 373 | rep stosd |
374 | main_loop_tail: |
||
570 | serge | 375 | test edx,edx |
376 | jz finish |
||
165 | serge | 377 | |
378 | |||
379 | tail: |
||
570 | serge | 380 | mov [edi],al |
165 | serge | 381 | add edi,1 |
382 | |||
570 | serge | 383 | sub edx,1 |
384 | jnz tail |
||
165 | serge | 385 | |
386 | finish: |
||
570 | serge | 387 | mov eax,[esp + 8] |
388 | pop edi |
||
165 | serge | 389 | |
390 | ret |
||
391 | |||
392 | toend: |
||
570 | serge | 393 | mov eax,[esp + 4] |
165 | serge | 394 | |
395 | ret |
||
396 | |||
228 | serge | 397 | public _allmul |
398 | |||
570 | serge | 399 | _allmul: |
228 | serge | 400 | mov eax, [esp+8] |
401 | mov ecx, [esp+16] |
||
570 | serge | 402 | or ecx,eax |
228 | serge | 403 | mov ecx, [esp+12] |
570 | serge | 404 | jnz .hard |
228 | serge | 405 | mov eax, [esp+4] |
406 | mul ecx |
||
570 | serge | 407 | ret 16 |
228 | serge | 408 | .hard: |
409 | push ebx |
||
570 | serge | 410 | mul ecx |
228 | serge | 411 | mov ebx,eax |
412 | mov eax, [esp+8] |
||
413 | mul dword [esp+20] |
||
570 | serge | 414 | add ebx,eax |
228 | serge | 415 | mov eax,[esp+8] |
570 | serge | 416 | mul ecx |
417 | add edx,ebx |
||
228 | serge | 418 | pop ebx |
570 | serge | 419 | ret 16 |
228 | serge | 420 | |
421 | align 4 |
||
422 | _allshr: |
||
423 | cmp cl,64 |
||
424 | jae .sign |
||
425 | |||
426 | cmp cl, 32 |
||
427 | jae .MORE32 |
||
428 | shrd eax,edx,cl |
||
429 | sar edx,cl |
||
430 | ret |
||
431 | .MORE32: |
||
432 | mov eax,edx |
||
433 | sar edx,31 |
||
434 | and cl,31 |
||
435 | sar eax,cl |
||
436 | ret |
||
437 | .sign: |
||
438 | sar edx,31 |
||
439 | mov eax,edx |
||
440 | ret |
||
441 | |||
165 | serge | 442 | public __ftol2_sse |
443 | |||
444 | align 4 |
||
445 | __ftol2_sse: |
||
446 | push ebp |
||
447 | mov ebp, esp |
||
448 | sub esp, 20 |
||
449 | and esp, 0xFFFFFFF0 |
||
450 | fld st0 |
||
451 | fst dword [esp+18] |
||
452 | fistp qword [esp+10] |
||
453 | fild qword [esp+10] |
||
454 | mov edx, [esp+18] |
||
455 | mov eax, [esp+10] |
||
456 | test eax, eax |
||
457 | jz .QnaNZ |
||
570 | serge | 458 | |
165 | serge | 459 | .not_QnaNZ: |
460 | fsubp st1, st0 |
||
461 | test edx, edx |
||
462 | jns .pos |
||
463 | fstp dword [esp] |
||
464 | mov ecx, [esp] |
||
465 | xor ecx, 0x80000000 |
||
466 | add ecx, 0x7FFFFFFF |
||
467 | adc eax, 0 |
||
468 | mov edx, [esp+14] |
||
469 | adc edx, 0 |
||
470 | jmp .exit |
||
471 | .pos: |
||
472 | fstp dword [esp] |
||
473 | mov ecx, [esp] |
||
474 | add ecx, 0x7FFFFFFF |
||
475 | sbb eax, 0 |
||
476 | jmp .exit |
||
477 | .QnaNZ: |
||
478 | mov edx, [esp+14] |
||
479 | test edx, 0x7FFFFFFF |
||
480 | jne .not_QnaNZ |
||
481 | fstp dword [esp+18] |
||
482 | fstp dword [esp+18] |
||
570 | serge | 483 | .exit: |
165 | serge | 484 | leave |
485 | ret |
||
486 | |||
487 | public __fltused |
||
488 | __fltused dd 0 |
||
570 | serge | 489 | |
165 | serge | 490 | align 4 |
491 | __hexdigits db '0123456789ABCDEF' |
||
492 | |||
493 | align 4 |
||
494 | fileio FILEIO |
||
495 |