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 (окончание)