Страница 41 из 47
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 ;выводим его
|