|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
Номер текущей строки CRT-луча06.09.2018, 10:15. Показов 2409. Ответов 27
Метки нет (Все метки)
Всех категорически приветствую!
Кто-нибудь знает, возможно ли прочитать из портов графического адаптера (VGA в частности) номер текущей строки (линии), на которой находится луч? Задача такая: вешаю обработчик на таймер (IRQ 0) и настраиваю частоту таймера как мне надо (чтобы он вызывался ≈ на каждой строке, на которой находится луч, либо раз в 5 строк). Процедура таймера совершает разные манипуляции (как банальный пример, рисует градиентную полосу с помощью настройки палитры). Зачем таймер? Чтобы параллельно можно было рисовать что-то ещё, а не тупо крутить цикл чтения порта 3DAh для трассировки луча ![]() Читаю RBIL, ничего по поводу чтения номера линии не нахожу (есть намёки, но всё не то, но мало ли?) Если такой возможности всё-таки нет, то как можно хотя бы понять, что начался новый фрейм? Причём даже при относительно низкой частоте таймера (к примеру, 1 срабатываение на 5 строк). Если проверять бит вертикального ретрейса, то при низкой частоте таймера можно проскочить этот момент (ретрейс длится довольно малое кол-во времени, буквально пару строк... и кстати говоря, окончание ретрейса не говорит о том, что луч находится в видимой области экрана). Бит горизонтального ретрейса включается на всё время отсутствия луча в области экрана. Выглядит примерно так (последовательные чтения из порта):
Что можно придумать для такого случая? Добавлено через 6 минут Может, есть какой-то отдельный бит какого-то другого порта, с помощью которого можно узнать, что луч находится за кадром (ниже или выше)?
1
|
||||||
| 06.09.2018, 10:15 | |
|
Ответы с готовыми решениями:
27
Как узнать номер текущей строки?
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 09.09.2018, 08:24 [ТС] | |
|
R71MT, я хочу отслеживать строки резидентно, чтобы параллельно делать что-то ещё. Но поскольку таймер часов точно подогнать под пиксельный таймер нельзя (либо получается дёргание, либо постепенно едет вообще), особенно учитывая, что "закадровые строки" в LCD/LED пролетают гораздо быстрее, я пока придумал (но ещё не реализовал) только способ "через копчик" (не анус, но близко).
Если у кого-нибудь есть идея, как сделать это просто и радостно, я с удовольствием выслушаю
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 10.09.2018, 11:22 [ТС] | |
|
Есть такой графический спецэффект – рисование горизонтальных линий через отслеживание луча и изменение палитры.
Если мы знаем, что луч находится на линии N и поменяем палитру чёрного цвета на зелёный, а на линии N+1 вернём обратно на чёрный, то увидим горизонтальную полосу зелёного цвета в этой строке. Добавлено через 25 секунд Это на CRT работало, на LCD/LED тоже работает.
1
|
|
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|
| 12.09.2018, 20:34 | |
|
2
|
|
|
Эксперт Hardware
|
|
| 13.09.2018, 01:30 | |
|
shmkv, я молчу.... потомучто ТС сказал, что не трогай программу,
а ттвои варианты опять трогают реги Добавлено через 51 минуту можно было потрахаться с таймером, как я понял прабла в нём, что irq0 не может отключить, т.к. сам его использует. да и выкини его на второй план.. а сам сядь на нуль
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 13.09.2018, 19:39 [ТС] | |
Сообщение было отмечено Mikl___ как решение
Решение
R71MT, про отключение IRQ другая тема была, но там решили уже, что самый простой вариант – перезаписывать счётчик PIT на 0.
А пока всё понятно, надо только найти время, чтобы добить эту тему. Общий алгоритм такой (не могу сказать, что мне всё нравится, но лучше пока не придумал, чтобы ничего не мигало и внизу не было полосы). Инициализация: 0. cli 1. Ждём, пока v-retrace = 0, затем пока v-retrace = 1 (т.е. конца v-retrace), после читаем счётчик (VerticalRetraceEndTime), при этом будет h-retrace = 1. 2. Ждём, пока h-retrace = 1 (т.е. конца h-retrace), после чего читаем счётчик (FirstVisibleLineStartTime) 3. Ждём, пока h-retrace = 0 (т.е. начала следующего h-retrace), после чего читаем счётчик (FirstVisibleLineEndTime) 4. Отсчитываем строки: ожиданиями пока h-retrace = 0 (кроме первой итерации цикла, т.к. в шаге 3 это уже было), затем пока h-retrace = 1, после этого увеличиваем счётчик строк и там же читаем таймер (LastVisibleLineStartTime). Это всё повторяем, пока v-retrace = 0, а при v-retrace = 1 завершаем цикл (таймер тут мы не читаем). Таким образом, мы получаем кол-во видимых строк минус 1 или максимальный номер строки от 0 (LastVisibleLineNumber). 5. Считаем: • OneLineTicks = (FirstVisibleLineStartTime - LastVisibleLineStartTime) / LastVisibleLineNumber : кол-во тиков на 1 строку. • TicksBefore1VLE = (VerticalRetraceEndTime - FirstVisibleLineEndTime) : кол-во тиков от конца v-retrace до конца первой видимой строки (т.е. до начала h-retrace'а). Всё округляем в меньшую сторону (лучше, если таймер будет работать чуть чаще, чем чуть реже, см. ниже почему)! 6. Устанавливаем номер текущей строки LineNumber на -1, номер кадра FrameNumber на -1, а PIT-счётчик для IRQ 0 на частоту OneLineTicks (сейчас у нас как раз v-retrace = 1, и это хорошо). 7. sti (скоро должен сработать IRQ) Работа таймера: 1. Если сейчас v-retrace = 1, сбрасываем PIT-счётчик на 0 (чтобы у нас было 55 мс на дальнейшие действия). Ждём, пока v-retrace = 1 (т.е. конца v-retrace). Устанавливаем PIT-счётчик на TicksBefore1VLE, номер строки LineNumber = 0, номер кадра FrameNumber увеличиваем на 1 и вызываем функцию FirstLine (см. ниже). Затем goto 4. 2. Если FrameNumber < 0, то goto 5 (первый кадр мы как-то прошляпили). 3. Иначе ждём, пока h-retrace = 0 (так будет, если IRQ сработал чуть раньше конца строки - вот почему мы округляли в меньшую сторону... если таймер будет работать реже, мы будем проскакивать строку) и перезаписываем PIT-счётчик на частоту OneLineTicks (только если h-retrace был = 0 или если LineNumber = 0). Увеличиваем номер строки LineNumber на 1. 4. Вызываем процедуру NextLine. 5. EOI/iret ![]() Ну вот как-то так. Если я в логике не накосячил, всё должно работать. Но меня смущает скорость PIO. Если на чтения/запись в порт тратится 1 мкс, то это пипец как долго. Тогда при перезаписи PIT-счётчика нужно закидывать значение меньше ≈ на 3 (надо тестить, короче). FirstLine и NextLine - пользовательские процедуры, которые должны вызываться в начале кадра и на каждом кадре (NextLine читает номер строки из LineNumber). Добавлено через 3 минуты Что мне тут не нравится: 1. Если параллельный код (т.е. основной, не IRQ-шный) будет делать что-то в cli/sti, мы рискуем проскакивать строки и всё поедет (хотя, "что-то делать" он должен довольно долго, несколько мкс, я думаю). 2. В IRQ иногда будет крутиться цикл ожидания начала h-retrace (см. п.3), а это лишняя трата времени, хоть и небольшая (должно быть). 3. Сложно понять, как вызывать старый обработчик IRQ 0. Ибо PIT-счётчик перезаписывается разными значениями в разные моменты. Тут либо читать счётчик перед перезаписью (но тогда надо точно знать скорость PIO), либо просто забить на старый обработчик и не вызывать его... 4. Громоздко (если применять для демосцены, например, но тогда на п.3 можно реально забить).
2
|
|
| 13.09.2018, 19:39 | |
|
Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки
Какова степень поляризации отраженного луча, если угол падения светового луча на границу раздела двух диэлектриков равен углу Брюстера?
Номер текущей записи в ADODB.Recordset Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|