На Geektimes летом была [статья про Megaprocessor][1] — процессор из дискретных транзисторов и светодиодов, который весит полтонны и занимает всю гостиную в обычном таунхаусе под Кембриджем. Я решил воспользоваться своей географической близостью к этому мегапроекту, и запрограммировать для него что-нибудь презентабельное — например, спортировать для Megaprocessor мою [предыдущую хабрапрограммку][2] «Digital Rain».
![][3]
Система команд Megaprocessor [описана на сайте разработчика][4]. Большинство команд состоят из одного байта, за которым может следовать непосредственный операнд (один или два байта). Регистров общего назначения всего четыре (R0-R3), при этом они не равноправны: например, для команд доступа к памяти адрес должен быть либо в R2, либо в R3; а операнд — в одном из двух оставшихся регистров. Программистам, привыкшим к системе команд x86 или ARM, набор команд Megaprocessor покажется крайне бедным: нет ни косвенной адресации «база+смещение», ни непосредственных операндов у арифметических команд (за исключением `addq ±1`, `addq ±2`). Зато есть пара неожиданных возможностей: отдельная команда `sqrt`, и режим `.wt` для команд сдвига, который заменяет результат суммой выдвинутых битов. Таким образом можно, например, парой команд `ld.b r1, #15; lsr.wt r0, r1` вычислить количество единичных битов в `r0` (вопрос, столь любимый собеседователями на работу!). Мнемоника `ld` для команды, загружающей в регистр непосредственное значение (вместо привычной по x86 или ARM мнемоники `mov`) указывает на способ её выполнения: фактически, с точки зрения процессора, выполняется `ld.b r1, (pc++)`.
Итак, приступим. [Читать дальше →][5]
[1]:
https://geektimes.ru/post/278410/
[2]:
https://habrahabr.ru/post/276371/
[3]:
https://habrastorage.org/getpro/habr/post_images/f56/393/8e3/f563938e3ab5f796b19c8f2e452906c6.gif
[4]:
http://www.megaprocessor.com/instruction_set.pdf
[5]:
https://habrahabr.ru/post/309654/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut