Справочник программиста на персональном компьютере фирмы 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          ;выводим его