Code: |
unit ExpandCPUInfo;
interface
type
TCPUInfo = packed record IDString : array [0..11] of Char; Stepping : Integer; Model : Integer; Family : Integer; FPU, VirtualModeExtensions, DebuggingExtensions, PageSizeExtensions, TimeStampCounter, K86ModelSpecificRegisters, MachineCheckException, CMPXCHG8B, APIC, MemoryTypeRangeRegisters, GlobalPagingExtension, ConditionalMoveInstruction, MMX : Boolean; SYSCALLandSYSRET, FPConditionalMoveInstruction, AMD3DNow : Boolean; CPUName : String; end; {информация об идентификации процессора} function ExistCPUID:Boolean; function CPUIDInfo(out info: TCPUInfo):Boolean; {инф-я о технологии процессора} function ExistMMX:Boolean; function Exist3DNow:Boolean; function ExistKNI:Boolean; {------------------------} procedure EMMS; procedure FEMMS; procedure PREFETCH(p: Pointer); register;
implementation
function ExistCPUID : Boolean; asm
pushfd pop eax mov ebx, eax xor eax, 00200000h push eax popfd pushfd pop ecx mov eax,0 cmp ecx, ebx jz @NO_CPUID inc eax @NO_CPUID: end;
function CPUIDInfo(out info: TCPUIDInfo):Boolean;
function ExistExtendedCPUIDFunctions:Boolean; asm mov eax,080000000h db $0F,$A2 end; var
name : array [0..47] of Char; p : Pointer; begin
if ExistCPUID then asm jmp @Start @BitLoop: mov al,dl and al,1 mov [edi],al shr edx,1 inc edi loop @BitLoop ret @Start: mov edi,info mov eax,0 db $0F,$A2 mov [edi],ebx mov [edi+4],edx mov [edi+8],ecx mov eax,1 db $0F,$A2 mov ebx,eax and eax,0fh; mov [edi+12],eax; shr ebx,4 mov eax,ebx and eax,0fh mov [edi+12+4],eax shr ebx,4 mov eax,ebx and eax,0fh mov [edi+12+8],eax add edi,24 mov ecx,6 call @BitLoop shr edx,1 mov ecx,3 call @BitLoop shr edx,2 mov ecx,2 call @BitLoop shr edx,1 mov ecx,1 call @BitLoop shr edx,7 mov ecx,1 call @BitLoop mov p,edi end; if (info.IDString = 'AuthenticAMD') and ExistExtendedCPUIDFunctions then begin asm mov edi,p mov eax,080000001h db $0F,$A2 mov eax,edx shr eax,11 and al,1 mov [edi],al mov eax,edx shr eax,16 and al,1 mov [edi+1],al mov eax,edx shr eax,31 and al,1 mov [edi+2],al lea edi,name mov eax,0 mov [edi],eax mov eax,080000000h db $0F,$A2 cmp eax,080000004h jl @NoString mov eax,080000002h db $0F,$A2 mov [edi],eax mov [edi+4],ebx mov [edi+8],ecx mov [edi+12],edx add edi,16 mov eax,080000003h db $0F,$A2 mov [edi],eax mov [edi+4],ebx mov [edi+8],ecx mov [edi+12],edx add edi,16 mov eax,080000004h db $0F,$A2 mov [edi],eax mov [edi+4],ebx mov [edi+8],ecx mov [edi+12],edx @NoString: end; info.CPUName:=name; end else with info do begin SYSCALLandSYSRET:=False; FPConditionalMoveInstruction:=False; AMD3DNow:=False; CPUName:=''; end; Result:=ExistCPUID; end;
function ExistMMX:Boolean; var
info : TCPUIDInfo; begin
if CPUIDInfo(info) then Result:=info.MMX else Result:=False; end;
function Exist3DNow:Boolean; var
info : TCPUIDInfo; begin
if CPUIDInfo(info) then Result:=info.AMD3DNow else Result:=False; end;
function ExistKNI:Boolean; begin
Result:=False; end;
procedure EMMS; asm
db $0F,$77 end;
procedure FEMMS; asm
db $0F,$03 end;
procedure PREFETCH(p: Pointer); register; asm
// PREFETCH byte ptr [eax] end;
end. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!