Я когда этот микрокодовый подход придумывал в 2015 году, то хотел добиться чтобы большинство инструкций выполнялось бы за один цикл (три периода тактирующей пилы) и только сложные многотриадные инструкций занимали бы несколько циклов (выше можно видеть, что это LAI, ADI, OPA, LDI, JMP и OPB). Возможно я тогда переупростил и кое-какие из "простых" инструкций должны занимать больше одного цикла - например ADD т.к. она кроме сложения ещё меняет состояние двух флагов. Для 3niti beta добавятся несколько ещё более сложных "многоцикловых" инструкций типа CALL и RET, которые подразумевают инкремент-декремент 9-тритового регистра SP и многократное обращение к памяти.
Вместо непонятного регистра I я
ещё тогда пошёл по пути адресации микропрограмм кодом инструкции - в простейшем случае инструкция выполнялась бы микропрограммой, расположенной по адресу OOOxxx, но при необходимости исполнение уходило бы на другой адрес - сейчас можно этот подход несколько упростить и сделать более логичным, задавая адрес перескока не тремя тритами устанавливающими старшие 3 трита из 6, а скажем четырьмя, причём все 4 трита будут использованы для адресации микропрограмм (при этом простейшие микропрограммы будут расположены по адресам Oxxx).
Например по адресу ONNN в памяти микропрограмм будет микропрограмма для инструкции SAN (сохранить A по адресу DPn):
- установить на шине адреса 9-тритное значение из DPn
- выложить на шину данных 3-тритное значение из A и сформировать строб записи
далее будет общая часть для всех окончаний микропрограмм:
- установить на шине адреса 9-тритное значение проинкрементированного PC либо 9-тритное значение из TP (для инструкций передачи управления)
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0
и т.д.
Микропрограмма для выполнения инструкции ADD должна быть расположена по адресу OONO:
- подключить второй вход сумматора к регистру B (первый вход всегда будет запитан от регистра A)
- запомнить выход сумматора (T2 для суммы и T3 для флагов?)
- записать сохранённые данные в регистры A и F
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0
В случае ADI микропрограмма по адресу OOOO должна сделать чуть больше, чем микропрограмма для ADD:
- подключить второй вход сумматора к регистру Т1 (первый вход всегда будет запитан от регистра A)
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать следующую триаду в регистр T1
- запомнить выход сумматора (T2 для суммы и T3 для флагов?)
- записать сохранённые данные в регистры A и F
- установить на шине адреса 9-тритное значение проинкрементированного PC
- сформировать строб чтения из памяти, чтобы прочитать код следующей инструкции в регистр T0
- выполнить следующую микропрограмму начиная с адреса O|T0
Одна строчка тритов микроинструкции должна описывать то, что надо сделать за 3 периода тактовой пилы (или синусоиды) - простые инструкции типа SAN должны уложиться в одну микроинструкцию, а вот ADD наверное уже не уложится т.е. из первой микроинструкции этой микропрограммы надо будет перескочить за пределы зоны Oxxx для выполнения остальных микроинструкций этой микропрограммы. Перескок, как я уже писал выше, будет происходить на 4-тритный адрес в памяти микропрограмм - можно скажем принять, что если адрес перескока Oxxx, то это означает перескок на O|T0 (и для 3niti beta наверное можно поддержать спец.значение Nxxx, означающее перескок на N|T1 если старший трит регистра T1 равен N - это для реализации новых инструкций), а перескоки на Pxxx будут брать все 4 трита из кода микроинструкции (также все 4 трита будут браться в случае Nxxx когда старший трит регистра T1 был не равен N, т.е. был равен O или P).
P.S. Хотя всё-таки вычитка инструкции из памяти должна быть в начале цикла, а не в конце - простейшая микропрограмма в одну микростроку может выглядеть примерно так:
- прочитать триаду с шины данных (нужный PC к этому моменту уже должен быть подключен к шине адреса) и защёлкнуть её в регистре T0
- передать управление на адрес микропрограммы O|T0
- подключить регистр источник и регистр приёмник к внутренней шине данных
- осуществить строб записи для сохранения необходимых данных и если надо флагов, а также обновить PC (в общем случае инкрементировать)