OSDN Git Service

ae06630e6bef202d3d51ad966fb4e2365b7e2352
[proj16/16.git] / 16 / w_modex / FIXED32.CPP
1 #include <stdio.h>\r
2 \r
3 #include "fixed32.hpp"\r
4 \r
5 Fixed32 SinTab[256];\r
6 Fixed32 CosTab[256];\r
7 \r
8 \r
9 void\r
10 initFixed32(void)\r
11 {\r
12     FILE *fp;\r
13 \r
14     fp = fopen("sintab.dat", "rb");\r
15     fread(SinTab, 4, 256, fp);\r
16     fread(CosTab, 4, 256, fp);\r
17     fclose(fp);\r
18 }\r
19 \r
20 \r
21 Fixed32\r
22 FixedMul(Fixed32 num1, Fixed32 num2)\r
23 {\r
24     long Mm1, Mm2;\r
25     short int MM, mm;\r
26     short int hi1, hi2, lo1, lo2;\r
27 \r
28     hi1 = (num1 >> 16);\r
29     hi2 = (num2 >> 16);\r
30     lo1 = (num1 & 0xFFFF);\r
31     lo2 = (num2 & 0xFFFF);\r
32 \r
33     MM  = (hi1 * hi2);\r
34     Mm1 = (lo2 * hi1);\r
35     Mm2 = (lo1 * hi2);\r
36     mm  = (lo1 * lo2);\r
37 \r
38     return (Mm1 + Mm2 + mm + (((long)MM) << 16));\r
39 }\r
40 \r
41 \r
42 Fixed32\r
43 FixedDiv(Fixed32 numer, Fixed32 denom)\r
44 {\r
45     return (numer / ROUND_FIXED_TO_INT(denom));\r
46 }\r
47 \r
48 \r
49 void\r
50 CosSin(Iangle theta, Fixed32 *Cos, Fixed32 *Sin)\r
51 {\r
52     *Sin = SinTab[theta];\r
53     *Cos = CosTab[theta];\r
54 }\r
55 \r
56 \r
57 /* ASM fixedpoint math routines\r
58 ;--------------------------------------------------\r
59 ; Sqrt - Fixed Point Square Root (High/Normal Precision)\r
60 ;    IN     : ecx\r
61 ;   OUT     : eax\r
62 ;  Modified : ebx,ecx,edx\r
63 Sqrt         PROC\r
64 \r
65 ;This is the High Precision version for the sqrt.\r
66 ;It gives the optimal 8.16 precision but takes\r
67 ;a little longer (24 iterations, 48 bits intead of\r
68 ;16 iterations and 32 bits)\r
69 \r
70         xor     eax,eax         ;eax is root\r
71         mov     ebx,40000000h\r
72 sqrt1:\r
73         mov     edx,ecx         ;edx = val\r
74         sub     edx,ebx         ;val - bitsqr\r
75         jb      sqrt2\r
76         sub     edx,eax         ;val - root\r
77         jb      sqrt2\r
78         mov     ecx,edx         ;val >= (root+bitsqr) -> accept subs\r
79         shr     eax,1           ;root >> 1\r
80         or      eax,ebx         ;root | bitsqr\r
81         shr     ebx,2           ;bitsqr>>2\r
82         jnz     sqrt1\r
83         jz      sqrt5\r
84 sqrt2:\r
85         shr     eax,1           ;val < (root+bitsqr) -> dont change val\r
86         shr     ebx,2           ;bitsqr>>2\r
87         jnz     sqrt1\r
88 ; we now have the 8.8 precision\r
89 \r
90 sqrt5:\r
91         mov     ebx,00004000h\r
92         shl     eax,16\r
93         shl     ecx,16\r
94 sqrt3:\r
95         mov     edx,ecx         ;edx = val\r
96         sub     edx,ebx         ;val - bitsqr\r
97         jb      sqrt4\r
98         sub     edx,eax         ;val - root\r
99         jb      sqrt4\r
100         mov     ecx,edx         ;val >= (root+bitsqr) -> accept subs\r
101         shr     eax,1           ;root >> 1\r
102         or      eax,ebx         ;root | bitsqr\r
103         shr     ebx,2           ;bitsqr>>2\r
104         jnz     sqrt3\r
105         ret\r
106 sqrt4:\r
107         shr     eax,1           ;val < (root+bitsqr) -> dont change val\r
108         shr     ebx,2           ;bitsqr>>2\r
109         jnz     sqrt3\r
110         ret\r
111 \r
112 Sqrt           ENDP\r
113 */\r
114 \r