⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m_fixed.h

📁 The source code of Doom legacy for windows
💻 H
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: m_fixed.h,v 1.8 2001/01/25 22:15:42 bpereira Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.////// $Log: m_fixed.h,v $// Revision 1.8  2001/01/25 22:15:42  bpereira// added heretic support//// Revision 1.7  2000/09/28 20:57:15  bpereira// no message//// Revision 1.6  2000/04/24 23:52:23  hurdler// Apply cph patch//// Revision 1.5  2000/04/24 20:24:38  bpereira// no message//// Revision 1.4  2000/04/23 16:19:52  bpereira// no message//// Revision 1.3  2000/03/07 03:32:24  hurdler// fix linux compilation//// Revision 1.2  2000/02/27 00:42:10  hurdler// fix CR+LF problem//// Revision 1.1.1.1  2000/02/22 20:32:32  hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION://      Fixed point arithemtics, implementation.////-----------------------------------------------------------------------------#ifndef __M_FIXED__#define __M_FIXED__#include "doomtype.h"//// Fixed point, 32bit as 16.16.//#define FRACBITS                16#define FRACUNIT                (1<<FRACBITS)typedef int fixed_t;#define FIXED_TO_FLOAT(x) (((float)(x)) / 65536.0)//// Declare those functions:/*fixed_t FixedMul (fixed_t a, fixed_t b);fixed_t FixedDiv (fixed_t a, fixed_t b);fixed_t FixedDiv2 (fixed_t a, fixed_t b);*/#ifndef USEASM    fixed_t FixedMul (fixed_t a, fixed_t b);    fixed_t FixedDiv2 (fixed_t a, fixed_t b);#else#ifdef __WIN32__    //Microsoft VisualC++ (no asm inline :( )    fixed_t __cdecl FixedMul (fixed_t a, fixed_t b);    fixed_t __cdecl FixedDiv2 (fixed_t a, fixed_t b);#else    #ifdef __WATCOMC__    #pragma aux FixedMul =  \        "imul ebx",         \        "shrd eax,edx,16"   \        parm    [eax] [ebx] \        value   [eax]       \        modify exact [eax edx]    #pragma aux FixedDiv2 = \        "cdq",              \        "shld edx,eax,16",  \        "sal eax,16",       \        "idiv ebx"          \        parm    [eax] [ebx] \        value   [eax]       \        modify exact [eax edx]    #else    //DJGPP or linux    //Hurdler: changed with the fix for gcc 2.95.x provided by cph        static inline fixed_t FixedMul (fixed_t a, fixed_t b)         //asm        {          fixed_t ret;          int dummy;          asm("  imull %3 ;"              "  shrdl $16,%1,%0 ;"              : "=a" (ret),          /* eax is always the result */                "=d" (dummy)            /* cphipps - fix compile problem with gcc-2.95.1                                           edx is clobbered, but it might be an input */              : "0" (a),                /* eax is also first operand */                "r" (b)                 /* second operand could be mem or reg before,                                           but gcc compile problems mean i can only us reg */              : "%cc"                   /* edx and condition codes clobbered */              );          return ret;        }        static inline fixed_t FixedDiv2 (fixed_t a, fixed_t b)        {            fixed_t ret;            asm (                   "movl  %%eax,%%edx      \n" // these two instructions allow the next                   "sarl  $31,%%edx        \n" // two to pair, on the Pentium processor.                   "shldl $16,%%eax,%%edx  \n"                   "sall  $16,%%eax        \n"                   "idivl %%ecx            \n"                 : "=a" (ret)                 : "a" (a), "c" (b)                 : "dx"                 );            return ret;        }    #endif#endif#endif // useasmstatic inline fixed_t FixedDiv (fixed_t a, fixed_t b){    //I_Error("<a: %ld, b: %ld>",(long)a,(long)b);    if ( (abs(a)>>14) >= abs(b))        return (a^b)<0 ? MININT : MAXINT;    return FixedDiv2 (a,b);}#endif //m_fixed.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -