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