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

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

Moderator: haqreu

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

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

Post by Shaos »

petrenko wrote:Я вот, обчитавшись тем об 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") ;будет перемножать два коротких целых операнда, которые сами лежат в регистрах "альфа" и "бета"
ну по идее так у всех процов и есть, только конкретные совокупности командных битов принято называть опкодами :)

возвращаясь к архитектуре Tryte-I - имеет ли смысл иметь непосредственный доступ к регистрам SP и PC либо достаточно наличия команды записи и чтения их в какую-то регистровую пару (например YZ)?
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

Shaos wrote:... возвращаясь к архитектуре Tryte-I - имеет ли смысл иметь непосредственный доступ к регистрам SP и PC либо достаточно наличия команды записи и чтения их в какую-то регистровую пару (например YZ)?
petrenko wrote:... Но вот 8080 это не самый лучший оборзец для подражания (IMHO) ...
Вообще то только PC сложновато "уравнять в правах" со всеми РегистрамиОбщегоНазначения - он даже в DEC-рвских архитектурах особнячком.
А SP можно назначить любой РОН - ибо команды PUSH POP суть просто MOV | ST/LD | c пред/пост-ин/де-крементом регистра, например вот так назначаем указателем стека R14 :
MOV R2 --> @(-(R14) ) ; может иметь синоним PUSH R2
MOV @( (R14)+) --> R2 ; может иметь синоним POP R2

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

Кстати, для единообразия и удобства подправил CASE - не разрядность проверяемого, а количество вариантов указал - то есть не CASE 3 ... ,а CASE 27 - так проще - можно диапазон вариантов брать 4 .. 27 ,а УстройствоУправления будет сразу "знать" на сколько продвинуть конвейер команд при несовпадении ни с одним из условий ..
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

@(-(R14)) выглядит пугающе...

P.S. Короче будем пушать и попать парами - AB,CD,...,YZ (13 пушей и 13 попов).
Последняя пара YZ (точнее её содержимое) будет адресом, по которому будет читаться-писаться виртуальный регистр @ (по аналогии с регистром M в 8080, который ссылался на байт памяти с адресом HL).
Регистры SP и PC будут спрятаны.
Регистр PC можно будет записать из YZ командой PCYZ (по аналогии c PCHL в 8080).
Регистр SP можно будет записать из YZ командой SPYZ (по аналогии c SPHL в 8080).

P.P.S. В первом посте можно посмотреть что предлагается вместо PCYZ и SPYZ, также предложен путь добавления ещё одного способа косвенного обращения - не только через пару YZ, но и через пару AB
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

В частной переписке petrenko подсказал интересную идею - можно явно разделить команды и данные (скажем буквы/цифры) - например команды могут быть всегда отрицательными трайтами (и нулевая команда будет NOP), а в случае положительного трайта мы интерпретируем его как символ ASCII-кода (больше 0, но меньше 256) либо как какой-то высокоуровневый код (>=256 - тэг бейсика?). Например, если исполняющее устройство встречает положительный трайт, то оно его добавляет в некий строковый буфер и идёт дальше, пока не встретит отрицательный трайт, который либо сбросит буфер, либо что-то с ним сделает. Таким образом можно из кода вводить числа (на подобие старых советских калькуляторов) либо делать передачу управления по именам, а не по адресам (типа шитый код аля-форт) - понятно, что будет чуть дольше, но зато какое удобство программирования!
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

Shaos wrote:.. а в случае положительного трайта мы интерпретируем его как символ ASCII-кода (больше 0, но меньше 256*) либо как какой-то высокоуровневый код (>=256** - тэг бейсика?). Например, если исполняющее устройство встречает положительный трайт, то оно его добавляет в некий строковый буфер и идёт дальше, пока не встретит отрицательный трайт, который либо сбросит буфер, либо что-то с ним сделает. Таким образом можно из кода вводить числа (на подобие старых советских калькуляторов) либо делать передачу управления по именам, а не по адресам (типа шитый код а-ля-форт) - понятно, что будет чуть дольше***..
*_ASCII это американский, а тут троичный, так что надо бы по хорошему именовать хоша б TSCII и ограничить 243 ..
Например :
0 1 2 3 4 5 6 7 8 9 αsystem&ternary+ βsystem&ternary+ γsystem&ternary+ δsystem&ternary+ ε ζ .... η θ ι κ λ μ ν ξ ὂ π ρ

σ τ ύ φ χ .... ψ ω " # $ % & ` ( ) * + , - . / .... 010 110 210 310 410 510

610 710 810 910 : ; < = > ? ... @ a b c d e f g h i j k l m n o .... p

q r s t u v w x y z [ \ ] ^ _ .... !
a вот тут уже надо подумать что дальше ( есть одна мысля, чуток позже оформлю :wink: ) ..

**_А это - да - всё же >255 для совместимости и упрощения переноса п.о. . Но подумать на досуге чем полезным потом заполнить зарезервированный диапазон 243..255 . Возможно разместить отрицательную часть системных цифр ( ? ) :
αsystem&ternary- βsystem&ternary- γsystem&ternary- δsystem&ternary-

***_Если фрагменты поддержки ФОРТ-а и ЛИСП-а реализуете в микропрограммах - наоборот будет быстрее (и удобнее ) .
И необязательно отдельные буферы - можно один конвейер( это как бы хитрый сдвиговый регистр, самотегируемый ) логически "видеть" как два .. :rotate:
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

Shaos wrote:... возвращаясь к архитектуре Tryte-I - имеет ли смысл иметь непосредственный доступ к регистрам SP и PC .. ?
Понаблюдав недавно за "мастер-классом" работы некоторых сурьёзных гуру на микро-ваксе,
подумал, что "непосредственный доступ к регистрам SP и PC " наверное таки нужен, но токмо в режимах О.(п
ерационной)
С.(истемы) и пульта.
Копиравать , кстати, в некие YZ необязательно, можно просто менть местами типа : ex SP1<->IX , ex SP2<->IY
( А если регистры все равноправные, то собственно и с IY можно делать "пугающие"( :o ) операции типа MOV @((IY)++)-->PC ( синоним RET ,где в качестве SP выступает IY ) )
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

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

Post by Paguo-86PK »

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

Так как вместо «-1»/«0»/«+1» условились использовать «N»/«O»/«P», то код операций автоматически будет складываться в $.
Тем самым, операции «nop» логично было бы и выделить код «NOP».
Тогда как операции «pop» логично соответственно дать код «POP».

Code: Select all

Регистры:
-13 -12 -11 -10 -9  -8  -7  -6  -5  -4  -3  -2  -1   0  +1  +2  +3  +4  +5  +6  +7  +8  +9  +10 +11 +12 +13
NNN NNO NNP NON NOO NOP NPN NPO NPP ONN ONO ONP OON OOO OOP OPN OPO OPP PNN PNO PNP PON POO POP PPN PPO PPP
'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '@' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M'

Инструкции:
NNN reg:DEC  reg; Нечётный индекс регистра
    VEC:DEC  vec; Чётный индекс регистровой пары (вектора)
    ooo:HLT     ; Декремент указателя инструкций
NNO rgi:MVI  r,i; Присвоение регистру непосредственных данных
NNP reg:MOV  reg; Загрузка аккумулятора в регистр
NON reg:NON  reg; Инверсия регистра
NOO reg:CMP  reg
NOP cnd:cnd     ; Следующая операция условно будет холостой - прочитана без исполнения
    nop:NOP     ; Код операции является и мнемоникой
NPN ---:
NPO reg:LD   reg; Загрузка из памяти в регистр
    ooo:LD      ; Загрузка из памяти в аккумулятор
NPP ---:
ONN reg:SHR  reg
ONO reg:SBB  reg
ONP reg:AND  reg
OON reg:SUB  reg; Позиция «-1»
OOO idx:INT  idx; Пусть обработчик прерывания разбирается
OOP reg:ADD  reg; Позиция «+1»
OPN reg:OR   reg
OPO reg:ADC  reg
OPP reg:SHL  reg
PNN ---:
PNO reg:ST   reg; Запись из регистра в память
    ooo:XC      ; Обмен аккумулятора с памятью
PNP ---:
PON vec:DST  vec; Нечётный индекс регистровой пары (вектора) приёмника памяти
    VEC:SRC  vec; Чётный индекс регистровой пары (вектора) источника памяти
    ooo:XCHG    ; Обмен указателей двух векторов
POO dsp:JMP  $±n; Относительный переход с нечётным смещением ±4919
    DSP:CALL $±n; Вызов подпрограммы с чётным смещением ±4920
    OOO:RETI
POP vec:POP  vec; Нечётный индекс регистровой пары (вектора)
POP VEC:PUSH vec; Чётный индекс регистровой пары (вектора)
    ooo:RET
PPN reg:ACC  reg; Выбор регистра под аккумуляцию
PPO Dsp:PUSH ±n ; Помещение в стек целого числа
PPP vec:INX  vec; Нечётный индекс регистровой пары (вектора)
    REG:INC  reg; Чётный индекс регистра
    ooo:INTO    ; Прерывание по переполнению
Пример программы:

Code: Select all

000000:PON_OPO ---/JC -- --:DST  BC ;Выбор BC в качестве приёмника
000001:PON_PON ---/HH -- --:SRC  HI ;Выбор HI в качестве источника
000002:PPN_OOP ---/KA -- --:ACC  A  ;Выбор A в качестве аккумулятора
000003:NPO_OOO ---/U@ -- --:LD      ;Чтение из памяти по вектору HI в аккумулятор
000004:PNO_OOP ---/FA -- --:ST   A  ;Запись регистра A в память по вектору BC
000005:PPP_OPO ---/MC -- --:INX  BC
000006:PPP_POP ---/MJ -- --:INX  HI
000007:NNN_NNO ---/NO -- --:DEC  O
000008:NOP_OON ---/SZ -- --:DZ      ;Условие Zero
000009:    POP_OOO/J@ -- --: RET    ;Возврат под условием
000010:POO($-9)   /IX -9   :JMP  3  ;Переход
000013:...
Last edited by Paguo-86PK on 14 Nov 2018 06:01, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

8080 тяжеловат будет
Я тут за главного - если что шлите мыло на me собака shaos точка net
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

.. i8080 тяжеловат ..
Да, тяжеловат, пожалуй.
Многовато регистров
, да и команд можно поменьше, ну не то, чтоб прямо risc , но поменьше .

Кстати, "зайлогизмы"( прикольное словообразование) не все одинаково безполезны.
Полагаю идея малоразряядного а.л.у. , которое обрабатывает данные в несколько микроциклов - очень даже полезная.

Например : одно-триббловое а.л.у.( 3 трита :ewink: ) обрабатывает некий регистр B ,у которого длина 9 трит и результат кладёт в память по адресу из регистра IY ,у которого длина 27 трит c пост-инкрементогом ентого IY ...
В мнемониках можно написать как то навроде : M( @(IY)+ ) <- SUB(A,B)

Главное перимущество подхода в том, что
не разширяя систему команд излишне и не утяжеляя аппаратную часть
можно будет обрабатывать в едином стиле данные разных типов с контролем типов и защит и разной длины ( кратной 3 тритам )
Аппатарно реализуется вполне экономно : в предпоследнем регистре конвейера команд
часть триггеров, в которые попадает поле из к.оп. , указывающее длины операндов,
переписываются в вычитающий счётчик микроциклов.
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

Shaos wrote:.. положительный .. добавляет в некий строковый буфер ..
..
.. (типа шитый код аля-форт) ..
..
.. удобство программирования ..
Подумал над обоими вариантами конвейера - совместного и раздельного.
Прихожу к выводу, что ... :egeek: ... лучше всего совместно-раздельный.
Это примерно так : первые две "ступеньки" конвейера совместные, то, что в них попадает подвергается первичной проверке по типу.
Далее разветвление - в команды / в "некий строковый буфер" .
Команды поэтапно дешифруются по полям и при этом ещё и продвигаются
( то есть каждая следующая "ступенька" у к.к. шире предыдущей, потому как разные узлы надо настраивать в разные микроциклы - например ключи-коммутаторы, выбирающие что подать на алу, сначала, а например коммутаторы, выбирающие куда положить результат - уже после отработки алу .. и т.п. )
То, что попадает в "некий строковый буфер" подвергается ещё проверке на длину и тип и может быть или обработано алу или обработано дешифратором( если это кодовое"как-бы-слово" ) или в нужный микроцикл скопировано в индексный регистр( если это "пойнтер" ).
Как то так ..
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

Компьютер Tryte-I… Есть идея

Post by Paguo-86PK »

AlexanderZh wrote:Ну элементарное же решение напрашивается! Все "адресные" регистры (типа указателя команд или данных) инициализируются наименьшим отрицательным и ползут вверх, прочие регистры - нулем (для математики проще). Всё. Проблема решена. Процессор оперирует в сбалансированной системе.
A если указатели с отрицательным значением сделать стек-подобными?
То есть, если «ST = -100», то при «[ST]» предоставляет доступ к памяти с автоматическим инкрементом/декрементом при чтении/записи не потому, что имя указателя «ST», а лишь из-за значения меньше нуля.

Для адресного пространства троичного компьютера усечение адресации в половину не так страшно, как для двоичного…
Тем самым, вектор «[+100]» и «[-100]» адресуют одну ячейку памяти, но «МИНУС» указывает на магазинный тип доступа…
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

Простите, коллега "Пагуо-86пк" но Вы когда-нибудь минимизировали какие-нибудь "железные" схемы ?

Я ,знаете Ли, могу понять тягу некоторых художников к огромным картинам с неверотным количеством мелких деталей.
Но не во всех сферах деятельности есть такие роскошные возможности.

И Вы не пробовали ( хотя бы ознакомительно ) посмотреть на архитектуры других машин ?
Складывается ,извините, впечатление, что кроме i8080 Вы о других разве что слыхали случайно, что таковые тоже где то там сущетвуют.

Взгляните на досуге на команды "DEC"-овских машин. В той же школьной "БК-0010Ш" как раз такая система команд.
( хотя лично мне больше нравится система VAX ,в том числе и из-за неудобства восмеричной записи PDP/LSI )
Там есть обращения к памяти по адресу, берущемуся из регистра с пред-/пост- инкрементом/декрементом регистра.
Что позволяет кроме системного стека ( указателем оного работает R6 ) программировать ещё до 5 пользовательских стеков.

То есть совершенно незачем городить городулю - таковую было бы "прикольно" соорудить например, прикошачив доп.внешние регистры к тому же i8080 для организации пользовательских стеков в любом колиестве ( у 8080 есть только один стек через SP )
В заново проектируемых это как то ..

2 : "AlexanderZh" : Поправьте пожалуйста "очепатку" - наименьшее отрицательное чило в математике не существует , а в машинах определяется доступной разрядностью опперандов. :ewink:
Last edited by petrenko on 14 Nov 2018 14:12, edited 1 time in total.
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

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

Post by petrenko »

AlexanderZh wrote:... По моему мнению лучше иметь некий флаг, чем ограничивать адресное пространство ...
Соглашусь с Вашим мнением.
Тем паче, что таковым флагом может "подрабатывать по совместительству на пол-ставки" один из триггеров в ковейере команд.
( именно так и обстоит дело в PDP/LSI и VAX ,а уж будет ли сей флаг двоичным/троичным/четверичным, да хоть пятеричным - непринципиально
, прото обзовём сей кусочек "железячки" соотв. "двиггер"/"триггер"/"четвериггер"/"пятериггер" ... :mrgreen: <-щютка_юмора , {к.с.=="лопата"} )
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:В частной переписке petrenko подсказал интересную идею - можно явно разделить команды и данные (скажем буквы/цифры) - например команды могут быть всегда отрицательными трайтами (и нулевая команда будет NOP), а в случае положительного трайта мы интерпретируем его как символ ASCII-кода (больше 0, но меньше 256) либо как какой-то высокоуровневый код (>=256 - тэг бейсика?). Например, если исполняющее устройство встречает положительный трайт, то оно его добавляет в некий строковый буфер и идёт дальше, пока не встретит отрицательный трайт, который либо сбросит буфер, либо что-то с ним сделает. Таким образом можно из кода вводить числа (на подобие старых советских калькуляторов) либо делать передачу управления по именам, а не по адресам (типа шитый код аля-форт) - понятно, что будет чуть дольше, но зато какое удобство программирования!
По прошествии почти пяти лет поменял таки систему команд для поддержки такого варианта (см. первое сообщение этого топика) - т.е. мы будем как в калькуляторах писать символы друг за другом и они при этом будут выводиться на экран (если флаг вывода N), будут читаться подпрограммой прямо из кода (если флаг вывода O - при этом все ASCII инструкции будут просто пропускаться) или будут передаваться в сеть (если флаг вывода P) - причём я планирую задействовать практически все символы управления ASCII (с кодами до 31), а таблица букв будет расширена до кода 283 POPPPP...

P.S. Кстати с октября 2015 у меня есть домен http://tryte.one :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Примеры кода - вывод текста на экран:

Code: Select all

'H'
'e'
'l'
'l'
'o'
или даже просто вот так:

Code: Select all

"Hello"
Передача строки в подпрограмму:

Code: Select all

TEXT "Hello",0 ; ноль в конце это тоже самое, что и инструкция NOP
CALL sub ; при вызове в YZ будет адрес строки, записанный туда инструкцией TEXT
Передача строки получателю с индексом 1:

Code: Select all

MVI A,1
EM "Hello"
EOT ; End of Transmission переведёт текстовый режим вывода обратно в вывод на экран
По флагам пока 3 штуки набралось:

trit 0 - flagC (флаг заёма-переноса, который в 3niti alpha назывался BCF);
trit 1 - flagS (флаг знака результата, который в 3niti alpha назывался RSF);
trit 2 - flagT (флаг режима вывода текста - см.выше);

и ещё осталось место для 3 флагов...
Я тут за главного - если что шлите мыло на me собака shaos точка net