Пользователь
0,0
рейтинг
13 ноября 2014 в 18:56

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

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



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

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



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

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



— ОЗУ
— Устройство управления (УУ)
— Устройство чтения/записи ОЗУ
— устройство подачи сигнала на чтение инструкции, ее декодирование и обнуление необходимых регистров.
— вывод в порты вывода
— физически реализованный ассемблер
— стек
— система обнаружения ошибок
— различные вычислительно-преобразовательные блоки.

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

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

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

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

Давайте возьмем для примера инструкцию load. Эта инструкция читает число из памяти и помещает его в регистр А. Итак, сначала мы прочитали из памяти число 3. Число 3 подается в УУ. УУ декодирует это число и понимает, что это инструкция 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 — Уменьшает значение R2


Пример программы:
loadC
123
say


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

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

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

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

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

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

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



Спасибо!
Арсен @DjSapsan
карма
28,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (68)

  • –2
    Видел что то подобное на редстоунах (размеры куда больше и работает много дольше), вы же используете командные блоки, я полагаю? Как вы сами признались, смысла в этом не очень много. Конкретно вам это помогло понять, как работает процессор, но скачав вашу карту, думаю, мало кто разберется в особенностях реализации всего этого. Если вы хотите общественного признания, то на хабре вы его вряд ли получите, если же вы хотите поделиться собственным опытом с другими, то курс видео по теме или книжка будет к стати. С другой стороны есть довольно много профессиональной литературы по теме, но, возможно, именно ассоциация с чем то простым, как minecraft, поможет новичкам действительно понять, как эта маленькая «железяка» работает.
    • +1
      Я бы совсем не сказал бы, что это бесполезно. Очень круто, если логику сложных редстоун устройств можно было бы писать программно, а не в реализировать каждый раз вручную в виде схемотехники на логический гейтах, как это сейчас обычно делается. Забавно, что программирование в майнкрафте в своем роде повторяет историю вычислительных машин в реальной жизни, и в этом свете появление полноценного процессора общего назначения с ассемблером к нему — это важная веха.
      • +2
        В качестве иллюстрации, вот скриншот с куском реализации («серверной комнатой») популярной сейчас мини-игры в майнкрафте «Missile Wars» — там сотни command blocks и тонна редстоуна. Думаю по объему и сложности это сопоставимо с описанным в статье процессором, и такие штуки строят для каждой нетривиальной мини-игры.



      • 0
        В чем то согласен. Я считаю, что это не более чем забавно, но не полезно.
  • +10
    В комментариях к прошлому хабратопику (или это был гиктаймотопик, хммм...) выяснилось, что большинство комментаторов не знают, что такое командные блоки в Майнкрафте, что именно они делают, как работают и как они помогают решать задачи вроде «полный сброс всех регистров и стека» и «инструкция читает число из памяти и помещает его в регистр А».

    Не могли бы вы осветить этот вопрос, потому что как я понял, это нечто принципиально отличное от редстоуна, на котором традиционно строили процессоры в Майнкрафте?
    • –1
      Командный блок выполняет любую серверную команду (типа /give и т.д.) при подачи сигнала.
      Вместе с командными блоками в последних патчах еще очень много разных команд понадабовляли, вроде заливки области блоками и подобные.
      • +18
        В таком случае интересно как раз какие серверные команды использовались и для чего. Без этих деталей блогозапись больше напоминает инструкцию от мультиварки, чем запись в техническом хабе.

        Я ни в коем разе не умаляю заслуги автора сабжа в том, что он разобрался в работе CPU, но наиболее неочевидными для читателей являются не то, что «УУ декодирует это число и понимает, что это инструкция load», а то, как вообще реализовано хранение числа, что из себя представляет регистр, а что — ячейка RAM, как реализовано сравнение значения «0х01» и «load», как реализован доступ к этим 256 байтам и так далее…
  • +2
    мне нравится энтузиазм автора. чтобы поддержать инициативу, я планирую сделать подобный процессор на TTL-логике.
    • +3
      А мне вдруг стало интересно когда под такие процессоры начнут писать вирусы. Это же тоже большой шаг в мире компьютеризации.
  • 0
    Я для разбора устройства процессора в своё время пытался его повторить в EWB. Энтузиазма на долго не хватило, чтобы на логике всё собрать.
  • 0
    Только у меня дежавю?
    • 0
    • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Можно ли смотреть что происходит «под капотом»? Как меняются блоки, куда бегут сигналы и прочее.
  • +53
    Блин, да что такое эти ваши «редстоуны», «вычислительные блоки»? Как это всё работает? Может кто-то напишет нормальную статью для тех, кто в этот ваш «Майнкрафт» не играет и даже не особо представляет что это?
    • +5
      Если на пальцах, то редстоун — это проводник с некоторым уровнем сигнала внутри. Где есть провода, там есть и блоки вроде «И», «ИЛИ», «НЕ» и так далее. В своём апогее оно превращается в творения вроде www.youtube.com/watch?v=lB684ym3QY4, которые в некоторой степени моделируют настоящую электронику. Всё это частенько снабжается кучей хаков, чтобы в проводе была нулевая задержка и так далее, подробности есть тут: minecraft.gamepedia.com/Redstone_circuit

      По поводу «вычислительных блоков» самому интересно, могу разве что направить к комментариям habrahabr.ru/post/243013/#comment_8121999. Из статьи minecraft.gamepedia.com/Command_Block не очевидно, как на этом реализовать память и вычисления.
      • +14
        Ну напишите статью, люди просят :-)
        • 0
          Плюсую за статью! Многие думают, что в Minecraft только здания и строят. А тут такое… Автономного робота тоже можно создать?)
          • +1
            Уже да.
            Статичного точно делали)
  • –24
    ПвПшит в Доту


    ну не знаю, я там ПвЕшу, крипов бью в основном. /оффтоп
    • +10
      По вашему нику об этом можно догадаться
    • +2
      И чо?
    • –2
      А гангать кто будет, спрашивается?!
      • –8
        Если парни справляются в 4ром, давая пространство для фарма тому же войду, то почему бы не поПвЕшить минут 20 от купола до купола?
        • –1
          Ой, извините, мы же тут о процессорах в майнкрафте говорим.
  • 0
    > Различные цифровые схемы и процессоры создают в Minecaft уже с давних пор

    Так вот ты какой, Skynet в молодости!
  • +1
    Ну а где видео работы самого микропроцессора? Так сказать, что у него под капотом?

    Хотелось бы увидеть как работает программа, например сложения всех чисел от 0 до 15 в цикле.
  • +4
    Давайте поставим вопрос так: почему процессор именно в Minecraft? Почему бы, если уж душа просит хардкора, не взять какой-нибудь схемный редактор (OrCAD тот же, Microcap или даже GNU Electric) и не нарисовать процессор на транзисторах в нем?
    А если транзисторы вас не интересуют, а хочется понять, как команды выполняются, то Verilog вам поможет.
    Я, конечно, могу не понимать каких-то достоинств именно Minecraft. Расскажите о них пожалуйста.
    • +4
      Все довольно просто. Люди начинают играть в довольно захватывающую игру, позже узнают о том, что в ней есть некие провода и электричество, затем начинают с их помощью мастерить всякие штуки и в результате получается вот это. Если человек пришел к моделированию процессора через специализированный софт, то значит он студент или это его работа, а тут постепенный переход от игры к моделированию.
      • +5
        Просто не понятно: почему людям работать с реальными проводами и электричеством менее интересно, чем с Minecraft-овским? Странно это как-то. Я вот тоже думаю, ну хочется тебе сделать процессор, ну делай в реальных инженерных пакетах. Какой смысл убивать уйму времени на простейший процессор в неприспособленном для этого «редакторе»? Тем более, что полученный потом RTL-код из реального пакета можно будет прошить в FPGA за 10 баксов, подключить куда-нибудь и т.д. и т.п. Так же гораздо интереснее, нет?
        • +2
          Кто же этих геймеров 80го уровня поймет?
        • 0
          Люди ещё и в Guitar Hero играют вместо того, чтобы взять настоящую гитару :-)
        • 0
          Они «играют» в процессор. Относится к этому нужно как конструкторам для детей, например. Автор прямо заявляет, что он понял как работает процессор. В результате на лицо развитие за счёт игры, что даёт нам понятие «развивающая игрушка».
        • 0
          «Молодежь в кваку играть не умеет. Сказывается изощренная логика: сначала бабки, потом работа»
          (С) Хроники лаборатории
      • +1
        Delphinum, в самую точку!
        • 0
          Нет, правда, если вам всерьез понравилось делать именно процессор, попробуйте сделать его в каком-то более подходящем софте. Это ужасно интересно, инфа 100% )
          • 0
            Покажи друзьям работающую схему в Каде и в Майнкрафте (когда друзья тоже фанаты игры) — разница очевидна :)
    • +3
      Еще в Майнкрафте (с модами) есть компьютеры (маленькие одноблочные) и роботы, которые можно программировать на Lua, со своей мини ОС, с дискетами, мониторами и т.п… Возможностей, тут очень много: роботы и компьютеры могут быть объединены в «сетку» и обмениваться информацией. Видел даже подобие вируса для компьютеров Майнкрафта.

      Ну а я программировал роботов, которые автоматически копали и собирали полезную руду, складывали ее в сундук и при этом пользовались своего рода GPS позиционированием, которое в свою очередь пришлось создавать из трех компьютеров а-ля трех спутников, которые позволяли узнать дистанцию до них.

      Было весело, пока я не осознал, что на работе программирую, и на отдыхе программирую, только «виртуально» =))
      И я подумал, что писать программы для реальных роботов может быть веселее и приобрел Ардуину. С нее перешел на квадрокоптеры и понеслась. Теперь, благодаря Майнкрафту у меня есть классное хобби :-)
      • +1
        Поделитесь ссылками на эти моды, пока у меня сын фанатит по майнкрафту надо использовать )
      • 0
        Человече, читал коммент и себя узнавал (с той лишь разницей, что не люблю моды в майн). А потом вспомнил как мы делились впечатлениями о настройке ПИД-регулятора. Помните: P=0.2;
        I=0.005; D=0.1? Закладка на блог коптероводов теперь в экспресс-панели. Наверное надо и мне квадракоптерами заняться… а пока… я копаю…
        • 0
          Да, конечно помню! :-)
          Сайт мы, к сожалению, подзабросили пока. Знакомые помогают с небольшой группой ВК, если что:
          vk.com/kopterovod
          тем временем медленно собирается огромная окта.

          Коптерами, конечно займитесь! Чем раньше, тем лучше! :-)

          По поводу модов — тоже некоторое отвращение было сначала, но потом как-то втянулся. Способствовала их установка в один клик на каком-то хостинге Майнкрафта.
  • +3
    Комманд-блоки? Неспортивно!
  • +5
    По моему у игроков в MineCraft просто слишком много свободного времени, если они могут потратить его на создание, например, такого калькулятора.
    • +3
      Мне кажется или в этом есть какая-то скрытая укоризна? Ну есть и есть, круто же когда человека прёт. Всяко лучше чем делать «полезное дело» и подыхать от тоски и разочарования.
      • +4
        Укоризны не было, было немного сарказма и скрытой зависти )
      • +1
        Мне кажется, я бы от тоски сдох бы быстрее в Minecraft. Чтобы сделать большую схему — это ж надо столько однообразных действий повторять сотни раз. Я так понимаю, никакой поддержки макросов в Minecraft нет. Или я ошибаюсь?
        • 0
          Есть моды редактирования мира, которые позволяют copy/paste заданного объёма делать. Впрочем это не радикально упрощает дело.
        • 0
          я использовал МСEdit, команды для заполнения блоками заданной области, скрипты для заполнения командных блоков. Но всё равно 50% делал чисто вручную.
          • 0
            Расскажете, что за скрипты?
            • 0
              Есть сервера, есть плагины для серверов. Плагины добавляют куча нового функционала с серверной стороны. Есть плагин WorldEdit для удобного редактирования мира (заливка, замена, клонирование, стакование и многое другое). В плагине WorldEdit есть скрипты. Есть скрипт, который может автоматически заполнять командные блоки. Для новичка это сложно объяснить )
        • 0
          Я имел опыт работы только с редактором карт. Выглядит как пиксельная рисовалка, можно линии чертить, блоки, окружности. Есть трехмерные префабы: деревья, домики и т.п.
  • +1
    А сколько в этом чуде миль зацеплений? (см. Гибсон — Машина Различий)
  • +1
    Осталось портировать на эту архитектуру Linpack и можно начинать составлять top500 самых быстрых компьютеров в майнкрафте)
  • +4
    Ждем эмулятора x86 и экспериментальный запуск Windows 95 на Майнкрафте :)
    • +3
      И запуска Майнкрафта на нём. И сабжевого процессора.
    • +2
      95 не нужна. а вот DOOM портировать надо.
      • 0
        >>> не нужна
        Не нужна кому?
        • +2
          а кому она нужна, в отличие от дума?
        • 0
          Тому, кто помнит 3.11 :)
          • 0
            Я бы начал с Novell NetWare 3.11 — всего то написать сетевой драйвер и NLM :-) а то Doom по сети не погонять
  • 0
    Вот прямо только что я понял, чего очень не хватает в майнкрафте.
    Инкапсулирующего блока, типа контейнера. Пусть даже с ограниченным внутренним объемом.
    То есть, снаружи у такого блока будет 6 входов/выходов (по числу граней), а внутрь блока можно было бы зайти не как в верстак или специализированные блоки с заранее определенными слотами, а вживую, как в виртуальное пространство, чтобы построить там свой механизм, который в конечном счете упаковывается в единичный блок.
    Это был бы существенный рывок классического майнкрафта и даже конкуренция разнообразным модам, блоки которых все равно конечны

    А чем черт не шутит, вдруг таким образом зародится визуальное 3D — программирование :)
  • +1
    Когда же мы будем программировать ПЛИС в minecraft?
  • 0
    А как это собирается? Не руками же? Есть какой-то софт для моделирования таких вещей и перенос в игровой мир? Этот софт имеет эмулятор?
    Как эта система дебажится? Какие то тесты для проверки этого проца есть?
  • +1
    Сама идея и статья — просто супер!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.