program LONG_READ; const Drive = $80; (* номер жесткого диска *) Cyl = $00; (* контрольный цилиндр *) Head = $00; (* поверхность диска *) Sect = $03; (* контрольный сектор *) 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; var I : integer; Regs : Registers; LongBuff : record Buff : array [1..512] of byte; ECC : record CRC : integer; Count : integer end end; begin TextColor (LightGray); TextBackGround (Black); FillChar (LongBuff, SizeOf (LongBuff), 0); Regs.AH := $0A; (* код операции "длинного" чтения *) Regs.AL := $01; (* число читаемых секторов *) Regs.CH := $00; (* номер контрольного цилиндра *) Regs.CL := $02; (* номер контрольного сектора *) Regs.DH := $00; (* номер поверхности жесткого диска*) Regs.DL := $80; (* номер жесткого диска для BIOS *) Regs.ES := Seg (LongBuff); (* сегмент. адрес буфера чтения *) Regs.BX := Ofs (LongBuff); (* смещение буфера для чтения *) Intr ($13, Regs); (* операция "длинного" чтения *) if Regs.Flags and 1 <> 0 then (* ошибка чтения *) begin WriteLn ('Ошибка ', Regs.AH, ' "длинного" чтения...'); Halt (-1) end; WriteLn ('Число оставшихся пусков = ', LongBuff.ECC.Count); Write ('Ключевая запись сектора = "'); I := 0; while (I < 512) and (LongBuff.Buff [Succ (I)] <> 0) do begin I := Succ (I); Write (Chr (LongBuff.Buff [I])) end; WriteLn ('"'); Halt (0) end. (* LONG_READ *)
Вернуться к статье