Эмоциональная история процессоров для первых компьютеров с 70-х до начала 90-х

Motorola 6800 и близкие родственники

Процессоры Motorola всегда отличались наличием нескольких очень привлекательных "изюминок" при одновременном наличие каких-то несуразных по абстрактности и малопрактичности архитектурных решений. Главная "изюминка" всех рассматриваемых процессоров – это второй полноценный и очень быстрый регистр-аккумулятор.

6800 был первым в мире процессором, которому требовалось только один источник питания (5 вольт) – это было очень полезное новшество. Кроме того, на 6800 была также впервые реализована поддержка немаскируемых прерываний. Но 6800 из-за единственности громоздкого для 8-битной архитектуры 16-битного индексного регистра получился неудобным для программирования и использования изделием. Он был выпущен ещё в 1974, ненамного позже 8080, но так и не стал основой для какой-либо известной компьютерной системы. Интересно, что разработчики 6502, Чак Педдл (Chuck Peddle) и Бил Менш, называли 6800 неправильным, "слишком большим". Однако, он и его варианты широко использовались как микроконтроллеры. Возможно тут стоит заметить, что Intel производила процессоры с 1971, что поставило Motorola в положение догоняющей стороны, для которой 6800 был самым первым процессором. И если сравнить 6800 не с 8080, а с его предшественником 8008, то 6800 окажется значительно предпочтительнее. Motorola почти догнала Intel с 68000/20/30/40. Можно ещё заметить, что в 70-е Motorola была значительно более крупной компанией, чем Intel.

Производились также многочисленные варианты 6800: 6801, 6802, 6803, 6805, ... Большинство из них это микроконтроллеры с встроенной памятью и портами ввода-вывода. 6803 – это упрощенный 6801 и его использовали в сильно запоздалом (1983) для своего класса компьютере Tandy TRS-80 MC-10 и его французском клоне Matra Alice, которые были сравнимы с Commodore VIC-20 (1980) или Sinclair ZX81 (1981). Система команд 6801/6803 была значительно улучшена, были добавлены 16-битные команды, умножение, ... Появилась необычная инструкция безусловного перехода (BRN – branch never), который никогда не выполняется! Некоторые инструкции стали чуть быстрее. Тут можно заметить, что архитектура 680x формировалась под сильным влиянием архитектуры PDP-11. Некоторые детали PDP-11 были скопированы скорее механически, например, бесполезные команды CLV и SEV.

680x полностью поддерживают работу с целыми числами со знаком, z80 и 6502 поддерживают её хуже, а у 8080 такой поддержки нет практически совсем. Однако в 8-битном программном обеспечении такая поддержка нужна была редко.

6809 был выпущен в 1978, когда с 8086 уже началась 16-битная эпоха, и имеет весьма развитую систему команд, включая умножение двух байтовых аккумуляторов с получением 16-разрядного результата за 11 тактов (для сравнения, 8086 требует от 70 тактов на подобную операцию). Два аккумулятора могут в нескольких случаях группироваться в один 16-разрядный, что даёт быстрые 16-битные инструкции. 6809 имеет три индексных регистра и рекордное среди 8-битных процессоров число методов адресации – 12. Среди методов адресации есть уникальные для 8-битных чипов, такие как индексная с автоинкрементом или декрементом, относительно счётчика команд (это позволяет писать перемещаемые инструкции – для 6502, Z80 или даже x86 и 68k такой возможности нет), индексная со смещением. Особенно стоит отметить косвенную адресацию, которую можно было использовать почти со всеми базовыми методами адресации. Можно, например, написать LDD [,X++], что соответствует С-коду short D, **X; D = **X++;, или LDA [B,U], что соответствует С-коду char A, B, **U; A = **(B + U);. 6809 имеет команду загрузки эффективного адреса, которой очень не хватает у PDP-11 и которая часто бывает очень полезна, например, LEAX ,--Y; соответствует С-коду X = --Y;. Команды работы со стеком очень мощные, одной командой можно загрузить/выгрузить любое множество регистров – подобные команды появились позже на 68k и ARM, но их нет для x86. Перемещаемые переходы могут использовать как 8-битные, так и 16-битные смещения – последнего не даже у 80286! 6809 имеет интересную возможность использовать два типа прерываний: можно использовать быстрые прерывания с частичным автоматическим сохранением регистров и прерывания с полным сохранением регистров – у 6809 есть три входа для сигналов прерывания FIRQ (быстрое маскируемое, сохраняет только два регистра), IRQ (маскируемое, сохраняет все регистры), NMI (немаскируемое). Стоит отметить вообще очень качественную поддержку работы с прерываниями как с аппаратными, так и с программными. Также иногда удобны в использовании быстрые инструкции чтения и установки сразу всех флагов.

Однако, операции с памятью требует на такт больше, чем 6502 или 6800. Это и некоторые другие факторы сделали сверхдешевый компьютер на базе 6803 (MC-10) иногда быстрее более дорогих машин на базе 6809! Индексные регистры в 6809 так и остались неуклюжими 16-битными динозаврами в 8-битном мире, некоторые операции просто шокируют своей медленностью, например, пересылка одного байтового аккумулятора в другой занимает 6 тактов (дольше загрузки из памяти!), а обмен их содержимым – 8 тактов (сравните с 8080, где 16-битный обмен проходит за 4 такта)! Перемещаемая адресация медленнее неперемещаемой, а косвенная адресация нужна очень редко. Зачем-то предлагаются сразу два стека, возможно это было влияние тупиковой архитектуры VAX-11 – в 8-битной архитектуре с 64 КБ памяти выглядит скорее несуразно. Нет инструкций для сравнения регистров. И даже наличие инструкции с интересным названием SEX всех проблем 6809 устранить не может. В целом, 6809 всё же несколько быстрее 6502 на той же частоте, но требует такую же по быстродействию память. Мне удалось сделать деление для 6809 с 32-разрядным делимым и 16-разрядным делителем (32/16=32,16) за примерно в среднем 480 тактов, для 6502 у меня не получилось добиться менее 530 тактов. Второй аккумулятор – большое преимущество, но другие возможности 6502, в частности, инвертированный перенос, сводят это преимущество только к приведенным примерно 10%. А вот умножение на 16-битною константу оказалось медленнее, чем табличное для 6502 с таблицей на 768 байт. 6809 позволяет писать довольно компактные и быстрые коды, используя адресацию установленной страницы (direct page), но эта адресация делает коды довольно путанными. Суть этой адресации в установке старшего байта адреса данных в специальном регистре и указании только младшего байта адреса в командах. Такая же система только с фиксированным значением старшего байта используется в 6502, где она называется адресацией нулевой страницы (zero page). Адресация установленной страницы – это прямой аналог использования сегментного регистра DS в x86 только не для сегментов размером 64 КБ, а для сегментиков размером всего 256 байт. Ещё одна надуманность архитектуры 6800 в использовании порядка байт от старшего к младшему (Big Endian), что притормаживает 16-битные операции сложения и вычитания. 6809 несовместим по кодам инструкций с 6800 – можно только исходники от 6800 транслировать в код 6809, что аналогично случаю с 8080 и 8086. Фактически семейство 680x – это набор из примерно десятка семейств бинарно несовместимых процессоров. В этом материале рассматриваются только два таких семейства: 6800 (6801, 6803) и 6809 (6309). Остальные семейства использовались только в качестве контроллеров, одним из лучших среди которых – это чип 68HC12, который имеет превосходную плотностью кодов. Семейство 680х выделяется на фоне процессоров других компаний необычными странностями при работе с флагами. Например, команды записи в память (ST) ставят флаги, а команды загрузки регистра из стека (PUL) нет. Другой пример, команда зануления CLR всегда зануляет флаг переноса. 6809 стал последним универсальным 8-битным процессором от Motorola, в дальнейших разработках вместо него было решено использовать 68008.

Можно предположить, что Motorola потратила немало средств для продвижения 6809. Это сказывается до сих пор при упоминании об этом процессоре. Про 6809 имеется много благоприятных отзывов, отличающихся некоторой туманностью, обобщениями и неконкретностью. 6809 позиционировался как 8-битный суперпроцессор для микромейнфреймов. Для него даже был сделан почти Unix, операционные системы OS-9 и UniFlex. Он был выбран как основной процессор для Apple Macintosh и, как следует из фильмов о Стиве Джобсе, только его эмоциональное вмешательство определило переход на более перспективный 68000. Конечно, 6809 – это хороший процессор, но в целом лишь незначительно лучший своих появившихся гораздо раньше конкурентов 6502 (на три года раньше) и z80 (на два). Можно только гадать, что бы было, если бы Motorola хотя бы половину усилий потраченных на разработку и продвижение 6809 потратила на развитие 6502.

6809 использовался в нескольких довольно известных компьютерных системах. Наиболее известные среди них – это американский компьютер Tandy Color или Tandy Coco, а также их британский или точнее валлийский клон Dragon-32/64. Интересно, что в этих компьютерах частота 6809 была явно искусственно занижена и составляла всего 0.89 МГц. Компьютерные рынки 80-х отличала значительная нетранспарентность и Tandy Coco распространялись в основном только в США, а Драконы помимо собственно Великобритании получили некоторую популярность и в Испании. Во Франции 6809 почему-то стал основой для массовых компьютеров 80-х серии Thomson, которые так и остались практически неизвестными где-либо ещё кроме Франции. 6809 также использовался в качестве второго процессора по крайней мере в двух системах: в серии Commodore SuperPET 9000 и в очень малотиражной приставке для TUBE-интерфейса компьютеров BBC Micro. Использовался этот процессор и в других менее известных автору системах, в частности, японских. Он также получил некоторое распространение в мире игровых консолей. Стоит упомянуть одну из таких консолей, Vectrex, которая использует уникальную технологию – векторный дисплей.

Цветной КоКо 3

680x имеют интересную недокументированную инструкцию с интересным названием "Остановись и поджарься" (Halt and Catch Fire – HCF), которая используется для тестирования на уровне электроники, например, осциллографом. Её использование приводит процессор к зависанию, из которого можно выйти только его перезапуском (reset). Эти процессоры имеют и другие недокументированные инструкции. В 6800 есть, например, инструкции симметричные непосредственной загрузке регистра константой, т.е. инструкции непосредственной выгрузки регистра в адрес следующий за этой инструкцией!

Как и 8080, 8085 или z80, 6809 очень трудно называть чисто 8-битным. А 6309 даже формально трудно назвать 8-битным, его производила японская фирма Toshiba (точный год начала его производства мне найти не удалось, но есть некоторые данные, указывающие на 1982) как процессор, полностью совместимый с 6809. Однако, этот процессор можно было переключать в новый режим, который при сохранении почти полной совместимости с 6809 предоставлял почти на порядок большие возможности. Эти возможности были скрыты в официальной документации, но были опубликованы в 1988 в сети Usenet. Были добавлены ещё два аккумулятора, но инструкции с ними существенно медленнее, чем с первыми двумя. Интересно, что новый 16-битный регистр W, собираемый из этих новых аккумуляторов, получился настоящим регистром общего назначения, – его можно использовать как адресный и как регистр данных. Сильно сокращено время исполнения большинства инструкций. Добавлены ряд команд, среди которых просто фантастическое для процессоров такого класса знаковое деление 32-битного делимого на 16-битный делитель (32/16=16,16) за 34 такта, причем делитель берется из памяти. Появилось также 16-разрядное умножение с 32-разрядным результатом за 28 тактов. Были также добавлены очень полезные инструкции для быстрого копирования блоков памяти с временем исполнения 6 + 3n, где n – это число копируемых байт, копировать можно как с уменьшением, так и с увеличением адресов. Эти же инструкции можно использовать и для быстрого заполнения памяти заданным байтом. При их исполнении могут происходить прерывания. Появились ещё новые битовые операции (странные загрузка/выгрузка отдельного бита четырехоперандными командами и необычные двухоперандные безрегистровые операции с памятью), нуль-регистр, регистровые сравнения и др. Были ещё добавлены прерывания при исполнении неизвестной инструкции и при делении на 0. В каком-то смысле, 6309 – это вершина технологических достижений среди 8-битных процессоров или точнее процессоров с размером адресуемой памяти 64 КБ. Однако, некоторые новые команды 6309 являются практически бесполезными (ASLD, LSRD, ASRD, ADCD, ROLD, ...), они по размеру и скорости исполнения совершенно аналогичны последовательности из двух команд для 6809.

6309 полностью совместим по клеммам с 6809, что сделало его популярным апгрейдом для цветных Танди или Драконов. Существуют и специальные версии ОС, использующие новые возможности 6309.

Клоны 680x производились, в частности, в Японии и Болгарии, но не в СССР.


Cтатья опубликована на geektimes, а также переведена на английский.