50 лет назад, 15 ноября 1971 года компания Intel представила процессор 4004. Трудно переоценить значимость этого события, именно с этой даты началась эра архитектуры x86, которую мы знаем и сегодня.
Поздравляю компанию Intel с этой знаменательной датой!
Далее будет немного истории, много теории, ещё больше практики и оригинальных фот.
MCS-4 MICRO COMPUTER SET
Особенности (из руководства пользователей)
4-битный ЦПУ с 45ю инструкциями
Десятичный и бинарный арифметические режимы
10.8 мкс на одну инструкцию
Сложение двух 8-значных чисел за 850 мкс
Шестнадцать 4-битных регистров общего назначения
3 уровня вложенности для подпрограмм
Набор инструкций включает условные ветвления, подпрограммы, косвенную адресацию
2-фазный тактовый сигнал
Синхронные операции с памятью
Прямая совместимость с 4001, 4002 и 4003
Не требует дополнительного интерфейса для памяти и портов ввода/вывода
Непосредственно:
4K на 8бит ПЗУ (16 микросхем 4001)
1280 на 4бит ОЗУ (16 микросхем 4002)
128 линий портов В/В (без применения 4003)
Неограниченное количество портов В/В (с применением 4003)
Расширение памяти путём переключения банков
Один источник питания (Vdd - минус 15 вольт)
16-выводный DIP корпус
Полупроводники с проводимостью P-типа
Минимальная система: ЦПУ и одна микросхема ПЗУ
На самом деле 50 лет назад был представлен не процессор 4004, а именно набор микросхем (chipset) с нехитрым названием MCS-4. А уже в этот набор входил процессор 4004.
Что же такое MCS-4? Всё очень просто, это три микросхемы объединённые общей 4-разрядной шиной: ЦПУ (CPU), ПЗУ (ROM) и ОЗУ (RAM). Практически как и сегодня система имеет три основных компонента. Так же в состав набора входит 10-разрядный сдвиговый регистр с последовательной загрузкой и параллельной выгрузкой, предназначенный для увеличения количества выходных портов. Вещь банальная и особого интереса не представляет. Все микросхемы выполнены в 16-выводных DIP корпусах. Эти 16выводные корпуса бываю 4х разных видов:
Белый керамический с позолоченными выводами и припаиваемой крышкой. Керамика у этих корпусов полупрозрачная и через неё видны проводники внутри микросхемы. Этот тип корпуса самый ранний, по этой причине очень ценится у коллекционеров. Продавцы на eBay называют такой корпус Gray Trace или Zebra, любые микросхемы в таких корпусах стоят дороже обычных. Сегодня цена на 4004 в хорошем состоянии в этом корпусе легко может доходить до 2000$ и более. Микросхемы с таким типом корпуса имеют префикс 'С', то есть процессор будет именоваться Intel C4004.
Белый керамический с позолоченными выводами и припаиваемой крышкой. Керамика не прозрачная. Микросхемы с таким типом корпуса так же имеют префикс 'С'.
Чёрный/темно-коричневый керамический, состоящий из двух половинок склеенных компаундом, выводы лужёные. Название микросхемы имеют префикс 'D'.
Цельный пластиковый корпус с лужёными выводами. Самый обыкновенный DIP16. Название микросхемы имеют префикс 'P'. Intel P4004 самый распространённый, и относительно не дорогой, сегодня можно купить по цене около 150$
Все микросхемы выполнены по P-канальной MOS технологии и требуют питания -15V. Как известно p-канальные полевые транзисторы открываются отрицательным напряжением, отсюда и минус 15 вольт. И да, логика инверсная, минус 15 вольт это логическая единица.
Помимо 4битной параллельной шины объединяющей три основные компонента системы ещё требуется два сигнала тактовой частоты (две фазы), сигнал синхронизации и сигнал сброса. Тактовую частоту и сброс формирует специальная микросхема - тактовый генератор 4201. Сигнал синхронизации формирует процессор. В итоге получается что ЦПУ, ПЗУ и ОЗУ соединены восемью сигналами (проводниками), не считая питания. И самая минимальная система будет состоять из трёх микросхем: процессор, ПЗУ и тактовый генератор.
В 1971 году Intel позиционировала MCS-4 как замену "жёсткой" логике и предлагала использовать эту систему (буквально) практически где угодно.
4004 применялся в различных устройств, калькуляторы, измерительные приборы, радиостанции. Правда буквально через несколько лет ему на смену пришёл 4040, а затем и 8008, поэтому встретить 4004 в реальном устройстве непросто.
Итак, набор микросхем MCS-4 включает в себя:
Центральный процессор -CPU - 4004
Память программ -ROM - 4001
Оперативная память -RAM - 4002
Сдвиговый регистр -SR - 4003
Всё вместе объединяется в такую систему:
4004
С точки зрения программиста ЦПУ содержит: 4-битный регистр аккумулятор, 16 4-битных индексных регистров которые организованы в восемь регистровых пар, четыре 12-битных счётчика команд(позволяет организовать до 3х уровней вложенности для подпрограмм).
Выводы 1-4 - двунаправленная шина адреса/данных с временным мультиплексированием. 5 - GND - общий (0V), 6-7 - входы тактового сигнала, 8 - выход синхронизации, 9 - вход сброса, 10 - вход сигнала TEST(может быть использован в инструкции ветвления JCN), 11 - CM-ROM - выход выбора ПЗУ, 12 - Vdd - питание минус 15 вольт. 13-16 - CM-RAM - выходные сигналы выбора банка ОЗУ
Частота тактовых импульсов равна 740-750 кГц, однако из-за того что машинный цикл у 4004 занимает 8 тактов, то частота выполнения инструкций будет 740/8 = 92.5 кГц. Простые инструкции процессора имеют длину 1 байт, сложные инструкции вроде условных переходов имеют длину 2 байта и следовательно будут выполнятся не за 8, а за 16 тактовых импульсов. То есть в реальности производительность будет ещё меньше чем 92.5 тыс. операций в секунду. Словом не густо.
Имеются следующие инструкции:
16 машинных инструкций (5 из которых двойной длинны)
14 инструкций для работы с аккумулятором
15 инструкций ввода/вывода
4001
Микросхема масочного ПЗУ (ROM). Да да масочное ПЗУ, то есть однократно программируется на заводе, даже не программируется, а создаётся уже запрограммированным. Если вы хотели использовать MCS-4 в составе своего устройства то микросхемы ПЗУ нужно было заказывать у Intel. Происходило это примерно так. Текст программы в бинарном виде на бумажке или на перфокарте вкладывался в конверт вместе с чеком и отправлялся в Санта Kлару, в ответ Intel присылал запрограммированные микросхемы. :))
Позже появилась простая возможность использовать микросхемы EPROM с ультрафиолетовым стиранием.
Каждая микросхема 4001 имела объём 256 байт. Так как в 4004 используется 12-битная адресация памяти программ, то максимум программа может иметь объём 4 кБайта. Что подразумевает возможность подключения до 4096/256 = 16 микросхем 4001. Каждая из 16 микросхем должна иметь свой идентификатор от 0 до 15 (metal option).
Так же каждая микросхема 4001 имеет 4 порта ввода/вывод которые однозначно конструируются (вход это или выход) на той бумажке которая отсылалась в Intel (дополнительная информация помимо кода программы). То есть это не программная конфигурация выводов, а аппаратная и изменить потом нельзя.
4002
Микросхема ОЗУ содержит 4 банка по 20 4-битных слов, то есть 40 байт.
Так же есть 4 линии выходного порта, никак не конфигурируемые, на вход они работать не могут.
Любопытно что есть два типа микросхем 4002 ОЗУ, это 4002-1 и 4002-2, они так и маркируются:
Сделано это для того чтобы совместно с сигналом P0 (10й вывод, аппаратный выбор кристалла) получить возможность адресовать до 4х микросхем в одном банке памяти.
4003
Сдвиговый регистр. кроме питания -15V ничего примечательного, не совсем понятно почему Intel включила эту микросхему в набор.
4201
Тактовый генератор. Формирует два тактовых сигнала сдвинутых по фазе. Требуется кварцевый резонатор на ~5.125МГц Причём эти два сигнала можно получить в виде как TTL (0-5V) так и MOS(0- -15V).
Так же микросхема имеет "повторитель" сигнала сброс и схему позволяющую исполнять программу по шагам (актуально только для процессора 4040).
Справедливости ради надо сказать что микросхема 4201 появилась несколько позже чем MCS-4 и разрабатывалась как я понял для 4040, но с успехом применялась вместе с 4004. В ранних схемах использовался генератор на триггерах и прочей "рассыпухе"
4008/4009
Разумеется отсылать перфокарты в Intel для получения масочных ПЗУ было не удобно и вскоре появились ещё две микросхемы позволяющие вместо 4001 использовать микросхемы EPROM с ультрафиолетовым стиранием.
Первые EPROM были разработаны Intel примерно в это же время, имели названия С1601, С1602, С1701 и более известные С1702. Несколько позже был прыжок к EPROM 27серии.
4008 отвечает за шину адреса, а 4009 за шину данных тем самым реализуют стандартный параллельный интерфейс к памяти. Подключение же 4008/4009 к процессору 4004 осуществляется по всё той же 4-битной шине.
Если вдруг кто не знает, то EPROM это память которую можно записать с помощью электричества. Стирается же такая память путём облучения кристалла жёстким ультрафиолетовым излучением (осторожно опасно для глаз и прочего). На фото чуть выше виден сам кристалл под прозрачным стеклом который облучают УФ для стирания. Запись таких EPROM тоже не простая затея, мало того что требуется питание -15В для чтения, так для записи требуется минус 48В.
С аппаратной частью с большего всё.
ПО
Сегодня у каждого в кармане смартфон, а дома компьютер, в обоих устройствах установлен 64 разрядный процессор хоть и с разными архитектурами. Если упростить, то разрядность процессора определяет максимальную длину чисел с которыми он может работать. Для 64 разрядных процессоров это максимальное число равно 2^64 -1 = 18446744073709551615 (2 в степени 64 минус 1, минус 1 т.к. счет начинается с нуля). К чему это я.. А к тому что в основе процессора Intel 4004 лежит архитектура MCS-4, и четвёрочка в названии - это разрядность микроархитектуры. И максимальное число с которым может работать процессор 2^4 - 1 = 15. Да, всего лишь от 0 до 15, и это больно, думаю уже тогда, 50 лет назад программисты ощущали эту боль. К тому же времена были тогда суровые, компьютеров и тем более смартфонов не было, вернее как, компьютеры конечно были, уже как никак Аполлон на Луну слетал, но были эти компьютеры странные и были они не у всех. Тем не менее как-то люди умудрялись разрабатывать электронику и в частности с применением MCS-4. Честно не знаю как :)
Если вы писали когда-нибудь программу на ассемблере, то и с написанием программ для 4004 не должно быть больших сложностей. Да, сильно доставляет неудобства отсутствие инструкций для битовых операций, отсутствие косвенной адресации для ОЗУ, невозможность условных переходов дальше чем 256 байт. Так же нет команд деления, умножения, сравнения и много чего ещё.
То есть если вы к примеру надумали выстрелить себе в ногу, то у вас не то что пистолета и патронов нет, у вас и ноги то нет, и вообще вы ещё не родились и ваши родители тоже :)
Я думаю что сложности программной части оправдывались простотой аппаратной.
Вот так выглядит запись 4 бит информации из регистра R1 в оперативную память:
LDM $0 ; Загрузить в Аккумулятор число 0
DCL ; Выбор банка оперативной памяти,
; номер банка в Аккумуляторе. Set CM-RAM0
FIM P0, $80 ; Загрузить в регистровую пару P0 число 0x80
SRC P0 ; Выбрать микросхему 4002-2 у которой вывод P0
; подключен к земле. Это всё для банка CM-RAM0
LD R1 ; Загрузить содержимое регистра R1 в Аккумулятор
WRM ; Записать содержимое Аккумулятора в ОЗУ,
; Причем адрес ячейки памяти в микросхеме определяется
; 6ю младшими битами числа которое мы загрузили в P0
Короче если есть непреодолимое желание написать свою программу для 4004 то всё довольно просто, через несколько часов попыток что-то написать вы уже наизусть запомните весь список инструкций, дальше всё ещё проще :)
Документация
Документация на MCS-4 просто божественная, умели же раньше писать. Чувствуется что подбирали каждое слово, всё просто и понятно.
На MCS-4 существует следующая документация:
MCS-4 Datasheet
MCS-4 Microcomputer Set Users Manual
MCS-4 Assembly Language Programming Manual
В сети есть сканы этих документов, кому интересно найдёт без проблем. У меня же есть ранняя версия руководства пользователей которую я не нашёл в сети, возможно будет интересно...
вот несколько фот:
То ради чего всё затевалось (ну почти)
Почему ну почти? Потому что затевалось конечное устройство, а показывать пришлось прототип не доделанный до конца.
Внимательный читатель заметил что вверху, на плате зияют пустые места, это места для установки EPROM Intel C1702. Но с ними получилась немного неожиданная проблема, я не смог найти готовый программатор чтобы записать в них прошивку. Изначально я был настроен на готовый покупной программатор для того чтобы не тратить время на его разработку изготовление и отладку. Я даже купил такой программатор год назад. Но оказалось что у программатора не хватает специального адаптера. Бросил затею с покупным, - разработал свой и уже получил платы. Но увы до 15 ноября мне никак было не успеть всё закончить, а статью опубликовать хотелось, не каждый день 50летний юбилей всё таки. Поэтому, сорри, как есть... Возможно, будет ещё одна статья немного позже когда я всё закончу.
По проекту... STM32)) после включения переписывает прошивку (микропрограмму для 4004) из своей флеш памяти во внешнее ОЗУ (фиолетовая микросхема справа) и передаёт управление процессору 4004, тот начинает исполнять код из этого ОЗУ. Ну то есть микросхемы EPROM заменены на одну микросхему ОЗУ. Это было сделано для быстрой смены прошивки при отладке.
Производительности у 4004 с гулькин нос и программную динамическую индикацию для двух индикаторов HDSP-2000 он не осилит ну никак. Поэтому был реализован полноценный драйвер для этих индикаторов с двумя страницами видеопамяти. 4004 просто записывает в видеопамять то что нужно отобразить и переключает страницу видеопамяти. Всё как в настоящем компьютере :)
Огромное спасибо тем кто помогал мне раздобыть микросхемы! А добывались они в самых неожиданных местах, реально по всему земному шару.
Отдельное спасибо господину Herb Johnson за разработку офлайн кросс-ассемблера. Вот его сайт. Немного не хватает макросов, но в целом очень достойная вещь.
Все фото и видеоматериалы сняты автором статьи, перепечатка без разрешения автора не только не карается, но и приветствуется самим автором, то есть мной! :)
Спасибо всем кто дочитал до конца.