Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12

Номер текущей строки CRT-луча

06.09.2018, 10:15. Показов 2409. Ответов 27
Метки нет (Все метки)

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

Если такой возможности всё-таки нет, то как можно хотя бы понять, что начался новый фрейм? Причём даже при относительно низкой частоте таймера (к примеру, 1 срабатываение на 5 строк). Если проверять бит вертикального ретрейса, то при низкой частоте таймера можно проскочить этот момент (ретрейс длится довольно малое кол-во времени, буквально пару строк... и кстати говоря, окончание ретрейса не говорит о том, что луч находится в видимой области экрана). Бит горизонтального ретрейса включается на всё время отсутствия луча в области экрана.
Выглядит примерно так (последовательные чтения из порта):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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-бит на повторы, то может оказаться так, что нам просто "везёт" нарываться на несколько горизонтальных ретрейсов подряд между видимыми линиями, а не между кадрами.
Что можно придумать для такого случая?

Добавлено через 6 минут
Может, есть какой-то отдельный бит какого-то другого порта, с помощью которого можно узнать, что луч находится за кадром (ниже или выше)?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2018, 10:15
Ответы с готовыми решениями:

Как узнать номер текущей строки?
Есть форма в виде таблицы. Надо узнать номер текущей строки. Как это сделать? Есть какая то функция?

Обработка щелчка мышки в DataGridView и номер текущей строки
Мне интересно можно как-нибудь сделать, чтобы при щелчке мышки на строчке (или двойном щелчке) в datagridview, открывалась новая форма и...

Определить номер текущей строки таблицы по обработке клика кнопки
Здравствуйте ! В некоторых строках таблицы есть кнопки. Можно ли в процедуре обработки клика определить номер строки на которой эта...

27
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
09.09.2018, 08:24  [ТС]
Студворк — интернет-сервис помощи студентам
R71MT, я хочу отслеживать строки резидентно, чтобы параллельно делать что-то ещё. Но поскольку таймер часов точно подогнать под пиксельный таймер нельзя (либо получается дёргание, либо постепенно едет вообще), особенно учитывая, что "закадровые строки" в LCD/LED пролетают гораздо быстрее, я пока придумал (но ещё не реализовал) только способ "через копчик" (не анус, но близко).

Если у кого-нибудь есть идея, как сделать это просто и радостно, я с удовольствием выслушаю
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
10.09.2018, 09:32
А для чего этого всё , если не секрет?
Зачем отслеживать строки на LCD/LED?
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
10.09.2018, 11:22  [ТС]
Есть такой графический спецэффект – рисование горизонтальных линий через отслеживание луча и изменение палитры.
Если мы знаем, что луч находится на линии N и поменяем палитру чёрного цвета на зелёный, а на линии N+1 вернём обратно на чёрный, то увидим горизонтальную полосу зелёного цвета в этой строке.

Добавлено через 25 секунд
Это на CRT работало, на LCD/LED тоже работает.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.09.2018, 15:30
Я думал, Вы хотите использовать ЦАПы VGA для генерации каких-то мегагерцевых сигналов.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
12.09.2018, 00:16  [ТС]
Цитата Сообщение от Constantin Cat Посмотреть сообщение
руко-жопым кодерам(РЖК)
На днях видел такую картинку, решил запостить
Миниатюры
Номер текущей строки CRT-луча  
2
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
12.09.2018, 20:34
Цитата Сообщение от Jin X Посмотреть сообщение
есть ещё IRQ 8 (int 70h), real time clock, который генерируется (когда включен) с частотой 1024 Гц, хотя его можно ещё и настраивать вплоть до 8192 Гц.
Еще APIC Timer, HPET, ACPI Timer
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
13.09.2018, 01:30
shmkv, я молчу.... потомучто ТС сказал, что не трогай программу,
а ттвои варианты опять трогают реги

Добавлено через 51 минуту
можно было потрахаться с таймером, как я понял прабла в нём, что irq0 не может отключить, т.к. сам его использует. да и выкини его на второй план.. а сам сядь на нуль
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2018, 19:39

Пул потоками вывести номер столбца массива, в котором есть минимальный элемент текущей строки
Мне нужно пул потоками вивести номер столпца массива в котором есть минимальный елемент текущей строки. Програма сделана по шаблону даному...

Как получить номер(или какой нить индифиактор) текущей строки в открытом файле и перейти затем на эту строчку?
открываю файл так: ifstream input(&quot;morf.txt&quot;); перехожу на следующие строчки так: input.getline(buffer, 1024);

Какова степень поляризации отраженного луча, если угол падения светового луча на границу раздела двух диэлектриков равен углу Брюстера?
Подскажите как решить задачку

Определить номер строки, содержащей положительные числа, и вывести номер строки
В двумерном массиве определить номер строки, содержащих положительные числа и вывести номер строки. Массив вводить рандомом

Номер текущей записи в ADODB.Recordset
Подскажите каким образом можно получить номер текущей записи в ADODB.Recordset. ADODB.Recordset.AbsolutePosition возвращает только знения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru