Давайте пообсуждаем гипотетический 6-тритный компьютер
Tryte-I (один трайт может иметь 729 состояний).
Шина адреса - 12 тритов (2 трайта или
trord, адресующее 531441 ячеек).
Регистров скажем 27 (адресуются тремя тритами), которые можно обозвать латинскими буквами от A до Z плюс @ для косвенной адресации.
Думается по смыслу оно должно быть близким к 8080 - предлагайте опкоды
P.S. Опкоды буду писать сюда по мере поступления предложений и идей:
2015 Первоначальный вариант 2015 года (устарело):
| | |
| Code: везде ниже rrr - регистр (NNN для A, NNO для B, ...,PPO для Z, PPP для @, если не указано "вместо"); <0 - микропрограммы пользователя: Nxx xxx - однотрайтовые команды; Onn xxx - команды, требующие nn трайтов после себя в качестве аргументов (OO=0,ON=1,NP=2,NO=3,NN=4) >=0 - реализованные или зарезервированные микропрограммы: OOO OOO (0) - NOP (нет операции); OOO OOP (1 T) - MOV d,s (2-трайтовая команда копирования содержимого любого регистра в любой другой регистр, но вместо A используется содержимое памяти по адресу AB, а MOV @,@ это HLT); OOO OPN (2 T) - MOVP d,s (2-трайтовая команда копирования содержимого любой пары регистров в любую другую пару, но вместо Z используется SP, а вместо @ - PC); OOO OPO (3 TT) - CALL TT (вызов подпрограммы по адресу TT); OOO OPP (4) - RET (возврат из подпрограммы); OOO PNN (5) - XCHG (поменять местами AB и YZ); OOO PNO (6) - SWAP (поменять местами половинки аккумулятора A); OOO PNP (7) OOO PON (8) OOO POO (9) OOO POP (10) OOO PPN (11) OOO PPO (12) OOO PPP (13) OOP rrr (14...40) - MOV A,rrr (однотрайтовая команда копирования из любого регистра в аккумулятор, для rrr=-13 вместо A используется регистр флагов FL); OPN rrr (41...67) - MOV rrr,A (однотрайтовая команда копирования содержимого аккумулятора в любой регистр, для rrr=-13 вместо A используется регистр флагов FL); OPO rrr (68...94) - CLR rrr (однотрайтовая команда обнуления любого регистра); OPP rrr (95...121) - PUSH/POP rrr (положить на стек / вытащить из стека регистровую пару AB,CD,....YZ, но при rrr=13 это будет PUSH PC?); PNN rrr (122...148 T) - MOVI rrr,T (запись трайта в любой регистр); PNO rrr (149...175 TT) - MOVPI rrr,TT (запись двухтрайтового слова в любую регистровую пару, но для rrr=12 вместо Z используется SP, а для rrr=13 вместо @ - PC, т.е. MOVPI @,TT это JMP TT);
| |
| | |
UPDATE (MAY 2020):везде ниже rrr - регистр (NNN для A, NNO для B, ...,PPO для Z, PPP для @ что есть ячейка памяти с адресом YZ, если не указано "вместо"):
Nnn xxx (-364...-122) - 243 микропрограммы пользователя где nn задаёт количество аргументов (NN...OO=0, OP=1, PN=2, PO=3, PP=4)
ONN rrr (-121...-95) - MOV rrr,A (однотрайтовая команда копирования содержимого аккумулятора в любой регистр, для rrr=-13 вместо A используется регистр флагов);
ONO rrr (-94...-68) - CLR rrr (однотрайтовая команда обнуления любого регистра);
ONP rrr (-67...-41) - MOV A,rrr (однотрайтовая команда копирования из любого регистра в аккумулятор, для rrr=-13 вместо A используется регистр флагов);
OON rrr (-40...-14) - ADC rrr (однотрайтовая команда складывающая A с любым регистром, учитывает flagC и устанавливает flagC и flagS);
OOO NNN (-13) - RECV (получить извне символ в регистр B и при успешном получении идентификатор источника будет сохранён в A);
OOO NNO (-12) -
OOO NNP (-11) -
OOO NON (-10) - RLC (сдвиг регистра A влево через flagC);
OOO NOO (-9) - SWAP (поменять местами половинки регистра A);
OOO NOP (-8) - RRC (сдвиг регистра A вправо через flagC);
OOO NPN (-7) - DCYZ (декремент регистровой пары YZ);
OOO NPO (-6) - XCHG (поменять местами регистровые пары WX и YZ);
OOO NPP (-5) - INYZ (инкремент регистровой пары YZ);
OOO ONN (-4) - SCN (установить flagC=N);
OOO ONO (-3) - SCO (установить flagC=O);
OOO ONP (-2) - SCP (установить flagC=P);
OOO OON (-1) - USER (установка пользовательской микропрограммы с адресом AB и кодом инструкции C);
OOO OOO (0) - NOP (нет операции, а также конец сообщения, flagT=N);
OOO OOP (1 T) - SETX x (поменять координату X для следующего символа);
OOO OPN (2 T) - SETY y (поменять координату Y для следующего символа);
OOO OPO (3) - TEXT (запомнить адрес следующей инструкции в регистровой паре YZ и перевести режим обработки текста в нулевой flagT=O);
OOO OPP (4) - EOT (End of Transmission - конец передачи, flagT=N);
OOO PNN (5) - ENQ (Enquiry - запросить ответ);
OOO PNO (6) - ACK (Acknowledge - подтвердить получение);
OOO PNP (7) - BEL (Bell '\a' - короткий звуковой сигнал);
OOO PON (8) - BSP (Backspace '\b' - сдвинуть курсор назад на 1 позицию);
OOO POO (9) - TAB ('\t' - горизонтальная табуляция);
OOO POP (10) - LF (Line Feed '\n' - перевод строки);
OOO PPN (11) - VT (Vertical Tab '\v' - вертикальная табуляция);
OOO PPO (12) - FF (Form Feed '\f' - конец страницы);
OOO PPP (13) - CR (Carriage Return '\r' - возврат каретки);
OOP NNN (14) - SO (Shift Out - сменить знакогенератор на альтернативный);
OOP NNO (15) - SI (Shift In - вернуться к нормальному знакогенератору);
OOP NNP (16) - DLE (Data Link Escape - указывает, что далее идёт трайт данных);
OOP NON (17) - DC1 (Device Control 1 - специфическая для устройства команда);
OOP NOO (18) - DC2 (Device Control 2 - специфическая для устройства команда);
OOP NOP (19) - DC3 (Device Control 3 - специфическая для устройства команда);
OOP NPN (20) - DC4 (Device Control 4 - специфическая для устройства команда);
OOP NPO (21) - NAK (Negative Acknowledge - отрицательный ответ);
OOP NPP (22) - SYN (Synchronous Idle - синхронизация без сообщений);
OOP ONN (23) - ETB (End of Transmission Block - конец блока в сообщении либо конец параграфа);
OOP ONO (24) - CAN (Cancel - отменить предыдущее сообщение);
OOP ONP (25) - EM (End of Medium - может обозначать отступ в начале параграфа, но в нашем случае можно использовать как старт внешнего сообщения на адрес A с установкой flagT=P);
OOP OON (26) - EOF (End of File - конец файла в CP/M и DOS, но в оригинальном ASCII это называлось SUB);
OOP OOO (27) - ESC (Escape - включает режим специальных последовательностей?);
OOP OOP (28) - FS (File Separator - разделитель верхнего уровня);
OOP OPN (29) - GS (Group Separator - разделитель среднего уровня);
OOP OPO (30) - RS (Record Separator - разделитель уровня записей);
OOP OPP (31) - US (Unit Separator - разделитель нижнего уровня);
OOP PNN (32) ... POP PPP (283) - n (ввести букву в расширенной кодировке ASCII);
PPN NNN (284 T) - MOV d,s (2-трайтовая команда копирования содержимого любого регистра в любой другой регистр, но вместо A используется содержимое памяти по адресу AB, а MOV @,@ это HLT);
PPN NNO (285 T) - MOVP d,s (2-трайтовая команда копирования содержимого любой пары регистров в любую другую пару, но вместо Z используется SP, а вместо @ - PC);
PPN NNP (286 TT) - CALL adr (вызов подпрограммы по адресу TT);
PPN NON (287) - CALLAB (вызов подпрограммы по адресу AB);
PPN NOO (288 TT) - JMP adr (безусловная передача управления по адресу TT);
PPN NOP (289 T) - OPA xyz (произвольная унарная троичная операция над регистром A, устанавливающая flagS);
PPN NPN (290 TTT) - OPB xyzxyzxyz (произвольная бинарная троичная операция над регистрами A и B - результат сохраняется в A и устанавливается flagS);
PPN NPO (291 TTTTTT) - JMP3 an,ao,ap (условная передача управления в зависимости от состояния flagC);
PPN NPP (292 TTTTTT) - CALL3 an,ao,ap (условный вызов подпрограммы в зависимости от состояния flagC);
PPN ONN (293 TT) - CB adr (вызов подпрограммы если flagC=N);
PPN ONO (294 TT) - CNO adr (вызов подпрограммы если flagC=O);
PPN ONP (295 TT) - CC adr (вызов подпрограммы если flagC=P);
PPN OON (296) - RB (возврат из подпрограммы если flagC=N);
PPN OOO (297) - RNO (возврат из подпрограммы если flagC=O);
PPN OOP (298) - RC (возврат из подпрограммы если flagC=P);
PPN OPN (299 TT) - JB adr (передача управления если flagC=N);
PPN OPO (300 TT) - JNO adr (передача управления если flagC=O);
PPN OPP (301 TT) - JC adr (передача управления если flagC=P);
PPN PNN (302 TT) - CM adr (вызов подпрограммы если flagS=N);
PPN PNO (303 TT) - CZ adr (вызов подпрограммы если flagS=O);
PPN PNP (304 TT) - CP adr (вызов подпрограммы если flagS=P);
PPN PON (305) - RM (возврат из подпрограммы если flagS=N);
PPN POO (306) - RZ (возврат из подпрограммы если flagS=O);
PPN POP (307) - RP (возврат из подпрограммы если flagS=P);
PPN PPN (308 TT) - JM adr (передача управления если flagS=N);
PPN PPO (309 TT) - JZ adr (передача управления если flagS=O);
PPN PPP (310 TT) - JP adr (передача управления если flagS=P);
PPO rrr (311...337) - PUSH/POP rrr (положить на стек / вытащить из стека регистровую пару AB,CD,....YZ, но последний код будет означать POP PC т.е. RET);
PPP rrr (338...364 T) - MVI rrr,T (запись трайта T в любой регистр).