Мне довелось программировать на ассемблерах разных процессоров. Последний в списке – это Xilinx MicroBlaze. Решил выложить некоторые свои наблюдения за особенностями этих почти волшебных железок, которые как волшебный ключик Буратино открыли нам двери в волшебную страну виртуальной реальности и массовой креативности. Об особенностях современных систем x86, x86-64, ARM, ARM-64 и т.п. писать не буду, может быть в другой раз – тема очень большая и сложная. Поэтому планирую закончить на Intel 80486 и Motorola 68040. Хотелось ещё включить в обзор IBM/370, с которыми имел дело. Эти системы были довольно далеки от широких масс пользователей, но оказали при этом огромное влияние на компьютерные технологии. На них просто не хватило выделенного на тему времени, они не использовали процессоры-чипы и самих их вроде бы почему-то не осталось совсем. Очень надеюсь, что мои материалы привлекут внимание и знатоков, которые смогут добавить что-нибудь из того, о чем не подумал или не знал.
В качестве иллюстративного материала прикрепляю свой небольшой камень из Розетты – программки для расчета числа π на разных процессорах и системах по алгоритму-затвору, претендующие на звание самых быстрых его реализаций.
Intel 8080 и 8085
Первый настоящий процессор на чипе, сделанный в первой половине 1974 года, он до сих пор производится и находит себе применение. Многократно клонировался по всему миру, в СССР имел обозначение КР580ВМ80А. Современные процессоры Intel для РС до сих пор легко обнаруживают свою родственность этому уже в каком-то смысле реликтовому изделию. Сам для этого процессора кодов не писал, но будучи хорошо знакомым с архитектурой z80, рискну привести некоторые свои замечания.
Систему команд i8080, как и других процессоров Intel для РС, трудно назвать идеальной, но она универсальная, достаточно гибкая и имеет несколько очень привлекательных особенностей. От своих конкурентов, Motorola 6800 и MOS Technology 6502, i8080 выгодно отличался большим количеством пусть и несколько неуклюжих регистров, предоставляя пользователю один 8-битный аккумулятор А, один 16-битный полуаккуммулятор и по совместительству быстрый индексный регистр HL, 16-разрядный указатель стека SP, а также ещё два 16-битных регистра ВС и DE. Регистры BC, DE, и HL можно было использовать и как 6 байтовых регистров. Кроме того, i8080 имел поддержку полного набора флагов состояния: переноса, переполнения, знака, нуля и даже чётности и полупереноса. Некоторые инструкции из набора команд i8080 долгое время были чемпионами по быстродействию. Например, команда XCHG делает обмен содержимым 16-битных регистров DE и HL всего за 4 такта – это было исключительно быстро! Ряд других команд хотя и не ставили столь яркие рекорды, но также долгое время были одними из лучших:
- XTHL – обмен содержимым регистра HL и данных на вершине стека, 18 тактов – вроде бы много, на даже на настоящем 16-битном i8086 такая команда занимает от 22 тактов, а для 6800 или 6502 такую команду даже трудно представить;
- DAD – добавить к полуаккуммулятору HL значение другого 16-битного регистра (BC, DE или даже SP), 10 тактов. Это настоящее 16-битное сложение с установкой флага переноса. Если складывать HL самим с собой, то будет получаться быстрый 16-разрядный сдвиг влево или умножение на 2, ключевая операция как для реализации полного умножения, так и деления;
- PUSH и POP – положить в стек и вынуть из стека 16-разрядное значение соответственно из регистра или в регистр. Выполняются за 11 и 10 тактов. Это самые быстрые операции i8080 для работы с памятью и при их выполнении происходит автоматическая инкрементация или декрементация SP. PUSH можно использовать, например, для быстрого заполнения памяти паттерном со значениями из 3 регистров (BC, DE, HL). Команд для работы с 8-битными величинами со стеком нет вообще;
- LXI – загрузка 16-битной константы в регистр (HL, DE, BC, SP) за 10 тактов;
- RNZ, RZ, RNC, RC, RPO, RPE, RP, RM – условные возвраты из подпрограммы, позволяли делать код чище, избавляя от необходимости писать лишние условные переходы. От этих команд отказались в архитектуре x86, возможно, что и зря, код с ним получается симпатичнее.
Этот процессор был использован в первом персональном компьютере Altair 8800, ставшим весьма популярным после журнальной публикации в начале 1975. К слову, в СССР похожая публикация случилась только в 1980, а соответствующая ей по актуальности только в 1986.
Первый почти ПК
Intel 8080 стал основой для разработки когда-то первой массовой профессиональной операционной системы CP/M, занимавшей доминирующие позиции среди микрокомпьютеров для профессиональной работы до середины 1980-х.
Теперь о недостатках. i8080 требовалось два напряжения питания 5 и 12 вольт. Работа с прерываниями – неуклюжая и медленная. И в целом i8080 скорее нетороплив, если сравнить его с вскоре появившимися конкурентами. 6502 мог быть до 3-х раз быстрее при работе на той же частоте, что и i8080. Но в архитектуре i8080 было заложено, как оказалось, правильное видение будущего, а именно того неизвестного в 70-х факта, что процессоры будут быстрее памяти. Регистры i8080 DE и BC – это скорее прообраз современных кэшей, с ручным управлением, чем регистры общего назначения. i8080 начал с частоты 2 МГц, а конкуренты только с 1, что сглаживало разницу в производительности.
Трудно назвать i8080 8-битным процессором на все 100%. Конечно, АЛУ у него на 8 бит, но есть много 16 разрядных команд, работающих быстрее, чем если использовать только 8-битные аналоги вместо них. А для некоторых команд 8-битных аналогов нет вообще. Команда XCHG по сути и таймингам 100% 16-битная. Есть реальные 16-разрядные регистры. Поэтому рискну назвать i8080 частично 16-битным. Было бы интересно по совокупности признаков вычислять индекс разрядности процессора, но, насколько известно автору, пока такой работы никто не проделал.
Автор не знает причины, почему Intel отказалось от прямой поддержки развития 8-битных персоналок своими процессорами. Intel всегда отличила сложность и неоднозначность политики. Её связь с политикой, в частности, иллюстрирует тот факт, что долгое время у Intel функционируют заводы в Израиле и до конца 90-х это было тайным. Intel практически не пыталась улучшить 8080, была лишь до 3 с небольшим МГц поднята тактовая частота. Фактически 8-битный рынок был передан фирме Zilog с родственным i8080 процессором z80, который смог довольно успешно противостоять главному конкуренту, «терминатору» 6502.
В СССР и России отечественный клон i8080 стал основой многих массовых компьютеров, сохранявших популярность до начала 90-х. Это, конечно, Радио-86РК, Микроша, многоцветные Орион-128, Вектор и Корвет. Однако в войне клонов победили дешёвые и улучшенные клоны ZX Spectrum на основе z80.
Это уже настоящий ПК
В начале 1976 Intel был представлен процессор 8085, совместимый с 8080, но значительно превосходивший своего предшественника. В нём уже стало ненужным питание 12 вольт и упростилась схема подключения, была улучшена работа с прерываниями, использовалась тактовая частота от 3 до весьма солидных 6 МГц, система команд была расширена весьма полезными инструкциями: 16-разрядным вычитанием, 16-разрядным сдвигом вправо всего за 7 тактов (это очень быстро), 16-разрядным вращением влево через флаг переноса, загрузкой 16-разрядного регистра с 8-разрядным смещением (эту команду можно использовать и с указателем стека SP), запись регистра HL по адресу в регистре DE, аналогичное чтение HL через DE. Все упомянутые инструкции кроме сдвига вправо выполняются за 10 тактов – это иногда существенно быстрее, чем их аналоги или эмуляция на z80. Были добавлены ещё несколько инструкций и даже новый флаг признаков. Кроме того, были ускорены на такт многие инструкции для работы байтовыми данными. Это было очень существенно, так как на многих системах с i8080 или z80 вводились такты задержки, которые из-за наличия лишних тактов на i8080 могли вытянуть время исполнения почти в два раза. Например, в отечественном компьютере Вектор инструкции типа регистр-регистр выполнялись 8 тактов, а если бы там стоял i8085 или z80, то эти же инструкции выполнялись бы только за 4 такта. Инструкция XTHL стала быстрее даже на два такта. Однако, некоторые инструкции, например, 16-битный инкремент и декремент, PUSH и условные возвраты стали на такт медленнее.
8085 имеет встроенную поддержку работы с прерываниями, которая во многих случаях позволяет обходиться без отдельного контроллера прерываний в системе, и последовательный порт ввода-вывода.
Однако, могу опять повторить формулу «по неизвестным автору причинам» Intel отказалась использовать i8085 в качестве главного процессора. Лишь в СССР/РФ в начале 90-х на основе отечественного клона ИМ1821ВМ85А были попытки усовершенствовать некоторые системы, например, компьютер Вектор. Фактически фирма Intel дала z80 «зеленый цвет». Спустя несколько лет в битве за 16-битный рынок Intel повела себя совершенно иначе, выиграв тяжбу по запрещению продаж процессоров v20 и v30 в США. Интересно, что упомянутые процессоры японской фирмы NEC могли переключаться в режим полной бинарной совместимости с i8080, что сделало их самыми быстрыми процессорами архитектуры i8080.
Другая тайна фирмы Intel – в отказе от публикации расширенной системы команд. Однако один из официальных производителей этих процессоров опубликовал всю систему команд. Каковы причины такого странного отказа? Можно лишь гадать. Может Zilog тогда играл роль AMD и создавал видимость конкуренции, а i8085 мог обрушить Zilog. Может дело в желании сохранять систему команд поближе к проектируемому тогда i8086? Последнее кажется сомнительным. Intel 8086 был выпущен спустя более 2 лет после выпуска 8085 и трудно поверить, что в 1975 уже была известна система его команд. И в любом случае, совместимость как с 8080, так и с 8085 на i8086 достижима только с использованием макропроцессора, заменяя иногда одну команду i8080/i8085 на несколько своих.
Motorola 6800 и близкие родственники
Процессоры Motorola всегда отличались наличием нескольких очень привлекательных «изюминок» при одновременном наличие каких-то несуразных по абстрактности и малопрактичности архитектурных решений. Главная «изюминка» всех рассматриваемых процессоров – это второй полноценный и очень быстрый регистр-аккумулятор.
6800 из-за единственности громоздкого для 8-битной архитектуры 16-битного индексного регистра получился неудобным для программирования и использования изделием. Он был выпущен ещё в 1974, ненамного позже 8080, но так и не стал основой для какой-либо известной компьютерной системы.
6809 был выпущен в 1978, когда с 8086 уже началась 16-битная эпоха, и имеет весьма развитую систему команд, включая умножение двух байтовых аккумуляторов с получением 16-разрядного результата за 11 тактов (для сравнения, 8086 требует от 70 тактов на подобную операцию). Два аккумулятора могут в нескольких случаях группироваться в один 16-разрядный, что даёт быстрые 16-битные инструкции. 6809 имеет два индексных регистра и рекордное среди 8-битных процессоров число методов адресации – 12. Среди методов адресации есть уникальные для 8-битных чипов, такие как индексная с автоинкрементом или декрементом, относительно счётчика команд, индексная со смещением. 6809 имеет интересную возможность использовать два типа прерываний: можно одновременно использовать быстрые прерывания с частичным автоматическим сохранением регистров и прерывания с полным сохранением регистров – у 6809 есть три входа для сигналов прерывания FIRQ (быстрое маскируемое), IRQ (маскируемое), NMI (немаскируемое). Также иногда удобны в использовании быстрые инструкции чтения и установки сразу всех флагов.
Однако, операции с памятью требует на такт больше, чем 6502. Индексные регистры так и остались неуклюжими 16-битными динозаврами в 8-битном мире, некоторые операции просто шокируют своей медленностью, например, пересылка одного байтового аккумулятора в другой занимает 6 тактов, а обмен их содержимым – 8 тактов (сравните с 8080, где 16-битный обмен проходит за 4 такта)! Зачем-то предлагаются сразу два указателя стека, возможно это было влияние тупиковой архитектуры VAX-11 – в 8-битной архитектуре с 64 КБ памяти выглядит очень несуразно. И даже наличие инструкции с интересным названием SEX всех проблем 6809 устранить не может. В целом, 6809 всё же несколько быстрее 6502 на той же частоте, но требует такую же по быстродействию память. Мне удалось сделать деление для 6809 с 32-разрядным делимым и 16-разрядным делителем (32/16=32,16) за чуть более 520 тактов, для 6502 у меня не получилось добиться менее 650 тактов. Второй аккумулятор – большое преимущество, но другие возможности 6502, в частности, инвертированный перенос, сводят это преимущество только к означенным 25%. А вот умножение на 16-битною константу оказалось медленнее, чем табличное для 6502 с таблицей на 768 байт. 6809 позволяет писать довольно компактные коды, используя адресацию установленной страницы (direct page), но эта адресация делает коды довольно путанными. Суть этой адресации в установке старшего байта адреса данных в специальном регистре и указании только младшего байта адреса в командах. Такая же система только с фиксированным значением старшего байта используется в 6502, где она называется адресацией нулевой страницы (zero page). Адресация установленной страницы – это прямой аналог использования сегментного регистра DS в x86 только не для сегментов размером 64 КБ, а для сегментиков размером всего 256 байт. Ещё одна надуманность архитектуры 6800 в использовании порядка байт от старшего к младшему (Big Endian), что притормаживает 16-битные операции сложения и вычитания.
Можно предположить, что 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. Компьютерные рынки 80-х отличала значительная нетранспарентность и Tandy Coco распространялись в основном только в США, а Драконы помимо собственно Великобритании получили некоторую популярность и в Испании. Во Франции 6809 почему-то стал основой для массовых компьютеров 80-х серии Thomson, которые так и остались практически неизвестными где-либо ещё кроме Франции. 6809 также использовался в качестве второго процессора по крайней мере в двух системах: в серии Commodore SuperPET 9000 и в малотиражной и ныне почти забытой приставке для TUBE-интерфейса компьютеров BBC Micro. Использовался этот процессор и в других менее известных автору системах, в частности, японских. Он также получил некоторое распространение в мире игровых консолей. Стоит упомянуть одну из таких консолей, Vectrex, которая использует уникальную технологию – векторный дисплей.
Цветной КоКо 3
Как и 8080, 8085 или z80 6809 очень трудно называть чисто 8-битным. А 6309 даже формально трудно назвать 8-битным, его производила японская фирма Toshiba (точный год начала его производства мне найти не удалось) как процессор, полностью совместимый с 6809. Однако, этот процессор можно было переключать в новый режим, который при сохранении почти полной совместимости с 6809 предоставлял почти на порядок большие возможности. Эти возможности были скрыты в официальной документации, но были опубликованы в 1988 в сети Usenet. Были добавлены ещё два аккумулятора, но инструкции с ними существенно медленнее, чем с первыми двумя. Сильно сокращено время исполнения большинства инструкций. Добавлены ряд команд, среди которых просто фантастическое для процессоров такого класса знаковое деление 32-битного делимого на 16-битный делитель (32/16=16,16) за 34 такта, причем делитель берется из памяти. Появилось также 16-разрядное умножение с 32-разрядным результатом за 28 тактов. Были также добавлены очень полезные инструкции для быстрого копирования блоков памяти с временем исполнения 6 + 3n, где n – это число копируемых байт, копировать можно как с уменьшением, так и с увеличением адресов. Эти же инструкции можно использовать и для быстрого заполнения памяти заданным байтом. При их исполнении могут происходить прерывания. Появились ещё новые битовые операции, нуль-регистр и др. Были ещё добавлены прерывания при исполнении неизвестной инструкции и при делении на 0. В каком-то смысле, 6309 – это вершина технологических достижений среди 8-битных процессоров или точнее процессоров с размером адресуемой памяти 64 КБ.
6309 полностью совместим по клеммам с 6809, что сделало его популярным апгрейдом для цветных Tandy или Драконов. Существуют и специальные версии ОС, использующих новые возможности 6309.
MOS Technology 6502 и WDC 65816
Это процессор с очень драматической судьбой. Ни один другой процессор в этом с ним сравниться не может. Его появление и внедрение сопровождалось очень большими по размаху и последствиям событиями. Перечислю некоторые из них:
- ослабление фирмы-гиганта Motorola, возможности которой какое-то время превосходили возможности Intel;
- уничтожение фирмы MOS Technology;
- прекращение развития 6502 и его стагнационный выпуск практически без модернизации.
Всё началось с того, что в Motorola по неизвестным вполне причинам отказались поддержать инициативных молодых инженеров, предлагавших улучшить в целом довольно посредственный процессор 6800. Им пришлось покинуть компанию и продолжить свои наработки в небольшой, но перспективной фирме MOS Technology, где они вскоре подготовили два процессора 6501 и 6502, сделанных по технологии NMOS. Первый был совместим по разъему с 6800, а в остальном они были идентичны. Команде 6501/6502 удалось успешно внедрить новые технологию производства чипов, что радикально удешевило новые процессоры. В 1975 MOS Technology могла предлагать 6502 за $25, в то время как стартовая цена на Intel 8080 и Motorola 6800 была в 1974 $360. В 1975 Motorola и Intel снизили цены, но они все равно были близки к $100. Специалисты MOS Technology утверждали, что их процессор до 4-х раз быстрее, чем 6800. Мне это кажется сомнительным: 6502 гораздо быстрее может работать с памятью, но второй аккумулятор 6800 очень ускорял многие вычисления. Оценочно могу предположить, что 6502 был в среднем быстрее не более чем в 2 раза. Motorola начала судебный процесс против своих бывших сотрудников – те якобы использовали многие технологические секреты фирмы. В ходе процесса удалось установить, что один из инженеров, ушедших из Motorola, вынес некоторые конфиденциальные документы по 6800, действуя вопреки установкам своих коллег. Был ли это его собственный поступок или за ним стояли какие-то направляющие силы до сих пор неизвестно. По этой и по другим не совсем ясным причинам Motorola выиграла процесс и фирма MOS Technology, чьи финансовые возможности были весьма невелики, была присуждена к выплате значительной суммы в $200000 и к отказу от производства 6501. Intel в похожей ситуации с Zilog действовала совсем не так.
Далее в истории появляется легендарная фирма Commodore и её не менее легендарный основатель Jack Tramiel, в тени которого находилась фигура главного финансиста фирмы, определяющего её политику – человека по имени Irving Gould. Джек получил кредит у Ирвина и на эти деньги, используя несколько, мягко сказать, недобросовестную тактику, вынудил MOS Tecchnology стать частью Commodore. После чего, возможно и вопреки желанию Трамела, вынужденного уступать Гуду, разработка 6502 практически остановилась и это при том, что ещё в 1976 удалось произвести опытные образцы 6502 с рабочими частотами до 10 МГц, хотя сообщение об этом появилось только спустя многие годы от человека по имени Bill Mensch (он был в команде, покинувшей Motorola), который не раз делал громкие, но по большому счету пустые заявления и сыграл в судьбе 6502 довольно неоднозначную роль. Главный разработчик 6502 Chuck Peddle навсегда был отстранён от разработки процессоров. 6502 продолжили производить не только в Commodore, но и в фирме ушедшего из Commodore Билла Менша Western Design Center (WDC). Любопытно, что никто из прежней команды 6502 не работал с ним в дальнейшем.
На этом драма вокруг 6502 не закончилась. В 1980 в журнале AIM65 Interactive фирмы Rockwell появилась короткая анонимная статья, о том, что все 6502 несут в себе опасного бага, который получил название JMP (xxFF). Тон статьи предполагает, что-то совершенно из ряда вон выходящее. Впоследствии этот настрой перешёл в позицию фирмы Apple по этому вопросу и стал неким мейнстримом. Хотя никакого «бага» строго говоря не было. Конечно, специалисту, привыкшему к комфортным процессорам больших систем тех лет, одна из особенностей, вполне уместных и даже полезных среди микропроцессоров, могла показаться чем-то раздражающим, багом. Но на самом деле это, задевшее чьи-то чувства, поведение было описано в официальной документации от 1975 года и в учебниках по программированию, вышедших до появления упомянутой статьи. «Баг» был ликвидирован Билом Меншем, сделавшим 65С02 (CMOS 6502) предположительно к 1983, т. е. уже после выпуска 65816. В то время как Intel, Motorola и другие сделали уже 16-битные процессоры новых поколений, 6502 был лишь микроскопически улучшен и сделан искусственно частично несовместимым с самим собой. Помимо устранения «бага», были сделаны ряд изменений, которые, в частности, привели к изменению в ходе исполнения нескольких инструкций, которые стали медленнее на такт, но при этом в каком-то надуманном академическом смысле они стали более правильными. Но, надо признать, что несколько новых инструкций оказались ожидаемыми и полезными. С другой стороны, абсолютное большинство новых инструкций лишь занимали кодовое пространства, почти ничего не добавляя к возможностям 6502, что оставляло меньше новых кодов для возможных дальнейших модернизаций. Commodore и японская Ricoh (производитель популярнейших игровых консолей NES) не приняли этих изменений. Автор этого материала сам сталкивался несколько раз с проблемой этого «бага». Ничего не зная о нем, писал программы для Коммодоров. Потом одну из них перенес на системы, где использовался набор команд 65С02. Возникла несовместимость, пришлось менять коды, делать условную компиляцию. Код для 65С02 получился более громоздким и медленным. Потом поднимал этот вопрос на форуме 6502.org, где большинство участников из мира Apple. Спросил, может ли кто-нибудь привести пример, когда означенный «баг» рушил программу. Получил только эмоциональные и общие замечание, конкретного примера так и не было предложено.
Баг!!!
65C02 был лицензирован многим фирмам, в частности, NCR, GTE, Rockwell, Synertek и Sanyo. Использовался в Apple II, начиная с моделей IIe, хотя многие IIe использовали NMOS 6502. Вариант 65С02 6512 использовался также в поздних моделях BBC Micro. Atari использовала NMOS 6502. Фирмы Synertek и Rockwell помимо CMOS 6502 производили и NMOS 6502. Кстати, NMOS 6502 имеет свой набор недокументированных инструкций, природа которых совершенна отлична от «секретных» команд 8085. В 6502 эти инструкции появились как побочный эффект использованной технологии, поэтому большинство из них скорее бесполезны, но несколько, например, загрузка или выгрузка одной командой сразу двух регистров и некоторые другие могут сделать код более быстрым и компактным.
Были и другие попытки модернизировать 6502. В том же 1979 появилась статья, что для компьютеров Atari готовится к производству процессор 6509 (не путать с появившимся позже процессором с таким же названием фирмы Commodore), в котором ожидалось ускорение исполнения команд на 25% и много новых инструкций. Но по неизвестным в точности причинам производство этого процессора так и не состоялось. Commodore проводила лишь микроскопические модернизации. Там, в частности, перешли на технологию HMOS и изготовление статических ядер, что позволяло притормаживать процессоры. С точки зрения программирования самым интересным является процессор 6509, который пусть и в очень примитивной форме с помощью всего двух специально выделенных для этой цели инструкций позволяет адресовать до 1 МБ памяти. В сверхпопулярных Коммодорах 64 и 128 стояли процессоры 6510/8510, а в менее удачливых серии 264 — 7501/8501. Эти процессоры имели лишь соответственно 6 и 7 встроенных битовых портов ввода-вывода, при этом 7501/8501 не поддерживали немаскируемых прерываний. Фирма Rockwell производила вариант 65C02 со своим расширенным 32 битовыми операциями (похожи на битовые инструкции z80) набором инструкций, однако, насколько мне известно, в компьютерах такие процессоры не использовались и сами эти битовые инструкции имели значение скорее только для использования во встроенных системах.
Последняя сцена драмы с участием 6502 обозначилась в недопущении компьютеров на базе 6502 с частотой 2 МГц на рынок США в первой половине 80-х. Это коснулось иностранца-англичанина BBC Micro, их производившая фирма Acorn сделала большую партию компьютеров для США, но, как оказалось, зря. Сработала какая-то блокировка и компьютеры пришлось срочно переделывать под европейские стандарты. Полуамериканские, но формально канадские компьютеры Commodore CBM II, несмотря на некоторые проблемы (в частности, по соответствию стандартам на электрооборудование), были всё же допущены. Возможно из-за того, что у них не было графических режимов и даже цветного текста – этого не мог компенсировать даже стильный Porsche-дизайн. Последним в списке неудачников оказался 100% американский Apple III – известно, что Стив Джобс сделал много, чтобы этот компьютер не состоялся. Он требовал явно невыполнимых спецификаций. Узнаем ли мы когда-нибудь его мотивы? Только в 1985, когда эпоха 8-битной техники начала уходить, появился Commodore 128, который мог использовать в одном из своих режимов 6502 с тактом на 2 МГц. Но и тут получился скорее анекдот, так как этот режим практически не поддерживался и программ для него практически нет. Только во второй половине 80-х в США стали производить приставки-ускорители для Apple II, а с 1988 и модель Apple IIc+ c процессором на 4 МГц. Почему так случилось? Возможно потому, что 6502 на 2 или 3 МГц (а такие уже производились в самом начале 80-х) на ряде задач и в особенности с играми могли успешно конкурировать с системами на основе Intel 8088 или Motorola 68000. В 1991 волевым решением корпорация Commodore закрыла интересный, хотя и запоздалый проект С65 на базе процессора 4510 с частотой 3.54 МГц. 4510 – это самый быстрый 6502, сделанный только в 1988, в нём была проведена наконец упоминавшаяся раннее оптимизация циклов, давшая 25% прирост скорости. Таким образом, процессор в С65 по быстродействию близок к системам с 6502 на 4.5 МГц. Удивительно, но этот самый быстрый 6502 с расширенным набором инструкций (в каких-то деталях это расширение получилось более удачным, чем в 65816) нигде с тех пор так и не нашёл применения.
Антиреклама – множественные Porsche PET в апартаментах злодея из Жемчужины Нила (1985)
Теперь несколько слов о системе команд 6502. Главная особенность этого процессора в том, что его сделали почти максимально быстрым, практически без лишних тактов, которых особенно много в процессорах 8080/8085/z80/8088/68000. Фактически это была идеология появившихся позднее и под прямым влиянием 6502 процессоров архитектуры RISC. Эта же идеология доминирует, начиная с серии Pentium, и среди процессоров Intel. Кроме того, 6502 максимально быстро реагировал на прерывания, что делало его очень полезным в некоторых встроенных системах. У 6502 один аккумулятор и два индексных регистра, кроме того первые 256 байт памяти можно использовать в специальных командах либо как более быструю память, либо как набор 16-разрядных регистров (которые почти идентичны по своей функциональности регистрам BC и DE в 8080/z80) для довольно мощных способов адресации. Некоторые арифметические команды (сдвиги, вращение, инкремент и декремент) можно использовать с памятью непосредственно, не используя регистры. 16-разрядных команд нет – это 100% 8-битный процессор. Поддерживаются все основные флаги кроме характерного архитектуре Intel флага чётности. Есть ещё несколько необычный флаг малополезного 10-го режима. Процессоры Intel и Motorola используют специальные корректирующие инструкции для работы с десятичными числами, а 6502 может переключаться в 10-й режим, что делает его преимущество по скорости с 10-ми числами ещё более значительным, чем с двоичными. Очень впечатляет наличие для 6502 табличного умножения 8-битных операндов с получением 16-битного результата за менее чем 30 тактов, при размере вспомогательной таблицы в 512 байт. Медленнее всего у 6502 получаются операции массового копирования памяти – от 14 тактов на байт.
65816 был выпущен WDС в 1982. Конечно, это был большой шаг вперёд, но явно запоздалый и с большими архитектурными изъянами. 65816 уже никем не рассматривался как конкурент для основных процессоров Intel или Motorola – это уже был второстепенный аутсайдер, который уже как-то запрограммировано был настроен на дальнейшую потерю позиций. 65816 имел два важных плюса – он был сравнительно дешёв и совместим с по-прежнему весьма популярным 6502. В последующие годы Бил Менш даже не пытался как-то улучшить своё детище, сделать оптимизацию циклов, заменить адресацию нулевой страницы расширенной с использованием регистра Z (это было сделано в 4510), добавить хотя бы умножение,… WDC только повышала предельные тактовые частоты, дойдя к середине 90-х до 14 МГц (такой процессор использовался в популярном ускорителе для С64 SuperCPU на частоте 20 МГц). Однако даже сейчас (2018!) WDC предлагает 65816 почему-то только на тех же 14 МГц. 65816 может использовать до 16 МБ памяти, но используемые для этого методы адресации выглядят далёкими от оптимальных. Например, индексные регистры могут быть только 8- или 16-разрядными, первые 64 КБ памяти имеют специальный режим адресации, указатель стека 16-битный,… 65816 имеет 16-разрядное АЛУ, но 8-разрядную шину данных, поэтому на арифметических операциях он лишь примерно на 50% быстрее чем 6502. Тем не менее 65816 был выпущен в количестве более миллиарда. Конечно, ряд команд 65816 явно дополняют пробелы в архитектуре 6502, например, команды массового копирования памяти за 7 тактов на байт.
Есть ещё вариант 65816 65802, который использует 16-разрядную шину адреса и совместим по разъему с 6502. Предлагались апгрейды для Apple II на основе этого процессора, но небольшого ускорения с таким апгрейдом возможно получить только на специально для него написанных программах.
6502 использовался в большом числе компьютерных систем, самые популярные из которых – это 8-битные Commodore, Atari, Apple, NES. 65816 использовался в довольно популярном компьютере Apple IIgs, в игровой консоли Super NES, а также в редком английском компьютере Acorn Communicator.
Можно лишь попытаться фантазировать на тему о том, что бы было, если бы 6502 смог развиваться теми же темпами, что и его конкуренты. Мне кажется, что постепенный перенос памяти нулевой страницы в регистры и постепенное расширение системы команд с одновременной оптимизацией циклов, позволило бы «терминатору» 6502 оставаться в лидерах по быстродействию до начала 90-х. Введение режима 16, а затем 32 бит позволило бы использовать большие объемы памяти и более быстрые команды. Смогли бы его конкуренты что-то этому противопоставить?
Хочется закончить некоторыми общефилософскими рассуждениями. Почему 6502 был приторможен и лишен гораздо более яркого будущего? Возможно из-за того, что он реально мог очень потеснить крупные фирмы и создать совершенно новую реальность. Но была ли команда 6502 настроена на такое? Скорее нет, они просто хотели сделать как лучше, не думая о политике и опережая время.
Zilog Z80
Этот процессор стал наряду с 6502 основным процессором первых персональных компьютеров. В истории его появления и использования нет никаких насыщенных драматизмом событий. Есть только некоторая тайна в самом факте ухода основателя Zilog из Intel и в дальнейших отношениях между этими фирмами. Возможно есть ещё какая-то интрига и в неуспехе Zilog сделать следующее поколение процессоров. Z80 начали производить в 1976 и его варианты производят до сих пор. Когда-то даже сам Билл Гейтс объявил о поддержке систем на основе z80.
Z80 – это более удобный для включения в компьютерные системы процессор, чем 8080. Он требует только одного напряжения питания и имеет встроенную поддержку регенерации динамической памяти. Кроме того, он при полной совместимости с 8080 имеет довольно много новых команд, второй набор основных регистров и несколько совершенно новых регистров. Любопытно, что в Zilog отказались от использования мнемоник ассемблера 8080, а стали использовать свои собственные мнемоники, более подходящие для расширенной системы команд z80. Подобная история случилась с ассемблером Intel x86 в мире программного обеспечения GNU, там тоже почему-то используют по умолчанию свои собственные соглашения по записи программ на ассемблере.
Среди новых команд z80 особенно впечатляют команды массового копирования памяти за 21 такт на байт, а также интересная команда поиска байта в памяти. Однако наиболее интересна команда EXX, меняющая местами содержимое 48 байт регистровой памяти, регистры BC, DE, HL с их двойниками, которая выполняется всего за 4 такта! Даже 32-битным ARM понадобится на такую же операцию не менее 6 тактов. Остальные добавочные инструкции не так впечатляют, хотя иногда могут быть полезными. Добавлены ещё:
- 16-битное вычитание c заемом и 16-битное сложение с переносом за 15 тактов;
- унарный минус для аккумулятора за 8 тактов;
- возможность читать из памяти и писать в неё, используя регистры BC, DE, SP, IX,IY, а не только HL;
- сдвиги, вращения и ввод-вывод для всех 8-битных регистров;
- операции проверки, установки и сброса бита по его номеру;
- переходы по смещению (JR);
- команда цикла.
Большинство новых команд довольно медленные, но их правильное использование может все же сделать код несколько быстрее и существенно компактнее. Это особенно относится к использованию новых 16-разрядных регистров IX и IY, которые можно использовать для новых методов адресации.
Многие команды 8080 в z80 стали на такт быстрее и это очень заметное ускорение. Но основная для 16-битной арифметики команда ADD стала на такт медленнее, что делает арифметику в целом если и быстрее, то только чуть-чуть.
Система работы с прерываниями стала гораздо интереснее имеющейся у 8080. С z80 можно использовать как немаскируемые прерывания, так и три способа (один из них совместим с 8080) для работы с маскируемыми. Наиболее интересен режим маскируемых прерываний 2, который позволяет гибко менять адрес кода для обработки прерывания.
Z80 имеет ряд недокументированных инструкция, часть из них была документирована некоторыми фирмами и фактически является часть стандартных инструкций. Особенно полезны инструкции, позволяющие работать с отдельными байтами неуклюжих 16-битных регистров IХ и IY.
Конечно, z80 ещё в большей степени, чем 8080 имеет право называться слегка 16-битным. Гипотетический индекс разрядности у z80 явно чуть-чуть повыше, но при этом парадоксально, что АЛУ у z80 на самом деле 4-битное! На электронном уровне z80 и 8080 – совершенно разные чипы.
Много было написано про сравнение быстродействия z80 и 6502, так как эти процессоры очень широко использовались в первых массовых компьютерах. В этой теме есть несколько непростых моментов, без понимания которых очень трудно сохранять объективность. Благодаря наличию довольно большого числа регистров z80 естественно использовать на частоте большей, чем работает память. Поэтому z80 на 4 МГц может использовать ту же память, что и 6502 или 6809 на 1.3 МГц. По мнению многих опытных программистов, писавших коды для обоих процессоров, на одинаковой частоте 6502 в среднем примерно от 2.4 до 2.6 раз быстрее, чем z80. Автор этого материала с этим согласен. Только нужно добавить, что писать хорошие, быстрые коды для z80 – это очень непросто, нужно постоянно оптимизировать использование регистров, а для работы с памятью максимально задействовать стек. Если очень стараться, то по моему мнению можно свести разницу между z80 и 6502 до примерно 2.2 раз. А если не стараться и игнорировать тайминги, то легко можно получить разницу и до 4-х раз. В некоторых отдельных случаях z80 может показывать очень быструю работу. На задаче заполнения памяти z80, используя команду PUSH, может быть даже чуть быстрее 6502, но это ценой запрета прерываний. На копировании блоков памяти z80 только в 1.5 раза медленнее. Особенно впечатляет, что в делении 32-разрядного делимого на 16-делитель z80 медленнее только в 1.7 раз. Кстати, такое суперделение было реализовано российским программистом. Таким образом, получаем, что ZX Spectrum c z80 на 3.5 MHz примерно в полтора раза быстрее С64 с 6502 на 1 МГц. Стоит ещё отметить, что часть тактов в большинстве систем с z80 или 6502 отбирается у процессора схемами поддержки генерации видеосигнала, например, из-за этого у популярных компьютеров Amstrad CPC/PCW реальная частота процессора 3.2 МГц, а не полные 4. В системах на 6502 обычно можно отключать экран для получения максимальной процессорной производительности.
Z80 использовался в очень большом числе компьютерных систем. В США были очень популярны Tandy TRS-80, в Европе — ZX Spectrum, а позднее Amstrad CPC и PCW. Любопытно, что компьютеры Amstrad PCW сохраняли актуальность до середины 90-х и их массово и активно использовали по назначению до конца 90-х. В Японии и других странах производили довольно успешные во всем мире компьютеры MSX. Довольно популярный C128 мог также использовать z80, но тут пользователям был подстроен скорее конфуз – у этого позднего, 1985 года выпуска, 8-битного компьютера z80, тактированный официально 2 МГц, реально работает только на 1.6 МГц. Это медленнее даже, чем первые системы на 8080 середины 70-х. Номенклатура компьютеров для использования операционной системы CP/M насчитывает не менее трех дюжин довольно известных систем.
Такой ПК достойно выглядел даже в середине 90-х, но его z80 медленнее того, что в ZX Spectrum
Самая быстрая известная автору компьютерная система на основе z80 – это BBC Micro c TUBE-приставкой с z80 на 6 МГц, выпускавшейся с 1984. Процессор в этой системе работает на полной скорости, как говорят, «без тормозов».
Со второй половины 80-х начались работы по оптимизации циклов и добавлению новых команд для z80. В Японии для систем MSX TurboR производился процессор R800, совместимый с z80, но без задержек в циклах. В каком-то смысле можно сказать, что в R800 удалось систему команд z80 исполнять с таймингами 6502. Кроме того, в R800 было добавлено аппаратное 16-разрядное умножение с 32-разрядным результатом. Хотя при умножении на 16-разрядную константу, табличное умножение с таблицей на 768 байт получается на такт быстрее. Удивительно, но этот чудо-процессор конца 80-х, сравнимый по скорости с 80386, не пытались использовать в европейских или американских системах. В 21 веке производятся клоны z80 с таймингами почти как у R800. Их использует в различном оборудовании, в частности, в сетевых платах.
Texas Instruments TMS9900
Для этого очень особенного процессора кодов мне писать не доводилось. А это первый доступный для использования в персональных компьютерах 16-битный процессор. Он производился с 1976 года. Использует гораздо реже встречающийся порядок байт от старшего к младшему (Big Endian). Такой порядок используется ещё только в процессорах Motorola серий 6800 и 68000 и в архитектуре гиганта IBM/370. Все прочие процессоры данного обзора используют обратный порядок байт (Little Endian).
У TMS9900 есть всего три 16-битных регистра: счётчик команд, регистр состояний и регистр базы псевдорегистров. Этот процессор использует выделенный участок памяти размером 32 байта как 16 двубайтных регистра. Такое использование памяти чем-то напоминает нулевую страницу памяти в архитектуре 6502. Используя регистр базы, TMS9900 может очень быстро менять контекст. Система флагов отличается своеобразием, наряду с типичными флагами переноса, нуля (равенства), переполнения, чётности, есть ещё два уникальных флага признаков логического и арифметического меньше. Работа со стеком и подпрограммами напоминает RISC-процессоры будущего. Готового стека просто нет, его можно сделать использую один из псевдорегистров. При вызове подпрограммы выбирается новое значение для счетчика и базы и все три регистра сохраняются в псевдорегистрах нового контекста. Таким образом, вызов подпрограммы больше похож на вызов программного прерывания. TMS9900 имеет встроенный контроллер прерываний, рассчитанный на работу с аппаратными прерываниями числом до 16.
Первый 16-разрядный домашний компьютер – у него даже цветные спрайты есть
Система команд выглядит очень внушительно. Есть даже умножение и деление. Уникальная инструкция X позволяет исполнять одну инструкцию по любому адресу в памяти и переходить к следующей. Исполнение команд довольно медленное, самые быстрые инструкции выполняются только за 8 тактов, арифметические команды – за 14, зато умножение (16*16=32) за 52 такта и особенно деление (32/16=16,16) за 124 такта были наверное рекордно быстрыми среди процессоров 70-х.
TMS9900 требует три напряжения питания -5, 5 и 12 вольт и четыре фазы сигнала тактирования – это антирекорды среди известных мне процессоров.
TMS9900 использовался в довольно популярных в США компьютерах TI99/4 и TI99/4A, которые были «разгромлены» в войне цен компьютером Commodore VIC-20 к 1983. Серия TI99/4 – это редкий пример компьютеров, где производитель процессора и компьютера был одним и тем же.
Процессоры DEC PDP-11
С начала 70-х в мере началась 10-летняя эпоха доминирования фирмы DEC. Компьютеры DEC были существенно дешевле, производимых фирмой IBM и поэтому привлекли к себе внимание со стороны небольших организаций, для которых системы IBM были недоступны. С этих компьютеров начинается также эпоха массового профессионального программирования. Серия компьютеров PDP-11 оказалась очень удачной. Различные модели PDP-11 производили с середины 70-х до начала 90-х. В СССР они были успешно клонированы и стали первыми массовыми популярными компьютерными системами. Среди клонов компьютеры с названиями СМ ЭВМ, Электроника-60/81/85, ДВК-1/2/3, БК-0010/0011 (БК0010 – это первый ПК, которые стало возможным купить в магазине).
Однако, DEC продвигала также более дорогие и сложные компьютеры семейства VAX-11, ситуация вокруг которых отличалась некоторой политизированностью. И со второй половины 70-х DEC практически остановила развитие в линии PDP-11, в частности, так и не была введена поддержка 16-х чисел для ассемблера. Быстродействие систем PDP-11 также практически не менялось с середины 70-х.
PDP-11 использовали разные, совместимые по основной системе команд процессоры, например, LSI-11, F-11, J-11. В конце 70-х DEC сделала дешёвый процессор для микрокомпьютеров T-11. Однако, по неясным причинам он, несмотря на казалось бы большое и качественное программное обеспечение, которое можно было бы в перспективе перенести на систему его использующую, так и не был замечен производителями компьютерных систем. Единственным исключением стала одна модель игровой консоли фирмы Atari. T-11 нашёл себе массовое применение только в мире встроенного оборудования, хотя по возможностям он скорее слегка превосходил z80. В СССР выпускались процессоры К1801ВМ1, К1801ВМ2, К1801ВМ3, К1801ВМ4,… близкие процессорам DEC.
Систему команд процессоров архитектуры PDP-11 отличает почти полная ортогональность, приятное качество, но когда его доводят до крайности, это может создавать и нелепые команды. Система команд процессоров PDP-11 оказала влияние на многие архитектуры и в особенности на Motorola 68000.
Система команд PDP-11 строго 16-битная. Все 8 регистров общего назначения (а счетчик команд в этой архитектуре – это обычный регистр R7) – 16 разрядные, регистр состояний (содержит типичные флаги) 16-разрядный тоже, размер команд от 1-го до 3-х 16-разрядных слов. Каждый операнд в команде может быть (хотя есть исключения) любого типа – это и есть ортогональность. Среди типов – обычные регистр или память. Программисты в 80-е иногда не понимали, почему в системе команд Intel x86 нет команд типа память-память. Это влияние школы PDP-11, где запросто можно написать полные адреса у каждого операнда. Это, конечно, медленно и особенно медленно для систем с типичной с начала 90-х медленной памятью. К памяти можно обращаться и через регистр, регистр со смещением, регистр с авто-декрементаций или инкрементацией. Особенностью системы команд PDP-11 является возможность двойного косвенного обращения к памяти через регистр, например,
MOV @(R0)+,@-(R1)
означает то же, что и оператор языка С/C++
**–r1 = **r1++;
, где r0 и r1 декларируются как
signed short **r0, **r1;
Другой пример, команда
MOVB @11(R2),@-20(R3)
соответствует
**(r2-20) = **(r3+11);
, где r2 и r3 декларируются как
char **r2, **r3;
В популярных ныне архитектурах одной командой в таких случаях уже не обойтись, понадобится возможно не менее 10 команд. Можно также получать адрес относительно текущего значения счётчика команд. Приведу ещё пример с более простой адресацией. Команде
ADD #16,11(R4)
в архитектуре Intel x86 можно сопоставить
ADD [BX+11],16
В ассемблерах DEC принято писать операнды слева-направо, в отличие от Intel, где пишут справа-налево. Есть основание полагать, что GNU ассемблер для x86 делали под влиянием именно ассемблера PDP-11.
Команды умножения и деления только знаковые и доступны не на всех процессорах. Также опциональна арифметика десятичных чисел – это так называемая коммерческая арифметика по терминологии DEC. В качестве курьёза полной ортогональности приведу пример команды
MOV #11,#22
, которая после исполнения превращается в
MOV #11,#11
– это пример использования непосредственной константы в качестве операнда. Можно написать и так
MOV @(R0)+,#22
Другая курьёзная команда – это уникальная команда MARK, код которой нужно класть в стек и никогда нельзя использовать явно. Вызов подпрограмм в архитектуре PDP-11 также несколько своеобразен. Соответствующая команда сначала сохраняет выделенный регистр (может быть любым) в стеке, затем сохраняет счётчик команд в этом регистре и только затем записывает в счетчик команд новое значение. Команда возврата из подпрограммы должна сделать всю наоборот и знать, какой регистр был использован при вызове подпрограммы. Очень странные и непредсказуемые эффекты можно получить, используя счётчик команд как обычный регистр.
Конечно, тайминги команд не отличаются слишком скоростными характеристиками. Удивительно было когда-то узнать, что на отечественном компьютере БК команда пересылки из регистра в регистр занимает целых 14 тактов. Z80 делает 16-разрядную регистровую пересылку за 8. Однако, медленность БК вызвана не столько процессором, сколько плохим качеством отечественной памяти, под особенности которой БК пришлось приспособить. Если бы использовалась достаточно быстрая память, то и БК пересылал 16 регистровых бит за 8 тактов. Когда-то было много споров, что быстрее БК или Спектрум? Сразу надо сказать, что Спектрум – это при использовании верхних 32 КБ памяти один из самых быстрых массовых 8-битных персональных компьютеров. Поэтому неудивительно, что Спектрум быстрее БК, но не намного. А если бы БК работал с памятью без тормозов, то он был бы быстрее.
Отечественный 16-разрядный домашний компьютер (1985) – почти PDP-11 совместимый
К1802ВМ2, который использовался в ДВК, примерно в два раза быстрее К1801ВМ1, К1801ВМ3 ещё быстрее и близок по быстродействию к Intel 8086.
В старших моделях PDP-11 и близких им отечественных компьютерах процессор может адресовать до 4 МБ памяти, но одной программе при этом может выделяться не более 64 КБ.
Процессоры DEC VAX-11
Системы VAX-11 были довольно популярны в 80-е, особенно в высшем образовании. Сейчас трудно понять некоторые концепции, описанные в книгах тех лет, без знания особенностей архитектуры этих систем. VAX-11 были дороже PDP-11, но более ориентированы на универсальное программирование и всё же существенно дешевле систем IBM/370. Для архитектуры VAX был к середине 80-х сделан процессор V-11, а до этого времени использовались процессорные сборки.
Архитектура VAX-11 32-разрядная, она использует 16 регистров, среди которых как и на PDP-11 есть счётчик команд. Предполагается использование двух стеков, один из которых используется для хранения кадров-фреймов подпрограмм. Кроме того, один из регистров назначен для работы с аргументами вызываемых функций. Таким образом, для стеков выделены 3 из 16 регистров. Система команд VAX-11 не может не поражать своей огромностью и наличием весьма редкостных и часто уникальных команд, например, для работы с полями битов или несколькими типами очередей, для вычисления CRC, умножения 10-х строк,… Многие команды есть как в трехадресных вариантах (как ARM), так и в двухадресных (как х86), но есть и четырехадресные команды, например, расширенное деление EDIV. Конечно же есть поддержка работы с вещественными числами.
Но VAX-11 – это очень медленная для своего класса и цены система. Даже сверхпростейший 6502 на 4 МГц мог обогнать самый медленный из семейства VAX-11/30, а самые быстрые системы VAX-11 – огромные шкафы и «целые мебельные гарнитуры», по производительности оказываются на уровне первых PC AT. Когда появился 80286 стало ясно, что дни VAX-11 сочтены и даже торможение с внедрением систем на основе 80286 не могло уже ничего принципиально изменить. Более прямолинейные англичане из Acorn, сделав ARM в 1985, ничего не скрывая, заявили что ARM гораздо дешевле и заметно быстрее. VAX-11, тем не менее сохранял, актуальность до начала 90-х, имея всё же некоторые преимущества перед ПК, в частности, более быстрые системы для работы с дисками.
VAX-11 – это наверное последняя массовая система, в которой удобство работы на языке ассемблер считалось важнее быстродействия. В каком-то смысле, такой подход перешел на современные популярные языки сценариев.
На фотографии изображен VAX-11/785 – это тоже компьютер (1984) – самый быстрый среди VAX-11, по быстродействию процессора сравним с IBM PC AT или ARM Evaluation System
Удивительно, но в открытом доступе очень мало литературы по системам VAX-11. Как будто действует какой-то странный закон о забвении. С историей этой архитектуры связаны несколько эпизодов, близких к политике и коррелированных с историей СССР. Вполне возможно, что фактический отказ от развития архитектуры PDP-11 был вызван её дешевизной и успехами её клонирование в Советском Союзе. А клонирование VAX-11 стоило на порядок больших ресурсов и вело в тупик. Интерес к VAX-11 создавали, используя, например, используя розыгрыши типа знаменитого Кремлевского Вакса на 1 апреля 1984, в которой тогдашний лидер СССР Константин Черненко предлагал выпить водки по случаю подключения к сети Usenet. Другая шутка заключалась в том, что на некоторые чипы VAX-11 впечатывалось послание на ломаном русском языке о том, как хорош VAX-11. :)
Несколько систем VAX-11 доступны для использования через сеть. И это их выгодно отличает от систем IBM/370, c которыми они конкурировали.
Intel: от 8086 до 80486
Безусловно, что одним из самых лучших процессоров, из сделанных в 70-е, является 8086, а также его более дешевый почти аналог 8088. Архитектуру этих процессоров приятно отличает отсутствие механических заимствований и следований абстрактным теориям, продуманность и взвешенность архитектуры, сбалансированность и ориентированность на дальнейшее развитие. Из недостатков архитектуры x86 можно назвать её некоторую громоздкость и склонность к экстенсивному росту числа инструкций.
Одним из гениальных конструктивных решений 8086 стало изобретение сегментных регистров. Этим как бы одновременно достигались две цели – «бесплатная» перемещаемость программ, размером до 64 КБ (это до середины 80-х был очень даже достойный объем для компьютерной памяти для одной программы), и адресуемость до 1 МБ адресного пространства. Можно ещё заметить, что 8086 как и 8080 или z80 имеет ещё и специальное адресное пространство для портов ввода-вывода размером 64 КБ (y 8080 и z80 этот объем – 256 байт). Сегментных регистров всего четыре: для кода, для стека и два для данных. Таким образом, для быстрого использования доступны 64*4 = 256 КБ памяти, но это было очень много даже в середине 80-х. На самом деле проблем по размеру кода нет, так как можно использовать так называемые длинные вызовы подпрограмм с загрузкой и сохранением полного адреса из двух регистров. Есть только ограничение в 64 КБ на размер одной подпрограммы – это достаточно и для многих современных приложений. Некоторую проблему создаёт невозможность быстрой адресации к массивам данных размером более 64 КБ – при использовании таких массивов нужно загружать сегментный регистр и собственно адрес при каждом обращении, что снижает скорость работы с такими большими массивами в несколько раз.
Архитектура 8086 сохранила близость к архитектуре 8080, что позволило сравнительно небольшими усилиями переносить программы с 8080 на 8086 и особенно в случае, если были доступны исходные тексты программ.
Команды 8086 не отличаются высокой скоростью исполнения, но вполне сопоставимы с конкурентами, например, Motorola 68000, который появился на год позже. Одной из новинок, немного разгоняющих в целом неспешный 8086, стала очередь команд.
8086 использует восемь 16-разрядных регистров, некоторые из которых можно использовать как два байтовых регистра, а некоторые как индексные. Таким образом, регистры 8086 отличает некоторая разнородность, но она хорошо сбалансирована и регистры очень удобны в использовании. 8086 использует те же флаги, что и 8080, плюс несколько новых. Например, появился флаг типичный для архитектуры PDP-11 – пошагового исполнения.
8086 позволяет использовать очень интересные режимы адресации, например, адрес можно составить из суммы двух регистров и константного 16-разрядного смешения, на который накладывается значение одного из сегментных регистров. Из суммы, составляющей адрес, можно оставить только два или даже одно слагаемое. Такое на PDP-11 одной командой не получится. Большинство команд 8086 не позволяют иметь оба операнда типа память, один из операндов должен быть регистром. Но есть строковые команды, которые как раз умеют работать с памятью, используя адреса. Строковые команды позволяют делать быстрое блочное копирование (17 тактов на байт или слово), поиск, заполнение, загрузку и сравнение. Кроме того, строковые команды можно использовать при работе с портами ввода-вывода. Очень интересна идея 8086 использовать префиксы команд, позволяющие без существенного усложнения схем кодирования команд использовать часто очень полезную дополнительную функциональность.
8086 имеет одну из лучших среди всех компьютерных систем организацию работы со стеком. Используя только два регистра (BP и SP), 8086 позволяет решать все проблемы при организации вызовов подпрограмм с параметрами.
Среди команд есть знаковые и беззнаковые умножение и деление. Есть даже уникальные команды десятичной корректировки для команд умножения и деления. Трудно сказать, что в системе команд 8086 чего-то явно не хватает. Скорее наоборот. Деление 32-разрядного делимого на 16-разрядный делитель с получением 32-разрядного частного и 16-разрядного остатка может потребовать до 300 тактов – не особенно быстро, но в несколько раз быстрее, чем такое деление на любых 8-битных процессорах (кроме 6309) и сравнимо по скорости с 68000. Деление на х86 имеет одну неожиданную особенность – оно не ставит никаких флагов признаков.
Можно резюмировать, что 8086 – это очень удачный процессор, сочетавший в себе как удобство программирования, так и привязанность к характерным для своего времени ограничениям по объему памяти. 8086 использовался сравнительно редко, уступив более дешевому 8088 почетное место быть первым процессором для основной для персональных компьютеров нашего времени архитектуры IBM PC. 8088 использовал 8-разрядную шину данных, что делало его несколько более медленным, но зато позволяло строить на его основе более доступные покупателям системы.
80186 и 80286 появились в 1982. Таким образом, можно предположить, что Intel имела две почти независимые команды разработчиков. 80186 – это улучшенный несколькими командами и сокращенными таймингами 8086 плюс несколько встроенных в чип схем, типичных для архитектуры х86: генератором тактов, таймерами, DMA/ПДП, контроллером прерываний, генератором задержек и др. Такой процессор мог бы сильно упростить производство основанных на нём компьютеров, но он в силу каких-то неясных причин в ПК почти никогда не использовался. Автору известна только система BBC Master 512 на основе компьютера BBC Micro, который не использовал встроенные схемы, даже таймер, но было ещё несколько систем, использующих 80186. Адресуемая память у 80186 осталась в как и у 8086 размером в 1 МБ.
80286 имел ещё лучшие тайминги, чем 80186, среди которых особо выделяется просто фантастическое деление (32/16=16,16) за 22 такта – с тех пор деление делать быстрее так и не научились! 80286 поддерживает работу с всеми новыми командами 80186 плюс много команд для работы в новом, защищенном режиме. 80286 стал первым процессором с встроенной поддержкой защищенного режима, который позволял организовать защиту памяти, правильное использование привилегированных инструкций, доступ к виртуальной памяти. Хотя работа в новом режиме создавала много проблемных моментов (защищенный режим был сделан скорее неудачно) и сравнительно редко использовалась, это был большой прорыв вперёд. В этом новом режиме сегментные регистры приобрели новое качество, позволяя использовать до 16 МБ адресуемой памяти и до 1 ГБ виртуальной памяти на задачу. Большой проблемой 80286 была невозможность переключаться из защищенного режима в реальный, в котором работали тогда большинство программ. Используя «секретную» недокументированную инструкцию LOADALL, можно было использовать 16 МБ в памяти и в реальном режиме.
В 80286 вычисление адресов в операндах инструкций стало производиться отдельными схемами и перестало замедлять исполнение команд. Это добавило интересные возможности, например, командой
LEA AX,[BX+SI+4000]
всего за 3 такта стало возможным выполнить два сложения и перенос результата в регистр AX!
Число производителей и конкретных систем, использующих 80286 огромно, но, конечно, первыми стали компьютеры IBM PC AT с почти фантастическими среди персональных компьютеров показателями по быстродействию. С этих компьютеров память начала отставать по быстродействию от процессора, появились состояния задержки, но тогда это казалось ещё чем-то временным.
Защищенный режим 80286 был крайне неудобен, делил всю память на сегменты размером не более 64 КБ и требовал непростой программной поддержки работы с виртуальной памятью. 80386, появившись в 1985, сделал работу в защищенном режиме вполне комфортной, позволил использовать до 4 ГБ адресуемой памяти и легко переключаться между режимами. Кроме того, для поддержки многозадачности для программ для 8086 был сделан режим виртуального 8086. Для виртуальной памяти стало возможным использовать сравнительно лёгкий в управлении страничный режим. 80386 при всех своих новшествах сохранил полную совместимость с программами, написанными для 80286. Среди новшеств 80386 можно ещё назвать вытягивание регистров до 32-бит и добавление двух новых сегментных регистров. Тайминги изменились, но неоднозначно. Был добавлен быстрый битовый сдвигатель (barrel shifter), что позволило делать множественные сдвиги с таймингами одного. Однако, это новшество очень сильно почему-то очень замедлило исполнение команд циклических сдвигов. Умножение стало чуть медленнее, чем у 80286. Работа с памятью стала, наоборот, чуть быстрее, но это не относится к строковым командам, которые остались быстрее у 80286. Автору этого материала не раз приходилось сталкиваться с мнением, что в реальном режиме с 16-битным кодом 80286 в итоге всё же чуть-чуть быстрее.
В 80386 были добавлены новые команды, большинство из которых лишь давали новые способы для работы с данными, фактически дублируя с оптимизацией для некоторых случаев имеющиеся. Например, были добавлены команды:
- для проверки, установки и сброса бита по номеру, похожие на те, что были сделаны для z80;
- побитового сканирования BSF и BSR;
- копирования значения со знаковым или нулевым расширением, MOVSX и MOVZX;
- установки значения в зависимости от значений флагов операций SETxx;
- сдвигов сдвоенных величин SHLD, SHRD.
Процессоры x86 до появления 80386 могли использовать только короткие, со смещением один байт условные переходы – этого было часто очень недостаточно. С 80386 стало возможным использовать смещения из двух байт, причем несмотря на то, что код новых переходов стал в два раза длиннее, время его исполнения осталось таким же как и у прежних, коротких переходов.
Радикально была улучшена поддержка отладки введением 4-х аппаратных точек останова, используя их, стало возможным останавливать программы даже на адресах в памяти, которую нельзя изменять.
Основной защищенный режим стал гораздо проще для управления, чем в 80286, что сделало ряд унаследованных команд ненужными рудиментами. В основном защищенном, так называемом flat-режиме используют сегменты размером до 4 ГБ, что превращает все сегментные регистры в малозаметную формальность. А полудокументированный нереальный режим позволил даже использовать всю память как и во flat-режиме, но из простого для установки и управления реального режима.
С 80386 фирма Intel отказалась делиться своими технологиями, став фактически монопольным производителем процессоров для архитектуры IBM PC, а с ослаблением позиций Motorola, и для других архитектур персональных компьютеров. Системы на основе 80386 были очень дороги до начала 90-х, когда они стали наконец доступны массовым потребителям на частотах от 25 до 40 МГц. C 80386 IBM стала утрачивать позиции ведущего производителя IBM PC совместимых компьютеров. Это проявилось, в частности, в том, что первым ПК на основе 80386 стал в 1986 компьютер фирмы Compaq.
Трудно не сдержать восхищение теми объёмам работы, которая была проделана создателями 80386 и её результатами. Осмелюсь даже высказать предположение, что 80386 заключает в себе больше достижений, чем все технологические достижения человечества до 1970, а может и до 1980.
Довольно интересна тема ошибок в 80386. Напишу про две. Первые чипы имели некоторые команды, которые затем исчезли из руководств по этим процессорам и перестали исполняться на более поздних чипах. Речь идет о командах IBTS и XBTS. У всех 80386DX/SX, производимых как AMD, так и Intel (что обнаруживает их любопытную внутреннюю идентичность), есть очень странный и неприятный баг, который проявлялся в уничтожение значения регистра EAX, если после записи в стек или выгрузке оттуда всех регистров командами POPAD или PUSHAD использовалась команда, использовавшая адрес с регистром BX. В некоторых ситуациях процессор мог даже зависнуть. Просто кошмарный баг и очень массовый, а в википедии нет даже упоминаний про него. Были и другие баги.
Появление ARM изменило ситуацию в мире компьютерных технологий. Несмотря на проблемы, процессоры ARM продолжали своё развитие. Ответом Intel стал 80486. В борьбе за быстродействие и за первое место в мире передовых технологий Intel пошла даже на уродующее до сих облик персонального компьютера решение – использование охлаждающего вентилятора.
В 80486 были улучшены тайминги большинства инструкций и некоторые из них стали выполняться как и на процессорах ARM за такт. Хотя умножение и деление почему-то стали чуть медленнее. Появилась довольно большая для тех лет, размером 8 КБ, встроенная кэш-память. Появились и новые инструкции, например, довольно необычная CMPXCHG – она заняла место незаметно пропавших инструкций IBTS и XBTS (любопытно, что в качестве секретной эта инструкция была доступна уже и на поздних 80386). Новых инструкции совсем немного – всего шесть, из которых стоит упомянуть весьма полезную команду для смены порядка байт в 32-разрядном слове BSWAP. Большой полезной новинкой стало наличие встроенного в чип арифметического сопроцессора – так ещё никто не делал.
Первые системы на базе 80486 были невероятно дороги. Довольно необычно, что первые компьютеры на базе 80486, модель VX FT, сделала английская фирма Apricot – их цена в 1989 была от 18 до 40 тысяч долларов, а вес системного блока – более 60 кг! IBM выпустила первый компьютер на базе 80486 в 1990, это была модель PS/2 90 стоимостью $17000.
Трудно себе представить процессоры Intel без секретных, недокументированных официально возможностей. Часть таких возможностей скрывали от пользователей, начиная с самых первых 8086. Например, такой пусть и почти никому не нужный факт, что второй байт в инструкциях десятичной коррекции AAD и AAM имеет значение и может быть другим, вообще недесятичным (это было документировано только с процессора Pentium спустя 15 лет!). Более неприятно умолчание сокращенных команд AND/OR/XOR с операндом байтовой константой, например, AND BX,7 с опкодом длиной три байта (83 E3 07). Эти команды, делающие код более компактным, что было особенно важно с первыми ПК, были тихо вставлены в документацию только по 80386. Интересно, что в фирменных руководствах по 8086 или 80286 есть намек об этих командах, но конкретных опкодов по ним там нет. В отличие от похожих инструкций ADD/ADC/SBB/SUB, по которым была предоставлена полная информация. Это, в частности, привело к тому, что многие ассемблеры (все?) не умели производить более короткие коды. Ещё одна группа секретов скорее может быть названа некоторой странностью – ряд инструкций имеют по два одинаковых кода операций. Речь идёт, например, об инструкциях SAL/SHL (опкоды D0 E0, D0 F0 или D1 E0, D1 F0) и некоторых других. Обычно, а может и всегда, используется только один код операции. Второй, секретный не используется практически никогда. Можно только удивляться, почему Intel так бережно сохраняет эти лишние, захламляющие пространство опкодов дублирующие инструкции? Инструкция SALC ждала своего официального документирования до 1995 почти 20 лет! Инструкция для отладки ICEBP была официально несуществующей 10 лет с 1985 по 1995. Более всего писалось про тайные инструкции LOADALL и LOADALLD – они так навсегда и останутся тайными, так как их можно было использовать для простого доступа к большим объемам памяти только на 80286 и 80386 соответственно. Сохраняется ещё интрига вокруг инструкции UD1 (0F B9), которая неофициально является примером неправильного опкода. Признают ли за ней этот статус или назначат новое качество, пока неизвестно.
Motorola: от 68000 до 68040
Motorola – это единственная фирма, которая какое-то время могла успешно конкурировать с Intel в области производства процессоров для персональных компьютеров.
68000 был выпущен в 1979 и на первый взгляд выглядел гораздо внушительнее 8086. Он имел 16 32-разрядных регистров (точнее даже 17), отдельный счетчик команд и регистр состояний. Мог адресовать 16 МБ памяти напрямую, что не создавала никаких ограничений, например, для больших массивов. Однако, внимательный анализ особенностей 68000 показывает, что не всё так хорошо, как кажется. В те годы иметь память более 1 МБ – это недостижимая роскошь даже для средних по размеру организаций. Плотность кодов у 68000 хуже, чем у х86 – а значит коды с той же функциональностью занимают у 68000 заметно больше места. Из 16 регистров – 8 адресные, в чём-то это чуть более продвинутые аналоги сегментных регистров x86. АЛУ и шина данных 16-разрядные, поэтому операции с 32-битными данными медленнее, чем можно ожидать. Время исполнения операций типа регистр-регистр – 4 такта, а у 8086 – только 2.
Как всегда, с изделиями от Motorola, архитектура 68000 показывает несколько неуклюжестей и надуманных странностей. Например, два стека или два флага переноса (один для признаков, а другой для операций). Некоторые операции раздражают своей неоптимизированностью, например, операция записи нуля в память CLR работает медленнее записи константы 0 в память командой MOVE или сдвиг влево медленнее сложения операнда с самим собой. Есть некоторые практически лишние команды, например, есть как арифметические, так и логические сдвиги влево.
Коды для Motorola выглядят как-то более громоздко и неуклюже по сравнению с х86 или ARM. С другой стороны, 68000 всё же побыстрее 8086, по моим оценкам примерно на 20-30%. Кодам 680x0, однако, присуща и какая-то своя особенная красота и элегантность, меньшая механистичность, характерная для x86.
В целом, 68000 – это хороший процессор, с большой системой команд. Его использовали во многих ныне легендарных персональных компьютерах: в первых компьютерах Apple Macintosh, которые выпускались до начала 90-х, в первых мультимедийных компьютерах Commodore Amiga, в сравнительно недорогих и качественных компьютерах Atari ST.
68010 появился явно запоздало, только в 1982, тогда же Intel выпустила 80286, поставивший персональные компьютеры на уровень мини-ЭВМ. 68010 совместим по разъёму с 68000, но система его команд чуть-чуть отличается, поэтому замена 68000 на 68010 так и не стала популярной. Несовместимость была вызвана надуманной причиной привести 68000 в большее соответствие с идеальной теорией организации многозадачности. 68010 лишь незначительно, не более чем на 10% быстрее 68000. Очевидно, что 68010 сильно проигрывал 80286 и был даже послабее появившегося в том же году 80186. Как и 80186, 68010 практически так и нашёл себе применения в персональных компьютерах.
68008 был также выпущен в 1982 наверное с надеждой повторить успех 8088. Это 68000, но с 8-разрядной шиной данных, что позволяло использовать его в более дешевых системах. На его основе сэр Клив Синклер сделал Spectrum QL – очень интересный компьютер, который из-за более низкой цены мог бы конкурировать с Atari ST и похожими компьютерами. Но Клив параллельно и явно преждевременно стал очень много сил вкладывать в развитие электромобилей, оставив QL (Quantum leap – квантовый скачок) скорее как второстепенную задачу, что при наличии некоторых неудачных конструктивных решений, привело компьютер и всю фирму Клива к преждевременному закрытию (фирма стала частью компании Amstrad, которая отказалась производить QL).
Было бы интересно посчитать индекс разрядности для 68000, он, как мне кажется, явно повыше 16, хотя скорее и не выше 24.
Появившись в 1984, 68020 опять вернул Motorola на первые позиции. В этом процессоре были реализованы многие очень интересные и перспективные новинки. Самый сильный эффект безусловно производит конвейер инструкций, позволяющий иногда выполнять до трёх инструкций одновременно! 32-разрядная шина адреса выглядела в те годы несколько преждевременненой и поэтому выпускался более дешёвый вариант процессора 68020EC с 24-битной шиной. Зато 32-разрядная шина данных выглядела уже вполне уместно и позволяла значительно ускорить работу. Новинкой выглядел и встроенный кэш пусть и небольшого, 256 байт, объема, что позволяло значительно улучшить быстродействие, так как основная динамическая память уже не успевала за процессором. Были добавлены достаточно быстрые операции для деления (64/32=32,32) и умножения (32*32=64), за примерно 80 и до 45 тактов соответственно. Тайминги инструкций были в целом значительно улучшены, например, деление (32/16=16,16) стало выполняться за примерно 45 тактов (более 140 тактов у 68000). Некоторые инструкции в самых благоприятных случаях могут исполняться, не занимая тактов вообще! Были добавлены новые адресные режимы, в частности, с масштабированием – у x86 такой режим появился только в следующем году у 80386. Другой новый адресный режим позволяет использовать двойную косвенную адресацию, используя при этом несколько смещений, – PDP-11 был здесь заметно превзойден.
Но некоторые новые инструкции, например, тяжеловесные операции с битовыми полями или ставших малонужными при быстрых делении и умножении новые операции с 10-и числами, выглядели скорее пятым колесом у телеги, чем чем-то существенно полезным. Адресные режимы с двойной косвенной адресацией теоретически выглядят интересно, но практически нужны довольно редко и исполняются очень медленно. В отличие от 80286, 68020 требует времени для вычисления адреса операнда, так называемого эффективного адреса. Деление у 68020 получилось всё же почти в два раза медленнее чудо-деления у 80286. Умножение и некоторые операции также медленнее. У 68020 нет встроенной системы управления памятью (MMU) и скорее экзотическая возможность подключать до восьми сопроцессоров этого не могла исправить.
68020 широко использовался в массовых компьютерах Apple Macintosh II, Macintosh LC и Commodore Amiga 1200. Он также использовался в нескольких моделях систем для работы с Unix.
Появление 80386 пусть и по-прежнему в целом более медленного, чем 68020, но со встроенным и очень добротно сделанным MMU и 32-разрядными шинами и регистрами, опять поставило Motorola в позицию номер 2. 68030, появившись в 1987, в последний раз, ненадолго смог вернуть Motorola лидерство. 68030 имеет встроенную систему управления памятью и увеличенный в два раза кэш, разделенный на кэш для инструкции и данных – это была очень перспективная новинка. Кроме того, 68030 мог использовать более быстрый интерфейс доступа к памяти, что ускоряло операции с памятью почти на треть.
68030 использовался в компьютерах серии Apple Macintosh II, Commodore Amiga 3000, Atari TT, Atari Falcon и некоторых других.
С 68040 Motorola очередной раз попыталась превзойти Intel. Этот процессор появился год спустя после 80486, но по совокупности полезных качеств он так и не смог его превзойти. Фактически Motorola, имея более перегруженную систему команд, оказалась не в состоянии её поддерживать и в каком-то смысле сошла с дистанции. В 68040 смогли поместить только очень урезанный сопроцессор для работы с вещественными числами и сам чип грелся существенно больше, чем 80486. 68040 практически не нашёл применения в популярных компьютерах.
National Semiconductor 32016
Это первый настоящий 32-битный процессор, предложенный для использования в компьютерах ещё в 1982. Это процессор изначально планировался как VAX-11 на чипе, но из-за невозможности договориться с фирмой DEC фирме National Semiconductor (NS) пришлось сделать процессор только отдельными деталями похожий на архитектуру VAX-11.
С этого процессора начинается использование страничной виртуальной памяти – сегодня это доминирующая технология. Но поддержка виртуальной памяти не встроена в процессор, а требует сопроцессора. Отдельный сопроцессор требуется и для работы с вещественными числами.
Система команд NS32016 огромна и похожа на систему команд VAX-11, в частности, наличием отдельного стека для кадров подпрограмм. Особенностью 32016 является работа с флагами признаков. Помимо стандартных флагов переноса (который можно использовать и как признак для условного перехода), переполнения, знака, равенства (или нуля) есть ещё флаг L (less), означающий меньше – это как перенос для сравнений. Ситуация с переносом похожа на ту, что есть у процессоров Motorola 680x0. Флаг переполнения почему-то называется F. Есть флаги пошагового режима, привилегированного режима и (уникальность!) флаг выбора текущего стека. При выполнении арифметических инструкций флаги знака, нуля, меньшести (L) не ставятся, они устанавливаются только командами сравнения.
Можно использовать восемь 32-разрядных регистров общего назначения. Кроме того, есть ещё счетчик команд, два указателя стека, указатель стека кадров подпрограмм, указатель базы программы (это что-то уникальное), указатель базы модулей (также что-то очень редкостное), указатель на таблицу векторов прерываний, регистр конфигурации и регистр состояния. По быстродействию NS32016 оказался сравним с 68000.
32016 насколько мне известно использовался только с персональными компьютерами BBC Micro как второй процессор. Это была очень дорогая и престижная приставка для 1984 года. Можно было заказывать процессор с частотами 6, 8 и 10 МГц. С последними возникали некоторые технические проблемы и он был очень дорог. Программного обеспечения для 32016 было очень мало, только сделанная силами Acorn, чем-то похожая на Unix операционная система Panos и постоянный спутник Acorn бейсик. BBC Micro не использовали чип MMU – хотя его можно было подключить, программ для его использования не было. Арифметический сопроцессор подключать даже и не предусматривалось.
Acorn ARM
Идеология 6502, а именно делать проще, дешевле и лучше, нашла своё продолжение в почти фантастической разработке фирмы Acorn, процессоре ARM-1, выпущенном в 1985, тогда же, когда появилось технологическое чудо фирмы Intel, процессор 80386. ARM состоял из на порядок меньшего числа транзисторов и поэтому потреблял существенно меньше энергии и был при этом в среднем гораздо быстрее. Конечно, у ARM не было никакого MMU и даже операций деления и умножения, поэтому в некоторых расчетах, основанных на делении 80386 мог быть быстрее. Однако достоинства ARM оказались столь велики, что на сегодня это самая массовая процессорная архитектура. Было выпущено более 100 миллиардов таких процессоров.
Разработки ARM в 1983 начались после того, как в фирме Acorn провели исследования с процессором 32016, которые показали, что на многих расчётах 6502 на два раза меньшей рабочей частоте мог быть быстрее этого, как казалось, гораздо более мощного процессора. Тогда уже был доступен 80286, который показывал очень хорошую производительность, но фирма Intel, возможно почувствовав немаленький потенциал небольшой фирмы Acorn, отказалась продать ей технологию производства этого процессора. При этом технология 80286 не была закрытой как 80386 и была передана многим фирмам, поэтому история до сих пор ждёт раскрытия деталей этого несколько необычного отказа Acorn.
ARM разрабатывали всего несколько человек, причем тестировали систему команд, используя бейсик BBC Micro. Дебют процессора получился скорее неудачным. В 1986 была выпущена приставка для BBC Micro c названием ARM Evaluation system, содержащей помимо процессора 4 МБ памяти (это очень много для тех лет), что сделало эту приставку очень дорогим изделием. Конечно, если сравнивать её с компьютерами того времени со сравнимыми по быстродействию возможностями, то приставка оказывалась на порядок или даже почти два дешевле. Но для новой системы было очень мало программ.
Первая система на базе ARM
Несколько неудачная маркетинговая политика Acorn привела фирму к 1985 к очень тяжелому финансовому положению. Acorn помимо ARM пыталась ещё вести дорогостоящую разработку компьютеров для бизнеса, которая провалилась, в частности, из-за недостатков выбранного для них процессора 32016. Не слишком удачным оказался также и компьютер Acorn Communicator. Разработка сравнительно удачного, но не совсем IBM PC совместимого компьютера Master 512, была весьма затратной. Кроме того, много финансовых ресурсов было потрачено в безрезультатной попытке выйти на рынок США, на который возможно в рамках гипотетической большой игры по поглощению самой Acorn была допущена итальянская фирма Olivetti со своими довольно удачными, основанными на Intel 8086 и 80286, компьютерами. Кстати, после поглощения Acorn, роль Olivetti на американском рынке довольно быстро сошла на нет.
Уже как часть Olivetti Acorn разработала улучшенный чип ARM2 со встроенными командами умножения, на основе которого был сделан потрясающий тогда своим быстродействием персональный компьютер Archimedes, первые модели которого стали доступны в 1987.
ARM предоставляет для использования 16 32-разрядных регистров (их реально больше, если учитывать регистры для системных нужд). Один из регистров, R15, подобно архитектуре PDP-11, является счётчиком команд. Почти все операции, исключениями являются переходы, умножение и блочные копирования, выполняются за 1 такт. По сравнению, с основными процессорами тех лет ARM отличало отсутствие такой типовой структуры как стек. Стек реализуется, если необходимо, через один из регистров. При вызове подпрограмм стек не используется, вместо этого адрес возврата сохраняется в выделенном для него регистре. Такая схема, очевидно не работает для вложенных вызовов, для которых приходится организовывать стек. Уникальная особенность ARM – в совмещении счётчика команд, который 26-разрядный, т. е. позволяющий адресовать до 64 МБ, с регистром состояний. Для флагов в этом совмещенном регистре выделяется восемь бит, ещё два добавочных бита в этом регистре получаются за счёт того, что младшие два бита адреса не используются, так как коды должны быть выровнены по границе 4-байтного слова. Процессор может обращаться к байтам и 4-байтным словам, к 16-битным данным он напрямую обращаться не может. Инструкции для работы с данными у ARM 3-адресные. Характерной особенностью архитектуры RISC является использование команд типа регистр-память только для загрузки и выгрузки данных. ARM имеет встроенный быстрый битовый сдвигатель (Barrel Shifter), позволяющий без затрат тактов сдвигать значение одного из регистров в команде на любое число раз. Например, умножение значения регистра R0 на 65 c помещением результата в регистр R1 можно записать одной однотактовой командой сложения
ADD R1, R0, R0 shl 6
, а умножение на 63 – командой
RSUB R1, R0, R0 shl 6
В системе команд есть обратное вычитание, что позволяет, в частности, иметь унарный минус как частный случай этой команды и ускорить процедуру деления. ARM имеет ещё одну уникальную особенность: все его инструкции условные. Имеется 16 случаев (комбинаций флагов), которые присоединяются к каждой инструкции. Инструкция выполняется, только в случае, если текущий набор флагов соответствует набору в этой инструкции. В процессорах других архитектур подобное исполнение имеет место, как правило, только для условных переходов. Эта особенность ARM позволяет во многих случаях избегать медленной операции переход. С ARM подобно процессору 6809 можно использовать как быстрые, так и обычные прерывания.
Среди недостатков ARM можно выделить проблему загрузки константы в регистр. Можно загружать только 12 разрядов за один раз, хотя при этом константу можно инвертировать и сдвигать. Поэтому загрузка полной 32-разрядной константы может занять до 3 команд. Впоследствии эту проблему решили. Другой недостаток ARM в меньшей плотности кодов по сравнению с архитектурой x86, что делает программы несколько большими, а главное снижает эффективность работы процессорного кеша. Поэтому была разработана расширенная система команд Thumb для возможности использовать 16-битные команды, что значительно повышает плотность кодов. Долгое время существенным недостатком ARM было отсутствие поддержки управления памятью (MMU) – это привело, например, к отказу Apple в начале 90-х от использования этого процессора. Сопроцессоры для работы с вещественными числами для архитектуры ARM также стали использоваться с существенной задержкой. У ARM нет таких продвинутых средств для отладки, какие есть у архитектуры x86.
С 1989 стал доступен ARM3 с встроенным кешем. Дальнейшее развитие архитектуры ARM также весьма любопытно, оно затронуло, в частности, интересы таких известных фирм как DEC и Microsoft, но это уже другая история.
Некоторые выводы, предположения и вопросы
Трудно отделаться от ощущения, что 8-битные процессоры оказались лишь нежелательной необходимостью для основных действовавших в 70-е и 80-е персонажей на сцене компьютерной истории. Самый удачный 8-битник 6502 был фактически заморожен. Intel и Motorola скорее тормозили как собственные разработки маленьких процессоров, так и сдерживали других разработчиков.
Почти уверен, что Amiga или Atari ST работали бы лучше и быстрее на 4 МГц процессоре с 20- или 24-битным адресом, совместимом с 6502, чем с 68000. Бил Менш недавно заявил, что сегодня несложно сделать 6502 на 10 ГГц.
Если бы в серии Amstrad PCW, успех которой могли бы разделить и Commodore CBM II, начали использовать оптимизированные z80 на повышенных частотах, то вполне возможно, что эта серия была бы актуальной и 10 лет назад.
Каким был бы мир, если бы ARM сделали в 1982, что было вполне возможно?
Какими были бы отечественные компьютеры, если бы копировали и развивали не самые дорогие, а самые перспективные технологии?
Автор: litwr2