Энциклопедия Turbo Pascal. Главы 1-4 - Использование функций базовой системы ввода-вывода и ДОС

ОГЛАВЛЕНИЕ

Использование функций базовой системы ввода-вывода и ДОС

В некоторых случаях желательно иметь возможность использовать внешние программы,  написанные на ассемблере,  для доступа к системным функциям. Рассмотрим несколько примеров. Пусть во время работы программы требуется изменить режим экрана. Ниже приводятся семь режимов экрана при использовании цветного графического адаптера в операционной среде PC-DOS:

Режим Тип            Размеры            Адаптеры
0     Текст, черно-  40 х 25            CGA, EG.
белый
1     Текст, 16      40 х 25            CGA, EG.
цветов
2     Текст, черно-  80 х 25            CGA, EG.
белый
3     Текст, 16      80 х 25            CGA, EG.
цветов
4     Графика, 4     320 х 200          CGA, EG.
цвета
5     Графика, 4     320 х 200          CGA, EG.
черно-белы.
тона
6     Графика        640 х 200          CGA, EG.
черно-белая
7     Текст, черно-  80 х 25            Монохроматически.
белый
8     Графика, 16    160 х 200          PCj.
цветов
9     Графика, 16    320 х 200          PCj.
цветов
10    Графика        320 х 200          PCjr, EGA
      PCjr - 4 цвета
      EGA - 16 цветов
13    Графика, 16    320 х 200          EG.
цветов
14    Графика, 16    640 х 200          EG.
цветов
15    Графика, 4     640 х 350          EG.
цвета

Приводимая ниже процедура "mode" выполняет обращение к функции 1 базовой системы ввода-вывода (функция установки режима) для перевода экрана в графический режим 640х200,  выдачи на экран сообщения-приветствия "HI" и ожидания нажатия пользователем клавиши "RETURN".  При нажатии указанной клавиши будет сделан возврат в режим цветного экрана с размерами 80х25 (приводимая программа будет работать только в операционной системе  PC-DOS  при наличии цветного графического адаптера):

     program modetest;

     {SL MODE}

     procedure Mode(ModeSet:integer):external;

     begin
       Mode(6);
       WriteLn('hi'); read;
       Mode(3);
     end.

 

Ниже приводится внешняя функция "mode",  написанная на ассемблере:

     ; Эта процедура делает установку режима экрана, используя
     ; 1 целочисленный параметр.
     code    segment 'code'
             assume cs:code
     public  mode
     mode    proc near

    ; сохранить стек
             push bp
             mov bp,sp
    ; получить режим
             mov ax,[bp]+4
             mov ah,0    ; команда для переключения режима
             int 010h    ; вызов базовой системы ввода-вывода
    ; восстановление и выход
             pop bp
             ret 2
     mode    endp
     code    ends
             end

Ниже приводится функция,  которая очищает экран посредством процедуры "clr":

     program clr_screen;

     {SL CLR}

     procedure Clr; external;

     begin
       WriteLn('нажмите ВВОД для чистки экрана');
       ReadLn;
       Clr;
       WriteLn('экран полностью очищен');
     end.

Ниже приводится внешняя процедура "clr",  написанная на ассемблере.

        ; прерывание с номером 6
          cseq segment 'code'
          assume cs:cseq

          public clr

          clr proc near
        ; сохранить используемые регистры
                 push ax
                 push bx
                 push cx
                 push dx
                 mov cx, 0  ; начать с начала координат
                 mov dh, 24 ; конец в строке 24
                 mov dl, 79 ; столбец 79
                 mov ah, 0  ; установить режим просмотра
                 mov al, 0  ; очистить экран
                 mov bh, 7
                 int 10h

         ; восстановление и выход
                 pop ax
                 pop bx
                 pop cx
                 pop dx
          clr endp
          cseq ends
                 enu

Другим примером   связи   с базовой системой ввода-вывода посредством применения ассемблера является функция "xy",  которая устанавливает курсор в координаты Х и Y.  Эта функция аналогична процедурe "GotoXY", предусмотренной в языке Турбо Паскаль. В ПЭВМ фирмы IBM левый верхний угол экрана имеет координаты (0,0)

           program gotoxy;

           {$l XY}

           var
             t: integer;

           procedure xy(x, y): integer); external ;

           begin
             for t := 0 to 24 do begin
               xy(t,t);
               write(t);
             end;
           end.

 

Ниже приводится внешняя процедура "xy",  написанная на ассемблере:


     ; эта функция устанавливает курсор в координаты (Х,Y.

сode       cseq segment 'code'
                assume cs:cseq

     public     xy
     xy         proc near

     ; сохранение указателя стека
                puch bp
                mov bp,sp

     ; получить первый параметр
                mov dh,[up]+4  ; получить Х
                mov dl,[up]+8  ; получить Y
                mov ah,2       ; указатель точки перехода для
                               ; BIOS
                mov bh,0       ; номер страницы
                int 10h

                pop bp
                ret 4

     xy         endp

     code       ends
                end