Это, случайно, не это видео https://www.youtube.com/watch?v=TV_YWpBxoS0?
Тут на 32 минуте автор сравнивает 6502 и ВМ80 и потом удивляется, почему Агат не сделали на ВМ80. Сравнение очень наивное. Например, в лоб сравниваются мегагерцы без учета количества тактов, требующихся для выполнения каждой инструкции. Еще смешнее сравнение числа кодов инструкций. Например, для пересылки регистров у ВМ80 есть 51 код, а у 6502 - всего 6. Понятно, что у ВМ80 больше, только это одна и та же инструкция, просто для разных пар регистров. И даже регистры 6502 посчитаны неверно. Указатель стека - это хоть и не очень удобный в использовании, но все таки четвертый регистр.
Даже не знаю, как с этим сравнением спорить, потому что автор видео хоть вроде и в теме, но неглубоко :) Ему бы изучить вопрос, как меряется производительность процессоров. Да и попрограммировать под разные архитектуры тоже было бы полезно.
С другой стороны, написать про 6502 как фанат я не могу. Так уж получается, что когда человек начинает решать какие-то конкретные задачи на ассемблере, то он перестает быть диванным аналитиком. А когда он осваивает язык ассемблера больше, чем одного процессора - он перестает быть фанатом. Я еще в школе изучил ассемблер 8080, 6502 и Z80, в институте - ассемблер PDP-11, VAX и Motorola 68000, на работе программировал на ассемблере 8086. И теперь у меня отношение к разным процессорам примерно ровное и совсем не фанатское :) Да и нет у 8-разрядных процессоров из середины 1970-х таких фич, которые могли бы поменять производительность на порядок.
***
Теперь к достоинствам и недостаткам.
I. Безусловные достоинства.
Первое и самое главное достоинство 6502 - его низкая цена. В тот момент, когда появился 6502, Motorola 6800 и Intel 8080 продавались по 180 долларов. 6502 продавался по 25. Разница была огромная, процессор сразу пошел во встраиваемую электронику. Он использовался во всяких промышленных контроллерах, регуляторах, кардиостимуляторах, автомобильной электронике. Я думаю, что туда больше процессоров пошло, чем в персональные компьютеры и игровые приставки.
Вообще, надо правильно понимать: 6502 - это был Celeron для того времени. Когда пишут, что он был слабее, то совершенно правильно пишут. Его и создавали как удешевленный аналог Motorola 6800. Просто слабее он был совсем чуть-чуть, а вот дешевле он был существенно.
Конечно, в СССР фактор цены не работал. В СССР все цены устанавливал Госкомцен. Как он это делал - загадка, но наверно в основе лежал анализ экономических показателей. И поскольку ВМ80 применялся намного шире, то и цена у него, скорее всего, была бы ниже, чем у возможного аналога 6502.
Второе достоинство - удобное тактирование. Первые полтакта процессор работает с шиной, вторые полтакта шина свободна. И это всегда выполняется. В результате очень легко строить схемы, где с памятью работают два устройства. Например, в Apple (и в Агате) вторые полтакта использует дисплейный контроллер. Другие процессоры менее предсказуемые, поэтому приходится делать схемы арбитража, которые останавливают процессор, чтобы дисплейный контроллер мог прочитать память (смотри Спектрум).
Если сравнивать с ВМ80, то надо еще учесть, что он требовал отдельной микросхемы тактового генератора ГФ24. А у 6502 генератор встроенный - кварц можно подключить между выводами Ф0 и Ф1. И это тоже ведет к упрощению и удешевлению схемы. В 8085 такая фишка тоже появилась, но это было на год позже.
Понятное дело, что чтобы добиться такого удобства, разработчикам 6502 пришлось усложнять его схему. И это одна из причин, по которой в 6502 так мало регистров и прочих плюшек.
Третье достоинство - одно напряжение питания. Да, у Z80 оно тоже одно, но у ВМ80 их три и это неудобно.
II. Мифы
Все время натыкаюсь на утверждение, что 6502 - это RISC процессор. Проблема в том, что термин RISC часто переводят как "вычислитель с сокращенным набором инструкций", хотя на деле это "вычислитель с набором упрощенных инструкций". Самих инструкций у современных RISC процессоров не меньше, чем у CISC. Просто инструкции эти более простые.
Например, у RISC процессоров обычно нет инструкций, модифицирующих что-то в памяти. Инструкции, которые работают с памятью, позволяют только пересылать данные. А инструкции, которые что-то вычисляют, работают только с регистрами. Вот это и называется "упрощенные инструкции". И стандартный подход в RISC - загрузить данные в регистры, которых там очень много (иногда сотни), потом обработать эти данные на регистрах, а потом - выгрузить результаты в память. Также у RISC одна инструкция обычно выполняется за 1 такт.
Видно, что 6502 - это полная противоположность. У него ничего нельзя обработать на регистрах, зато почти все инструкции могут обрабатывать данные сразу из памяти.
Также сомнительное утверждение, что создатели ARM вдохновлялись 6502. В своих воспоминаниях https://archive.computerhistory.org/res … 01-acc.pdf они пишут, что после создания BBC-Micro они искали новый процессор для 16-разрядной версии. Они ездили по разным компаниям-производителям. В том числе приехали и в Western Design Center, где создавался 65816. Так вот, впечатлило их то, что весь WDC состоял из нескольких коттеджей, в которых Билл Менш и несколько студентов-стажеров чертили процессоры на кульманах и выклеивали топологии из рубилита. То есть, вдохновил их не сам процессор, а то, какой маленькой командой он создавался и насколько простые технологии для этого использовались. Посмотрев на это они и решили, что смогут создать процессор сами.
Что интересно, 65816 им не понравился.
III. Инструкции и способы адресации
Вообще, я мог бы тут страниц 20 написать, но смысла не вижу. Поэтому скажу только основную мысль: выхватывать какие-то инструкции и способы адресации в отрыве от конкретных программ, и утверждать, что они дают какое-то офигенное преимущество - это неправильно. Это обсуждение сферического коня в вакууме.
Даже если у какого-то процессора есть инструкция, которая работает в 5 раз быстрее, чем у 6502, это не значит, что в реальной программе можно будет получить такое же преимущество в скорости. Есть инструкции перед ней, которые загружают нужные аргументы, есть инструкции после, которые как-то используют результаты, поэтому смотреть их надо все вместе. И производительность оценивать тоже.
Ради прикола приведу такой пример. В интерпретаторе Бейсиков Apple и Агат есть процедура получения следующего токена CHRGET. Процедура должна взять очередной токен программы на Бейсике, и увеличить указатель на 1. Казалось бы, зачем вообще выносить процедуру в память? Ведь у 6502 есть такая удобная косвенно-индексная адресация по Y!
А что сделала компания Microsoft? Она взяла обычную команду LDA с абсолютной адресацией, а при инкременте указателя изменяет адрес, заданный в команде LDA. Спрашивается, зачем?
А затем, что косвенно-индексная адресация по Y подразумевает, что будет использоваться регистр Y. Но процедура CHRGET обычно вызывается в цикле. А значит Y скорее всего уже занят, и его придется где-то сохранять. А при выходе из процедуры - восстанавливать.
И что получается?
Вот версия с косвенно-индексной адресацией по Y:
STY SAVY ; 3
LDY INDEX ; 3
LDA (PTR), Y ; 5
INY ; 2
STY INDEX ; 3
BNE M2 ; 3
INC PTR
M2:
LDY SAVY ; 3
Если переход на M2 выполняется, нужно 22 такта.
Вот версия Microsoft:
M:
LDA PTR ; 4
INC M+1 ; 5
BNE M2 ; 3
INC M+2
M2:
Если переход на M2 выполняется, нужно 12 тактов. Вот что значит учитывать все вместе.