Процедура MsDos (VAR R: Registers) реализует частный случай вызова Intr( N, R ) для N = 33 (21Н). Эта процедура вызывает и выполняет одну из функций DOS прерывания с номером 21Н. Каждая функция имеет свой набор входных значений регистров в {373}
USES DOS;
{Печать экрана на принтере, как при нажатии Shift+PrtScr}
PROCEDURE PrintScreen;
VAR R : Registers;
BEGIN
Intr( $05, R ) { вызов системного прерывания }
END;
BEGIN
Write( 'Нажмите ENTER для запуска печати экрана ' );
ReadLn;
PrintScreen;
END.
Рис. 16.13
записи R типа Registers. Обычно в R.AH должен содержаться номер функции, в R.AL и следующих — параметры для вызова. После выполнения процедуры MsDos регистр R.AL содержит, как правило, код завершения операции (0, если все в порядке) и возвращаемые величины в других регистрах. Пример использования MsDos — определение множества букв, обозначающих доступные в ПЭВМ диски (рис. 16.14). Для работы примера требуется MS-DOS версий 3.0 и старше.
USES DOS; { АНАЛИЗ НАЛИЧИЯ ДИСКОВОДОВ В ПЭВМ }
TYPE
DrivesSetType = Set of 'A'..'Z'; { множество букв }
{ Процедура возвращает множество букв дисков в ПЭВМ }
PROCEDURE TestDrives( VAR Drives : DrivesSetType );
VAR
R : Registers; { переменная-регистры }
i : Byte; { параметр цикла }
ch : Char; { буква очередного диска }
BEGIN
ch := Pred('A'); { символ перед 'A' }
Drives := []; { стартовое значение набора }
for i:=1 to 26 do begin { от диска A: до... }
ch:=Succ( ch ); { буква рассматриваемого диска }
R.AH := $44; { номер функции MS-DOS }
R.AL := $08; { загрузка параметра в AL }
Рис. 16.14 {374}
R.BL := i; { загрузка номера диска в BL }
MsDos( R ); { вызов функции номер 44Н }
if R.AX <= 1 { если АХ>1, то диска нет }
then Drives := Drives + [ch]
end {for}
END;
VAR { ПРИМЕР ВЫЗОВА }
с : Char; { параметр цикла }
HD : DrivesSetType; { множество дисков }
BEGIN
TestDrives( HD ); { анализ дисков }
for c:='A' to 'Z' do
if с in HD then WriteLn(c, ':' );
ReadLn { пауза до нажатия клавиши ввода }
END.