1 | ; $Id: math64.asm,v 1.1 2001-07-20 15:41:43 sandervl Exp $
|
---|
2 |
|
---|
3 | ;/*
|
---|
4 | ; * Project Odin Software License can be found in LICENSE.TXT
|
---|
5 | ; * Win32 Exception handling + misc functions for OS/2
|
---|
6 | ; *
|
---|
7 | ; * Copyright 1998 Sander van Leeuwen
|
---|
8 | ; *
|
---|
9 | ; */
|
---|
10 |
|
---|
11 | ; 1999/08/09 PH see if we can do this as INLINE functions
|
---|
12 |
|
---|
13 | .386p
|
---|
14 | NAME odinfs
|
---|
15 |
|
---|
16 | DATA32 segment para use32 public 'DATA'
|
---|
17 | flt_A0CB4 dd 9.223372e18 ; DATA XREF: ODINCRTD_1030+1Ar
|
---|
18 | DATA32 ends
|
---|
19 |
|
---|
20 | CODE32 SEGMENT DWORD PUBLIC USE32 'CODE'
|
---|
21 | ASSUME DS:FLAT, SS:FLAT
|
---|
22 |
|
---|
23 | public __modi64
|
---|
24 | __modi64 proc near
|
---|
25 |
|
---|
26 | arg_0 = dword ptr 0Ch
|
---|
27 |
|
---|
28 | push edi
|
---|
29 | push ebx
|
---|
30 | mov edi, [esp+arg_0]
|
---|
31 | mov ebx, 80000000h
|
---|
32 | test edx, ebx
|
---|
33 | jz short loc_25FEB
|
---|
34 | not eax
|
---|
35 | not edx
|
---|
36 | add eax, 1
|
---|
37 | adc edx, 0
|
---|
38 | test edi, ebx
|
---|
39 | jz short loc_26005
|
---|
40 | not ecx
|
---|
41 | not edi
|
---|
42 | add ecx, 1
|
---|
43 | adc edi, 0
|
---|
44 | jmp short loc_2600F
|
---|
45 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
46 |
|
---|
47 | loc_25FE1: ; CODE XREF: ODINCRTD_1027+35j
|
---|
48 | mov ebx, edi
|
---|
49 | and ebx, 80000000h
|
---|
50 | jmp short loc_2600F
|
---|
51 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
52 |
|
---|
53 | loc_25FEB: ; CODE XREF: ODINCRTD_1027+Dj
|
---|
54 | test edi, ebx
|
---|
55 | jz short loc_25FE1
|
---|
56 | mov ebx, edi
|
---|
57 | not ebx
|
---|
58 | and ebx, 80000000h
|
---|
59 | not ecx
|
---|
60 | not edi
|
---|
61 | add ecx, 1
|
---|
62 | adc edi, 0
|
---|
63 | jmp short loc_2600F
|
---|
64 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
65 |
|
---|
66 | loc_26005: ; CODE XREF: ODINCRTD_1027+1Bj
|
---|
67 | mov ebx, edi
|
---|
68 | not ebx
|
---|
69 | and ebx, 80000000h
|
---|
70 |
|
---|
71 | loc_2600F: ; CODE XREF: ODINCRTD_1027+27j
|
---|
72 | ; ODINCRTD_1027+31j ...
|
---|
73 | test edi, edi
|
---|
74 | jnz short loc_26047
|
---|
75 | test ecx, ecx
|
---|
76 | jz short loc_2601B
|
---|
77 | cmp ecx, edx
|
---|
78 | jbe short loc_26053
|
---|
79 |
|
---|
80 | loc_2601B: ; CODE XREF: ODINCRTD_1027+5Dj
|
---|
81 | div ecx
|
---|
82 | mov eax, edx
|
---|
83 | xor edx, edx
|
---|
84 | test ebx, ebx
|
---|
85 | jz short loc_26087
|
---|
86 | not eax
|
---|
87 | not edx
|
---|
88 | add eax, 1
|
---|
89 | adc edx, 0
|
---|
90 | jmp short loc_26087
|
---|
91 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
92 |
|
---|
93 | loc_26031: ; CODE XREF: ODINCRTD_1027+99j
|
---|
94 | xor edx, edx
|
---|
95 | xor eax, eax
|
---|
96 | jmp short loc_26087
|
---|
97 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
98 |
|
---|
99 | loc_26037: ; CODE XREF: ODINCRTD_1027+93j
|
---|
100 | ; ODINCRTD_1027+97j
|
---|
101 | test ebx, ebx
|
---|
102 | jz short loc_26087
|
---|
103 | not eax
|
---|
104 | not edx
|
---|
105 | add eax, 1
|
---|
106 | adc edx, 0
|
---|
107 | jmp short loc_26087
|
---|
108 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
109 |
|
---|
110 | loc_26047: ; CODE XREF: ODINCRTD_1027+59j
|
---|
111 | cmp edx, edi
|
---|
112 | ja short loc_26053
|
---|
113 | jb short loc_26037
|
---|
114 | cmp eax, ecx
|
---|
115 | jb short loc_26037
|
---|
116 | jz short loc_26031
|
---|
117 |
|
---|
118 | loc_26053: ; CODE XREF: ODINCRTD_1027+61j
|
---|
119 | ; ODINCRTD_1027+91j
|
---|
120 | push ebp
|
---|
121 | push esi
|
---|
122 | xor esi, esi
|
---|
123 | xor ebp, ebp
|
---|
124 | mov bl, 40h ; '@'
|
---|
125 |
|
---|
126 | loc_2605B: ; CODE XREF: ODINCRTD_1027+BBj
|
---|
127 | shl eax, 1
|
---|
128 | rcl edx, 1
|
---|
129 | rcl esi, 1
|
---|
130 | rcl ebp, 1
|
---|
131 | cmp ebp, edi
|
---|
132 | ja short loc_2606D
|
---|
133 | jb short loc_26071
|
---|
134 | cmp esi, ecx
|
---|
135 | jb short loc_26071
|
---|
136 |
|
---|
137 | loc_2606D: ; CODE XREF: ODINCRTD_1027+ADj
|
---|
138 | sub esi, ecx
|
---|
139 | sbb ebp, edi
|
---|
140 |
|
---|
141 | loc_26071: ; CODE XREF: ODINCRTD_1027+AFj
|
---|
142 | ; ODINCRTD_1027+B3j
|
---|
143 | dec bl
|
---|
144 | jnz short loc_2605B
|
---|
145 | mov eax, esi
|
---|
146 | mov edx, ebp
|
---|
147 | test ebx, ebx
|
---|
148 | jz short loc_26085
|
---|
149 | xor eax, eax
|
---|
150 | xor edx, edx
|
---|
151 | sub eax, esi
|
---|
152 | sbb edx, ebp
|
---|
153 |
|
---|
154 | loc_26085: ; CODE XREF: ODINCRTD_1027+C3j
|
---|
155 | pop esi
|
---|
156 | pop ebp
|
---|
157 |
|
---|
158 | loc_26087: ; CODE XREF: ODINCRTD_1027+6Bj
|
---|
159 | ; ODINCRTD_1027+77j ...
|
---|
160 | pop ebx
|
---|
161 | pop edi
|
---|
162 | retn
|
---|
163 | __modi64 endp
|
---|
164 |
|
---|
165 | public __modu64
|
---|
166 | __modu64 proc near ; CODE XREF: sub_473C0+46p
|
---|
167 | ; sub_4A490+348p ...
|
---|
168 |
|
---|
169 | arg_0 = dword ptr 8
|
---|
170 |
|
---|
171 | push edi
|
---|
172 | mov edi, [esp+arg_0]
|
---|
173 | test edi, edi
|
---|
174 | jnz short loc_26B3F
|
---|
175 | test ecx, ecx
|
---|
176 | jz short loc_26B31
|
---|
177 | cmp ecx, edx
|
---|
178 | jbe short loc_26B4B
|
---|
179 |
|
---|
180 | loc_26B31: ; CODE XREF: ODINCRTD_1028+Bj
|
---|
181 | div ecx
|
---|
182 | mov eax, edx
|
---|
183 | xor edx, edx
|
---|
184 | jmp short loc_26B78
|
---|
185 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
186 |
|
---|
187 | loc_26B39: ; CODE XREF: ODINCRTD_1028+29j
|
---|
188 | xor eax, eax
|
---|
189 | xor edx, edx
|
---|
190 | jmp short loc_26B78
|
---|
191 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
192 |
|
---|
193 | loc_26B3F: ; CODE XREF: ODINCRTD_1028+7j
|
---|
194 | cmp edx, edi
|
---|
195 | ja short loc_26B4B
|
---|
196 | jb short loc_26B78
|
---|
197 | cmp eax, ecx
|
---|
198 | jb short loc_26B78
|
---|
199 | jz short loc_26B39
|
---|
200 |
|
---|
201 | loc_26B4B: ; CODE XREF: ODINCRTD_1028+Fj
|
---|
202 | ; ODINCRTD_1028+21j
|
---|
203 | push ebp
|
---|
204 | push ebx
|
---|
205 | push esi
|
---|
206 | xor esi, esi
|
---|
207 | xor ebp, ebp
|
---|
208 | mov bl, 40h ; '@'
|
---|
209 |
|
---|
210 | loc_26B54: ; CODE XREF: ODINCRTD_1028+4Fj
|
---|
211 | shl eax, 1
|
---|
212 | rcl edx, 1
|
---|
213 | rcl esi, 1
|
---|
214 | rcl ebp, 1
|
---|
215 | cmp ebp, edi
|
---|
216 | ja short loc_26B66
|
---|
217 | jb short loc_26B6D
|
---|
218 | cmp esi, ecx
|
---|
219 | jb short loc_26B6D
|
---|
220 |
|
---|
221 | loc_26B66: ; CODE XREF: ODINCRTD_1028+3Ej
|
---|
222 | sub esi, ecx
|
---|
223 | sbb ebp, edi
|
---|
224 | or eax, 1
|
---|
225 |
|
---|
226 | loc_26B6D: ; CODE XREF: ODINCRTD_1028+40j
|
---|
227 | ; ODINCRTD_1028+44j
|
---|
228 | dec bl
|
---|
229 | jnz short loc_26B54
|
---|
230 | mov eax, esi
|
---|
231 | mov edx, ebp
|
---|
232 | pop esi
|
---|
233 | pop ebx
|
---|
234 | pop ebp
|
---|
235 |
|
---|
236 | loc_26B78: ; CODE XREF: ODINCRTD_1028+17j
|
---|
237 | ; ODINCRTD_1028+1Dj ...
|
---|
238 | pop edi
|
---|
239 | retn
|
---|
240 | __modu64 endp
|
---|
241 |
|
---|
242 | public __multi64
|
---|
243 | __multi64 proc near ; CODE XREF: sub_259BA+258p
|
---|
244 | ; sub_259BA+337p ...
|
---|
245 |
|
---|
246 | arg_0 = dword ptr 8
|
---|
247 |
|
---|
248 | push edx
|
---|
249 | or edx, [esp+arg_0]
|
---|
250 | jnz short loc_2D5E3
|
---|
251 | mul ecx
|
---|
252 | pop ecx
|
---|
253 | retn
|
---|
254 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
255 |
|
---|
256 | loc_2D5E3: ; CODE XREF: ODINCRTD_1029+5j
|
---|
257 | push ebx
|
---|
258 | push eax
|
---|
259 | mul [esp+8+arg_0]
|
---|
260 | mov ebx, eax
|
---|
261 | mov eax, ecx
|
---|
262 | mul dword ptr [esp+8]
|
---|
263 | add ebx, eax
|
---|
264 | pop eax
|
---|
265 | mul ecx
|
---|
266 | add edx, ebx
|
---|
267 | pop ebx
|
---|
268 | pop ecx
|
---|
269 | retn
|
---|
270 | __multi64 endp
|
---|
271 |
|
---|
272 | public __u64toflt
|
---|
273 | __u64toflt proc near
|
---|
274 |
|
---|
275 | var_C = tbyte ptr -0Ch
|
---|
276 |
|
---|
277 | mov ecx, edx
|
---|
278 | or edx, 80000000h
|
---|
279 | push 403Eh
|
---|
280 | push edx
|
---|
281 | push eax
|
---|
282 | fld [esp+0Ch+var_C]
|
---|
283 | test ecx, 80000000h
|
---|
284 | jnz short loc_22AD8
|
---|
285 | fsub flt_A0CB4
|
---|
286 |
|
---|
287 | loc_22AD8: ; CODE XREF: ODINCRTD_1030+18j
|
---|
288 | add esp, 0Ch
|
---|
289 | retn
|
---|
290 | __u64toflt endp
|
---|
291 |
|
---|
292 | public __divi64
|
---|
293 | __divi64 proc near ; CODE XREF: cseg02:0002E670p
|
---|
294 | ; cseg02:0002E6FAp
|
---|
295 |
|
---|
296 | var_4 = word ptr -4
|
---|
297 | var_2 = word ptr -2
|
---|
298 | arg_0 = qword ptr 4
|
---|
299 | arg_8 = qword ptr 0Ch
|
---|
300 |
|
---|
301 | mov dword ptr [esp+arg_0+4], edx
|
---|
302 | or edx, dword ptr [esp+arg_8+4]
|
---|
303 | jnz short loc_260D1
|
---|
304 | xor edx, edx
|
---|
305 | div ecx
|
---|
306 | xor edx, edx
|
---|
307 | retn
|
---|
308 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
309 |
|
---|
310 | loc_260D1: ; CODE XREF: ODINCRTD_1031+8j
|
---|
311 | sub esp, 4
|
---|
312 | mov dword ptr [esp+4+arg_0], eax
|
---|
313 | mov dword ptr [esp+4+arg_8], ecx
|
---|
314 | fstcw [esp+4+var_4]
|
---|
315 | mov ax, [esp+4+var_4]
|
---|
316 | or ax, 0F00h
|
---|
317 | mov [esp+4+var_2], ax
|
---|
318 | wait
|
---|
319 | fldcw [esp+4+var_2]
|
---|
320 | fild [esp+4+arg_0]
|
---|
321 | fild [esp+4+arg_8]
|
---|
322 | fdivp st(1), st
|
---|
323 | fistp [esp+4+arg_0]
|
---|
324 | fclex
|
---|
325 | wait
|
---|
326 | fldcw [esp+4+var_4]
|
---|
327 | add esp, 4
|
---|
328 | mov eax, dword ptr [esp+arg_0]
|
---|
329 | mov edx, dword ptr [esp+arg_0+4]
|
---|
330 | retn
|
---|
331 | __divi64 endp
|
---|
332 |
|
---|
333 | public __divu64
|
---|
334 | __divu64 proc near ; CODE XREF: cseg02:0002E2D6p
|
---|
335 | ; sub_473C0+2Ep ...
|
---|
336 |
|
---|
337 | arg_0 = dword ptr 8
|
---|
338 |
|
---|
339 | push edi
|
---|
340 | mov edi, [esp+arg_0]
|
---|
341 | test edi, edi
|
---|
342 | jnz short loc_26D12
|
---|
343 | test ecx, ecx
|
---|
344 | jz short loc_26CFD
|
---|
345 | cmp ecx, edx
|
---|
346 | jbe short loc_26D1E
|
---|
347 |
|
---|
348 | loc_26CFD: ; CODE XREF: ODINCRTD_1032+Bj
|
---|
349 | div ecx
|
---|
350 | xor edx, edx
|
---|
351 | jmp short loc_26D47
|
---|
352 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
353 |
|
---|
354 | loc_26D03: ; CODE XREF: ODINCRTD_1032+2Aj
|
---|
355 | ; ODINCRTD_1032+2Ej
|
---|
356 | xor edx, edx
|
---|
357 | xor eax, eax
|
---|
358 | jmp short loc_26D47
|
---|
359 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
360 |
|
---|
361 | loc_26D09: ; CODE XREF: ODINCRTD_1032+30j
|
---|
362 | xor edx, edx
|
---|
363 | mov eax, 1
|
---|
364 | jmp short loc_26D47
|
---|
365 | ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
---|
366 |
|
---|
367 | loc_26D12: ; CODE XREF: ODINCRTD_1032+7j
|
---|
368 | cmp edx, edi
|
---|
369 | ja short loc_26D1E
|
---|
370 | jb short loc_26D03
|
---|
371 | cmp eax, ecx
|
---|
372 | jb short loc_26D03
|
---|
373 | jz short loc_26D09
|
---|
374 |
|
---|
375 | loc_26D1E: ; CODE XREF: ODINCRTD_1032+Fj
|
---|
376 | ; ODINCRTD_1032+28j
|
---|
377 | push ebp
|
---|
378 | push ebx
|
---|
379 | push esi
|
---|
380 | xor esi, esi
|
---|
381 | xor ebp, ebp
|
---|
382 | mov bl, 40h ; '@'
|
---|
383 |
|
---|
384 | loc_26D27: ; CODE XREF: ODINCRTD_1032+56j
|
---|
385 | shl eax, 1
|
---|
386 | rcl edx, 1
|
---|
387 | rcl esi, 1
|
---|
388 | rcl ebp, 1
|
---|
389 | cmp ebp, edi
|
---|
390 | ja short loc_26D39
|
---|
391 | jb short loc_26D40
|
---|
392 | cmp esi, ecx
|
---|
393 | jb short loc_26D40
|
---|
394 |
|
---|
395 | loc_26D39: ; CODE XREF: ODINCRTD_1032+45j
|
---|
396 | sub esi, ecx
|
---|
397 | sbb ebp, edi
|
---|
398 | or eax, 1
|
---|
399 |
|
---|
400 | loc_26D40: ; CODE XREF: ODINCRTD_1032+47j
|
---|
401 | ; ODINCRTD_1032+4Bj
|
---|
402 | dec bl
|
---|
403 | jnz short loc_26D27
|
---|
404 | pop esi
|
---|
405 | pop ebx
|
---|
406 | pop ebp
|
---|
407 |
|
---|
408 | loc_26D47: ; CODE XREF: ODINCRTD_1032+15j
|
---|
409 | ; ODINCRTD_1032+1Bj ...
|
---|
410 | pop edi
|
---|
411 | retn
|
---|
412 | __divu64 endp
|
---|
413 |
|
---|
414 | CODE32 ENDS
|
---|
415 | END
|
---|