Содержание материала

Code:

//Sometimes u need to know some information about the CPU

//like: brand id, factory speed, wich instruction set supported etc.

//If so, than u can use this code.

//2002 by -=LTi=-

 

unit main;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, ExtCtrls;

 

type

  Tfrm_main = class(TForm)

    img_info: TImage;

    procedure FormShow(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

    procedure info(s1, s2: string);

  end;

 

var

  frm_main: Tfrm_main;

  gn_speed_y: Integer;

  gn_text_y: Integer;

const

  gn_speed_x: Integer = 8;

  gn_text_x: Integer  = 15;

  gl_start: Boolean   = True;

 

implementation

 

{$R *.DFM}

 

procedure Tfrm_main.FormShow(Sender: TObject);

var

   _eax, _ebx, _ecx, _edx: Longword;

  i: Integer;

  b: Byte;

  b1: Word;

  s, s1, s2, s3, s_all: string;

begin

  //Set the startup colour of the image

img_info.Canvas.Brush.Color := clblue;

  img_info.Canvas.FillRect(rect(0, 0, img_info.Width, img_info.Height));

 

 

  gn_text_y := 5; //position of the 1st text

 

asm                //asm call to the CPUID inst.

   mov eax,0         //sub. func call

   db $0F,$A2         //db $0F,$A2 = CPUID instruction

   mov _ebx,ebx

    mov _ecx,ecx

    mov _edx,edx

  end;

 

  for i := 0 to 3 do   //extract vendor id

begin

    b := lo(_ebx);

    s := s + chr(b);

    b := lo(_ecx);

    s1:= s1 + chr(b);

    b := lo(_edx);

    s2:= s2 + chr(b);

    _ebx := _ebx shr 8;

    _ecx := _ecx shr 8;

    _edx := _edx shr 8;

  end;

  info('CPU', '');

  info('   - ' + 'Vendor ID: ', s + s2 + s1);

 

  asm

    mov eax,1

    db $0F,$A2

    mov _eax,eax

    mov _ebx,ebx

    mov _ecx,ecx

    mov _edx,edx

  end;

  //06B1

//|0000| |0000 0000| |0000| |00| |00| |0110| |1011| |0001|

b := lo(_eax) and 15;

  info('   - ' + 'Stepping ID: ', IntToStr(b));

  b := lo(_eax) shr 4;

  info('   - ' + 'Model Number: ', IntToHex(b, 1));

  b := hi(_eax) and 15;

  info('   - ' + 'Family Code: ', IntToStr(b));

  b := hi(_eax) shr 4;

  info('   - ' + 'Processor Type: ', IntToStr(b));

  //31.   28. 27.   24. 23.   20. 19.   16.

//  0 0 0 0   0 0 0 0   0 0 0 0   0 0 0 0

b := lo((_eax shr 16)) and 15;

  info('   - ' + 'Extended Model: ', IntToStr(b));

 

  b := lo((_eax shr 20));

  info('   - ' + 'Extended Family: ', IntToStr(b));

 

  b := lo(_ebx);

  info('   - ' + 'Brand ID: ', IntToStr(b));

  b := hi(_ebx);

  info('   - ' + 'Chunks: ', IntToStr(b));

  b := lo(_ebx shr 16);

  info('   - ' + 'Count: ', IntToStr(b));

  b := hi(_ebx shr 16);

  info('   - ' + 'APIC ID: ', IntToStr(b));

 

  //Bit 18 =? 1     //is serial number enabled?

if (_edx and $40000) = $40000 then

    info('   - ' + 'Serial Number ', 'Enabled')

  else

     info('   - ' + 'Serial Number ', 'Disabled');

 

  s := IntToHex(_eax, 8);

  asm                  //determine the serial number

   mov eax,3

    db $0F,$A2

    mov _ecx,ecx

    mov _edx,edx

  end;

  s1 := IntToHex(_edx, 8);

  s2 := IntToHex(_ecx, 8);

  Insert('-', s, 5);

  Insert('-', s1, 5);

  Insert('-', s2, 5);

  info('   - ' + 'Serial Number: ', s + '-' + s1 + '-' + s2);

 

  asm

    mov eax,1

    db $0F,$A2

    mov _edx,edx

  end;

  info('', '');

  //Bit 23 =? 1

if (_edx and $800000) = $800000 then

    info('MMX ', 'Supported')

  else

     info('MMX ', 'Not Supported');

 

  //Bit 24 =? 1

if (_edx and $01000000) = $01000000 then

    info('FXSAVE & FXRSTOR Instructions ', 'Supported')

  else

     info('FXSAVE & FXRSTOR Instructions Not ', 'Supported');

 

  //Bit 25 =? 1

if (_edx and $02000000) = $02000000 then

    info('SSE ', 'Supported')

  else

     info('SSE ', 'Not Supported');

 

  //Bit 26 =? 1

if (_edx and $04000000) = $04000000 then

    info('SSE2 ', 'Supported')

  else

     info('SSE2 ', 'Not Supported');

 

  info('', '');

 

  asm     //execute the extended CPUID inst.

   mov eax,$80000000   //sub. func call

   db $0F,$A2

    mov _eax,eax

  end;

 

  if _eax > $80000000 then //any other sub. funct avail. ?

begin

    info('Extended CPUID: ', 'Supported');

    info('   - Largest Function Supported: ', IntToStr(_eax - $80000000));

    asm     //get brand ID

     mov eax,$80000002

      db $0F

      db $A2

      mov _eax,eax

      mov _ebx,ebx

      mov _ecx,ecx

      mov _edx,edx

    end;

    s  := '';

    s1 := '';

    s2 := '';

    s3 := '';

    for i := 0 to 3 do

    begin

      b := lo(_eax);

      s3:= s3 + chr(b);

      b := lo(_ebx);

      s := s + chr(b);

      b := lo(_ecx);

      s1 := s1 + chr(b);

      b := lo(_edx);

      s2 := s2 + chr(b);

      _eax := _eax shr 8;

      _ebx := _ebx shr 8;

      _ecx := _ecx shr 8;

      _edx := _edx shr 8;

    end;

 

    s_all := s3 + s + s1 + s2;

 

    asm

      mov eax,$80000003

      db $0F

      db $A2

      mov _eax,eax

      mov _ebx,ebx

      mov _ecx,ecx

    mov _edx,edx

    end;

    s  := '';

    s1 := '';

    s2 := '';

    s3 := '';

    for i := 0 to 3 do

    begin

      b := lo(_eax);

      s3 := s3 + chr(b);

      b := lo(_ebx);

      s := s + chr(b);

      b := lo(_ecx);

      s1 := s1 + chr(b);

      b := lo(_edx);

      s2 := s2 + chr(b);

      _eax := _eax shr 8;

      _ebx := _ebx shr 8;

      _ecx := _ecx shr 8;

      _edx := _edx shr 8;

    end;

    s_all := s_all + s3 + s + s1 + s2;

 

    asm

      mov eax,$80000004

      db $0F

      db $A2

      mov _eax,eax

      mov _ebx,ebx

      mov _ecx,ecx

      mov _edx,edx

    end;

    s  := '';

    s1 := '';

    s2 := '';

    s3 := '';

    for i := 0 to 3 do

    begin

      b  := lo(_eax);

      s3 := s3 + chr(b);

      b := lo(_ebx);

      s := s + chr(b);

      b := lo(_ecx);

      s1 := s1 + chr(b);

      b  := lo(_edx);

      s2 := s2 + chr(b);

      _eax := _eax shr 8;

      _ebx := _ebx shr 8;

      _ecx := _ecx shr 8;

      _edx := _edx shr 8;

    end;

    info('Brand String: ', '');

    if s2[Length(s2)] = #0 then setlength(s2, Length(s2) - 1);

    info('', '   - ' + s_all + s3 + s + s1 + s2);

  end

  else

     info('   - Extended CPUID ', 'Not Supported.');

end;

 

procedure Tfrm_main.info(s1, s2: string);

begin

  if s1 <> '' then

  begin

    img_info.Canvas.Brush.Color := clblue;

    img_info.Canvas.Font.Color  := clyellow;

    img_info.Canvas.TextOut(gn_text_x, gn_text_y, s1);

  end;

  if s2 <> '' then

  begin

    img_info.Canvas.Brush.Color := clblue;

    img_info.Canvas.Font.Color  := clWhite;

    img_info.Canvas.TextOut(gn_text_x + img_info.Canvas.TextWidth(s1), gn_text_y, s2);

  end;

  Inc(gn_text_y, 13);

end;

 

end.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить