В противоположность известных всем процессоров «Intel», марку которых довольно легко запоминать и выговаривать, «Койяанискаци» задумывался как процессор, имя которого сложнее произнести, чем разобраться в его архитектуре и научиться его программировать на самом элементарном уровне машинного кода редакторами дампа, чтобы проверить, действительно ли стоит прогибаться под радиолюбительские ТУ и невозможно сформировать красивую систему команд, понятную на уровне интуиции?
Не имеется ввиду код стиля «O'Kей, процик, вычисли мне среднее факториальное», а планировался машинный код с минимальным уровнем вхождения в основы искусства его программирования, не требующего жёсткой зубрёжки и заучивания всех команд.
Введение
Начальный дизайн процессора задумывался как шуточный автомат со сквозным байт-кодом и возможностью кодировать дамп сценария даже без необходимости обращения к таблице команд до полного их заучивания. Ставилась простая задача разработки простого процессорного устройства, в котором любые из 30 РОН можно заменить на всякую периферию из датчиков, двигателей и соленоидов. В таком дизайне имеется уникальная возможность организации почти непосредственного взаимодействия всех требуемых устройств без надобности в высоких частоте и производительности.
Например, PICO-8 и Gigatron, а также MegaProcessor или MyCPU хоть и разработаны специалистами, но никто не подходил к вопросу с чувством эстета, опираясь на сухой технологический расчёт.
К тому же, те же языки программирования, как КОБОЛ, хоть и задумывались с акцентом на гуманитарии, но в широком практическом применении оказались непрактичными и неудобными…
Сейчас, с заменой файлов конфигурации *.inf и *.ini на *.xml, получается, что история снова повторяется…
Архитектура процессора
Весь процессор основан на регистровом файле из четырёх функциональных групп по десять ячеек в каждой. Хотя операции АЛУ возможны над любыми ячейками, правила корректного оперирования с ними соблюдать необходимо более-менее строго. Здесь стоит просто запомнить логику и назначение этих функциональных групп:
Подпрограммы
Так как процессор достаточно прост и не имеет встроенных аппаратных механизмов организации стековых операций, регистры B₀:C₀ сохраняют адрес, на котором была размещена операция обращения к подпрограмме. Программист при необходимости сам обязан позаботиться о всех операциях работы со стеком и описать их алгоритмом. Для облегчения разработки алгоритма, следует использовать небольшую библиотеку кратких подфункций, выполняющих необходимые операции ветвления и вызова всяких пользовательских подпрограмм, реализующие механизмы стека программным уровнем.
Библиотеку можно найти отдельным файлом в ресурсах репозитория этого проекта.
Работа с памятью
При доступе к внешней памяти нужная ячейка адресуется парой активных регистров Bi и Cj, где Bi указывает на Базу Блока по 256 ячеек и Cj указывает в блоке на конкретную ячейку. Медленная память может удлинить цикл доступа сигналом Wait.
Кеш и периферия
Регистры D₀…₉ не следует использовать в активных вычислительных процессах, так как они управляют периферией непосредственного доступа с мгновенным откликом и пригодны для организации процессорного кеша и контекстного регистрового файла.
Формат команд Койяанискаци
Первостепенной целью в разработке процессора ставилась задача совмещения RISC-кода с внешней читабельностью бинарного представления команд шестнадцатеричным дампом, где алфавитно-цифровые символы двух нибблов несут смысловую нагрузку в виде своеобразных аббревиатур, пригодных к использованию в качестве мнемоники.
«Код» «Нибблы» «Аббревиатурная нагрузка»
Практически все команды кодируются WYSIWYG-стилем акына:«Что вижу, то значит». Шестнадцатеричная кодировка отчасти является аббревиатурой самой команды и всё задумывалось так, чтобы большинство команд просто совершали понятные действия.
Однако, тут не стоит думать, что «процессор акына» совсем ничего не требует от продвинутого пользователя-программиста: Минимальный порог вхождения преодолеть всё-таки придётся… А значит, придётся чуточку поднапрячься и преодолеть порог!
(Здесь подразумевается, что читатель уже имеет все базовые понятия и принципы, позволяющие ориентироваться в синтаксической конструкции и строить выражения…)
Сложение величин из регистров 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 2A», так как от расположения префиксов перед операциями результат не изменяется и всё зависит от стиля программиста.
Выражение «A1 = A1 + B2 - B3 & B4 | B5 ^ B6» можно описать последовательностью «A1 AB 2A 3B 4C 5D 6E», так как в каждом следующем коде операции явно указан и индекс правого операнда, что позволяет писать код компактно и производительно.
Максимально доступно каждому любителю
Так как Logisim куда доступнее и проще того же Proteus и компактнее KiCAD, вся схема процессора разрабатывалась в рамках проекта именно Logisim, чтобы проект был по-детски прост и лёгок для использовании заинтересованными любителями. По предварительным подсчётам, если схему проекта попытаться собирать микросхемами серии 74xx или отечественной номенклатуры, понадобится порядка 250 корпусов…
При грамотном подходе проектирования процессоров с применением мультиплексоров и специализированных микросхем РОН, число всех микросхем может снизиться всего до сотни корпусов с повышением производительности без переходов в Z-состояние.
Если смущает использование ПЗУ для дешифрации команд, имеется набросок схемы с использованием уровня комбинаторики, по которой можно осознать, что и красивую систему команд можно декодировать простейшим способом логических вентилей, без ущерба концептуальной задумки!
Эмуляция?
Никакого программного эмулятора не задумывалось специально, чтобы архитектурно процессор изначально готовился к реализации на физических макетных платах и не содержал в себе решений, которые аппаратно крайне сложно будет реализовывать в силу излишней вольности в эмуляторе. Вся схема разрабатывалась несколько лет в часы досуга эпизодически и несколько раз перерисовывалась вся с чистого листа.
Ссылки
Скачать исходные файлы симуляции можно здесь.
Основная статья размещена здесь.
Эмулятор класса «очень дёшево и очень сердито»…
Диаграмму работы шин можно изучить здесь…
Не имеется ввиду код стиля «O'Kей, процик, вычисли мне среднее факториальное», а планировался машинный код с минимальным уровнем вхождения в основы искусства его программирования, не требующего жёсткой зубрёжки и заучивания всех команд.
Введение
Начальный дизайн процессора задумывался как шуточный автомат со сквозным байт-кодом и возможностью кодировать дамп сценария даже без необходимости обращения к таблице команд до полного их заучивания. Ставилась простая задача разработки простого процессорного устройства, в котором любые из 30 РОН можно заменить на всякую периферию из датчиков, двигателей и соленоидов. В таком дизайне имеется уникальная возможность организации почти непосредственного взаимодействия всех требуемых устройств без надобности в высоких частоте и производительности.
Например, PICO-8 и Gigatron, а также MegaProcessor или MyCPU хоть и разработаны специалистами, но никто не подходил к вопросу с чувством эстета, опираясь на сухой технологический расчёт.
К тому же, те же языки программирования, как КОБОЛ, хоть и задумывались с акцентом на гуманитарии, но в широком практическом применении оказались непрактичными и неудобными…
Сейчас, с заменой файлов конфигурации *.inf и *.ini на *.xml, получается, что история снова повторяется…
Архитектура процессора
Весь процессор основан на регистровом файле из четырёх функциональных групп по десять ячеек в каждой. Хотя операции АЛУ возможны над любыми ячейками, правила корректного оперирования с ними соблюдать необходимо более-менее строго. Здесь стоит просто запомнить логику и назначение этих функциональных групп:
- A₀…₉ (Аккумуляторы) A₀ хранит флажки статуса АЛУ
- B₀…₉ (Base / База) B₀ хранит Базу возврата из подпрограммы
- C₀…₉ (Counter / Счётчик) C₀ хранит Смещение возврата из подпрограммы
- D₀…₉ (Device / Доступные устройства) Можно организовать кеш
Подпрограммы
Так как процессор достаточно прост и не имеет встроенных аппаратных механизмов организации стековых операций, регистры B₀:C₀ сохраняют адрес, на котором была размещена операция обращения к подпрограмме. Программист при необходимости сам обязан позаботиться о всех операциях работы со стеком и описать их алгоритмом. Для облегчения разработки алгоритма, следует использовать небольшую библиотеку кратких подфункций, выполняющих необходимые операции ветвления и вызова всяких пользовательских подпрограмм, реализующие механизмы стека программным уровнем.
Библиотеку можно найти отдельным файлом в ресурсах репозитория этого проекта.
Работа с памятью
При доступе к внешней памяти нужная ячейка адресуется парой активных регистров Bi и Cj, где Bi указывает на Базу Блока по 256 ячеек и Cj указывает в блоке на конкретную ячейку. Медленная память может удлинить цикл доступа сигналом Wait.
Кеш и периферия
Регистры D₀…₉ не следует использовать в активных вычислительных процессах, так как они управляют периферией непосредственного доступа с мгновенным откликом и пригодны для организации процессорного кеша и контекстного регистрового файла.
Формат команд Койяанискаци
Первостепенной целью в разработке процессора ставилась задача совмещения RISC-кода с внешней читабельностью бинарного представления команд шестнадцатеричным дампом, где алфавитно-цифровые символы двух нибблов несут смысловую нагрузку в виде своеобразных аббревиатур, пригодных к использованию в качестве мнемоники.
«Код» «Нибблы» «Аббревиатурная нагрузка»
- A1 «A,1» Активировать в группе A регистр #1
- BE «B,E» Загрузить в активный регистр группы B извлечённые (Extract) данные из памяти
- EC «E,C» Исполнить (Execute) операции только в случае переноса (Carry) по флагу CF
- EE «E,E» Исполнить (Execute) операции только в случае эквивалентности (Equal) по флагу ZF
- 30 «3,0» Префикс репетиции команды 3 раза, где «0» символизирует скобки «()», что условно можно обозначить как «3×(…)»
- CB «C,B» Подготовить регистровые группы C и B для АЛУ-операции составом «C,B»
- 1A «1,A» Работать с регистром #1 группы второго операнда при выполнении операции сложения (Add)
Практически все команды кодируются WYSIWYG-стилем акына:«Что вижу, то значит». Шестнадцатеричная кодировка отчасти является аббревиатурой самой команды и всё задумывалось так, чтобы большинство команд просто совершали понятные действия.
- 00: HLT (останов программы) — крайне логичный и гармоничный код!
- 01: Приращение единицы к активному регистру-приёмнику
- 02…09: Префикс повтора операции от 2 до 9 раз или пропуск группы операций по условию
- 10…99: Используется BCD-код приращения к активному регистру-приёмнику — код 56 означает именно 56₁₀, а не 0x56₁₆
- 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 2A», так как от расположения префиксов перед операциями результат не изменяется и всё зависит от стиля программиста.
Выражение «A1 = A1 + B2 - B3 & B4 | B5 ^ B6» можно описать последовательностью «A1 AB 2A 3B 4C 5D 6E», так как в каждом следующем коде операции явно указан и индекс правого операнда, что позволяет писать код компактно и производительно.
Максимально доступно каждому любителю
Так как Logisim куда доступнее и проще того же Proteus и компактнее KiCAD, вся схема процессора разрабатывалась в рамках проекта именно Logisim, чтобы проект был по-детски прост и лёгок для использовании заинтересованными любителями. По предварительным подсчётам, если схему проекта попытаться собирать микросхемами серии 74xx или отечественной номенклатуры, понадобится порядка 250 корпусов…
При грамотном подходе проектирования процессоров с применением мультиплексоров и специализированных микросхем РОН, число всех микросхем может снизиться всего до сотни корпусов с повышением производительности без переходов в Z-состояние.
Если смущает использование ПЗУ для дешифрации команд, имеется набросок схемы с использованием уровня комбинаторики, по которой можно осознать, что и красивую систему команд можно декодировать простейшим способом логических вентилей, без ущерба концептуальной задумки!
Эмуляция?
Никакого программного эмулятора не задумывалось специально, чтобы архитектурно процессор изначально готовился к реализации на физических макетных платах и не содержал в себе решений, которые аппаратно крайне сложно будет реализовывать в силу излишней вольности в эмуляторе. Вся схема разрабатывалась несколько лет в часы досуга эпизодически и несколько раз перерисовывалась вся с чистого листа.
Ссылки
Скачать исходные файлы симуляции можно здесь.
Основная статья размещена здесь.
Эмулятор класса «очень дёшево и очень сердито»…
Диаграмму работы шин можно изучить здесь…
Исправлено: Alikberov, 17.03.2025 16:13