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 *)
Вернуться к статье