Страница 25 из 47
Средний уровень. Для цветного адаптера и 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 ;переносим данные
|