Троичный компьютер ТРИНИТИ-2004

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

Moderator: haqreu

petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Re: Троичный компьютер ТРИНИТИ

Post by petrenko »

Shaos wrote:
Шрифты это конечно хорошо, но это для далёкого будущего, а пока надо подумать о том, что можно сделать прямо сейчас - например простейший дисплей для троичного компьютера можно построить из 81 красно-зелёного светодиода - что есть 9 рядов по 9 светодиодов в каждом:...
Насчёт шрифтов есть простейшая идея - использовать UTF , а оставшиеся комбинации с отрицательными значениями тритов назначить для представления других типов данных, в первую очередь специфичных для троичных систем. Первый (старший) трит будет указывать :
если 0 , то следующие 8 трит при их положительном значении кодируют без изменений первый байт UTF , при их отрицательных значениях кодируют другие типы данных,
если -1 , то следующие триты содержат код команды или ещё что-нибудь системное или значения нечёткой логики,
ну а если +1 , то следующие триты кодируют числовые данные, причём второй и третий триты ещё не кодирует, а указывают на тип числа и его длину.

Вопрос к "топикстартеру":
Я так понимаю, что по разрядности регистров и АЛУ "Тринити_2004" классифицируется среди троичных компьютеров и процессоров явно как одно-триббловый ( == три трита == 1/3 девятитритового трайта),
а вот по архитектуре как его классифицировать ?
(дело в том, что в названиях разных архитектур вроде принстон, гарвард, фон-нейман и т.п. я не очень разбираюсь.)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

и всё-таки "однотриадный" :)

а по архитектуре оно скорее фон-нейман, т.к. данные и код сидят в одной памяти...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

petrenko wrote:а вот по архитектуре как его классифицировать ?
(дело в том, что в названиях разных архитектур вроде принстон, гарвард, фон-нейман и т.п. я не очень разбираюсь.)
На всякий случай - имей в виду: принстон и фон-нейман - это одно и тоже по большому счету... :wink:
Поскольку машина фон-Неймана была создана в Принстонском институте.
Действительно – машина с объединенной памятью программ и данных.

А вот Гарвардская архитектура была разработана Говардом Айхеном в Гарвардском университете.
Отличие гарвардской архитектуры состоит в том, что память программ и память данных разделены.

Мне кажется, и запоминать и разбираться - особого простора и выбора нет... :lol:
iLavr
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Спасибо, постараюсь больше не перепутать.
То есть 8051 например - это "гарвард", а 8086 - "принстон" == "фон-нейман". А ещё какие то архитектуры кроме этих бывают ?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

petrenko wrote:А ещё какие то архитектуры кроме этих бывают ?
Эти две архитектуры - по сути, как два крайних полюса.

Ещё бывают смешанные и модифицированные...
К примеру, есть процессоры «с модифицированной гарвардской архитектурой»
или SHARC (Super Harvard ARChitecture).
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ

Post by Shaos »

Shaos wrote:Начал задумываться над будущим "3niti alpha". Расширение системы команд может быть обеспечено засчёт реализации подпрограмм (как например переход на подпрограмму с сохранением адреса возврата в стеке, возврат из подпрограммы с забиранием адреса из стека, арифметика над длинными словами и т.д.), расположенных в адресной области ниже нуля. При этом в будущем можно реализовать эти подпрограммы в железе (при условии что адреса этих подпрограмм будут застандартизированы). Тогда же возникает вопрос в ускорении обработки четырёх-триадных команд (таких как LDI, JMP и OPB). Разумным решением при этом может быть 4-триадная (12-тритная) шина данных. Но так как у нас есть не только четырёх-триадные команды, но также двух-триадные и одно-триадные, то понятно, что команды не будут выровнены на границу 4-триадного слова - значит нам нужен контроллер памяти, который мог бы выдавать 4 триады с любым сдвигом по памяти, при этом адрес обращения будет соответствовать первой триаде (адреса всё также будут адресовать отдельные триады, а не 4-триадные слова). Кроме того можно сделать так, что ALU будет выполнять в параллель до 4 независящих друг от друга 1-тритных операций.

Примерное видение будущего 3niti: "3niti beta" будет иметь 6-тритовый процессор (c 12 или 18 тритовой адресацией), а "3niti gamma" уже 12-тритовый (с 18 или 24 тритовой адресацией). Напомню, что 12 тритов адресуют 531К, 18 тритов - 387M, 24 трита - 282G.
Либо оставить 3niti трёхтритной, добавляя в бету и гамму доп-фичи, например:

3niti beta может иметь спец-железо, которое переход в память с отрицательными адресами интерпретирует как вызов подпрограммы, при этом оно САМО записывает c нулевой ячейки переход на адрес возврата (в 4 ячейки OOOOOOOOO, OOOOOOOOP, OOOOOOOPN, OOOOOOOPO) т.е. по окончании подпрограммы оно просто должно сделать JMP OOO OOO OOO и оно вернётся туда, откуда подпрограмма была вызвана (по идее даже стек можно сделать на несколько адресов - по нулевому адресу всегда будет выглядывать верх стека возвратов).

3niti gamma может иметь 4-триадную (12-тритовую) шину данных, чтобы забирать длинные команды за одно обращение к памяти (как я описал летом 2010 года в цитируемом блоке чуть выше), тогда выровненные программы могут сильно ускорить своё выполнение! Либо память всё также будет иметь 3-тритную шину данных, но обращение в неё будут происходить через кеш (скажем на 27 ячеек по размеру параграфа), который будет иметь 4 копии, смещённых друг от друга на одну ячейку - тогда из такого кеша можно получить ЛЮБЫЕ 4 триады, идущие подряд, за ОДНО обращение...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ

Post by Shaos »

3niti beta - с другой стороны по адресу OOO OOO OOO всегда будет начало программы, тогда логичнее возврат сделать в 4 триадах, идущих непосредственно перед:

Code: Select all

OOOOOOONN: OPO ; JMP - возврат из подпрограммы через переход на подставляемый адрес
OOOOOOONO: xxx ; сюда подставляется старшая триада адреса из стека возвратов
OOOOOOONP: xxx ; сюда подставляется средняя триада адреса из стека возвратов
OOOOOOOON: xxx ; сюда подставляется младшая триада адреса из стека возвратов
OOOOOOOOO: zzz ; начало программы пользователя
Либо при первом старте по нулевому адресу будет таки какой-то переход, подменяемый затем стеком возвратов? Какая команда выглядит лучше в качестве RET? OPO OOO OOO ONN или OPO OOO OOO OOO?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ

Post by Shaos »

А может таки лучше JMP NNN NNN NNN использовать в качестве RET? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ

Post by Shaos »

Shaos wrote:А может таки лучше JMP NNN NNN NNN использовать в качестве RET? ;)
Можно сделать расширение системы команд до 3niti beta следующим образом:
JMP NNN xxx xxx - RET (средняя и младшая триады адреса игнорируются);
JMP NNO xxx xxx ... JMP NPP xxx xxx - зарезервировано на будущее (ещё 8 инструкций);
JMP ONN NNN NNN ... JMP OOO OOO OON - будет означать CALL по инвертированному адресу (т.е. CALL OPP PPP PPP ... CALL OOO OOO OOP) с сохранением адреса возврата на стеке.
А начиная с адреса OOO OOO OOO будет идти обычная память программ и данных (причём данные могут и в отрицательную область памяти уходить, будучи доступны через указатель DP - в отрицательной области например может располагаться видеопамять и порты ввода-вывода).

Я думаю всё это можно реализовать без особых проблем в виде расширенной микроархитектуры 3niti

P.S. Наряду с RET (JMP NNN) подобным образом можно реализовать другие псевдо-инструкции например вызов подпрограммы по троичному указателю CALL [DP] (JMP NNO), сохранение на стеке (и чтение со стека) 9-тритовых значений FAB и DP (текущий DPx выбранный через бит DPF) и какую-нибудь продвинутую математику (например умножение триад) или произвольные пользовательские микропрограммы типа:
JMP NNN = RET
JMP NNO = CALL_DP
JMP NNP = POP_DP
JMP NON = PUSH_DP
JMP NOO = POP_FAB
JMP NOP = PUSH_FAB
JMP NPN = в будущем может стать SSPD (сохранить указатель стека в текущий DP)
JMP NPO = в будущем может стать LSPD (загрузить указатель стека из текущего DP)
JMP NPP = в будущем может стать MOD_DP (инкрементировать/декрементировать текущий DP в зависимости от значения флага BCF и возможно даже установить RSF по результату)
Последние 3 метаинструкции пока можно отдать под пользовательские микропрограммы...

P.P.S. Стек может начинаться с адреса скажем OOO OON PPP и идти в меньшие адреса на какую-то не очень большую глубину (в этом случае появится возможность обращаться к нему программно, как к памяти данных), а оставшиеся 12 ячеек между стеком и нулевым адресом могут быть портами ввода-вывода - как троичными, так и двоичными (например для реализации интерфейса LPT, клавиатуры, внешнего накопителя на последовательной EEPROM и джойстика).

P.P.P.S. Или сделать возможным иметь стек в произвольном месте ОЗУ как в старом добром 8080? Тогда нужна ещё команда копирования из DP в SP и обратно - дополнил список возможными командами SSPD и LSPD (по аналогии с SPCD и LPCD)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ-2004

Post by Shaos »

В первый гибридный прототип 3niti beta можно поставить обычное двоичное ОЗУ 32K из которого непосредственным способом (как описано тут) можно получить 4374 триады в адресах:
OPx xxx xxx
OOx xxx xxx
и в свободном диапазоне, как ранее и предполагалось, будет находиться видеопамять:
ONx xxx xxx

При старте управление может передаваться на загрузчик, расположенный в маленьком двоичном ПЗУ 2К, которое будет доступно как 486 триад в адресах PPP Oxx xxx и PPP Pxx xxx (конец адресного пространства). Этот загрузчик может загружать пользовательскую программу из последовательного EEPROM (или с компьютера через COM-порт), записывая её начиная с адреса OOO OOO OOO и затем передавая на неё управление. Надо прикинуть насколько тяжёлой будет подпрограмма вычитки из EEPROM - может быть вообще придётся 8К ПЗУ ставить (1458 триад).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Троичный компьютер ТРИНИТИ

Post by Lavr »

Shaos wrote:Стек может начинаться с адреса скажем...
Для простоты можно сделать и вовсе без стека. Сеймур Крей этим не гнушался, и идея вполне здравая!
viewtopic.php?f=71&t=19356#p157290

В микропроцессорах RCA - обсуждались на форуме - тоже никакого стека нет, но ничего - по сей день работают! :roll:
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ-2004

Post by Shaos »

Ну если ты внимательный читатель, то наверное заметил, что в оригинальной системе команд 3niti alpha как раз стека и небыло :no:

И пару страниц этого топика в самом начале я потратил на то, чтобы показать как можно "на коленке" описать сохранение адреса возврата программно - самый простой способ это сохранять один адрес в регистре DP, а вот если надо много уровней сохранения делать сохраняя адреса в памяти, то тут начинаются боль и слёзы - поэтому в 3niti beta я и решил попробовать ввести стек явно, чтобы не мучиться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Троичный компьютер ТРИНИТИ-2004

Post by Lavr »

Я, как внимательный читатель, читаю не только с начала, но и до конца... :lol:
В конце, я вижу, что пошли мучения "об стек". Поэтому я и намекаю, по собственному опыту, что можно этих мучений вполне избежать! :roll:
Ну и привожу в подтверждение больших авторитетов, нежели я сам. :wink:
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ-2004

Post by Shaos »

Ещё одна попытка реализовать спецификацию 3niti в железе под названием 3niti 4000 - в этот раз на стандартных CMOS-микросхемах: viewtopic.php?f=79&t=22430
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Троичный компьютер ТРИНИТИ

Post by Shaos »

Shaos wrote: #NOO (-9) SPCD - сохранить PC в текущем регистре DP;
Вот тут на самом деле надо сохранять инкрементированное значение PC т.е. адрес следующей инструкции!

Например это может понадобится для реализации состояния HALT (останов) в конце пользовательской программы, когда исполнение зацикливается на одном и том же адресе:

Code: Select all

   SPCD ; сохранить 9-тритное значение PC+1 в текущий DP
   LPCD ; заполнить PC 9-тритным значением из текущего DP
Это состояние можно относительно легко детектировать аппаратно и зажигать большую красную лампочку "ОСТАНОВ" :twisted:

Также с помощью этой инструкции можно делать код циклов более компактным:

Code: Select all

   LAI OOO ; записать 0 в регистр A
   SAF ; установить флаг DPF в O
   LDI LEAVE ; запомнить адрес метки LEAVE в DPo
   LAI OPO ; записать 3 в регистр A
   SAF ; установить флаг DPF в P
   LAI 5 ; загрузить число 5 в регистр A
   SPCD ; сохранить 9-тритное значение PC+1 в DPp (т.к. DPF=P)
; начало цикла
   ADI -1 ; декрементировать A (при этом флаг BCF всегда будет O)
   SAB ; скопировать A в B
   LAF ; скопировать F в A
   RRA ; сдвинуть регистр A на 1 трит вправо (чтобы значение флага RSF встало на место флага DPF)
   SAF ; скопировать A в F
   LAB ; скопировать B в A
   LPCD ; заполнить PC 9-тритным значением из текущего DP (DPo или DPp)
; конец цикла
LEAVE:
(этот код проходит цикл 5 раз и затем выходит на метку LEAVE)

А что будет если этот код будет исполнятся в 3niti alpha, где спецификация говорит, что SPCD это сохранение текущего значения PC? Да ничего страшного - код всё также будет работать, но чуть дольше т.к. SPCD будет выполняться при каждой итерации цикла :lol:

Так что пусть спецификация 3niti alpha остаётся с тем же самым описанием, а вот в спецификации 3niti beta надо явно прописать, что по SPCD сохраняется адрес именно следующей инструкции, а не текущей.

P.S. Наверное в 3niti gamma можно будет реализовать микрокодом более "интеллектуальные" инструкции тройственного перехода - LPCD_BCF и LPCD_RSF, которые будут непосредственно использовать соответствующие флаги BCF и RSF вместо DPF не трогая регистры A и B, тем самым экономя кодовое пространство (и время).

P.P.S. А пока можно понаделать макросов на уровне ассемблера типа:

Code: Select all

LPCD_RSF_A = LAF RRA SAF LPCD
LPCD_BCF_A = LAF RLA SAF LPCD
(причём LAF и всякие OOO тоже могут быть макросами, но встроенными)
Я тут за главного - если что шлите мыло на me собака shaos точка net