Вернуться к статье
Листинг 14. Определение серийного номера жесткого диска IDE
program IENT_IDE;
const
      Drive = $80;
type
      Registers = record
                       case boolean
                       of
                          False : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : integer);
                          True  : (AL, AH, BL, BH, CL, CH, DL, DH   : byte)
                  end;
      InfoType = record
                        ConfigWord      : integer;
                        CylsTotal       : integer;
                        Unused          : integer;
                        HeadTotal       : integer;
                        BytesPerTrack   : integer;
                        BytesPerSector  : integer;
                        SectorsPerTrack : integer;
                        VendorWord      : array [1..03] of integer;
                        Serial          : array [1..20] of char;
                        ControllerType  : integer;
                        BufSize512      : integer;
                        ECClongRW       : integer;
                        Revision        : array [1..08] of char;
                        Model           : array [1..40] of char
                 end;
var
      Regs    : Registers;
      Mask    : array [$00..$FF] of integer;
      InfoIDE : InfoType absolute Mask;
      I       : integer;
begin
      TextColor (LightGray);
      TextBackGround (Black);
      FillChar (Mask, SizeOf (Mask), $00);
      while Port [$01F7] and $80 <> $00
      do;
      Port [$03F6] := $02;
      Port [$01F6] := $A0 or Drive and $01 shl $04;
      Port [$01F7] := $EC;
      while Port [$01F7] and $80 <> $00
      do;
      for I := $00 to $FF
      do Mask [I] := Swap (PortW [$01F0]);

(****************************************************)
(* сброс дисковой подсистемы предотвращает сбой HDD *)
(* в компьютерах, не оборудованных интерфейсом  IDE *)
(****************************************************)
      Regs.AH := $00;                  (* функция  сброса   диска *)
      Regs.DL := Drive;                (* номер выбранного  диска *)
      Intr ($13, Regs);                (* сброс выбранного  диска *)
      WriteLn ('Серийный номер жесткого диска = "' + InfoIDE.Serial + '"');
      Halt (0)
end. (* IDENT_IDE *)

Вернуться к статье
642