Введение
8-битный микропроцессор SC/MP (произносится как scamp) от National Semiconductor, расшифровывающийся как Simple Cost-effective Micro Processor (простой и экономичный микропроцессор), является одним из первых 8-битных микропроцессоров, поступившим в продажу в апреле 1976 года. Он был разработан для реализации систем с минимальным количеством дополнительных поддерживающих микросхем. SC/MP включал в себя последовательно соединенный вывод управления, позволявший до трех микропроцессоров SC/MP совместно использовать одну основную память для создания многопроцессорной системы или выступать в качестве контроллеров в системе с другим центральным процессором (CPU). За время производства было выпущено три версии: SCMP 1, 2 и 3, две последние также известные как INS8060 и INS8070. Для снижения стоимости в системе использовался последовательный арифметико-логический блок (АЛУ), что делало его значительно медленнее по сравнению с современными разработками, такими как Intel 8080 или MOS 6502, которые использовали параллельные АЛУ. Особенностью также было то, что счетчик команд мог обращаться только к младшим 12 битам 16-битного адреса, а старшие 4 бита необходимо было устанавливать с помощью специальных инструкций. В результате инструкции обращались к основной памяти как к шестнадцати 4 кБ "страницам", а доступ к памяти за пределами этих страниц требовал нескольких инструкций. Сочетание низкой скорости и страничной памяти ограничило его привлекательность за пределами встраиваемых систем, для которых он был предназначен, где он конкурировал с Fairchild F8, который обладал рядом полезных дополнительных функций. Система получила относительно небольшое распространение.
National Semiconductor's SC/MP (pronounced scamp) for Simple Cost effective Micro Processor, is an early 8 bit microprocessor which became available in April 1976. It was designed to allow systems to be implemented with the minimum number of additional support chips. SC/MP included a daisy chained control pin that allowed up to three SC/MP's share a single main memory to produce a multiprocessor system, or to act as controllers in a system with another main central processing unit (CPU). Three versions were released over its lifetime, SCMP 1 through 3, the latter two also known as INS8060 and INS8070. To lower cost, the system used a bit serial arithmetic logic unit (ALU) and was thus significantly slower than contemporary designs like the Intel 8080 or MOS 6502 which had parallel ALUs. Another oddity was that the program counter could only access the lower 12 bits of the 16 bit address, and the upper 4 bits had to be set using special instructions. The result was that instructions accessed main memory as sixteen 4 kB "pages" and reaching memory outside those pages required multiple instructions. The combination of slow speed and paged memory limited its attractiveness outside the embedded markets it was aimed at, and in this market it competed against the Fairchild F8 which had a number of useful additional features. The system saw relatively little use.
ALU и основные реестры
Арифметическое логическое устройство (ALU) было построено на основе аккумулятора, с единственным 8-битным аккумулятором, AC. Второй 8-битный регистр, "Extension", или E, мог использоваться как резервный для AC. Большинство инструкций не имели прямого доступа к E; например, нельзя было загружать данные из памяти непосредственно в E. Вместо этого значение в AC можно было прочитать из E, или AC и E можно было поменять местами. E также мог использоваться как исходное значение для семи логических/арифметических операций, поддерживаемых ALU. Если E не использовался для других операций, его можно было использовать аналогично зеркальным регистрам, как в конструкциях, например, Zilog Z80, где E служил быстрым способом сохранения значения AC во время прерывания. Основное назначение E заключалось в том, чтобы служить буфером для встроенной последовательной системы ввода-вывода. Она управлялась инструкцией SIO, которая сдвигала наименее значащий бит из E в защелку, подключенную к выводу SOUT процессора. Многократные вызовы SIO, таким образом, последовательно передавали биты 8-битного значения E на выход, или выполняли обратную операцию для чтения с вывода SIN. После того, как полное 8-битное значение было прочитано или записано, оно могло быть отправлено в память путем обмена значениями с A, а затем загрузки или сохранения A в память. E также мог использоваться как источник для логических операций над AC, например, можно было прочитать байт статуса из последовательного порта, а затем выполнить логическое И с этим значением и маской в AC, чтобы проверить различные биты статуса, полученные с внешнего устройства. Отдельный регистр статуса состоял из 8 бит. Три младших бита, от 0 до 2, были напрямую подключены к выводам, обеспечивая простой способ проверки статуса внешнего устройства. Два дополнительных вывода, Sense A и B, были подключены к битам 4 и 5. Sense A обычно использовался для обработки прерываний (см. подробности ниже). Прерывания можно было отключить, установив бит 3, Interrupt Enable (IE), в 0 с помощью инструкции Disable Interrupt, DINT, и включить с помощью IEN, или перемещая значение в A и из A и манипулируя им там. Биты 6 и 7 были стандартными флагами переполнения и переноса, как в большинстве процессоров.
Адресационные и индексные регистры
Как и большинство 8-битных микропроцессоров той эпохи, SC/MP основан на 16-битной адресной шине и 8-битной шине данных. Для уменьшения количества выводов внешняя адресная шина содержит только 12 выводов, используя 4 вывода от шины данных для формирования полноценной 16-битной адресной шины. Внутренне, счетчик команд имеет ширину в двенадцать бит, и существуют отдельные инструкции для установки старших четырех бит путем копирования 8-битного значения в старший байт. Это обеспечивает карту памяти, состоящую из шестнадцати страниц по четыре килобайта каждая, и программный код не мог обращаться к коду, непосредственным данным или данным, относительно счетчика команд, находящимся за пределами своей страницы. Таким образом, память организована в виде 16 страниц по 4 кБ каждая. Это привело к особенности конструкции: когда счетчик команд достигает конца страницы, он не переходит на следующую страницу, а возвращается к началу текущей страницы. Это было дополнительно ограничено двухбайтовым форматом инструкций, который использовал один байт для кода операции и второй байт для указания смещения в диапазоне от -128 до +127, которое добавлялось к значению в регистрах процессора для получения полного 16-битного адреса. Например, адрес мог указывать на местоположение в памяти, указывая, что оно находится на +10 позиций от значения в счетчике команд или на +10 позиций от значения в одном из 16-битных индексных регистров. Для доступа к местоположению за пределами этого диапазона адрес необходимо было сохранить в одном из индексных регистров, а затем установить смещение в ноль. Поскольку регистры имеют 16-битную разрядность, а аккумулятор, загружающий значения, имеет 8-битную разрядность, для установки полного адреса требовалось несколько инструкций. Поскольку индексы были критически важны для модели адресации, SC/MP включал четыре индексных регистра, "регистры указателей" PR0 – PR3. PR0 являлся счетчиком команд и обычно не изменялся пользовательскими программами. По соглашению, PR1 обычно использовался как указатель на ПЗУ, PR2 – на ОЗУ, а PR3 – для хранения адреса во время прерываний и вызовов подпрограмм. SC/MP не имел стека, где обычно хранились возвращаемые значения в большинстве современных конструкций. Программы должны были сохранять адреса возврата с помощью явного кода. Существовало четыре основных режима адресации: относительный счетчику команд, индексный, непосредственный (то есть константа во втором байте инструкции, а не смещение) и автоинкрементный. Относительная адресация относительно счетчика команд фактически была идентична индексной, выбирая PR0 в качестве индексного регистра. Автоинкрементная адресация используется для упрощения построения циклов. Если смещение меньше нуля, содержимое регистра указателя уменьшается на смещение перед выборкой или сохранением содержимого эффективного адреса. Если смещение равно или больше нуля, содержимое регистра указателя используется в качестве эффективного адреса, а содержимое регистра указателя увеличивается на смещение после выборки или сохранения содержимого эффективного адреса. Это устраняет необходимость в отдельной инструкции для изменения значения в регистре, поэтому можно было сохранить начальное значение блока данных в памяти в регистре указателя, а затем перебрать все данные, вызвав одну инструкцию. Если смещение отрицательное, выполняется декремент перед доступом к конечному значению, если оно положительное – пост-инкремент.
Перерыв в обработке
Система обеспечивает автоматическую обработку прерываний по линии Sense A. Когда поступает прерывание и IE установлен в высокое состояние (включено), перед началом выборки следующей инструкции система сначала сбрасывает IE, чтобы предотвратить повторное прерывание, а затем меняет местами значения в PC и PS3. Это позволяет сохранить адрес возврата в PR3 и передать управление следующей инструкции в точку входа обработчика прерываний, предварительно сохраненную в PR3. Система не содержит эквивалента команды возврата из прерывания. Возврат можно выполнить с помощью другой команды XPPC, скопировав ранее сохраненный адрес из PR3 обратно в PC, и выполнение продолжится с места остановки. Однако это приведет к тому, что в PR3 будет находиться неверный адрес – не начало обработчика прерываний, а его конец. Для решения этой проблемы обычно размещают команду XPPC, возвращающую управление в основной код, на одну инструкцию выше точки входа обработчика, а не в конце. Когда обработчик завершает работу, он переходит к этой инструкции, поэтому при вызове XPPC PC указывает на место, предшествующее правильной точке входа. Поскольку система инкрементирует PC перед выполнением инструкции, следующее прерывание приведет к входу в обработчик в правильной точке входа. Этот "выходной обработчик" обычно также устанавливает IE в 1, чтобы снова разрешить прерывания.
Управление шиной
Особенностью SC/MP была общая последовательно соединенная линия управления, позволявшая нескольким SC/MP или, чаще, одному SC/MP и связанным с ним контроллерам прямого доступа к памяти (DMA) совместно использовать доступ к единой основной памяти. Когда любой из чипов на шине запрашивал доступ к памяти, он устанавливал сигнал на пине ENOUT в высокое состояние, тем самым сообщая пинам ENIN других чипов о необходимости освободить шину. В большинстве других процессоров для этого обычно требовалась внешняя логика, реализованная разработчиками платы, чтобы приостановить работу процессора с той же целью, часто со значительной сложностью из-за внутренней синхронизации инструкций, недоступной для внешних схем. В SC/MP все это было реализовано внутри, поэтому для реализации данной функции требовалась всего одна линия на печатной плате. Изначальная идея заключалась в упрощении создания микроконтроллерных приложений, включающих SC/MP, один или несколько контроллеров DMA и единую общую память. Разработанный с акцентом на минимальную стоимость всей системы, стремление снизить стоимость самого SC/MP также повлияло на выбор последовательной арифметико-логической единицы (АЛУ) и включение последовательных линий ввода/вывода для устранения необходимости в отдельном UART (эта функция была исключена в более поздней версии SC/MP III). В своем обзоре системы Осборн назвал его "микропроцессором выбора для любых многопроцессорных приложений", однако этот рынок оказался ограниченным, поскольку продажи не были особенно высокими.
Необычные особенности
SC/MP не имел инструкции перехода к подпрограмме. Вместо этого, язык ассемблера включал макрос JS, который генерировал последовательность инструкций для реализации этой функции. Макрос загружал старший байт адреса в AC, а затем вызывал XPAH для перемещения его в старший байт выбранного регистр-указателя. Затем он повторял эту операцию для младшего байта, используя XPAL. После этого вызывался XPPC для передачи полученного 16-битного значения из PR в PC. Поскольку XPPC меняет местами два значения, текущее значение PC таким образом сохраняется в выбранном PR, а возврат из подпрограммы может быть реализован одним XPPC для копирования значения обратно. SC/MP инкрементирует счетчик программ при выборке инструкции, поэтому после сброса он фактически начинает выполнять инструкции с адреса 0001. Это также необходимо учитывать при вычислении смещений, поскольку смещение будет добавлено к счетчику программ, который в этот момент все еще будет указывать на адрес самого смещения, а не на следующую инструкцию. Система включала инструкцию задержки DLY, которая принимала один параметр P. Она останавливала работу на период времени, равный 13 + (2 x P) + (2^9 x P) + (2 x AC) микроциклов, непрерывно уменьшая значение в AC до нуля. Это позволяло создавать задержку от 13 до 131 593 циклов. Обычно это использовалось с последовательными портами; программа могла установить значение в AC равным времени, необходимому для передачи одного бита с заданной скоростью, а затем проверить состояние одного из флагов, чтобы определить готовность к передаче следующего бита. Процессор не был особенно чувствителен к синхронизации, и в приложениях с низкой скоростью не требовал использования кварцевого генератора, который можно было заменить на простой конденсатор.
Применение
SC/MP также использовался в качестве основы одноплатного микроконтроллера, разработанного компанией Science of Cambridge (позже Sinclair Research Ltd) под названием MK14. Компания Montgomery Elevator Co из Молина, штат Иллинойс (позже приобретенная компанией KONE, Inc) использовала SC/MP в качестве основы для своего первого контроллера лифта на базе микропроцессора, представленного в 1975 году. Многие из этих устройств до сих пор работают в зданиях по всей территории США.