IDEHDD.PAS

{* Серийный номер IDE винта *}

Unit IDEHDD;
Interface
Implementation
Begin
 writeln('Получение серийного номера IDE-винчестера ');
End.

Program pas;

Uses IDEHDD.pas; {* Эту строку можно удалить *}
{From : Serg Karpov                     Subj : Серийный номер IDE винта  }
Uses CRT; {* Подключаем внешние файлы *}
Type {* Создание новых типов данных *}
  TIdeInfo = Record      Config    : word;
  CylsTotal : word;
  Unused    : word;
  HeadTotal : word;
  BPT       : word;
  BPS       : word;
  SPT       : word;
  Vendor    : Array[0..2]  Of word;
  Serial    : Array[1..20] Of char;
  BufType   : word;
  BufSize   : word;
  ECC       : word;
  Revision  : Array[1..8]  Of char;
  Model     : Array[1..40] Of char;
  End;
Var {* В работе нам потребуются переменные: *}
  InfoArray                   : Array[0..255] Of word;
  IdeInfo                     : TIdeInfo Absolute InfoArray;
  NumDisk                     : byte;
  Count                       : byte;
Procedure GetIDEInfo( Drive : byte );
Var {* Необходимые переменные *}
  I : byte;
  Begin
  FillChar( InfoArray, sizeof(InfoArray), 0 );
While ( Port[$1F7] And $80  0 ) Do;
  Port[$3F6] := 2;
Port[$1F6] := $A0 + ( Drive Shl 4);
Port[$1F7] := $EC;
While ( Port[$1F7] And $80  0 ) Do;
  For I := 0 To 255 Do {* Переменная I увеличивается с 0 до 255 *}
    InfoArray[I] := Swap( PortW[$01F0] );
End;
Begin
ClrScr; {* Очистка экрана *}
NumDisk := Mem[$40 : $75];
For Count := 1 To NumDisk Do {* Увеличиваем Count от 1 до NumDisk с шагом 1 *}
Begin
  GetIdeInfo( Count - 1 );
  Writeln('Serial number     : ', IdeInfo.Serial           );
  Writeln('Revision          : ', IdeInfo.Revision         );
  Writeln('Model HDD         : ', IdeInfo.Model            );
  Writeln; {* Пустая строка *}
  Writeln('Total cylinders   : ', Swap(IdeInfo.CylsTotal) : 8);
  Writeln('Total heads       : ', Swap(IdeInfo.HeadTotal) : 8);
  Writeln('Sectors per track : ', Swap(IdeInfo.SPT) : 8      );
  Writeln('Byte per sector   : ', Swap(IdeInfo.BPS) : 8      );
  Writeln('Byte per track    : ', Swap(IdeInfo.BPT) : 8      );
  Writeln('Size Of buffer    : ', Swap(IdeInfo.BufSize) : 8  );
End;

End......