Компьютер Tryte-I

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Компьютер Tryte-I

Post by Shaos »

Давайте пообсуждаем гипотетический 6-тритный компьютер Tryte-I (один трайт может иметь 729 состояний).
Шина адреса - 12 тритов (2 трайта или trord, адресующее 531441 ячеек).
Регистров скажем 27 (адресуются тремя тритами), которые можно обозвать латинскими буквами от A до Z плюс @ для косвенной адресации.
Думается по смыслу оно должно быть близким к 8080 - предлагайте опкоды ;)

P.S. Опкоды буду писать сюда по мере поступления предложений и идей:

 2015
Первоначальный вариант 2015 года (устарело):

Code: Select all

везде ниже 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 в любой регистр).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Из-за тяжеловесности предполагается делать его на FPGA или CPLD, а память будет на SIMM30 1MB, причём половина памяти будет являться видеопамятью с четырьмя страницами 320x200 (для цветного NTSC, а потом можно и VGA прикрутить).
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Shaos wrote:Давайте пообсуждаем
...
Регистров скажем 27 (адресуются тремя тритами), которые можно обозвать латинскими буквами от A до Z плюс @ для косвенной адресации.
Думается по смыслу оно должно быть близким к 8080 - предлагайте опкоды ..
Чтоб отличать от двоичных лучше числами и греческими буквами - но (!) память адресовать положительными числами
, а регистры - отрицательными : (-1)(-2)(-3)(-4)(-5)(-6)(-7)(-8)(-9)(-α{альфа})(-β{бета})(-γ{гамма})(-δ{дельта})(-ε{епсилон})(-ζ{зита})(-η{эта})(-θ{θэта})(-ι{йота})(-κ{каппа})(-λ{лямбда})(-μ{мю})(-ν{ню})(-ξ{кси})(-ὂ {омикрон})(-π{пи})(-ρ{ро})(-σ{сигма})

Но вот 8080 это не самый лучший оборзец для подражания (IMHO)
Лучше сразу ориентироваться на архитектуру либо типа VAX либо типа RISC ( тоже IMHO )
А то потом придётся паки "костыли" изобретать ..
Единственное, что просто сразу очевидно - команды ветвления будут использовать не отдельно "плюс/минус" и "нуль" флаги, а однотритовый флаг "минус/нуль/плюс"
( gabelt unter der Bedingung "minus/zero/plus" --> gaBmzp {zu #adr} - как Вам такой оп.код ? :D )
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Если память положительнымм, а регистры отрицательными, то ведь сразу же половина памяти пропадёт ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Компьютер Tryte-I

Post by Lavr »

Расскажи лучше, как в троичном компьютере предполагается реализовать условные переходы.

На всех популярных сайтах, посвященных троичности, обычно на примере задачи о взвешивании
говорят о преимуществе троичности перед двоичностью как раз в операциях сравнения.
(При этом для двоичности рисуют убогие весы, отклоняющиеся только в одну сторону...)

А я что-то не представлю, какой выигрыш даёт троичность, при условии, что программа в обоих
случаях выполняется линейно.
iLavr
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Попробуем быть справжними теоретиками-фантазёрами .. (ну то есть проведём мысленный эксперимент)
Представим, что у нас уже есть троичный процессор, есть троичный порт ввода и вывода
и попробуем сделать вместе со всем этим ещё и аппаратно-программный троичный АЦП последовательного приближения.
Тогда как раз наверное и будет на каждой итерации после {проверить текущий диапазон} наглядное ветвление на : {обработать диапазон значений выше} , {обработать средний диапазон значений} , {обработать диапазон значений ниже}

Можно надеяться, что при измерении ,ну например, от -12.15v. до +12.15v. с точностью лучше [половины м.з.р.]==0.05v. понадобится всего пять итераций в отличие от восьми при двоичном .. ? :-?
..
Ну как то так.. :rotate:
Last edited by petrenko on 22 Sep 2015 08:51, edited 1 time in total.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Компьютер Tryte-I

Post by Lavr »

Shaos wrote:Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >
Видимо, имеется... :D

Ну и как он примерно должен выглядеть конкретно в ассемблере и кодах?
iLavr
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Ну что то вроде :
gaBmzp {zu #adr(hoche)} {zu #adr(mittel)} {zu #adr(niedrig)}

( zu bewegen hoher oder mittel oder niedrig Reichweite )
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Lavr wrote:
Shaos wrote:Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >
Видимо, имеется... :D

Ну и как он примерно должен выглядеть конкретно в ассемблере и кодах?
У меня в 3niti alpha выглядел как установка трёх адресов в спец-регистрах и одна команда, которая пересылает в PC содержимоего одного из этих трёх регистров в соответствии с состоянием троичного флага

В более продвинутом проце можно сделать задание двух адресов после команды перехода - адрес если < потом адрес если > а если равно, то никуда не переходить и идти дальше - вобщем как-то так...
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Возможна масштабируемая команда типа "VAX"-овской "CASE" , которая в простейшем случае однотритного первого операнда будет ветвлением на три направления.
то есть :
для однотритного флага :
CASE 3*(==3^1**) @var #adr[-] #adr[+]
, **_где 1**- длина L проверяемой переменной, 3* - количество вариантов N ( может быть в диапазоне 3^(L-1)<N<3^(L) ) ,а @var- указатель на проверяемую переменную - в случае указания @var на однотритовый флаг алу - заменимо другой мнемоникой - хоть той же благозвучной gaBmzp .. :lol: [/size]

для ( например ) трёхтритной переменной :
CASE 27(==3^3) @var #adr1 #adr2 #adr3 #adr4 #adr5 #adr6 #adr7 #adr8 #adr9 #adr10 #adr11 #adr12 #adr13 #adr14 #adr15 #adr16 #adr17 #adr18 #adr19 #adr20 #adr21 #adr22 #adr23 #adr24 #adr25 #adr26 #adr27
..
..
Ну а CASE 19683(==3^9) @var ....... полностью писать пожалуй не буду .. :D
Last edited by petrenko on 24 Sep 2015 15:45, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Да - можно такое поддержать т.к. я планирую микродом всё делать т.е. инструкции могут быть произвольной сложности и произвольной длины, потому что в любом случае они будут реализованы микропрограммами
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Рад, что хоть чуток полезного оказалось среди моих теоретических мечтаний. :rotate:

А раз микрокодом, то хорошо бы предусмотреть так же, как и у вакса ( забыл какой модели ) ,доп. память микрокодов для микрокоманд пользователя. Там это были ( кажется ) 256 80-битных ячеек. А тут можно ( например ) 243 81-тритные ячейки.. И расположить сей блок по отрицательным адресам меньше (-36410) например..
А где-нибудь ещё дальше расположить память пультового режима .... :rotate: ( эк ужо размечтался ... )

Кстати, а будут всякие авто[де/ин]крементные адресации ? ( ну типа @SP+ )
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Компьютер Tryte-I

Post by Shaos »

Можно и пользовательские микропрограммы иметь, и инкремент-декремент :)

P.S. Единственное ограничение - количество опкодов, которых может быть только 3^6=729 (т.е. я не хочу никаких префиксов, которые меняют смысл далее идущих кодов - другими словами никаких зайлогизмов ; )
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Компьютер Tryte-I

Post by petrenko »

Я вот, обчитавшись тем об 4-битных процессорах, понял, что может хватить совсем небольшого количества команд.
Но (!) команды должны тогда быть масштабирумы, то есть после к.оп. идёт обрабатываемая структура данных переменного типа и длины - примерно так :
[код операции] {количество операндов} {тип операндов}&{длина операндов} {d1} {d2} ..

Для операций а.л.у. тогда вообще достаточно одного к.оп. , а какое действие над данными будет производить а.л.у. - определяет тип данных - то есть если это {"слагаемые"} ,то будет ADD , если {"множимые"} ,то ,соответственно, MUL и т.д.
В мнемониках это может выглядеть примерно так :

ALU 3 long_integer_add @reg("ZITA") @reg("EPSILON") @reg("DELTA") ;будет складывать три длинных целых операнда, адреса которых лежат в регистрах "зита" , "эпсилон" и "дельта"
ALU 2 short_integer_mul reg("ALPHA") reg("BETA") ;будет перемножать два коротких целых операнда, которые сами лежат в регистрах "альфа" и "бета"