Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Рисование точки на экране (монохромный, цветной и PCjr). Часть 2

ОГЛАВЛЕНИЕ

   Низкий уровень.


   На низком уровне мы имеем возможность прямого доступа к видео-
буферу (отображение в память). Сначала Вы должны вычислить смеще-
ние точки (а) внутри буфера и (б) внутри байта, содержащего биты,
относящиеся к данной точке.  После этого битовые операции обеспе-
чат соответствующую установку.   Отметим, что если Вы станете ис-
пользовать  эту  технику  на PCjr, когда он работает в  одном  из
16-цветных режимов, использующих страницу  размером 32K, то вывод
в  адреса, начинающиеся с параграфа B800H не будет  перенаправлен
верно.  Вам необходимо прямо адресовать реальные ячейки, располо-
женные в сегменте ниже 2000H.
   Для  нахождения точки необходимо прежде всего определить нахо-
дится ли она в четной или нечетной строке. В данном примере стро-
ка помещена в CX, а столбец - в DX.  Если бит 0 регистра CX равен
0, то строка имеет четный  номер.   Четные  строки расположены со
смещением  0  относительно начала буфера.  Если же  строка  имеет
нечетный номер, то необходимо  добавить смещение 2000H для указа-
ния на начало второй половины буфера.
   Затем разделите номер строки на 2, необходимо подсчитать число
только четных или нечетных строк и умножьте результат на 80, т.к.
на одну строку расходуется 80 байт.  Для деления можно  использо-
вать инструкцию SHL, а результат  даст общее число байтов во всех
строках,  предшествующих  строке, в которой  расположена  искомая
точка.
   Вместо того, чтобы  затем  вычислять  число столбцов в текущей
строке,  лучше  сначала  определить позицию пары  битов в  байте,
которые содержат эту точку. Это достигается обращением всех битов
в номере столбца (после того как сохранена его копия) и выделения
двух младших битов.  Эта процедура покажет находятся ли два бита,
относящиеся  к  точке  на первой, второй, третьей  или  четвертой
позиции в байте.  Умножив это  значение  на 2 мы получаем номер в
байте первого из двух битов, относящихся к данной точке.
   Затем  приходит время подсчитать число байтов в строке,  пред-
шествующих байту, содержащему итнформацию  о требуемой точке. Для
режима умеренного разрешения надо разделить число столбцов на  4,
а для высокого разрешения - на  8.   После этого надо сложить три
смещения:  смещение за счет номера строки, за счет номера столбца
и смещение начала четных/нечетных  строк в буфере. После этого Вы
можете получить требуемый байт из буфера.

   Наконец, надо произвести операцию над соответствующими  битами
байта. Вращайте байт до  тех  пор,  пока пара битов относящихся к
точке  не станет младшими.  При вращении необходимо  использовать
ранее подсчитанное значение  позиции  битов.  Затем выключите оба
бита поместите в них инструкцией OR требуемый код палетты.  Затем
надо произвести обратное вращение и послать байт обратно в буфер.

;---в сегменте данных
PALETTE_COLOR  DB   2

;---вызов процедуры
   MOV  AX,0B800H         ;указываем на видеобуфер
   MOV  ES,AX             ;
   MOV  CX,100            ;номер строки
   MOV  DX,180            ;номер столбца
   CALL SET_DOT           ;
    .
    .
;---определяем число байтов в предшествующих строках
SET_DOT     PROC
            TEST CL,1              ;номер строки нечетный?
            JZ   EVEN_ROW          ;если нет, то вперед
            MOV  BX,2000H          ;смещение для нечетных строк
            JMP  SHORT CONTINUE    ;переход вперед
EVEN_ROW:   MOV  BX,0              ;смещение для четных строк
CONTINUE:   SHR  CX,1              ;делим число строк на 2
            MOV  AL,80             ;умножаем на 80
            MUL  CL                ;в AX - число байтов
;---определяем положение пары бит в байте
            MOV  CX,DX             ;копируем номер столбца
            NOT  CL                ;обращаем биты
            AND  CL,00000011B      ;в CL - позиция битов (0-3)
            SHL  CL,1              ;позиция первого бита пары
;---подсчитываем смещение столбца в байтах
            SHR  DX,1              ;делим номер столбца на 4
            SHR  DX,1              ;(нужны два младших бита)
;---вычисляем смещение для изменяемого байта
            ADD  AX,DX             ;складываем все три смещения
            ADD  BX,AX             ;
;---изменяем биты нужного байта
            MOV  AH,ES:[BX]        ;читаем нужный байт
            ROR  AH,CL             ;сдвигаем нужные биты вниз
            AND  AH,11111100B      ;чистим младшие 2 бита
            MOV  AL,PALETTE_COLOR  ;изменяем их на цвет палетты
            OR   AH,AL             ;
            ROL  AH,CL             ;обратное вращение
            MOV  ES:[BX],AH        ;возвращаем байт
            RET                    ;
SET_DOT     ENDP