nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 02:37



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

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
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)?

_________________
:dj: https://mastodon.social/@Shaos


24 Sep 2015 08:15
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
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 ,а УстройствоУправления будет сразу "знать" на сколько продвинуть конвейер команд при несовпадении ни с одним из условий ..


24 Sep 2015 15:23
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
@(-(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

_________________
:dj: https://mastodon.social/@Shaos


24 Sep 2015 16:48
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
В частной переписке petrenko подсказал интересную идею - можно явно разделить команды и данные (скажем буквы/цифры) - например команды могут быть всегда отрицательными трайтами (и нулевая команда будет NOP), а в случае положительного трайта мы интерпретируем его как символ ASCII-кода (больше 0, но меньше 256) либо как какой-то высокоуровневый код (>=256 - тэг бейсика?). Например, если исполняющее устройство встречает положительный трайт, то оно его добавляет в некий строковый буфер и идёт дальше, пока не встретит отрицательный трайт, который либо сбросит буфер, либо что-то с ним сделает. Таким образом можно из кода вводить числа (на подобие старых советских калькуляторов) либо делать передачу управления по именам, а не по адресам (типа шитый код аля-форт) - понятно, что будет чуть дольше, но зато какое удобство программирования!

_________________
:dj: https://mastodon.social/@Shaos


25 Sep 2015 13:13
Profile WWW
Doomed

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


26 Sep 2015 06:18
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Shaos wrote:
... возвращаясь к архитектуре Tryte-I - имеет ли смысл иметь непосредственный доступ к регистрам SP и PC .. ?
Понаблюдав недавно за "мастер-классом" работы некоторых сурьёзных гуру на микро-ваксе,
подумал, что "непосредственный доступ к регистрам SP и PC " наверное таки нужен, но токмо в режимах О.(п
ерационной)
С.(истемы) и пульта.
Копиравать , кстати, в некие YZ необязательно, можно просто менть местами типа : ex SP1<->IX , ex SP2<->IY
( А если регистры все равноправные, то собственно и с IY можно делать "пугающие"( :o ) операции типа MOV @((IY)++)-->PC ( синоним RET ,где в качестве SP выступает IY ) )


30 Oct 2018 10:12
Profile
Maniac
User avatar

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

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

Code:
Регистры:
-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:
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.



13 Nov 2018 17:24
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
8080 тяжеловат будет

_________________
:dj: https://mastodon.social/@Shaos


13 Nov 2018 17:48
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Quote:
.. i8080 тяжеловат ..

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

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

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

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


14 Nov 2018 03:02
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Shaos wrote:
.. положительный .. добавляет в некий строковый буфер ..
..
.. (типа шитый код аля-форт) ..
..
.. удобство программирования ..

Подумал над обоими вариантами конвейера - совместного и раздельного.
Прихожу к выводу, что ... :egeek: ... лучше всего совместно-раздельный.
Это примерно так : первые две "ступеньки" конвейера совместные, то, что в них попадает подвергается первичной проверке по типу.
Далее разветвление - в команды / в "некий строковый буфер" .
Команды поэтапно дешифруются по полям и при этом ещё и продвигаются
( то есть каждая следующая "ступенька" у к.к. шире предыдущей, потому как разные узлы надо настраивать в разные микроциклы - например ключи-коммутаторы, выбирающие что подать на алу, сначала, а например коммутаторы, выбирающие куда положить результат - уже после отработки алу .. и т.п. )
То, что попадает в "некий строковый буфер" подвергается ещё проверке на длину и тип и может быть или обработано алу или обработано дешифратором( если это кодовое"как-бы-слово" ) или в нужный микроцикл скопировано в индексный регистр( если это "пойнтер" ).
Как то так ..


14 Nov 2018 03:29
Profile
Maniac
User avatar

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

Для адресного пространства троичного компьютера усечение адресации в половину не так страшно, как для двоичного…
Тем самым, вектор «[+100]» и «[-100]» адресуют одну ячейку памяти, но «МИНУС» указывает на магазинный тип доступа…


14 Nov 2018 12:10
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Простите, коллега "Пагуо-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.



14 Nov 2018 13:56
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
AlexanderZh wrote:
... По моему мнению лучше иметь некий флаг, чем ограничивать адресное пространство ...

Соглашусь с Вашим мнением.
Тем паче, что таковым флагом может "подрабатывать по совместительству на пол-ставки" один из триггеров в ковейере команд.
( именно так и обстоит дело в PDP/LSI и VAX ,а уж будет ли сей флаг двоичным/троичным/четверичным, да хоть пятеричным - непринципиально
, прото обзовём сей кусочек "железячки" соотв. "двиггер"/"триггер"/"четвериггер"/"пятериггер" ... :mrgreen: <-щютка_юмора , {к.с.=="лопата"} )


14 Nov 2018 14:06
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
В частной переписке petrenko подсказал интересную идею - можно явно разделить команды и данные (скажем буквы/цифры) - например команды могут быть всегда отрицательными трайтами (и нулевая команда будет NOP), а в случае положительного трайта мы интерпретируем его как символ ASCII-кода (больше 0, но меньше 256) либо как какой-то высокоуровневый код (>=256 - тэг бейсика?). Например, если исполняющее устройство встречает положительный трайт, то оно его добавляет в некий строковый буфер и идёт дальше, пока не встретит отрицательный трайт, который либо сбросит буфер, либо что-то с ним сделает. Таким образом можно из кода вводить числа (на подобие старых советских калькуляторов) либо делать передачу управления по именам, а не по адресам (типа шитый код аля-форт) - понятно, что будет чуть дольше, но зато какое удобство программирования!

По прошествии почти пяти лет поменял таки систему команд для поддержки такого варианта (см. первое сообщение этого топика) - т.е. мы будем как в калькуляторах писать символы друг за другом и они при этом будут выводиться на экран (если флаг вывода N), будут читаться подпрограммой прямо из кода (если флаг вывода O - при этом все ASCII инструкции будут просто пропускаться) или будут передаваться в сеть (если флаг вывода P) - причём я планирую задействовать практически все символы управления ASCII (с кодами до 31), а таблица букв будет расширена до кода 283 POPPPP...

P.S. Кстати с октября 2015 у меня есть домен http://tryte.one :lol:

_________________
:dj: https://mastodon.social/@Shaos


24 May 2020 20:26
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Примеры кода - вывод текста на экран:
Code:
'H'
'e'
'l'
'l'
'o'

или даже просто вот так:
Code:
"Hello"


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


Передача строки получателю с индексом 1:
Code:
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 флагов...

_________________
:dj: https://mastodon.social/@Shaos


24 May 2020 21:51
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 32 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 19 guests


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.