summaryrefslogtreecommitdiff
path: root/src/m_fixed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/m_fixed.c')
-rw-r--r--src/m_fixed.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/m_fixed.c b/src/m_fixed.c
new file mode 100644
index 00000000..ac6e04bc
--- /dev/null
+++ b/src/m_fixed.c
@@ -0,0 +1,90 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// $Id: m_fixed.c 4 2005-07-23 16:19:41Z fraggle $
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log$
+// Revision 1.1 2005/07/23 16:19:54 fraggle
+// Initial revision
+//
+//
+// DESCRIPTION:
+// Fixed point implementation.
+//
+//-----------------------------------------------------------------------------
+
+
+static const char
+rcsid[] = "$Id: m_fixed.c 4 2005-07-23 16:19:41Z fraggle $";
+
+#include "stdlib.h"
+
+#include "doomtype.h"
+#include "i_system.h"
+
+#ifdef __GNUG__
+#pragma implementation "m_fixed.h"
+#endif
+#include "m_fixed.h"
+
+
+
+
+// Fixme. __USE_C_FIXED__ or something.
+
+fixed_t
+FixedMul
+( fixed_t a,
+ fixed_t b )
+{
+ return ((long long) a * (long long) b) >> FRACBITS;
+}
+
+
+
+//
+// FixedDiv, C version.
+//
+
+fixed_t
+FixedDiv
+( fixed_t a,
+ fixed_t b )
+{
+ if ( (abs(a)>>14) >= abs(b))
+ return (a^b)<0 ? MININT : MAXINT;
+ return FixedDiv2 (a,b);
+}
+
+
+
+fixed_t
+FixedDiv2
+( fixed_t a,
+ fixed_t b )
+{
+#if 0
+ long long c;
+ c = ((long long)a<<16) / ((long long)b);
+ return (fixed_t) c;
+#endif
+
+ double c;
+
+ c = ((double)a) / ((double)b) * FRACUNIT;
+
+ if (c >= 2147483648.0 || c < -2147483648.0)
+ I_Error("FixedDiv: divide by zero");
+ return (fixed_t) c;
+}