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