So, weiter geht es (*):
Delphi-Quellcode:
function DoRndBuffer(Seed: Cardinal;
var Buffer; Size: Integer): Cardinal;
assembler;
// comparable to Borlands Random() function
asm
AND EDX,EDX
JZ @@2
AND ECX,ECX
JLE @@2
PUSH EBX
@@1: IMUL EAX,EAX,08088405H
// 134775813
INC EAX
MOV EBX,EAX
SHR EBX,24
MOV [EDX],BL
INC EDX
DEC ECX
JNZ @@1
POP EBX
@@2:
end;
function RandomSystemTime: Cardinal;
assembler;
// create Seed from Systemtime and PerformanceCounter
var
SysTime:
record
Year: Word;
Month: Word;
DayOfWeek: Word;
Day: Word;
Hour: Word;
Minute: Word;
Second: Word;
MilliSeconds: Word;
Reserved:
array [0..7]
of Byte;
end;
Counter:
record
Lo,
Hi: Integer;
end;
asm
LEA EAX,SysTime
PUSH EAX
CALL GetSystemTime
MOVZX EAX,Word Ptr SysTime.Hour
IMUL EAX,60
ADD AX,SysTime.Minute
IMUL EAX,60
MOVZX ECX,Word Ptr SysTime.Second
ADD EAX,ECX
IMUL EAX,1000
MOV CX,SysTime.MilliSeconds
ADD EAX,ECX
PUSH EAX
LEA EAX,Counter
PUSH EAX
CALL QueryPerformanceCounter
POP EAX
ADD EAX,Counter.Hi
ADC EAX,Counter.Lo
end;
Bei RandomSystemTime wird es tricky: QueryPerformanceCounter in RandomSystemTime ist natürlich ein No-Go für Crossplatform, also bleibt nur PurePascal.
Kennt da jemand was, was auch FPC versteht? Wie gesagt, ich arbeite nicht mit FPC, das hier ist nur für die Vielen, die danach fragen... Ich muß erstmal die
RTL von XE2 durchsuchen, ob es eine Win/OSX Kapselung gibt.
Falls sich jemand fragt, wie viel noch kommt: die CRC Funktionen (5 an der Zahl).
@Himitsu: Hattest Du nicht schonmal LHSZ für FPC bzw. x64 portiert? Ich meine mich da an irgendwas zu erinnern...
Ihr seid klasse Während hier Code gepostet wird, kann ich schon an anderer Stelle weitermachen - so könnte die DEC 6.0 wirklich was werden!
Gruß
Assertor
(*) Kein Edit, für die Benachrichtigung - Andreas hat ja gerade einen Lauf