На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Номер текущей строки CRT-луча
    Всех категорически приветствую!

    Кто-нибудь знает, возможно ли прочитать из портов графического адаптера (VGA в частности) номер текущей строки (линии), на которой находится луч?
    Задача такая: вешаю обработчик на таймер (IRQ 0) и настраиваю частоту таймера как мне надо (чтобы он вызывался ≈ на каждой строке, на которой находится луч, либо раз в 5 строк). Процедура таймера совершает разные манипуляции (как банальный пример, рисует градиентную полосу с помощью настройки палитры). Зачем таймер? Чтобы параллельно можно было рисовать что-то ещё, а не тупо крутить цикл чтения порта 3DAh для трассировки луча :)

    Читаю RBIL, ничего по поводу чтения номера линии не нахожу (есть намёки, но всё не то, но мало ли?)
    Если такой возможности всё-таки нет, то как можно хотя бы понять, что начался новый фрейм? Причём даже при относительно низкой частоте таймера (к примеру, 1 срабатываение на 5 строк). Если проверять бит вертикального ретрейса, то при низкой частоте таймера можно проскочить этот момент (ретрейс длится довольно малое кол-во времени, буквально пару строк... и кстати говоря, окончание ретрейса не говорит о том, что луч находится в видимой области экрана). Бит горизонтального ретрейса включается на всё время отсутствия луча в области экрана.
    Выглядит примерно так (последовательные чтения из порта):
    ExpandedWrap disabled
      V H - биты вертикального и горизонтального ретрейса
      ---
      0 0 - луч в видимой области
      0 1 - идёт горизонтальный ретрейс \
      0 0 - видимая область              \ это повторяется
      0 0 - видимая область              / для каждой строки
      0 0 - видимая область             /
      0 1 - луч вышел за область экрана (он находится снизу или сверху)
      0 1 - луч за областью экрана
      0 1 - луч за областью экрана
      0 1 - луч за областью экрана
      1 1 - вертикальный ретрейс
      1 1 - вертикальный ретрейс
      1 1 - вертикальный ретрейс
      0 1 - луч пока ещё за областью экрана
      0 1 - луч пока ещё за областью экрана
      0 1 - луч пока ещё за областью экрана
      0 1 - луч пока ещё за областью экрана
      0 1 - луч пока ещё за областью экрана
      0 0 - снова началась видимая область
    Если проверять H-бит на повторы, то может оказаться так, что нам просто "везёт" нарываться на несколько горизонтальных ретрейсов подряд между видимыми линиями, а не между кадрами.
    Что можно придумать для такого случая? Может, есть какой-то отдельный бит какого-то другого порта, с помощью которого можно узнать, что луч находится за кадром (ниже или выше)?
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0176 ]   [ 16 queries used ]   [ Generated: 28.03.24, 23:12 GMT ]