Микропроцессор Western Design Center (WDC) 65C02 представляет собой усовершенствованную версию CMOS популярной 8-битной технологии MOS 6502 на основе nMOS . Он потребляет меньше энергии, чем оригинальный 6502, устраняет несколько проблем и добавляет новые инструкции. Потребление энергии примерно в 10-20 раз меньше, чем у оригинального 6502, работающего на той же скорости; [1] его сниженное энергопотребление сделало его полезным в портативных компьютерных ролях и промышленных микроконтроллерных системах. 65C02 также использовался в некоторых домашних компьютерах , а также во встраиваемых приложениях, включая имплантированные устройства медицинского класса.
Разработка WDC 65C02 началась в 1981 году [a] с образцами, выпущенными в начале 1983 года . [b] 65C02 был официально выпущен вскоре после этого. [2] WDC лицензировала дизайн Synertek , NCR , GTE Microcircuits и Rockwell Semiconductor . Основной интерес Rockwell был на рынке встраиваемых систем, и он попросил добавить несколько новых команд для помощи в этой роли. Позже они были скопированы обратно в базовую версию, после чего WDC добавили две собственные новые команды для создания W65C02 . Sanyo позже также лицензировала дизайн, а Seiko Epson выпустила еще одну модифицированную версию как HuC6280 .
Ранние версии использовали 40-контактный DIP-корпус и были доступны в версиях 1, 2 и 4 МГц, что соответствовало скоростям оригинальных версий nMOS. Более поздние версии выпускались в корпусах PLCC и QFP , а также PDIP и с гораздо более высокими тактовыми частотами. Текущая версия от WDC, W65C02S-14, имеет полностью статическое ядро и официально работает на скоростях до 14 МГц при питании от 5 вольт.
65C02 — это недорогой, универсальный 8-битный микропроцессор (8-битные регистры и шина данных ) с 16-битным счетчиком программ и адресной шиной . Набор регистров небольшой, с одним 8-битным аккумулятором (A), двумя 8-битными индексными регистрами (X и Y), 8-битным регистром состояния (P) и 16-битным счетчиком программ (PC). В дополнение к одному аккумулятору, первые 256 байт ОЗУ, «нулевая страница» ( $0000
по $00FF
), обеспечивают более быстрый доступ через режимы адресации, которые используют 8-битный адрес памяти вместо 16-битного адреса. Стек находится в следующих 256 байтах, на первой странице (от $0100 до $01FF), и не может быть перемещен или расширен. Стек растет в обратном направлении с указателем стека (S), начинающимся с $01FF и уменьшающимся по мере роста стека. [3] Он имеет набор инструкций переменной длины , длина каждой инструкции варьируется от одного до трех байтов. [1]
Базовая архитектура 65C02 идентична оригинальной 6502 и может считаться маломощной реализацией этой конструкции. На частоте 1 МГц, самой популярной скорости для оригинальной 6502, 65C02 требует всего 20 мВт, в то время как оригинал использует 450 мВт, что меньше более чем в двадцать раз. [4] Вручную оптимизированное ядро и низкое энергопотребление призваны сделать 65C02 хорошо подходящим для маломощных систем на кристалле (SoC). [1]
Модель описания оборудования Verilog доступна для проектирования ядра W65C02S в специализированную интегральную схему (ASIC) или программируемую пользователем вентильную матрицу (FPGA). [5] Как это принято в полупроводниковой промышленности, WDC предлагает систему разработки, которая включает плату разработчика , внутрисхемный эмулятор (ICE) и систему разработки программного обеспечения. [6]
W65C02S –14 является производственной версией по состоянию на 2023 год [обновлять]и доступна в корпусах PDIP , PLCC и QFP . Максимальная официально поддерживаемая тактовая частота Ø2 (первичная) составляет 14 МГц при работе от 5 вольт, на что указывает суффикс –14 номера детали (любители разработали домашние системы 65C02, которые работают быстрее официального рейтинга). Обозначение «S» указывает на то, что деталь имеет полностью статическое ядро , функцию, которая позволяет замедлять Ø2 или полностью останавливать его как в высоком, так и в низком состоянии без потери данных. [7] Типичные микропроцессоры, не реализованные в КМОП, имеют динамические ядра и будут терять содержимое своих внутренних регистров (и, таким образом, выходить из строя), если они не будут непрерывно тактироваться со скоростью между некоторыми минимальными и максимальными указанными значениями.
VPB
) указывает, когда адресуются векторы прерыванийMLB
) указывает другим мастерам шины , когда обрабатывается инструкция чтения-изменения-записиWAI
) и ST o P ( STP
) снижают энергопотребление, уменьшают задержку прерывания и обеспечивают синхронизацию с внешними событиямиW65C02S может работать при любом удобном напряжении питания (V DD ) от 1,8 до 5 вольт (±5%). Таблица характеристик переменного тока в техническом паспорте содержит рабочие характеристики при 5 В на частоте 14 МГц, 3,3 В или 3 В на частоте 8 МГц, 2,5 В на частоте 4 МГц и 1,8 В на частоте 2 МГц. Эта информация может быть артефактом более раннего технического паспорта, поскольку график показывает, что типичные устройства способны работать на более высоких скоростях, чем указано в таблице характеристик переменного тока, и что надежная работа на частоте 20 МГц должна быть легко достижима при V DD на частоте 5 вольт, если поддерживающее оборудование это позволит.
Поддержка W65C02S произвольных тактовых частот позволяет использовать тактовый сигнал, работающий на частоте, идеальной для какой-либо другой части системы, например, 13,5 МГц (частота дискретизации яркости цифрового SDTV), 14,31818 МГц (частота несущей цвета NTSC × 4), 14,75 МГц (квадратные пиксели PAL), 14,7456 (скорость передачи данных кристалла) и т. д., при условии, что V DD достаточно для поддержки частоты. Конструктор Билл Менш указал, что на F MAX влияют факторы, не входящие в состав кристалла, такие как емкостная нагрузка на выводы микропроцессора. Минимизация нагрузки за счет использования коротких сигнальных дорожек и наименьшего количества устройств помогает повысить F MAX . Корпуса PLCC и QFP имеют меньшую емкость между выводами, чем корпус PDIP, и более экономичны в использовании пространства на печатной плате .
WDC сообщил, что реализации FPGA W65C02S успешно работают на частоте 200 МГц. [ необходима цитата ]
Хотя 65C02 можно в основном рассматривать как маломощный 6502, он также исправляет несколько ошибок, обнаруженных в оригинале, и добавляет новые инструкции, режимы адресации и функции, которые могут помочь программисту писать более мелкие и быстро выполняющиеся программы. Предполагается, что средняя программа на языке ассемблера 6502 может быть сделана на 10-15 процентов меньше на 65C02 и увидеть аналогичное улучшение производительности, в основном за счет избегания доступа к памяти за счет использования меньшего количества инструкций для выполнения заданной задачи. [1]
Оригинальный 6502 имеет 56 инструкций, которые в сочетании с различными режимами адресации производят в общей сложности 151 опкод из возможных 256 8-битных шаблонов опкодов. Оставшиеся 105 неиспользуемых опкодов не определены, причем набор кодов с младшими 4-битами с 3, 7, B или F остается полностью неиспользованным, код с младшими 2 имеет только один опкод. [8]
На 6502 некоторые из этих остаточных кодов фактически выполняют вычисления. Из-за того, как работает декодер инструкций 6502, простая установка определенных битов в опкоде приводит к выполнению частей обработки инструкций. Некоторые из этих опкодов немедленно приводят к сбою процессора, в то время как другие выполняют полезные функции и даже получили неофициальные ассемблерные мнемоники от некоторых программистов. [9]
65C02 добавляет новые опкоды, которые используют некоторые из этих ранее недокументированных слотов инструкций. Например, $FF используется для новой BBS
инструкции. Те, которые остаются действительно неиспользованными, эквивалентны NOP
s. Программы 6502, использующие эти опкоды, не будут работать на 65C02. [1]
Оригинальный процессор 6502 при первоначальном запуске имел несколько ошибок.
В ранних версиях процессора 1975 года не было ROR
инструкции (вращать вправо), хотя она у них была ROL
(вращать влево). Это был преднамеренный выбор дизайна MOS Technology, поскольку считалось, что реализация ROR
была слишком затратной в области чипа для тех преимуществ, которые она давала. [10] Однако клиенты жаловались на отсутствие инструкции ROR
, и она была реализована в деталях, выпускаемых с июня 1976 года. Отсутствие ROR
особенно повлияло на производительность нормализации мантиссы в математических процедурах с плавающей точкой. [11] Подавляющее большинство машин, использующих процессор, поддерживают эту инструкцию. [12]
Ошибка, присутствующая во всех вариантах NMOS 6502, касается инструкции перехода при использовании косвенной адресации . В этом режиме адресации целевой адрес инструкции JMP
извлекается из памяти, вектора перехода, а не является операндом инструкции JMP
. Например, JMP ($1234)
извлечет значение в ячейках памяти $1234 (младший байт) и $1235 (старший байт) и загрузит эти значения в счетчик программ , что затем заставит процессор продолжить выполнение по адресу, сохраненному в векторе.
Ошибка появляется, когда адрес вектора заканчивается на $FF , что является границей страницы памяти . В этом случае будет извлечен самый старший байт целевого адреса из $00 исходной страницы, а не из $00 новой страницы. Следовательно, будет получен самый младший байт целевого адреса в $12FF и самый старший байт целевого адреса из $1200 , а не из $1300 . 65C02 исправил эту проблему. [1]JMP
JMP ($12FF)
Скорее недосмотр, чем ошибка, состояние флага (D)ecimal в регистре состояния NMOS 6502 не определено после сброса или прерывания . Это означает, что программисты должны устанавливать флаг на известное значение, чтобы избежать любых ошибок, связанных с арифметическими операциями. В результате можно найти CLD
инструкцию (CLear Decimal) почти во всех обработчиках прерываний 6502 , а также в начале кода сброса. 65C02 автоматически очищает этот флаг после помещения регистра состояния в стек в ответ на любое прерывание или в ответ на аппаратный сброс, тем самым возвращая процессор в двоичный арифметический режим. [13]
Во время арифметики в десятичном режиме NMOS 6502 обновит флаги (N)egative, o(V)erflow и (Z)ero, чтобы отразить результат базовой двоичной арифметики, то есть флаги отражают результат, вычисленный до того, как процессор выполнит десятичную коррекцию. Напротив, 65C02 устанавливает эти флаги в соответствии с результатом десятичной арифметики, за счет дополнительного такта на арифметическую инструкцию. [13]
При выполнении инструкции чтения-изменения-записи (RMW), такой как , все варианты NMOS будут выполнять двойную запись в addr , сначала перезаписывая текущее значение, найденное в addr , а затем записывая измененное значение. Такое поведение может привести к трудноразрешимым ошибкам, если addr является аппаратным регистром. Это может произойти, если оборудование отслеживает изменения значения в регистре, а затем выполняет действие; в этом случае оно выполнит два действия, одно с исходным значением, а затем снова с новым значением. 65C02 вместо этого выполняет двойное чтение addr , за которым следует одна запись.INC addr
При выполнении индексированной адресации, если индексация пересекает границу страницы, все варианты NMOS будут считывать с недопустимого адреса перед доступом к правильному адресу. Как и в случае с инструкцией RMW, такое поведение может вызвать проблемы при доступе к аппаратным регистрам через индексацию. 65C02 исправил эту проблему, выполнив фиктивное чтение кода операции инструкции, когда индексация пересекает границу страницы. Однако это исправление внесло новую ошибку [ необходима цитата ] , которая возникает, когда базовый адрес находится на четной границе страницы (что означает, что индексация никогда не перейдет на следующую страницу). С новой ошибкой фиктивное чтение выполняется по базовому адресу перед индексацией, так что LDA $1200,X
будет выполнено фиктивное чтение по $1200 до того, как значение X будет добавлено к $1200 . Опять же, если индексация по адресам аппаратных регистров, эта ошибка может привести к неопределенному поведению.
Если NMOS 6502 извлекает код операции BRK (программное прерывание) в то же время, когда происходит аппаратное прерывание, BRK будет проигнорирован, поскольку процессор реагирует на аппаратное прерывание. 65C02 правильно обрабатывает эту ситуацию, обслуживая прерывание и затем выполняя BRK.
6502 имеет два режима косвенной адресации, которые разыменовываются через 16-битные адреса, хранящиеся на нулевой странице:
LDA ($10,X)
, добавляет регистр X к указанному адресу нулевой страницы перед чтением 16-битного вектора. В этом примере, если X равен 5, он считывает 16-битный адрес из местоположения $15/$16. Это полезно, когда на нулевой странице есть массив указателей.LDA ($10),Y
добавляет регистр Y к 16-битному вектору, считанному с заданного адреса страницы ноль. Например, если Y равен 5, а $10/$11 содержит вектор $1000 , это считывает значение из $1005 . Это выполняет адресацию смещения указателя.Недостатком этой модели является то, что если индексация не нужна, но адрес находится на нулевой странице, один из индексных регистров все равно должен быть установлен в ноль и использоваться в одной из этих инструкций. 65C02 добавил неиндексированный косвенный режим адресации LDA ($10)
ко всем инструкциям, которые использовали индексированный косвенный и косвенный индексированный режимы, освободив индексные регистры. [14]
Инструкция 6502 JMP
имела уникальный (среди инструкций 6502) режим адресации, известный как «абсолютная косвенная», который считывал 16-битное значение из заданного адреса памяти, а затем переходил к адресу в этом 16-битном значении. Например, если ячейка памяти $A000 содержит $34, а $A001 содержит $12, считывал эти два байта, создавал значение $1234 и переходил к этой ячейке.JMP ($A000)
Одним из распространенных вариантов использования косвенной адресации является построение таблиц ветвлений , списка точек входа для подпрограмм , к которым можно получить доступ с помощью индекса. Например, драйвер устройства может перечислить точки входа для OPEN
, CLOSE
, READ
, и т. д. в таблице по адресу $A000 . — это третья запись, индексированная нулем, и каждый адрес требует 16 бит, поэтому для вызова одного из них нужно использовать что-то похожее на . Если драйвер обновлен и код подпрограммы перемещен в память, любой существующий код будет работать до тех пор, пока таблица указателей остается по адресу $A000 .READ
READ
JMP ($A004)
В 65C02 был добавлен новый режим «индексированного абсолютного косвенного доступа», который упростил использование таблиц ветвлений. Этот режим добавлял значение регистра X к абсолютному адресу и брал 16-битный адрес из полученного местоположения. Например, чтобы получить доступ к функции READ
из таблицы выше, нужно было бы сохранить 4 в X, затем JMP ($A000,X)
. Этот стиль доступа упрощает доступ к таблицам ветвлений, поскольку используется один базовый адрес в сочетании с 8-битным смещением. [14] Того же самого можно было достичь в версии NMOS с использованием индексированного косвенного режима, но только если таблица находилась на нулевой странице, ограниченном ресурсе. Разрешение их построения за пределами нулевой страницы не только уменьшило спрос на этот ресурс, но и позволило строить таблицы в ПЗУ.
В дополнение к новым режимам адресации, «базовая модель» 65C02 также добавила набор новых инструкций. [15]
INC
и DEC
без параметров теперь увеличивают или уменьшают аккумулятор. Это было странной оплошностью в исходном наборе инструкций, который включал только INX
/ DEX
, INY
/ DEY
и / . Некоторые ассемблеры используют альтернативные формы / или / . [15]INC addr
DEC addr
INA
DEA
INC A
DEC A
STZ addr
, STore Zero in addr . Заменяет необходимость и не требует изменения значения аккумулятора. Поскольку эта задача является обычной в большинстве программ, использование может уменьшить размер кода, как за счет устранения , так и любого кода, необходимого для сохранения значения аккумулятора, обычно пары . [16]LDA #0;STA addr
STZ
LDA
PHA
PLA
PHX
, PLX
, PHY
, PLY
, помещать и вытягивать регистры X и Y в/из стека. Ранее только аккумулятор и регистр состояния имели инструкции push и pull. X и Y можно было сложить, только переместив их в аккумулятор сначала с помощью TXA
или TYA
, тем самым изменив содержимое аккумулятора, а затем используя PHA
. [17]BRA
, всегда ветвление. Работает как a, JMP
но использует 1-байтовый относительный адрес, как и другие ветки, экономя байт. Скорость часто такая же, как и 3-цикловая абсолютная, JMP
если только страница не пересекается, что делает BRA
цикл версии 1 длиннее (4 цикла). [18] Поскольку адрес относительный, он также полезен при написании перемещаемого кода, [16] обычная задача в эпоху до появления блоков управления памятью .И WDC, и Rockwell внесли улучшения в функции тестирования и манипуляции битами в 65C02. WDC добавила новые режимы адресации к инструкции BIT, которая присутствовала в 6502, а также две новые инструкции для удобной манипуляции битовыми полями, что является обычным действием в драйверах устройств.
BIT
в 65C02 добавлен немедленный режим, нулевая страница, индексированная по X, и абсолютная индексированная по X адресация. [15] Немедленный режим адресации особенно удобен тем, что он полностью неразрушающий. Например:
LDA $1234
BIT #%00010000
может использоваться вместо:
LDA $1234
AND #%00010000
Операция AND
изменяет значение в аккумуляторе, поэтому исходное значение, загруженное из $1234, теряется. Использование BIT
оставляет значение в аккумуляторе неизменным, поэтому последующий код может выполнять дополнительные проверки относительно исходного значения, избегая необходимости повторной загрузки значения из памяти.
В дополнение к усовершенствованиям инструкции BIT
WDC добавила две инструкции, предназначенные для удобной манипуляции битовыми полями:
TSB addr
и , Тестирование и установка битов и Тестирование и сброс битов.TRB addr
.A
) логически И сопоставляется с памятью по адресу addr , местоположение которой может быть нулевой страницей или абсолютным. Флаг Z в регистре состояния обусловлен в соответствии с результатом логического И — никакие другие флаги регистра состояния не затрагиваются. Кроме того, биты в addr устанавливаются (TSB) или очищаются (TRB) в соответствии с маской в .A
. TSB выполняет логическое OR
после логического AND
и сохраняет результат логического OR
в addr , тогда как TRB сохраняет результаты логического AND
в addr . В обоих случаях флаг Z в регистре состояния указывает результат до того, как содержимое addr было изменено. Таким образом, TRB и TSB заменяют последовательность инструкций, по сути, объединяя инструкцию с дополнительными шагами для сохранения вычислительных изменений, но таким образом, чтобы сообщать о состоянии затронутого значения до его изменения. [1].A AND addr
BIT
Изменения Rockwell добавили больше инструкций по манипуляции битами для прямой установки и проверки любого бита и объединения проверки, очистки и перехода в один опкод. Новые инструкции были доступны с самого начала в семействе Rockwell R65C00, [19] но не были частью оригинальной спецификации 65C02 и не встречались в версиях, созданных WDC или другими ее лицензиатами. Позднее они были скопированы обратно в базовую конструкцию и были доступны в более поздних версиях WDC.
Инструкции, специфичные для Rockwell, следующие:
SMBbit# zp
и . Установить или сбросить (очистить) номер бита bit# в байте нулевой страницы zp .RMBbit# zp
SMB1 $12
которая устанавливает бит 1 в адресе нулевой страницы $12. Некоторые ассемблеры рассматривают bit# как часть операнда инструкции, например, , что имеет преимущество в том, что позволяет заменить его именем переменной или вычисляемым числом. [16]SMB 1,$12
BBSbit# zp,addr
и . Переход при установке/сбросе бита.BBRbit# zp,addr
BBS1 $12,addr
BBS 1,$12,addr
В дополнение к новым командам, указанным выше, WDC также добавила инструкции STP
и WAI
для поддержки режимов пониженного энергопотребления.
STP
, STop the Processor, останавливал всю обработку до тех пор, пока не будет выполнен аппаратный сброс. Это можно было использовать для перевода системы в «спящий» режим, а затем быстро разбудить ее сбросом. Обычно для этого требовалась внешняя система для поддержания основной памяти, и это не использовалось широко.
WAI
t имел аналогичный эффект, входя в режим пониженного энергопотребления, но эта инструкция снова пробуждала процессор при получении прерывания. Ранее обработка прерывания обычно включала запуск цикла для проверки того, было ли получено прерывание, иногда называемое « вращающимся », проверкой типа при получении и последующим переходом к коду обработки. Это означало, что процессор работал в течение всего процесса, даже когда прерываний не было.
Напротив, в 65C02 код прерывания можно было написать, поместив WAI
сразу за ним JSR
или JMP
в обработчик. Когда WAI
встречалось , обработка останавливалась, и процессор переходил в режим пониженного энергопотребления. Когда прерывание было получено, он немедленно обрабатывал JSR
и обрабатывал запрос.
Это имело дополнительное преимущество в виде небольшого улучшения производительности. В случае вращения прерывание может поступить в середине одной из инструкций цикла, и чтобы позволить ему перезапуститься после возврата из обработчика, процессор тратит один цикл на сохранение своего местоположения. С процессор WAI
переходит в состояние низкого энергопотребления в известном месте, где все инструкции гарантированно завершены, поэтому при поступлении прерывания оно не может прервать инструкцию, и процессор может безопасно продолжить работу, не тратя цикл на сохранение состояния.
65 SC 02 — это вариант WDC 65C02 без битовых инструкций. [20] [21]
N, V и Z были неверными после десятичной операции (но C был в порядке).