Author |
Message |
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Снова возвращаюсь к теме эмулятора (имитатора) троичной ЭВМ для отработки алгоритмов и сравнения эффективности кодирования и сжатия данных по сравнению с двоичными машинами и методами Собираюсь сделать следующим образом:
- разделить пространства команд, данных и стека
- использовать девять 18-разрядных регистров общего назначения
- три регистра управления (счетчик команд, указатель стека и регистр флагов)
- минимум команд
- текстовый терминал
- ввод данных из потоков
Среда реализации - Delphi.
|
13 Sep 2005 21:00 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22621 Location: Silicon Valley
|
А я от железа иду - в моем тримуляторе будут все те блоки, которые можно повторить в железе
|
14 Sep 2005 19:03 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Постараюсь к моменту создания железа разработать основные принципы кодирования, сжатия и программирования в уравновешенном троичном коде.
|
17 Sep 2005 23:29 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Система команд троичного RISC-процессора планируется а-ля RTL или "содержательных обозначений" (что почти одно и тоже) и ориентировочно будет выглядеть так:
запись слова: m[address] = Rn
чтение слова: Rn = m[address]
пересылка слова: Rn = Rn
пересылка одного произвольного разряда: Rn.n = Rn.n
сложение: Rn = Rn + Rn
вычитание (сравнение): Rn = Rn - Rn
умножение: Rn = Rn * Rn
деление (целочисленное): Rn = Rn : Rn
деление (остаток): Rn = Rn % Rn
сдвиг: << и >>
маскирование: Rn mask Rn
увеличение: Rn max
усреднение: Rn mid
уменьшение: Rn min
условный переход: if (x) goto address, где x = eq, ne, gt, ge, lt, le
возврат: ret
|
26 Sep 2005 10:57 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Пояснение к команде условного перехода: в (x) может быть несколько условий разделяемых запятой
Забыл написать ещё две очень важные команды:
останов: stop
пропуск: none (исключительно для выравнивания команд по началу слова)
|
26 Sep 2005 23:36 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Вот небольшой пример того, как может выглядеть программа на ассемблере троичной ЭВМ:
Здесь v[hours], v[minutes] и v[seconds] - некие виртуальные троичные порты, каждый разряд этих портов напрямую присоединен к двухцветному светодиоду.
|
06 Oct 2005 05:12 |
|
|
Ronin
Maniac
Joined: 29 Mar 2005 06:06 Posts: 304 Location: Krasnodar
|
а че у тебя условный переход такой нетроичный - достаточно ведь одного(!) условия сравнения с переходом на три адреса.
|
06 Oct 2005 22:11 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Безусловного не вижу, а вот в примечании к инструкции перехода написано, что условия можно разделять запятой
|
08 Oct 2005 00:33 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22621 Location: Silicon Valley
|
А действительно - как записать условный переход по трем адресам?
|
09 Oct 2005 20:52 |
|
|
Ronin
Maniac
Joined: 29 Mar 2005 06:06 Posts: 304 Location: Krasnodar
|
ну обычное троичное условие - проще и понятней. можно конечно и твои условия (кому удобней) сделать - просто через макрос к троичному_условному.
|
10 Oct 2005 06:32 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
По-моему условный переход по трем адресам это уже безусловный переход, т.к. есть всего три условия: меньше, равно и больше. Вероятно мне в самом деле стоит убрать лишние условия, оставив только lt,eq и gt. Т.е. команда условного перехода может иметь такой вид:
if (lt,eq) goto address ; переход если меньше или равно
if (eq, lt) goto address ; переход если больше или равно
if (lt,gt) goto address ; переход если не равно
Или вы считаете, что потребность в трех адресах может возникнуть ?
|
10 Oct 2005 09:23 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22621 Location: Silicon Valley
|
Это как раз условный - только сразу на три адреса. А просыте условия записываются через тройной условный (n,o,p):
if(a<b) goto label -> (label,next,next)
if(a>b) goto label -> (next,next,label)
if(a==b) goto label -> (next,label,next)
if(a!=b) goto label -> (label,next,label)
if(a<=b) goto label -> (label,label,next)
if(a>=b) goto label -> (next,label,label)
более сложный вариант:
if(a==b) goto label; else label' -> (label',label,label')
|
10 Oct 2005 16:02 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Хорошо, принимаю это предложение. Правда с одним ограничением: в связи с тем, что у нас RISC-процессор, внутри скобок условного перехода может перечисляться только состояние флагов, само сравнение должно производится отдельной командой предшествующей команде перехода.
|
11 Oct 2005 00:39 |
|
|
Mac Buster
Retired
Joined: 03 Aug 2003 22:37 Posts: 1474 Location: Moscow
|
Переходим к логическим командам. Собственно, она всего одна, рабочее название мнемоники - tlog (от trinary или ternary logic). Макросами определяются узкоспециализированные варианты команды: max, mid, min, mask, shift up, shift down И т.п.
Возражения есть ?
|
11 Oct 2005 01:00 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22621 Location: Silicon Valley
|
Можно делать так - имея во флаге сравнения значение N, O или P - мы вызываем специальную команду локального перехода, за которой следуют три команды безусловного перехода - переходы на адреса An, Ao, Ap соответственно. Т.е. перехода по тройному условию будет занимать 4 команды (по уже готовому условию перехода во флаге сравнения).
|
11 Oct 2005 16:19 |
|
|