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