Subversion Repositories Kolibri OS

Rev

Rev 5582 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5582 Rev 5598
-
 
1
#ifndef INCLUDE_RANDOM_H
1
/*******************************************************************************
2
#define INCLUDE_RANDOM_H
2
 
3
 
3
    MenuetOS MineSweeper
4
#ifndef INCLUDE_KOLIBRI_H
-
 
5
#include "../lib/kolibri.h"
4
    Copyright (C) 2003  Ivan Poddubny
-
 
5
 
-
 
6
    This program is free software; you can redistribute it and/or modify
-
 
7
    it under the terms of the GNU General Public License as published by
-
 
8
    the Free Software Foundation; either version 2 of the License, or
-
 
9
    (at your option) any later version.
-
 
10
 
-
 
11
    This program is distributed in the hope that it will be useful,
-
 
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-
 
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-
 
14
    GNU General Public License for more details.
-
 
15
 
-
 
16
    You should have received a copy of the GNU General Public License
-
 
17
    along with this program; if not, write to the Free Software
-
 
18
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
 
19
 
6
#endif
20
*******************************************************************************/
7
 
21
#define MASK_RAND 123456789
8
#define MASK_RAND 123456789
22
#define IQ_RAND 12773
9
#define IQ_RAND 12773
23
#define IA_RAND 16807
10
#define IA_RAND 16807
24
#define IR_RAND 2836
11
#define IR_RAND 2836
25
#define IM_RAND 2147483647
12
#define IM_RAND 2147483647
26
#define AM_RAND (1./2147483647)
13
#define AM_RAND (1./2147483647)
27
 
14
 
28
inline fastcall int random( ECX)
15
inline fastcall int random( ECX)
29
// get pseudo-random number - ïîëó÷èòü ïñåâäîñëó÷àéíîå ÷èñëî
16
// get pseudo-random number - ïîëó÷èòü ïñåâäîñëó÷àéíîå ÷èñëî
30
{
17
{
31
  $push ebx
18
  $push ebx
32
 
19
 
33
  $rdtsc        // eax & edx
20
  $rdtsc        // eax & edx
34
  $xor eax,edx
21
  $xor eax,edx
35
  $not eax
22
  $not eax
36
 
23
 
37
  EBX = __generator;
24
  EBX = __generator;
38
  $ror ebx,3
25
  $ror ebx,3
39
  $xor ebx,0xdeadbeef
26
  $xor ebx,0xdeadbeef
40
  EBX += EAX;
27
  EBX += EAX;
41
  __generator = EBX;
28
  __generator = EBX;
42
  
29
  
43
  EAX += EBX;
30
  EAX += EBX;
44
  EAX = EAX % ECX;
31
  EAX = EAX % ECX;
45
  
32
  
46
  $pop ebx  
33
  $pop ebx  
47
}
34
}
48
 
35
 
49
inline long unirand0(void)
36
inline long unirand0(void)
50
{
37
{
51
	 long k,ans,tmp,save;
38
	 long k,ans,tmp,save;
52
	 save = __generator;
39
	 save = __generator;
53
	 __generator^=MASK_RAND;   /* avoid __generator==0 */
40
	 __generator^=MASK_RAND;   /* avoid __generator==0 */
54
	 k=__generator/IQ_RAND;
41
	 k=__generator/IQ_RAND;
55
	 tmp=__generator-k*IQ_RAND;
42
	 tmp=__generator-k*IQ_RAND;
56
	 __generator*=IA_RAND*tmp;
43
	 __generator*=IA_RAND*tmp;
57
	 __generator-=IR_RAND*k;
44
	 __generator-=IR_RAND*k;
58
	 if(__generator<0) __generator+=IM_RAND;
45
	 if(__generator<0) __generator+=IM_RAND;
59
	 if(save == __generator) return unirand0();
46
	 if(save == __generator) return unirand0();
60
	 ans=__generator;
47
	 ans=__generator;
61
	 __generator^=MASK_RAND;   /* restore unmasked dummy */
48
	 __generator^=MASK_RAND;   /* restore unmasked dummy */
62
	 return ans;
49
	 return ans;
63
}
50
}
64
 
51
 
65
:long RAND_A,RAND_C,RAND_TMP;
52
:long RAND_A,RAND_C,RAND_TMP;
66
inline long rand(signed long x1,x2)
53
inline long rand(signed long x1,x2)
67
{
54
{
68
	long tmp,xx;
55
	long tmp,xx;
69
	RAND_A = __generator;
56
	RAND_A = __generator;
70
	__generator = RAND_A*__generator+RAND_C;
57
	__generator = RAND_A*__generator+RAND_C;
71
	RAND_C = __generator^RAND_A;
58
	RAND_C = __generator^RAND_A;
72
	RAND_C>>=1;
59
	RAND_C>>=1;
73
	RAND_A<<=1;
60
	RAND_A<<=1;
74
	__generator^=RAND_A;
61
	__generator^=RAND_A;
75
	xx=x2;
62
	xx=x2;
76
	if(x1<0)xx+=-x1;
63
	if(x1<0)xx+=-x1;
77
	tmp = __generator%xx;
64
	tmp = __generator%xx;
78
	if(tmp<0)tmp=-tmp;
65
	if(tmp<0)tmp=-tmp;
79
	tmp+=x1;
66
	tmp+=x1;
80
	return tmp;
67
	return tmp;
81
}
68
}
82
 
69
 
83
inline fastcall randomize()
70
inline fastcall randomize()
84
// initialize random number __generator - èíèöèàëèçèðîâàòü ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
71
// initialize random number __generator - èíèöèàëèçèðîâàòü ãåíåðàòîð ñëó÷àéíûõ ÷èñåë
85
{
72
{
86
  asm
73
  asm
87
  {
74
  {
88
    mov eax,3
75
    mov eax,3
89
    int 0x40
76
    int 0x40
90
    ror eax,16
77
    ror eax,16
91
  }
78
  }
92
  //if(EAX == __generator)return randomize();
79
  //if(EAX == __generator)return randomize();
93
  __generator = EAX;
80
  __generator = EAX;
94
}
81
}
-
 
82
 
95
>
83
#endif
96
>
84
>
97
>
85
>
98
>
86
>
-
 
87
>