16.5.3. Процедура MsDos
Процедура MsDos (VAR R: Registers) реализует частный случай вызова Intr( N, R ) для N = 33 (21Н). Эта процедура вызывает и выполняет одну из функций DOS прерывания с номером 21Н. Каждая функция имеет свой набор входных значений регистров в
- 374 -
| 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
- 375 -
| 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.
Рис. 16.14 (окончание)