program JUMP_TIME; const Drive = $80; Head = $00; StartCyl = $00; (* номер начального цилиндра *) StopCyl = $4F; (* номер конечного цилиндра *) 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; Mask : byte; Time : real; begin (* начальное позиционирование головок *) Regs.AH := $0C; (* функция перемещения головок *) Regs.CX := StartCyl; (* номер начального цилиндра *) Regs.DH := Head; (* номер выбранной головки *) Regs.DL := Drive; (* логический номер жесткого диска *) Intr ($13, Regs); (* установка блока головок *) if Regs.Flags and 1 <> 0 then (* есть ошибка, странно *) begin WriteLn ('Ошибка ', Regs.AH); Halt (-1) end; Regs.AH := $0C; (* функция перемещения головок *) Regs.CX := StopCyl; (* номер начального цилиндра *) Regs.DH := Head; (* номер выбранной головки *) Regs.DL := Drive; (* логический номер жесткого диска *) (* запрет всех аппаратных прерываний *) Mask := Port [$21]; (* маска аппаратных прерываний *) Port [$21] := $FF; (* запрет всех прерываний *) (* установка счетчика нулевого канала таймера *) Port [$43] := $36; (* выбор нулевого канала таймера: *) Port [$40] := $01; (* младший байт делителя *) Port [$40] := $00; (* старший байт делителя *) (* команда на перемещение блока головок *) Intr ($13, Regs); (* установка блока головок *) (* остановка счетчика и чтение результата *) Port [$43] := $00; Time := 65535.0 - (Port [$40] + Port [$40] * 256.0); (* восстановление работы нулевого канала таймера *) Port [$43] := $36; (* восстановление нулевого канала *) Port [$40] := $00; (* 0 таймера: делитель = 0 *) Port [$40] := $00; (* размаскирование аппаратных прерываний *) Port [$21] := Mask; (* восстановление прерываний *) if Regs.Flags and 1 <> 0 then (* есть ошибка, странно *) begin WriteLn ('Ошибка ', Regs.AH); Halt (-1) end; WriteLn ('Время перемещения головок = ', Time : 0 : 0); Halt (0) end. (* JUMP_TIME *)
Вернуться к статье