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 | }0)tmp=-tmp; |
81 | } |
- | 82 | ||
95 | >0)xx+=-x1; |
83 | #endif0)tmp=-tmp; |
96 | >=1; |
84 | >0)xx+=-x1; |
97 | ><=1; |
85 | >=1; |
98 | >0)> |
86 | ><=1; |
- | 87 | >0)> |