--- /dev/null
+#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