Совсем прямое обращение к видеопамяти., навеяло работой с режимом VGA 640x480 |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Совсем прямое обращение к видеопамяти., навеяло работой с режимом VGA 640x480 |
TarasBer |
Сообщение
#1
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
В режиме 640 на 480 видеопамять состоит из 4 цветовых слоёв. Которые в оперативной памяти расположены... по одному и тому же адресу! Для доступа к тому или иному слою надо записать какое-то значение в порты. Но тогда получается, что физическое расположение видеопамяти - это вовсе не $A000: $0000, ведь иначе один слой затирал бы информацию о другом. Можно ли обратиться к видеопамяти ещё более непосредственно, минуя механизм обращения по известному адрему? Или это на уровне железа так сделано, и по другому никак? Ведь помню, когда с портами баловался - экран покрывался цветными пятнами, причём разрешение экрана было довольно высокое.
-------------------- |
Ozzя |
Сообщение
#2
|
Гуру Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: 16 |
|
andriano |
Сообщение
#3
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
В режиме 640 на 480 видеопамять состоит из 4 цветовых слоёв. Которые в оперативной памяти расположены... по одному и тому же адресу! Цитата Для доступа к тому или иному слою надо записать какое-то значение в порты. Но тогда получается, что физическое расположение видеопамяти - это вовсе не $A000: $0000, ведь иначе один слой затирал бы информацию о другом. С какой стати?Во-первых, сам по себе "слой" ничего затереть не может, т.к. ничего никуда не пишет. А пишет и, соответственно, может затереть - только процессор (или другое устройство, которое можно настроить на работу с видеопамятью). И когда рпоцессор пишет некоторое число в адресное пространоство памяти, это число оказывается записанным одновременно в несколько "слоев": от 0 до 4. В зависимости от настроек видеоадаптера в данный момент. Цитата Можно ли обратиться к видеопамяти ещё более непосредственно, минуя механизм обращения по известному адрему? Это самый прямой из всех известных способов доступа к памяти.Цитата Или это на уровне железа так сделано, и по другому никак? Можно придумать и другие способы, но явно не более простые.Цитата Ведь помню, когда с портами баловался - экран покрывался цветными пятнами, причём разрешение экрана было довольно высокое. Ну, для баловства вполне закономерный результат. Чтобы сделать что-то осмысленное, нужно понимать, что делаешь.PS. Режимы с 4 цветовыми слоями сегодня представляют лишь академический (или исторический) интерес. Так что если интерес имеет практический характер, советую забыть о 16-цветных режимах как о кошмарном сне. |
TarasBer |
Сообщение
#4
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
С какой стати? Во-первых, сам по себе "слой" ничего затереть не может, т.к. ничего никуда не пишет. Я про то место, где видеоадаптер на самом деле хранит картинку. Адрес А000:0000 это всего лишь "окно". Цитата PS. Режимы с 4 цветовыми слоями сегодня представляют лишь академический (или исторический) интерес. Так что если интерес имеет практический характер, советую забыть о 16-цветных режимах как о кошмарном сне. А вдруг аналогичные методы потом можно и к другим режимам применить. -------------------- |
andriano |
Сообщение
#5
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Я про то место, где видеоадаптер на самом деле хранит картинку. Адрес А000:0000 это всего лишь "окно". Организация памяти внутри видеоадаптера и то, как она видна в адресном пространстве процессора - разные вещи. Видеоадаптер может подключать к к одному и тому же адресу разные ячейки памяти, одну и ту же - по разным адресам, а также по-разному формировать байты, видимые процессором, из имеющихся у него битов видеопамяти. Если говорить точнее, то "окно" он лишь со стороны процессора - окно, через которое видеоадаптеру РАЗРЕШЕНО подключать видеопамять к адресному пространству процессора. Из каких участков видеопамяти будет скомпоновано это окно (включая составление байтов из битов, а также параллельную запись в несколько мест по одному адресу), а также какая часть этого "окна" будет использоваться, а какая - свободна, - целиком на совести видеоадаптера. Видеоадаптер может, например, в режиме 32-разрядного цвета подключать к каждому двойному слову адресного пространства лишь 24 бита видеопамяти. Возможно, ты не совсем ясно выразился и хотел сказать, что содержимым памяти должен заведовать видеоадаптер, а не центральный процессор? Если так, тогда все 3D-ускоители именно этим и занимаются. (собственно, 2D-ускорители - тоже) Цитата А вдруг аналогичные методы потом можно и к другим режимам применить. Хотелось бы получить описание "метода" прежде, чем пытаться найти что-то ему "аналогичное".Сообщение отредактировано: andriano - |
TarasBer |
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Нет, это ни в коей мере не "окно". Организация памяти внутри видеоадаптера и то, как она видна в адресном пространстве процессора - разные вещи. Видеоадаптер может подключать к к одному и тому же адресу разные ячейки памяти, одну и ту же - по разным адресам, а также по-разному формировать байты, видимые процессором, из имеющихся у него битов видеопамяти. Хорошо, но есть ли прямой способ подключиться к памяти адаптера? Без посредника. -------------------- |
andriano |
Сообщение
#7
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
На старых компьютерах можно было вынуть микросхемы из "кроваток" на плате видеоадаптера и вставить их в "кроватки" на системной плате.
На современных без пайки - никак. PS. Строго говоря, подавляющее большинство и современных компьютеров устроены так, что процессор общается с памятью при посреднике, в роли которого выступает северный мост чипсета. А уж с видеопамятью, которая расположена "по другую сторону" от шины PCI Express - без вариантов. Сообщение отредактировано: andriano - |
OCTAGRAM |
Сообщение
#8
|
Большевик–концептуал Группа: Пользователи Сообщений: 194 Пол: Мужской Реальное имя: Иван Левашев Jabber: bu_gen@octagram.name Skype: i.levashew QQ: 3152538431 Ада: Сторонник Embarcadero Delphi: Сторонник Free Pascal: Разработчик Turbo Pascal: Установлен Репутация: 1 |
На EGA/VGA можно переключать слой. Чтобы делать продвинутые операции типа вывода спрайта, слои последовательно переключаются с 1 на 4, и в каждый выводится изображение. Спрайт при этом по соображениям эффективности тоже хранится по слоям, а не по пикселам.
Далее, если надо рисовать одним цветом, есть режим записи 2, при котором при записи пикселы, в которые записался ноль, не меняются, а в которые записалась 1, меняются на заданный цвет. Далее, есть режим копирования 1. При считывании байта он сохраняется в регистр–защёлку, а при записи все восемь пикселов копируются на новое место. Это можно использовать для отрисовки тайлов: Сначала рисуем тайлы в видеопамяти, в невидимой области, а потом копируем куда надо. Тут, правда, проблема, если надо делать гладкую прокрутку по горизонтали, но она решаема: был какой–то регистр, позволяющий прокрутить графическое поле на несколько пикселей. Графическое поле нужно подкручивать так, чтобы тайлы приходились в аккурат по границам байтов. Для прикидки: видеопамять вмещает в себя примерно поле 640x818. В 640x480 на две страницы пямяти не хватает, зато в 640x350 образуется избыток 640x118. Учитывая необходимость подкрутки по горизонтали, имеем: Графическая область (648x350x2) / 8 = 56700 байтов. 65536 - 56700 = 8836 8836 байт -- это 1262 тайла 8x7 или 315 тайлов 16x14 или 78 тайлов 32x28. Формат тайла 8x7 -- это, чтобы скомпенсировать растянутость режима 640x350. Если честно, очень рад, что больше не надо выкраивать по байту, как бы уместиться на крохотном кусочке видеопамяти. Как и большинство программистов, в детстве мечтал забацать гаму, а в результате потратил кучу времени на изучение видеоконтроллёра, выучил ассемблер, чтобы рисовать спрайты и обрабатывать прерывание клавиатуры, потому что DOS несколько клавиш одновременно не понимает как надо. И всё это устарело в считанные года, когда современные PC стали доступными и в России тоже. Ни гамы, ни детства В SVGA обращение к видеопамяти очень даже прямое. Но нужно учитывать, что вплоть до VGA, адаптеры были совместимыми и взаимозаменяемыми, а, начиная с SVGA, нужно уже работать по прерываниям, потому что схемы записи/чтения в порты отличаются от модели к модели. Если использовать работу SVGA, то прямое обращение возможно. Можно адресовать окно $A000, а можно, читал в одной книжке, использовать 32битный хак: спроецировать видеопамять на один цельный кусок в расширенной (выше мегабайта) памяти, затем ненадолго переключиться в защищённый режим, установив GS или FS на начало графического сегмента. В книжке, которую я читал, FS устанавливается на начало памяти, а GS -- на видеопамять. Фишка в том, что у каждого регистра сегмента (DS, ES, CS, SS, FS, GS) есть теневой регистр, который содержит информацию о настройке сегмента (начало, длина). Поведение сегментного регистра при адресации определяется не режимом (реальный/защищённый), а как раз вот этими теневыми регистрами. Содержимое теневого регистра обновляется только при перезаписи, так что, если в защищённом режиме запрограммировать GS, вернуться в реальный, а потом не трогать GS, он так и останется указывать на видеопамять. При этом можно использовать 32битную адресацию. Встроенный ассемблер TP не сможет, а вот TASM понимает. Если в 16битном коде используются 32битные значения и адреса, TASM генерит префиксы $66 и $67, и это работает. Сообщение отредактировано: OCTAGRAM - -------------------- If you want to get to the top, you have to start at the bottom
|
andriano |
Сообщение
#9
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
OCTAGRAM,
Вроде программирование VGA достаточно подробно описано Фроловыми по ссылке, которую привел Оззя. Если же говорить об эффективных способах использования 16-цветных режимах (которые по определению неэффективны), то можно вделить 2 момента: - единственный действительно эффективный режим, позвояющий быстро залить экран одним цветом, т.к. запись возможна одновременно во все цветовые плоскости - при записи одного бйта заполняется до 4 байт видеопамяти. - режим, в котором записываемый байт поворачивается перпендикулярно цветовым плоскостям. При этом пискель (4 бита) пишется за одно обращение к видеопамяти, а номер пикселя из 8 расположенных по одному адресу выбирается регистром маски. Такой способ попиксельной графики в 2.5-3 раза быстрее стандартного. По поводу изучения VGA и быстрого устаревания этой инфомации - полностью согласен. По поводу регистра GS. Дело в том, что в реальном и защищенном режимах по-разному трактуется содержимое сегментного регистра. Если в защищенном - это селектор, т.е. просто адрес в таблице, то в реальном - это физический адрес, сдвинутый на 4 разряда. Поэтому GS с правильно установленным селектором в защищенном режиме при переходе в реальный НЕ БУДЕТ указывать на видеопамять. Единственная польза, которую можно извлечь из такой операции - преодоление ограничения на размер сегмента (и, соответственно,Ю смещения) в 65536 байт. Т.е. По этому сегменту, если установить его в 0, можно только смещением адресовать 4 Гб адресного пространства, используя префиксы $66 и $67. Ну а получив с помощью VESA физический адрес линейного видеобуфера, можно писать в него, испольуя 4-гбайтный сегмент. Т.е. теоретически из приложения реального режима можно использовать линейный видеобуфер, но техника чуть отличается от описанной. Сообщение отредактировано: OCTAGRAM - |
OCTAGRAM |
Сообщение
#10
|
Большевик–концептуал Группа: Пользователи Сообщений: 194 Пол: Мужской Реальное имя: Иван Левашев Jabber: bu_gen@octagram.name Skype: i.levashew QQ: 3152538431 Ада: Сторонник Embarcadero Delphi: Сторонник Free Pascal: Разработчик Turbo Pascal: Установлен Репутация: 1 |
Вот как раз линейный видеобуффер и имелся в виду.
Но, чтобы это работало, надо без EMM загружаться. Сейчас это разве что при программировании кофейных автоматов может заинтересовать. -------------------- If you want to get to the top, you have to start at the bottom
|
andriano |
Сообщение
#11
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Вот как раз линейный видеобуффер и имелся в виду. Но, чтобы это работало, надо без EMM загружаться. Сейчас это разве что при программировании кофейных автоматов может заинтересовать. Вообще-то линейный буфер полезен и целесообразен в 32-разрядном режиме DOS. Где он, собственно, интенсивно использовался. Помнится, любая уважающая себя игра имела в корневом каталоге файл dos4gw.exe. И, кстати, EMM этому не мешал. Сейчас же неприятность состоит в том, что WinXP не поддерживает линейный буфер для DOS приложений, и все, что было написано с использованием этого режима, под Виндой не запускается (под 95 запускалось), кроме, разве что, DOSBox. обратил внимание еще на одну фразу: Цитата и обрабатывать прерывание клавиатуры, потому что DOS несколько клавиш одновременно не понимает как надо. Насколько я помню, проблема была не в распознавании нескольких нажатых клавиш (такая проблема тоже была, но она была исключительно аппаратной, а потому неразрешимой программными средствами), а в отсутствии индикации отпускания клавиши. И свой обработчик прерывания клавиатуры приходилось писать именно для того, чтобы знать, когда клавиша отпущена. И, кстати, это проблема BIOS, а не DOS.Сообщение отредактировано: OCTAGRAM - |
Текстовая версия | 20.05.2024 1:42 |