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