Тайминги Пентагон-128

Нового тут немного, но, возможно, будет полезно свести данные в одном месте.


Основные:

Частота процессора: 3.5 МГц (при кварце на 14 МГц) или 3.575 МГц (при кварце на 14.3 МГц; ближайшие номиналы — 14286 и 14318)
Частота строк: 15.625 кГц или 15.96 кГц (см выше)
Частота кадров: 48.828 Гц / 49.87 Гц (см выше). Для эмулятора — можно спокойно округлять до 50Гц.

Число строк развертки: 320
Тактов процессора на строку: 224
Пикселей на такт: 2
Длина кадра в тактах процессора: 320*224=71680
Длина импульса прерывания — подстраивается, но лучше, чтобы была в районе 36 тактов.

Экранные строки по порядку сверху вниз:

16 строк кадрового синхроимпульса (невидимых)
16 невидимых строк верхнего бордюра (хотя дема Across the Edge считает их видимыми, они не отображаются на большинстве мониторов, TV, и эмуляторов. Фактически, я знаю только один эмулятор, отображающий их — Z80Stealth, плюс их выводит ZX DevStudio, помечая их яркостью как невидимые. upd. Форк UnrealSpeccy от tsl также выводит невидимые строки верхнего бордюра.)
48 видимых строк верхнего бордюра (как минимум, на большинстве эмуляторов)
192 строки растрового экрана (с знакоместами)
48 строк нижнего бордюра

Экранная строка верхнего/нижнего бордюра:
32 такта гашения со строчным синхроимпульсом
192 такта вывода бордюра (192*2=384 пикселя)

Экранная строка с знакоместами:
32 такта гашения со строчным синхроимпульсом
36 тактов левого бордюра (72 пикселя)
128 тактов растровой картинки (INK/PAPER) (256 пикселей)
28 тактов правого бордюра (56 пикселей)

Количество строк верхнего и нижнего бордюра, а также ширина левого и правого бордюра, реально отображаемого на экране, зависит от ТВ/монитора. В большинстве эмуляторов отображается 48 строк бордюра сверху и снизу, и по 48 пикселей бордюра слева/справа.

Важные начальные такты:

0й такт. Захват прерывания происходит на последнем такте команды предыдущего кадра. Но, чтобы он был захвачен, импульс прерывания должен начаться ещё раньше, на предпоследнем такте команды. Т.е. самым первым тактом кадра, при программном выравнивании на начало кадра, фактически является предпоследний такт предыдущей команды. Поэтому, если такты нового кадра в эмуляторе нумеруются с начала цикла подтверждения прерывания, начиная с нулевого (а это практически стандарт), дальнейшие значения нужно уменьшать на 2.

(16+64)*224 = 17920й такт — начало первой строки экрана с растровой картинкой
17920+32 = 17952й такт — начало вывода левого бордюра первой растровой строки
17920+32+36 = 17988й такт — начало вывода растровой картинки первой растровой строки
17920+32+36+128 = 18116й такт — начало вывода правого бордюра первой растровой строки

Ещё раз по тактам кадра, выровненного программно:

0й такт — начало импульса INT
1й такт — захват импульса INT процессором
2-й такт — начало цикла подтверждения прерывания. для IM 2 он длится 19 тактов
21-й такт — начало первой команды обработки прерывания IM 2

17988-й такт — начало вывода растра (INK/PAPER)

Внимание — эмуляторы в большинстве (Spectaculator, SpecEmu, Unreal, ZXMAK2, скорее всего и другие) нумеруют такты, считая, что 0й такт — такт начала цикла подтверждения прерывания. Т.е. в эмуляторах номера тактов в выровненном программно кадре такие:

предпоследний такт предыдущего кадра — начало импульса INT
последний такт предыдущего кадра — захват импульса INT процессором
0-й такт — начало цикла подтверждения прерывания. для IM 2 он длится 19 тактов
19-й такт — начало первой команды обработки прерывания IM 2

17986-й такт — начало вывода растра (INK/PAPER)

71679 такт — последний такт кадра

Пока на 5 машинах (Lion17, goodboy, JV-Soft, IL_DECAMERON, Portos13) тесты показали единообразие таймингов. Единственное отличие пока что — в таймингах переключения экранов, которые отличаются на такт на двух машинах с совпадающими во всём остальном таймингами.
Хотя, возможно, существуют Пентагоны с другой растактовкой, со смещением начала сигнала INT относительно начала кадра (и, соответственно, смещением такта начала растра относительно такта начала цикла подтверждения прерывания), можно предположить, что вышеописанная схема — самая распространенная, и её можно принять за стандарт.

(upd. Протестирована машина с началом INTa на один такт позже от предыдущих машин — соответственно, количество тактов от начала подтверждения прерывания до вывода растра на 1 такт меньше, и результаты в тестах на 1 такт раньше. Причем, на этой машине переключение экранов происходит после 2го такта машцикла вывода в порт (а изменение цвета бордюра — по-прежнему после 1-го).
upd2: Протестирован ещё один комп с такими же результатами (начало INT на такт позже).)

Видеоконтроллер Пентагона.

Видеоконтроллер Пентагона читает байты пикселей/атрибутов попеременно на каждом такте процессора, за один такт один байт. Когда процессор обращается к ОЗУ, видеоконтроллер приостанавливает чтение видеопамяти на этот такт (второй такт машинного цикла обращения к ОЗУ), при этом также приостанавливая изменение триггера выборки пикселей/атрибутов. Этот триггер, к тому же, не сбрасывается на границе кадра. Поэтому, в зависимости от количества обращений процессора к ОЗУ, в любом такте с одним и тем же номером в разных кадрах может происходить как выборка пикселей, так и атрибутов.

По завершению вывода 8 пикселей растра видеоконтроллер на следующем такте начинает выводить следующие 8 пикселей по значениям пикселей/атрибутов, заблаговременно считанным им ранее.

Бордюр

Вывод нового цвета бордюра в Пентагоне не выровнен на границу пикселей растрового поля. Поэтому пиксели бордюра слегка смещены по сравнению с пикселями растра. В частности, в конце демо Rage после остановки вращения сегментов на реальном Пентагоне видно, что вертикальная полоска на бордюре слегка смещена влево, по сравнению с полоской на растровом поле.


По данным Lion17, вывод нового цвета бордюра видеоконтроллером начинается спустя некоторое время после начала 2-го такта машинного цикла вывода в порт. Однако, для эмуляторов достаточно принять, что цвет бордюра меняется сразу после 1го, начиная со 2-го такта цикла вывода в порт.

В Пентагоне цвет бордюра обновляется каждый такт, соответственно точность отображения бордюра — 2 пикселя (в отличие от фирменных машин, в которых цвет бордюра обновляется каждые 4 такта, и точность отображения бордюра — 8 пикселей).

Переключение экранных страниц

Моя модификация теста btime от Jan Bobrowski, тест ptime-p показал, что есть два варианта таймингов переключения экранных страниц для видеоконтроллера.
На некоторых машинах переключение идет после 1-го, начиная со 2-го такта машинного цикла вывода в порт, а на некоторых — после 2-го, начиная с 3-го такта цикла.

Видео поведения теста, снятое Portos13

и IL_DECAMERON:


На сегодняшний день наиболее точно отражает поведение реального Пентагона в плане эмуляции видеоконтроллера эмулятор ZX DevStudio. На нём правильно работают тесты stime и тест ptime-p. Все остальные эмуляторы (включая, я так понимаю, и аппаратные), выдают в этих тестах результаты, отличные от поведения реального Пентагона. Однако, в этом эмуляторе неправильно эмулируется команда PUSH: изменена последовательность записи в память — сначала пишется младший байт, потом старший, что подтверждено тестом ltime.

Скачать набор тестов в TRD-образе можно здесь: zx-pk.ru/attachment.php?attachmentid=63018&d=1511457692
Ознакомиться со всеми результатами тестов — здесь: zx-pk.ru/threads/28382-artefakty-demok-v-emulyatorakh-i-na-realnom-pentagone.html?p=936256&viewfull=1#post936256

Выражаю благодарность всем, протестировавшим свои Пентагоны, и поделившихся результатами:
Lion17, goodboy, Portos13, IL_DECAMERON, и особо — JV-Soft-у, протестировавшему 3 своих Пентагона.

17 комментариев

avatar
Спасибо, полезная справочная информация
  • VBI
  • +1
avatar
Годная инфа! Спасибо!
avatar
Кто-нить из благодарствующих «полезную информацию» проверял? Я, например, вижу феерическую лажу в нескольких местах.
  • tsl
  • 0
avatar
Было бы конструктивнее озвучить, в каких пунктах лажа. Я сейчас не в порядке поспорить, а в том смысле, что сейчас инфу такого типа приходится собирать по 100500 форумам. Очень полезно иметь её в одном месте. Ещё полезнее, наверное, было бы её исправить.
avatar
Что, реально феерическую? Ну так поделись, где, по-твоему, лажа, не томи.
avatar
Окей, феерического нету.
Есть замечание:
Экранные строки по порядку сверху вниз:
16 строк кадрового синхроимпульса (невидимых)
64 строки верхнего бордюра.
16 строк бланка (и в которых, полагаю, 4 строки синхроимпульса, иначе блок разверток порвет нафиг),
16 строк верхнего бордюра, которые нельзя использовать по 2 причинам: а) будут глюки изза «непогашенного» бланка, б) не влезет на нормальных теликах, как это было в Across the Edge,
48 строк верхнего бордюра.

И да: вся вышеописанная инфа не была смоделирована из схемы (или я ошибаюсь?), значит мое замечание про непроверенность в силе.
Из вредности сделаю хдл-бенч по схеме Mick'a и нарисую времянки только сорцы никому не покажу.
avatar
Инфа по строкам взята из этого сообщения Lion17, а он пишет, что получил её, анализируя схему. В остальном инфа взята из открытых источников и анализа поведения тестов на реалах и эмуляторах.

Насчёт Across the Edge — да, я тоже заметил, что в одной из частей явно расчет на верхний бордюр с большим количеством строк, чем показывает даже большинство эмуляторов. Похоже, только z80stealth выводит 64 строки верхнего бордюра. Эмулятор самого Lion17, ZXDevStudio, первые 16 строк верхнего бордюра помечает как невидимые.
avatar
Насчёт Across the Edge — да, я тоже заметил, что в одной из частей явно расчет на верхний бордюр с большим количеством строк, чем показывает даже большинство эмуляторов
Мой форк анрыла тоже показывает.
avatar
В последних версиях Unreal можно регулировать точно сколько строк показать. Вне всякого отношения к их реальной видимости или невидимости. Это иногда очень помогает при отладке программ.
avatar
годно и полезно, несмотря на едкие замечания.
такую бы подборку пару лет назад, а то пришлось самому высчитывать и вникать)
avatar
Протестирована машина с началом INTa на один такт позже от предыдущих машин — соответственно, количество тактов от начала подтверждения прерывания до вывода растра на 1 такт меньше, и результаты в тестах на 1 такт раньше. Причем, на этой машине переключение экранов происходит после 2го такта машцикла вывода в порт (а изменение цвета бордюра — по-прежнему после 1-го).
  • Weiv
  • +1
avatar
Поэтому, в зависимости от количества обращений процессора к ОЗУ, в любом такте с одним и тем же номером в разных кадрах может происходить как выборка пикселей, так и атрибутов.

По завершению вывода 8 пикселей растра видеоконтроллер на следующем такте начинает выводить следующие 8 пикселей по значениям пикселей/атрибутов, заблаговременно считанным им ранее.
Значит щёлкать видеоэкраны перед лучом в одних и тех же тактах плохая идея? Даже с настройкой номеров этих тактов для разных машин?
avatar
Ну как. У нас есть 4 такта, в течении которых видеоконтроллер выводит текущий байт. Если мы переключим экран на такте перед началом этого 4хтактного цикла вывода нового байта, или на первом-втором такте этого вывода, он успеет подчитать данные из нового экрана за оставшиеся 4-3-2 такта. Т.е. экран нельзя переключать только на 3м такте вывода, на котором будет смешана инфа из двух экранов, причем смешана неоднозначно — то ли пиксели из 1-го, атрибут из 2-го, то ли наоборот. Так что по идее первый такт машцикла OUT переключения экранов надо завязывать на последний такт вывода предыдущего байта, это даст нам запас в 2 такта (от более позднего начала INT и/или более позднего машцикла переключения экрана). Или на первый такт вывода нового байта — тогда у нас будет запас в один такт в обе стороны. Если бы точно знать, что более раннего INT-а от эталонного быть не может, предпочтительнее 1й вариант.
avatar
я правильно понимаю, что если сделать один экран все 00, второй все ФФ, а атрибуты сделать i/p=7/0 и 0/7, то если рандомно переключать экраны, то будет видна лажа в виде белых точек?
avatar
Да, в моменты, когда переключение экрана будет выпадать на 3й такт вывода байта, следующий байт будет выводиться белым.
avatar
Т.е. иногда будет лажа — в виде белых полосок, а не точек.
avatar
Так что щелкать, по идее, можно, но желательно перед этим как-то вручную подстроиться на такт начала вывода растра. Т.е. попросить пользователя совместить полоску на экране и бордюре, там, или что-то типа того.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.