Тайминги Пентагон-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 своих Пентагона.
Основные:
Частота процессора: 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 комментариев
Есть замечание:
16 строк бланка (и в которых, полагаю, 4 строки синхроимпульса, иначе блок разверток порвет нафиг),
16 строк верхнего бордюра, которые нельзя использовать по 2 причинам: а) будут глюки изза «непогашенного» бланка, б) не влезет на нормальных теликах, как это было в Across the Edge,
48 строк верхнего бордюра.
И да: вся вышеописанная инфа не была смоделирована из схемы (или я ошибаюсь?), значит мое замечание про непроверенность в силе.
Из вредности сделаю хдл-бенч по схеме Mick'a и нарисую времянки
только сорцы никому не покажу.Насчёт Across the Edge — да, я тоже заметил, что в одной из частей явно расчет на верхний бордюр с большим количеством строк, чем показывает даже большинство эмуляторов. Похоже, только z80stealth выводит 64 строки верхнего бордюра. Эмулятор самого Lion17, ZXDevStudio, первые 16 строк верхнего бордюра помечает как невидимые.
такую бы подборку пару лет назад, а то пришлось самому высчитывать и вникать)