Введение

Микропроцессор CMOS в семействе 6502. Микропроцессор Western Design Center (WDC) 65C02 является улучшенной CMOS-версией популярного 8-битного микропроцессора 6502 на основе nMOS. Он потребляет меньше энергии, чем оригинальный 6502, устраняет несколько проблем и добавляет новые инструкции. Энергопотребление составляет примерно в 10-20 раз меньше, чем у оригинального 6502, работающего на той же частоте; благодаря сниженному энергопотреблению он оказался полезен в портативных компьютерах и промышленных системах микроконтроллеров. 65C02 также использовался в некоторых домашних компьютерах, а также во встраиваемых приложениях, включая имплантируемые медицинские устройства. Разработка WDC 65C02 началась в 1981 году, а образцы были выпущены в начале 1983 года. Официальный выпуск 65C02 состоялся вскоре после этого. 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 вольт.

Часовые характеристики

W65C02S может работать при любом удобном напряжении питания (VDD) от 1,8 до 5 вольт (±5%). В таблице характеристик переменного тока в техническом описании перечислены рабочие характеристики при 5 В на частоте 14 МГц, 3,3 В или 3 В на частоте 8 МГц, 2,5 В на частоте 4 МГц и 1,8 В на частоте 2 МГц. Эта информация может быть устаревшим артефактом из более раннего технического описания, поскольку график показывает, что типичные устройства способны работать на более высоких частотах, чем указано в таблице характеристик переменного тока, и что надежная работа на частоте 20 МГц должна быть легко достижима при VDD 5 вольт, при условии, что поддерживающее оборудование это позволяет. Поддержка W65C02S произвольных тактовых частот позволяет использовать тактовую частоту, оптимальную для других компонентов системы, например, 13,5 МГц (частота дискретизации яркостной составляющей цифрового SDTV), 14,31818 МГц (частота цветной поднесущей NTSC × 4), 14,75 МГц (квадратные пиксели PAL), 14,7456 МГц (частота кварцевого генератора для скорости передачи данных) и т.д., при условии, что VDD достаточно для обеспечения этой частоты. Разработчик Билл Менш отметил, что на максимальную частоту (FMAX) влияют внешние факторы, такие как емкостная нагрузка на выводы микропроцессора. Минимизация нагрузки за счет использования коротких проводников и минимального количества компонентов помогает увеличить FMAX. Корпуса PLCC и QFP имеют меньшую межвыводную емкость, чем корпус PDIP, и более эффективно используют пространство на печатной плате. Компания WDC сообщила об успешной работе FPGA-реализаций W65C02S на частоте 200 МГц.

Основная архитектура

Хотя 65C02 в основном можно рассматривать как энергоэффективный 6502, он также исправляет несколько ошибок, найденных в оригинальной версии, и добавляет новые инструкции, режимы адресации и функции, которые могут помочь программисту в создании более компактных и быстродействующих программ. По оценкам, средняя программа на языке ассемблера для 6502 может быть уменьшена на 10-15% при использовании 65C02, а также добиться аналогичного улучшения производительности, в основном за счет сокращения обращений к памяти благодаря использованию меньшего количества инструкций для выполнения той же задачи.

Недокументированные инструкции удалены

Оригинальный 6502 имеет 56 инструкций, которые, в сочетании с различными режимами адресации, генерируют в общей сложности 151 опкод из возможных 256 восьмибитных шаблонов опкодов. Оставшиеся 105 неиспользуемых опкодов не определены, при этом набор кодов с младшими 4 битами 3, 7, B или F остается полностью неиспользованным, а код с младшим 2 битом содержит только один опкод. На 6502 некоторые из этих неиспользуемых кодов фактически выполняют вычисления. В силу особенностей работы декодера инструкций 6502, установка определенных битов в опкоде приводит к выполнению части логики обработки инструкции. Некоторые из этих опкодов немедленно приводят к сбою процессора, в то время как другие выполняют полезные функции и даже получили неофициальные мнемонические обозначения от некоторых программистов. 65C02 добавляет новые опкоды, использующие некоторые из этих ранее не задокументированных слотов инструкций. Например, $FF используется для новой инструкции BBS. Те, которые остаются действительно неиспользованными, эквивалентны NOP. Программы для 6502, использующие эти опкоды, не будут работать на 65C02.

Исправления ошибок

Оригинальный 6502 имел несколько ошибок при первоначальном запуске. Ранние версии процессора не имели инструкции ROR (вращения вправо), и в руководствах MOS Technology она также не была задокументирована. ROR был реализован очень рано в производственном цикле, и подавляющее большинство машин, использующих процессор, поддерживают эту инструкцию. Ошибка, присутствующая во всех вариантах NMOS 6502, связана с инструкцией перехода при использовании косвенной адресации. В этом режиме адресации целевой адрес инструкции JMP извлекается из памяти – вектора перехода, а не является операндом инструкции JMP. Например, JMP ($1234) извлечет значение из ячеек памяти ($1234) и ($1235) и загрузит эти значения в счетчик программ, что заставит процессор продолжить выполнение по адресу, хранящемуся в векторе. Ошибка проявляется, когда адрес вектора заканчивается на $FF, что является границей страницы памяти. В этом случае JMP извлечет старший байт целевого адреса с исходной страницы, а не с новой страницы. Следовательно, JMP ($12FF) получит младший байт целевого адреса из $12FF и старший байт целевого адреса из $1300, а не из $1200. 65C02 исправил эту проблему. Скорее, недосмотр, чем ошибка, состояние (D)есятичного флага в регистре статуса NMOS 6502 не определено после сброса или прерывания. Это означает, что программисты должны установить флаг в известное значение, чтобы избежать ошибок, связанных с арифметическими операциями. В результате, инструкция CLD (Clear Decimal – сброс десятичного флага) встречается почти во всех обработчиках прерываний 6502, а также в начале кода сброса. 65C02 автоматически очищает этот флаг после помещения регистра статуса в стек в ответ на любое прерывание или аппаратный сброс, возвращая процессор в двоичный арифметический режим. При выполнении инструкции read-modify-write (RMW), такой как INC addr, все варианты NMOS выполнят двойную запись в addr, сначала перезаписывая текущее значение в addr, а затем записывая измененное значение. Это поведение может привести к трудноустранимым ошибкам, если addr является аппаратным регистром. Это может произойти, если аппаратное обеспечение отслеживает изменения значения в регистре и затем выполняет действие – в этом случае оно выполнит два действия, одно с исходным значением, а затем снова с новым значением. 65C02 вместо этого выполняет двойное чтение addr, за которым следует одиночная запись. При выполнении адресуемой индексацией, если индексация пересекает границу страницы, все варианты NMOS сначала прочитают данные из неверного адреса, прежде чем получить доступ к правильному. Как и в случае с инструкцией RMW, это поведение может вызвать проблемы при доступе к аппаратным регистрам через индексацию. 65C02 исправил эту проблему, выполняя фиктивное чтение кода операции инструкции при пересечении границы страницы при индексации. Однако это исправление привело к новой ошибке, которая возникает, когда базовый адрес находится на четной границе страницы (что означает, что индексация никогда не пересечет следующую страницу). С новой ошибкой выполняется фиктивное чтение базового адреса перед индексацией, так что LDA $1200,X выполнит фиктивное чтение по адресу $1200 перед добавлением значения X. Опять же, если индексация выполняется по адресам аппаратных регистров, эта ошибка может привести к неопределенному поведению. Если NMOS 6502 получает код операции BRK (программное прерывание) одновременно с аппаратным прерыванием, BRK будет проигнорирован, поскольку процессор реагирует на аппаратное прерывание. 65C02 правильно обрабатывает эту ситуацию, обслуживая прерывание, а затем выполняя BRK.

Режимы с низкой мощностью

В дополнение к новым вышеуказанным командам, WDC также добавила инструкции STP и WAI для поддержки режимов пониженного энергопотребления. Инструкция STP останавливала процессор, прекращая всю обработку до тех пор, пока не будет выполнена аппаратная перезагрузка. Это можно было использовать для перевода системы в "сон" и последующего быстрого пробуждения с помощью перезагрузки. Обычно для этого требовалась внешняя система для поддержания оперативной памяти, и она не получила широкого распространения. Инструкция WAI имела аналогичный эффект, переводя в режим пониженного энергопотребления, но эта инструкция снова активировала процессор при получении прерывания. Ранее обработка прерывания обычно заключалась в запуске цикла для проверки наличия прерывания, что иногда называлось "ожиданием" (spinning), проверке его типа после получения и последующем переходе к коду обработки. Это означало, что процессор работал на протяжении всего процесса, даже когда прерывания не возникали. В отличие от этого, в 65C02 код прерывания можно было написать, поместив инструкцию WAI непосредственно перед инструкцией JMP или RTS к обработчику. При выполнении WAI обработка останавливалась, и процессор переходил в режим пониженного энергопотребления. При получении прерывания процессор немедленно обрабатывал прерывание и выполнял запрос. Это имело дополнительное преимущество – незначительное повышение производительности. В случае ожидания прерывание могло прийти в середине выполнения одной из инструкций цикла, и для обеспечения его перезапуска после возврата из обработчика процессору требовался один цикл для сохранения своего местоположения. С WAI процессор входит в состояние пониженного энергопотребления в известном месте, где гарантировано завершение всех инструкций, поэтому при поступлении прерывания оно не может прервать выполняемую инструкцию, и процессор может безопасно продолжить работу без траты цикла на сохранение состояния.

65СС02

65SC02 — это вариант WDC 65C02, из которого исключены битовые инструкции.