icculus quake2 doxygen  1.0 dev
x86.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 
19 */
20 #include <stdlib.h>
21 #include "client.h"
22 
23 #if id386
24 
25 static unsigned long bias;
26 static unsigned long *histogram;
27 static unsigned long start, range;
28 static unsigned long bias;
29 
30 __declspec( naked ) void x86_TimerStart( void )
31 {
32  __asm _emit 0fh
33  __asm _emit 31h
34  __asm mov start, eax
35  __asm ret
36 }
37 
38 __declspec( naked ) void x86_TimerStop( void )
39 {
40  __asm push edi
41  __asm mov edi, histogram
42  __asm _emit 0fh
43  __asm _emit 31h
44  __asm sub eax, start
45  __asm sub eax, bias
46  __asm js discard
47  __asm cmp eax, range
48  __asm jge discard
49  __asm lea edi, [edi + eax*4]
50  __asm inc dword ptr [edi]
51 discard:
52  __asm pop edi
53  __asm ret
54 }
55 
56 #pragma warning( disable: 4035 )
57 static __declspec( naked ) unsigned long x86_TimerStopBias( void )
58 {
59  __asm push edi
60  __asm mov edi, histogram
61  __asm _emit 0fh
62  __asm _emit 31h
63  __asm sub eax, start
64  __asm pop edi
65  __asm ret
66 }
67 #pragma warning( default:4035 )
68 
69 void x86_TimerInit( unsigned long smallest, unsigned length )
70 {
71  int i;
72  unsigned long biastable[100];
73 
74  range = length;
75  bias = 10000;
76 
77  for ( i = 0; i < 100; i++ )
78  {
79  x86_TimerStart();
80  biastable[i] = x86_TimerStopBias();
81 
82  if ( bias > biastable[i] )
83  bias = biastable[i];
84  }
85 
86  bias += smallest;
87  histogram = Z_Malloc( range * sizeof( unsigned long ) );
88 }
89 
90 unsigned long *x86_TimerGetHistogram( void )
91 {
92  return histogram;
93 }
94 
95 #endif
i
int i
Definition: q_shared.c:305
range
GLsizei range
Definition: qgl_win.c:121
Z_Malloc
void * Z_Malloc(int size)
Definition: common.c:1223
client.h