Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Создание специальных символов. Часть 2
ОГЛАВЛЕНИЕ
Средний уровень.
Для цветного адаптера и PCjr используйте функцию 25H прерыва-
ния 21H для изменения вектора прерывания 1FH. При входе DS:DX
должны указывать на первый байт блока данных. Более подробное
описание см. в [1.2.3]. В примере создаются два символа с номера-
ми 128 и 129. Они являются зеркальными отображениями друг друга,
а выведенные подряд образуют небольшой прямоугольник.
;---в сегменте данных
CHARACTER_DATA DB 11111111B, 10000000B, 10000000B, 10000000B
DB 10000000B, 10000000B, 10000000B, 11111111B
DB 11111111B, 00000001B, 00000001B, 00000001B
DB 00000001B, 00000001B, 00000001B, 11111111B
;---установка вектора прерывания
PUSH DS ;сохраняем DS
LEA DX,CHAR_DATA ;смещение для данных в DX
MOV AX,SEG CHAR_DATA ;сегмент для данных в DS
MOV DS,AX ;
MOV AH,25H ;функция установки вектора
MOV AL,1FH ;номер изменяемого вектора
INT 21H ;установка вектора
POP DS ;восстанавливаем DS
;---печать символов
MOV AH,2 ;номер функции
MOV DL,128 ;первый символ
INT 21H ;вывод его
MOV DL,129 ;второй символ
INT 21H ;вывод его
Для EGA функция 11H прерывания 10H манипулирует набором симво-
лов. Эта функция может быть очень сложной, когда она используется
для создания специальных режимов экрана, но ее основное примене-
ние достаточно простое. Имеется четыре подфункции. Когда AL равен
0, то данные, определяемые пользователем переносятся из памяти в
специальный блок символов. Когда AL равен 1 или 2, то наборы
данных для символов 8*14 и 8*8 соответственно копируются из ПЗУ в
блок символов. Когда AL равен 3, то функция устанавливает назна-
чение блока в регистре выбора карты символов, как описано выше. В
последнем случае надо просто поместить соотвествующие данные в BL
и вызвать функцию. Для загрузки данных из ПЗУ поместите номер
блока в BL и выполните функцию. Для загрузки своих данных надо
чтобы ES:BP указывали на них, число передаваемых символов должно
быть в CX, смещение (номер символа) в блоке должно быть в DX,
число байтов на символ - в BH, а номер блока - в BL. После этого
вызывайте прерывание 10H. Вот пример:
;---устанавливаем 128 пользовательских символов в блоке 0
MOV AX,SEG CHARACTER_DATA ;ES:BP должны указывать на данные
MOV ES,AX ;
MOV BP,OFFSET CHARACTER_DATA ;
MOV CX,128 ;число символов
MOV DX,128 ;начальное смещение
MOV BL,0 ;номер блока
MOV BH,8 ;матрица 8*8
MOV AL,1 ;номер подфункции
MOV AH,11H ;номер функции
INT 10H ;переносим данные