General Instrument CP1600


CP1600 – 16 битный микропроцессор, созданный в середине 1970-х годов совместно компаниями General Instrument и Honeywell. Микропроцессор CP1600 был спроектирован на основе архитектуры мини-компьютера PDP-11, также использовавшейся в основе микропроцессора MCP-1600 компании Western Digital и повлиявшей на многие другие разработки. Компания Honeywell использовала CP1600 в ряде компьютеров для управления технологическими процессами и взаимосвязанных систем, но наибольшее распространение получила версия CP1610, использовавшаяся в игровой приставке Intellivision.

Система команд CP1600 почти полностью повторяет систему команд PDP-11, но не совместима с ней на уровне кодов операций и имеет отличия в видах адресации. Для кодов операций используются только младшие 10 бит, старшие 6 помечены как «Зарезервированные для дальнейшего расширения». С другой стороны, при проектировании систем это позволяло сократить объем ПЗУ. Предположительно, зарезервированные 6 бит были предназначены для использования сопроцессорами. Длина команд составляет от одного до трех машинных слов, в зависимости от вида адресации. В отличие от других процессоров с такой же архитектурой, CP1600 не поддерживает пересылки данных «память-память» с использованием косвенной адресации (смещений), кроме того, команды условных переходов используют 16-битные смещения вместо 8-битных, что позволяет, в случае длинных переходов, избежать использования дополнительных команд безусловного перехода.

Как и PDP-11, CP1600 использует восемь 16-битных регистров общего назначения, хотя в системе команд эти регистры не являются полностью эквивалентными. Регистр R0 не может быть использован для косвенного доступа к памяти. Регистры R1 – R3 могут использоваться для косвенного доступа к памяти, но не поддерживают автоинкремент. Регистры R4 и R5 всегда автоинкрементируются после косвенного доступа к памяти[1].

Регистр R6 используется как указатель стека, регистр R7 является счетчиком команд. Поскольку оба регистра программно доступны программисту, возможно реализовать несколько стеков или усложненную логику переходов. В явном виде команды для обращения к стеку отсутствуют, регистр R6 автодекрементируется перед использованием его для косвенного чтения данных из памяти, что имитирует команду POP и автоинкрементируется после использования его для косвенной записи данных в память, что имитирует команду PUSH.