Иллюстрированный самоучитель по SVGA

Обработка информации о режиме

При программировании графики надо знать количество-точек на экране по горизонтали и вертикали, способ кодирования цвета, расположение базовых цветов, способ переключения окон видеопамяти, значение сегмента для доступа к видеопамяти и некоторые другие данные. Одни из этих величин зависят от видеорежима, другие – от особенностей видеокарты, третьи – от установленного на компьютере оборудования и программного обеспечения.

Поэтому есть только один способ сделать задачу переносимой и заключается он в максимальном использовании данных, приведенных в Табл. 1.2. После выполнения примеров 2.1-2.3 эти данные расположены в массиве info. Значение сегмента массива находится в регистре fs, а адрес начала массива (смещение от начала сегмента) равен нулю и расположен в регистре di.

Для сохранения и последующего использования служебной информации в разделе данных задачи надо зарезервировать переменные требуемого размера и присвоить им соответствующие имена. Например, размер рабочего поля экрана по вертикали мы будем хранить в переменной versize, а по горизонтали – в переменной Horsize. Подробнее о резервировании и назначении переменных сказано в разделе данной главы. Описанные там и в примерах всей главы имена переменных будут неоднократно использоваться в тексте книги.

Значения Vbuff, Horsize и Versize. В примере 2.5 показано, как можно сохранять данные из массива info. Предполагается, что он выполняется сразу после примера 2.4, о чем свидетельствует метка succ.

Пример 2.5. Определение значений трех переменных.

succ: mov ax, fs:[di+08] ; читаем значение видеосегмента
mov Vbuff, ax ; и сохраняем его в Vbuff
mov ax, fs:[di+12h] ; читаем количество точек в строке
mov horsize, ax ; и сохраняем его в horsize
mov ax, fs:[di+14h] ; читаем количество строк на экране
mov versize, ax ; и сохраняем его в versize

Команда пересылки не может перемешать данные из одного места памяти в другое, в подобных случаях нужны две команды и регистр, используемый в качестве посредника. В примере 2.5 посредником является регистр ах, но можно применять любой из регистров общего назначения. При чтении в регистр ах использован индексный способ адресации второго операнда с указанием смещения в виде числа. Макроассемблер включает смещение в код формируемой команды. Конкретное значение адреса операнда вычисляет микропроцессор при выполнении команды. Для этого он суммирует текущее содержимое регистра di и указанное в коде команды смещение.

Напомним, что в слове массива info со смещением 10h находится размер отображаемой на экране строки (scan Line) в байтах. Если эта величина будет использоваться в задаче, то ее также надо сохранить. В Примере 2.11 для этого выделена переменная Bperiine.

Переменные для работы с окнами

Массив info содержит три величины, значения которых используются при работе с окнами видеопамяти. В примере 2.6, который является продолжением примера 2.5, показан способ сохранения этих величин и вычисления единицы приращения значения окна.

Пример 2.6. Сохранение величин, используемых при работе с окнами.

mov al, fs:[di+3] ; читаем состояние окна В
mov winB, al ; и сохраняем его в байте winB
mov cl, es:[di+4] ; читаем в cl window granularity
mov ax, 64 ; помещаем в ах число 64
div cl ; деление ах = ax/cl
mov GrUnit, ax ; сохраняем результат деления
mov eax, es:[di+OCh] ; читаем в еах адрес подпрограммы
mov VMC, eax ; и сохраняем его в VMC

Две первые команды примера 2.6 сохраняют в памяти содержимое байта состояния окна в. Эта величина нужна, если видеокарта поддерживает работу с двумя окнами. Она может принимать одно из четырех значений:

  • 0 – второе окно не существует;
  • 3 – окно используется только при чтении из видеопамяти;
  • 5 – окно используется только при записи в видеопамять;
  • 7 – окно используется при записи и при чтении.

Далее в примере 2.6 команды 3-6 вычисляют единицу для приращения (увеличения или уменьшения) значений окон видеопамяти делением числа 64 на содержимое байта массива info со смещением 4. Такой способ вычисления GrUnit рекомендован стандартом VESA.

Две последние команды примера 2.6 сохраняют в области данных задачи адрес подпрограммы BIOS, выполняющей работу с видеоокнами. Адрес состоит из сегмента и смещения, поэтому при его пересылке в качестве посредника используется 32-разрядный регистр еах.

Имена GrUnit и VMC заимствованы из описания стандарта VESA, их расшифровка приводится в следующем разделе данной главы.

В байте массива info, имеющем смещение 6, хранится размер окна, выраженный в килобайтах. Его стандартным значением является код 40h, соответствующий 64 Кбайт. Для семейства IBM PC стандартным значением сегмента оперативной памяти является именно 64 Кбайт. Возможно, по этой причине автор не встречал видеокарт, имеющих окна аномального размера.

В данном разделе мы показали способ получения и сохранения только той информации о видеокарте, которая будет многократно использоваться в примерах, приведенных в книге. Об использовании других величин, содержащихся в массиве info, речь пойдет по мере изложения материала.

Советуем вам составить программу, которая позволяет ввести код видеорежима, прочитать в память массив info и вывести на экран или печать содержимое его первых 20 слов в шестнадцатеричном коде. Затраченные на ее составление и отладку усилия окупятся при дальнейшей работе.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.