Эмоциональная история процессоров для первых компьютеров с 70-х до начала 90-х
Из песочницы
Мне довелось программировать на ассемблерах разных процессоров. Последний в списке – это Xilinx MicroBlaze. Решил выложить некоторые свои наблюдения за особенностями этих почти волшебных железок, которые как волшебный ключик Буратино открыли нам двери в волшебную страну виртуальной реальности и массовой креативности. Об особенностях современных систем x86, x86-64, ARM, ARM-64 и т.п. писать не буду, может быть в другой раз – тема очень большая и сложная. Поэтому планирую закончить на Intel 80486 и Motorola 68040. Хотелось ещё включить в обзор IBM/370, с которыми имел дело. Эти системы были довольно далеки от широких масс пользователей, но оказали при этом огромное влияние на компьютерные технологии. На них просто не хватило выделенного на тему времени, они не использовали процессоры-чипы и самих их вроде бы почему-то не осталось совсем. Очень надеюсь, что мои материалы привлекут внимание и знатоков, которые смогут добавить что-нибудь из того, о чем не подумал или не знал.
В качестве иллюстративного материала прикрепляю свой небольшой камень из Розетты – программки для расчета числа π на разных процессорах и системах по алгоритму-затвору, претендующие на звание самых быстрых его реализаций.
Первый настоящий процессор на чипе, сделанный в первой половине 1974 года, он до сих пор производится и находит себе применение. Многократно клонировался по всему миру, в СССР имел обозначение КР580ВМ80А. Современные процессоры Intel для РС до сих пор легко обнаруживают свою родственность этому уже в каком-то смысле реликтовому изделию. Сам для этого процессора кодов не писал, но будучи хорошо знакомым с архитектурой z80, рискну привести некоторые свои замечания.
Систему команд 8080, как и других процессоров Intel для РС, трудно назвать идеальной, но она универсальная, достаточно гибкая и имеет несколько очень привлекательных особенностей. От своих конкурентов, Motorola 6800 и MOS Technology 6502, 8080 выгодно отличался большим количеством пусть и несколько неуклюжих регистров, предоставляя пользователю один 8-битный аккумулятор А, один 16-битный полуаккуммулятор и по совместительству быстрый индексный регистр HL, 16-разрядный указатель стека SP, а также ещё два 16-битных регистра ВС и DE. Регистры BC, DE и HL можно было использовать и как 6 байтовых регистров. Кроме того, 8080 имел поддержку почти полного набора флагов состояния: переноса, знака, нуля и даже чётности и полупереноса. Некоторые инструкции из набора команд 8080 долгое время были чемпионами по быстродействию. Например, команда XCHG делает обмен содержимым 16-битных регистров DE и HL всего за 4 такта – это было исключительно быстро! Ряд других команд хотя и не ставили столь яркие рекорды, но также долгое время были одними из лучших:
Этот процессор был использован в первом персональном компьютере Altair 8800, ставшим весьма популярным после журнальной публикации в начале 1975. К слову, в СССР похожая публикация случилась только в 1983, а соответствующая ей по актуальности только в 1986.
Первый почти ПК
Intel 8080 стал основой для разработки когда-то первой массовой профессиональной операционной системы CP/M, занимавшей доминирующие позиции среди микрокомпьютеров для профессиональной работы до середины 1980-х.
Теперь о недостатках. 8080 требовалось три напряжения питания -5, 5 и 12 вольт. Работа с прерываниями скорее неуклюжая: нужен специализированный контроллер и немаскируемые прерывания не поддерживались. И в целом 8080 скорее нетороплив, если сравнить его с вскоре появившимися конкурентами. 6502 мог быть до 3-х раз быстрее при работе на той же частоте, что и 8080. В системе команд несколько раздражает наличие 6 бессмысленных инструкция типа
Но в архитектуре 8080 было заложено, как оказалось, правильное видение будущего, а именно того неочевидного в 70-х факта, что процессоры будут быстрее памяти. Регистры 8080 DE и BC – это скорее прообраз современных кэшей, с ручным управлением, чем регистры общего назначения. 8080 начал с частоты 2 МГц, а конкуренты только с 1, что сглаживало разницу в производительности.
Первое время 8080 продавался по весьма высокой цене $360, но это была своеобразная ссылка на большие компьютеры IBM/360. Intel как бы сообщала, что если купить 8080, то можно получить что-то похожее на очень дорогой мейнфрейм.
Трудно назвать 8080 8-битным процессором на все 100%. Конечно, АЛУ у него на 8 бит, но есть много 16 разрядных команд, работающих быстрее, чем если использовать только 8-битные аналоги вместо них. А для некоторых команд 8-битных аналогов нет вообще. Команда XCHG по сути и таймингам 100% 16-битная. Есть реальные 16-разрядные регистры. Поэтому рискну назвать 8080 частично 16-битным. Было бы интересно по совокупности признаков вычислять индекс разрядности процессора, но, насколько известно автору, пока такой работы никто не проделал.
Автор не знает причины, почему Intel отказалась от прямой поддержки развития 8-битных персоналок своими процессорами. Intel всегда отличaла сложность и неоднозначность политики. Её связь с политикой, в частности, иллюстрирует тот факт, что долгое время у Intel функционируют заводы в Израиле и до конца 90-х это было тайным. Intel практически не пыталась улучшить 8080, была лишь до 3 с небольшим МГц поднята тактовая частота. Фактически 8-битный рынок был передан фирме Zilog с родственным 8080 процессором z80, который смог довольно успешно противостоять главному конкуренту, «терминатору» 6502. А Zilog к концу 70-х была компанией с огромными возможностями, имея почти неограниченное финансирование от Exxon и даже две новейшие фабрики по производству чипов, что было реально много – Motorola, имея миллиардный бизнес, имела в то время также только две фабрики. В начале 80-х значение 6502 стало уже незначительным и Zilog тоже стремительно потерял свой вес – странное совпадение. Кроме того, 8080 и 8085 использовались обычно как контроллеры и в этом качестве могли успешно продаваться по более высокой цене. Наличие z80 позволяло Intel устраниться от конкуренции 8-битных процессоров для компьютеров, где 6502 сильно обвалил цены.
В СССР и России отечественный клон 8080 стал основой многих массовых компьютеров, сохранявших популярность до начала 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. Были добавлены ещё несколько инструкций и даже даже два новых флага признаков: флаг переполнения и флаг, двоично суммирующий переполнение и знак. Работа с новыми флагами, особенно вторым практически не поддерживалась. Точное назначение второго флага, типичного для знаковой арифметики, стало известным только в 2013, спустя 37 лет после появления 8085! Этот флаг позволяет за раз проверить выполнение отношений «больше или равно» или «меньше», но проверки для парных им отношений потребуют ещё работы с флагом нуля. Были ускорены на такт многие инструкции для работы байтовыми данными. Это было очень существенно, так как на многих системах с 8080 или z80 вводились такты задержки, которые из-за наличия лишних тактов на 8080 могли вытянуть время исполнения почти в два раза. Например, в отечественном компьютере Вектор инструкции типа регистр-регистр выполнялись 8 тактов, а если бы там стоял 8085 или z80, то эти же инструкции выполнялись бы только за 4 такта. Инструкция XTHL стала быстрее на два такта, а инструкции переходов даже на 3. С новыми инструкциями можно написать код для копирования блока памяти, который работает быстрее команд LDI/LDD процессора Z80! Программы для 8080 8085 также, как правило, исполняет несколько быстрее чем Z80. Однако, некоторые инструкции, например, вызов подпрограммы, 16-битный инкремент и декремент, PUSH, загрузка SP и условные возвраты стали на такт медленнее.
8085 имеет встроенный последовательный порт ввода-вывода и улучшенную поддержку работы с прерываниями: в добавок к зависящему от внешнего контроллера способу, унаследованному от 8080, добавлена подддержка трех маскируемых и одного немаскируемого прерывания – это позволяет, при необходимости, обходиться без отдельного контроллера прерываний в системе. Работа с портом и с управлением прерываниями реализуется через инструкции SIM и RIM – только эти две новые инструкции были официально документированы. Однако, само обслуживание прерываний осталось таким же как и 8080 – очень минималистическим: при прерывании процессор не сохраняет даже слово состояния, это сохранение нужно явно прописывать в коде. Как уже отмечалось, работа со знаковой арифметикой так осталась несколько недореализованной. 16-битная арифметика также не получила поддержки некоторых очень желательных команд: сложения с переносом и вычитания. Такие команды были добавлены в Z80. В 8085 при сложении, например, 32-битных целых нужно использовать условный переход для учета переноса – это, кстати, тоже похоже на мейнфреймы IBM.
Однако, могу опять повторить формулу «по неизвестным автору причинам» Intel отказалась продвигать 8085 в качестве главного процессора. Только в 80-е появилось несколько довольно успешных систем на базе 8085. Первым в 1981 появился предшественник и почти конкурент IBM PC – IBM System/23 Datamaster. Затем в 1982 был выпущен очень быстрый компьютер с превосходной графикой Zenith Z-100, в котором 8085 работал на 5 Мгц. В 1983 в японской фирме Kyotronic был создан очень удачный наколенник KC-85, варианты которого производились и другими фирмами: Tandy производила TRS-80 model 100, NEC – PC-8201a, Olivetti – M-10. Всего их было выпущено возможно более 10 миллионов экземпляров таких компьютеров! В СССР/РФ в начале 90-х на основе отечественного клона ИМ1821ВМ85А были попытки усовершенствовать некоторые системы, например, компьютер Вектор. Удивительно, что главным процессором марсохода Sojourner, достигшем поверхности Марса в 1997, был 8085 с частотой 2МГц! Такой успех 8085 в 80-е во многом связан с тем, что в 1979 был готов 80C85, вариант 8085 с низким энергопотреблением. Упомянутый первый реально карманный компьютер Tandy 100 мог работать до 20 часов на одной зарядке! Возможно, что если бы не ARM, то 80C85 активно использовали бы в мобильных компьютерах и в 90-е.
Фактически фирма Intel дала z80 «зеленый цвет». Спустя несколько лет в битве за 16-битный рынок Intel повела себя совершенно иначе, начав тяжбу по запрещению продаж процессоров v20 и v30 в США. Интересно, что упомянутые процессоры японской фирмы NEC могли переключаться в режим полной бинарной совместимости с 8080, что сделало их самыми быстрыми процессорами архитектуры 8080.
Другая тайна фирмы Intel – в отказе от публикации расширенной системы команд, включая поддержку новых флагов. Впервые она была опубликована в журнале в 1979, а затем и некоторыми из производителей этого процессора. Однако опубликованная информация о новых флагах была весьма неполной. Каковы причины такого странного отказа? Можно лишь гадать. Может Zilog тогда играл роль, подобную которую когда-то возможно играл AMD, и создавал видимость конкуренции, а 8085 мог обрушить Zilog? Может дело в желании сохранять систему команд поближе к проектируемому тогда 8086? Последнее кажется сомнительным. Intel 8086 был выпущен спустя более 2 лет после выпуска 8085 и трудно поверить, что в 1975 уже была известна система его команд. И в любом случае, совместимость как с 8080, так и с 8085 на 8086 достижима только с использованием макропроцессора, заменяя иногда одну команду 8080/8085 (POP/PUSH PSW, Jcc, Ccc, Rcc, XTHL) на несколько своих. Причем две опубликованные новые инструкции 8085 (SIM, RIM) в 8086 не реализуемы вообще. Есть мнение, что отказ произошел только из-за сложностей в поддержке переноса на код 8086 новых флагов 8085. Действительно, такой перенос с поддержкой побитовой работы со словом состояния процессора получается крайне громоздким. Но 7 из 10 новых инструкций прямого отношения к использованию новых флагов не имеют и их можно было бы публиковать без создания сложностей по совместимости с 8086. Можно ещё предположить, что в Intel остались недовольны реализацией знаковой арифметики на 8085 и решили, что лучше скрыть, чем создать почву для постоянной критики. Хотя и в этом случае, семь новых инструкций можно было публиковать, а скрыть только флаги и три инструкции.
Особенно трудно объяснить, почему Intel не опубликовала информацию о новых командах уже после выпуска 8086. Можно только ещё предположить, что скорее всего дело было в маркетинге. Искусственно ухудшив спецификации 8085, получали на этом фоне более эффектный 8086.
Рискну предположить ещё одну версию. 8085 было очень трудно, почти невозможно расширить до реально 16-разрядного процессора. А 6502, имея незадействованными почти половину опкодов, мог легко быть расширен до 16-бит. Поэтому для Intel было важно создать тренд на переход к 16-битной архитектуре, без совместимости с 8-битной. Отказываясь от новой полезной функциональности 8085, как бы сообщали, что 8-битки это плохо и уже неважно, надо переходить на 16-бит. Что-то похожее происходило и вокруг 32-битной архитектуры, когда Intel создала ложный тренд на разработку сложного и бесперспективного Intel 8800 или iAPX 432.
Процессоры Motorola всегда отличались наличием нескольких очень привлекательных «изюминок» при одновременном наличие каких-то несуразных по абстрактности и малопрактичности архитектурных решений. Главная «изюминка» всех рассматриваемых процессоров – это второй полноценный и очень быстрый регистр-аккумулятор.
6800 был первым в мире процессором, которому требовалось только один источник питания (5 вольт) – это было очень полезное новшество. Кроме того, на 6800 была также впервые реализована поддержка немаскируемых прерываний. Ho 6800 из-за единственности громоздкого для 8-битной архитектуры 16-битного индексного регистра получился неудобным для программирования и использования изделием. Он был выпущен ещё в 1974, ненамного позже 8080, но так и не стал основой для какой-либо известной компьютерной системы. Интересно, что разработчики 6502, Чак Педдл (Chuck Peddle) и Бил Менш, называли 6800 неправильным, «слишком большим». Однако, он и его варианты широко использовались как микроконтроллеры. Возможно тут стоит заметить, что Intel производила процессоры с 1971, что поставило Motorola в положение догоняющей стороны, для которой 6800 был самым первым процессором. И если сравнить 6800 не с 8080, а с его предшественником 8008, то 6800 окажется значительно предпочтительнее. Motorola почти догнала Intel с 68000/20/30/40. Можно ещё заметить, что в 70-е Motorola была значительно более крупной компанией, чем Intel.
Производились также многочисленные варианты 6800: 6801, 6802, 6803, 6805,… Большинство из них это микроконтроллеры с встроенной памятью и портами ввода-вывода. 6803 – это упрощенный 6801 и его использовали в сильно запоздалом (1983) для своего класса компьютере Tandy TRS-80 MC-10 и его французском клоне Matra Alice, которые были сравнимы с Commodore VIC-20 (1980) или Sinclair ZX81 (1981). Система команд 6801/6803 была значительно улучшена, были добавлены 16-битные команды, умножение,… Появилась необычная инструкция безусловного перехода (BRN – branch never), который никогда не выполняется! Некоторые инструкции стали чуть быстрее. Тут можно заметить, что архитектура 680x формировалась под сильным влиянием архитектуры PDP-11. Некоторые детали PDP-11 были скопированы скорее механически, например, бесполезные команды CLV и SEV.
680x полностью поддерживают работу с целыми числами со знаком, z80 и 6502 поддерживают её хуже, а у 8080 такой поддержки нет практически совсем. Однако в 8-битном программном обеспечении такая поддержка нужна была очень редко.
6809 был выпущен в 1978, когда с 8086 уже началась 16-битная эпоха, и имеет весьма развитую систему команд, включая умножение двух байтовых аккумуляторов с получением 16-разрядного результата за 11 тактов (для сравнения, 8086 требует от 70 тактов на подобную операцию). Два аккумулятора могут в нескольких случаях группироваться в один 16-разрядный, что даёт быстрые 16-битные инструкции. 6809 имеет два индексных регистра и рекордное среди 8-битных процессоров число методов адресации – 12. Среди методов адресации есть уникальные для 8-битных чипов, такие как индексная с автоинкрементом или декрементом, относительно счётчика команд, индексная со смещением. 6809 имеет интересную возможность использовать два типа прерываний: можно использовать быстрые прерывания с частичным автоматическим сохранением регистров и прерывания с полным сохранением регистров – у 6809 есть три входа для сигналов прерывания FIRQ (быстрое маскируемое), IRQ (маскируемое), NMI (немаскируемое). Также иногда удобны в использовании быстрые инструкции чтения и установки сразу всех флагов.
Однако, операции с памятью требует на такт больше, чем 6502 или 6800. Индексные регистры так и остались неуклюжими 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 – можно только исходники от 6800 транслировать в код 6809, что аналогично случаю с 8080 и 8086. 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
680x имеют интересную недокументированную инструкцию с интересным названием «Остановись и поджарься» (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.
Это процессор с очень драматической судьбой. Ни один другой процессор в этом с ним сравниться не может. Его появление и внедрение сопровождалось очень большими по размаху и последствиям событиями. Перечислю некоторые из них:
Всё началось с того, что в Motorola по неизвестным вполне причинам отказались поддержать инициативного инженера, Чака Педла, предлагавшего улучшить в целом довольно посредственный процессор 6800, сделать его быстрее и, главное, значительно дешевле. Ему и пришлось покинуть компанию и продолжить свои наработки в небольшой, но перспективной фирме MOS Technology. Он смог уговорить семь других инженеров последовать за ним и только один из них впоследствии вернулся в Motorola. В 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 раза. Как следует из некоторых публикаций уже в 1975 в MOS Technology были планы проводить расширение 6502 до 16-разрядного уровня…
MOS 6501 рвет конкурентов: Intel и Motorola уже вычеркнуты!
Но Motorola начала судебный процесс против своих бывших сотрудников – те якобы использовали технологические секреты фирмы. В ходе процесса удалось установить, что один из инженеров, ушедших из Motorola, вынес некоторые конфиденциальные документы по 6800, действуя вопреки установкам своих коллег. Был ли это его собственный поступок или за ним стояли какие-то направляющие силы до сих пор неизвестно. В итоге Motorola вынудила MOS Technology, чьи финансовые возможности были весьма невелики, выплатить значительную сумму в $200000 и к отказаться от производства 6501. Intel в похожей ситуации с Zilog действовала совсем не так. Хотя надо признать, что MOS Technology действовола иногда слишком рисковано, когда пыталась использовать большие деньги, потраченные Motorola на продвижение 6800, в своих целях. Ирония ситуации заключается в том, что, как отмечал лидер команды разработчиков 6502, они с 6501 просто хотели сделать «предупредительный выстрел» и посмотреть, что из этого получится. Цели предлагать использовать 6501 вместо 6800 не было. Реально 6501 никогда и не продавался. Тут ещё можно заметить, что 6501 был всё же не совсем совместим с аппаратурой для 6800, он и 6502, в частности, не поддерживал работу с тремя состояниями выводов и поэтому не мог использоваться напрямую, например, с аппаратурой с прямым доступом к памяти, как 6800.
Мы до сих пор в точности не знаем, почему Motorola выиграла тяжбу с MOS Technologies. Возможно просто у MOS Technologies закончились деньги, их на процесс было потрачено до $800000, а деньги тогда были в несколько раз весомее, чем сейчас. Хотя были и другие факторы. Вроде упомянутого выноса документов. Известно ещё, что, например, чип параллельного интерфейса 6520, производимый в MOS Technology, был точной копией Motorola 6820. Всем, кто ушёл из Motorola, пришлось подписать своё согласие с решением по иску, так как перед началом процесса они подписали бумагу с тем, что они признают любой его результат.
Далее в истории появляется легендарная фирма Commodore и её не менее легендарный основатель Jack Tramiel, в тени которого находилась фигура главного финансиста фирмы, определяющего её политику – человека по имени Irving Gould. Джек получил кредит у Ирвинга и на эти деньги, используя несколько, мягко сказать, недобросовестную тактику, вынудил MOS Technology стать частью Commodore. После чего, возможно и вопреки желанию Трамела, вынужденного уступать Гуду, разработка 6502 практически остановилась и это при том, что ещё в 1976 удалось произвести опытные образцы 6502 с рабочими частотами до 10 МГц, хотя сообщение об этом появилось только спустя многие годы от человека по имени Bill Mensch (он был в команде, покинувшей Motorola), который не раз делал громкие, но по большому счету пустые заявления и сыграл в судьбе 6502 довольно неоднозначную роль. Чак Педдл навсегда был отстранён от разработки процессоров. Работать с 6502 продолжили не только в Commodore, но и в фирме, созданной Биллом Меншем, Western Design Center (WDC). Любопытно, что никто из прежней команды 6502 не работал с ним в дальнейшем. Кстати, это именно Бил Менш разработал упомянутый выше 6820, который превратился в 6520. Возможно если бы развитие 6502 не было остановлено, то он мог бы превратиться в основной процессор для персональных компьютеров. У IBM, например, были планы по созданию своего первого массового ПК на базе 6502. В качестве первого шага в этом направлении там собирались купить компанию Atari, которая одной из первых стала использовать этот процессор.
Но на этом драма вокруг 6502 не закончилась. В 1980 в журнале AIM65 Interactive фирмы Rockwell появилась короткая анонимная статья, о том, что все 6502 несут в себе опасного бага, который получил название JMP (xxFF). Тон статьи предполагает, что-то совершенно из ряда вон выходящее. Впоследствии этот настрой перешёл в позицию фирмы Apple по этому вопросу и стал неким мейнстримом. Хотя никакого «бага», строго говоря, не было. Конечно, специалисту, привыкшему к комфортным процессорам больших систем тех лет, одна из особенностей, вполне уместных и даже полезных среди микропроцессоров, могла показаться чем-то раздражающим, багом. Но на самом деле это, задевшее чьи-то чувства, поведение было описано в официальной документации от 1976 года и в учебниках по программированию, вышедших до появления упомянутой статьи. «Баг» был ликвидирован Билом Меншем, сделавшим 65С02 (CMOS 6502) к 1982. Автор этого материала сам сталкивался несколько раз с проблемой этого «бага». Ничего не зная о нем, писал программы для Коммодоров. Потом одну из них перенес на системы, где использовался набор команд 65С02. Возникла несовместимость, пришлось менять коды, делать условную компиляцию. Код для 65С02 получился более громоздким и медленным. Потом поднимал этот вопрос на форуме 6502.org, где большинство участников из мира Apple. Спросил, может ли кто-нибудь привести пример, когда означенный «баг» рушил программу. Получил только эмоциональные и общие замечание, конкретного примера так и не было предложено. Иронично, что в официальной документации WDC «баг» не называют прямо багом, а скорее какой-то странностью, вывертом
Баг!!!
В то время как Intel, Motorola и другие сделали уже 16-битные процессоры новых поколений, 6502 был лишь микроскопически улучшен и сделан искусственно частично несовместимым с самим собой. Даже если сравнивать улучшения, сделанные в Motorola 6801 по сравнению с 6800 или в Intel 8085 по сравнению с 8080, то они окажутся гигантскими по сравнению с теми, что были сделаны в 65C02. Кроме того, Intel и Motorola сделали их значительно раньше. В 65C02 был сделан ряд небольших изменений, которые, в частности, привели к изменению в ходе исполнения нескольких инструкций, которые стали медленнее на такт, но при этом в каком-то надуманном академическом смысле они стали более правильными. Речь идёт об упомянутом «баге» и инструкциях десятичной арифметики. Последние были «скорректированы» так, что флаги oVerflow, Negative и Zero стали работать «корректно». Однако, при работе с десятичными числами на 6502 (и других микропроцессорах) знак не поддерживается и соответственно флаги N и V не имеют для них никакого смысла. Только коррекция флага нуля имеет какой-то смысл, но крайне незначительный. Были также добавлены десятки новых инструкций, абсолютное большинство которых лишь занимали кодовое пространство, почти ничего не добавляя к возможностям 6502, что оставляло меньше кодов для возможных дальнейших модернизаций. Но, надо признать, что несколько новых инструкций оказались ожидаемыми и полезными, например, BIT с новыми адресными режимами и
65C02 был лицензирован многим фирмам, в частности, NCR, GTE, Rockwell, Synertek и Sanyo. Он использовался в Apple II, начиная с моделей IIe, хотя многие IIe использовали NMOS 6502. Вариант 65С02 6512 использовался также в поздних моделях BBC Micro. Atari использовала NMOS 6502, хотя там была попытка перехода на CMOS, но из-за обнаруженных проблем, в частности, на 65C02 не шла известная игра Asteroids, от этих попыток отказались. Commodore так и не выпустил компьютера на базе CMOS 6502, хотя в некоторые прототипы его использовали. Фирмы Synertek и Rockwell помимо CMOS 6502 производили и NMOS 6502. Кстати, NMOS 6502 имеет свой набор недокументированных инструкций, природа которых совершенна отлична от «секретных» команд 8085. В 6502 эти инструкции появились как побочный эффект, поэтому большинство из них скорее бесполезны, но несколько, например, загрузка или выгрузка одной командой сразу двух регистров и некоторые другие могут сделать код более быстрым и компактным.
Интересно, что NMOS 6502, совместимого с 65C02, так и не сделали. Хотя в начале 80-х технология CMOS не имела явных преимуществ (кроме пониженного энергопотребления) перед NMOS и её развитием HMOS и при этом была заметно дороже. Стоит конечно заметить, что WDC смогла создать CMOS процессор всего лишь спустя несколько лет после того, как Intel и Motorola сделали CMOS варианты своих процессоров 8085 и 680x. В этом она значительно опередила Zilog, где CMOS вариант Z80 был создан только к 1987 году. Однако, если CMOS 8085 и Z80 сразу нашли широкое употребление в мобильных компьютерах, то низкое энергопотребление 65C02 нашло свое применение в компьютерах сравнительно поздно, могу назвать лишь игровую консоль Atari Lynx, производившуюся с 1989. Стоит ещё заметить, что само по себе внедрение технологии CMOS – это вполне рутинный процесс, через который другие процессоры (x86, 68k, ...) прошли практически незаметно.
Были и другие попытки модернизировать 6502. В 1979 появилась статья, что для компьютеров Atari готовится к производству процессор 6509 (не путать с появившимся позже процессором с таким же названием фирмы Commodore), в котором ожидалось ускорение исполнения команд на 25% и много новых инструкций. Но по неизвестным в точности причинам производство этого процессора так и не состоялось. Commodore проводила лишь микроскопические модернизации. С точки зрения программирования самым интересным является процессор 6509, который пусть и в очень примитивной форме с помощью всего двух специально выделенных для этой цели инструкций и двух байт нулевой страницы позволяет адресовать до 1 МБ памяти. В сверхпопулярных Коммодорах 64 и 128 стояли процессоры 6510/8510, а в менее удачливых серии 264 – 7501/8501. Эти процессоры имели лишь соответственно 6 и 7 встроенных битовых портов ввода-вывода, при этом 7501/8501 не поддерживали немаскируемых прерываний. Кроме того, на этих процессорах реализовали поддержку с логикой трех состояний, что было необходимо для работы с видеоконтроллерами на C64 и C264. Фирма Rockwell производила вариант 65C02 со своим расширенным 32 битовыми операциями (похожи на битовые инструкции z80) набором инструкций, однако, насколько мне известно, в компьютерах такие процессоры не использовались и сами эти битовые инструкции имели значение скорее только для использования во встроенных системах. Это расширение, кстати, тоже произвёл Билл Менш. Получается, что Билл работал над 6502, только имея конкретные заказы, и никогда не пытался сам в чем-то этот процессор улучшить.
Последняя сцена драмы с участием 6502 обозначилась в недопущении компьютеров на базе 6502 с частотой 2 МГц на рынок США в первой половине 80-х. Это коснулось иностранца-англичанина BBC Micro, их производившая фирма Acorn сделала большую партию компьютеров для США, но, как оказалось, зря. Сработала какая-то блокировка и компьютеры пришлось срочно переделывать под европейские стандарты. Полуамериканские, но формально канадские компьютеры Commodore CBM II (1982), несмотря на некоторые проблемы (в частности, по соответствию стандартам на электрооборудование), были всё же допущены. Возможно из-за того, что у них не было графических режимов и даже цветного текста – этого не мог компенсировать даже стильный Porsche-дизайн. Последним в списке неудачников оказался 100% американский Apple III (1980) – известно, что Стив Джобс, как и менеджмент Apple в целом, сделали много, чтобы этот этот компьютер не состоялся. Джобс требовал явно невыполнимых спецификаций, а менеджмент – нереальных сроков. Удивительно, что по одному из требований менеджмента, Apple III должен был быть только ограниченно совместимым с Apple II! В Apple III Plus, выпущенном в 1983, удалось устранить некоторые недостатки Apple III, но менеджмент Apple тихо закрыл проект в 1984 возможно из-за нежелания иметь конкуренцию с компьютером Macintosh. Только в 1985, когда эпоха 8-битной техники начала уходить, появился Commodore 128, который мог использовать в одном из своих режимов 6502 с тактом на 2 МГц. Но и тут получился скорее анекдот, так как этот режим практически не поддерживался и программ для него практически нет. В этом же году должен был быть выпущен перспективный наколенник Commodore LCD с 65C02 @2MHz. Однако, несмотря на успешную публичную демонстрации проект был почему-то закрыт. Только во второй половине 80-х в США стали производить приставки-ускорители для Apple II, а с 1988 и модель Apple IIc+ c процессором на 4 МГц. Почему так случилось? Возможно потому, что 6502 на 2 или 3 МГц (а такие уже производились в самом начале 80-х) на ряде задач и в особенности с играми могли успешно конкурировать с системами на основе Intel 8088 или Motorola 68000. В 1991 волевым решением корпорация Commodore закрыла интересный, хотя и запоздалый проект С65 на базе процессора 4510 с частотой 3.54 МГц. Чип 4510 был сделан на основе процессора 65CE02, который в свою очередь сделан на основе WDC 65C02. 65CE02 – это самый быстрый 6502, сделанный только в 1988, в нём была проведена наконец упоминавшаяся раннее оптимизация циклов, давшая 25% прирост скорости. Таким образом, процессор в С65 по быстродействию близок к системам с 6502 на 4.5 МГц. Удивительно, но этот самый быстрый 6502 с расширенным набором инструкций (в каких-то деталях это расширение получилось более удачным, чем в 65816) нигде с тех пор так и не нашёл применения.
C128 и Apple III Plus имели блок управления памятью (MMU), что позволяло использовать несколько стеков и нулевых страниц, адресовать более 64 КБ памяти, и др. В C128 MMU был искусственно урезан для работы только со 128 КБ памяти. Для BBC Micro выпускались приставки с 6502 на 3 Мгц (1984) и 4 МГц (1986).
Антиреклама – множественные Porsche PET в апартаментах злодея из Жемчужины Нила (1985) – эра «только Apple» в Голливуде ещё не наступила
Теперь несколько слов о системе команд 6502. Главная особенность этого процессора в том, что его сделали почти максимально быстрым, практически без лишних тактов, которых особенно много в процессорах 8080/8085/z80/8088/68000. Фактически это была идеология появившихся позднее и под прямым влиянием 6502 процессоров архитектуры ARM. Эта же идеология доминирует, начиная с 80486, и среди процессоров Intel. Кроме того, 6502 максимально быстро реагировал на прерывания, что делало его очень полезным в некоторых встроенных системах. У 6502 один аккумулятор и два индексных регистра, кроме того первые 256 байт памяти можно использовать в специальных командах либо как более быструю память, либо как набор 16-разрядных регистров (которые почти идентичны по своей функциональности регистрам BC и DE в 8080/z80) для довольно мощных способов адресации. Некоторые арифметические команды (сдвиги, вращение, инкремент и декремент) можно использовать с памятью непосредственно, не используя регистры. 16-разрядных команд нет – это 100% 8-битный процессор. Поддерживаются все основные флаги кроме характерного архитектуре Intel флага чётности. Есть ещё несколько необычный флаг малополезного 10-го режима, который заменил флаг полупереноса, используемый большинством других процессоров. Процессоры Intel и Motorola используют специальные корректирующие инструкции для работы с десятичными числами, а 6502 может переключаться в 10-й режим, что делает его преимущество по скорости с 10-ми числами ещё более значительным, чем с двоичными. Очень впечатляет наличие для 6502 табличного умножения 8-битных операндов с получением 16-битного результата за менее, чем 30 тактов, при размере вспомогательной таблицы в 2048 байт. 6502 использует простейший конвейер инструкций, который позволяет ускорить время исполнения многих инструкций на 1 такт. Медленнее всего у 6502 получаются операции массового копирования памяти – от 14 тактов на байт. Система инструкций 6502 в некоторых частностях необычно асиммeтрична, например, есть инструкция загрузки регистра Y
Самым главным недостатком 6502 считается маленький стек, всего 256 байт. Однако для системы с объемом памяти 64 КБ этого, как показала практика, обычно вполне достаточно. В 6502 мало регистров и поэтому нагрузка на стек меньше, чем, например, у 8080, 6809 или Z80. Кроме того, архитектура 6502 естественно предполагает организацию добавочного стека на нулевой странице – такой стек особенно хорош при работе с указателями, так как адресация типа (zp,X) идеально подходит для таких случаев. Конечно, размер такого добавочного стека очень ограничен и на многих системах не может быть больше нескольких десятков байт. Помимо этого можно организовать стеки любого объема на основе abs,X-адресации. Дополнительные стеки можно использовать только для данных, например, параметров подпрограмм, для хранения адресов возврата альтернативы основному стеку нет.
Поддержка аппаратных прерываний на 6502 реализовано просто и эффективно. Для маскируемых и немаскируемых прерываний в памяти выделяется два фиксированных адреса, куда записываются адреса соответствующих обработчиков. Примерно так же, но ещё проще, позднее сделали самый популярный режим 1 прерываний в Z80. А вот программные прерывания в 6502 сделаны совсем примитивно: они используют адрес для маскируемых прерываний, что требует громоздких дополнительных программных проверок для их различения. Именно для этого среди флагов 6502 присутствует уникальный флаг программного прерывания. Кроме того, у инструкции программных прерываний нет аргумента, хотя такой аргумент можно добавлять ценой усложнения процедуры обработчика. Из-за того, что возможность для обработки программных прерываний значительно замедляет обработку аппаратных, поддержка программных прерываний довольно часто просто не реализуется.
6502 может работать параллельно с другим устройством, например, другим 6502. Такие двухпроцессорные системы встречались крайне редко. В качестве примера таких систем мне известны только несколько весьма редких моделей дисководов Commodore. Вместо второго процессора обычно использовался видеоконтроллер, который использовал общую с 6502 память.
65816 был выпущен WDС в 1983. Это был первый случай, когда был сделан 16-битный процессор, совместимый со своим 8-битным предшественником, – для Z80 подобные разработки (Z800, Z180, Z380, eZ80, ...) стали появляться только с 1985. Кроме того, это был один из первых 16-битных процессоров, изготовленных по технологии CMOS! Интересно, что спецификации нового процессора Билл Менш получил от Apple. Конечно, это был большой шаг вперёд, но явно запоздалый и с большими архитектурными изъянами. 65816 уже никем не рассматривался как конкурент для основных процессоров Intel или Motorola – это уже был второстепенный аутсайдер, который уже как-то запрограммировано был настроен на дальнейшую потерю позиций. 65816 имел два важных плюса – он был сравнительно дешёв и почти совместим с по-прежнему весьма популярным 6502. В последующие годы Бил Менш даже не пытался как-то улучшить своё детище, сделать оптимизацию циклов, заменить адресацию нулевой страницы расширенной с использованием регистра Z (это было сделано в 65CE02), добавить хотя бы умножение,… WDC только повышала предельные тактовые частоты, дойдя к середине 90-х до 14 МГц (такой процессор использовался в популярном ускорителе для С64 SuperCPU на частоте 20 МГц). Однако даже сейчас (2020!) WDC предлагает 65816 почему-то только на тех же 14 МГц. 65816 может использовать до 16 МБ памяти, но используемые для этого методы адресации выглядят далёкими от оптимальных. Например, индексные регистры могут быть только 8- или 16-разрядными, стек можно помещать только в первые 64 КБ памяти, только там же можно использовать удобную короткую адресацию установленной страницы (direct page — обобщение zero page), работа с памятью выше более 64 КБ сравнительна неуклюжа,… 65816 имеет 16-разрядное АЛУ, но 8-разрядную шину данных, поэтому на арифметических операциях он лишь примерно на 50% быстрее чем 6502. Тем не менее 65816, по словам Билла Менша, был выпущен в количестве более миллиарда. Конечно, ряд команд 65816 явно дополняют пробелы в архитектуре 6502, например, команды массового копирования памяти за 7 тактов на байт, а также адресные режимы для работы со стеком. Можно ещё добавить, что 65816 использует почти все коды инструкций (255 из 256). Последний неиспользованный код предназначен для длинных будущих инструкций, которые так и не появились. Интересно, что 65816 делался родственниками, самим Биллом и его сестрой.
Apple IIx, в разработке которого активное участие принимал Стив Возняк, должен был использовать 65816, но наладить производство этого процессора удалось только в 1984 и первые партии 65816 были бракованными, что вызвало чрезмерные задержки и в итоге закрытие всего проекта.
Есть ещё вариант 65816 65802, который использует 16-разрядную шину адреса и совместим по разъему с 6502. Предлагались апгрейды для Apple II на основе этого процессора, но ускорения с таким апгрейдом возможно получить только на специально для него написанных программах.
6502 использовался в большом числе компьютерных систем, самые популярные из которых – это 8-битные Commodore, Atari, Apple, Acorn, NES. Commodore PET, в разработке которого активное участие принимал Чак Педдл, появился в продаже на полгода раньше Apple ][, хотя его массовое производство наладилось только на полгода позже Apple ][. Он и его варианты стали первыми компьютерами широко использовавшимся в школах США и Канады – можно только удивляться, почему Commodore так легко сдала свои позиции Apple в этом бизнесе. Также удивительно, что Commodore легко сдала свои неплохие позиции в бизнесе редактирования текстов, где впоследствие Amstrad добилась впечатляющих успехов. А ещё раньше Commodore по до сих пор неясным причинам покинула рынок калькуляторов. Как уже упоминалось выше, по неясным причинам произошел отказ от производства очень перспективной модели Commodore LCD, тем самым был проигнорирован стремительно растущий рынок мобильных устройств. Однако, Commodore VIC-20 стал первым домашним компьютером, продажи которого превзошли миллион штук. Commodore 64 стал самым массовым ПК в истории, их было продано до 17 миллионов штук. Игровые консоли Atari, производимые с 1977 до 1996, были проданы в количестве примерно 35 миллионов! Но это не рекорд, японских игровых консолей NES было продано около 62 миллионов в период с 1983 по 2003. Кстати, в NES использовали вариант 6502 фирмы Ricoh без поддержки десятичного режима. Возможно из-за его почти полной бесполезности, но возможно просто из-за нежелания связываться с патентом MOS Technology на этот режим. Можно наверное утверждать, что для большинства пользователей до конца 80-х дверью в мир цифровых технологий был именно 6502. 6502 использовался в качестве контроллера клавиатуры в компьютере Commodore Amiga, а два 6502 на 10 МГц использовались в высокопроизводительном Apple Macintosh IIfx. Процессор на основе 6502 используется в известной игрушке Томагочи, выпущенной наверное в более сотни миллионов экземпляров. 65816 применялся в довольно популярном компьютере Apple IIgs, а также в редком английском компьютере Acorn Communicator. Игровые консоли Super NES на базе 65816 производились с 1990 по 2003, их было продано около 50 миллионов. 65816 использовался также в некоторых ранних моделях электронных книг.
Интересно, что из трех массовых ПК (так называемая «святая троица»), появившихся в 1977, два были на 6502 и только один на Z80. К сожалению, важнейшие американские производители компьютеров (Apple, Tandy RadioShack, IBM), начиная с 80-х не публиковали информацию о числе произведенных ими ПК.
В 1984 в журнале Byte на фоне картинок с красными знамёнами, Лениным и марширующими солдатами появилась статья о плохой копии компьютера Apple ][, сделанной в СССР. В этой статье приводилась любопытная цена на этот компьютер – $17000 (это абсурдное число, реальная цена была примерно 4000 руб.) и иронично указывалось на то, что советским производителям придётся сильно (dramatically) понизить цену, если они захотят продать своё изделие на Западе. Агат использовался в основном в школьном образовании. Старшие модели Агатов были почти на 100% совместимы с Apple ][ и имели некоторые довольно полезные расширения. Удивительно, что процессоры для Агатов и болгарских клонов Apple II массово закупались в США – это было исключительный случай, когда процессоры массово закупались, а не клонировались. В Болгарии все-таки удалось наладить небольшое производство своего клона 6502 к середине 80-х. А в СССР удалось сделать клон 65C02 только к концу 80-х. Интересно, что отечественный клон 6502 можно было разгонять с 2 до 5 МГц повышением напряжения питания с 5 до 15 вольт.
Можно лишь попытаться фантазировать на тему о том, что бы было, если бы 6502 смог развиваться теми же темпами, что и его конкуренты. Мне кажется, что постепенный перенос памяти нулевой страницы в регистры, улучшение конвейра инструкций и постепенное расширение системы команд с одновременной оптимизацией циклов, позволило бы «терминатору» 6502 оставаться в лидерах по быстродействию до начала 90-х. Введение режима 16, а затем 32 бит позволило бы использовать большие объемы памяти и более быстрые команды. Смогли бы его конкуренты что-то этому противопоставить?
Билл Менш смог обеспечить некоторую поддержку развитию 6502. Однако возможностей одного человека для поддержки конкурентоспособности процессора явно недостаточно. Билл, как превосходный инженер-электронщик, смог обеспечить поддержку исполнения заказов на модернизацию 6502, но обеспечение независимой разработки успешного процессора требовало команды. Кому-то надо было заниматься разработкой модернизации системы инструкций, кому-то разрабатывать новые маркетинговые стратегии и т.п. Кроме того, для разработки были потеряны, как минимум, 1976-78 годы и одному человеку наверстать упущенное было уже не под силу. В каком-то смысле, WDC создала иллюзию благополучия вокруг ситуации с развитием 6502 и это имело для реального развития скорее негативный эффект.
Хотя сам Чак Педдл видел будущее 6502 скорее как дешевого контроллера и конкурента не для Z80, а скорее для микроконтроллеров типа Intel 8048 и процессоров типа 6800, которые обычно использовали только как контроллеры. В 2014 он работал над твердотельным накопителем, в котором использовал 10 штук контроллеров на основе 6502. В начале 80-х он вместе с компаньоном создали компанию, в которой он в 1981 разработал компьютер Victor 9000. В качестве процессора там использовался 8088 – Чак считал, что 6502 для персонального компьютера будет не лучшим выбором.
Интересно, что сам Чак как и некоторые другие ключевые фигуры ИТ США 1970-х и 1980-х пошел работать с высокие технологии с идеей предотвратить отставание от СССР в развитие ИТ. Эта идея была весьма популярна после запуска Спутника. Тут можно ещё упомянуть ключевую для Intel фигуру Билла Давидова (Bill Davidow), которого Чак очень уважал и с которым поддерживал контакт.
Чака не стало в конце 2019. Он учился у Клода Шеннона и первым предложил использовать групповое кодирование при работе с дисками. Хотя запатентовать это у него не получилось, он в конце 70-х и начале 80-х разработал дисководы, которые позволяли использовать до двух раз больше места, чем типовые. Это, в частности, использовалось в некоторых лучших дисководах Commodore и в компьютере Victor. Затем он сделал первый портативный жесткий диск. Этот диск не ломался, если падал на пол! Затем он работал с производством недорогого ОЗУ. После чего он разрабатывал сверхбыстрый твердотельный накопитель, о котором уже упоминалось.
Хочется закончить некоторыми общефилософскими рассуждениями. Почему 6502 был приторможен и лишен гораздо более яркого будущего? Возможно из-за того, что он реально мог очень потеснить крупные фирмы и создать совершенно новую реальность. Но была ли команда 6502 настроена на такое? Скорее нет, они просто хотели сделать лучший процессор. Возможно они сами не поняли насколько удачным был их процессор и что скорость это главное свойство любого процессора. Любопытно, что ведущие производители компьютеров на базе 6502 (Apple, Commodore, Atari) в 80-е явно тормозили развитие систем на базе этого процессора. Ничего подобного не было для других процессоров. Возможно, скрытые регулирующие механизмы таким образом защищали других производителей компьютеров и процессоров.
Уже гораздо позже, в начале 21-го века при помощи навязанных надуманными причинами судебных процессов была разгромлена фирма Lexra, производившая в течении 5 лет различные инновационные процессоры. Эта печальная история, чем-то напоминает то, что случилось с MOS Technology.
Этот процессор стал наряду с 6502 основным процессором первых персональных компьютеров. В истории его появления и использования нет никаких насыщенных драматизмом событий. Есть только некоторая интрига в неуспехе Zilog сделать следующее поколение процессоров. Z80 начали производить в 1976 и его варианты производят до сих пор. Когда-то даже сам Билл Гейтс объявил о поддержке систем на основе z80.
Интересны ряд совпадений. Как и в случае с 6502, главный разработчик Z80, Федерико Фаггин (Federico Faggin), ушёл из крупной компании, из Intel. После работы над z80 Федерико уже почти не работал с процессором следующего поколения Z8000 и в начале 80-х ушёл из основанной им компании, чтобы в дальнейшем уже никогда процессорами не заниматься. Он создал затем несколько относительно успешных стартапов, создавая системы связи, тачпады и цифровые камеры. Можно упомянуть, что, помимо z80, в Zilog им ещё был разработан удачный и производимый до сих пор микроконтроллер Z8.
Z80 – это более удобный для включения в компьютерные системы процессор, чем 8080. Он требует только одного напряжения питания и имеет встроенную поддержку регенерации динамической памяти. Кроме того, он при полной совместимости с 8080 имеет довольно много новых команд, второй набор основных регистров и несколько совершенно новых регистров. Любопытно, что в Zilog отказались от использования мнемоник ассемблера 8080, а стали использовать свои собственные мнемоники, более подходящие для расширенной системы команд z80. Подобная история случилась с ассемблером Intel x86 в мире программного обеспечения GNU, там тоже почему-то используют по умолчанию свои собственные соглашения по записи программ на ассемблере. В Z80 добавили поддержку флага переполнения, Intel официально добавила поддержку такого флага только в 8086. Однако, этот флаг в z80 совместили с флагом чётности, поэтому одновременно, как в 8086, оба флага использовать не получится. В z80, как и в 6502, есть только базовая проверка значения одного флага, т.е. нет проверок сразу двух или трех флагов, что необходимо для беззнаковых сравнений «строго больше», «меньше или равно», а также всех знаковых – в таких случаях приходится делать несколько проверок, на 8086, 6800 или PDP-11 достаточно одной.
Среди новых команд z80 особенно впечатляют команды массового копирования памяти за 21 такт на байт, а также интересная команда поиска байта в памяти. Добавили также похожие блочные инструкции для ввода и вывода. Однако наиболее интересна команда EXX, меняющая местами содержимое 48 байт регистровой памяти, регистры BC, DE, HL с их двойниками, которая выполняется всего за 4 такта! Даже 32-битным ARM понадобится на примерно такую же операцию не менее 6 тактов. Остальные добавочные инструкции не так впечатляют, хотя иногда могут быть полезными. Добавлены ещё:
Всего к 244 инструкциям 8080 было добавлено 458 новых инструкций, а если считать те, которые впоследствии были признаны как почти официальные, то получится ещё около полусотни новых инструкций.
Большинство новых команд довольно медленные, но их правильное использование может все же сделать код несколько быстрее и существенно компактнее. Это особенно относится к использованию новых 16-разрядных регистров IX и IY, которые можно использовать для новых методов адресации. Интересно, что индексные регистры IX и IY появились в Z80 с целью привлечь пользователей 6800 к переходу на Z80! В операциях с этими индексными регистрами всегда надо использовать байтовое смещение, что не всегда необходимо, но всегда замедляет эти и без того небыстрые инструкции.
Многие команды 8080 в z80 стали на такт быстрее и это очень заметное ускорение. Но основная для 16-битной арифметики команда ADD стала на такт медленнее. Также стали медленнее команды
В Z80 добавили поддержку уникального флага, который не встречается больше ни в одной системе. Это флаг вычитания. Он используется только командой десятичной коррекции DAA, которую на Z80 можно использовать и после вычитания.
Другая уникальная особенность Z80 – это общедоступный регистр регенерации памяти. Его можно, например, использовать для генерации случайных чисел.
Система работы с прерываниями стала разнообразнее имеющейся у 8080. С z80 можно использовать как немаскируемые прерывания, так и три способа для работы с маскируемыми:
Однако, прерывания в режиме 2 можно использовать и без поддержки контроллера, просто резервируя 257 байт в памяти под адрес прерывания. Так делают на компьютерах, где аппаратура не поддерживает режим 2, например, на Amstrad CPC/PCW, MSX, ZX Spectrum,… Это, конечно, несколько затратно, но необходимость в этом может возникнуть в случаях подобных ZX Spectrum, когда вектор прерывания режима 1 находится в ПЗУ. Любопытно, что в некоторых компьютерах MSX можно использовать и прерывания режима 0 без поддержки контроллера.
Работа с прерываниями у Z80 имеет и другие уникальные особенности. Как известно, Z80 как и 8080 при прерываниях не сохраняет слова состояния процессора, но z80 тем не менее имеет целых две уникальные команды для возврата из прерываний. Инструкция возврата из маскируемого прерывания RETI работает также как и обычный возврат из подпрограммы, но её должны заметить как особенную внешние схемы управления и произвести сброс установки прерывания. В других архитектурах (6502, х86, ...) в коде обработчика прерываний нужно явно прописывать команды сброса контроллера, типа
По непонятным мне причинам компьютеры на базе Z80 обычно не использовали схемы управления прерываниями с полной поддержкой возможностей этого процессора. Возможно из-за цены. Хотя это получается как-то необычно. Дешевый процессор и дорогие схемы поддержки. Как будто Zilog был нацелен на производство только Z80. Для Z80 производились фирменный таймер, параллельный и последовательный интерфейсы, чип DMA и другие подобные устройства, но их в популярных компьютерах не использовали. Применяли их только в некоторых моделях сравнительно редких и дорогих офисных систем, например, Tandy TRS-80 model 2, Tatung Einstein или Robotron 1715.
Z80 имеет довольно много недокументированных инструкций, многие из этих инструкций пропали при переходе на технологию CMOS, но те которые сохранились стали фактически стандартными и были документированы некоторыми фирмами. Особенно полезны инструкции, позволяющие работать с отдельными байтами неуклюжих 16-битных регистров IХ и IY. Кроме недокументированных инструкций Z80 имеет и другие недокументированные свойства, например, два особых флага в регистре состояний.
Конечно, z80 ещё в большей степени, чем 8080 имеет право называться слегка 16-битным. Гипотетический индекс разрядности у z80 явно чуть-чуть повыше, но при этом парадоксально, что АЛУ у z80 на самом деле 4-битное! На электронном уровне z80 и 8080 – совершенно разные чипы.
16-ые операции остались у Z80 не вполне реализованными, хотя возможно это случилось из-за необходимости поддержания совместимости с 8080. В частности, очень неудобно, что 16-ые инкремент и декремент вообще не меняют флагов.
Конечно, Z80 может дать немало других оснований для критики. Помимо унаследованных от 8080 пустых инструкций типа
В официальной документации по Z80, помимо отмеченных, есть и другие неточности.
Много было написано про сравнение быстродействия z80 и 6502, так как эти процессоры очень широко использовались в первых массовых компьютерах. В этой теме есть несколько непростых моментов, без понимания которых очень трудно сохранять объективность. Благодаря наличию довольно большого числа регистров z80 естественно использовать на частоте большей, чем работает память. Поэтому z80 на 4 МГц может использовать ту же память, что и 6502 или 6809 на 1.3 МГц. По мнению многих опытных программистов, писавших коды для обоих процессоров, на одинаковой частоте 6502 в среднем примерно от 2.4 до 2.6 раз быстрее, чем z80. Автор этого материала с этим согласен. Только нужно добавить, что писать хорошие, быстрые коды для z80 – это очень непросто, нужно постоянно оптимизировать использование регистров, а для работы с памятью максимально задействовать стек. Если очень стараться, то по моему мнению можно свести разницу между z80 и 6502 до примерно 2.1 раз. А если не стараться и игнорировать тайминги, то легко можно получить разницу и более 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 и 8088. Конечно, в целом 8088 — это более мощный процессор, но во многих важных частностях он медленнее, чем Z80. Рассмотрим следующую таблицу, где представлены некоторые типичные случаи, когда Z80 быстрее. Соответствие между регистрами установлено таким же как в стандартной программе, конвертирующей код 8080 в код 8086.
В качестве иллюстративного материала прикрепляю свой небольшой камень из Розетты – программки для расчета числа π на разных процессорах и системах по алгоритму-затвору, претендующие на звание самых быстрых его реализаций.
Intel 8080 и 8085
Первый настоящий процессор на чипе, сделанный в первой половине 1974 года, он до сих пор производится и находит себе применение. Многократно клонировался по всему миру, в СССР имел обозначение КР580ВМ80А. Современные процессоры Intel для РС до сих пор легко обнаруживают свою родственность этому уже в каком-то смысле реликтовому изделию. Сам для этого процессора кодов не писал, но будучи хорошо знакомым с архитектурой z80, рискну привести некоторые свои замечания.
Систему команд 8080, как и других процессоров Intel для РС, трудно назвать идеальной, но она универсальная, достаточно гибкая и имеет несколько очень привлекательных особенностей. От своих конкурентов, Motorola 6800 и MOS Technology 6502, 8080 выгодно отличался большим количеством пусть и несколько неуклюжих регистров, предоставляя пользователю один 8-битный аккумулятор А, один 16-битный полуаккуммулятор и по совместительству быстрый индексный регистр HL, 16-разрядный указатель стека SP, а также ещё два 16-битных регистра ВС и DE. Регистры BC, DE и HL можно было использовать и как 6 байтовых регистров. Кроме того, 8080 имел поддержку почти полного набора флагов состояния: переноса, знака, нуля и даже чётности и полупереноса. Некоторые инструкции из набора команд 8080 долгое время были чемпионами по быстродействию. Например, команда XCHG делает обмен содержимым 16-битных регистров DE и HL всего за 4 такта – это было исключительно быстро! Ряд других команд хотя и не ставили столь яркие рекорды, но также долгое время были одними из лучших:
- XTHL – обмен содержимым регистра HL и данных на вершине стека, 18 тактов – вроде бы много, на даже на настоящем 16-битном 8086 такая команда занимает от 22 тактов, а для 6800 или 6502 такую команду даже трудно представить;
- DAD – добавить к полуаккуммулятору HL значение другого 16-битного регистра (BC, DE или даже SP), 10 тактов. Это настоящее 16-битное сложение с установкой флага переноса. Если складывать HL самим с собой, то будет получаться быстрый 16-разрядный сдвиг влево или умножение на 2, ключевая операция как для реализации полного умножения, так и деления;
- PUSH и POP – положить в стек и вынуть из стека 16-разрядное значение соответственно из регистра или в регистр. Выполняются за 11 и 10 тактов. Это самые быстрые операции 8080 для работы с памятью и при их выполнении происходит автоматическая инкрементация или декрементация SP. PUSH можно использовать, например, для быстрого заполнения памяти паттерном со значениями из 3 регистров (BC, DE, HL). Команд для работы с 8-битными величинами со стеком нет вообще;
- LXI – загрузка 16-битной константы в регистр (HL, DE, BC, SP) за 10 тактов;
- RNZ, RZ, RNC, RC, RPO, RPE, RP, RM – условные возвраты из подпрограммы, позволяли делать код чище, избавляя от необходимости писать лишние условные переходы. От этих команд отказались в архитектуре x86, возможно, что и зря, код с ним получается симпатичнее. 8080 также может использовать и соответствующие условные вызовы подпрограмм (CNZ, CZ, CNC, ...), хотя пользы от них обычно почти нет, так как при вызове подпрограммы в неё как правило нужно передавать параметры.
Этот процессор был использован в первом персональном компьютере Altair 8800, ставшим весьма популярным после журнальной публикации в начале 1975. К слову, в СССР похожая публикация случилась только в 1983, а соответствующая ей по актуальности только в 1986.

Intel 8080 стал основой для разработки когда-то первой массовой профессиональной операционной системы CP/M, занимавшей доминирующие позиции среди микрокомпьютеров для профессиональной работы до середины 1980-х.
Теперь о недостатках. 8080 требовалось три напряжения питания -5, 5 и 12 вольт. Работа с прерываниями скорее неуклюжая: нужен специализированный контроллер и немаскируемые прерывания не поддерживались. И в целом 8080 скорее нетороплив, если сравнить его с вскоре появившимися конкурентами. 6502 мог быть до 3-х раз быстрее при работе на той же частоте, что и 8080. В системе команд несколько раздражает наличие 6 бессмысленных инструкция типа
MOV A,A
– их могли бы не документировать, сохраняя пространство кодов для новых операций. Команду десятичной коррекции можно использовать только после сложения, а после вычитания для десятичной коррекции нужно использовать специальный код, обычно состоящий из 4 инструкций. Нет команд нециклических сдвигов.Но в архитектуре 8080 было заложено, как оказалось, правильное видение будущего, а именно того неочевидного в 70-х факта, что процессоры будут быстрее памяти. Регистры 8080 DE и BC – это скорее прообраз современных кэшей, с ручным управлением, чем регистры общего назначения. 8080 начал с частоты 2 МГц, а конкуренты только с 1, что сглаживало разницу в производительности.
Первое время 8080 продавался по весьма высокой цене $360, но это была своеобразная ссылка на большие компьютеры IBM/360. Intel как бы сообщала, что если купить 8080, то можно получить что-то похожее на очень дорогой мейнфрейм.
Трудно назвать 8080 8-битным процессором на все 100%. Конечно, АЛУ у него на 8 бит, но есть много 16 разрядных команд, работающих быстрее, чем если использовать только 8-битные аналоги вместо них. А для некоторых команд 8-битных аналогов нет вообще. Команда XCHG по сути и таймингам 100% 16-битная. Есть реальные 16-разрядные регистры. Поэтому рискну назвать 8080 частично 16-битным. Было бы интересно по совокупности признаков вычислять индекс разрядности процессора, но, насколько известно автору, пока такой работы никто не проделал.
Автор не знает причины, почему Intel отказалась от прямой поддержки развития 8-битных персоналок своими процессорами. Intel всегда отличaла сложность и неоднозначность политики. Её связь с политикой, в частности, иллюстрирует тот факт, что долгое время у Intel функционируют заводы в Израиле и до конца 90-х это было тайным. Intel практически не пыталась улучшить 8080, была лишь до 3 с небольшим МГц поднята тактовая частота. Фактически 8-битный рынок был передан фирме Zilog с родственным 8080 процессором z80, который смог довольно успешно противостоять главному конкуренту, «терминатору» 6502. А Zilog к концу 70-х была компанией с огромными возможностями, имея почти неограниченное финансирование от Exxon и даже две новейшие фабрики по производству чипов, что было реально много – Motorola, имея миллиардный бизнес, имела в то время также только две фабрики. В начале 80-х значение 6502 стало уже незначительным и Zilog тоже стремительно потерял свой вес – странное совпадение. Кроме того, 8080 и 8085 использовались обычно как контроллеры и в этом качестве могли успешно продаваться по более высокой цене. Наличие z80 позволяло Intel устраниться от конкуренции 8-битных процессоров для компьютеров, где 6502 сильно обвалил цены.
В СССР и России отечественный клон 8080 стал основой многих массовых компьютеров, сохранявших популярность до начала 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. Были добавлены ещё несколько инструкций и даже даже два новых флага признаков: флаг переполнения и флаг, двоично суммирующий переполнение и знак. Работа с новыми флагами, особенно вторым практически не поддерживалась. Точное назначение второго флага, типичного для знаковой арифметики, стало известным только в 2013, спустя 37 лет после появления 8085! Этот флаг позволяет за раз проверить выполнение отношений «больше или равно» или «меньше», но проверки для парных им отношений потребуют ещё работы с флагом нуля. Были ускорены на такт многие инструкции для работы байтовыми данными. Это было очень существенно, так как на многих системах с 8080 или z80 вводились такты задержки, которые из-за наличия лишних тактов на 8080 могли вытянуть время исполнения почти в два раза. Например, в отечественном компьютере Вектор инструкции типа регистр-регистр выполнялись 8 тактов, а если бы там стоял 8085 или z80, то эти же инструкции выполнялись бы только за 4 такта. Инструкция XTHL стала быстрее на два такта, а инструкции переходов даже на 3. С новыми инструкциями можно написать код для копирования блока памяти, который работает быстрее команд LDI/LDD процессора Z80! Программы для 8080 8085 также, как правило, исполняет несколько быстрее чем Z80. Однако, некоторые инструкции, например, вызов подпрограммы, 16-битный инкремент и декремент, PUSH, загрузка SP и условные возвраты стали на такт медленнее.
8085 имеет встроенный последовательный порт ввода-вывода и улучшенную поддержку работы с прерываниями: в добавок к зависящему от внешнего контроллера способу, унаследованному от 8080, добавлена подддержка трех маскируемых и одного немаскируемого прерывания – это позволяет, при необходимости, обходиться без отдельного контроллера прерываний в системе. Работа с портом и с управлением прерываниями реализуется через инструкции SIM и RIM – только эти две новые инструкции были официально документированы. Однако, само обслуживание прерываний осталось таким же как и 8080 – очень минималистическим: при прерывании процессор не сохраняет даже слово состояния, это сохранение нужно явно прописывать в коде. Как уже отмечалось, работа со знаковой арифметикой так осталась несколько недореализованной. 16-битная арифметика также не получила поддержки некоторых очень желательных команд: сложения с переносом и вычитания. Такие команды были добавлены в Z80. В 8085 при сложении, например, 32-битных целых нужно использовать условный переход для учета переноса – это, кстати, тоже похоже на мейнфреймы IBM.
Однако, могу опять повторить формулу «по неизвестным автору причинам» Intel отказалась продвигать 8085 в качестве главного процессора. Только в 80-е появилось несколько довольно успешных систем на базе 8085. Первым в 1981 появился предшественник и почти конкурент IBM PC – IBM System/23 Datamaster. Затем в 1982 был выпущен очень быстрый компьютер с превосходной графикой Zenith Z-100, в котором 8085 работал на 5 Мгц. В 1983 в японской фирме Kyotronic был создан очень удачный наколенник KC-85, варианты которого производились и другими фирмами: Tandy производила TRS-80 model 100, NEC – PC-8201a, Olivetti – M-10. Всего их было выпущено возможно более 10 миллионов экземпляров таких компьютеров! В СССР/РФ в начале 90-х на основе отечественного клона ИМ1821ВМ85А были попытки усовершенствовать некоторые системы, например, компьютер Вектор. Удивительно, что главным процессором марсохода Sojourner, достигшем поверхности Марса в 1997, был 8085 с частотой 2МГц! Такой успех 8085 в 80-е во многом связан с тем, что в 1979 был готов 80C85, вариант 8085 с низким энергопотреблением. Упомянутый первый реально карманный компьютер Tandy 100 мог работать до 20 часов на одной зарядке! Возможно, что если бы не ARM, то 80C85 активно использовали бы в мобильных компьютерах и в 90-е.
Фактически фирма Intel дала z80 «зеленый цвет». Спустя несколько лет в битве за 16-битный рынок Intel повела себя совершенно иначе, начав тяжбу по запрещению продаж процессоров v20 и v30 в США. Интересно, что упомянутые процессоры японской фирмы NEC могли переключаться в режим полной бинарной совместимости с 8080, что сделало их самыми быстрыми процессорами архитектуры 8080.
Другая тайна фирмы Intel – в отказе от публикации расширенной системы команд, включая поддержку новых флагов. Впервые она была опубликована в журнале в 1979, а затем и некоторыми из производителей этого процессора. Однако опубликованная информация о новых флагах была весьма неполной. Каковы причины такого странного отказа? Можно лишь гадать. Может Zilog тогда играл роль, подобную которую когда-то возможно играл AMD, и создавал видимость конкуренции, а 8085 мог обрушить Zilog? Может дело в желании сохранять систему команд поближе к проектируемому тогда 8086? Последнее кажется сомнительным. Intel 8086 был выпущен спустя более 2 лет после выпуска 8085 и трудно поверить, что в 1975 уже была известна система его команд. И в любом случае, совместимость как с 8080, так и с 8085 на 8086 достижима только с использованием макропроцессора, заменяя иногда одну команду 8080/8085 (POP/PUSH PSW, Jcc, Ccc, Rcc, XTHL) на несколько своих. Причем две опубликованные новые инструкции 8085 (SIM, RIM) в 8086 не реализуемы вообще. Есть мнение, что отказ произошел только из-за сложностей в поддержке переноса на код 8086 новых флагов 8085. Действительно, такой перенос с поддержкой побитовой работы со словом состояния процессора получается крайне громоздким. Но 7 из 10 новых инструкций прямого отношения к использованию новых флагов не имеют и их можно было бы публиковать без создания сложностей по совместимости с 8086. Можно ещё предположить, что в Intel остались недовольны реализацией знаковой арифметики на 8085 и решили, что лучше скрыть, чем создать почву для постоянной критики. Хотя и в этом случае, семь новых инструкций можно было публиковать, а скрыть только флаги и три инструкции.
Особенно трудно объяснить, почему Intel не опубликовала информацию о новых командах уже после выпуска 8086. Можно только ещё предположить, что скорее всего дело было в маркетинге. Искусственно ухудшив спецификации 8085, получали на этом фоне более эффектный 8086.
Рискну предположить ещё одну версию. 8085 было очень трудно, почти невозможно расширить до реально 16-разрядного процессора. А 6502, имея незадействованными почти половину опкодов, мог легко быть расширен до 16-бит. Поэтому для Intel было важно создать тренд на переход к 16-битной архитектуре, без совместимости с 8-битной. Отказываясь от новой полезной функциональности 8085, как бы сообщали, что 8-битки это плохо и уже неважно, надо переходить на 16-бит. Что-то похожее происходило и вокруг 32-битной архитектуры, когда Intel создала ложный тренд на разработку сложного и бесперспективного Intel 8800 или iAPX 432.
Motorola 6800 и близкие родственники
Процессоры Motorola всегда отличались наличием нескольких очень привлекательных «изюминок» при одновременном наличие каких-то несуразных по абстрактности и малопрактичности архитектурных решений. Главная «изюминка» всех рассматриваемых процессоров – это второй полноценный и очень быстрый регистр-аккумулятор.
6800 был первым в мире процессором, которому требовалось только один источник питания (5 вольт) – это было очень полезное новшество. Кроме того, на 6800 была также впервые реализована поддержка немаскируемых прерываний. Ho 6800 из-за единственности громоздкого для 8-битной архитектуры 16-битного индексного регистра получился неудобным для программирования и использования изделием. Он был выпущен ещё в 1974, ненамного позже 8080, но так и не стал основой для какой-либо известной компьютерной системы. Интересно, что разработчики 6502, Чак Педдл (Chuck Peddle) и Бил Менш, называли 6800 неправильным, «слишком большим». Однако, он и его варианты широко использовались как микроконтроллеры. Возможно тут стоит заметить, что Intel производила процессоры с 1971, что поставило Motorola в положение догоняющей стороны, для которой 6800 был самым первым процессором. И если сравнить 6800 не с 8080, а с его предшественником 8008, то 6800 окажется значительно предпочтительнее. Motorola почти догнала Intel с 68000/20/30/40. Можно ещё заметить, что в 70-е Motorola была значительно более крупной компанией, чем Intel.
Производились также многочисленные варианты 6800: 6801, 6802, 6803, 6805,… Большинство из них это микроконтроллеры с встроенной памятью и портами ввода-вывода. 6803 – это упрощенный 6801 и его использовали в сильно запоздалом (1983) для своего класса компьютере Tandy TRS-80 MC-10 и его французском клоне Matra Alice, которые были сравнимы с Commodore VIC-20 (1980) или Sinclair ZX81 (1981). Система команд 6801/6803 была значительно улучшена, были добавлены 16-битные команды, умножение,… Появилась необычная инструкция безусловного перехода (BRN – branch never), который никогда не выполняется! Некоторые инструкции стали чуть быстрее. Тут можно заметить, что архитектура 680x формировалась под сильным влиянием архитектуры PDP-11. Некоторые детали PDP-11 были скопированы скорее механически, например, бесполезные команды CLV и SEV.
680x полностью поддерживают работу с целыми числами со знаком, z80 и 6502 поддерживают её хуже, а у 8080 такой поддержки нет практически совсем. Однако в 8-битном программном обеспечении такая поддержка нужна была очень редко.
6809 был выпущен в 1978, когда с 8086 уже началась 16-битная эпоха, и имеет весьма развитую систему команд, включая умножение двух байтовых аккумуляторов с получением 16-разрядного результата за 11 тактов (для сравнения, 8086 требует от 70 тактов на подобную операцию). Два аккумулятора могут в нескольких случаях группироваться в один 16-разрядный, что даёт быстрые 16-битные инструкции. 6809 имеет два индексных регистра и рекордное среди 8-битных процессоров число методов адресации – 12. Среди методов адресации есть уникальные для 8-битных чипов, такие как индексная с автоинкрементом или декрементом, относительно счётчика команд, индексная со смещением. 6809 имеет интересную возможность использовать два типа прерываний: можно использовать быстрые прерывания с частичным автоматическим сохранением регистров и прерывания с полным сохранением регистров – у 6809 есть три входа для сигналов прерывания FIRQ (быстрое маскируемое), IRQ (маскируемое), NMI (немаскируемое). Также иногда удобны в использовании быстрые инструкции чтения и установки сразу всех флагов.
Однако, операции с памятью требует на такт больше, чем 6502 или 6800. Индексные регистры так и остались неуклюжими 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 – можно только исходники от 6800 транслировать в код 6809, что аналогично случаю с 8080 и 8086. 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, которая использует уникальную технологию – векторный дисплей.

680x имеют интересную недокументированную инструкцию с интересным названием «Остановись и поджарься» (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. Он смог уговорить семь других инженеров последовать за ним и только один из них впоследствии вернулся в Motorola. В 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 раза. Как следует из некоторых публикаций уже в 1975 в MOS Technology были планы проводить расширение 6502 до 16-разрядного уровня…

Но Motorola начала судебный процесс против своих бывших сотрудников – те якобы использовали технологические секреты фирмы. В ходе процесса удалось установить, что один из инженеров, ушедших из Motorola, вынес некоторые конфиденциальные документы по 6800, действуя вопреки установкам своих коллег. Был ли это его собственный поступок или за ним стояли какие-то направляющие силы до сих пор неизвестно. В итоге Motorola вынудила MOS Technology, чьи финансовые возможности были весьма невелики, выплатить значительную сумму в $200000 и к отказаться от производства 6501. Intel в похожей ситуации с Zilog действовала совсем не так. Хотя надо признать, что MOS Technology действовола иногда слишком рисковано, когда пыталась использовать большие деньги, потраченные Motorola на продвижение 6800, в своих целях. Ирония ситуации заключается в том, что, как отмечал лидер команды разработчиков 6502, они с 6501 просто хотели сделать «предупредительный выстрел» и посмотреть, что из этого получится. Цели предлагать использовать 6501 вместо 6800 не было. Реально 6501 никогда и не продавался. Тут ещё можно заметить, что 6501 был всё же не совсем совместим с аппаратурой для 6800, он и 6502, в частности, не поддерживал работу с тремя состояниями выводов и поэтому не мог использоваться напрямую, например, с аппаратурой с прямым доступом к памяти, как 6800.
Мы до сих пор в точности не знаем, почему Motorola выиграла тяжбу с MOS Technologies. Возможно просто у MOS Technologies закончились деньги, их на процесс было потрачено до $800000, а деньги тогда были в несколько раз весомее, чем сейчас. Хотя были и другие факторы. Вроде упомянутого выноса документов. Известно ещё, что, например, чип параллельного интерфейса 6520, производимый в MOS Technology, был точной копией Motorola 6820. Всем, кто ушёл из Motorola, пришлось подписать своё согласие с решением по иску, так как перед началом процесса они подписали бумагу с тем, что они признают любой его результат.
Далее в истории появляется легендарная фирма Commodore и её не менее легендарный основатель Jack Tramiel, в тени которого находилась фигура главного финансиста фирмы, определяющего её политику – человека по имени Irving Gould. Джек получил кредит у Ирвинга и на эти деньги, используя несколько, мягко сказать, недобросовестную тактику, вынудил MOS Technology стать частью Commodore. После чего, возможно и вопреки желанию Трамела, вынужденного уступать Гуду, разработка 6502 практически остановилась и это при том, что ещё в 1976 удалось произвести опытные образцы 6502 с рабочими частотами до 10 МГц, хотя сообщение об этом появилось только спустя многие годы от человека по имени Bill Mensch (он был в команде, покинувшей Motorola), который не раз делал громкие, но по большому счету пустые заявления и сыграл в судьбе 6502 довольно неоднозначную роль. Чак Педдл навсегда был отстранён от разработки процессоров. Работать с 6502 продолжили не только в Commodore, но и в фирме, созданной Биллом Меншем, Western Design Center (WDC). Любопытно, что никто из прежней команды 6502 не работал с ним в дальнейшем. Кстати, это именно Бил Менш разработал упомянутый выше 6820, который превратился в 6520. Возможно если бы развитие 6502 не было остановлено, то он мог бы превратиться в основной процессор для персональных компьютеров. У IBM, например, были планы по созданию своего первого массового ПК на базе 6502. В качестве первого шага в этом направлении там собирались купить компанию Atari, которая одной из первых стала использовать этот процессор.
Но на этом драма вокруг 6502 не закончилась. В 1980 в журнале AIM65 Interactive фирмы Rockwell появилась короткая анонимная статья, о том, что все 6502 несут в себе опасного бага, который получил название JMP (xxFF). Тон статьи предполагает, что-то совершенно из ряда вон выходящее. Впоследствии этот настрой перешёл в позицию фирмы Apple по этому вопросу и стал неким мейнстримом. Хотя никакого «бага», строго говоря, не было. Конечно, специалисту, привыкшему к комфортным процессорам больших систем тех лет, одна из особенностей, вполне уместных и даже полезных среди микропроцессоров, могла показаться чем-то раздражающим, багом. Но на самом деле это, задевшее чьи-то чувства, поведение было описано в официальной документации от 1976 года и в учебниках по программированию, вышедших до появления упомянутой статьи. «Баг» был ликвидирован Билом Меншем, сделавшим 65С02 (CMOS 6502) к 1982. Автор этого материала сам сталкивался несколько раз с проблемой этого «бага». Ничего не зная о нем, писал программы для Коммодоров. Потом одну из них перенес на системы, где использовался набор команд 65С02. Возникла несовместимость, пришлось менять коды, делать условную компиляцию. Код для 65С02 получился более громоздким и медленным. Потом поднимал этот вопрос на форуме 6502.org, где большинство участников из мира Apple. Спросил, может ли кто-нибудь привести пример, когда означенный «баг» рушил программу. Получил только эмоциональные и общие замечание, конкретного примера так и не было предложено. Иронично, что в официальной документации WDC «баг» не называют прямо багом, а скорее какой-то странностью, вывертом

В то время как Intel, Motorola и другие сделали уже 16-битные процессоры новых поколений, 6502 был лишь микроскопически улучшен и сделан искусственно частично несовместимым с самим собой. Даже если сравнивать улучшения, сделанные в Motorola 6801 по сравнению с 6800 или в Intel 8085 по сравнению с 8080, то они окажутся гигантскими по сравнению с теми, что были сделаны в 65C02. Кроме того, Intel и Motorola сделали их значительно раньше. В 65C02 был сделан ряд небольших изменений, которые, в частности, привели к изменению в ходе исполнения нескольких инструкций, которые стали медленнее на такт, но при этом в каком-то надуманном академическом смысле они стали более правильными. Речь идёт об упомянутом «баге» и инструкциях десятичной арифметики. Последние были «скорректированы» так, что флаги oVerflow, Negative и Zero стали работать «корректно». Однако, при работе с десятичными числами на 6502 (и других микропроцессорах) знак не поддерживается и соответственно флаги N и V не имеют для них никакого смысла. Только коррекция флага нуля имеет какой-то смысл, но крайне незначительный. Были также добавлены десятки новых инструкций, абсолютное большинство которых лишь занимали кодовое пространство, почти ничего не добавляя к возможностям 6502, что оставляло меньше кодов для возможных дальнейших модернизаций. Но, надо признать, что несколько новых инструкций оказались ожидаемыми и полезными, например, BIT с новыми адресными режимами и
JMP (ABS,X)
. И опять надо признать, что новые инструкции позволяют получать чуть-чуть более быстрые и компактные коды. Кроме того, четыре сравнительно редкие инструкции стали на 65C02 иногда на такт быстрее. Можно ещё добавить, что 65C02 стал занулять флаг десятичного режима при прерывании, что позволяет иногда делать обработчик прерываний на 2 цикла быстрее и на 1 байт короче – это крошечное улучшение хорошо иллюстрирует общий объем улучшений, сделанных в 65C02.65C02 был лицензирован многим фирмам, в частности, NCR, GTE, Rockwell, Synertek и Sanyo. Он использовался в Apple II, начиная с моделей IIe, хотя многие IIe использовали NMOS 6502. Вариант 65С02 6512 использовался также в поздних моделях BBC Micro. Atari использовала NMOS 6502, хотя там была попытка перехода на CMOS, но из-за обнаруженных проблем, в частности, на 65C02 не шла известная игра Asteroids, от этих попыток отказались. Commodore так и не выпустил компьютера на базе CMOS 6502, хотя в некоторые прототипы его использовали. Фирмы Synertek и Rockwell помимо CMOS 6502 производили и NMOS 6502. Кстати, NMOS 6502 имеет свой набор недокументированных инструкций, природа которых совершенна отлична от «секретных» команд 8085. В 6502 эти инструкции появились как побочный эффект, поэтому большинство из них скорее бесполезны, но несколько, например, загрузка или выгрузка одной командой сразу двух регистров и некоторые другие могут сделать код более быстрым и компактным.
Интересно, что NMOS 6502, совместимого с 65C02, так и не сделали. Хотя в начале 80-х технология CMOS не имела явных преимуществ (кроме пониженного энергопотребления) перед NMOS и её развитием HMOS и при этом была заметно дороже. Стоит конечно заметить, что WDC смогла создать CMOS процессор всего лишь спустя несколько лет после того, как Intel и Motorola сделали CMOS варианты своих процессоров 8085 и 680x. В этом она значительно опередила Zilog, где CMOS вариант Z80 был создан только к 1987 году. Однако, если CMOS 8085 и Z80 сразу нашли широкое употребление в мобильных компьютерах, то низкое энергопотребление 65C02 нашло свое применение в компьютерах сравнительно поздно, могу назвать лишь игровую консоль Atari Lynx, производившуюся с 1989. Стоит ещё заметить, что само по себе внедрение технологии CMOS – это вполне рутинный процесс, через который другие процессоры (x86, 68k, ...) прошли практически незаметно.
Были и другие попытки модернизировать 6502. В 1979 появилась статья, что для компьютеров Atari готовится к производству процессор 6509 (не путать с появившимся позже процессором с таким же названием фирмы Commodore), в котором ожидалось ускорение исполнения команд на 25% и много новых инструкций. Но по неизвестным в точности причинам производство этого процессора так и не состоялось. Commodore проводила лишь микроскопические модернизации. С точки зрения программирования самым интересным является процессор 6509, который пусть и в очень примитивной форме с помощью всего двух специально выделенных для этой цели инструкций и двух байт нулевой страницы позволяет адресовать до 1 МБ памяти. В сверхпопулярных Коммодорах 64 и 128 стояли процессоры 6510/8510, а в менее удачливых серии 264 – 7501/8501. Эти процессоры имели лишь соответственно 6 и 7 встроенных битовых портов ввода-вывода, при этом 7501/8501 не поддерживали немаскируемых прерываний. Кроме того, на этих процессорах реализовали поддержку с логикой трех состояний, что было необходимо для работы с видеоконтроллерами на C64 и C264. Фирма Rockwell производила вариант 65C02 со своим расширенным 32 битовыми операциями (похожи на битовые инструкции z80) набором инструкций, однако, насколько мне известно, в компьютерах такие процессоры не использовались и сами эти битовые инструкции имели значение скорее только для использования во встроенных системах. Это расширение, кстати, тоже произвёл Билл Менш. Получается, что Билл работал над 6502, только имея конкретные заказы, и никогда не пытался сам в чем-то этот процессор улучшить.
Последняя сцена драмы с участием 6502 обозначилась в недопущении компьютеров на базе 6502 с частотой 2 МГц на рынок США в первой половине 80-х. Это коснулось иностранца-англичанина BBC Micro, их производившая фирма Acorn сделала большую партию компьютеров для США, но, как оказалось, зря. Сработала какая-то блокировка и компьютеры пришлось срочно переделывать под европейские стандарты. Полуамериканские, но формально канадские компьютеры Commodore CBM II (1982), несмотря на некоторые проблемы (в частности, по соответствию стандартам на электрооборудование), были всё же допущены. Возможно из-за того, что у них не было графических режимов и даже цветного текста – этого не мог компенсировать даже стильный Porsche-дизайн. Последним в списке неудачников оказался 100% американский Apple III (1980) – известно, что Стив Джобс, как и менеджмент Apple в целом, сделали много, чтобы этот этот компьютер не состоялся. Джобс требовал явно невыполнимых спецификаций, а менеджмент – нереальных сроков. Удивительно, что по одному из требований менеджмента, Apple III должен был быть только ограниченно совместимым с Apple II! В Apple III Plus, выпущенном в 1983, удалось устранить некоторые недостатки Apple III, но менеджмент Apple тихо закрыл проект в 1984 возможно из-за нежелания иметь конкуренцию с компьютером Macintosh. Только в 1985, когда эпоха 8-битной техники начала уходить, появился Commodore 128, который мог использовать в одном из своих режимов 6502 с тактом на 2 МГц. Но и тут получился скорее анекдот, так как этот режим практически не поддерживался и программ для него практически нет. В этом же году должен был быть выпущен перспективный наколенник Commodore LCD с 65C02 @2MHz. Однако, несмотря на успешную публичную демонстрации проект был почему-то закрыт. Только во второй половине 80-х в США стали производить приставки-ускорители для Apple II, а с 1988 и модель Apple IIc+ c процессором на 4 МГц. Почему так случилось? Возможно потому, что 6502 на 2 или 3 МГц (а такие уже производились в самом начале 80-х) на ряде задач и в особенности с играми могли успешно конкурировать с системами на основе Intel 8088 или Motorola 68000. В 1991 волевым решением корпорация Commodore закрыла интересный, хотя и запоздалый проект С65 на базе процессора 4510 с частотой 3.54 МГц. Чип 4510 был сделан на основе процессора 65CE02, который в свою очередь сделан на основе WDC 65C02. 65CE02 – это самый быстрый 6502, сделанный только в 1988, в нём была проведена наконец упоминавшаяся раннее оптимизация циклов, давшая 25% прирост скорости. Таким образом, процессор в С65 по быстродействию близок к системам с 6502 на 4.5 МГц. Удивительно, но этот самый быстрый 6502 с расширенным набором инструкций (в каких-то деталях это расширение получилось более удачным, чем в 65816) нигде с тех пор так и не нашёл применения.
C128 и Apple III Plus имели блок управления памятью (MMU), что позволяло использовать несколько стеков и нулевых страниц, адресовать более 64 КБ памяти, и др. В C128 MMU был искусственно урезан для работы только со 128 КБ памяти. Для BBC Micro выпускались приставки с 6502 на 3 Мгц (1984) и 4 МГц (1986).

Теперь несколько слов о системе команд 6502. Главная особенность этого процессора в том, что его сделали почти максимально быстрым, практически без лишних тактов, которых особенно много в процессорах 8080/8085/z80/8088/68000. Фактически это была идеология появившихся позднее и под прямым влиянием 6502 процессоров архитектуры ARM. Эта же идеология доминирует, начиная с 80486, и среди процессоров Intel. Кроме того, 6502 максимально быстро реагировал на прерывания, что делало его очень полезным в некоторых встроенных системах. У 6502 один аккумулятор и два индексных регистра, кроме того первые 256 байт памяти можно использовать в специальных командах либо как более быструю память, либо как набор 16-разрядных регистров (которые почти идентичны по своей функциональности регистрам BC и DE в 8080/z80) для довольно мощных способов адресации. Некоторые арифметические команды (сдвиги, вращение, инкремент и декремент) можно использовать с памятью непосредственно, не используя регистры. 16-разрядных команд нет – это 100% 8-битный процессор. Поддерживаются все основные флаги кроме характерного архитектуре Intel флага чётности. Есть ещё несколько необычный флаг малополезного 10-го режима, который заменил флаг полупереноса, используемый большинством других процессоров. Процессоры Intel и Motorola используют специальные корректирующие инструкции для работы с десятичными числами, а 6502 может переключаться в 10-й режим, что делает его преимущество по скорости с 10-ми числами ещё более значительным, чем с двоичными. Очень впечатляет наличие для 6502 табличного умножения 8-битных операндов с получением 16-битного результата за менее, чем 30 тактов, при размере вспомогательной таблицы в 2048 байт. 6502 использует простейший конвейер инструкций, который позволяет ускорить время исполнения многих инструкций на 1 такт. Медленнее всего у 6502 получаются операции массового копирования памяти – от 14 тактов на байт. Система инструкций 6502 в некоторых частностях необычно асиммeтрична, например, есть инструкция загрузки регистра Y
LDY addr,X
, но нет парной ей выгрузки – STY addr,X
. Есть инструкция для сброса флага переполнения, но нет парной ей для его установки. 6502 вместо этой инструкции позволяет делать установку флага переполнения через аппаратный сигнал. Такая работа с флагом переполнения позволяет использовать очень быстрый порт ввода, но для программирования арифметики как установка этого флага, так и его сброс бесполезны. Поэтому в 6510 или 7501/8501 отказались от специального способа установки флага переполнения, но совсем бесполезная теперь инструкция для его сброса осталась!Самым главным недостатком 6502 считается маленький стек, всего 256 байт. Однако для системы с объемом памяти 64 КБ этого, как показала практика, обычно вполне достаточно. В 6502 мало регистров и поэтому нагрузка на стек меньше, чем, например, у 8080, 6809 или Z80. Кроме того, архитектура 6502 естественно предполагает организацию добавочного стека на нулевой странице – такой стек особенно хорош при работе с указателями, так как адресация типа (zp,X) идеально подходит для таких случаев. Конечно, размер такого добавочного стека очень ограничен и на многих системах не может быть больше нескольких десятков байт. Помимо этого можно организовать стеки любого объема на основе abs,X-адресации. Дополнительные стеки можно использовать только для данных, например, параметров подпрограмм, для хранения адресов возврата альтернативы основному стеку нет.
Поддержка аппаратных прерываний на 6502 реализовано просто и эффективно. Для маскируемых и немаскируемых прерываний в памяти выделяется два фиксированных адреса, куда записываются адреса соответствующих обработчиков. Примерно так же, но ещё проще, позднее сделали самый популярный режим 1 прерываний в Z80. А вот программные прерывания в 6502 сделаны совсем примитивно: они используют адрес для маскируемых прерываний, что требует громоздких дополнительных программных проверок для их различения. Именно для этого среди флагов 6502 присутствует уникальный флаг программного прерывания. Кроме того, у инструкции программных прерываний нет аргумента, хотя такой аргумент можно добавлять ценой усложнения процедуры обработчика. Из-за того, что возможность для обработки программных прерываний значительно замедляет обработку аппаратных, поддержка программных прерываний довольно часто просто не реализуется.
6502 может работать параллельно с другим устройством, например, другим 6502. Такие двухпроцессорные системы встречались крайне редко. В качестве примера таких систем мне известны только несколько весьма редких моделей дисководов Commodore. Вместо второго процессора обычно использовался видеоконтроллер, который использовал общую с 6502 память.
65816 был выпущен WDС в 1983. Это был первый случай, когда был сделан 16-битный процессор, совместимый со своим 8-битным предшественником, – для Z80 подобные разработки (Z800, Z180, Z380, eZ80, ...) стали появляться только с 1985. Кроме того, это был один из первых 16-битных процессоров, изготовленных по технологии CMOS! Интересно, что спецификации нового процессора Билл Менш получил от Apple. Конечно, это был большой шаг вперёд, но явно запоздалый и с большими архитектурными изъянами. 65816 уже никем не рассматривался как конкурент для основных процессоров Intel или Motorola – это уже был второстепенный аутсайдер, который уже как-то запрограммировано был настроен на дальнейшую потерю позиций. 65816 имел два важных плюса – он был сравнительно дешёв и почти совместим с по-прежнему весьма популярным 6502. В последующие годы Бил Менш даже не пытался как-то улучшить своё детище, сделать оптимизацию циклов, заменить адресацию нулевой страницы расширенной с использованием регистра Z (это было сделано в 65CE02), добавить хотя бы умножение,… WDC только повышала предельные тактовые частоты, дойдя к середине 90-х до 14 МГц (такой процессор использовался в популярном ускорителе для С64 SuperCPU на частоте 20 МГц). Однако даже сейчас (2020!) WDC предлагает 65816 почему-то только на тех же 14 МГц. 65816 может использовать до 16 МБ памяти, но используемые для этого методы адресации выглядят далёкими от оптимальных. Например, индексные регистры могут быть только 8- или 16-разрядными, стек можно помещать только в первые 64 КБ памяти, только там же можно использовать удобную короткую адресацию установленной страницы (direct page — обобщение zero page), работа с памятью выше более 64 КБ сравнительна неуклюжа,… 65816 имеет 16-разрядное АЛУ, но 8-разрядную шину данных, поэтому на арифметических операциях он лишь примерно на 50% быстрее чем 6502. Тем не менее 65816, по словам Билла Менша, был выпущен в количестве более миллиарда. Конечно, ряд команд 65816 явно дополняют пробелы в архитектуре 6502, например, команды массового копирования памяти за 7 тактов на байт, а также адресные режимы для работы со стеком. Можно ещё добавить, что 65816 использует почти все коды инструкций (255 из 256). Последний неиспользованный код предназначен для длинных будущих инструкций, которые так и не появились. Интересно, что 65816 делался родственниками, самим Биллом и его сестрой.
Apple IIx, в разработке которого активное участие принимал Стив Возняк, должен был использовать 65816, но наладить производство этого процессора удалось только в 1984 и первые партии 65816 были бракованными, что вызвало чрезмерные задержки и в итоге закрытие всего проекта.
Есть ещё вариант 65816 65802, который использует 16-разрядную шину адреса и совместим по разъему с 6502. Предлагались апгрейды для Apple II на основе этого процессора, но ускорения с таким апгрейдом возможно получить только на специально для него написанных программах.
6502 использовался в большом числе компьютерных систем, самые популярные из которых – это 8-битные Commodore, Atari, Apple, Acorn, NES. Commodore PET, в разработке которого активное участие принимал Чак Педдл, появился в продаже на полгода раньше Apple ][, хотя его массовое производство наладилось только на полгода позже Apple ][. Он и его варианты стали первыми компьютерами широко использовавшимся в школах США и Канады – можно только удивляться, почему Commodore так легко сдала свои позиции Apple в этом бизнесе. Также удивительно, что Commodore легко сдала свои неплохие позиции в бизнесе редактирования текстов, где впоследствие Amstrad добилась впечатляющих успехов. А ещё раньше Commodore по до сих пор неясным причинам покинула рынок калькуляторов. Как уже упоминалось выше, по неясным причинам произошел отказ от производства очень перспективной модели Commodore LCD, тем самым был проигнорирован стремительно растущий рынок мобильных устройств. Однако, Commodore VIC-20 стал первым домашним компьютером, продажи которого превзошли миллион штук. Commodore 64 стал самым массовым ПК в истории, их было продано до 17 миллионов штук. Игровые консоли Atari, производимые с 1977 до 1996, были проданы в количестве примерно 35 миллионов! Но это не рекорд, японских игровых консолей NES было продано около 62 миллионов в период с 1983 по 2003. Кстати, в NES использовали вариант 6502 фирмы Ricoh без поддержки десятичного режима. Возможно из-за его почти полной бесполезности, но возможно просто из-за нежелания связываться с патентом MOS Technology на этот режим. Можно наверное утверждать, что для большинства пользователей до конца 80-х дверью в мир цифровых технологий был именно 6502. 6502 использовался в качестве контроллера клавиатуры в компьютере Commodore Amiga, а два 6502 на 10 МГц использовались в высокопроизводительном Apple Macintosh IIfx. Процессор на основе 6502 используется в известной игрушке Томагочи, выпущенной наверное в более сотни миллионов экземпляров. 65816 применялся в довольно популярном компьютере Apple IIgs, а также в редком английском компьютере Acorn Communicator. Игровые консоли Super NES на базе 65816 производились с 1990 по 2003, их было продано около 50 миллионов. 65816 использовался также в некоторых ранних моделях электронных книг.
Интересно, что из трех массовых ПК (так называемая «святая троица»), появившихся в 1977, два были на 6502 и только один на Z80. К сожалению, важнейшие американские производители компьютеров (Apple, Tandy RadioShack, IBM), начиная с 80-х не публиковали информацию о числе произведенных ими ПК.
В 1984 в журнале Byte на фоне картинок с красными знамёнами, Лениным и марширующими солдатами появилась статья о плохой копии компьютера Apple ][, сделанной в СССР. В этой статье приводилась любопытная цена на этот компьютер – $17000 (это абсурдное число, реальная цена была примерно 4000 руб.) и иронично указывалось на то, что советским производителям придётся сильно (dramatically) понизить цену, если они захотят продать своё изделие на Западе. Агат использовался в основном в школьном образовании. Старшие модели Агатов были почти на 100% совместимы с Apple ][ и имели некоторые довольно полезные расширения. Удивительно, что процессоры для Агатов и болгарских клонов Apple II массово закупались в США – это было исключительный случай, когда процессоры массово закупались, а не клонировались. В Болгарии все-таки удалось наладить небольшое производство своего клона 6502 к середине 80-х. А в СССР удалось сделать клон 65C02 только к концу 80-х. Интересно, что отечественный клон 6502 можно было разгонять с 2 до 5 МГц повышением напряжения питания с 5 до 15 вольт.
Можно лишь попытаться фантазировать на тему о том, что бы было, если бы 6502 смог развиваться теми же темпами, что и его конкуренты. Мне кажется, что постепенный перенос памяти нулевой страницы в регистры, улучшение конвейра инструкций и постепенное расширение системы команд с одновременной оптимизацией циклов, позволило бы «терминатору» 6502 оставаться в лидерах по быстродействию до начала 90-х. Введение режима 16, а затем 32 бит позволило бы использовать большие объемы памяти и более быстрые команды. Смогли бы его конкуренты что-то этому противопоставить?
Билл Менш смог обеспечить некоторую поддержку развитию 6502. Однако возможностей одного человека для поддержки конкурентоспособности процессора явно недостаточно. Билл, как превосходный инженер-электронщик, смог обеспечить поддержку исполнения заказов на модернизацию 6502, но обеспечение независимой разработки успешного процессора требовало команды. Кому-то надо было заниматься разработкой модернизации системы инструкций, кому-то разрабатывать новые маркетинговые стратегии и т.п. Кроме того, для разработки были потеряны, как минимум, 1976-78 годы и одному человеку наверстать упущенное было уже не под силу. В каком-то смысле, WDC создала иллюзию благополучия вокруг ситуации с развитием 6502 и это имело для реального развития скорее негативный эффект.
Хотя сам Чак Педдл видел будущее 6502 скорее как дешевого контроллера и конкурента не для Z80, а скорее для микроконтроллеров типа Intel 8048 и процессоров типа 6800, которые обычно использовали только как контроллеры. В 2014 он работал над твердотельным накопителем, в котором использовал 10 штук контроллеров на основе 6502. В начале 80-х он вместе с компаньоном создали компанию, в которой он в 1981 разработал компьютер Victor 9000. В качестве процессора там использовался 8088 – Чак считал, что 6502 для персонального компьютера будет не лучшим выбором.
Интересно, что сам Чак как и некоторые другие ключевые фигуры ИТ США 1970-х и 1980-х пошел работать с высокие технологии с идеей предотвратить отставание от СССР в развитие ИТ. Эта идея была весьма популярна после запуска Спутника. Тут можно ещё упомянуть ключевую для Intel фигуру Билла Давидова (Bill Davidow), которого Чак очень уважал и с которым поддерживал контакт.
Чака не стало в конце 2019. Он учился у Клода Шеннона и первым предложил использовать групповое кодирование при работе с дисками. Хотя запатентовать это у него не получилось, он в конце 70-х и начале 80-х разработал дисководы, которые позволяли использовать до двух раз больше места, чем типовые. Это, в частности, использовалось в некоторых лучших дисководах Commodore и в компьютере Victor. Затем он сделал первый портативный жесткий диск. Этот диск не ломался, если падал на пол! Затем он работал с производством недорогого ОЗУ. После чего он разрабатывал сверхбыстрый твердотельный накопитель, о котором уже упоминалось.
Хочется закончить некоторыми общефилософскими рассуждениями. Почему 6502 был приторможен и лишен гораздо более яркого будущего? Возможно из-за того, что он реально мог очень потеснить крупные фирмы и создать совершенно новую реальность. Но была ли команда 6502 настроена на такое? Скорее нет, они просто хотели сделать лучший процессор. Возможно они сами не поняли насколько удачным был их процессор и что скорость это главное свойство любого процессора. Любопытно, что ведущие производители компьютеров на базе 6502 (Apple, Commodore, Atari) в 80-е явно тормозили развитие систем на базе этого процессора. Ничего подобного не было для других процессоров. Возможно, скрытые регулирующие механизмы таким образом защищали других производителей компьютеров и процессоров.
Уже гораздо позже, в начале 21-го века при помощи навязанных надуманными причинами судебных процессов была разгромлена фирма Lexra, производившая в течении 5 лет различные инновационные процессоры. Эта печальная история, чем-то напоминает то, что случилось с MOS Technology.
Zilog Z80
Этот процессор стал наряду с 6502 основным процессором первых персональных компьютеров. В истории его появления и использования нет никаких насыщенных драматизмом событий. Есть только некоторая интрига в неуспехе Zilog сделать следующее поколение процессоров. Z80 начали производить в 1976 и его варианты производят до сих пор. Когда-то даже сам Билл Гейтс объявил о поддержке систем на основе z80.
Интересны ряд совпадений. Как и в случае с 6502, главный разработчик Z80, Федерико Фаггин (Federico Faggin), ушёл из крупной компании, из Intel. После работы над z80 Федерико уже почти не работал с процессором следующего поколения Z8000 и в начале 80-х ушёл из основанной им компании, чтобы в дальнейшем уже никогда процессорами не заниматься. Он создал затем несколько относительно успешных стартапов, создавая системы связи, тачпады и цифровые камеры. Можно упомянуть, что, помимо z80, в Zilog им ещё был разработан удачный и производимый до сих пор микроконтроллер Z8.
Z80 – это более удобный для включения в компьютерные системы процессор, чем 8080. Он требует только одного напряжения питания и имеет встроенную поддержку регенерации динамической памяти. Кроме того, он при полной совместимости с 8080 имеет довольно много новых команд, второй набор основных регистров и несколько совершенно новых регистров. Любопытно, что в Zilog отказались от использования мнемоник ассемблера 8080, а стали использовать свои собственные мнемоники, более подходящие для расширенной системы команд z80. Подобная история случилась с ассемблером Intel x86 в мире программного обеспечения GNU, там тоже почему-то используют по умолчанию свои собственные соглашения по записи программ на ассемблере. В Z80 добавили поддержку флага переполнения, Intel официально добавила поддержку такого флага только в 8086. Однако, этот флаг в z80 совместили с флагом чётности, поэтому одновременно, как в 8086, оба флага использовать не получится. В z80, как и в 6502, есть только базовая проверка значения одного флага, т.е. нет проверок сразу двух или трех флагов, что необходимо для беззнаковых сравнений «строго больше», «меньше или равно», а также всех знаковых – в таких случаях приходится делать несколько проверок, на 8086, 6800 или PDP-11 достаточно одной.
Среди новых команд z80 особенно впечатляют команды массового копирования памяти за 21 такт на байт, а также интересная команда поиска байта в памяти. Добавили также похожие блочные инструкции для ввода и вывода. Однако наиболее интересна команда EXX, меняющая местами содержимое 48 байт регистровой памяти, регистры BC, DE, HL с их двойниками, которая выполняется всего за 4 такта! Даже 32-битным ARM понадобится на примерно такую же операцию не менее 6 тактов. Остальные добавочные инструкции не так впечатляют, хотя иногда могут быть полезными. Добавлены ещё:
- 16-битное вычитание c заемом и 16-битное сложение с переносом за 15 тактов;
- унарный минус для аккумулятора за 8 тактов;
- возможность читать из памяти и писать в неё, используя регистры BC, DE, SP, IX,IY, а не только HL;
- сдвиги, вращения и ввод-вывод для всех 8-битных регистров;
- операции проверки, установки и сброса бита по его номеру;
- перемещаемые переходы по смещению (JR): безусловный и по флагам переноса и равенства;
- команда цикла;
- очень необычные инструкции для десятичных вращений RLD и RRD, похожие на которые были разве что у IBM мейнфреймов;
- инструкции для ввода и вывода, работающие через индексный регистр.
Всего к 244 инструкциям 8080 было добавлено 458 новых инструкций, а если считать те, которые впоследствии были признаны как почти официальные, то получится ещё около полусотни новых инструкций.
Большинство новых команд довольно медленные, но их правильное использование может все же сделать код несколько быстрее и существенно компактнее. Это особенно относится к использованию новых 16-разрядных регистров IX и IY, которые можно использовать для новых методов адресации. Интересно, что индексные регистры IX и IY появились в Z80 с целью привлечь пользователей 6800 к переходу на Z80! В операциях с этими индексными регистрами всегда надо использовать байтовое смещение, что не всегда необходимо, но всегда замедляет эти и без того небыстрые инструкции.
Многие команды 8080 в z80 стали на такт быстрее и это очень заметное ускорение. Но основная для 16-битной арифметики команда ADD стала на такт медленнее. Также стали медленнее команды
LD SP,HL
, EX (SP),HL
, инкремент и декремент с памятью и 16-разрядными регистрами, а также операции ввода и вывода. Поэтому коды 8080 выполняются на z80 если и быстрее, то только чуть-чуть. Однако, если реализовывать одинаковый алгоритм для 8080 и Z80, то Z80 может быть значительно быстрее, например, расчет числа π по алгоритму-затвору для Z80 у меня получился почти на 40 процентов быстрее, чем для 8080.В Z80 добавили поддержку уникального флага, который не встречается больше ни в одной системе. Это флаг вычитания. Он используется только командой десятичной коррекции DAA, которую на Z80 можно использовать и после вычитания.
Другая уникальная особенность Z80 – это общедоступный регистр регенерации памяти. Его можно, например, использовать для генерации случайных чисел.
Система работы с прерываниями стала разнообразнее имеющейся у 8080. С z80 можно использовать как немаскируемые прерывания, так и три способа для работы с маскируемыми:
- такой же как и у 8080 – требует контроллера прерываний совместимого со стандартом 8080;
- по фиксированному RST – это самый простой, ему не требуется поддержка внешних схем;
- в режиме 2 процессор задаёт старший байт обработчика прерываний, а контроллер определяет младший байт – этот способ требует аппаратной поддержки дополнительных чипов от Zilog.
Однако, прерывания в режиме 2 можно использовать и без поддержки контроллера, просто резервируя 257 байт в памяти под адрес прерывания. Так делают на компьютерах, где аппаратура не поддерживает режим 2, например, на Amstrad CPC/PCW, MSX, ZX Spectrum,… Это, конечно, несколько затратно, но необходимость в этом может возникнуть в случаях подобных ZX Spectrum, когда вектор прерывания режима 1 находится в ПЗУ. Любопытно, что в некоторых компьютерах MSX можно использовать и прерывания режима 0 без поддержки контроллера.
Работа с прерываниями у Z80 имеет и другие уникальные особенности. Как известно, Z80 как и 8080 при прерываниях не сохраняет слова состояния процессора, но z80 тем не менее имеет целых две уникальные команды для возврата из прерываний. Инструкция возврата из маскируемого прерывания RETI работает также как и обычный возврат из подпрограммы, но её должны заметить как особенную внешние схемы управления и произвести сброс установки прерывания. В других архитектурах (6502, х86, ...) в коде обработчика прерываний нужно явно прописывать команды сброса контроллера, типа
MOV AL,20H
OUT 20H,AL
для x86. Однако, работа с командой RETI должна иметь поддержку у внешних чипов Zilog, и на известных компьютерах (в частности, ZX Spectrum, MSX, Amstrad CPC/PCW, Tandy TRS-80 model 1/3/4) такого нет. Другая уникальная инструкция – это RETN для возврата из немаскируемого прерывания. Она также работает как и обычный возврат из подпрограммы, но с небольшим дополнительным эффектом – она восстанавливает сохраненный при старте немаскируемого прерывания флаг разрешения маскируемых прерываний. Это информация из официальной документации, которая не может не вызвать вопросов. Как, например, быть, если случится вложенное немаскированное прерывание? Согласно последним данным z80 работает проще и логичнее, а в официальной документации допущена ошибка. Z80 после выхода из любого прерывания по команде RETN или RETI всегда восстанавливает флаг разрешения маскируемых прерываний, хотя для RETI это и неважно. Однако, процессор не сохраняет этого флага при старте немаскируемого прерывания.По непонятным мне причинам компьютеры на базе Z80 обычно не использовали схемы управления прерываниями с полной поддержкой возможностей этого процессора. Возможно из-за цены. Хотя это получается как-то необычно. Дешевый процессор и дорогие схемы поддержки. Как будто Zilog был нацелен на производство только Z80. Для Z80 производились фирменный таймер, параллельный и последовательный интерфейсы, чип DMA и другие подобные устройства, но их в популярных компьютерах не использовали. Применяли их только в некоторых моделях сравнительно редких и дорогих офисных систем, например, Tandy TRS-80 model 2, Tatung Einstein или Robotron 1715.
Z80 имеет довольно много недокументированных инструкций, многие из этих инструкций пропали при переходе на технологию CMOS, но те которые сохранились стали фактически стандартными и были документированы некоторыми фирмами. Особенно полезны инструкции, позволяющие работать с отдельными байтами неуклюжих 16-битных регистров IХ и IY. Кроме недокументированных инструкций Z80 имеет и другие недокументированные свойства, например, два особых флага в регистре состояний.
Конечно, z80 ещё в большей степени, чем 8080 имеет право называться слегка 16-битным. Гипотетический индекс разрядности у z80 явно чуть-чуть повыше, но при этом парадоксально, что АЛУ у z80 на самом деле 4-битное! На электронном уровне z80 и 8080 – совершенно разные чипы.
16-ые операции остались у Z80 не вполне реализованными, хотя возможно это случилось из-за необходимости поддержания совместимости с 8080. В частности, очень неудобно, что 16-ые инкремент и декремент вообще не меняют флагов.
Конечно, Z80 может дать немало других оснований для критики. Помимо унаследованных от 8080 пустых инструкций типа
LD B,B
в Z80 появились ещё более бессмысленные инструкции-двойники, т.е. более большие и медленные клоны имеющихся инструкций, это длинные LD HL,(nn)
и LD (nn),HL
, а также RLC A
, RRC A
, RL A
, RR A
. А если считать полуофициальные инструкции, то таких некрасивых двойников обнаружится ещё больше. В официальной документации есть довольно странная ошибка для команд ввода и вывода: там указано, что используется регистр C в качестве индекса, а фактически используется регистр BC. Возможно эта ошибка была сделана намеренно, так как выполнении блочных инструкций ввода или вывода регистр B используется как счетчик. Конечно, если использовать только 256 байт для портов, то эта ошибка сама собой исчезает, но некоторые системы, например, Amstrad CPC/PCW использует все 64 КБ адресного пространства для доступа к портам ввода и вывода и там такие блочные инструкции использовать не получится. Интересно ещё, что даже при использовании 8-битного адреса в операциях IN и OUT, Z80 всё равно формирует 16-битный адрес, используя аккумулятор для задания старшего байта. Это использовалось, например, в ZX81. По моему мнению инструкций для ввода и вывода добавили слишком много, большинство из них скорее избыточны.В официальной документации по Z80, помимо отмеченных, есть и другие неточности.
Много было написано про сравнение быстродействия z80 и 6502, так как эти процессоры очень широко использовались в первых массовых компьютерах. В этой теме есть несколько непростых моментов, без понимания которых очень трудно сохранять объективность. Благодаря наличию довольно большого числа регистров z80 естественно использовать на частоте большей, чем работает память. Поэтому z80 на 4 МГц может использовать ту же память, что и 6502 или 6809 на 1.3 МГц. По мнению многих опытных программистов, писавших коды для обоих процессоров, на одинаковой частоте 6502 в среднем примерно от 2.4 до 2.6 раз быстрее, чем z80. Автор этого материала с этим согласен. Только нужно добавить, что писать хорошие, быстрые коды для z80 – это очень непросто, нужно постоянно оптимизировать использование регистров, а для работы с памятью максимально задействовать стек. Если очень стараться, то по моему мнению можно свести разницу между z80 и 6502 до примерно 2.1 раз. А если не стараться и игнорировать тайминги, то легко можно получить разницу и более 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 и 8088. Конечно, в целом 8088 — это более мощный процессор, но во многих важных частностях он медленнее, чем Z80. Рассмотрим следующую таблицу, где представлены некоторые типичные случаи, когда Z80 быстрее. Соответствие между регистрами установлено таким же как в стандартной программе, конвертирующей код 8080 в код 8086.
Z80 | 8088 | + | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code | time | code | time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JP word | 10 | JMP word | 15 | 5 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CALL word | 17 | CALL word | 19 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RET | 10 | RETN | 20 | 10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RST byte | 11 | INT byte | 71 | 60 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JP (HL) | 4 | JMP BX | 11 | 7 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JP (IX)8JMP BP113 | LD A,(HL)7MOV AL,[BX]103 | LD (HL),A7MOV [BX],AL103 | LD r,(HL) | 7 | MOV r,[BX] | 13 | 6 | LD (HL),r | 7 | MOV [BX],r | 14 | 7 | LD (HL),byte | 10 | MOV [BX],byte | 15 | 5 | LD A,(BC) | 7 | MOV SI,CX MOV AL,[SI] |
12 | 5 | LD (BC),A | 7 | MOV SI,CX MOV [SI],AL |
12 | 5 | LD HL,(word) | 16 | MOV BX,[word] | 18 | 2 | LD (word),HL | 16 | MOV [word],BX | 19 | 3 | EX (SP),HL | 19 | MOV SI,SP XCHG [SI],BX |
24 | 5 | EX (SP),IY | 23 | MOV SI,SP XCHG [SI],DI |
24 | 1 | PUSH BC | 11 | PUSH CX | 15 | 4 | POP DE | 10 | POP DX | 12 | 2 | INC (HL) | 11 | INC [BX] | 20 | 9 | DEC (HL) | 11 | DEC [BX] | 20 | 9 | SET 0,(HL) | 15 | OR [BX],1 | 22 | 7 | RES 1,(HL) | 15 | AND [BX],0xFD | 22 | 7 | RLC (HL) | 15 | ROL [BX],1 | 20 | 5 | RR (HL) | 15 | RCR [BX],1 | 20 | 5 |