mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-01-15 09:06:30 +00:00
889d97383d
Fixed PCILookUpSingle code for this change EdCodeTools reindent needs to be updated
139 lines
2.1 KiB
HolyC
Executable file
139 lines
2.1 KiB
HolyC
Executable file
F64 Clamp(F64 d,F64 lo,F64 hi)
|
|
{//Clamp to F64 [] range.
|
|
if (d<lo)
|
|
return lo;
|
|
if (d>hi)
|
|
return hi;
|
|
return d;
|
|
}
|
|
|
|
F64 Min(F64 n1,F64 n2)
|
|
{//Min of two F64s.
|
|
if (n1<=n2)
|
|
return n1;
|
|
else
|
|
return n2;
|
|
}
|
|
|
|
F64 Max(F64 n1,F64 n2)
|
|
{//Max of two F64s.
|
|
if (n1>=n2)
|
|
return n1;
|
|
else
|
|
return n2;
|
|
}
|
|
|
|
F64 Pow10I64(I64 i)
|
|
{//F64 int powers of ten.
|
|
if (i>308)
|
|
return ì;
|
|
else if (i<-308)
|
|
return 0.0;
|
|
else
|
|
return pow10_I64[i+309];
|
|
}
|
|
|
|
U64 FloorU64(U64 num,U64 to)
|
|
{//Int multiples of num.
|
|
return num-num%to;
|
|
}
|
|
|
|
U64 CeilU64(U64 num,U64 to)
|
|
{//Int multiples of num.
|
|
num+=to-1;
|
|
return num-num%to;
|
|
}
|
|
|
|
I64 RoundI64(I64 num,I64 to)
|
|
{//Int multiples of num.
|
|
return num-num%to;
|
|
}
|
|
|
|
I64 FloorI64(I64 num,I64 to)
|
|
{//Int multiples of num.
|
|
if (num>=0)
|
|
return num-num%to;
|
|
else {
|
|
num++;
|
|
return num-num%to-to;
|
|
}
|
|
}
|
|
|
|
I64 CeilI64(I64 num,I64 to)
|
|
{//Int multiples of num.
|
|
if (num>=0) {
|
|
num+=to-1;
|
|
return num-num%to;
|
|
} else {
|
|
num+=to-1;
|
|
return num-num%to-to;
|
|
}
|
|
}
|
|
|
|
//See $LK,"::/Doc/Credits.DD"$.
|
|
#define LIN_CONGRUE_A 6364136223846793005
|
|
#define LIN_CONGRUE_C 1442695040888963407
|
|
|
|
I64 RandInt()
|
|
{//Don't use this. Use the functions below.
|
|
I64 res = Fs->rand_seed;
|
|
res = LIN_CONGRUE_A * res ^ (res & 0xFFFFFFFF0000) >> 16 + LIN_CONGRUE_C;
|
|
if (!Bt(&Fs->task_flags, TASKf_NONTIMER_RAND))
|
|
res ^= GetTSC;
|
|
Fs->rand_seed = res;
|
|
return res;
|
|
}
|
|
|
|
U8 RandU8()
|
|
{//Random U8.
|
|
return RandInt & U8_MAX;
|
|
}
|
|
|
|
I16 RandI16()
|
|
{//Random I16.
|
|
I64 res = RandInt;
|
|
return res.i16[0];
|
|
}
|
|
|
|
U16 RandU16()
|
|
{//Random U16.
|
|
return RandInt & U16_MAX;
|
|
}
|
|
|
|
I32 RandI32()
|
|
{//Random I32.
|
|
I64 res = RandInt;
|
|
return res.i32[0];
|
|
}
|
|
|
|
U32 RandU32()
|
|
{//Random U32.
|
|
return RandInt & U32_MAX;
|
|
}
|
|
|
|
I64 RandI64()
|
|
{//Random I64.
|
|
return RandInt;
|
|
}
|
|
|
|
U64 RandU64()
|
|
{//Random U64.
|
|
return RandInt;
|
|
}
|
|
|
|
F64 Rand()
|
|
{//Random F64.
|
|
return (RandInt & 0x3FFFFFFFFFFFFFFF) / ToF64(0x4000000000000000);
|
|
}
|
|
|
|
I64 Seed(I64 seed=0,CTask *task=NULL)
|
|
{//Set $LK,"Rand",A="MN:Rand"$() seed. Zero for timer-based.
|
|
if (!task) task=Fs;
|
|
if (seed) {
|
|
LBts(&task->task_flags,TASKf_NONTIMER_RAND);
|
|
return task->rand_seed=seed;
|
|
} else {
|
|
LBtr(&task->task_flags,TASKf_NONTIMER_RAND);
|
|
return task->rand_seed^=GetTSC;
|
|
}
|
|
}
|