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