Мысли
о
Паскале
г
Владислав ДЕМЬЯНИШИН
www.ixom.ua/~amonit
Продолжение, начало см. в М К, Ne 46, 5 1 S 2 , 4, 6 —7, 10, 12~13, 1 6 -1 8 , 22, 24, 29, 34, 41, 46, 4, 6, 17, 21, 23, 28,
30, 32, 39, 42, 45, 47, 52, 2, 7, 1 8 -1 9 , 23, 37, 39, 45, 48, 50, 5 2 (165, 1 7 0 -1 7 1 , 175, 17 7 -1 7 8 , 181, 1 8 3 -1 8 4 , 18 7 -1 8 9 ,
193, 195, 200, 205, 212, 217, 227, 229, 240, 244, 24 6, 251, 253, 255, 262, 265, 268, 270, 275, 277, 282, 2 9 3 -2 9 4 , 298,
312, 314, 320, 323, 325, 327)
В
части цикла, опубликованной в МК, № 50 (325), мы на-
чали обсуждать особенности поддержки различных ви-
деорежимов видеоадаптерами. Теперь это следует под-
твердить исходным кодом — настала очередь блока реа-
лизации. Следующие подпрограммы необходимо заключить
в блок включенной директивы дальнего вызова. Данная груп-
па подпрограмм предназначена для преобразования компо-
нент R/G /B в цвет для текущего видеорежима.
Каждая из компонент должна иметь значение в пределах
0..255, так как подпрограммы предполагают, что в каждой ком-
поненте 8 значащих бит. Если исходные компоненты имеют зна-
чения 0.
.63, их следует умножить на 4, а уже потом вызывать
функцию посредством процедурной переменной RGBToColor.
Первой в очереди идет NilRGBFunc, адрес которой слу-
жит заглушкой для неинициализированной переменой RG-
B ToC olor. Функция NilRG BFunc всегда возвращает нулевой
цвет. Подпрограммы R G BTol6BitS
И
RGBTo24BitS формиру-
ют соответственно 16- и 24-битный цвет,
im p le m e n ta tio n
{ $F+ }
fu n c tio n N ilR G B Func( Red, G reen, B lu e : b y te ) : T C o l-
o r ; a s s e m b le r;
asm
x o r d x ,d x ; x o r a x ,a x
end;
fu n c tio n R G B T ol6B its ( Red, G reen, B lu e : b y te ) :
T C o lo r;
v a r Tmp : lo n g in t;
b e g in
Tmp: = (Red s h r 3 ) ; Tmp:=Tmp s h l 11;
R G B T ol6B its := ( B lu e s h r 3 ) +
(( G reen s h r 2 ) s h l 5 ) + Tmp;
end;
fu n c tio n RG BTo24Bits ( Red, G reen, B lu e : b y te ) :
T C o lo r;
v a r TmpR, TmpG : lo n g in t ;
b e g in
TmpR:=Red; TmpR: =TmpR s h l 16;
TmpG:=Green; TmpG:=TmpG s h l 8;
RG BTo24Bits := B lu e + TmpG + TmpR;
end;
Теперь следует рассказать о доступе к видеопамяти и фор-
мировании в ней изображения.
Стандартнейший и самый любимый некогда всеми (и поль-
зователями и программистами) видеорежим 320x200x8 бит уме-
щался в пределах видеоокна размером 64 000 байт, что по-
зволяло удобно и быстро работать с данными в видеопамяти.
С появлением видеорежимов, при которых размер памя-
ти видеоокна превысил 64 Кб, появилась проблема с адре-
сацией видеопамяти — напомним, под графический видео-
режим адаптеру в незапамятные времена был выделен сег-
мент в 64 Кб па адресу $ОАООО. В свое время эта пробле-
ма решалась при помощи расслоения видеоокна на цвето-
вые слои, из-за чего для рисования одной точки приходилось
обращаться сразу к трем ячейкам памяти в каждом из трех
слоев. То есть три посылки данных вместо одной.
И совершенно естественно, что такой способ был неудобен
с точки зрения программирования, к тому же замедлял работу.
Для УЕБА-режимов решили поступить следующим обра-
зом. Пускай вся память адаптера располагается вне адрес-
ного пространства компьютера. Пад каждое окно видеоре-
жима ВЮБ'ом выделяется необходимый размер этой видео-
памяти. Для доступа к памяти этого окна используется видео-
буфер по адресу $О
а ООО размером 64 Кб, то есть в облас-
ти видеобуфера аппаратно отображается сегмент аналогич-
ного размера выделенной видеопамяти. Естественно, что в
пределах такого маленького видеобуфера могут быть доступ-
ны для рисования далека не все строки окна. А почему бы
при необходимости не передвинуть такой видеобуфер по плос-
кости видеопамяти, допустим, на определенное количество
килобайт? Нет, конечна, адрес видеобуфера для программи-
ста останется прежним, просто участок видеопамяти, отобра-
женной в нем, будет уже другой — например, следующие
64 Кб. Таким образом, буфер сдвинется на 64 Кб по видео-
памяти. И так далее, пока весь экран не будет обработан.
Допустим, установлен режим 640x400x8 бит, тогда раз-
мер видеаокна получится 256 000 байт, что эквивалентно
почти четырем сегментам по 64 Кб. То есть, чтобы добрать-
ся до самых нижних строк видеоизображения, придется пе-
реместить видеобуфер почти на 192 Кб.
Для перемещения видеобуфера па видеопамяти в УЕБА
ВЮБ'е предусмотрена функция с номером $4Г05, в которой
аргумент указывает не на количество килобайт, а на коли-
чества страниц, например, по 64 Кб.
При этом, сдвигая видеобуфер по видеопамяти окна, следу-
ет учитывать архитектурные особенности адаптера, так как па-
мять адаптера может быть не всегда разделена на 64 Кб стра-
ницы, по которым можно позиционировать видеобуфер (напри-
мер, у многих старых моделей адаптеров память могла быть по-
делена на страницы по 4 Кб). Исходя из этого, чтобы сместить
видеобуфер на следующие 64 Кб, пришлось бы сдвигать не на
одну, а на 16 страниц, то есть 16*4 Кб=64 Кб. У различных
адаптеров размер таких страниц может варьироваться от 4 Кб
до 64 Кб и принимать значения 4 Кб, 8 Кб, 16 Кб.
.. Это явле-
ние решили назвать гранулярностью. А чтобы программист ка-
ждый раз не гадал на кофейной гуще, какая же у адаптера гра-
нулярность и каков размер страниц, в УЕБА ВЮБ'е предусмот-
рена функция с номером $4Г01. Последняя возвращает струк-
туру типа ТУЕБАМ<х
1
еХп
1
о с подробной информацией о пара-
метрах видеорежима заданного номера, где есть пале с име-
нем И1пСгапи1, которое указывает минимальный размер стра-
ницы, на которую можно переместить видеобуфер.
При установке видеорежима изначально в видеобуфер
отображается видеопамять, начиная с нулевой страницы.
Обычно для видеорежимо доступны два окна — А и В; по
умолчанию через видеобуфер доступна окно А. В данной
статье я ограничусь работой лишь с окном А, чтобы не за-
путать вас окончательно. Я и сам могу запутаться, ведь не
такая уж и простая задача — все это разложить по полоч-
кам и описать доступным языком. Но я постараюсь.
С видеобуфером пока все. Теперь осталось вкратце расска-
зать о том, как позиционировать пиксели на экран. Чтобы за-
жечь на экроне точку необходимого цвета, достаточно устано-
вить в видеопамяти по соответствующему ей адресу требуемый
цвет, то есть значение в 8/16/24 бита. Чтобы вычислить адрес
точки с координатами (Х;У) на экране, следует использовать фор-
мулу адрес=(У*ширина+Х)*цветность, где ширина — ширина эк-
рана в пикселях, а цветность дана в битах, деленных на 8. Как
видна, формула содержит два умножения, из-за чего будет вы-
№ 5/332 31 января-07 февраля 2005
предыдущая страница 38 Мой Компьютер 2005 05 читать онлайн следующая страница 40 Мой Компьютер 2005 05 читать онлайн Домой Выключить/включить текст