nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 26 Nov 2020 06:14



Reply to topic  [ 34 posts ]  Go to page 1, 2, 3  Next
Компьютер Tryte-I 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Давайте пообсуждаем гипотетический 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 в любой регистр).

_________________
:eugeek: https://twitter.com/Shaos1973


19 Sep 2015 23:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Из-за тяжеловесности предполагается делать его на FPGA или CPLD, а память будет на SIMM30 1MB, причём половина памяти будет являться видеопамятью с четырьмя страницами 320x200 (для цветного NTSC, а потом можно и VGA прикрутить).

_________________
:eugeek: https://twitter.com/Shaos1973


20 Sep 2015 06:57
Profile WWW
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
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 )


20 Sep 2015 13:48
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Если память положительнымм, а регистры отрицательными, то ведь сразу же половина памяти пропадёт ;)

_________________
:eugeek: https://twitter.com/Shaos1973


21 Sep 2015 07:11
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Расскажи лучше, как в троичном компьютере предполагается реализовать условные переходы.

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

А я что-то не представлю, какой выигрыш даёт троичность, при условии, что программа в обоих
случаях выполняется линейно.

_________________
iLavr


21 Sep 2015 10:42
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >

_________________
:eugeek: https://twitter.com/Shaos1973


21 Sep 2015 20:40
Profile WWW
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
Попробуем быть справжними теоретиками-фантазёрами .. (ну то есть проведём мысленный эксперимент)
Представим, что у нас уже есть троичный процессор, есть троичный порт ввода и вывода
и попробуем сделать вместе со всем этим ещё и аппаратно-программный троичный АЦП последовательного приближения.
Тогда как раз наверное и будет на каждой итерации после {проверить текущий диапазон} наглядное ветвление на : {обработать диапазон значений выше} , {обработать средний диапазон значений} , {обработать диапазон значений ниже}

Можно надеяться, что при измерении ,ну например, от -12.15v. до +12.15v. с точностью лучше [половины м.з.р.]==0.05v. понадобится всего пять итераций в отличие от восьми при двоичном .. ? :-?
..
Ну как то так.. :rotate:


Last edited by petrenko on 22 Sep 2015 09:51, edited 1 time in total.



22 Sep 2015 09:39
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >

Видимо, имеется... :D

Ну и как он примерно должен выглядеть конкретно в ассемблере и кодах?

_________________
iLavr


22 Sep 2015 09:51
Profile
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
Ну что то вроде :
gaBmzp {zu #adr(hoche)} {zu #adr(mittel)} {zu #adr(niedrig)}

( zu bewegen hoher oder mittel oder niedrig Reichweite )


22 Sep 2015 10:04
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
Ну видимо имеется ввиду условный переход по трём адресам - если <, = или >

Видимо, имеется... :D

Ну и как он примерно должен выглядеть конкретно в ассемблере и кодах?


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

В более продвинутом проце можно сделать задание двух адресов после команды перехода - адрес если < потом адрес если > а если равно, то никуда не переходить и идти дальше - вобщем как-то так...

_________________
:eugeek: https://twitter.com/Shaos1973


22 Sep 2015 10:09
Profile WWW
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
Возможна масштабируемая команда типа "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 16:45, edited 1 time in total.



22 Sep 2015 12:58
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Да - можно такое поддержать т.к. я планирую микродом всё делать т.е. инструкции могут быть произвольной сложности и произвольной длины, потому что в любом случае они будут реализованы микропрограммами

_________________
:eugeek: https://twitter.com/Shaos1973


22 Sep 2015 13:11
Profile WWW
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
Рад, что хоть чуток полезного оказалось среди моих теоретических мечтаний. :rotate:

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

Кстати, а будут всякие авто[де/ин]крементные адресации ? ( ну типа @SP+ )


22 Sep 2015 14:16
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18968
Location: Silicon Valley
Reply with quote
Можно и пользовательские микропрограммы иметь, и инкремент-декремент :)

P.S. Единственное ограничение - количество опкодов, которых может быть только 3^6=729 (т.е. я не хочу никаких префиксов, которые меняют смысл далее идущих кодов - другими словами никаких зайлогизмов ; )

_________________
:eugeek: https://twitter.com/Shaos1973


22 Sep 2015 14:25
Profile WWW
Doomed

Joined: 10 Mar 2012 17:21
Posts: 601
Location: РФ
Reply with quote
Я вот, обчитавшись тем об 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") ;будет перемножать два коротких целых операнда, которые сами лежат в регистрах "альфа" и "бета"


24 Sep 2015 05:29
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 34 posts ]  Go to page 1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.