[Из песочницы] Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он?

Все, наверное, знают, что в песочнице Minecraft можно делать абсолютно всё. Различные цифровые схемы и процессоры создают в Minecaft уже с давних пор. Но тот процессор, о котором я пишу, на самом деле уникален! Его название — DjCPU8.f2f9b9b413644ca4b480a4a678884a1a.png

Почему он уникален? По многим причинам. Давайте по порядку:

1) Скорость работы. Это пока самый быстрый процессор такого уровня в Minecraft. Одна инструкция выполняется примерно 1 секунду.2) Количество памяти. Оперативной памяти аж 256 байт. Не знаю других ЭВМ с таким объемом памяти.3) Вычислительные способности. 42 инструкции. Работает с арифметикой, логикой, стеком, вводом/выводом, регистрами и т.д. 4) Ассемблер. В других процессорах нужно вводить программу в двоичном виде. Но в DjCPU8 можно вводить ее текстом.5) Простота. Ни с какой другой ЭВМ невозможно так просто и приятно работать.6) Широта применения. Порты ввода/вывода можно создавать в любом месте.deb70ccbc02245bb9e443ff115bd3894.jpg

Характеристики процессора DjCPU8:

1) Разрядность — 8 бит;2) Архитектура Фон Неймана;3) RAM 256 байт;4) Без тактового генератора. Среднее время выполнения операции — 1 сек;5) Стек данных — 9 байт;6) 2 регистра общего назначения (РОН);7) 42 инструкции;8) Система ошибок;9) 1 пользовательский ввод;10) 16 портов вывода;11) Ассемблер.

Анатомия процессораНа картинке разными цветами показаны функциональные блоки в процессоре:

497e7829968a43f988f362f455501666.jpg

4nppdygosdeadwf74gf7bqe.png — ОЗУ4nmpbpqozxeafwcm4nho.png — Устройство управления (УУ)4no7bqgozzemtwf3.png — Устройство чтения/записи ОЗУ4nj7bxsozxea8wft4n9pbqe.png — устройство подачи сигнала на чтение инструкции, ее декодирование и обнуление необходимых регистров.4nm7bpqozxemmwf74gf7bqe.png — вывод в порты вывода4ne7bpqozxeazwf3.png — физически реализованный ассемблер4n1pbqgoz5emzwfi4gbpbxsosmeazwf3.png — стек4nxpdygosdem5wfs4n47bcsttxem1.png — система обнаружения ошибок4nopbxsos9em7wf14gf7bqe.png — различные вычислительно-преобразовательные блоки.

И еще есть несколько мелких блоков.

Как он работает

Дабы вас не утомлять, этот подзаголовок будет очень коротким.

Так как архитектура DjCPU8 фоннеймановская, то ясно, что инструкции и данные находятся в одной памяти. В момент запуска процессора сразу происходит полный сброс всех регистров и стека. Затем устройство подачи сигналов (выделен голубым цветом) подает сигнал на чтение данных из ОЗУ. Полученное число интерпретируется как инструкция. Это число подается на УУ (желтый цвет), где происходит выполнение инструкции.

Давайте возьмем для примера инструкцию load. Эта инструкция читает число из памяти и помещает его в регистр А. Итак, сначала мы прочитали из памяти число 2. Число 2 подается в УУ. УУ декодирует это число и понимает, что это инструкция load. Затем УУ начинает выполнять заданную последовательность действий. Сначала значение регистра программного счетчика увеличивается на 1. Затем читается второе число, которое интерпретируется как адрес. Допустим, адрес равен 4. Потом УУ посылает сигнал на чтение третий раз. Достается число из ячейки 4. Это число помещается в регистр А. Подается сигнал на чтение следующей инструкции. Всё, инструкция выполнена. Только представьте, за одну секунду процессор успел обратится к памяти 3 раза!

Есть инструкции сложные, и есть простые. Чем проще инструкция, тем быстрее она выполняется. Но средняя скорость примерно равна 1 Hz.

Как на нем программировать?

Вот небольшая табличка с описанием всех инструкций:

0 stop — Остановка ЦП1 load RAM — Читает число из RAM и помещает его в А2 loadC const — Помещает конкретное число const в А3 store RAM — Сохраняет А в RAM4 rand — Генерирует случайное число в A (0…255)5 add RAM — К значению А прибавляет значение из RAM6 sub RAM — От значения А отнимается значение из RAM7 mult RAM — Умножает А на значение из RAM8 div RAM — Делит А на значение из RAM9 and RAM — Побитовая операция «И»: A и значение из RAM10 or RAM — Побитовая операция «ИЛИ»: A и значение из RAM11 not — Побитовая операция «НЕТ» А12 2x — Делит А на 213 x/2 — Умножает А на 214 compare RAM — F = А — RAM15 jump to A — Безусловный переход к ячейке, адрес которой в А16 del RAM — Очищает ячейку в RAM17 say — Выводит в чат значение A18 A-R1 — Пересылка из A в R119 A-R2 — Пересылка из A в R220 R1-A — Пересылка из R1 в A21 R2-A — Пересылка из R2 в A22 inc — Увеличиват А на 123 dec — Уменьшает А на 124 push — Переместить число из А в стек25 pop — Переместить число из стека в А26 pushC const — Засунуть const в стек (А становится равный const)27 in — ЦП на паузу, читает число из порта чтения в А28 out — Пересылка числа из А в порт Port29 setPort const — Установка значения порта Port в const30 print — Посылает число в порт Port 031 jump const — Безусловный переход в ячейку const32 jump if A const — Если A > 0 переход в ячейку const, иначе к следующей ячейке33 jump if F const — Если F ≠ 0, переход в ячейку const, иначе — к следующей ячейке34 jump If not F const — Если F = 0, переход в ячейку const, иначе — к следующей ячейке35 storeR1 — Сохраняет значение А в памяти по адресу, которое в R136 storeR2 — Сохраняет значение А в памяти по адресу, которое в R237 loadR1 — Загружает значение по адресу R1 в А38 loadR2 — Загружает значение по адресу R2 в А39 incR1 — Увеличивает значение R140 decR1 — Уменьшает значение R141 incR2 — Увеличивает значение R242 decR2 — Уменьшает значение R1

Пример программы:

loadC123say

Об инструкциях. Их есть два типа — с параметром и без. Параметр должен быть в следующей ячейке после инструкции. Например, loadC это инструкция с параметром. Следующее число 123 как раз параметр для loadC. А что делает loadC? Эта инструкция берет число и помещает его в регистр А. Итак, процессор загрузил число 123. Что дальше? А дальше он может делать с этим числом что угодно! Например, вывести число в чат. Команда say как раз так и делает.

А теперь о параметрах. Их тоже есть два типа — const и RAM. Параметр const — это просто конкретное число. Команда loadC как раз требует конкретное число. А параметр RAM уже более интересный. Это не просто число, это адрес места, откуда нужно достать число. Итак:

load123say

В отличии от предыдущей, эта программа будет работать совсем по другому! Инструкция load имеет другой тип параметра — RAM. Поэтому число 123 уже является адресом. Что же произойдет? Процессор, вместо того чтобы удовлетворится числом 123, теперь уже лезет в память и по адресу 123 достает число. Но так как мы туда ничего не записывали, то он достанет ноль. После выполнения этой программы регистр А станет равным нулю. Понятно? Больше вы узнаете из моего руководства.И вот еще более удобная табличка.

Для чего я создал этот процессор? Заметил, что многие задают этот вопрос. И даже дополняют — «мог бы лучше деньги зарабатывать».

Ответ прост — это приносит мне удовольствие. Кто-то развлекается тем, что ПвПшит в Доту, кто-то рисует, кто-то программирует, а я делаю процессор.

И плюс к этому, во время создания своего процессора я понял, как же на самом деле работает настоящий процессор.

И напоследок, вот вам видеообзор:

[embedded content]

Спасибо!

© Habrahabr.ru