Глава 4. Вывод на терминал.

Раздел 4. Вывод точечной графики.

4.4.2 Рисование точки на экране (монохромный, цветной и PCjr).

Вследствие организации графической информации в видеобуфере вывод одной точки подразумевает изменение отдельных битов памяти. Режимы двух, четырех и шестнадцати цветов требуют, чтобы для установки характеристик одной точки были изменены один, два и четыре бита соответственно. Эти операции могут требовать огромного количества процессорного времени, о чем свидетельствует то, что большинство графического программного обеспечения работает очень медленно. Тщательное обдумывание часто позволяет сразу установить все биты одного байта, а не обращаться к одному и тому же байту 4 или 8 раз. Имейте это ввиду, и не следуйте слепо приведенной здесь технике поточечного вывода.

Средний уровень.

Функция CH прерывания 10H устанавливает точку. DX содержит строку, а CX - столбец, оба отсчитываемые от 0. Kод цвета помещается в AL. Отметим, что содержимое AX будет разрушено при выполнении прерывания. Если Вы используете это прерывание в цикле, то не забудьте сохранить AX на стеке и каждый раз восстанавливать его.
;---вывод точки с координатами 100,180
MOV AH,0CH ;функция установки точки
MOV AL,3 ;выбираем цвет 3 палетты
MOV CX,100 ;строка
MOV DX,180 ;столбец
INT 10H ;выводим точку
;---стираем точку
MOV AH,0CH ;восстанавливаем функцию
MOV AL,0 ;используем для стирания фоновый цвет
MOV DX,100 ;строка
MOV CX,180 ;столбец
INT 10H ;стираем точку

В то время как цвет палетты помещается в младшие биты AL, старший бит также имеет значение. Если он равен 1, то над цветом производится операция исключающего ИЛИ с текущим цветом. Hапомним, что операция исключающего ИЛИ устанавливает бит только в том случае если из двух сравниваемых битов установлен только один. Если оба сравниваемые бита равны 1 или оба равны 0, то результат будет 0. Для двухцветного режима это означает, что такая операция обращает установку бита. Если эту операцию применить ко всем точкам экрана, то будет обращен весь экран. В четырех- и 16-цветном режимах, с другой стороны, области экрана могут менять свои цвета. Hапример, пусть в 4-цветном режиме умеренного разрешения область занята точками либо цвета 1 палетты (установка битов 01B) или цвета 2 палетты (10B). Что произойдет, если применить ко всем точкам этой области операцию исключающего ИЛИ с 11B? 01B перейдет в 10B, а 10B перейдет в 01B - цвета будут обращены.

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

Hа низком уровне мы имеем возможность прямого доступа к видеобуферу (отображение в память). Сначала Вы должны вычислить смещение точки (а) внутри буфера и (б) внутри байта, содержащего биты, относящиеся к данной точке. После этого битовые операции обеспечат соответствующую установку. Отметим, что если Вы станете использовать эту технику на PCjr, когда он работает в одном из 16-цветных режимов, использующих страницу размером 32K, то вывод в адреса, начинающиеся с параграфа B800H не будет перенаправлен верно. Вам необходимо прямо адресовать реальные ячейки, расположенные в сегменте ниже 2000H.

Для нахождения точки необходимо прежде всего определить находится ли она в четной или нечетной строке. В данном примере строка помещена в CX, а столбец - в DX. Если бит 0 регистра CX равен 0, то строка имеет четный номер. Четные строки расположены со смещением 0 относительно начала буфера. Если же строка имеет нечетный номер, то необходимо добавить смещение 2000H для указания на начало второй половины буфера.

Затем разделите номер строки на 2, необходимо подсчитать число только четных или нечетных строк и умножьте результат на 80, т.к. на одну строку расходуется 80 байт. Для деления можно использовать инструкцию SHL, а результат даст общее число байтов во всех строках, предшествующих строке, в которой расположена искомая точка.

Вместо того, чтобы затем вычислять число столбцов в текущей строке, лучше сначала определить позицию пары битов в байте, которые содержат эту точку. Это достигается обращением всех битов в номере столбца (после того как сохранена его копия) и выделения двух младших битов. Эта процедура покажет находятся ли два бита, относящиеся к точке на первой, второй, третьей или четвертой позиции в байте. Умножив это значение на 2 мы получаем номер в байте первого из двух битов, относящихся к данной точке.

Затем приходит время подсчитать число байтов в строке, предшествующих байту, содержащему итнформацию о требуемой точке. Для режима умеренного разрешения надо разделить число столбцов на 4, а для высокого разрешения - на 8. После этого надо сложить три смещения: смещение за счет номера строки, за счет номера столбца и смещение начала четных/нечетных строк в буфере. После этого Вы можете получить требуемый байт из буфера.

Hаконец, надо произвести операцию над соответствующими битами байта. Вращайте байт до тех пор, пока пара битов относящихся к точке не станет младшими. При вращении необходимо использовать ранее подсчитанное значение позиции битов. Затем выключите оба бита поместите в них инструкцией 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


<~-4.4.1 Установка цветов для точечной графики.
Содержание
4.4.3 Рисование точки на экране (EGA).-~>

Сайт управляется системой uCoz