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

в 15:56, , рубрики: minecraft, ассемблер, КодоБред, моделирование, процессор, Электроника для начинающих

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

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

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

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

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

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

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

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

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

Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 4 — ОЗУ
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 5 — Устройство управления (УУ)
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 6 — Устройство чтения/записи ОЗУ
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 7 — устройство подачи сигнала на чтение инструкции, ее декодирование и обнуление необходимых регистров.
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 8 — вывод в порты вывода
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 9 — физически реализованный ассемблер
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 10 — стек
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 11 — система обнаружения ошибок
Полноценный процессор в Minecraft: как он работает, как на нем программировать и для чего он? - 12 — различные вычислительно-преобразовательные блоки.

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

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

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

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

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

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

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

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

0 stop — Остановка ЦП
1 load RAM — Читает число из RAM и помещает его в А
2 loadC const — Помещает конкретное число const в А
3 store RAM — Сохраняет А в RAM
4 rand — Генерирует случайное число в A (0..255)
5 add RAM — К значению А прибавляет значение из RAM
6 sub RAM — От значения А отнимается значение из RAM
7 mult RAM — Умножает А на значение из RAM
8 div RAM — Делит А на значение из RAM
9 and RAM — Побитовая операция “И”: A и значение из RAM
10 or RAM — Побитовая операция “ИЛИ”: A и значение из RAM
11 not — Побитовая операция “НЕТ” А
12 2x — Делит А на 2
13 x/2 — Умножает А на 2
14 compare RAM — F = А — RAM
15 jump to A — Безусловный переход к ячейке, адрес которой в А
16 del RAM — Очищает ячейку в RAM
17 say — Выводит в чат значение A
18 A-R1 — Пересылка из A в R1
19 A-R2 — Пересылка из A в R2
20 R1-A — Пересылка из R1 в A
21 R2-A — Пересылка из R2 в A
22 inc — Увеличиват А на 1
23 dec — Уменьшает А на 1
24 push — Переместить число из А в стек
25 pop — Переместить число из стека в А
26 pushC const — Засунуть const в стек (А становится равный const)
27 in — ЦП на паузу, читает число из порта чтения в А
28 out — Пересылка числа из А в порт Port
29 setPort const — Установка значения порта Port в const
30 print — Посылает число в порт Port 0
31 jump const — Безусловный переход в ячейку const
32 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 — Сохраняет значение А в памяти по адресу, которое в R1
36 storeR2 — Сохраняет значение А в памяти по адресу, которое в R2
37 loadR1 — Загружает значение по адресу R1 в А
38 loadR2 — Загружает значение по адресу R2 в А
39 incR1 — Увеличивает значение R1
40 decR1 — Уменьшает значение R1
41 incR2 — Увеличивает значение R2
42 decR2 — Уменьшает значение R1

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

loadC
123
say

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

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

load
123
say

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

Больше вы узнаете из моего руководства.
И вот еще более удобная табличка.

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

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

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

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

Спасибо!

Автор: DjSapsan

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js