Энциклопедия 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