add relative mouse handling in mouse.asm
[retroray] / src / util.h
index 7f418a9..cda59bf 100644 (file)
@@ -27,6 +27,19 @@ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 #include <alloca.h>
 #endif
 
+#ifdef __GNUC__
+#define PACKED __attribute__((packed))
+#else
+#define PACKED
+#endif
+
+unsigned int get_cs(void);
+#define get_cpl()      ((int)(get_cs() & 3))
+
+void get_msr(uint32_t msr, uint32_t *low, uint32_t *high);
+void set_msr(uint32_t msr, uint32_t low, uint32_t high);
+
+
 /* Non-failing versions of malloc/calloc/realloc. They never return 0, they call
  * demo_abort on failure. Use the macros, don't call the *_impl functions.
  */
@@ -44,4 +57,28 @@ int match_prefix(const char *str, const char *prefix);
 void enable_fpexcept(void);
 void disable_fpexcept(void);
 
+#ifndef INLINE
+#if (__STDC_VERSION__ >= 199901) || defined(__GNUC__)
+#define INLINE inline
+#else
+#define INLINE __inline
+#endif
+#endif
+
+#if defined(__i386__) || defined(__386__) || defined(MSDOS)
+
+/* fast conversion of double -> 32bit int
+ * for details see:
+ *  - http://chrishecker.com/images/f/fb/Gdmfp.pdf
+ *  - http://stereopsis.com/FPU.html#convert
+ */
+static INLINE int32_t cround64(double val)
+{
+       val += 6755399441055744.0;
+       return *(int32_t*)&val;
+}
+#else
+#define cround64(x)    ((int32_t)(x))
+#endif
+
 #endif /* UTIL_H_ */