|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
Номер текущей строки CRT-луча06.09.2018, 10:15. Показов 2293. Ответов 27
Метки нет (Все метки)
Всех категорически приветствую!
Кто-нибудь знает, возможно ли прочитать из портов графического адаптера (VGA в частности) номер текущей строки (линии), на которой находится луч? Задача такая: вешаю обработчик на таймер (IRQ 0) и настраиваю частоту таймера как мне надо (чтобы он вызывался ≈ на каждой строке, на которой находится луч, либо раз в 5 строк). Процедура таймера совершает разные манипуляции (как банальный пример, рисует градиентную полосу с помощью настройки палитры). Зачем таймер? Чтобы параллельно можно было рисовать что-то ещё, а не тупо крутить цикл чтения порта 3DAh для трассировки луча ![]() Читаю RBIL, ничего по поводу чтения номера линии не нахожу (есть намёки, но всё не то, но мало ли?) Если такой возможности всё-таки нет, то как можно хотя бы понять, что начался новый фрейм? Причём даже при относительно низкой частоте таймера (к примеру, 1 срабатываение на 5 строк). Если проверять бит вертикального ретрейса, то при низкой частоте таймера можно проскочить этот момент (ретрейс длится довольно малое кол-во времени, буквально пару строк... и кстати говоря, окончание ретрейса не говорит о том, что луч находится в видимой области экрана). Бит горизонтального ретрейса включается на всё время отсутствия луча в области экрана. Выглядит примерно так (последовательные чтения из порта):
Что можно придумать для такого случая? Добавлено через 6 минут Может, есть какой-то отдельный бит какого-то другого порта, с помощью которого можно узнать, что луч находится за кадром (ниже или выше)?
1
|
||||||
| 06.09.2018, 10:15 | |
|
Ответы с готовыми решениями:
27
Как узнать номер текущей строки?
|
|
Эксперт Hardware
|
||
| 06.09.2018, 11:15 | ||
|
но там есть регистр длительности строки 3D5h[0], и регистр общего кол-ва строк в растре 3D5h[12h].если поймать момент обратного хода по кадрам 3D5h[15h], то начиная от него, путём не сложных вычислений по таймеру, можно узнать и текущий номер строки.эта часть регистров относится к регистрам контроллёра трубки CRT, а не самого VGA-адаптера. регистры: 03D4h (адрес) и 03D5h (данные). из доков можешь почитать: М.В.Жутаев "Видеоадаптеры и видеомониторы EGA, VGA и SuperVGA", ну и кое-что есть у Несвижского.
2
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||
| 06.09.2018, 14:14 [ТС] | ||
|
Но в любом случае, как же его поймать? Мне бы вычислить, не идёт ли сейчас луч вне кадра, но не просто через 0-й бит 3DAh, т.к. это может быть боковой ретрейс. Про доки спасибо! ![]() Добавлено через 13 минут Ещё интересует определение кол-ва строк "за кадром" _после_ вертикального ретрейса... Т.е. когда бит 3 регистра 3DAh погас и до начала отображения (пока бит 0 ещё горит).
1
|
||
|
Эксперт Hardware
|
||||
| 06.09.2018, 15:21 | ||||
|
это 10-битный регистр, 2-старших бита находятся в регистре переполнения 3D5h[07]а вообще кол-во строк зависит от в-моды - ты в каком тестируешь, тект или графика и т.д.? тогда общее время на кадр будет 10.000. если поставить таймер на 10 и вести отсчёт сразу после обратного хода луча по кадрам (начало кадра), то каждое срабатывание таймера будет представлять из себя номер строки. Добавлено через 4 минуты
1
|
||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||
| 06.09.2018, 18:21 [ТС] | ||||
|
В VGA-режимах 350, 400 или 480 строк + информационные http://www.epanorama.net/documents/pc/vga_timing Не то чтобы это было нерешаемо, но несколько геморный этот подгон точности и не до конца надёжен.
1
|
||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
| 06.09.2018, 23:14 [ТС] | ||||||
|
Не могу понять, что я делаю не так???
Запускаю в DOSBox - всё чётко работает. Запускаю на ноуте или на десктопе из FreeDOS, появляются глюки: внизу розовая полоса приличной ширины, а сверху красная полоса наполовину съедена (т.е. рисование начинается всё чуть выше видимой части экрана). Про полосы см. ниже. При этом регистры показывают 400 видимых строк и 449 общее кол-во и там, и там. Только тайминги разные. Итак, вкратце что тут происходит. 1. Перехватывается IRQ 0 (int 8), замеряется кол-во тиков таймера 1.19 МГц за кадр. Делится на 449, получаем значение счётчика для одной строки. Из них 400 видимых, 49 невидимых. Устанавливается счётчик таймера №0 в это значение. 2. Обработчик прерывания проверяет бит 3 (vertical retrace). Если он установлен, просто тупо ждём, когда погаснет бит 0 (horizontal retrace)*. Из рисунка в первом сообщении видно, что он выставляется вместе с 3-м и гаснет при появлении видимой части экрана. В этом случае счётчик линий сбрасывается в 0, в противном случае увеличивается на 1. Далее вызывается макрос эффекта 3. Макрос эффекта выводит сверху вниз полосы красного, жёлтого, зелёного, голубого цвета по 16 строк, внизу (в строке 399, если считать с 0, и ниже) то же самое, но в обратном порядке. Между ними синее. Вне экрана розовое. Вот, собственно, и вся хитрость. Всё должно работать!!! * этот момент мне не очень нравится (собственно, из-за него и был первоначальный вопрос), но пусть пока будет так...
1
|
||||||
|
Модератор
|
||
| 07.09.2018, 08:04 | ||
|
Инженеры IBM до такого не додумались? Полезно, и не так уж часто срабатывало бы. 60Гц.
0
|
||
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|
| 07.09.2018, 10:47 | |
|
1
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 07.09.2018, 10:59 | |
|
0
|
|
|
Модератор
|
|||
| 07.09.2018, 12:37 | |||
|
Прерывания от винтажных видеокарт
Добавлено через 9 секунд https://www.vogons.org/viewtopic.php?t=58445 Добавлено через 57 минут Вот что нашёл в винтажном мануале. http://bitsavers.trailing-edge... _May92.pdf
1
|
|||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 07.09.2018, 13:03 [ТС] | |||
|
Добавлено через 1 минуту А вот это попробую... ![]() Добавлено через 1 минуту Но я почти уверен, что если это и будет работать, то в DOSBox каком-нибудь, не более... Добавлено через 15 минут Нет, не работает (в DOSBox для machine=vgaonly). Записывал 0, проверял оба прерывания, макси PIC/PIC2 сбрасывал.
2
|
|||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 07.09.2018, 17:06 [ТС] | |
|
Короче, я понял в чём косяк. Оказывается, на этих мониторах 49 закадровых строк пробегают очень быстро, буквально за 5-6 видимых строк (по времени). Жесть какая-то! Как с этим бороться? Придётся, замерять это закадровое время отдельно, видимо... В регистрах же нет такой инфы (какая часть времени тратится на закадровые строки), я думаю, верно?
1
|
|
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
|||||
| 07.09.2018, 19:19 | |||||
|
Не давно было, навернулся LCD-монитор(кондеры БП вздулись), пришлось ЭЛТ-монитор доставать из закромов(очень срочно нужно), на время покупки, в миллениум, был один из крутых 17", пол стола занимал. Настройка X:Y, заняла минут 15-ть., то не так, это не туда. А LCD-монитор, все делал на автомате. Ему(ЭЛТ-монитор) уже почти 20-ть лет, а работает, а LCD-монитор и двух лет не протянул. ![]() Во время ЭЛТ-мониторов, промежутки времени обратного хода луча использовались, для регенерации памяти ОЗУ. И это происходило без без участия юзера. Не нужно юзверю мешать нормальной работе железа. 18.2 раза в секунду - и то позволяют руко-жопым кодерам(РЖК) вешать железо, у тут 60-т раз в секунду. Угадайте куда РЖК полезет в первую очередь. Наверное и у них в то время было пару РЖК, у которых была "бумажка"-диплом, вот я закончил-т.е. знаю, я умею, И скорее всего, именно для них придумали змейку, тетрис, героев, цивилизацию, повышай свой IQ, только не лезь к нам.
1
|
|||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||||||||||
| 08.09.2018, 20:16 | ||||||||||
|
РIC.COM - работает по-человечески только на EGA. По <Ctrl>+<N> в центре экрана появляется на 5 секунд портрет девушки. Работает только в текстовом режиме. В графическом режиме не глюкует. Резидент. и посмотреть как было сделано там. Я ее выдел. Действительно выводила изображение высотой несколько строк поверх текста и в текстовом режиме и потом убирала. И изображение как-то к строкам привязывалось. Добавлено через 2 минуты Добавлено через 1 минуту Добавлено через 1 минуту Добавлено через 15 минут Добавлено через 18 минут Добавлено через 1 час 7 минут Добавлено через 54 минуты Добавлено через 7 минут А 449 строк всего, как я понимаю, получилось от деления частоты строчной развертки 31.46875 кГц на частоту кадровой 70 Гц. Только чего-то делится с ошибкой в пол-строки.
3
|
||||||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||
| 08.09.2018, 22:01 [ТС] | |||||||
|
К тому же, есть ещё IRQ 8 (int 70h), real time clock, который генерируется (когда включен) с частотой 1024 Гц, хотя его можно ещё и настраивать вплоть до 8192 Гц. Хотя тут понятно, что ничего программировать не надо, если всё настроено. Но можно было бы оставить возможность, просто отключить по умолчанию. Соответственно, для 60 Гц более точное значение – 59.94. Добавлено через 10 минут 14'318'184 Гц - частота кварцевого генератора 14'318'184 Гц / 4 = 3'579'545 Гц (NTSC color subcarrier frequency) 14'318'184 Гц / 3 = 4'772'728 Гц (частота проца PC/XT) 14'318'184 Гц / 12 = 1'193'182 Гц (частота таймера 8253/8254, хотя я чаще встречал число 1'193'181 Гц) 1'193'182 / 65536 = 18.2 (это, я думаю, все знают) Ну а если там есть игра с номером строки, то прога может через биты 3 и 0 регистра 3DAh найти начало кадра и отсчитать нужную строку (а вот с нужной позицией по горизонтали уже куда сложнее, специальных битов для этого нет). Добавлено через 1 минуту ![]() Добавлено через 3 минуты
2
|
|||||||
|
Эксперт Hardware
|
||
| 08.09.2018, 23:24 | ||
|
Добавлено через 4 минуты Ethereal, Женя пипец ищет не легаси решения... ему подавай что-нить поизнасиловать оттяни эту карту --- чтоб все знали..
2
|
||
| 08.09.2018, 23:24 | |
|
Помогаю со студенческими работами здесь
20
Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки
Какова степень поляризации отраженного луча, если угол падения светового луча на границу раздела двух диэлектриков равен углу Брюстера?
Номер текущей записи в ADODB.Recordset Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|