ПЭВМ Агат » Мастерская » Сигналы системной шины Агата

Сигналы системной шины Агата

Вы не задумывались, как работает системная шина Агата? Та, которая выведена на слоты? На первый взгляд тут всё просто: есть сигналы адреса, данных и r/!w. Ещё есть сигнал фазы Ф1. Для удобства ещё и сигналы выбора регистров и выбора драйвера - они появляются при обращении ЦП к регионам C0n0-C0nF и Cm00-CmFF соответственно (n равен номеру слота + 8, m - номер слота). И ещё несколько разных сигналов.

Очевидно, что устройство сложнее простой мигалки светодиодом будет иметь несколько разных исполнительных органов, некоторые из которых доступны для чтения, другие - для записи, третьи реагируют только на сам факт обращения к регистру. Для их выбора на устройстве предусматриваются несложные схемы на мелкой логике, которые пропускают сигналы шины к исполнительным устройствам с учётом заданного ЦП адреса.

Вроде всё просто. Но взгляните, например, на схему семёрочного ППИ и контроллера дисковода 840кб. В качестве исполнительных устройств и тут и там стоит кр580вв55. Но почему в схеме ППИ, в узле, синтезирующем сигнал !ЗП для вв55, используется счётчик ир16 ? А в контроллере дисковода 840кб его нет. Если изучите внимательно разные шинные интерфейсы других устройств, обнаружите много любопытного, например, ничего не делающие (на первый взгляд) элементы. Скажем, два подряд включенных инвертора.

Как же всё таки правильно подключить своё устройство к шине Агата ? Обратимся к первоисточнику: "MCS6500 microcomputer family hardware manual" (jan 1976, second edition) (C) MOS Tech, Inc.

Согласно этой книжке, 6502 имеет один вход Ф0 (пин 37) и два парафазных выхода: Ф1 (пин 3) и Ф2 (пин 39). Первоисточник никоим образом не оговаривает внутреннюю конструкцию, связывающую эти три пина. Указано лишь, что Ф1 и Ф2 будут отставать примерно на 20 нс от Ф0, причем Ф1 инвертирует Ф0 (с задержкой), а Ф2 - повторяет Ф0 (с той же задержкой).

Синий - 37 (Ф0), Красный - 39 (Ф2).

Синий - 37 (Ф0), Красный - 3 (Ф1).

Предполагалось, что на основе Ф0 и Ф1 инженер будет строить автогенератор, который в дальнейшем будет использоваться остальной системой для синхронизации ввода/вывода ЦП и периферийных устройств. Но разработчики Агата пошли совсем по другому пути.

Как известно, у Агата для синхронизации шины и устойств, подключенных к ней, используется генератор 14.3 МГц, частота которого делится на 7, получается примерно 2 МГц и на 14 - получается 1 МГц. Последний сигнал заводится на вход Ф0 ЦП. Но как ?

А вот по разному: тут Агат-7:

Как видно, у семёрки Ф1 и Ф2 от процессора не используется нигде и никак (Причем в мымринских схемах пин 3 проца со стороны слота вроде как подключен, а со стороны проца - вроде как не упоминается вообще. Фактического подключения нет. Так же как нет цепочки D1.4-D1.2-D1.3-D2.x). Итак:

  • ламень А12 - Ф0 (с точки зрения разработчиков проца - вообще не особо нужный периферии сигнал);
  • ламель А14 - незадержанный Ф1, на схемах Агата обозначен как Ф1;
  • ламель А15 - 2 МГц.

Теперь Агат9:

Схема чуть сложнее, но если допустить, что триггеры Шмидта имеют ту же задержку, что и инвертор D12, то, получается та же семёрка, только с буферизацией. Кроме того, здесь выход Ф1 (пин 3) используется в управлении базовым ОЗУ и управлении буферами ЦП.

Возвращаемся к первоисточнику. Диаграмма обмена на шине:

(Буква "т" после цифр - "типичное")

Итак, А14 - это как бы Ф1, только приходящий чуть раньше чем нужно. В общем-то, ошибка перебегания здесь вряд ли составит больше 10-20 нс, в то время как характерные времена - сотни нс, так что можно считать, что всё будет нормально. Рассмотрим, как должно вести себя периферийное устройство.

Как только устройство "увидело" свой адрес на шине при Ф1 = 1, оно должно, в зависимости от сигнала r/!w, выполнить следующее:

  • r/!w = 1 : у устройства есть примерно 500нс, после чего оно должно выставить данные на шину и ждать окончания очередного перехода Ф1 с 0 в 1 (затем подождать ещё 10 нс).
  • r/!w = 0 : устройство ждёт перехода Ф1 с 1 в 0 и через 200нс, но не позднее перехода Ф1 с 0 в 1 (+10 нс), может считать данные с шины.

Как это реализовать ? В этом все отличия разных модулей. Про хвост в 10 нс можно забыть - это типичные задержки в распространении сигналов в Агате. С чтением всё вроде просто: достаточно собрать в кучу (адрес & r/!w !Ф1) - получится сигнал чтения. Устройство при получении этого адреса должно выставить значение на шину данных и покорно ждать своей судьбы. С записью сложнее: после !Ф1 нужно подождать хотя бы 200нс. Вот тут и начинаются различия: в ППИ, например, отсчитываются три такта частоты 14 МГц от !Ф1, после чего вв55 захватывает данные с шины. В контроллере порта принтера девятки сделано ожидание условия !Ф1 & !А15 (ламель А15 - это 2 МГц), а в контроллер 840ки опирается на !regsel, шину адреса и сигнал r/!w.

А можно ли обойтись без А15 при записи? Да, если устройство захватывает данные только по фронту сигнала записи. В этом случае (адрес & !(r/!w) & Ф1) вполне должно прокатить. Но я не пробовал :)

Кстати, вспомним про сигналы выбора регистров (А11) и выбора драйвера (Б1, Б2). Обозначим их здесь как !regsel и !drvsel (во всех схемах они обозначаются по разному). Так как эти сигналы формируются? Оказывается, как в семёрке так и в девятке они формируются уже с учётом Ф1, т.е. выставляются только при !Ф1. Это позволяет для простых устройств (использующих только два окна адресного пространства), вообще не использовать сигнал Ф1.

Таким образом: чтение = !regsel & r/!w, запись = !regsel & !(r/!w) & А15. А15, как описано выше, может быть необязательна. Конечно, не забываем, что если вы добавляете свой декодер адреса, он тоже будет вызывать ту или иную задержку.

Важно 1: неидеальность сигналов. Они вроде как цифровые, но... Вот выполнение команды STA (девятка без допмодулей):

Что будет на выходе элемента И, на который будут заведены эти сигналы (!regsel & А15) ? В момент перехода А15 0->1 и !regsel 1->0 успевает проскочить короткий момент выполнения этого условия!

Важно 2: у 6502 нет никакого сигнала, указывающего на обмен данными. Т.е. считается, что каждый цикл, во время Ф1 = 0, какое-то устройство должно что нибудь прочитать или выставить с/на шину. Казус возникает в том случае, когда устройство учитывает количество чтений или записей. Дело в том, что 6502 очень запросто может выставить адрес вашего устройства не в тот момент, когда вы ожидаете. Или просто больше одного раза. Следите за руками: lda - один цикл на доступ к устройству (т.е. !regsel будет падать и подниматься один раз), sta - ДВА цикла (для индексной адресации), rol (команды типа read-modify-write) - ТРИ цикла.

Это, в частности, приводит к тому, что, в нарушение написанного в документации, порт звука (C03x) реагирует на команду записи различным образом, в зависимости от метода адресации. На самом деле, если на команды чтения реакция ожидаемая (движение мембраны из одного крайнего положения в другое), то с командами записи всё сложнее. На команду STA C030 будет обычная реакция, но на команду STA (40),Y (в ячейках 40-41 адрес C030, Y=0) будет выполнено два перемещения мембраны, следующие с очень коротким интервалом (реально, мембранна даже может "не успеть" занять первое крайнее положение). Таким образом звук получается гораздо тише, к тому же возникнут дополнительные обертона. Именно такая команда выполняется, если в сисмоне набрать команду C030:0.

Ещё больше забавных ситуаций возникает, например, при работе команд косвенной адресации, когда имеет место переход через страницы: тут можно получить обращение к вовсе незапланированному адресу, благо что в реальных прогах такое встречается редко и вряд ли зацепит ваше устройство.

Автор раздела: Garnizon

Зеркало сайта