Вернуться к статье
Листинг 6. Создание ключевой записи в "длинном" секторе жесткого диска
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 *)

Вернуться к статье