Энциклопедия Turbo Pascal. Главы 1-4
Страница 56. Применение процедуры MsDos


Применение процедуры MsDos

     Процедура MsDos  осуществляет  прерывание  2In для доступа к
одной из функций операционной системы высокого  уровня. Обращение
к этой процедуре имеет следующий общий вид:
     MsDos(регистры); где "регистры"  представляет  собой  запись
типа  "registrs",  которая определяется в блоке ДОС.  Регистровый
тип определяется следующим образом:
     regisrers = record
       Case integer of
         0: (AX, BX, CX, DX, BP, SI, DI,
             DS, ES, FLAGS: word);
         1: (AL, AH,BL, BH, CL, CH, DL, DH: byte);
     end;
     Такое определение  позволяет  вам  смешивать  значения  типа
"байт"  и "слово".  В каждой конкретной ситуации вы должны решить
какой тип подходит лучше.
     Приводимые ниже в этой главе примеры отчасти дублируют стан-
дартные процедуры, которые уже реализованы в Турбо Паскале. Такой
выбор  сделан  по трем причинам.  Во-первых,  Турбо Паскаль имеет
почти все,  что требуется в большинстве случаях. Вовторых, требу-
ется возможно полнее проиллюстрировать принципы построения интер-
фейса,  чтобы можно было их  применить  в  конкретных  ситуациях.
В-третьих,  приводимые  примеры в некоторой мере проясняют способ
реализации процедур и функций в Турбо Паскале.
     Ниже приводится простой пример.  Эта функция определяет было
ли нажатие клавиши.  Она аналогична функции "keyressed", встроен-
ной  в  язык Турбо Паскаль.  Результат этой функции "KbHrt" будет
"истина",  если нажата некоторая клавиша,  или "ложь" в противном
случае. Она использует прерывание 21n с шестнадцатиричным номером
$B.  Следует помнить,  что перед шестнадцатиричным числом  должен
стоять валютный знак, который для компилятора является указателем
шестнадцатиричного числа.  Сама программа будет выводить на экран
точки до тех пор, пока не будет нажата какая-нибудь клавиша:
   { демонстрация процедуры  MsDos }
    program kb;

    uses Dos;

    function KbHit:boolean; { функция  специфична  для DOS }
    var
      regs: registers;
    begin
      regs.AY:=SB;
      MsDos(regs);
      if regs.AL=0 then KbHit:=FALSE
      else KbHit:=TRUE;
    end;

    begin
      repeat
        Write('.');
      until KbHit;
    end.

     Следует отметить,  что в этом вызове нет необходимости зада-
вать  значения  остальным  регистрам,  поскольку  здесь требуется
функция с единственным номером $B.  В общем случае если  какой-то
регистр не используется при вызове,  то его значение может не ус-
танавливаться.

 
« Предыдущая статья