Микропроцессор 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 и 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
to $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] Типичные микропроцессоры, не реализованные в CMOS, имеют динамические ядра и потеряют содержимое своих внутренних регистров (и, следовательно, выйдет из строя), если они не будут постоянно тактироваться со скоростью между некоторыми минимальными и максимальными указанными значениями.
VPB
Выход Vector pull ( ) указывает на обращение к векторам прерываний.MLB
) указывает другим ведущим устройствам шины , когда обрабатывается команда чтения-изменения-записи.WAI
) и ST o P ( STP
) снижают энергопотребление, уменьшают задержку прерывания и обеспечивают синхронизацию с внешними событиями.W65C02S может работать при любом удобном напряжении питания (VDD ) от 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 сообщила, что реализации W65C02S на FPGA успешно работают на частоте 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 при первом выпуске имел несколько ошибок. Ранние версии процессора не имели ROR
инструкций (поворот вправо), и в руководствах по технологии MOS это также не документировалось. ROR
была реализована на очень ранней стадии производства, и подавляющее большинство машин, использующих процессор, поддерживают эту инструкцию. [10]
Ошибка, присутствующая во всех вариантах 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 автоматически очищает этот флаг после помещения регистра состояния в стек в ответ на любое прерывание или в ответ на аппаратный сброс, тем самым переводя процессор обратно в режим двоичной арифметики. [11]
Во время арифметики в десятичном режиме NMOS 6502 будет обновлять флаги (N)egative, o(V)erflow и (Z)ero, чтобы отразить результат базовой двоичной арифметики, то есть флаги отражают результат, вычисленный до обработки процессором. выполнение десятичной коррекции. Напротив, 65C02 устанавливает эти флаги в соответствии с результатом десятичной арифметики за счет дополнительного тактового цикла на каждую арифметическую команду. [11]
При выполнении инструкции чтения-изменения-записи (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)
ко всем инструкциям, которые использовали индексированный косвенный и непрямой индексированный режимы, освобождая индексные регистры. [12]
Инструкция 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-битным смещением. [12] То же самое можно было достичь в версии NMOS с использованием индексированного косвенного режима, но только если таблица находилась на нулевой странице, а это ограниченный ресурс. Разрешение их создания за пределами нулевой страницы не только уменьшило потребность в этом ресурсе, но также позволило создавать таблицы в ПЗУ.
В дополнение к новым режимам адресации в «базовую модель» 65C02 также добавлен набор новых инструкций. [13]
INC
и DEC
без параметров теперь увеличивает или уменьшает аккумулятор. Это была странная ошибка в исходном наборе команд, который включал только INX
/ DEX
, INY
/ DEY
и / . Некоторые ассемблеры используют альтернативные формы / или / . [13]INC addr
DEC addr
INA
DEA
INC A
DEC A
STZ addr
, STore Zero по адресу . Заменяет необходимость и не требует изменения емкости аккумулятора. Поскольку эта задача является общей для большинства программ, использование может уменьшить размер кода как за счет исключения, так и любого кода, необходимого для сохранения значения аккумулятора, обычно пары. [14]LDA #0;STA addr
STZ
LDA
PHA
PLA
PHX
, PLX
, PHY
, PLY
, помещайте и извлекайте регистры X и Y в/из стека. Раньше только аккумулятор и регистр состояния имели инструкции push и pull. X и Y можно было сложить, только сначала переместив их в аккумулятор с помощью TXA
или TYA
, тем самым изменив содержимое аккумулятора, а затем используя PHA
. [15]BRA
, ветка всегда. Работает как a JMP
, но использует 1-байтовый относительный адрес, как и другие ветки, экономя байт. Скорость часто такая же, как и при абсолютном 3-м цикле, JMP
если не пересечь страницу, что сделает BRA
цикл версии 1 длиннее (4 цикла). [16] Поскольку адрес является относительным, он также полезен при написании перемещаемого кода, [14] что было обычной задачей в эпоху, когда еще не было модулей управления памятью .И WDC, и Rockwell внесли улучшения в функции тестирования и манипулирования битами в 65C02. WDC добавила новые режимы адресации к инструкции BIT, которая присутствовала в 6502, а также две новые инструкции для удобного манипулирования битовыми полями, что является обычным действием в драйверах устройств.
BIT
в 65C02 добавлен немедленный режим, нулевая страница, индексируемая X, и абсолютная индексация X-адресации. [13] Непосредственная адресация особенно удобна тем, что она полностью неразрушающая. Например:
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 R65C00 [17] , но не были частью исходной спецификации 65C02 и не встречались в версиях, выпущенных WDC или другими ее лицензиатами. Позже они были скопированы обратно в базовый дизайн и стали доступны в более поздних версиях WDC.
Специальные инструкции Rockwell:
SMBbit# zp
и . Установить или сбросить (очистить) номер бита бит# в байте нулевой страницы zp .RMBbit# zp
SMB1 $12
которая устанавливает бит 1 в адресе нулевой страницы $12. Некоторые ассемблеры рассматривают бит# как часть операнда инструкции, например , который имеет то преимущество, что позволяет заменять его именем переменной или вычисленным числом. [14]SMB 1,$12
BBSbit# zp,addr
и . Переход по установке/сбросу бита.BBRbit# zp,addr
BBS1 $12,addr
BBS 1,$12,addr
В дополнение к новым командам, указанным выше, WDC также добавил инструкции STP
и WAI
для поддержки режимов пониженного энергопотребления.
STP
, ОСТАНОВИТЬ процессор, остановить всю обработку до тех пор, пока не будет выполнен аппаратный сброс. Это можно использовать, чтобы перевести систему в «спящий режим», а затем быстро вывести ее из строя с помощью перезагрузки. Обычно для этого требовалась внешняя система для обслуживания основной памяти, и она не получила широкого распространения.
WAI
t имел аналогичный эффект при переходе в режим пониженного энергопотребления, но эта инструкция снова разбудила процессор при получении прерывания. Раньше обработка прерывания обычно включала в себя выполнение цикла для проверки получения прерывания, иногда называемого « вращением », проверку типа при его получении и затем переход к коду обработки. Это означало, что процессор работал в течение всего процесса, даже когда не происходило никаких прерываний.
Напротив, в 65C02 код прерывания можно было записать, если WAI
за ним сразу же следовал a JSR
или JMP
обработчик. Когда он WAI
был обнаружен, обработка остановилась, и процессор перешел в режим пониженного энергопотребления. Когда прерывание было получено, оно немедленно обработало JSR
и обработало запрос.
Это имело дополнительное преимущество в виде небольшого улучшения производительности. В случае вращения прерывание может появиться в середине одной из инструкций цикла, и чтобы позволить ему перезапуститься после возврата из обработчика, процессор тратит один цикл на сохранение своего местоположения. При этом WAI
процессор переходит в состояние пониженного энергопотребления в известном месте, где все инструкции гарантированно будут завершены, поэтому при поступлении прерывания он не может прервать инструкцию, и процессор может безопасно продолжить работу, не тратя состояние сохранения цикла.
65 SC 02 представляет собой вариант WDC 65C02 без битовых инструкций. [18]
Флаги N, V и Z были неправильными после десятичной операции (но C был в порядке).