
P.S. Под спойлером можно найти окончательную архитектуру 3niti alpha, оформившуюся к концу 2008 года:
P.P.S. В апреле 2023 года сложилось расширение этой архитектуры под названием 3niti beta: viewtopic.php?p=169510#p169510
Moderator: haqreu
Поддерживаю! Готов обсудить конкретные вопросы архитектурыShaos wrote:Предлагается создать простейший троичный компьютер, состоящий из комбинированных аналогово-цифровых модулей с троичным интерфейсом. Для начала реализовать 3 трехтритных регистра и обкатать на них основные троичные алгоритмы. Имя "Trinity" как мне кажется может привлечь интерес к проекту со стороны матрицофилов после опубликования материалов по нему в интернете. Жду откликов
Code: Select all
CS #NN (-4) Code Segment
PC #NO (-3) Program Counter
OP #NP (-2) Operator =[CS:PC] (?)
RF #ON (-1) Register F (RSF-ResultSignFlag|reserv|BCF-BorrowCarryFlag)
RA #OO (0) Register A (Accumulator)
RB #OP (1) Register B
RD #PN (2) Data =[DS:DP]
DP #PO (3) Data Pointer
DS #PP (4) Data Segment
Code: Select all
SAR #ONN (1-cell) Shift Accumulator Right using BCF
ADD #ONO (1-cell) Addition A=A+B+BCF
SAL #ONP (1-cell) Shift Accumulator Left using BCF
LCA t #OON #xxx (2-cell) Load Constant to Accumulator
NOP t #OOO #xxx (2-cell) Not Operation and Wait 't' ticks (?)
OPA t #OOP #xxx (2-cell) Operation (see below)
JRS tN tO tP #OPN #xxx #yyy #zzz (4-cell) Jump if RSF (N-xxx,O-yyy,P-zzz)
JMP tR tS tA #OPO #xxx #yyy #zzz (4-cell) Long Jump (tN=0, tS=Segment, tA=Address)
JBC tN tO tP #OPP #xxx #yyy #zzz (4-cell) Jump if BCF (N-xxx,O-yyy,P-zzz)
Только что заметил: OPA #NOP - это "нет операции" (оставить в регистре A все как есть и скушать у проца два цикла)Shaos wrote: Отдельно по поводу спецоперации OPA - эта команда покрывает все возможные побитовые (потритовые) операции, т.к. задает во второй ячейке правила преобразования каждого трита регистра A: левый трит задает результат операции, если трит был равен N, средний трит задает результат операции, если трит был равен O, правый трит задает результат операции, если трит был равен P. Например:
OPA #OOO - все триты регистра A принимают значение 0
OPA #PON - регистр A инвертируется (A=-A)
OPA #OPN - совершить над регистром A потритовую операцию "Shift Up" (см. http://www.trinary.cc)
Например короткий безусловный jump со смещением (-13...+13)Shaos wrote:Только что заметил: OPA #NOP - это "нет операции" (оставить в регистре A все как есть и скушать у проца два цикла)Shaos wrote: Отдельно по поводу спецоперации OPA - эта команда покрывает все возможные побитовые (потритовые) операции, т.к. задает во второй ячейке правила преобразования каждого трита регистра A: левый трит задает результат операции, если трит был равен N, средний трит задает результат операции, если трит был равен O, правый трит задает результат операции, если трит был равен P. Например:
OPA #OOO - все триты регистра A принимают значение 0
OPA #PON - регистр A инвертируется (A=-A)
OPA #OPN - совершить над регистром A потритовую операцию "Shift Up" (см. http://www.trinary.cc)![]()
Т.е. команду NOP (#OOO) можно заменить чем-то другим
Сильно, я про такое не подумалShaos wrote:Отдельно по поводу спецоперации OPA
Этот сайт снова недоступенсовершить над регистром A потритовую операцию "Shift Up" (см. http://www.trinary.cc)
Можно.Т.е. команду NOP (#OOO) можно заменить чем-то другим. Например короткий безусловный jump со смещением (-13...+13)
Давно такое хотел сделать - для бинарного процессора вообще предполагал разные операции над разными битами. Можно обкатать на тринарном когда одна и та же операция для всех - покрывает много чегоMac Buster wrote:Сильно, я про такое не подумалShaos wrote:Отдельно по поводу спецоперации OPA![]()
У меня доступен - я автору письмо кастати написал, сообщил ему, что собираюсь написать Java-эмулятор его квадратиковMac Buster wrote:Этот сайт снова недоступенсовершить над регистром A потритовую операцию "Shift Up" (см. http://www.trinary.cc)![]()
Ок - пусть будет так. Если смещение уходит за пределы сегмента - пока наверное будет исключение, а потом можно сделать аппаратное переключение в соседний сегмент.Mac Buster wrote:Можно.Т.е. команду NOP (#OOO) можно заменить чем-то другим. Например короткий безусловный jump со смещением (-13...+13)
Сдвиг есть. Сравнение - через вычитание (сложение с инвертированным слагаемым). Маскирование группы тритов - через произвольные потритовые операции.Mac Buster wrote:Я тут прикинул пару алгоритмов и пришёл к выводу что надо либо увеличить количество регистров общего назначения и сделать непрерывную модель памяти, либо вводить команды сравнения, сдвига, определения состояния отдельного трита и маскирования группы тритов. Иначе даже самые простае алгоритмы реализовать очень сложно.
Он с переносом, а нам нужен без переносаShaos wrote:Сдвиг есть.
Тогда придётся где-то прятать значение регистра а потом загружать его обратно.Сравнение - через вычитание (сложение с инвертированным слагаемым).
Похоже я не совсем понял их работу.Маскирование группы тритов - через произвольные потритовые операции.
Это уже какой то пик:)Shaos wrote:Вот как реализуется тройной условный переход:
LAN #ZNZ ; load A from number (Z is zero)
SAF ; save A to F
LDP PointerN ; set address for N
LAN #ZZZ ; load A from number
SAF ; save A to F
LDP PointerZ ; set address for Z
LAN #ZPZ ; load A from number
SAF ; save A to F
LDP PointerP ; set address for P
Далее идут операции, изменяющие флаги ASF или BCF.
Чтобы осуществить условный переход по состоянию флага ASF делаем:
LAF ; load A from F
SRA ; shift A right (put ACF to DPF)
SAF ; save A to F
LPD ; load P from D (load true pointer)
Чтобы осуществить условный переход по состоянию флага BCF делаем:
LAF ; load A from F
SLA ; shift A left (put BCF to DPF)
SAF ; save A to F
LPD ; load P from D (load true pointer)
Обнуляем перенос и двигаемMac Buster wrote:Он с переносом, а нам нужен без переносаShaos wrote:Сдвиг есть.![]()
Угу - прячем по указателю данныхMac Buster wrote:Тогда придётся где-то прятать значение регистра а потом загружать его обратно.Сравнение - через вычитание (сложение с инвертированным слагаемым).
Да, для маскирования пришлось ввести бинарную потритовую операцию OPB Tn Tz Tp, где если трит регистра B равен N то берется триада Tn, если трит регистра B равен Z, то берется триада Tz и если трит регистра B равен P то берется триада Tp, и далее если трит регистра A равен N, то в качестве результата берется самый левый трит выбранной триады, если трит регистра A равен Z, то - средний трит, и если трит регистра A равен P, то - правый трит. Например маскирование трита BCF можно проделать так:Mac Buster wrote:Похоже я не совсем понял их работу.Маскирование группы тритов - через произвольные потритовые операции.