Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Графический вывод с использованием символов псевдографики
ОГЛАВЛЕНИЕ
4.4.7 Графический вывод с использованием символов псевдографики.
Когда Вы выводите изображение точка за точкой, то это отнимает
очень много времени, особенно когда создаются эффекты мультипли-
кации. Один из способов экономии времени состоит в сведении всех
или части выводимых форм к фигурам, которые могут быть построены
на матрице точек 8*8. Такие фигуры могут быть созданы, как опре-
деляемые пользователем символы, как показано в [4.3.4]. После
того, как эти символы определены они выводятся на экран очень
быстро и просто. Эти символы могут выводиться вперемешку с пото-
чечными графиками, как обычные буквы. Один из способов быстрого
заполнения фигуры состоит в последовательном выводе внутри фигуры
полностью закрашенного блока. Отметим, что эти символы всегда
располагаются в стандартных позициях курсора.
Средний уровень.
В этом примере рисуется фигура человека, занимающая 2 символа
в высоту и 2 символа в ширину. Как объяснено в [4.3.4] вектор
прерывания 1FH указывает на начало области данных, определяющих
символы. Четыре символа могут быть выведены обычными процедурами
DOS или BIOS. Легко создать другой набор символов, для вывода
фигуры с руками и ногами в другом месте экрана. Два набора симво-
лов могут поочередно меняться в соседних позициях курсора, созда-
вая иллюзию человека, идущего по экрану.
;---в сегменте данных
CHARACTER_DATA DB 00110000B ;левый верхний квадрант
DB 01100111B
DB 01100111B
DB 00110011B
DB 00011111B
DB 00001111B
DB 00001111B
DB 00000111B
DB 00000011B ;правый верхний квадрант
DB 10001100B
DB 10011000B
DB 00110000B
DB 11100000B
DB 11000000B
DB 11000000B
DB 10000000B
DB 00001111B ;левый нижний квадрант
DB 00011111B
DB 00011100B
DB 00011000B
DB 00011000B
DB 00110000B
DB 01100000B
DB 00010000B
DB 11000000B ;правый нижний квадрант
DB 11000000B
DB 11000000B
DB 11000000B
DB 01100000B
DB 01100000B
DB 00010000B
DB 00011110B
DB 00000000B
;---установка вектора прерывания
PUSH DS ;сохраняем DS
MOV DX,OFFSET 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 DH,13 ;строка 13
MOV DL,20 ;столбец 20
MOV BH,0 ;страница 0
INT 10H ;установка курсора
;---рисуем верхние два символа
MOV DL,128 ;берем символ 128
MOV AH,2 ;функция вывода/курсор вперед
INT 21H ;вывод символа
MOV DL,129 ;берем символ 129
INT 21H ;выводим его
;---позиционируем курсор на нижнюю строку
MOV DH,14 ;строка 14
MOV DL,20 ;столбец 20
MOV AH,2 ;функция установки курсора
INT 10H ;устанавливаем курсор
;---рисуем нижние два символа
MOV DL,130 ;берем символ 130
MOV AH,2 ;функция вывода/курсор вперед
INT 21H ;вывод символа
MOV DL,131 ;берем символ 131
INT 21H ;выводим его