История архитектуры популярных микропроцессоров — семейство Motorola/MOS/WDC
Motorola 6800
В начале 70–ых полупроводниковое подразделение Motorola (уступающее по объёму сбыта только Texas Instruments) решает разработать собственный микропроцессор и в 1974 (уже после появления описанного в предыдущей статье Intel 8080) на рынок выходит Motorola 6800.
Транзисторов: ~4100
Инструкций: 72
Частота: 1–2 МГц
Процессор адресует линейное пространство ОЗУ в 64 Кб (16 бит адреса). Специализированные порты ввода–вывода отсутствуют, поэтому они как правило «маппятся» в ОЗУ и выглядят для процессора как её ячейки.
Регистры:
— Два аккумулятора A и B (8 бит каждый)
— Регистр флагов Conditional Codes (CC): C (перенос), V (переполнение), Z (ноль), N (знак), I (прерывание), H (половинный заём)
— Индексный регистр IX (16 бит)
— Регистр вершины стека SP (16 бит)
— Счетчик инструкций PC (16 бит)
Если отбросить те регистры, которые должны быть у (практически) любого процессора — счетчик инструкций, вершина стека и флаги (PC, SP, CC), то выйдет, что регистров общего назначения у этого процессора всего три — A, B и IX. Скудное количество регистров — первая характерная особенность всего семейства Motorola/MOS, которая вынуждает подавляющее большинство арифметико–логических операций с аккумулятором брать второй операнд из ОЗУ и сохранять результат в аккумулятор. Даже в калькуляторном 4004 было шестнадцать 4–битных (или восемь 8–битных) регистра общего назначения (помимо аккумулятора). В 6800 аккумуляторов два и почти любая арифметико–логическая инструкция может быть выполнена с тем или другим, но второй операнд почти всегда берется из ОЗУ.
В связи с этим в процессоре сильное внимание уделено тому где и как может располагаться второй операнд в памяти. Есть следующие режимы адресации данных:
— Непосредственное данное в инструкции (immediate).
— Данное в памяти по 16–битному адресу хранимому в инструкции (extended).
— Данное в памяти по 8–битному адресу хранимому в инструкции (direct) — этот сокращённый и (потому) быстрый способ адресации первых 256 байт памяти является второй крайне типичной для этого семейства процессоров особенностью. Первые 256 байт памяти в них часто называют «нулевой страницей (zero–page)» и в них часто располагаются важные для программ данные.
— Байт (без знака) в инструкции складывается с регистром IX и берется данное из этого адреса (index).
Инструкции процессора можно разбить на несколько категорий в зависимости от возможных способов адресации:
1. Команды с двумя операндами первый из которых — аккумулятор, а второй — ячейка памяти с одной из 4–х адресаций: сохранение/загрузка (в/из памяти), сложение/вычитание (с переносом и без), сравнение, логические AND/OR/XOR, логический тест (по AND).
2. Команды с одним операндом — ячейкой памяти с одной из 4–х адресаций: сравнение с IX (16–битное), загрузка SP или IX, сохранение SP или IX (кроме адресации immediate).
3. Команды с одним операндом — или аккумулятором или ячейкой в памяти с адресацией direct или extended: инкремент/декремент, битовые сдвиги (и арифметические и логические), битовые прокрутки, обнуление, дополнение до двух, смена знака, сравнение с нулём.
4. Переходы: Условные переходы всегда относительные по байтовому смещению, безусловный переход и вызов процедуры могут быть еще по абсолютному 16–битному адресу или косвенно по адресу IX+байтовое смещение.
6. Команды с вмененным операндом. Явных операций со стеком только две — PUSH/POP одного из аккумуляторов. Доступны так же: инкремент/декремент SP/IX, очистка/установка флагов C/V/I, передача A в B или регистр флагов и обратно, передача SP в IX и обратно, сложение/вычитание B из A и их сравнение, десятичная коррекция A, возврат из прерываний или процедур и программная генерация прерываний.
Несмотря на то, что наборы и команд и режимов адресаций были немаленькими, но наличие только одного 16–битного регистра через который можно косвенно считывать память несколько подрывает удобство программирования на 6800. Так, например, процедура копирования произвольного региона памяти занимает около 18 команд и 32 байт памяти даже при условии расположения временных переменных в zero–page (и потому компактной адресации direct) — в то время как на Intel 8080 достаточно было 11 команд и вдвое меньше памяти — 14 байт. Особой популярности в нише компьютеров процессор не получил — больше выстрелило его применение в качестве микроконтроллера — под что были выпущены специальные его ревизии.
MOS Technology 6502
В 1974 году восемь инженеров Motorola, работавших над 6800 перешли в компанию MOS Technology, основанную в 1969–ом году тремя выходцами из General Instruments. И шли эти инженеры со вполне конкретной целью — сделать дешевого и популярного «убийцу 6800», да и остальных распространённых 8–битных микропроцессоров на рынке.
Планировалось выпустить две версии микросхемы с одинаковой архитектурой (не совместимой, однако, с 6800) под номерами 6501 и 6502. 6501 по замыслу должен был полностью по разьёмам, вольтажу и предназначению контактов быть совместимым с 6800, потому купив его можно было бы выпаять из имеющегося ПК Motorola 6800, впаять на его место MOS 6501 и заменив код программ пользоваться компьютером как новым. 6502 же обладал иным форм–фактором, включал в себя для удобства генератор частоты (так что не нужно было подключать внешний как в 6800) и потому предназначался для новых систем разрабатываемых с нуля. Однако, узнав из анонсов о планах на MOS 6501, Motorola разволновалась и побежала в суд, отчего программа по его разработке была свёрнута. Так или иначе у MOS Technology был козырь — технология «исправления масок» резко снижающая процент брака при выпуске микросхем. Поэтому когда в 1975 на рынок, где цены на аналоги начинались от $179, выходит MOS 6502 по цене $25 — он этот рынок взрывает.
Транзисторов: ~3500
Инструкций: 56
Частота: 1–3 МГц
Архитектура MOS 6502 с одной стороны отличается с Motorola 6800 до полной несовместимости, но с другой стороны полностью копирует самые характерные её черты. Можно воспринимать её как не совсем однозначную «работу над ошибками». Акцент в немногочисленных регистрах сместился с аккумуляторов на индексы: аккумулятор остался один (A), зато индексных регистров стало два — X и Y. При этом, однако, состоялось одно спорное упрощение: и индесные регистры и регистр стека из 16–битных стали 8–битными. В результате стек стал обязательно располагаться сразу за zero–page в следующих за ней 256 байтах памяти и вмещал не более 256 байт. Можно сказать, что процессор стал 8–битным настолько насколько это вообще возможно — единственным 16–битным регистром остался счётчик инструкций.
Регистры:
— Аккумулятор A (8 бит)
— Регистр флагов Processor Flags (P): C (перенос), Z (ноль), I (прерывание), D (десятичное число), B (прерывание отладки), V (переполнение), N (знак)
— Индексные регистры X и Y (8 бит)
— Регистр вершины стека SP (8 бит)
— Счетчик инструкций PC (16 бит)
«Усыхание» индексных регистров до 8 бит в MOS решили нивелировать существенно расширенными режимами индексации данных в памяти:
— Непосредственное данное в инструкции (immediate или imm).
— Данное в памяти по 16–битному адресу хранимому в инструкции (absolute или abs)
— То же что absolute, но адрес увеличивается на X или Y (absolute indexed или abs idx)
— Данное в памяти по 8–битному адресу хранимому в инструкции (zero–page или zpg)
— То же что zero–page, но адрес увеличивается на X или Y (zero–page indexed или zpg idx). Примечение: адрес не может выйти за границы zero–page, «проворачивается» через ноль при превышении 255.
— Данное по 16–битному адресу, хранимому по 8–битному адресу в zero–page увеличенному на X (X–indexed indirect или X–idx ind). Примечание: адрес в zero–page при увеличении на X не выходит за её границы.
— Данное по увеличенному на Y 16–битному адресу в zero–page (Y–indexed indirect или Y–idx ind). Примечание: при сложении с Y эффективный адрес не испытывает проблем с пересечением 256–байтных страниц.
Обратите внимание на последние два режима — за недостатком бит в индексных регистрах они берут полные 16–битные адреса из zero–page, что замедляет, но в принципе делает возможным полноценные косвенные обращения к памяти. Забавно, что индесные регистры X и Y здесь в процессе вычисления адреса существенно неортогональны (ведут себя по разному).
Система команд у 6502 тоже менее ортогональна, чем у 6800. Так, например, единственные две инструкции, умеющие адресацию zpg Y–ind — это загрузка/сохранение регистра X из памяти. Кроме того сложение/вычитание всегда учитывают флаг переноса, поэтому перед сложением нередко надо явно очищать его инструкцией CLC. В остальном система команд очень напоминает систему команд 6800 по существу, с поправкой на изменение состава регистров, но с кучей мелких исключений и отклонений от общих правил, так что я даже не буду пытаться её охарактеризовать более подробно.
Самым большим недостатком 6502 является полное отсутствие 16–битной арифметики. А таковая является крайне частым гостем даже в 8–битной среде. Поэтому складывать или вычитать 16–битные числа и адреса этому процессору приходилось за несколько 8–битных операций. Кроме того, несмотря на наличие двух индексных регистров, из–за их 8–битности и специфики применения код копирующий блок памяти не стал меньше ни по числу инструкций ни по занимаемому размеру памяти программы (по сравнению с Motorola 6800).
Тем не менее несмотря на все недостатки и постоянные обращения к памяти быстродействие MOS 6502 было вполне на уровне конкурентов. Более того — в среднем он работал вдвое быстрее типичных конкурентов при одинаковых тактовых частотах! Хотя это можно рассматривать как особенность его архитектуры — сильно привязанной к частоте памяти в которую он почти в каждой инструкции лазил — его тактовые частоты и были как правило вдвое меньше тактовых частот конкурентов тех же лет.
Но несмотря на все недостатки MOS 6502 получил огромную популярность.
Из ПК можно вспомнить 8–битные семейства Apple II, Commodore (например Commodore 64), Atari (например Atari 800), BBC Micro и др.
Из консолей нельзя не вспомнить Famicon/NES/Денди, кроме того были еще Atari 2600/5200/7800.
По большому счёту наверное две трети (если не больше) рынка процессоров для популярных консолей и ПК делили между собой два титана (и их производные) — MOS 6502 и Zilog Z80 о котором было рассказано в предыдущей статье.
WDC 65C02
В 1978 году сотрудник MOS Technology Билл Менш, участвовавший в разработке как Motorola 6800 так и MOS 6502 ушёл уже из этой компании и основал еще одну — Western Design Center для того чтобы выпустить усовершенствованного клона 6502 — WDC 65C02. Этот совместимый с ним процессор сохранил неизменным набор регистров и лишь немного улучшил систему команд — сделал её более удобной и ортогональной заняв 27 из неиспользованных слотов байта кода инструкции. Клоны именно этой ветки стояли в таких системах как компьютеры Apple IIc, Apple IIe или консолях TurboGrafx–16 и Atari Lynx.
Подробно эти улучшения я описывать не буду, они не слишком принципиальны, но к фирме WDC мы еще вернёмся…
Motorola 6809
Осознав угрозу со стороны MOS 6502 Motorola решает нанести ответный удар и в 1979 году выпускает еще один процессор — 6809.
Этот зверь пытается взять всё самое лучшее как из 6800 так и из 6502. В силу значительных отличий он теряет бинарную совместимость с 6800, однако снова перед командой разработчиков ставится более скромная задача: обеспечить, чтобы программы на ассемблере для 6800 могли быть оттранслированы с минимальными изменениями под новый процессор. Это было обеспечено включением регистров 6800 как подмножества регистров 6809 и созданием более совершенной системы команд.
Транзисторов: ~9000
Инструкций: 59
Частота: 0,89–4 МГц
Регистры:
— Два 8–битных аккумулятора A и B, которые в небольшом подмножестве инструкций могли использоваться как один 16–битный аккумулятор D
— Регистр флагов (8 бит)
— Два 16–битных индексных регистра X и Y
— 16–битный указатель системного стека S
— 16–битный указатель пользовательского стека U
— 16–битный счётчик команд PC
— 8–битный селектор верхнего байта адреса для zero–page, которая здесь называется уже direct–page (DP)
Как видно здесь одновременно присутствуют два аккумулятора как в 6800, но при этом индексных регистра тоже два — X и Y как в 6502, зато в отличие от последнего эти индексы 16–битные, как и указатель стека. Плюс ко всему добавлен еще регистр «пользовательского стека» стека U, с которым можно обращаться почти так же как со стеком обычным (S).
Система команд значительно прибавила в ортогональности и режимах адресации, но основной принцип остался неизменным — арифметико–логические команды преимущественно берут второй аргумент из памяти.
Чтобы понять насколько система команд стала богаче достаточно рассмотреть режимы адресации данных:
— Непосредственное данное в инструкции (immediate).
— Данное в памяти по 16–битному адресу хранимому в инструкции (extended)
— Данное в памяти по адресу который хранится в памяти по 16–битному адресу хранимому в инструкции (extended indirect)
— Данное в памяти по адресу 256*DP+байт хранимый в инструкции (direct page). То есть аналог zero–page теперь может находится в разных страницах памяти на выбор.
— Данное в памяти по адресу: содержимого одного из регистров X/Y/U/S опционально сложенному либо с константой заданной в инструкции (5, 8 или 16 бит) либо одним из аккумуляторов A, B (8 бит) или D (16 бит) (indexed)
— Данное в памяти по адресу PC плюс константа в инструкции (8 или 16 бит) (indexed PC)
— Данное в памяти по адресу одного из регистров U/Y/U/S с пост–инкрементом или пре–декрементом содержимого этого регистра на 1 или 2 байта (auto inc/dec)
— Три предыдущих режима адресации (indexed, indexed PC и auto inc/dec) могли быть переключены в косвенный режим (indirect), когда полученный на первом шаге адрес использовался для извлечения из памяти другого 16–битного адреса где уже лежит искомое данное (indirect indexed, indirect indexed PC и indirect auto inc/dec соответственно). Исключениями из режима indirect являются 5–битные смещения в режиме indexed и однобайтные автоинкременты/декременты в режиме auto inc/dec.
Как видно существуют весьма продвинутые для 8–битного поколения режимы адресации. Кроме того для удобства добавлены 16–битные сложение/вычитание с аккумулятором D и 16–битные сравнения для регистров D/X/Y/U/S. Со столь глубокой системой команд 6809 получает некоторое пенальти — коды многих его инструкций становятся двухбайтовыми. Все предыдущие процессоры описанные выше кодировали код инструкции одним байтом, хотя следом и могли идти один или два байта данных для инструкции. В 6809 сам код инструкции уже мог занимать два байта, а следом еще могли идти данные.
Однако несмотря на своё техническое превосходство 6809 не получает должной популярности — персональные компьютеры использующие его в качестве центрального процессора были, но сверхпопулярными они не получились.
WDC 65C816
В 1982 году Apple обратилось к Биллу Меншу из вышеупомянутого Western Design Center с просьбой разработать для своей успешной серии компьютеров Apple II усовершенствованную версию процессора, совместимую с используемым 6502, но способную адресовать больше памяти и оперировать 16–битными числами. WDC взялось за разработку и в 1984 году появляется WDC 65C816 — 16–битное усовершенствование 8–битного WDC 65C02, который в свою очередь был улучшенным MOS 6502.
Процессор 16–битный и может адресовать до 16 Мб памяти (24 бита адреса) с помощью сегментации памяти введением 8–битных регистров банков, добавляемых как старший байт к обычному 16–битному адресу 6502.
Регистры:
— 8–битный аккумулятор A и 8–битное дополнение к нему B, которые вместе образуют 16–битный аккумулятор C.
— 8/16–битные индексные регистры X и Y.
— 8/16–битный регистр стека S
— счетчик инструкций PC
— 16–битный регистр direct page (DP) — прибавляется к адресу при адресации zero–page, которая в отличие от 6809 может начинаться в любом байте 64 Кб–тного пространства
— 8–битный сегмент банка данных DB (data bank) — добавляется сверху к 16–битному адресу для получения 24–битного при сохранении/извлечении данных.
— 8–битный сегмент банка программы PB (program bank) — добавляется сверху к 16–битному адресу для получения 24–битного при считывании инструкций.
Процессор стартует в 8–битном режиме и полностью совместим в нём с 65C02, плюс имеет новые инструкции (например обмен B и A), которыми забиты все оставшиеся незанятые в 65C02 слоты байта инструкции. Далее процессор можно переключить в «native mode», когда раскрывается его 16–битность. Раскрывается она, однако, довольно прямолинейным образом — все инструкции работающие ранее с 8–битным аккумулятором A без изменения кодов инструкций начинают работать с 16–битным аккумулятором C, 16–битными индексными регистрами и 16–битными словами в памяти соответственно. Чтобы работать с байтами процессору надо обратно переключить аккумулятор в 8–битный режим — это делается отдельными инструкциями. Вообще есть два флага контроля битности — один контролирует 16–битность аккумулятора, а другой — 16–битность индексных регистров — их можно включать/выключать пораздельно, поэтому в «native mode» 65C816–ый может имитировать среду выполнения 65C02 выделив под неё 64 Кб памяти в любом месте 16–мегабайтного адресного пространства. Для более удобной работы к базовым инструкциям (сохранения/загрузки, сложения/вычитания и AND/OR/XOR) добавлены 24–битные режимы адресации, плюс адресации относительно стека. Так же введены блоковые инструкции копирования памяти.
Из машин использовавших этот процессор или его клонов можно отметить ПК Apple II GS и консоль Super Nintendo Entertainment System (SNES).
Заключение
Процессоры 8–битного семейства Motorolola/MOS/WDC оставили огромный след в истории компьютерной техники. Когда то этот род доминировал среди цифровых папоротников и электрических хвощей, деля большую часть ниши с конкурентами из Intel/Zilog. Однако, как и в случае с Zilog, род этот со временем вымер и сейчас существует только в виде разнообразных микроконтроллеров до боли похожих архитектур (например STMicroelectronics STM8), да реликтовых ископаемых на полках компьютерных ретрогиков.
Когда в своё время Motorola захотела уже сделать 16–битный процессор следующего поколения она разработала… 32–битный микропроцессор Motorola 68000 (m68k), который, несмотря на нумерацию, ничего общего не имел с вышеописанным семейством, обладал огромной кучей 32–битных регистров повышенной ортогональности и 16–битным назывался в первых ревизиях только из–за 16–битного ALU, выполняющего прозрачно для программиста 32–битные операции в несколько действий.
Motorola 68000 применялся, например, в качестве центрального процессора в 16–битной консоли Sega Mega Drive, компьютерах Apple Macintosh, Atari ST и многих других, но это уже совсем другая история.
14 комментариев
Даже пусть тормозной как компилятор Оберонов :)
И что-то я сомневаюсь насчёт автоматического портирования, т.к. разными были и системные возможности консолей. Если только немного облегчить портирование.
но — такая помощь для переноса была бы просто неоценимой.
Но сам подход достаточно древний. Помните Гэрри Килдалла (Gary Kildall)? Большинству он известен, как создатель CP/M, но Килдалл был настоящим компьютерным ученым. В частности, он внес очень серьезный вклад в развитие теории компиляторов. Примером практического воплощения его идей являлся, в частности, транслятор XLT86 (8080 to 8086 Assembly Language Translator): www.s100computers.com/Software%20Folder/Assembler%20Collection/Digital%20Research%20XLT86%20Manual.pdfss
en.wikipedia.org/wiki/CSG_65CE02
HuC6280 — вот реально прикольный клон, в PC Engine. Маппер памяти, интересный 6-канальный звук и 7 МГц.