Режим 320x200, 16 цветов, — это режим низкого разрешения, поэтому в нем доступны восемь страниц (по 8000 байт каждая) (рис. 22.8). Полный объем, занимаемый изображением на экране, составляет 32000 байт. Заметьте, что в табл. 19.4 при описании процедуры SetGraphMode модуля Graph этот режим не указан, однако включение его возможно.
Рис. 22.8
Режим 320x200, 256 цветов, доступен только для адаптеров, выходной сигнал которых представляется в аналоговом виде: VGA, MCGA, IBM8514. Из-за использования этими адаптерами незначительно измененного многоплоскостного способа хранения информации, одна страница занимает всего 16000 байт на каждой битовой плоскости. Таким образом, имеется возможность хранить четыре страницы видеоинформации (см. рис. 22.5).
22.3. Вывод текста на графический экран
В разд. 19.8 уже упоминалось о возможности вывода сообщений на экран системным шрифтом высокого качества стандартными текстовыми процедурами. Однако описанный там способ не позволяет использовать все возможности видеоадаптеров.
Рассмотрим некоторые особенности прерывания 10H БСВВ. В нем есть несколько функций вывода текста с управлением цветом выводимых символов:
функция 09H — вывод в текущую позицию текстового курсора символа с заданным цветовым атрибутом;
функция 0EH — вывод символа в режиме телетайпа;
функция 13H — вывод текстовой строки.
Функция 09H не очень интересна, так как при выводе каждого символа необходимо самим передвигать текстовый курсор в следующую позицию. В этом смысле развитием ее является функция 0EH —
- 519 -
вывод каждого символа сопровождается его перемещением на следующую позицию (это и есть телетайп). Пример работы с этой функцией при выводе строки символов показан на рис. 22.9.
| USES Graph, CRT, DOS;
| {$I initgraf.pas} {Процедура инициализации (см. гл. 19) }
| PROCEDURE TeleWrite( str : String; attr : Byte );
| {Процедура вывода символа sym заданного цвета attr на }
| {графический экран системным шрифтом текстового режима }
| PROCEDURE WriteSym( sym : Byte; { ASCII-код символа }
| attr : Byte ); { цвет символа (0..15 }
| VAR
| regs : Registers; { требуется для прерываний }
| BEGIN
| with regs do begin { действия с полями reg }
| AH := $0E; { функции вывода символа }
| AL := sym; { ASCII код символа }
| BL := attr+$80; { его цвет (+$80 для XOR) }
| end;
| Intr( $10, regs ) { вызов прерывания 10H }
| END; {WriteSym}
| VAR
| i : Byte;
| BEGIN {TeleWrite}
| for i := 1 to Length(str) do
| WriteSym( Ord( str[i] ), attr );
| END; {TeleWrite}
| BEGIN { Пример вызова }
| GrInit; { инициализация графики }
| Bar3D(315,50, 330, 200, 30, TopOn); { графическая фигура }
| GotoXY( 34,12 ); { установка позиции }
| TeleWrite( 'Это желтый цвет', Yellow );
| ReadLn; { пауза до нажатия ввода }
| CloseGraph { закрытие графики }
| END.
Рис. 22.9
В этом примере желтый цвет появится только если надпись придется на черный фон. В противном случае цвет изменится вследствие режима вывода XOR. Если отменить режим XOR, то надпись будет стирать изображение под собой.
Функция 13H работает на графических адаптерах класса EGA и VGA и позволяет выводить не только строку заданного цвета (при
- 520 -
значении 0 или 1 регистра AL процессора — см. рис. 22.10), но и строку, в которой атрибуты заданы для каждого символа отдельно. При этом строка должна иметь структуру «символ-атрибут-символ-атрибут-...». Такой режим задается, если в регистр AL записать значение 2 или 3 (регистр BL при этом не используется). При значениях AL, равных 0 или 2, перевод курсора при выводе не осуществляется в отличие от значений 1 и 3. В графических режимах лучше использовать режимы 0 и 2.
| { Процедура вывода строки заданного цвета на графический }
| {экран системным шрифтом для текстового режима }
| {================(только EGA и VGA)==================== }
| PROCEDURE WriteStr( str : String; { выводимая строка }
| X, Y : Byte; { координаты начала }
| Page : Byte; { номер видеостраницы }
| attr : Byte ); { цвет символа (0..15) }