garnizon пишет:Тут всё же программы надо называть не "исправленные", а "заточенные под конкретную задачу".
Поскольку на реальной девятке с колокольчиком либо с 32втц всё работает отлично - никакого даже мерцания нет. Это я с школы знаю еще. Про другие реализации совмещения не знаю, но эта работала прекрасно.
А то боюсь новая байка может родится :)
Тут все-таки важно с водой ребенка не выплеснуть :)
1) Изначально была взята оригинальная программа и реальный Агат, все это подключили к GBS и возникла проблема - срывы синхронизации.
2) В программе убрали переключение режимов и проблема исчезла.
Если бы все работало отлично, то никакие патчи ничего бы не изменили. Значит, как минимум, проблема существует.
Я сам время от времени наблюдаю такие "уплывания" картинки на своей плате и на платах, которые попадают на ремонт. Значит, это не проблема одного конкретного Агата.
Ну и если посмотреть схему, то можно даже найти конкретное место, которое может вызывать сбои в работе ДК.
Для начала надо вспомнить, как работает ПЗУ. Это матрица ячеек. Когда на ПЗУ подается адрес, с помощью дешифратора выбирается строка матрицы, а с помощью мультиплексора - столбец. В тот момент, когда входной адрес меняется, предыдущие строка и адрес выключаются, а новые включаются.
Проблема в том, что дешифратор - это, по сути, набор элементов И, на вход каждого из которых приходят прямые и инвертированные значения линий адреса. Поскольку задержки у всех этих элементов разные, то в момент смены адреса у дешифратора может быть активно несколько выходов. И в результате на выходе ПЗУ кратковременно появляются данные сразу из нескольких ячеек.
Если в двух словах, то ПЗУ - это генератор "иголок". И чтобы схема с использованием ПЗУ надежно работала, нужно соблюдать определенный порядок:
1) подать адреса на вход ПЗУ
2) выждать время, пока переключаются дешифраторы и мультиплексоры (оно указано в даташите на ПЗУ)
3) если данные с выхода ПЗУ должны поступать на его вход, то нужно их сначала записать в регистр, чтобы разнести во времени момент появления надежных данных на выходе ПЗУ и момент подачи их обратно на его вход
Так, теперь к дисплейному контроллеру :)
Он в девятке весь собран на автоматах, использующих ПЗУ.
Но это полбеды. Беда в том, что ДК имеет свой тактовый генератор, а ЦП - свой (режим Apple не рассматриваем!).
Теперь смотрим схему. На входы 1, 2, 3 ПЗУ D84 и входы 1, 2, 3, 4 ПЗУ D85 приходят сигналы с регистра управления ДК (РУПДК), а на входы 23 - сигнал ПА. А на входы 5-8 приходят сигналы с регистра D87.
Сигналы с регистра D87 в режиме Агат привязаны к тактовому генератору 10.5 МГц. А сигналы с РУПДК привязаны к тактовой частоте ЦП (14.3/14 МГц). В результате:
1) момент изменения режима ДК никак не синхронизирован по времени с работой автомата
2) этот момент все время плавает. Между моментом, когда процессор запишет данные и моментом, когда регистр D87 защелкнет данные с выхода ПЗУ может пройти меньше времени, чем требуется ПЗУ. И в этом случае в регистр попадет мусор. Потом этот мусор попадает на вход генераторов синхронизации D61 и D62 и вот мы получаем сбой синхронизации.
Важно сказать, что не всякие изменения будут вообще давать сбои синхронизации. Я экспериментровал с гигаскрином, переключал там режим на каждой строке и проблем со сбоями не видел.
То есть, нужно дополнительно разбираться в схеме ДК, чтобы понять, какие конкретно переключения вызывают проблемы.
Кстати, тому, что "всё работает отлично" может быть объяснение. Не исключено, что разработчики в каких-то поздних версиях девятки эту проблему пытались "лечить". Странно только, что от этих версий не осталось ни схем, ни прошивок.