[Из песочницы] Процессорное устройство «Койяанискаци»: Сложно выговорить, легче запрограммировать
Лирика
Античные времена знакомы каждому не только бессмертными произведениями от пера Гомера, но и таблицей умножения Пифагора, геометрией Евклида и винтом Архимеда под знаком Пи, которыми человечество научилось пользоваться в полной мере лишь относительно недавно. Если в античности искусством было не только уметь писать стихи и прозу, но и проектировать катапульты или стенобитные орудия, то сейчас существуют жёсткие рамки и разделения, когда вывести очередную самодостаточную красивую и полезную формулу является искусством лишь как формальная игра слов. Математика правит современным миром безраздельно, цинично переплетаясь с миром искусства, нагло вторгаясь хитрейшими вычислениями во все сферы нашего досуга, отдыха и быта, диктуя свои правила и законы, под давлением которых выцветают и пёстрые краски знаменитых шедевров, переходя в ядовитые оттенки полнометражек.
К сожалению, зачастую математика способна искажать наше восприятие окружающего мира своим давлением ТУ в рамках экономики, когда Пломбир или Птичье Молоко не могут уже вызывать ту игру вкусовых ощущений, которые задумывались кондитерами как вольный полёт неограниченной фантазии под руководством опыта и мастерства.
Современные инженеры слепо оперируют сухими цифрами, не вспоминая об искусстве как начале всех начал и поддаваясь требованиям рынка, глухого бизнеса и слепой к эстетике экономики, в свете которых формируются неуклюжие или даже уродливые стандарты, как например ASCII, скэн-код или IA-32. Если скэн-код выделен был в спартанском прототипе дизайна клавиатуры, был продиктован расположением клавиш на матрице, стал стандартом лишь по чистой случайности захваченного рынка ЭВМ, то не совсем понятно, отчего ASCII-таблица не такая уж красивая и внятная, как могла бы выглядить в идеале и уж не понятно, какие такие ТУ её могли исказить:
Выделив под управляющие коды никому не нужные уже 32 комбинации, авторами была создана благоприятная почва, где до сих пор всё встречаются такие сорняки, как «БНОПНЯ» и «Кракозябры» в самом неожиданном и даже противном своём проявлении.
Та же сухая экономика своими цифрами вынуждала инженеров Intel упрощать первый свой процессор i8086, уродовать его систему команд в угоду экономии наносекунд и металла, буквально словно впопыхах раскидывая все команды по кодовой таблице своим спринтерским стремлением выбросить на массовый рынок свой очередной чип. Никто не задумывался тогда, что безобразный машинный код тот станет стандартом мирового уровня, на который без боли и стыда посмотреть никак нельзя будет уж! Никому в голову не пришло переключиться от математического искусства измерения наносекунд задежки и граммов проволочек на эстетическую картину изделия, чтобы система команд не уходила в своём физическом пике энтропии в океан хаоса: Ведь сейчас уже не важно, какие такие цели тогда преследовались инженерами, так как суперскалярным ядром любого современного процессора поддержка многострадальной системы команд x86 давно совершается уровнем эмуляции как чистая формальность, продиктованная положением рыночных требований, о которые разбился тот Itanium…
Койяанискаци — как крик души!
В противоположность известных всем процессоров «Intel», марку которых довольно легко запоминать и выговоривать, «Койяанискаци» задумывался как процессор, имя которого сложнее произнести, чем разобраться в его архитектуре и научиться его программировать на самом элементарном уровне машинного кода редакторами дампа, чтобы проверить, действительно ли стоит прогибаться под радиолюбительские ТУ и невозможно сфомироваться красивую систему команд, понятную на уровне интуиции?
Не имеется ввиду код стиля «O’Kей, процик, вычисли мне среднее факториальное», а планировался машинный код с минимальным уровнем вхождения в основы искусства его программирования, не требующего жёсткой зубрёжки и заучивания всех команд.
Архитектура процессора
Весь процессор основан на регистровом файле из четырёх функциональных групп по десять ячеек в каждой. Хотя операции АЛУ возможны над любыми ячейками, правила корректного оперирования с ними соблюдать необходимо более-менее строго. Здесь стоит просто запомнить логику и назначение этих функциональных групп:
Так как процессор достаточно прост и не имеет встроенных аппаратных механизмов организации стековых операций, регистры B₀: C₀ сохраняют адрес, на котором была размещена операция обращения к подпрограмме. Программист при необходимости сам обязан позаботиться о всех операциях работы со стеком и описать их алгоритмом.
Система команд Койяанискаци
Практически все команды кодируются WYSIWYG-стилем акына: «Что вижу, то значит». Шестнадцатеричная кодировка отчасти является аббревиатурой самой команды и всё задумывалось так, чтобы большинство команд просто совершали понятные действия.
- 00: HLT (останов программы) — крайне логичный и гармоничный код!
- 01: Приращение единицы к активному регистру-приёмнику
- 02…09: Префикс повтора операции от 2 до 9 раз или пропуск группы операций по условию
- 10…99: Используется BCD-код приращения к активному регистру-приёмнику — код 56 означает именно 56₁₀, а не 0×56₁₆
- A0…A9, B0…B9, C0…C9: Безвременные префиксы выбора активного регистра указанной группы — A₀…A₉, B₀…B₉, C₀…C₉ соответственно
- D0…D9: Выбор активного устройства группы Devices — D₀…D₉
- AA…AD, BA…BD, CA…CD, DA…DD: Безвременные префиксы выбора сочетания операндов для АЛУ-операций — A, A…D, D соответственно
- E0…E7: Обращение к расширению (Extension) через подпрограмму — CALL 0xE000…0xE700
- F1…F9: Обращение к функции (Function) с указанным индексом — CALL 0xF100…0xF900
- E8…EF: Условный префикс к исполнению кода следующей операции — Enable if SF/PF/CF/ZF
- F0: Завершение текущей функции (Function Over — как Game Over)
- AE/BE/CE/DE: Извлечение (Extract) данных из памяти в указанный регистр
- AF/BF/CF/DF: Запись/фиксация (Fix) данных указанного регистра в память
- FA…FF: Вызов прочих функций — CALL 0xFA00…0xFF00
- 0A/1A/2A…9A: АЛУ-операция «Сумма» (Add) над группой операндов — индекс правого операнда указывается явно 0…9
- 0B/1B/2B…9B: АЛУ-операция «Вычитание» (suB) над группой операндов — индекс правого операнда указывается явно 0…9
- 0C/1C/2C…9C: АЛУ-операция «Конъюнкция» (Conjunct/and) над группой операндов — индекс правого операнда указывается явно 0…9
- 0D/1D/2D…9D: АЛУ-операция «Дизъюнкция» (Disjunct/or) над группой операндов — индекс правого операнда указывается явно 0…9
- 0E/1E/2E…9E: АЛУ-операция «Исключающее ИЛИ» (Exclusive or/Eor/xor) над группой операндов — индекс правого операнда указывается явно 0…9
Основы программирования Койяанискаци
Однако, тут не стоит думать, что «процессор акына» совсем ничего не требует от продвинутого пользователя-программиста: Минимальный порог вхождения преодолеть всё-таки придётся… А значит, придётся чуточку поднапрячься и преодолеть порог!
(Здесь подразумевается, что читатель уже имеет все базовые понятия и принципы, позволяющие ориентироваться в синтаксической конструкции и строить выражения…)
Сложение величин из регистров A₁ и B₂ традиционно можно представить выражением «A1 += B2» или мнемонической записью «ADD A1, B2», которую и следует оформить в машинный код. Так как архитектура процессора предельно проста и организовалась на польской записи, буквально необходимо сначала предопределить используемые в операции операнды, чтобы потом произвести саму конкретную операцию вычисления.
Так как используется сочетание регистров «A1» и «B2» в порядке «An, Bn», то под их определение следует указать машинный код AB₁₆. Выбор индексов на конкретных операндах выполняется кодами A1₁₆ и B2₁₆, что указывает на буквальность кодов. Так как индекс правого операнда равен двум, то в коде АЛУ-операции «Сумма» его следует указать явно в левой тетраде как 2A₁₆. Тем самым, становится очевидным размещения кода всего выражения как «A1 AB B2 2A». Но так как индекс B₂ указан явно в АЛУ-операции, байт команды «B2» можно исключить из цепочки, так как сам регистр B₂ не является приёмником результата и код сократится до одной из двух комбинаций записи «A1 AB 2A» или «AB A1 2B», так как от расположения префиксов перед операциями результат не изменяется и всё зависит от стиля программиста.
Выражение «A1 = A1 + B2 — B3 & B4 | B5 ^ B6» можно описать последовательностью «A1 AB 2A 3B 4C 5D 6E», так как в каждом следующем коде операции явно указан и индекс правого операнда, что позволяет писать код компактно и производительно.
Максимально доступно каждому любителю
Так как Logisim куда доступнее и проще того же Proteus и компактнее KiCAD, вся схема процессора разрабатывалась в рамках проекта именно Logisim, чтобы проект был по-детски прост и лёгок для использовании заинтересованными любителями. По предварительным подсчётам, если схему проекта попытаться собирать микросхемами серии 74xx или отечественной номенклатуры, понадобится порядка 250 корпусов…
Если смущает использование ПЗУ для дешифрации команд, имеется набросок схемы с использованием уровня комбинаторики, по которой можно осознать, что и красивую систему команд можно декодировать простейшим способом логических вентилей, без ущерба концептуальной задумки!
Эмуляция?
Никакого программного эмулятора не задумывалось специально, чтобы архитектурно процессор изначально готовился к реализации на физических макетных платах и не содержал в себе решений, которые аппаратно крайне сложно будет реализовывать в силу излишней вольности в эмуляторе. Вся схема разрабатывалась несколько лет в часы досуга эпизодически и несколько раз перерисовывалась вся с чистого листа.