]> 4ch.mooo.com Git - 16.git/blobdiff - 16/w_modex/FIXED32.HPP
modified: 16/DOS_GFX.EXE
[16.git] / 16 / w_modex / FIXED32.HPP
diff --git a/16/w_modex/FIXED32.HPP b/16/w_modex/FIXED32.HPP
new file mode 100644 (file)
index 0000000..49a084f
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef FIXEDPOINT_HPP\r
+    #define FIXEDPOINT_HPP\r
+\r
+typedef long Fixed32;          // 16.16 FixedPoint\r
+typedef unsigned char Iangle;  // Integer angle (0..255)\r
+\r
+/* Macros for Type Conversion */\r
+#define INT_TO_FIXED(x) ((x) << 16)\r
+#define FIXED_TO_INT(x) ((x) >> 16)\r
+#define ROUND_FIXED_TO_INT(x) (((x) + 0x8000) >> 16)\r
+\r
+// Loads Fixed32 datafiles\r
+void initFixed32(void);\r
+\r
+// Common math functions\r
+Fixed32 FixedMul(Fixed32 num1, Fixed32 num2);\r
+Fixed32 FixedDiv(Fixed32 numer, Fixed32 denom);\r
+void CosSin(Iangle theta, Fixed32 *Cos, Fixed32 *Sin);\r
+\r
+Fixed32 FixedMulASM(Fixed32 num1, Fixed32 num2);\r
+#pragma aux FixedMulASM =   \\r
+    "imul edx"              \\r
+    "add eax, 8000h"        \\r
+    "adc edx, 0"            \\r
+    "shrd eax, edx, 16"     \\r
+    parm caller [eax] [edx] \\r
+    value [eax]             \\r
+    modify [eax edx];\r
+\r
+Fixed32 FixedDivASM(Fixed32 numer, Fixed32 denom);  // No rounding!\r
+#pragma aux FixedDivASM =   \\r
+    "xor eax, eax"          \\r
+    "shrd eax, edx, 16"     \\r
+    "sar edx, 16"           \\r
+    "idiv ebx"              \\r
+    parm caller [edx] [ebx] \\r
+    value [eax]             \\r
+    modify [eax ebx edx];\r
+\r
+#endif\r
+\r