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