6526/8520 Complex Interface Adapter ( CIA ) был интегральной схемой , созданной MOS Technology . Он служил контроллером порта ввода-вывода для семейства микропроцессоров 6502 , обеспечивая возможности параллельного и последовательного ввода-вывода, а также таймеры и часы времени суток (TOD). Наиболее заметное применение устройства было в Commodore 64 и Commodore 128(D) , каждый из которых включал в себя два чипа CIA. Дисководы Commodore 1570 и Commodore 1571 содержали по одному CIA. Кроме того, домашние компьютеры Amiga и дисковод Commodore 1581 использовали модифицированный вариант схемы CIA под названием 8520. 8520 функционально эквивалентен 6526, за исключением упрощенной схемы TOD. Предшественником CIA был PIA .
CIA имел два 8-битных двунаправленных параллельных порта ввода-вывода. Каждый порт имел соответствующий регистр направления данных, который позволял индивидуально устанавливать каждую линию данных в режим ввода или вывода. Чтение этих портов всегда возвращало статус отдельных линий, независимо от установленного направления данных.
Внутренний двунаправленный 8-битный сдвиговый регистр позволял CIA обрабатывать последовательный ввод-вывод . Чип мог принимать последовательный ввод, тактируемый от внешнего источника, и мог отправлять последовательный вывод, тактируемый одним из встроенных программируемых таймеров. Прерывание генерировалось всякий раз, когда завершалась 8-битная последовательная передача. Было возможно реализовать простую « сеть », соединив вместе сдвиговый регистр и тактовые выходы нескольких компьютеров. Максимальная скорость передачи данных составляет 500 кбит/с для версии 2 МГц.
CIA включает исправление ошибки в последовательном сдвиговом регистре в более раннем 6522 VIA . CIA изначально предназначался для обеспечения быстрой связи с дисководом, но в итоге не мог использоваться из-за желания сохранить совместимость дисководов с VIC -20 ; на практике прошивку дисковода 1541 пришлось сделать еще медленнее, чем у его предшественника VIC-20, чтобы обойти поведение видеопроцессора C64 , который при прорисовке экрана отключал ЦП на 40 микросекунд каждые 512 микросекунд и в этом временном интервале не мог прослушивать шину, рискуя пропустить какой-то бит. [1] [2]
Было доступно два программируемых интервальных таймера, каждый с точностью до микросекунды . Каждый таймер состоял из 16-битного предустановленного счетчика только для чтения и соответствующей 16-битной защелки только для записи . Всякий раз, когда запускался таймер, защелка таймера автоматически копировалась в его счетчик, и счетчик затем уменьшался с каждым тактовым циклом до потери целостности, при которой генерировалось прерывание , если CIA был настроен на это.
Таймер может работать в режиме «однократного» с остановкой после переполнения или в режиме «непрерывного» с перезагрузкой значения защелки и повторным запуском цикла таймера. Помимо генерации прерываний, выход таймера может также быть подключен ко второму порту ввода-вывода.
Как настроено в Commodore 64 и Commodore 128 , синхронизация CIA контролировалась системными часами Ø2, номинально один МГц . Это означало, что таймеры уменьшались с интервалом примерно в одну микросекунду, точный период времени определялся тем, использовала ли система видеостандарт NTSC или PAL . В C-128 использовалось растяжение часов, поэтому синхронизация CIA не влияла на то, работала ли система в режиме SLOW или FAST.
Можно было генерировать относительно длинные временные интервалы, программируя таймер B для подсчета недозаполнения таймера A. Если бы оба таймера были загружены максимальным значением интервала 65 535, то получился бы временной интервал в один час, 11 минут, 34 секунды.
Часы реального времени встроены в CIA, предоставляя устройство для отсчета времени, более подходящее для человеческих нужд, чем микросекундная точность интервальных таймеров. Время хранится в американском 12-часовом формате AM/PM. Часы TOD состоят из четырех регистров чтения/записи: часы (с битом 7, действующим как флаг AM/PM), минуты, секунды и десятые доли секунды. Все регистры считываются в формате BCD , что упрощает процесс кодирования/декодирования.
Чтение из регистров всегда возвращает время суток. Чтобы избежать ошибки переноса при извлечении времени, чтение регистра часов немедленно остановит обновление регистра, не влияя на внутреннюю точность хронометража. После считывания регистра десятых частей обновление возобновится. Можно считывать любой регистр, кроме регистра часов, «на лету», что делает использование работающих часов TOD в качестве таймера практичным применением. Однако, если считывается регистр часов, необходимо впоследствии считывать регистр десятых частей. В противном случае все регистры TOD останутся «замороженными».
Установка времени включает запись соответствующих значений BCD в регистры. Доступ к записи в регистр часов полностью остановит часы. Часы не начнут работать снова, пока значение не будет записано в регистр десятых. Из-за порядка, в котором регистры появляются в карте памяти системы , для записи регистров в правильном порядке требуется простой цикл. Допустимо записывать только в регистр десятых, чтобы «подтолкнуть» часы к действию, при этом после аппаратного сброса часы начнут работать в 1:00:00.0.
В дополнение к функциям хронометража TOD можно настроить на работу в качестве будильника , настроив его на генерацию запроса на прерывание в любое желаемое время. Из-за ошибки во многих 6526 (см. также исправления ниже) IRQ будильника не всегда срабатывает, когда секундный компонент времени будильника равен нулю. Обходной путь — установить значение десятых долей будильника на 0,1 секунды.
Внутренняя схема часов TOD разработана для работы с синусоидальным сигналом частотой 50 или 60 Гц. Как и в C-64 и C-128(D), блок питания компьютера подавал такой сигнал из сети, что приводило к стабильному хронометру с небольшим долгосрочным дрейфом. Возможность работы с обеими частотами линий электропередач позволила использовать одну версию 6526 в компьютерах, работающих в странах с частотой питания 50 или 60 Гц. Важно отметить, что вопреки распространенному мнению, видеостандарты NTSC или PAL не связаны напрямую с частотой сети. Кроме того, некоторые компьютеры не получали свою тактовую частоту TOD из источника питания. Например, как варианты NTSC , так и PAL Commodore SX-64 используют тактовую частоту TOD частотой 60 Гц, подаваемую выделенным кристаллом. Например, операционная система KERNAL в Commodore 64 определяет видеостандарт во время запуска системы, но не пытается ни определить предоставленную тактовую частоту TOD, ни правильно инициализировать CIA на машинах с частотой 50 Гц. Таким образом, ответственность за определение предоставленной частоты и установку флага CIA(s) лежит на прикладном программном обеспечении, которое хочет использовать функцию TOD CIA. Невыполнение этого требования может привести к быстрому отклонению часов от правильного времени.
Версия CIA 8520, использовавшаяся в дисководах Amiga и Commodore 1581 , изменила часы времени на 24-битный двоичный счетчик, заменив формат BCD 6526. Однако остальное поведение было схожим.
CIA был доступен в версиях 1 МГц (6526), 2 МГц (6526A) и 3 МГц (6526B). Корпус представлял собой 40-контактный керамический или пластиковый DIP-корпус JEDEC . 8520 CIA с его модифицированными часами времени суток использовался в компьютерах Amiga .
Commodore встроил сокращенную (всего 4 регистра) логику типа CIA для сниженной стоимости Commodore 1571 внутри C128DCR (см. Commodore 128 ) в матрицу вентилей под названием 5710, которая также содержит другие функции. 5710 CIA имеет последовательные часы для быстрого последовательного интерфейса, жестко подключенные к эквивалентному значению таймера A CIA6526, равному 5, что приводит к времени передачи бита 5 мкс. Это отличается от того, что раньше было значением таймера A 6 в 6526 CIA в оригинальном Commodore 1571. 5710 CIA не содержит таймера или регистров управления таймером. Он содержит только два регистра портов и регистр для управления последовательным сдвигом и его событием.
В дополнение к вышеупомянутой ошибке прерывания будильника, многие CIA демонстрировали дефект, при котором часть не могла сгенерировать аппаратное прерывание таймера B, если регистр управления прерываниями (ICR) считывался на один или два такта раньше времени, когда прерывание должно было произойти. Этот дефект, а также логические ошибки в операционной системе Commodore (8 бит) часто вызывали псевдо- ошибки RS-232 в компьютерах Commodore 64 и Commodore 128 при работе на более высоких скоростях передачи данных .