mirror of
https://github.com/vapaamies/KolibriOS.git
synced 2024-09-19 17:41:01 +02:00
Random functions added
This commit is contained in:
parent
733019e96b
commit
52e8a44318
@ -152,10 +152,17 @@ procedure _StartExe(InitTable: PPackageInfo);
|
|||||||
var
|
var
|
||||||
Default8087CW: Word = $1332; // for Extended type
|
Default8087CW: Word = $1332; // for Extended type
|
||||||
|
|
||||||
procedure InitFPU;
|
|
||||||
function Get8087CW: Word;
|
function Get8087CW: Word;
|
||||||
procedure Set8087CW(Value: Word);
|
procedure Set8087CW(Value: Word);
|
||||||
|
|
||||||
|
var
|
||||||
|
RandSeed: LongWord;
|
||||||
|
RandCounter: LongWord;
|
||||||
|
|
||||||
|
function _RandInt(Range: LongWord): LongWord;
|
||||||
|
function _RandExt: Extended;
|
||||||
|
procedure Randomize;
|
||||||
|
|
||||||
function UpCase(Ch: KolibriChar): KolibriChar;
|
function UpCase(Ch: KolibriChar): KolibriChar;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -224,13 +231,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure InitFPU;
|
|
||||||
asm
|
|
||||||
FNINIT
|
|
||||||
FWAIT
|
|
||||||
FLDCW Default8087CW
|
|
||||||
end;
|
|
||||||
|
|
||||||
function Get8087CW: Word;
|
function Get8087CW: Word;
|
||||||
asm
|
asm
|
||||||
PUSH 0
|
PUSH 0
|
||||||
@ -247,6 +247,49 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// Produce random values in a given range [MinValue..MaxValue]
|
||||||
|
// Note: Always return 0 if range = [0..$FFFFFFFF]
|
||||||
|
// cause (MaxValue - MinValue + 1) * eax + MinValue = 0
|
||||||
|
// uses variation of XorShift based algorithm
|
||||||
|
function RandInt(MinValue, MaxValue: LongWord): LongWord; stdcall;
|
||||||
|
asm
|
||||||
|
MOV EAX, RandSeed
|
||||||
|
MOV ECX, EAX
|
||||||
|
SHL EAX, 13
|
||||||
|
XOR ECX, EAX
|
||||||
|
MOV EAX, ECX
|
||||||
|
SHR EAX, 17
|
||||||
|
XOR ECX, EAX
|
||||||
|
MOV EAX, ECX
|
||||||
|
SHL EAX, 5
|
||||||
|
XOR EAX, ECX
|
||||||
|
ADD RandCounter, 361275
|
||||||
|
MOV RandSeed, EAX
|
||||||
|
ADD EAX, RandCounter
|
||||||
|
MOV EDX, MaxValue
|
||||||
|
SUB EDX, MinValue
|
||||||
|
INC EDX
|
||||||
|
MUL EDX
|
||||||
|
MOV EAX, EDX
|
||||||
|
ADD EAX, MinValue
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _RandInt(Range: LongWord): LongWord;
|
||||||
|
begin
|
||||||
|
Result := RandInt(0, Range - 1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _RandExt: Extended;
|
||||||
|
begin
|
||||||
|
Result := 1 / RandInt(1, $FFFFFFFE);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Randomize;
|
||||||
|
asm
|
||||||
|
RDTSC
|
||||||
|
MOV RandSeed, EAX
|
||||||
|
end;
|
||||||
|
|
||||||
function UpCase(Ch: KolibriChar): KolibriChar;
|
function UpCase(Ch: KolibriChar): KolibriChar;
|
||||||
begin
|
begin
|
||||||
if Ch in ['a'..'z'] then
|
if Ch in ['a'..'z'] then
|
||||||
@ -254,4 +297,12 @@ begin
|
|||||||
Result := Ch;
|
Result := Ch;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
|
||||||
|
asm // InitFPU
|
||||||
|
FNINIT
|
||||||
|
FWAIT
|
||||||
|
FLDCW Default8087CW
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user