Система последовательного ввода-вывода , повсеместно известная как SIO , была фирменной периферийной шиной и связанными с ней программными стеками протоколов, которые использовались на 8-битных компьютерах Atari для обеспечения большинства функций ввода-вывода для этих компьютеров. В отличие от большинства систем ввода-вывода той эпохи, таких как RS-232 , SIO включала в себя облегченный протокол, который позволял подключать несколько устройств к одному последовательно соединенному порту, который поддерживал десятки устройств. Он также поддерживал операции plug-and-play . Разработчик SIO, Джо Декуир , считает свою работу над системой основой USB .
SIO был разработан для того, чтобы обеспечить расширение без использования внутренних слотов для карт , как в Apple II , из-за проблем с FCC по поводу радиопомех . Это требовало от него достаточной гибкости с точки зрения поддержки устройств. Устройства, которые использовали интерфейс SIO, включали принтеры, дисководы, кассетные деки, модемы и блоки расширения. Некоторые устройства имели драйверы на основе ПЗУ, которые копировались на хост-компьютер при загрузке, что позволяло поддерживать новые устройства без встроенной поддержки в самом компьютере.
SIO требовала наличия логики в периферийных устройствах для поддержки протоколов, а в некоторых случаях требовалось значительное количество вычислительной мощности — например, дисковод Atari 810 включал MOS Technology 6507. Кроме того, большой специальный разъем был дорогим. Это увеличило стоимость системы SIO, и Декуир винит это в «утоплении системы». [1] [2] В течение истории 8-битных систем предпринимались безуспешные попытки снизить стоимость системы.
Название «SIO» по сути относится только к разделам операционной системы , которые обрабатывают обмен данными; в документации Atari сама шина — это просто «последовательная шина» или «интерфейсная шина», хотя иногда ее также называют SIO. [3] В общепринятом использовании SIO относится ко всей системе от операционной системы до шины и даже физических разъемов.
Система SIO в конечном итоге обязана своим существованием правилам FCC о допустимом количестве радиочастотных помех, которые могут просачиваться из любого устройства, которое напрямую генерирует аналоговые телевизионные сигналы. Эти правила требовали очень низкого количества утечек и должны были пройти обширный набор испытаний. Эти правила подвергались пересмотру в период, когда группа Atari Grass Valley проектировала машину Colleen, которая впоследствии стала Atari 800. [4]
Apple II , одна из немногих готовых машин, подключаемых к телевизору в ту эпоху, избежала этой проблемы, не включая радиочастотный модулятор в компьютер. Вместо этого Apple заключила сделку с местной электронной компанией M&R Enterprises на продажу подключаемых модуляторов под названием Sup'R'Mod . Это означало, что Apple технически не генерировал телевизионные сигналы и не должен был проходить тестирование FCC. Один из основных поставщиков Atari, Sears , посчитал, что это неподходящее решение для их готовых продаж, поэтому, чтобы соответствовать требованиям по помехам, они заключили всю систему в литой алюминиевый блок толщиной 2 мм. [4]
Colleen изначально планировалось как игровая консоль , преемница Atari 2600. Успех Apple II привел к тому, что система была перепозиционирована как домашний компьютер , а этот рынок требовал периферийных устройств. На таких машинах, как Apple II, периферийные устройства поддерживались путем помещения адаптерной карты в один из внутренних слотов для карт машины, протягивания кабеля через отверстие в корпусе и подключения устройства к этому кабелю. Достаточно большое отверстие для такого кабеля означало бы, что Colleen не пройдет тесты на радиочастоту, что представляет серьезную проблему. Кроме того, конвекционное охлаждение карт было бы очень сложным. [4]
Во время визита в начале 1978 года продавец Texas Instruments (TI) продемонстрировал систему, состоящую из оптоволоконного кабеля с трансиверами, вмонтированными в оба конца. Джо Декуир предположил, что они могли бы использовать это для отправки видеосигнала на внешний модулятор RF, который был бы так же прост в использовании, как и коаксиальный кабель, необходимый для передачи сигнала на телевизор в любом случае. Теперь компьютер мог иметь обычные слоты; как и Apple II, часть RF была бы полностью внешней и могла бы быть протестирована сама по себе, отдельно от компьютера. [4]
Когда Декуир объяснил свою концепцию, у продавца «чуть не вылезли глаза». [4] Команда Grass Valley не знала, что TI в то время разрабатывала TI-99/4 и столкнулась с той же проблемой с выходом RF. Когда Декуир позже объяснил идею своему боссу Уэйду Туме, Тума ответил: «Нет, FCC никогда не позволит нам обойтись без этого трюка». [4] Это оказалось правдой; TI использовала идею Декуира, и когда они представили ее в FCC в 1979 году, FCC сразу же ее отвергла. TI пришлось перепроектировать свою систему, и возникшая задержка привела к тому, что Atari первыми вышли на рынок. [4]
Поскольку этот путь к разрешению использования слотов для карт зашел в тупик, Decuir вернулся к проблеме обеспечения расширения посредством какой-либо внешней системы. [4]
К этому времени была проделана значительная работа по использованию чипа POKEY от Atari для запуска кассетной деки путем прямого вывода звуков, которые будут записаны на ленту. Было решено, что с соответствующими модификациями POKEY может обойти цифро-аналоговое оборудование преобразования и управлять выходом TTL напрямую. Для создания цифровой шины TTL система SIO использовала два из четырех звуковых каналов POKEY для создания устойчивых тонов, которые представляли тактовые сигналы заданной частоты. Для отправки и получения данных использовался однобайтовый буфер; каждый раз, когда переключался тактовый сигнал, один бит из буфера считывался или записывался. Когда все восемь бит были считаны или записаны, система генерировала прерывание, которое запускало операционную систему для чтения или записи большего количества данных. [5]
В отличие от интерфейса кассеты, где обычно используется только одно устройство, внешний порт расширения должен поддерживать более одного устройства. Для поддержки этого был разработан простой протокол и добавлено несколько новых контактов к исходному простому порту кассеты. Самым важным среди них был контакт COMMAND, который заставлял устройства прослушивать 5-байтовое сообщение, которое активировало одно из устройств на шине и запрашивало у него данные (или отправляло ему команды). [6] Они также добавили контакты PROCEED и INTERRUPT, которые могли использоваться устройствами для установки битов в регистрах управления на хосте, но они не использовались в развернутой системе. Аналогично, сигналы синхронизации, генерируемые POKEY, отправлялись на контакты CLOCKOUT и CLOCKIN, хотя асинхронный протокол их не использовал. [7]
Шина SIO была реализована с использованием специального 13-контактного D-разъема (хотя и не D-subminiature ) с разъемами-папа на устройствах и разъемами-мама на обоих концах кабелей. [8] Разъемы были физически прочными, чтобы допускать повторное использование, с очень прочными штырями в гнезде устройства и пружинными разъемами в кабелях, в отличие от фрикционной посадки, как в типичном D-разъеме. Большинство устройств имели входные и выходные порты, чтобы обеспечить последовательное подключение периферийных устройств, хотя Atari 410 Program Recorder приходилось размещать в конце цепи и, таким образом, не включал выходной порт.
SIO контролировался чипом POKEY от Atari , который включал в себя ряд таймеров общего назначения. Четыре из них позволяли точно контролировать частоту синхронизации и предназначались для вывода звука путем подключения их к цифро-аналоговому преобразователю (D-to-A) и последующего смешивания с телевизионным сигналом перед поступлением в радиочастотный модулятор. Они были перепрофилированы в качестве основы системы SIO, использовались в качестве часов в некоторых режимах или для непосредственного создания выходных сигналов в других.
Система включала один «регистр сдвига», который использовался для полуавтоматизации большинства передач данных. Он состоял из одного 8-битного значения, LSB first, [9] , которое использовалось для буферизации чтения и записи. Пользователь получает к ним доступ через два расположения памяти, известных как SEROUT для записи и SERIN для чтения. Это были «теневые регистры», расположения в ОЗУ , которые отражали регистры в различных микросхемах поддержки, таких как POKEY. Биты данных были обрамлены одним нулевым стартовым битом и одним стоповым битом, и четность не использовалась. [9]
Для записи данных в синхронном режиме основные каналы таймера POKEY были установлены на соответствующую тактовую частоту, скажем, 9600 бит/с. Затем любые данные, записанные в регистр SEROUT, отправлялись по одному биту за раз каждый раз, когда сигнал становился высоким. Он был рассчитан таким образом, чтобы сигнал возвращался низким в середине бита. Когда все 10 бит (включая старт и стоп) были отправлены, POKEY отправлял маскируемое прерывание в ЦП, чтобы указать, что он готов к следующему байту. При чтении, если другой байт данных был получен до того, как был прочитан SERIN, 3-й бит SKSTAT устанавливался в значение true, чтобы указать на переполнение. Отдельные считываемые биты также отправлялись в 4-й бит SKSTAT по мере их поступления, что позволяло напрямую считывать данные, не дожидаясь завершения кадрирования.
Система официально поддерживала скорость до 19 200 бит/с, но эта скорость была выбрана только потому, что анализатор протоколов инженера Atari достигал этой скорости. На самом деле система была способна на гораздо более высокую производительность. Ряд сторонних устройств, особенно дисководы , использовали специальное оборудование и драйверы для значительного увеличения скорости передачи данных до 72 000 бит/с.
Хотя в системе были контакты CLOCKOUT и CLOCKIN, которые теоретически могли использоваться для синхронной связи, на практике использовалась только асинхронная система. В этом случае базовая скорость была установлена, как указано выше, в POKEY, которая следовала за изменениями до 5% от этой базовой скорости. Это значительно упростило работу с реальными устройствами, где механические или электрические проблемы вызывали небольшие колебания скорости с течением времени. Одним из примеров была кассетная дека, где растяжение ленты могло изменить скорость, другим примером был модем, где удаленная система могла не быть точно синхронизирована с заданной скоростью.
Система SIO позволяла подключать устройства последовательно, и поэтому требовала некоторого способа идентификации того, что информация на различных контактах данных предназначалась для конкретного устройства в цепочке. Это было достигнуто с помощью контакта COMMAND. [9]
Вывод COMMAND обычно удерживался на высоком уровне, [8] и когда он был понижен, устройства на шине должны были прослушивать «командный кадр». Он состоял из 5-байтового пакета; первый байт был идентификатором устройства, второй был номером команды, специфичным для устройства, а затем два вспомогательных байта данных, которые могли использоваться драйвером для любых целей. За этими четырьмя байтами следовал байт контрольной суммы. [6] Вывод COMMAND снова становился высоким, когда кадр был завершен. [10]
При получении пакета ожидалось, что устройство, указанное в первом байте, ответит. Он состоял из одного байта, содержащего символ ASCII, «A» для подтверждения, если пакет был правильно декодирован и контрольная сумма совпала, «N» в противном случае. Для команд, которые обменивались данными, за кадром команды следовал «кадр данных» от или к выбранному устройству. Затем этот кадр подтверждался приемником с помощью «C» для завершения или «E» для ошибки. [11] Поскольку каждый пакет из 128 байтов данных требовал еще одного кадра команды, прежде чем следующий мог быть отправлен, на пропускную способность влияли проблемы с задержкой; дисковод Atari 810 обычно использовал скорость 19 200 бит/с, но был ограничен примерно 6000 бит/с из-за накладных расходов. [12]
Устройства нумеровались механически, обычно с использованием небольших DIP-переключателей . [13] Каждому классу устройств был присвоен свой набор из 16 потенциальных номеров на основе шестнадцатеричных чисел, например, диапазон $30 для дисководов и $40 для принтеров. Однако каждый драйвер мог поддерживать столько устройств, сколько хотел; драйвер принтера Atari 820 поддерживал только один принтер с номером $40, [14] в то время как драйверы дисков могли поддерживать четыре привода с номерами от $31 до $34. [15]
Проектирование того, что стало SIO, началось как система для сопряжения с кассетными магнитофонами, использующая звуковое оборудование для генерации соответствующих тонов. Эта возможность была сохранена в производственных версиях, что позволило Atari 410 и его последователям быть относительно простыми устройствами.
При настройке на работу с кассетой выходы с каналов 1 и 2 POKEY отправлялись на DATAOUT, а не на тактовые контакты. Два канала были настроены на создание тонов, которые были безопасны для записи на ленту, 3995 Гц для нуля были в канале 2 POKEY, а 5326 Гц для единицы были в канале 1. В этом режиме, когда POKEY считывал биты с SERIN, любые 1 приводили к воспроизведению канала 1 на контакте данных, а 0 воспроизводили канал 2. Таким образом, байт данных преобразовывался в тоны на ленте. Однако чтение использовало другую систему, поскольку в компьютере не было аналого-цифрового преобразователя. Вместо этого кассетные деки включали два узкополосных фильтра, настроенных на две частоты. Во время чтения выход одного или другого из этих фильтров утверждался, поскольку биты считывались с ленты. Они отправлялись в виде цифровых данных обратно на главный компьютер. [16]
Поскольку лента подвергалась растяжению и другим механическим проблемам, которые могли ускорить или замедлить транспортировку по головкам, система использовала асинхронное чтение и запись. Данные записывались блоками по 132 байта на запись, причем первые два байта представляли собой битовую комбинацию «01010101 01010101». Межзаписной промежуток между блоками без тонов позволял операционной системе узнавать, когда начинается новая запись, путем поиска начального нуля. Затем она быстро считывала порт и синхронизировала переходы битов синхронизации с 0 на 1 и обратно, чтобы определить точную скорость передачи данных. Следующий байт был контрольным байтом, указывающим, была ли это обычная запись из 128 байтов данных, короткий блок или конец файла. Далее следовали до 128 байтов данных, за которыми следовал байт контрольной суммы, включающий все, что было до контрольной суммы. [16]
Операция далее контролировалась штифтом MOTOR в порту SIO, выделенном для этой цели. Когда этот штифт был низким, двигатель в деке отключался. Это позволяло пользователю нажимать кнопку воспроизведения или воспроизведения и записи без начала движения ленты. Когда на компьютере вводилась соответствующая команда, MOTOR устанавливался, и кассета начинала вращаться. [16]
Другим выделенным выводом был AUDIOIN, который был подключен напрямую к выходным схемам звука между цифро-аналоговыми преобразователями POKEY и конечным выходом, так что любой сигнал на выводе смешивался со звуком от POKEY (если таковой имелся) и затем отправлялся на динамик телевизора. Он был подключен к левому звуковому каналу в кассете, в то время как правый канал был подключен к выводам данных. Это позволяло пользователям записывать обычные звуки на левом канале, а затем воспроизводить их через телевизор. Это часто сочеталось с прямым управлением двигателем для создания интерактивных лент для изучения языка и подобных программ. Некоторые компании-разработчики программного обеспечения записывали звуки или музыку на этом канале, чтобы сделать процесс загрузки более приятным. [17]