Страничная организация видеопамяти
Изменения в вычислениях адресов
Страничная организация памяти влияет олько на способы определения адресов точек графических объектов. Поэтому желательно выбрать такое расположение страниц, при котором изменение работы с адресами точек будет минимально возможным. Иначе говоря, нас интересует такое расположение страниц в видеопамяти, при котором основные процедуры рисования, построения или преобразования графических объектов почти не изменяются.
Перед построением или изменением графического объекта обычно выбирается некая опорная точка, относительно которой вычисляются адреса всех остальных точек объекта. Чаще всего это левый верхний угол прямоугольной области экрана, в которой располагается или будет расположен объект. Координаты опорной точки обычно задают в виде номера строки и столбца, на пересечении которых она находится. Но для дальнейшей работы их надо преобразовать в адрес видеопамяти.
Если видеопамять не разделена на страницы, то начало ее рабочего пространства находится на пересечении нулевой строки и нулевого столбца. В таком случае существует простая связь между координатами произвольной точки и ее адресом в видеопамяти. Адрес вычисляется как сумма двух произведений: номера строки на размер строки в байтах и номера столбца на размер кода точки в байтах. Здесь имеется в виду размер строки, отображаемой на экране (scan Line). Способы вычисления адресов описаны в соответствующих разделах (режимы packed pixel graphics) и (режимы direct color), a соответствующие подпрограммы приведены в примерах 3.4 и 7.3.
При делении видеопамяти на страницы вычисленное адреса точек становятся относительными. Для получения абсолютных значений адресов в этом случае при вычислениях надо учитывать адрес начала страницы или ее координаты (номера нулевой строки и нулевого столбца). Следовательно, при введении страничной организации памяти придется изменить подпрограммы, выполняющие вычисление адресов точек по их координатам. Но это не все.
В процессе работы с графическим объектом приходится вычислять адреса начала его строк. В примерах, приведенных в данной книге, для этой цели использовалась "константа переадресации", значением которой является разность между размером отображаемой на экране строки (scan Line) и шириной графического объекта, выраженной в байтах. Обе величины зависят от установленного задачей видеорежима, способ учета этой зависимости описан, а варианты соответствующих подпрограмм приведены в примере 7.3. При их составлении предполагалось, что отображаемые на экране строки начинаются с нулевого столбца.
Следовательно, если страницы расположить так, чтобы каждая из них начиналась с начала одной из строк видеопамяти, то значение константы переадресации строк не будет зависеть от номера страницы. При таком расположении страниц изменяются только подпрограммы, вычисляющие адреса точек по их координатам.
Расположение и размеры страниц
Если размер страниц равен размеру отображаемой на экране (рабочей) части видеопамяти, то каждая из них будет начинаться с новой строки. При таких размерах страницы располагаются в видеопамяти подряд друг за другом.
Если предполагается использовать N страниц, то в оперативной памяти надо выделить массив размером 2N слов. При выполнении подготовительных действий и эти слова задача должна поместить номера окон, в которых начинаются страницы и адреса нулевых строк страниц в этих окнах. Эти величины нужны для подпрограммы, выполняющей преобразование значений координат в адреса точек. Учитывая, что реальное количество страниц невелико, такой массив можно хранить в разделе данных задачи.
Оценим возможное количество страниц. Предположим, что установленный на видеокарте объем памяти составляет 4 Мбайт и используется видеорежим с разрешением 640x480 точек. Если это режим packed pixel graphics, то в видеопамяти помещается 13 страниц, в режиме Hi-color их количество сократится в 2 раза, а в режиме True Color – в 4 раза. При более высоком геометрическом разрешении количество страниц сокращается. Поэтому можно считать, что оно не больше десяти.
Для определения допустимого количества страниц при выполнении задачи надо прочитать байт массива info со смещением 10h. В нем хранится номер последней страницы, которую можно установить в конкретном видеорежиме при имеющемся объеме видеопамяти. Страницы нумеруют начиная с нуля, поэтому их количество на 1 больше числа, хранящегося в байте 10b.
Кроме указанного массива, в разделе данных задачи надо выделить две переменные, например, Base_win и Base_addr для хранения исходного окна и адреса текущей страницы, с которой работает задача. В исходном состоянии эти переменные очищены, поскольку обычно работа начинается с нулевой страницы. В дальнейшем задача изменяет их значения в зависимости от номера используемой страницы.