Как найти положение электронной пушки / линии сканирования?
Как я могу найти положение электронной пушки (то есть активно изменяющего пиксель / линию сканирования) на ZX Spectrum?
Разные модели Spectrum имеют немного разные временные характеристики.
Если это невозможно, есть ли способ ожидания какого-либо события вертикальной синхронизации? (то есть в верхней части нижней части экрана.)
3 ответа
По адресу 23672 имеется 3-байтовый счетчик кадров.
23672 FRAMES
3 byte (least significant first), frame counter. Incremented every 20ms.
Я делаю предположение, что это увеличивается прерыванием 50 Гц. Поэтому я просто опрашиваю его в цикле, пока не изменится младший байт.
Это было давно, но я помню, что был счетчик обновлений памяти, который обновлялся для каждой строки сканирования. Если вы установите значение 0 на vblank, оно будет содержать текущую строку развертки.
Единственное надежное событие синхронизации, которое у вас есть, - это прерывание частотой 50 Гц, генерируемое в начале периода вертикальной пустоты обновления экрана.
По сути, у вас есть два варианта. Подавляющее большинство людей будет просто ждать от прерывания до начала экрана. Необходимое количество ожидания разное для разных моделей и клонов. Большинство программ, использующих такие точные временные параметры, поддерживают только одну или две модели. Самые продвинутые программы будут пытаться идентифицировать неполный клон / модель и соответствующим образом корректировать время, но никто никогда не создавал действительно портативную программу, основанную на таком подходе, из-за сложности задачи и отсутствия достаточно подробной документации. на многих моделях.
Второй вариант - использовать порт #FF. Это не реальный порт, но чтение из него возвращает значение байта, который ULA в настоящее время выбирает с экрана (или 255). Следовательно, можно выполнить синхронизацию по прерыванию и затем опросить порт #FF, пока он не вернет значение, отличное от 255 (при условии, что ваш экран содержит что-то другое). Однако имейте в виду, что несколько распространенных моделей Spectrum, например, +2A и +3, не имеют такого поведения, поэтому еще раз, это не вариант, если вы заинтересованы в хорошем освещении поддерживаемых моделей.