Общая информация | |
---|---|
Запущен | 1983 ( 1983 ) |
Обычный производитель | |
Производительность | |
Макс. тактовая частота ЦП | 1 МГц - 14 МГц |
История | |
Предшественник | Технология МОП 6502 |
Микропроцессор 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] Подавляющее большинство машин, использующих оригинальное семейство процессоров (NMOS), содержат более позднюю версию ядра процессора, которая поддерживает эту инструкцию. [12]
Недостаток, присутствующий во всех вариантах NMOS 6502, касается инструкции перехода при использовании косвенной адресации . В этом режиме адресации целевой адрес инструкции JMP
извлекается из памяти, вектора перехода, а не является операндом инструкции JMP
. Например, JMP ($1234)
извлечет значение в ячейках памяти $1234 (младший байт) и $1235 (старший байт) и загрузит эти значения в счетчик программ , что затем заставит процессор продолжить выполнение по адресу, сохраненному в векторе.
Недостаток, который некоторые считают ошибкой, появляется, когда адрес вектора заканчивается на $FF , что является границей страницы памяти . В этом случае будет извлекаться самый старший байт целевого адреса из $00 исходной страницы, а не из $00 новой страницы. Следовательно, будет получен самый младший байт целевого адреса в $12FF и самый старший байт целевого адреса из $1200, а не из $1300 . 65C02 исправил эту проблему. [1] Нежелательное поведение инструкции NMOS 650X JMP Indirect может не быть ошибкой, поскольку описание оригинального Руководства по программированию MOS Technology MCS6500 не включает приращение старшего байта косвенного адреса, когда перенос генерируется из младшего байта, в то время как то же руководство явно указывает, что такой перенос распространяется при приращении 16-битного адреса в других режимах адресации, таких как простые и индексированные абсолютные режимы, и это согласуется с общей философией проектирования, изложенной в руководстве, что архитекторы чипа могли подразумевать, что программисты просто избегали бы попыток использовать любой косвенный адрес, который пересекает границу страницы, чтобы сэкономить один такт при выполнении косвенной адресации. Тем не менее, многие пользователи NMOS 650X восприняли это усложнение как слабость, поэтому оно было устранено в 65C02.JMP
JMP ($12FF)
Еще одна слабость конструкции, которая была исправлена по многочисленным просьбам, — состояние флага (D)ecimal в регистре состояния NMOS 6502 не определено после сброса или прерывания . Это означает, что программисты должны устанавливать флаг на известное значение, чтобы избежать случайных ошибок, вызванных арифметическими операциями, выполняемыми в режиме, отличном от предполагаемого, что составляет ошибки программного обеспечения. В результате можно найти инструкцию CLD
(CLear Decimal) почти во всех обработчиках прерываний 6502 , а также в начале кода сброса. 65C02 автоматически очищает этот флаг после помещения регистра состояния в стек в ответ на любое прерывание или в ответ на аппаратный сброс, тем самым возвращая процессор в режим двоичной арифметики. [13] Обычно это экономит несколько байтов в программном обеспечении и исключает возможность распространенной ошибки программирования (хотя это увеличивает размер любого программного обеспечения, которое постоянно работает в десятичном режиме).
Во время арифметики в десятичном режиме NMOS 6502 переведет флаги (N)egative, o(V)erflow и (Z)ero в официально неопределенные состояния. В действительности программисты эмпирически обнаружили, что ЦП обновляет эти три флага, чтобы отразить результат базовой двоичной арифметики, то есть флаги отражают результат, вычисленный до того, как процессор выполнит десятичную коррекцию. Напротив, 65C02 устанавливает эти флаги в соответствии с результатом десятичной арифметики, ценой дополнительного такта на арифметическую инструкцию. [13] (Некоторые авторы утверждают, что флаг V на 65C02 по-прежнему неверен в десятичном режиме, но флаг также можно считать бессмысленным, поскольку десятичная арифметика всегда беззнаковая.)
При выполнении инструкции чтения-изменения-записи (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
, и INC ''addr''
/ DEC ''addr''
. Некоторые ассемблеры используют альтернативные формы INA
/ DEA
или INC A
/ DEC A
. [15]STZ ''addr''
, STore Zero in addr , заменяет необходимость LDA #0
; STA ''addr''
и не требует изменения значения аккумулятора. Поскольку эта задача является общей для большинства программ, использование STZ
может уменьшить размер кода, как за счет устранения , LDA
так и любого кода, необходимого для сохранения значения аккумулятора, обычно пары PHA
PLA
. [16]PHX
, PLX
, PHY
, PLY
помещать и вытаскивать регистры X и Y в стек и из него. Ранее только аккумулятор и регистр состояния ( P ) имели инструкции push и pull. X и Y можно было сложить, только переместив их сначала в аккумулятор с помощью или , тем самым изменив содержимое аккумулятора, а затем используя . [17]TXA
TYA
PHA
BRA
, branch always, работает как 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
. После логического AND
, TSB выполняет логическое OR
of .A
с байтом памяти и сохраняет результат в addr , тогда как TRB вместо этого выполняет логическое AND
of NOT .A
с байтом памяти и сохраняет результат в addr . В обоих случаях флаг Z в регистре состояния указывает результат до того, как содержимое addr будет изменено. Другие флаги не затрагиваются. Таким образом, TRB и TSB заменяют последовательность инструкций, по сути, объединяя инструкцию с дополнительными шагами для сохранения вычислительных изменений, но без дополнительных шагов, влияющих на флаги, и без влияния на флаг V, как это происходит. [1].A AND addr
BIT
BIT
Изменения Rockwell добавили больше инструкций по битовой манипуляции для любого бита на нулевой странице, для прямой установки или сброса бита с помощью 2-байтовой инструкции или для проверки и перехода по биту с помощью одной 3-байтовой инструкции. Новые инструкции были доступны с самого начала в семействе Rockwell R65C00, [19] но не были частью оригинальной спецификации 65C02 и не встречались в версиях, созданных WDC или другими ее лицензиатами. Позднее они были скопированы обратно в базовую конструкцию и были доступны в более поздних версиях WDC.
Инструкции, специфичные для Rockwell, следующие:
SMB''bit#'' ''zp''
и RMB''bit#'' ''zp''
. Установить или сбросить (очистить) номер бита bit# в байте нулевой страницы zp .RMB
) или установки ( SMB
) отдельных битов в битовом поле, каждая из которых заменяет последовательность из трех инструкций. Поскольку RMB
и SMB
допускают только адресацию нулевой страницы, эти инструкции имеют ограниченную полезность и в первую очередь представляют ценность в системах, в которых регистры устройств присутствуют на нулевой странице. [ необходима цитата ] Компонент bit# инструкции является частью кода операции и часто записывается как часть мнемоники, например, SMB1 $12
которая устанавливает бит 1 в адресе нулевой страницы $12 (адрес a/k/a $0012). Некоторые ассемблеры рассматривают bit# как часть операнда инструкции, например, SMB '''1''',$12
, что имеет то преимущество, что позволяет заменить его именем переменной или вычисленным числом. [16]BBS''bit#'' ''zp'',''addr''
и BBR''bit#'' ''zp'',''addr''
. Переход при установке/сбросе бита.RMB
и SMB
, но эти инструкции проверяют, а не назначают, выбранный бит байта нулевой страницы zp и затем переходят на addr, если этот бит очищен ( BBR
) или установлен ( BBS
). Также, как и в случае с RMB
и SMB
выше, компонент bit# инструкции часто записывается как часть мнемоники, например, BBS1 $12,''addr''
который переходит на адресную метку addr, если установлен бит 1 байта по адресу нулевой страницы $12. Опять же, некоторые ассемблеры рассматривают bit# как часть операнда инструкции, например, BBS '''1''',$12,''addr''
, с тем преимуществом, что его можно заменить именем переменной или вычисляемым числом. [16]Каждая из RMB
, SMB
, BBR
, и BBS
заменяет последовательность из трех инструкций. [16]
В дополнение к новым командам, указанным выше, WDC также добавила инструкции STP
и WAI
для поддержки режимов пониженного энергопотребления.
STP
, STop the Processor, останавливает всю обработку до тех пор, пока не будет выполнен аппаратный сброс. Это можно использовать для перевода системы в «спящий» режим, а затем для ее быстрого «разбуживания» (реактивации) с помощью сброса.
WAI
t имеет аналогичный эффект, останавливая всю обработку, но эта инструкция возобновляет нормальное выполнение при получении прерывания. Без этой инструкции ожидание аппаратного прерывания обычно включает в себя запуск цикла приостановки программы до тех пор, пока обработка прерывания не выйдет из цикла, иногда называемого « вращением ». Это означает, что процессор работает в течение всего процесса, используя питание и (почти) ничего не делая, даже когда прерываний не происходит. Напротив, в 65C02 код прерывания можно написать, имея WAI
за a сразу же JSR
или JMP
в обработчике. Когда WAI
встречается , обработка останавливается, и процессор переходит в режим пониженного энергопотребления. Когда получено прерывание, процессор немедленно выполняет JSR
и обрабатывает запрос.
Это имеет дополнительное преимущество в виде небольшого улучшения производительности. В случае вращения прерывание может поступить в середине одной из инструкций цикла, и чтобы позволить ему перезапуститься после возврата из обработчика, процессор тратит три цикла на сохранение своего местоположения. С процессор WAI
переходит в состояние низкого энергопотребления в известном месте, где все инструкции гарантированно завершены, поэтому при поступлении прерывания он не может прервать инструкцию, а ответ на прерывание может быть немедленным. Кроме того, поскольку программа ожидает прерывания, процессор может безопасно продолжить работу, не тратя время на сохранение состояния; программа несет ответственность за выполнение любого необходимого сохранения состояния до .WAI
65 SC 02 — это вариант WDC 65C02 без битовых инструкций. [20] [21]
N, V и Z были неверными после десятичной операции (но C был в порядке).