Энциклопедия Turbo Pascal. Главы 1-4 - Применение процедуры 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.  В общем случае если какой-то регистр не используется при вызове,  то его значение может не устанавливаться.