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

Мне довелось программировать на ассемблерах разных процессоров. Последний в списке – это 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, 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, но значительно превосходивший своего предшественника. В нём уже стало ненужным питание -5 и 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-битные операции сложения и вычитания. 6809 не полностью совместим по кодам инструкций с 6800. 6809 стал последним 8-битным процессором от Motorola, в дальнейших разработках вместо него было решено использовать 68008.

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

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


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

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

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

6309 полностью совместим по клеммам с 6809, что сделало его популярным апгрейдом для цветных Tandy или Драконов. Существуют и специальные версии ОС, использующиe новые возможности 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) – эра «только Apple» в Голливуде ещё не наступила

Теперь несколько слов о системе команд 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.

В 1984 в журнале Byte на фоне картинок с красными знамёнами, Лениным и марширующими солдатами появилась статья о плохой копии компьютера Apple ][, сделанной в СССР. В этой статье приводилась любопытная цена на этот компьютер – $17000 и иронично указывалось на то, что советским производителям придётся сильно (dramatically) понизить цену, если они захотят продать своё изделие на Западе. Агат использовался в основном в школьном образовании. Старшие модели Агатов были почти на 100% совместимы с Apple ][ и имели некоторые довольно полезные расширения.

Можно лишь попытаться фантазировать на тему о том, что бы было, если бы 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 на 25-40% быстрее, чем 6502. Последний результат можно проиллюстрировать тем, что с памятью с частотой 2 МГц z80 может работать на частоте до 6 Мгц, а 6502 только до 2 МГц.

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 вольт и четыре фазы сигнала тактирования – это антирекорды среди известных мне процессоров. В 1979 этот процессор был продемонстрирован специалистам фирмы IBM, которые тогда искали процессор для находящегося в разработке прототипа IBM PC. Очевидные недостатки TMS9900 (адресуемость только 64 КБ памяти, отсутствие необходимых архитектуре контроллеров, относительная медленность) произвели соответствующее впечатление и для будущего лидера среди ПК был выбран Intel 8088. Для устранения проблемы отсутствия контроллеров Texas Instruments также производила вариант TMS9900 с 8-разрядной шиной, TMS-9980, который работал на 33% медленнее.

TMS9900 использовался в довольно популярных в США компьютерах TI99/4 и TI99/4A, которые были «разгромлены» в войне цен компьютером Commodore VIC-20 к 1983. Любопытно, что в результате этой войны Texas Instruments была вынуждена снизить цены на свой компьютер до невероятных для 1983 $49 (в 1979 цена была $1150!) и продавать их с большим для себя убытком. Можно для примера привести сравнительно непопулярный компьютер Commodore+4, который прекратили производить ещё в 1986, но цены на который упали до этих $49 только в 1989 году. T99/4A прекратили производить в 1984, тогда, когда из-за сверхнизких цен он стал набирать популярность. Этот компьютер лишь условно можно назвать 16-разрядным. Потому что он имеет только 256 байт (!) памяти ОЗУ и всю память ПЗУ адресуемые через 16-разрядную шину. Остальная память и устройства ввода-вывода работают через медленную 8-разрядную шину. Поэтому возможно более правильно считать первым домашним 16-битным компьютером отечественный БК-0010. Любопытно, что TI99/4 и TI99/4A использовуют процессор на частоте 3 МГц – точно на такой же как и БК-0010.

В TI-99/4 и TI99/4A в качестве видеоконтроллера использовалась довольно удачная микросхема TMS9918, которая стала основой для весьма популярного во всём мире стандарта MSX, а также некоторых других компьютеров и игровых консолей. В японской компании Yamaha этот видеочип был значительно улучшен и впоследствии использовался, в частности, для модернизации самих TI-99/4 и TI99/4A!

Серия 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,… близкие процессорам DEC, а также точные копии процессоров DEC. Последние были были гораздо дороже и выпускались в маленьких количествах.

Систему команд процессоров архитектуры PDP-11 отличает почти полная ортогональность, приятное качество, но когда его доводят до крайности, это может создавать и нелепые команды. Система команд процессоров PDP-11 оказала влияние на многие архитектуры и в особенности на Motorola 68000.

Система команд PDP-11 строго 16-битная. Все 8 регистров общего назначения (а счетчик команд в этой архитектуре – это обычный регистр R7) – 16 разрядные, регистр состояний (содержит типичные флаги) 16-разрядный тоже, размер команд от 1-го до 3-х 16-разрядных слов. Каждый операнд в команде может быть (хотя есть исключения, например, инструкция XOR) любого типа – это и есть ортогональность. Среди типов – обычные регистр или память. Программисты в 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)

соответствует

**(r3-20) = **(r2+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

– это пример использования непосредственной константы в качестве операнда. Другая курьёзная команда – это уникальная команда MARK, код которой нужно класть в стек и никогда нельзя использовать явно. Вызов подпрограмм в архитектуре PDP-11 также несколько своеобразен. Соответствующая команда сначала сохраняет выделенный регистр (может быть любым) в стеке, затем сохраняет счётчик команд в этом регистре и только затем записывает в счетчик команд новое значение. Команда возврата из подпрограммы должна сделать всю наоборот и знать, какой регистр был использован при вызове подпрограммы. Очень странные и непредсказуемые эффекты можно получить, используя счётчик команд как обычный регистр.

Любопытно, что среди программировших на PDP-11 сложилась культура работы напрямую с машинными кодами. Программисты могли, например, работать без дизассемблера при отладке. Или даже писать небольшие программы прямо в память, не ассемблируя!

Конечно, тайминги команд не отличаются слишком скоростными характеристиками. Удивительно было когда-то узнать, что на отечественном компьютере БК команда пересылки из регистра в регистр занимает целых 12 тактов (10 тактов при использовании кода из ПЗУ), а команды с двумя операндами с двойной косвенной адресацией исполняются за более чем 100 тактов. Z80 делает 16-разрядную регистровую пересылку за 8. Однако, медленность БК вызвана не столько процессором, сколько плохим качеством отечественной памяти, под особенности которой БК пришлось приспособить. Если бы использовалась достаточно быстрая память, то и БК пересылал 16 регистровых бит за 8 тактов тоже. Когда-то было много споров, что быстрее БК или Спектрум? Сразу надо сказать, что Спектрум – это при использовании верхних 32 КБ памяти один из самых быстрых массовых 8-битных персональных компьютеров. Поэтому неудивительно, что Спектрум быстрее БК, но не намного. А если бы БК работал с памятью без тормозов, то он был бы наверное чуть быстрее.

Плотность кодов также скорее слабое место архитектуры PDP-11. Коды инструкций должны быть кратными длине машинного слова – 2 байтам, что особенно неприятно при работе с байтовыми аргументами или простыми командами вроде установки или сброса флага.

Интересны попытки сделать персональный компьютер на базе архитектуры PDP-11. Одним из первых ПК в мире, появившихся лишь чуть позже Apple ][ и Commodore PET и скорее чуть раньше Tandy TRS-80, был Terak 8510/a, который имел черно-белую графику и возможность загружать неполный вариант Unix. Этот ПК был довольно дорог и, насколько мне известно, использовался только в системе высшего образования США. Сама фирма DEC тоже пыталась сделать свой ПК, но очень непоследовательно. DEC, например, выпускала ПК на базе z80 и 8088, явно играя скорее против своих основных разработок. Персоналки на базе архитектуры PDP-11 DEC PRO-325/350/380 имели некоторые скорее искусственные несовместимости с базовой архитектурой, что затрудняло использование части программного обеспечения. Лучше всего персонализация технологий мини-компьютеров получилась в СССР, где производились БК, ДВК, УК НЦ,… Кстати, Электроника-85 – это довольно точный клон DEC PRO-350.


Отечественный 16-разрядный домашний компьютер (1985) – почти PDP-11 совместимый

К1802ВМ2, который использовался в ДВК, примерно в два раза быстрее К1801ВМ1, К1801ВМ3 ещё быстрее и близок по быстродействию к Intel 8086.

В старших моделях PDP-11 и близких им отечественных компьютерах процессор может адресовать до 4 МБ памяти, но одной программе при этом может выделяться не более 64 КБ. По быстродействию эти процессоры по числу операций на мегагерц также близки к 8086, хотя всё же медленнее его.

Процессор для 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 были клонированы в СССР к концу 80-х, но таких клонов было произведено очень мало и они практически не нашли себе применения.

Несколько систем VAX-11 доступны для использования через сеть. И это их выгодно отличает от систем IBM/370, c которыми они конкурировали.

Intel: от 8086 до 80486


Безусловно, что одним из самых лучших процессоров, из сделанных в 70-е, является 8086, а также его более дешевый почти аналог 8088. Архитектуру этих процессоров приятно отличает отсутствие механических заимствований и следований абстрактным теориям, продуманность и взвешенность архитектуры, сбалансированность и ориентированность на дальнейшее развитие. Из недостатков архитектуры x86 можно назвать её некоторую громоздкость и склонность к экстенсивному росту числа инструкций.

Одним из гениальных конструктивных решений 8086 стало изобретение сегментных регистров. Этим как бы одновременно достигались две цели – «бесплатная» перемещаемость программ, размером до 64 КБ (это до середины 80-х был очень даже достойный объем для компьютерной памяти для одной программы), и адресуемость до 1 МБ адресного пространства. Можно ещё заметить, что 8086 как и 8080 или z80 имеет ещё и специальное адресное пространство для портов ввода-вывода размером 64 КБ (y 8080 и 8085 этот объем – 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 имеет одну неожиданную особенность – оно непредсказуемо меняет флаги признаков…

Стоит ещё добавить, что в архитектуре x86 осталось унаследованная от 8080 команда XCHG, которая была усовершенствованна. Кроме того, в более поздних процессорах стали использоваться инструкции XADD, CMPXCHG и CMPXCHG8B, которые также могут выполнять атомарно обмен аргументов. Такие инструкции – одна из особенностей х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 стало возможным использовать смещения из двух (или четыпех в режиме 32-битного адреса) байт, причем несмотря на то, что код новых переходов стал в два (или три) раза длиннее, время его исполнения осталось таким же как и у прежних, коротких переходов.

Радикально была улучшена поддержка отладки введением 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. Напишу про две. Первые чипы имели некоторые команды, которые затем исчезли из руководств по этим процессорам и перестали исполняться на более поздних чипах. Если использовать первые источники информации по 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), которая неофициально являлась примером неправильного опкода. Неофициальное недавно стало официальным.

В СССР был освоен выпуск клонов процессоров 8088 и 8086, а полностью воспроизвести 80286 так и не получилось.

Motorola: от 68000 до 68040


Motorola – это единственная фирма, которая какое-то время могла успешно конкурировать с Intel в области производства процессоров для персональных компьютеров.

68000 был выпущен в 1979 и на первый взгляд выглядел гораздо внушительнее 8086. Он имел 16 32-разрядных регистров (точнее даже 17), отдельный счетчик команд и регистр состояний. Мог адресовать 16 МБ памяти напрямую, что не создавала никаких ограничений, например, для больших массивов. Однако, внимательный анализ особенностей 68000 показывает, что не всё так хорошо, как кажется. В те годы иметь память более 1 МБ – это недостижимая роскошь даже для средних по размеру организаций. Плотность кодов у 68000 хуже, чем у 8086 – а значит коды с той же функциональностью занимают у 68000 больше места. Последнее связано и с тем, что коды у 68k должны быть кратными 2 байтам по длине, а у х86 – 1. Но информация о плотности кодов несколько спорная, так как есть свидетельства, что в некоторых случаях у 68000 она может быть лучше, чем у 8086. Из 16 регистров – 8 адресные, в чём-то это чуть более продвинутые аналоги сегментных регистров x86. АЛУ и шина данных 16-разрядные, поэтому операции с 32-битными данными медленнее, чем можно ожидать. Время исполнения операций типа регистр-регистр – 4 такта, а у 8086 – только 2.

Как всегда, с изделиями от Motorola, архитектура 68000 показывает несколько неуклюжестей и надуманных странностей. Например, два стека или два флага переноса (один для признаков, а другой для операций). Некоторые операции раздражают своей неоптимизированностью, например, операция записи нуля в память CLR работает медленнее записи константы 0 в память командой MOVE или сдвиг влево медленнее сложения операнда с самим собой. Есть некоторые практически лишние команды, например, есть как арифметические, так и логические сдвиги влево. Даже адресные регистры при кажущимся на первый взгляд преимуществе перед сегментными регистрами 8086, имеют ряд раздражающих недостатков. Например, в них требовалось грузить целых 4 байта вместо двух у 8086 и из этих четырех один был лишний.

Коды для Motorola выглядят как-то более громоздко и неуклюже по сравнению с х86 или ARM. С другой стороны, 68000 всё же побыстрее 8086, по моим оценкам примерно на 20-30%. Кодам 680x0, однако, присуща и какая-то своя особенная красота и элегантность, меньшая механистичность, характерная для x86.

В целом, 68000 – это хороший процессор, с большой системой команд. Его использовали во многих ныне легендарных персональных компьютерах: в первых компьютерах Apple Macintosh, которые выпускались до начала 90-х, в первых мультимедийных компьютерах Commodore Amiga, в сравнительно недорогих и качественных компьютерах Atari ST. 68000 также использовался в относительно недорогих компьютерах, работающих с вариантами Unix, в частности, в довольно популярном Tandy 16B.

68010 появился явно запоздало, только в 1982, тогда же Intel выпустила 80286, поставивший персональные компьютеры на уровень мини-ЭВМ. 68010 совместим по разъёму с 68000, но система его команд чуть-чуть отличается, поэтому замена 68000 на 68010 так и не стала популярной. Несовместимость была вызвана надуманной причиной привести 68000 в большее соответствие с идеальной теорией организации многозадачности. 68010 лишь незначительно, не более чем на 10% быстрее 68000. Очевидно, что 68010 сильно проигрывал 80286 и был даже послабее появившегося в том же году 80186. Как и 80186, 68010 практически так и не нашёл себе применения в персональных компьютерах.

68008 был также выпущен в 1982 наверное с надеждой повторить успех 8088. Это 68000, но с 8-разрядной шиной данных, что позволяло использовать его в более дешевых системах. На его основе сэр Clive Sinclair сделал 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, в частности, наличием отдельного стека для кадров подпрограмм. Шина адреса 24-битная, что позволяет использовать до 16 МБ памяти. Особенностью 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 и была передана многим фирмам, поэтому история до сих пор ждёт раскрытия деталей этого несколько необычного отказа. Возможно, если бы Intel разрешила использовать свой процессор, то в Acorn использовали бы именно его, а не стали бы разрабатывать ARM.

ARM разрабатывали всего несколько человек, причем тестировали систему команд, используя бейсик BBC Micro. Сама разработка проходила в здании бывшего подсобного помещения, которое часто называют сараем или амбаром. Дебют процессора получился скорее неудачным. В 1986 была выпущена приставка для BBC Micro c названием ARM Evaluation system, содержащей помимо процессора 4 МБ памяти (это очень много для тех лет), что сделало эту приставку очень дорогим изделием. Конечно, если сравнивать её с компьютерами того времени со сравнимыми по быстродействию возможностями, то приставка оказывалась на порядок или даже почти два дешевле. Но для новой системы было очень мало программ. И это несколько странно, так как вполне было возможно портировать Unix для этой системы – тогда были доступны многочисленные варианты Unix, которые не требовали MMU, были варианты Unix для PDP-11, 68000, 80186 и даже 8088. Любопытно, что в 90-е для ARM без MMU был портирован Linux. Возможно задержка с появлением настоящего Unix для ARM была вызвана нежеланием Acorn передавать технологию ARM другим фирмам.


Первая система на базе ARM

Несколько неудачная маркетинговая политика Acorn привела фирму к 1985 к очень тяжелому финансовому положению. Acorn помимо ARM пыталась ещё вести дорогостоящую разработку компьютеров для бизнеса, которая провалилась, в частности, из-за недостатков выбранного для них процессора 32016. Не слишком удачным оказался также и компьютер Acorn Communicator. Разработка сравнительно удачного, но не совсем IBM PC совместимого компьютера Master 512, была весьма затратной. Кроме того, много финансовых ресурсов было потрачено в безрезультатной попытке выйти на рынок США, на который возможно в рамках гипотетической большой игры по поглощению самой Acorn была допущена итальянская фирма Olivetti со своими довольно удачными, основанными на Intel 8086 и 80286, компьютерами. Кстати, после поглощения Acorn, роль Olivetti на американском рынке довольно быстро сошла на нет.

Уже как часть Olivetti Acorn разработала улучшенный чип ARM2 со встроенными командами умножения, на основе которого был сделан потрясающий тогда своим быстродействием персональный компьютер Archimedes, первые модели которого стали доступны в 1987. Однако, менежмент из Olivetti был ориентирован на работу с IBM PC совместимыми компьютерами и не желал использовать свои ресурсы для реализации продукции Acorn.

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 содержит существенно меньше базовых команд, чем система инструкций процессоров x86. Но сами инструкции у ARM очень гибкие и мощные. Несколько очень удобных и мощных инструкций ARM не имеют аналогов для 80386, например, RSB (обратное вычитание), BIC (AND с инвертированием, такая команда есть у PDP-11), 4-адресная MLA (умножение с суммированием), LDM и STM (загрузка или выгрузка множества регистров из памяти, похожи на команду MOVEM для процессоров 68k). Почти все инструкции ARM 3-адресные, а почти все инструкции 80386 имеют не более 2 операндов. Система команд ARM более ортогональна – все регистры взаимозаменяемы, некоторое исключение составляют только регистры R14 и R15. Большинство команд ARM могут потребовать 3-4 команды 80386 для своей эмуляции, а большинство команд 80386 можно проэмулировать 2-3 командами ARM. Интересно, что эмулятор IBM PC XT на аппаратуре компьютера Acorn Archimedes с процессором на 8 МГц работает даже быстрее, чем реальный компьютер PC XT. На компьютере Commodore Amiga с процессором 68000 на 7 МГц эмулятор может работать только со скоростью, не большей 10-15% реального PC XT. Очень интересно также, что первые компьютеры NeXT с 25 МГц 68030 показывали производительность целочисленных расчетов на уровне того же 8МГц ARM. Apple собиралась в проекте Möbius сделать компьютер-преемник Apple ][, но когда выяснилось, что прототип этого компьютера в режиме эмуляции обгоняет не только Apple ][, но и основанные на 68k процессорах Макинтоши, проект закрыли!

Среди недостатков ARM можно выделить проблему загрузки константы в регистр. Можно загружать только 8 разрядов за один раз, хотя при этом константу можно инвертировать и сдвигать. Поэтому загрузка полной 32-разрядной константы может занять до 4 команд. Можно, конечно, загрузить константу из памяти одной командой, но тут возникает проблема указания адреса этой величины, так как смещение может быть только 12-разрядным. Другой недостаток ARM в меньшей плотности кодов по сравнению с архитектурой x86, что делает программы несколько большими, а главное снижает эффективность работы процессорного кэша. Поэтому в 90-e была разработана расширенная система команд Thumb для возможности использовать 16-битные команды, что значительно повышает плотность кодов. Долгое время существенным недостатком ARM было отсутствие встроенной поддержки управления памятью (MMU) – этой поддержки, например, требовала Apple в начале 90-х. Сопроцессоры для работы с вещественными числами для архитектуры ARM также стали использоваться с существенной задержкой. У ARM не было таких продвинутых средств для отладки, какие были у архитектуры x86. Есть ещё некоторая странность в языке стандартного ассемблера для ARM: операции битового сдвигателя принято писать через запятую. Таким образом, вместо простой формы
R1 shl 7
– сдвинуть содержимое регистра R1 на 7 бит влево – нужно писать
R1, shl 7
.

С 1989 стал доступен ARM3 с встроенным кешем. В 1990 команда разработчиков ARM отделилась от Acorn и создала с помощью Apple и VLSI компанию ARM Holding. Одной из причин отделения стала слишком большая затратность разработки ARM по мнению менежмента Acorn-Olivetti. Впоследствии Acorn прекратила своё самостоятельное существование, а ARM Holding превратилась в крупную компанию. Разделение Acorn и ARM Holding было также инициировано желанием Apple иметь процессор ARM в своем компьютере Newton и не зависить от другого производителя компьютеров.

Дальнейшее развитие архитектуры ARM также весьма любопытно, оно затронуло, в частности, интересы таких известных фирм как DEC и Microsoft, но это уже другая история. Хотя можно упомянуть, что именно благодаря доле в ARM Holding Apple в 90-е смогла избежать банкротства.

Некоторые выводы, предположения и вопросы


Трудно отделаться от ощущения, что 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, что было вполне возможно?

Какими были бы отечественные компьютеры, если бы копировали и развивали не самые дорогие, а самые перспективные технологии?
Поделиться публикацией

Похожие публикации

Комментарии 129
  • НЛО прилетело и опубликовало эту надпись здесь
      +1
      Благодарю. Подправил.
        +3
        Причем, согласно документации, их еще требовалось подавать и снимать строго в определенном порядке.
          0
          Да можно было спокойно и от 5 вольт за питать, только медленнее…
          … реально от нарушения последовательности подачи питания дохли только ВГ93
            0
            Для личных целей — согласен, во всяком случае слышал, что так делали. В промышленном же изделии приходилось соблюдать требования документации и извращаться с источником питания.
              0
              Во вполне себе серийных кассах видел ВМ80 на пяти вольтах…
                0
                Это были заводские изделия или кооператива «рога и копыта»?
        +1
        Очень жалко, что не упомянули IBM360/370. До сих пор с ужасом вспоминаю правила использования регистров 13, 14, 15 при вызове и возврате из процедур.
          +1
          Это не микропроцессоры.
            +2
            Префикса «микро» в заголовке статьи не было. Да и чем хуже младшие модели IBM старших моделей PDP-11?
            0
            Писал на ЕС-1045 лабораторные на ассемлере и Рефале…
              +3
              Я всякие трансформации МГД-волн на фронтах ударных волн считал для диссертации по астрофизике. Ночами с пульта EC-1055M. Ну а в качестве компенсации и хобби, чего уж скрывать, помогал с СВМ (это минский перевод на русский VM/SP) местному сисадмину. Когда то и ядро умел пересобрать, и следующую версию СВМ запустить на виртуалке предыдущей версии. И инструкцию к машине (на немецком) понять. Да и девочек-операторов «поблагодарить» :)
            +4
            Спасибо за интересную статью, прочитал с большим удовольствием.
              +5
              Безусловно, что одним из самых лучших процессоров, из сделанных в 70-е, является 8086

              Вот не соглашусь.
              По сравнению с имеющимися тогда процессорами Motorola 68000 и Zilog 8000, он по многим параметрам хуже:


              1. Сегментные регистры — это не достоинство, а недостаток. Благодаря этим сегментным регистрам, существовало пять различных моделей памяти (кто программировал в конце восьмиидесятых — начале девяностых помнят). Всякие разные диковинные tiny, small, medium, large и huge.
                Motorola 68000 и Zilog 8000 напрямую адрестовали, соответственно 16 и 8 мегабайт, в отличии от 1 мегабайта у 8086.


              2. Motorola 68000 и Zilog 8000 имели два режима работы — пользовательский и симтемный, что позволяло строить защищенные системы. В 8086 такого не было.


              3. Ну и наконец, система команд — у Motorola 68000 и Zilog 8000 она была более продвинутой, практически любая команда могла использовать любой регистр, в отличие от 8086 со всеми этими AX, BX, CX, DX, где для одной команды можно было использовать только AX, счетчик мог быть только в CX и так далее. Кстати для одинаковых задач, код у 68000 получался компактнее, чем у 8086.
                0
                Про z8000 почти ничего не знаю. Будет интересно, если сообщите что-нибудь о том, почему этот процессор так и не состоялся фактически.
                1. Большинство этих режимов мало что значат. Они скорее о формате выходного файла COM или EXE. Вот если нужны были большие массивы, то надо было выбирать режим Huge — это замедляло. Но к концу 80-х, когда стало для этого у многих хватать памяти, уже были доступны системы для работы в 32-разрядном режиме, в котором этой проблемы уже не было, хотя и заметно тормозился ввод-вывод. Конечно, это уже про 80386. Могу ещё заметить, что указание режима Tiny позволяло получать самые компактные коды, без загрузчика, благодаря именно сегментным регистрам. И вроде бы нет особой проблемы в том, чтобы один раз указать режим. Cкорее могло напрягать использование директив FAR и NEAR, но скорее только начинающих. В современных процессорах много режимов, хотя скорее чисто системных.
                2. Иметь как-бы защищенные режимы без защиты памяти вещь абсолютно бесполезная, это только делало архитектуру бессмысленно более громоздкой.
                3. Согласен, что теоретически система команд 68000 более продвинутая, но когда дело доходит до практического программирования, то 8086 часто (пусть и не всегда) оказывается лучше. Ну и что, что для счётчика можно использовать только CL — проблема возникнет, только если нужно сразу несколько таких счётчиков, больших 1 — это возможно, но скорее редко, чем часто. Было интересно получить ссылки на какие-нибудь данные, указывающие, что код для 68000 более компактен, чем для 8086. У меня обратная информация, например, программка для вычисления числа π для 8086 почти в полтора раза меньше (примерно 650 байт против более 900). У 8086 многие команды занимают только один байт.
                  0

                  Трудно сказать, почему z8000 не получил широкого распространения, скорее всего по каким-то причинам нетехнического порядка. На мой взгляд он был вполне достойным микропроцессором. Сегментная организация оказалась тупиковым направлением — сейчас никто ей не пользуется.


                  Трудно сравнивать код 68000 и 8086 напрямую, поскольку это сильно зависит от квалификации программиста, но 68000 имел, например, команду movem, которая позволяла загружать несколько регистров и сокращала код. Такой команды 8086 не имел.


                  Насчет защиты пямяти — у z8000 она была.

                    0
                    Посмотрел в википедии — непонятно там про MMU у z8000. Вроде есть что-то для работы с виртуальной памятью, но ничего нет по защите памяти, её организации. Сомневаюсь, что y Z8000 полноценное MMU как у 80286.
                    Конечно, у 68000 больше регистров и это на некоторых задачах может давать более компактный код. Но инструкции у х86 могут быть любой длины, например, 1 или 3 байта. А у 68000 все выравнено по границе 4 байта. У архитектуры х86 тут большое преимущество.
                      0
                      Был MMU: sci-hub.tw/10.1016/0745-7138(83)90028-3
                      Это было причиной популярности z8000 для построения low-end unix серверов.
                      0

                      Не согласен на счёт сегментной организации. Виртуальное адресное пространство тоже в каком-то смысле "сегмент".

                      0
                      z8000 вполне состоялся, на нем хватало коммерческих продуктов, был относительно популярен у военных, дожил до 90х.
                      Широкого распространения не получил, т.к. был совместим сам с собой и не попал ни в один из популярных компьютеров 80х.
                        0
                        z8000 «состоялся» убив возможное развитие семейство z80. Если мне не изменяет память то нанятый разработчик процессора с полной свободой действий помножил на ноль любую совместимость, не только бинарную, но и формальную — на уровне мнемоник ассемблера, создав процессор с системой команд, а'ля VAX. Возможно это городская легенда, но когда я читал книжку по микропроцессорам в начале 90-х z8000 выглядел бледно на фоне 286 и 68000.
                        +1
                        Большинство этих режимов мало что значат. Они скорее о формате выходного файла COM или EXE
                        Это было очень важно для ABI ЯВУ. Код, скомпиленный в одной модели, только через костыли линковался с кодом другой модели.

                        Если требовалось предоставить callback-функцию, или просто указатель на данные, нужно смотреть, в одном регистре или в двух он предоставлялся. Очень «увлекательно» было разбираться с API Win3.11, в какую ф-цию какой нужен указатель.
                        0
                        Сегментные регистры — это не достоинство, а недостаток. Благодаря этим сегментным регистрам, существовало пять различных моделей памяти (кто программировал в конце восьмиидесятых — начале девяностых помнят). Всякие разные диковинные tiny, small, medium, large и huge.
                        Motorola 68000 и Zilog 8000 напрямую адрестовали, соответственно 16 и 8 мегабайт, в отличии от 1 мегабайта у 8086.

                        Я не знаю систему команд 68000 и 8000, но предполагаю, что без сегментации памяти им приходилось оперировать 32-битными значениями адресов при помощи 16-битных регистров? Вряд ли это удобнее; и уж точно кодировка команд получается более компактной, когда используются 16-битные смещения «в известном сегменте», чем когда используются адреса «от начала памяти».

                        «Диковинные модели памяти» означали, что 32-битными адресами для кода и/или данных приходилось пользоваться только в тех программах, где это действительно было нужно, а не во всех без исключения.
                          0
                          А представьте шок человека (меня), который впервые увидел код х86 уже после кода 68К!
                            0

                            На код x86 было больно смотреть даже после 80-го. Ну а уж после PDP-11 и того больнее.

                          +1
                          Прикольно. Помню тоже писал такие статьи в журнале ЧипНьюс в далеком двухтысячном году. Только про 8 и 16-разрядные микроконтроллеры.
                          +1
                          «Это, конечно, Радио-86РК, Микроша, многоцветные Орион-128, Вектор и Корвет.»

                          «Специалист» забыли.
                            0
                            «Орион» сделан из «Специалиста» добавлением RAM-диска.
                              +1
                              У того же ZX spectrum на пост-советском пространстве были десятки клонов/апгрейдов и имен. Но почему то в статье указано имя «прородителя» а не одного из клонов. Так почем же оригинальный ПК «Специалист» упомянут под именем апгрейднутой версии?
                              0
                              Извините, даже и не знал про такой.
                                0
                                Спектор-001. в инструкции было написано, что программно совместим с Радио-РК86.
                                  0

                                  Забыли первый любительский комп — РадиоМикро80. Журналы Радио конца 1982 и весь 83. Огромный по сравнению с тем же Р86рк, но тем не менее первый спаянный и оживший…

                                  +4
                                  Читая всё это, так и вспоминается сериал HCF (Halt and Catch Fire). Там мелкая контора чуть ли не в гараже хочет вытеснить IBM с рынка ПК, ставя на оптимизированную схемотехнику и оптимизированный BIOS, который в маш. кодах пишет хипповато-асоциальная студентка.
                                    0
                                    По сериалу Cardiff Electric вовсе не была мелкой конторой, просто на первом этапе проект им был не очень интересен.
                                    –1
                                    Мне довелось программировать на ассемблерах разных процессоров. Последний в списке – это Xilinx MicroBlaze.

                                    Вы его точно на ассемблере программировали? Microblaze — это ж ПЛИСовый процессор из EDK. Программируется в SDK на Си. А в XPS процессор вроде только конфигурируется.
                                      +1
                                      А коды загрузчиков, вставки в системные библиотеки?
                                        0
                                        А, в этом плане. Тогда да, понятно)
                                      +3
                                      Очень сильный обзор, спасибо.
                                        0
                                        Извините, как-то забыл про наш Агат. Добавил абзац.
                                          0
                                          Этот кто-то :) ещё и про «Иришу» забыл, а ведь это был совершенно оригинальный аппарат, а не попытка клонировать или улучшить что-либо из уже существующего.
                                          +3
                                          А как же SPARC? Ведь он тоже тех же времен.

                                          А вообще — обзор очень хороший.
                                            0
                                            Благодарю за добрые слова. Однако, sorry, не случилось поработать. :( Слышал только, что там как-то уникально на аппаратном уровне устроена работа с параметрами функций. И в первой половине 90-х в встречал несколько раз в Москве — техника выглядела очень сильно.
                                              0

                                              В sparc-е множество регистров, объединенных в пересекающиеся блоки, что позволяло передавать до восьми параметров функции не залезая в память. Кстати, на моей аватарке за моей спиной sparcstation десятка.

                                                +1
                                                Ах, да, были же еще PowerPC, с которого долго не могла сползти Apple, был i860 с короткой и странной судьбой.
                                                  +1
                                                  Еще MIPS, IA64, DEC Alpha (первый процессор на 1ГГц).
                                                  Еще все эти гарвардские 8048/8051, ломающие шаблоны.
                                                    0
                                                    IA64, DEC Alpha — это уже позднее. Я имел в виду процы, которые были не позднее 486, на котором примерно автор остановился.
                                                      0
                                                      8048/8051 — это все-таки не процессоры общего назначения, а контроллеры для «встраиваемых систем» (вроде как вместе с этим семейством MCS-51 и появилось понятие «встраиваемых систем». хотя могу ошибаться).
                                                +1
                                                Сохраняется ещё интрига вокруг инструкции UD1 (0F B9), которая неофициально является примером неправильного опкода. Признают ли за ней этот статус или назначат новое качество, пока неизвестно.

                                                Если это про сейчас, то открываем software.intel.com/en-us/articles/intel-sdm, выбираем Intel® 64 and IA-32 architectures software developer's manual volume 2B: Instruction set reference, M-U, находим UD—Undefined Instruction и видим UD0(0F FF /r), UD1(0F B9 /r),UD2(0F 0B).
                                                fasm знает только про UD2, yasm — UD2 и UD1.
                                                  0
                                                  Благодарю, не уследил.
                                                  +1
                                                  Отличный обзор!!! В школе писал на ассемблере 6502 (Агат-9), на факультативе — на асме Z80 (Yamaha MSX-2). Почему-то Z80 нравился больше.
                                                    +1
                                                    Может потому, что на ПК Yamaha графика была лучше, а звук намного лучше?
                                                      0

                                                      Нет, переход на 6502 был как "связывание рук".

                                                        0
                                                        Очень интересно. Вы писали, что перешли с 6502 на z80. Был бы очень признателен за пример, иллюстрирующий скорее «развязывание рук».
                                                          0
                                                          Не на z80, а писал попеременно для 580, 6502 и pdp-11 (z80-очень редко, баловство с синклером, 48/51 — почаще, в т.ч. писал кросс-средства для них). pdp-11, на мой взгляд, лучший из ассемблеров. ну а разница между 580 и 6502 — например, в количестве регистров.
                                                            0
                                                            Писал уже об этом, но повторю для вас. У 6502 память нулевой страницы имеет функциональность регистров. Согласен, что если не думать о производительности, то ассемблер PDP-11 хорош. Думаю, вам бы понравился ассемблер Motorola 680x0. Возможно и ARM тоже понравился — там было изначально менее 30 инструкций. И не совсем понял про 580 — что это процессор?
                                                              0

                                                              Да, про память знал — но всё равно по сравнению с регистрами — это иной стиль. Поэтому было менее удобно. Возможно, это дело привычки и "закрепившегося" стиля… 580-й — это советский 8080. Про 68000 читали в обзорах (приходили на кафедру переплетённые ксерокопии), было интересно — но до практики дело не дошло.

                                                                +1
                                                                Использовать нулевую страницу 6502 в качестве «почти регистров» не годилось. Проблема в том, что, говоря современным термином, регистры бывают общего назначения и служебные (в x86 последние это то, что MSR), так вот нулевая страница несла оба набора, и все участвующие использовали какие-то её ячейки непредсказуемым образом (надо было вычислять по исходникам).
                                                                Для полностью самостоятельного приложения, которое берёт на себя всю работу с аппаратной частью и вокруг, это было неважно. А вот если хотел сделать что-то такое, что и было хитрое на ассемблере, и сочеталось даже просто с местным бейсиком (хотя бы не сломать его по выходу из своего кода!) — уже возможность использовать нулевую страницу резко сокращалась. А какая-нибудь Рапира использовала её реально всю — оставляя только несколько ячеек нетронутыми — причём какие именно, документация подвирала.

                                                                Да, с этим можно было банально не столкнуться. Но с тех пор утверждение «нулевая страница это те же регистры» вызывает у меня только саркастическую ухмылку — и применяется как объяснение, почему процессору нужны настоящие регистры, а не суррогаты.
                                                                  0
                                                                  Вы о том, что некоторые системы использовали почти всю нулевую страницу. Это плохо. На некоторые системы не хватало документации — тоже нехорошо. Но причем тут сам процесор?! Некоторые системы использовали и многие регистры, например, ZX Spectrum использовал регистр IX, а Amstrad CPC — весь альтернативный набор регистров. В TMS9900 получается, что все адресные регистры и регистры данных — это суррогаты. В современных системах, когда обращение к памяти проходит очень быстро, можно вообще без регистров и такие архитектуры используются. Другое дело, что в системе должно быть достаточно быстрой, успевающей за процессором памяти. Регистры, конечно, повышают плотность кодов. Но архитектура Spark с более чем сотней регистров не стала преобладающей.
                                                                    0
                                                                    > Но причем тут сам процесор?!

                                                                    При том, что его иначе использовать в этих условиях было невозможно (чрезмерно дорого). И размер нулевой страницы, и громоздкость временной заливки данных в неё и вылива обратно — провоцировали абьюзить её, используя под то, что в нормальных системах не сидит постоянно в регистрах.

                                                                    > Но архитектура Spark с более чем сотней регистров не стала преобладающей.

                                                                    Вы с IA-64 не путаете? SPARC имел с точки зрения пользовательского кода 32 регистра (включая пустой). Системному позволялось видеть полный ротор регистров, но к вопросу плотности обычного кода это уже не относится.
                                                                      0
                                                                      В каких условиях? Что дорого? В любых нормальных системах, с которыми работал всегда можно было найти более 16 свободных ячеек на нулевой странице. Положить туда байт — 5 тактов, адрес — 10 тактов. 256 байт для 8-биток — это не так уж и мало. К сожалению, не довелось поработать с Рапирой или Школьницей — интересные системы — может когда-нибудь и получится. Возможно, что там в чем-то «перестарались».
                                                      +1
                                                      специальное адресное пространство для портов ввода-вывода размером 64 КБ (y 8080 и z80 этот объем – 256 байт).

                                                      Для z80 есть возможность адресовать все 64к портов ввода-вывода:
                                                      Команды с непосредственной адресацией IN A,(n) и OUT (n),A аналогичны командам
                                                      ввода-вывода МП I8080. Но в добавление к адресу порта n, выставляемому в младшую часть шины адреса, в старшую часть ША подается содержимое аккумулятора.

                                                        0
                                                        Действительно, и знал вроде об этом…
                                                          +1
                                                          По этой причине OUT (n), A редко подходила для адресации таких портов, а вот комбинация LD A, nh; IN A, (nl) — использовалась постоянно, особенно при опросе клавиатуры ). Альтернативой было LD BC, NN; IN A, ( C ), но, если помню верно, предыдущий вариант выполнялся за 14 тактов, этот — за 18, поэтому, если старшие 8 бит адреса порта не надо было сохранить «на будущее», вариант с IN A, (n) был предпочтительней.
                                                          0
                                                          Непонятно, почему вы так удивляетесь обмену (набора) регистров за 4 такта?
                                                          Это достигается просто манипуляцией адреса регистра. Данные никуда не перемещаются.

                                                          Другой недостаток ARM в меньшей плотности кодов по сравнению с архитектурой x86, что делает программы несколько большими, а главное снижает эффективность работы процессорного кеша.

                                                          Давным давно, ARM был чуть хуже чем IA-32.
                                                          Если же говорить о состоянии дел в настоящий момент, то ARMv8 с фиксированными 32-битными инструкциями выигрывает в плотности кода у x86-64, а также в количестве команд.

                                                          У ARM нет таких продвинутых средств для отладки, какие есть у архитектуры x86.

                                                          О каких средствах идёт речь?
                                                            0
                                                            Непонятно, почему вы так удивляетесь обмену (набора) регистров за 4 такта?
                                                            Это достигается просто манипуляцией адреса регистра. Данные никуда не перемещаются.

                                                            Важен результат, а он есть — регистры меняются местами. Если для закручивание лампочки крутить стул вместе с тем, кто держит лампочку, та будет закручена. :)
                                                            Давным давно, ARM был чуть хуже чем IA-32.
                                                            Если же говорить о состоянии дел в настоящий момент, то ARMv8 с фиксированными 32-битными инструкциями выигрывает в плотности кода у x86-64, а также в количестве команд.

                                                            В статье все-таки про первые ARM-ы и они не были хуже, а скорее лучше, им не хватало только MMU и арифметического сопроцессора. Насчет плотности кода хотелось бы получить подтверждающую ссылку — сомневаюсь.
                                                              +2
                                                              им не хватало только MMU и арифметического сопроцессор

                                                              Иии...? Как это связано с «плотностью кода»? Я отвечал на вашу цитату.

                                                              Насчет плотности кода хотелось бы получить подтверждающую ссылку — сомневаюсь.

                                                              Моя оценка на коде с которым я работаю (игры / AVX вычисления): у х86_64 уходит 4.2-4.5 байт на инструкцию. Инструкций зачастую нужно больше чем у ARMv8.

                                                              Если вы хотите академического, вот.
                                                              digitalassets.lib.berkeley.edu/etd/ucb/text/Waterman_berkeley_0028E_15908.pdf (Figure 5.8)
                                                              Есть и другие замеры — тут на SPECInt2006 получили 3,71 байт на команду.
                                                              arxiv.org/pdf/1607.02318.pdf

                                                              Вообще лучший измеритель это gcc.godbolt.com
                                                              Выбираете компилятор, например Clang 5.0 (для ARM нужно указать -target aarch64-linux-gnu), интересующий кусок кода и можно сравнивать.
                                                              Да, можно написать функцию в три строки которая будет хуже на ARM, но вычислительный код с векторами и т.п. будет лучше.
                                                                +1
                                                                Благодарю за очень интересные материалы. Не ожидал, что удалось так значительно повысить качество кодов по плотности. Современные ARM — очень хорошие процессоры…
                                                                  0
                                                                  fix: gcc.godbolt.org
                                                              0
                                                              «Стагнация» 6502 во многом связана с реализацией контроллера дисковода Apple II. Возняк сделал его красиво и очень просто, но привязка к таймингам исходного процессора делала невозможной увеличение тактовой или оптимизацию команд.
                                                                0
                                                                6502 был далеко не только в Apple ][
                                                                0
                                                                Был еще 4004интел, но мы его не стали встраивать ( тема была приборчик делали ) а поставили тогда 580 серию в которой уже и интерфейсы были.
                                                                  0
                                                                  Автор как-то прошел совсем мимо военного применения микропроцессоров… думаю многие «недоговорки» были свзаны именно с этим. В частности, емнип, товары с моторолловскими 68000 были запрещены к поставкам в СССР вообще. А наш 580ВМ80 до сих пор на службе ПВО (в комплексах С300)
                                                                    0
                                                                    80386 тоже попадали под ограничения КОКОМ и ввозились обходными путями.
                                                                      0
                                                                      товары с моторолловскими 68000 были запрещены

                                                                      Если это было так, то это скорее ослабило эту фирму. Может и тут конкуренты «помогли».
                                                                        0
                                                                        68000 были под запретом КОКОМ поскольку использовались в «мозгах» крылатой ракеты «Томагавк»
                                                                          0
                                                                          да, слышал эту версию, еще в 90-е, вполне годное применение) но не находил этому подтверждений
                                                                            0
                                                                            Я точно не помню, толи в Компьютер-Пресс, толи в какомто другом журнале в 92 году читал статью со списком исключенных из запретного списка КОКОМ motorolla 68000 и intel 386dx
                                                                        +1
                                                                        Очень интересная статья, спасибо! Вот только тема процессоров АРМ раскрыта не полностью. Недавние исследования кристаллов процессоров АРМ выявили в них микротрансляцию инструкций на уровне PLA (декодирование инструкций). Очень хорошо эта тема раскрыта в блоге Кена Шерифа. В частности, здесь. А вообще, хотелось бы вторую часть статьи про АРМ процессоры. Также, никак не затронута архитектура MIPS.
                                                                          0
                                                                          Благодарю за ссылку.
                                                                            0
                                                                            Внёс много добавлений по теме ARM…
                                                                              0
                                                                              Статья просто чудо! Обожаю такие обзоры, Спасибо. Вот только, почему-то, нет никаких упоминаний про архитектуру MIPS. А тем не менее, она берёт своё начало в далёком 1985м году и на сегодняшний день очень активно используется в маршрутизаторах, ADSL модемах и подобных устройствах. Также, использовалась в игровых консолях Nintendo64, Playstation и Playstation 2. Точных данных о реальной рыночной доле не имею, однако, доподлинно осведомлён о наличии подобных процессоров в Zyxel Keenetic Giga, ASUS ADSL и ещё нескольких маршрутизаторах, которые раздербанил на запчасти самолично.
                                                                            +2
                                                                            Одной из особенностей применения микропроцессоров является то, что он в большинстве случаев не является самодостаточным изделием (в отличии от микроконтроллеров). Он требует ряда внешних схем для своей полноценной работы. Начиная с 70-х годов, да и по-сути по настоящее время фирмы выпускают не просто микропроцессоры, а микропроцессорные наборы. Одной из важных причин доминирования микропроцессоров INTEL является то обстоятельство, что совместно с МП фирма сразу предложила большой набор совместимых с микропроцессором чипов позволяющих создать законченную систему, не мучаясь с собственной разработкой. На мой взгляд это один из важных факторов выбора фирмой IBM МП I8088 для своего ПК. На материнской плате IBM PC кроме МП имелось несколько чипов производства INTEL. Помню, как пришлось напрягаться при разработке Микро-80 не имея ничего кроме собственно микропроцессора.
                                                                            Статья хорошая и почти полная. Я бы упомянул, пожалуй, только еще совершенно революционный, широко разрекламированный и абсолютно провальный проект INTEL
                                                                            IAPX 432.
                                                                            Да, конечно, времена борьбы за каждый байт в ПЗУ и поиска «хитрых» способов повышения быстродействия прошли, но остались в памяти. Из приятных воспоминаний (в духе Вашей статьи) вспомнилось как не удавалось никак найти 2 или 3 лишних байта в ПЗУ, пока не применил в нескольких местах программы для обнуления аккумулятора однобайтовую команду XRA A (исключающее ИЛИ аккумулятора с самим собой) вместо двухбайтовой MVI A,00H. Или нестандартное использование выхода разрешения прерывания МП I8080 в качестве одноразрядного порта вывода с возможностью программно формировать короткие импульсы командами EI и DI…
                                                                              0
                                                                              «однобайтовую команду XRA A вместо двухбайтовой MVI A,00H.»
                                                                              А зачем вы изначально такое писали? Её даже писать дольше и работает она тормознее.
                                                                              Обнулять аккумулятор через загрузку непосредственного значения на i8080 нужно только когда вам нужно сохранить флаги.

                                                                              На современных процессорах х86 это ещё более актуально.
                                                                              stackoverflow.com/questions/33666617/what-is-the-best-way-to-set-a-register-to-zero-in-x86-assembly-xor-mov-or-and/33668295
                                                                              stackoverflow.com/questions/17981447/microarchitectural-zeroing-of-a-register-via-the-register-renamer-performance-v
                                                                              и т.п.

                                                                              Преждевременная пессимизация — очень своеобразный подход к программированию =)
                                                                              Почему сразу не писать «компактно, быстро и удобно» вместо «раздуто, медленно и неудобно»?
                                                                                0
                                                                                Поддерживаю, мы с первых дней программирования на Z-80 всегда писали именно XOR A. Не знаю, почему не SUB A, XOR нравился больше :). Однажды даже был курьез, когда мой друг спросил меня — «зачем нужна команда LD A, 0, ведь они могли на этом месте сделать какую-то другую команду».
                                                                              0
                                                                              «А зачем вы изначально такое писали?»
                                                                              Это Вам сейчас, когда уже несколько поколений программистов поделились своим опытом и знаниями с остальными такое использование XRA A кажется естественным и практически единственно возможным. Зачем делать компьютер на реле, если уже были электронные лампы? И т.д. и т.п. Почему надо было работать с какой то DOS, а не сразу «компактно, быстро и удобно» работать под WINDOWS? У меня есть ответ — потому что!
                                                                                +1
                                                                                Это Вам сейчас, когда уже несколько поколений программистов поделились своим опытом и знаниями с остальными такое использование XRA A кажется естественным

                                                                                Что значит «сейчас»? XOR для обнуления регистров использовался задолго до моего рождения.
                                                                                Есть инструкция 1 байт, 4 такта. Зачем использовать инструкцию 2 байта, 7 тактов?
                                                                                Логика же должна подсказывать что первый вариант лучше?

                                                                                Вот, например, CP/M, 70е
                                                                                OPENFCB	XRA	A
                                                                                	STA	FCB+32
                                                                                

                                                                                  0
                                                                                  Как бы Вами объяснить различие в доступности информации в конце 70-х и сейчас? Если у Вас на руках имеется только несколько страниц с системой команд судорожно и неаккуратно вырванных из единственного мануала INTEL на выставке в 1978, пока фирмач отвлекся (было, что греха таить), то все остальное придется додумывать самому. Это сейчас Вы можете посмотреть — а как там обнулял аккумулятор Гарри Килдалл в CP/M или что за загадочная структура — FCB.
                                                                                    +1
                                                                                    Посмотрел ваши публикации, вопрос снят =)
                                                                                    Я начинал в начале 90-х и у меня к тому времени был полноценный мануал по Z80.
                                                                                      +1
                                                                                      Ну и времена были. Помню в ГПНТБ в конце 80-х вместо зарубежных исходных материалов часто был только их ужасный машинный перевод на русский. А что было в 70-е — время легенд!
                                                                                        +1
                                                                                        В то время изучение даже двоичных файлов было обычным делом. Однажды я увидел у друга на РС проигрыватель MOD файлов. Мне очень понравился звук по сравнению с моим спектрумовским AY. Спустя какое-то время я приделал к своему ZX две ВВ55А, четыре 8-битных ЦАПА и захотел сделать плеер MOD файлов. Но как, ведь описания формата не было вообще? Пришлось разбираться в файле просто глядя на двоичные данные. И в итоге за месяц плеер я все-таки сделал. У меня был самодельный апгрейд до 256 Кб, но и этого явно не хватало для большинства MOD файлов, поэтому я придумал такой «хак» — если памяти для загрузки очередного семпла не хватает, плеер берет самый большой семпл и сжимает его в два раза, помечая, что воспроизводить его надо медленней. В итоге мой плеер играл даже MOD объемом до 720 Кб (больше на дискету не влазило). Частота дискретизации выходного сигнала получилась невысокой — около 8 КГц, но даже это было в то время невероятным счастьем.
                                                                                          0
                                                                                          Круто! Вы бы ещё видеостример добавили. Это, кстати, реально www.youtube.com/watch?v=KXe7x8xoSnE
                                                                                          www.youtube.com/watch?v=ooi9rpx6ECM
                                                                                          www.youtube.com/watch?v=9cSbjXAFvDg
                                                                                            +1
                                                                                            Я позже придумал, как воспроизводить «видеоролики» на спектруме — программа считывала определенный объем данных с дисковода и выводила их на экран (увеличивая). За это время диск поворачивался и специальным форматом (порядком секторов) достигалось, что нужные данные оказывались перед головкой и читались без особой задержки. Далее процесс повторялся.

                                                                                            Один кадр занимал 1 кб и состоял из 2048 блоков (4 бита на блок) в формате 64х32 (каждый блок имел размер 4х4 пикселя), что представляло собой 2/3 экрана спектрума. Дисковод читал 20 кб/с в стандартной конфигурации (16 секторов по 256 байт), что позволяло выводить 10 кадров в секунду (половина времени тратилось на чтение, половина — на вывод на экран).

                                                                                            Альтернативно можно было прочитанный килобайт интерпретировать как 4096 блоков по 2 бита в формате 128х32 что позволяло отображать «видео» с более мелкими пикселями (2х2), но только на 1/3 экрана.

                                                                                            По факту я так и не сделал ничего путного, т.к. видео надо было где-то взять и перекодировать в данный формат, а вот с этим были проблемы. Да и на диск влазило всего 60 секунд. Поэтому, дальше сгенерированных паттернов дело не зашло. А позже, уже в 2000+ году я увидел на одной из выставок как раз такое видео на спектруме в составе какой-то демки.
                                                                                        0
                                                                                        Ну пусть даже инфы в такой доступности в то время не было. Но должна же быть логика! Уж сколько байт занимает команда-то должно быть известно! Ну и дальше почти очевидно, что двухбайтовая команда будет выполняться медленнее однобайтовой, хотя, тут могут быть исключения связанные с АЛУ. Когда я начинал программировать на спектруме, информации по тактам всех команд у нас тоже не было. Так я писал программу, где испытывал неизвестную команду многократно и смотрел на время её выполнения. Таким образом, я получил полную растактовку всех команд процессора (повезло, что мы работали уже на «новых» клонах спектрума, где не использовался сигнал WAIT при обращении к памяти и все команды всегда выполнялись строго определенное время). А еще, чтобы узнать все возможные команды процессора (т.к. доки полной тоже ведь не было), я просто вводил байты 0х00 — 0хFF и дизассемблировал результат. Таким образом удалось узнать парочку «новых» команд. Потом еще ведь и выяснял таким же образом, что они делают =)
                                                                                        Ну и к слову, я как только увидел в списке команды XOR A/SUB A, сразу же понял, что их лучше использовать для зануления аккумулятора, никто мне этого не объяснял. Еще была «особенная» команда SBC A, которая позволяла поместить в А значение флага переноса во все биты.
                                                                                          0
                                                                                          В Одессе говорят — «Чтоб я был такой умный как моя жена потом». Ноль — эта константа, которая ничем не отличается от любой другой. Когда Вам регистре, например B, нужно загрузить константу, Вы наверное пишите — MVI B,0 и тому, кто читает Вашу программу все ясно без комментариев. Так Вы поступаете всегда, пока Вам не надо загрузить 0 в аккумулятор. XRA A, SUB A — это отступление от правил и требует небольшого, но дополнительного осознания — Ааа, да тут просто обнуляется аккумулятор. В любом случае, я рад за Вас — за Ваше нестандартное мышление! Просто дополнительный вопрос — а сколько Вам было лет, когда Вы начали программировать в кодах и на ассемблере?
                                                                                            0
                                                                                            Ну так эффективное программирование на ассемблере само по себе требует не столько дополнительного осознания, сколько четкого представления всех имеющихся ресурсов процессора и понимания, как их грамотно распределить для решения поставленной задачи.

                                                                                            Мне было тогда 13 или 14 лет, точнее не помню. Я ходил в «компьютерный кружок», где стояло два спектрума 48, агат-9, какая-то электроника ВМ (позже я понял, что это был IBM-совместимый компьютер) и правец-8д. Самыми лучшими считались, конечно, спектрумы. Затем шла электроника (т.к. на ней был дисковод и можно было быстро грузить игры), агат (на нем тоже был дисковод, но ничего серьезного из ПО не было) и последним был правец.

                                                                                            Как только я попал в этот кружок, практически сразу понял, что на бейсике ничего серьезного написать невозможно, и мы стали выпрашивать преподавателя прочитать нам курс ассемблера Z80. Он не хотел, мотивируя это тем, что это нам не нужно, все равно ничего путного из нас не выйдет. Но мы настояли, и он прочитал. Это был весьма краткий курс, включающий только основные команды процессора и общий принцип их работы. Скорее всего курс был основан на 8080, т.к., многих «новых» команд процессора там не было. Тем не менее, он дал нам толчок — позволил начать писать хоть что-то на ассемблере, а уже дальше каждый разбирался как мог сам.

                                                                                            По сути, ассемблер — первый ЯП, который я выучил. И считаю, что порядок изучения языков должен быть именно таким, т.к. асм дает понимание, как работает процессор и позволяет писать любые программы на любых языках эффективней.

                                                                                            Затем начал изучать паскаль и параллельно — ассемблер 8086. Писал ассемблерные вставки внутри паскаля — это было очень просто и эффективно, код работал в 10 раз быстрее (паскаль плохо оптимизирует). Затем перешел на 32 разряда и изредка пишу на асме х86 даже сейчас. Но сейчас это не так просто — у процессора много ресурсов, а компиляторы становятся умнее и обогнать их уже не всегда оказывается такой простой задачей.
                                                                                              +1

                                                                                              Спасибо вам за Микро-80!

                                                                                      0
                                                                                      Интересная статья, но жалко что 1801 серию углублено не рассказали. На сколько помню я система команд PDP была наложена сверху на код НЦ, победила бы позиция сторонников Intel и 1801 стали бы х86 совместимыми.
                                                                                      Кстати о MOS6502, у них небыло микрокода команд, все декодирование и исполнение шло через матрицу. Насколько помню я, это и давало прирост быстродействия процессору, но ограничивало его расширение.
                                                                                        +1
                                                                                        читал, как роман
                                                                                          0
                                                                                          Экскурс в историю можно провести здесь.
                                                                                          И это интересно — переходный период от социализма к капитализму

                                                                                            0
                                                                                            Интересный материал по ЕС-1007.
                                                                                              +1
                                                                                              Спасибо. А вот здесь можно прочитать про Операционные Системы.
                                                                                              А вот еще немного истории
                                                                                              30-летие учебного пособия ОС Minix
                                                                                                +1
                                                                                                Было решено сдать всю вычислительную технику серии ЕС в утилизацию на золото, а вырученные деньги пустить на переоснащение.

                                                                                                Прямо живая история.
                                                                                                  0
                                                                                                  Да, так все и было. Есть что вспомнить и рассказать
                                                                                            0
                                                                                            Кстати, идея с двумя стеками иногда возвращается в контексте борьбы с переполнениями буферов.
                                                                                              0
                                                                                              Для 6502 добавил бы, что его ядро до сих пор живее всех живых и выпускается многотысячными тиражами во всяких детских (и не детских) игрушках типа Тамагочи, простейших «обучающих» контроллерах (не Денди/NES, хотя и их хватает)
                                                                                                0
                                                                                                В принципе многие вещи знал, о некоторых читал или смотрел видео, но как-то все было разрозненно. Здесь же, все и сразу, даже зачитался.
                                                                                                Просто отличный материал, огромное спасибо, жаль плюс статье поставить не дает, извините.
                                                                                                  0
                                                                                                  Спец команды по пересылке строк в x86 — это по сути костыли из-за отсутсвия команд с автоинкрементной и преддекрементной адресаций.
                                                                                                  И что значит PDP-11
                                                                                                  так и не была введена поддержка 16-х чисел для ассемблера
                                                                                                  ? Их структура команд была привязана к восмеричной системе счисления и позволяла легко программировать сразу в машинных кодах.

                                                                                                    0
                                                                                                    Попробуйте посмотреть на ситуацию практически. ISA PDP-11 предлагала для работы со строками использовать две команды, а x86 одну с префиксом — второе быстрее. Команды с автоинкрементом и декрементом нужны в большинстве случаев для работы со строками, поэтому если есть строковые команды, то можно и не усложнять ISA адресными автоинкрементом и декрементом. Intel решила вопрос более практично, DEC для практики имеет только преимущество по операциям типа MOV (R1)+,-(R2) или MOV -(R1),(R2)+. DEC захламила всё пространство опкодов ради абстракций, которые при наличие хороших компиляторов ничего не значат. Конечно, если с энтузиазмом программировать сразу и в машинных кодах, то компиляторы не нужны. Но это какой-то каменный век компьютерных технологий. Hа РDP-11 писали обычно на неплохом ассемблере MACRO-11 и там иногда было полезно использовать 16-е числа, но этого было нельзя даже в 90-е.
                                                                                                      0
                                                                                                      Практичность интела заставляет более активно использовать стек или обмен регистрами, чтобы высвобожать для регистры для узкоспециализированных команд. Например: сформировать третий массив из сумм элементов двух других.
                                                                                                        +1

                                                                                                        О! Абстракции PDP-11 позволяли довести процесс программирования до рефлексов и создавали ощущение понимания, сравнимое с аналогичным от ЯВУ. До сих пор ностальгирую по этому ощущению. Впрочем, это как первая любовь — забыть нельзя, повторить невозможно… ;)

                                                                                                          0
                                                                                                          Программирование на PDP-11 на асме позволяло создавать самые компактные и, главное, понятные коды. В этом плане интелу с их системой команд было далеко до DEC.
                                                                                                            0

                                                                                                            И сама структура языка была очень логичной. Вообще, на взгляд очень многих (и мой в т.ч.) — ассемблер pdp-11 — лучший из всех более-менее известных.

                                                                                                      0
                                                                                                      В 80486 были улучшены тайминги большинства инструкций и некоторые из них стали выполняться как и на процессорах ARM за такт. Хотя умножение и деление почему-то стали чуть медленнее

                                                                                                      Может по тому, что математический сопроцессор(80387) переехал в процессор?
                                                                                                        0
                                                                                                        В некоторых 8088 есть возможность выполнять команды 8080 на аппаратном уровне, переход в этот режим, насколько помню, по прерыванию int E0h.
                                                                                                          0
                                                                                                          писать про 8-битки и не упомянуть RCA1802! А ведь он и щас живее всех живых, до сих пор выпускается (CDP1802A, Intersil).
                                                                                                            0

                                                                                                            Очень подробно. Респект. Для меня новостью была информация об относительном быстродействии архитектур. Да, кстати — насколько я понимаю, первой массовой машиной в СССР был Минск-32.

                                                                                                              0
                                                                                                              8080 требовал три напряжения, а 8080A — только одно — +5V. Наши клоны были соответственно K580ИК80 (позднее ВМ80) и КР580ВМ80А; причём, 80 был в тонком корпусе с мягкими выводами (только пайка), а 80А — в обычной многоножке (соответственно, легко ставился на розетку). Реально у нас использовался только 8080А/ВМ80А — во всех компьютерах местной разработки. В вики есть фото Квазаровского ИК80 — у меня когда-то лежало несколько таких без дела.
                                                                                                              Тут интеловский 8080A был конкурентом их же 8085, и Z80 — наверно, поэтому 8085 оказался никому не нужен.

                                                                                                              > Есть основание полагать, что GNU ассемблер для x86 делали под влиянием именно ассемблера PDP-11.

                                                                                                              Да, но не напрямую. Сначала был порт System V на i386, сделанный AT&T. Именно в нём было принято такое решение — и множество других, напрямую склонированных с Unix ассемблера PDP-11 и VAX-11 — таких, например, как команды ассемблера, начинающиеся с точки (.byte, .word, .align...) Эти наработки были куплены и перенесены в SCO Unix. И уже под влиянием SCO был сделан GNU as.

                                                                                                              Некоторые особенности их решений сохраняются до сих пор. Например, в AT&T отличие fsubr от fsub в том, что суффикс r означает укладку результата не в st(0), а в другой регистр — хотя в оригинальном Intel синтаксисе это означало укладку в регистр вычитаемого, а не уменьшаемого. Или, они заменили идиотски путаные обозначения Intel для команд расширений знака (кто помнит навскидку отличие cwde от cwd?) на свои такие же путаные (cltd против cltq).

                                                                                                              > Очень странные и непредсказуемые эффекты можно получить, используя счётчик команд как обычный регистр.

                                                                                                              У PDP-11 они как раз очень предсказуемые — порядок отработки побочных эффектов аргументов чётко задан.

                                                                                                              80188 использовался в некоторых моделях PC XT. Но самое знаменитое его применение — это в модемах USR Courier. В бСССР для него писали прошивки с заточкой под местную специфику, пользуясь лёгкостью понимания.

                                                                                                              > с тех пор деление делать быстрее так и не научились!

                                                                                                              Частично научились, но это действие вообще проблемное, и на его оптимизацию не тратят усилий.

                                                                                                              Про условные переходы:
                                                                                                              > С 80386 стало возможным использовать смещения из двух байт

                                                                                                              В 32-битном режиме — все 4.

                                                                                                              > С этого процессора начинается использование страничной виртуальной памяти – сегодня это доминирующая технология.

                                                                                                              Мнэээ… IBM 370, VAX умели страничную адресацию сильно раньше.

                                                                                                              Про 6502… он был удачный с точки зрения внутренней конструкции, да. Но писать что-то серьёзное под него было пыткой — говорю как краевед (Агаты в школе), из-за единственного аккумулятора и постоянных конфликтов за ячейки нулевой страницы. Если бы ему дали хотя бы 3 нормальных почти универсальных 16-битных регистра, он бы точно побил всех конкурентов. Боюсь, помешали этому те же причины, что потом убили его развитие.
                                                                                                                0
                                                                                                                8085 был очень даже нужен и очень широко использовался, но в качестве CPU в компьютеры не пошёл, хотя вполне мог бы. 8080A и КР580ВМ80А также использовали три напряжения — см. документацию. Про SCO не знал, благодарю. Насчет непредсказуемых эффектов PDP-11 есть хорошая тема, даю ссылку и посмотрите на материалы рядом — ссылка.
                                                                                                                IBM 370, VAX умели страничную адресацию сильно раньше.
                                                                                                                Только это «сильно раньше» было без процессоров-чипов, о которых статья. 6502 очень хороший процессор, проэмулировать на нём z80 — сущий пустяк. Нужно только вместо регистров BC,DE,HL использовать 6 байт на нулевой странице. Писал коды для одинаковых программ для обоих процессоров — ссылка — 6502 более гибок и требует меньших усилий от программиста. Не забывайте, что 256 байт нулевой страницы имеют функциональность регистров, это, повторю, в частности, 128 индексных регистров. Посмотрите на команду LDA ($55,X) — тaкое на z80 не представить.
                                                                                                                  0
                                                                                                                  Насчет непредсказуемых эффектов PDP-11 есть хорошая тема, даю ссылку и посмотрите на материалы рядом — ссылка.

                                                                                                                  Там обсуждения конкретных совместимых с PDP-11 процессоров. Так можно и процы x86 Intel оценивать по процам x86 от AMD.
                                                                                                                    0
                                                                                                                    > 8080A и КР580ВМ80А также использовали три напряжения — см. документацию.

                                                                                                                    Хм, я не нашёл с ходу упоминания специфики именно 8080A, все почему-то универсально говорят про оба. OK, сочтём это за сбой памяти.

                                                                                                                    > непредсказуемых эффектов PDP-11

                                                                                                                    Про это уже ответили — неродные процессоры могли как-то лажать, но DEC, насколько я знаю, чётко держал планку.
                                                                                                                    И эти эффекты не касаются самых важных вопросов — например, порядок выбора дополнительных слов в командах типа mov #1, 20(%2).

                                                                                                                    > Только это «сильно раньше» было без процессоров-чипов, о которых статья.

                                                                                                                    Не сходится: вы VAXʼу отдельную главу посвятили.
                                                                                                                    Не принципиально, но считаю необходимым заметить.

                                                                                                                    > Посмотрите на команду LDA ($55,X) — тaкое на z80 не представить.

                                                                                                                    И смысла в ней где-то на уровне ноль целых фиг десятых. Я ещё в те времена как-то заинтересовался осмысленностью этой адресации, пересмотрел (чёрт, грепа не было, листал и глазами смотрел) код стандартных программ типа Бейсика, Школьницы — случаи были просто единичные и тупо сомнительные, в отличие от $ABCD,X или ($AB),Y — последняя вообще использовалась на каждом шагу (ну ещё бы).
                                                                                                                    Был какой-то паттерн написания, при котором именно такая адресация была полезна? Если да, я его не знаю и не использовал.
                                                                                                                    В остальном, под что легче писать — вкусовщина, но меня постоянное гоняние байтиков через аккумулятор просто доставало, особенно видя рядом вкусные аналоги типа клонов PDP-11.
                                                                                                                    Если бы конкуренты не тратили попусту по 4 такта на ерунду, тот 6502 просто не взлетел бы.
                                                                                                                      0
                                                                                                                      Есть очень большая тема по 6502 — Форт. Как правило, адресация типа ($EE,X) используется для реализации внутреннего стека Форта. Она может быть удобна проста для доступа к ячейке памяти, если регистр Y занят, а Х установлен в нуль или имеет известное значение. Ассемблер PDP-11 для байтовых операций очень неуклюж. Для ваксов сделали процессор, но это уже после 32016. Написано, что 32016 был именно первым процессором со страничной организацией вм. Адресации типа ($AA),Y действительно очень удобна — остальные 8-битные системы могут только завидовать такой. В том то и дело — такты, команда 6502 поняла это одними из первых.
                                                                                                                  0
                                                                                                                  Очень хороший обзор, спасибо.
                                                                                                                  Сам сталкивался с 6502 (точнее 6510), 6809, tms9900, 8048, cp1610, x86.
                                                                                                                  Больше всего кода написал для x86 (8086-80486), но писать под него, на мой взгляд, неприятно (как и вообще под архитектуру PC, куда эти процессора ставились).
                                                                                                                  Больше всех понравился, пожалуй, 6809. На втором месте 6502.
                                                                                                                  Чуть-чуть потрогал sparc — там интересна идея регистровых окон. Трогал также 8080 и z80, но душа к ним не легла.
                                                                                                                  О программировании под 68000 от людей слышал почти исключительно хорошие отзывы, завидовал (в те времена, когда я сидел на PC, а знакомые на Amiga).
                                                                                                                    +2
                                                                                                                    Прочитал, интересно, спасибо.

                                                                                                                    litwr2 вы слышали про КолибриОС, ядро и многие программы которой написаны на ассемблере? Может быть смотрели исходники ядра? Что думаете?
                                                                                                                      +1
                                                                                                                      Благодарю за добрые слова. Про Колибри и её родственника Menuet знаю давно, запускал и удивлялся ещё лет более 10 назад. Там все базовые программы на ассемблере. Хотел кое-что прикладное написать, но не хватило возможностей найти время. С ядром не работал.

                                                                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                                      Самое читаемое