Страница 31 из 47
Низкий уровень. На низком уровне мы имеем возможность прямого доступа к видео- буферу (отображение в память). Сначала Вы должны вычислить смеще- ние точки (а) внутри буфера и (б) внутри байта, содержащего биты, относящиеся к данной точке. После этого битовые операции обеспе- чат соответствующую установку. Отметим, что если Вы станете ис- пользовать эту технику на 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
|