Как я APPLE ][ на транзисторах собирал
В прошлой статье, я рассказал о том, как работает компьютер, а именно поделился опытом сборки компьютера из логических элементов, таких как NOT, AND, OR, XOR, NOR, NAND и XNOR, которые в свою очередь собраны из транзисторов. Изначально идея была показать, что компьютер работает просто на сигналах, что если мы с вами видим, скажем текст на экране, например, этот, который вы читаете, то для компьютера это просто очень большое число сигналов, которые пролетели через него за одну секунду. Что компьютер не знает, что такое буквы, картинки, звук, интернет, и он не знает, что такое смыслы и так далее, это просто сигналы которые за счет устройства логических элементов протекают по определенному пути ровно так как это задал автор и ни как иначе.
Но тот компьютер оказался не совсем тем, который мне хотелось получить. Кроме того процесс оказался на столько увлекательным, что остановиться просто не возможно. Это как собирать LEGO, только виртуальный.
Главные недостатки того компьютера это несовместимость ни с чем, изначально я брал за основу процессор mos6502, но делал я все это в первый раз и собрал в итоге процессор, но не совместимый на программном уровне. А значит, запустить программы написанные для тогоже APPLE ][ я не смогу.
Поэтому я решил собрать Macintosh Classic на M68000, и у меня это не получилось, после 3 попыток я сдавался. Каждый раз я спотыкался на том, что для обработки команд процессора надо собрать огромный узел логической обработки сигнала и потом интегрировать его в существующую цепь, да так, чтобы не сломать ничего. и вот это и не получалось.
По этому я сделал паузу и решил собрать, что-то попроще, но до конца и чтобы работало. И после раздумий, я выбрал mos6502, тот самый с которого все началось, но на этот раз я решил делать его совместимым, чтобы он выполнял код для этого процессора, и чтобы я мог собрать компьютер на этом процессоре, который сможет выполнить код написанный для APPLE ][+.
Небольшой дисклеймер. Я не являюсь электротехником, специалистом по процессорам, схемам и т.д., я даже паяльник держать умею чисто теоретически, все, что я делаю - делаю для себя в образовательных (для себя) целях.
mos6502
Учитывая свой опыт, я решил сначала все спланировать, что я хочу собрать, как я буду собирать, как проверять, что это совместимо и т.д.

По этому я пошел изучать, что это за процессор. И главное, что я узнал, это то, что у процессора 151 операционных кодов и 56 инструкций, мой первоначальный процессор был сильно меньше. Но 151 операционных кодов это очень большая сборка, но в разы меньше, чем у M68000.
Так же выяснил, что современные процессоры решают задачу описания опкодов с помощью ROM микрокода, но у mos6502 его не было, но именно это позволило бы мне упростить саму сборку, и я выбираю использовать ROM микрокода.
Дальше процесс был в целом понятным и описан в куче статей, показан в куче видео роликах на ютубе и так далее. Нужно собрать огромное число примитивов. Так как я использую симулятор цепей, то создается примитив, и потом просто используется в других частях, что весьма удобно.
Вот так выглядит логический элемент NOT собранный из транзисторов.

Для сборки процессора надо собрать основные блоки. Такие как описанные всеми ALU - основной блок, который умеет складывать, вычитать, совершать битовые сдвиги (для умножения на 2 и деления на 2), и совершать логические операции NOT, OR, AND, XOR.
Так же процессору нужны флаги, специальные сигналы, которые говорят о том, что произошли те или иные события в результате прохождения сигнала через процессор. Они хранятся в отдельной памяти (регистре) процессора и хранят информацию о последней операции, такую как, получился ли в результате операции ноль, или произошло переполнение, отрицательное число и так далее.
Также, процессору нужно где-то хранить информацию о том, с чем он работает, например, он складывает 2 числа, эти два числа должны где-то храниться, результат сложения тоже должен храниться. А еще нужен стек, опять же место для временного хранения адресов, информации и т.д. для реализации различных конструкция при программировании, например, процедур.
Все это — регистры. В моей реализации получилось вот так:

9 регистров, часть из них нужны для внутренней реализации работы процессора на транзисторах в моей схеме, а она все-таки отличается от оригинала, и собираю я совместимый с mos6502, а не точную его копию.
Также процессору нужно понимать, откуда брать данные для выполнения команд, например, он может брать данные из регистров, а может из памяти. Результат выполнения команды также может быть отправлен также в регистр, а может в память, все это надо учесть.
Для выполнения программ, процессор должен понимать, при этом команды могут иметь 1 операнд или не иметь вовсе.
LDA #$05 ; Загрузить число 5 в аккумулятор A
CLC ; 1. Очистить флаг переноса
ADC $1000 ; 2. Сложить значение в аккумуляторе A с числом из ячейки памяти $1000
; Результат автоматически сохранится обратно в аккумулятор A
При работе процессора все это необходимо было помнить, кстати у M68000 это устроено иначе и там команды могли иметь разное число операндов и это нужно было обрабатывать. В общем для всего этого тоже надо закладывать логику.
Кроме этого нужно собрать счетчик команд, который определяет адрес памяти, в котором находится следующая для выполнения команда процессора. Как вы понимаете, процессор устроен несколько сложнее, чем описано в книге Петсольда и в большинстве роликов про то, как собрать компьютер из транзисторов, которые на самом деле, в лучшем случае, рассказывают, как собрать сумматор.

Так выглядит моя сборка процессора mos6502 из логических элементов. На сборку такого процессора ушло прилично времени, но для ускорения работы использовался по максимуму функционал симулятора цепей, как клонирование элементов с автоподбором меток, автосцепка меток с пинам чипов и т.д. Еще очень сильно помогала опция автоматического поиска коротких замыканий, это когда я случайно коротил 2 метки друг на друга, а также поиск дублей, например, я уже собрал где-то AND(A,B) = C, а тут мне понадобился AND(A,B)=D и сразу видно, что можно вместо D использовать С – удобно.

Проверка процессора
Проверка процессора происходила с помощью агента. А именно был взят проект Клаус Дорманн, который подготовил фактически набор тестов для того, чтобы убедиться, что моя сборка выполняет команды точно также, как настоящий процессор mos6502. Агент получал транзисторную схему на выход и прогонял тесты по схеме Дорманна. В итоге я убеждался, что моя сборка корректная.
APPLE ][+
После того, как был собран и протестирован процессор, нужно собрать компьютер на его основе.
Так как мой выбор пал на APPLE ][+ то надо его собрать, процессор у нас уже есть, что нам нужно? Память, устройство ввода и устройства вывода, а также способ все это соединить вместе.
И тут я понимаю, что сильно упрощаю процесс, о чем я расскажу в конце, но в симуляторе цепей есть готовые примитивы: RAM/ROM, клавиатура, монитор и дисковод. Собственно это все, что нужно для того, чтобы собрать компьютер.
Не могу назвать это полноценной и честной сборкой компьютера на транзисторах, один только контроллер apple disk II чего стоит, но в будущем я задумал и его повторить, если будет время и желание, но в рамках этого проекта, я использовал готовый примитив.
В целом в симуляторе есть возможность собрать и монитор и клавиатуру и диск самому из транзисторов, но это отдельная большая работа, а мне не терпелось проверить работу процессора - запустив программу от apple 2.
Размещаем на холсте наши объекты.

На картинке, если что, уже полностью собранный компьютер, сразу после выключения (симулятор не очищает экран дисплея после отключения, виртуальный все-таки).
Над дисководом расположена группа, которая названа Matherboard - собственно эта вся обвязка данного компьютера, она содержит процессор, RAM, ROM, Language Card (карта расширения памяти, для хранения в ней интерпретатора, например, языка бейсик), и собственно логика, которая определяет откуда пойдет сигнал с данными в процессор из памяти, из ROM, из LC или из диска.

Программы
После того как я собрал компьютер, его надо проверить и запустить программы. Что я тестировал? В первую очередь полноценный applesoft basic, затем visicalc — первые электронные таблицы и игру elite, почему то люди в моем FB просили именно ее, ну после DOOM конечно. Сборок DOOM для APPLE ][+ я не нашел, по этому elite.

Бейсик работает идеально, в целом я тестировал и графические программы, и издающие звук и работающие с текстом. В целом все работает так, как и ожидалось.
Немного переживал за графический режим, так как не знал, на сколько хорошо реализован примитив монитора, который работает напрямую с памятью компьютера.
Далее была проверка запуска программ с дисков, симулятор поддерживает только один вид образов .dsk по этому находим образ с visicalc и запускаем его.

Как видно все работает, и даже было как то приятно прикоснуться к продукту, который открыл врата в мир электронных таблиц и в целом BI.
Что меня поразило в VisiCalc, так это продуманность, в программе 1978 года была реализована работа с функциями, формулами, разделением документа на области, и много чего еще, в целом большинству из вас хватит даже той ограниченной памяти, которая имелась для работы в этой программе.
Последним примером будет игра Elite, которая в свое время также стала революцией, которая показала во-первых игры с 3D графикой, во-вторых большие и открытие миры. Для своего времени организация межгалактической торговли и войны с пиратами, да еще и во время выхода звездных войн — это ли не романтика.

Может моя сборка и не 100% повторяет APPLE ][+ и mos6502, но я постарался максимально близко подойти к ней.
Скорость
Теперь немного про скорость и про примитивы. В симуляторе, который я использовал есть 3 режима работы, Real когда сигнал проходит через каждый транзистор схемы. Fast когда сигнал идет то логических блоков, для которых заранее известна таблица истинности, если она известна, то внутрь не заходим и просто используем таблицу.

Но ни один из этих режимов не позволит комфортно работать с программами на APPLE ][. Слишком все медленно. По этому есть третий режим Turbo, который делиться на еще на 4 подтипа: 1×/5×/30×/MAX которые вообще не проходят внутрь чипов, а используют заранее просчитанную модель процессора.
Выглядит это так, собирается процессор, запускается скрипт, который "запекает" процессор и логику его работы, в итоге получается программный симулятор процессора, он знает, что на схеме есть чип памяти и как он распределен по адресам, где расположена память экрана, куда попадают нажатые клавиши и т.д.
Этот режим уже позволяет пользоваться компьютером, но это программная симуляция текущей сборки.
Программируемый калькулятор
Поняв, что Turbo это не совсем честная сборка на транзисторах, я решил собрать, что-то, что использует минимум готовых примитивов, и не использует режим Turbo вообще — программируемый калькулятор.
Это текущий проект, по этому по нему совсем мало будет информации, оставайтесь на связи, как говориться.
Главное, что в этом проекте нет ни клавиатуры, ни дисплея. Вместо них набор кнопок, и экран как точечная матрица, хочешь нажать клавишу - создай обработку сигнала, определение кода кнопки и обработку ее. Хочешь вывести символ на экран, нарисуй в памяти глиф, затем рассчитай конкретную позицию точек символа в строке и выведи символ.
И главное все это только на чистом транзисторном уровне.

Убедиться самому
Ну и главное, вы можете сами посмотреть как все это работает, переходите в симулятор: https://cs.khanin.info/ нажимайте кнопку Demo и выбирайте одну из 2 сборок 6502k мой первый компьютер или APPLE ][+.
Практические методы юнит-экономики и финмоделирования
50€/год
менее 1€ в неделю · оплата раз в годА ещё: выбор темы оформления, настройка шрифта, печать статей и увеличение изображений.
Для доступа к материалам оформите подписку.
Если вы уже клиент, то просто входите.
* – оплата через Boosty позволяет оплачивать картами Мир, оплата через Stripe для международных карт Visa, Mastercard и т.д.
мы не храним ваш email, а только зашифрованный hash, что повышает безопасность вашей почты.