Давайте думать над железкой (TRIADOR)

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

Moderator: haqreu

User avatar
TernarySystem
Doomed
Posts: 633
Joined: 27 Jul 2018 12:07

Re: Давайте думать над железкой (TRIADOR)

Post by TernarySystem »

haqreu wrote:где-то на тысячном корпусе микросхем для триадора я всё же запаял один задом наперёд :rotate:
И тогда вместо TRIMUX у Вас получился один XUMIRT :no:
Жду второй сезон о TRIADOR... когда будет анонс?
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:где-то на тысячном корпусе микросхем для триадора я всё же запаял один задом наперёд :rotate:

Image
LM324 - Quadruple Operational Amplifier?
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

TernarySystem wrote:Жду второй сезон о TRIADOR... когда будет анонс?
Второй сезон, наверное, будет чисто софтверный о базовой архитектуре; а уже третий с непосредственными железками АЛУ, которые я потихоньку готовлю. Про даты боюсь загадывать :(
Но очень надеюсь гораздо быстрее, нежели прошедшие три года.

Shaos wrote:LM324 - Quadruple Operational Amplifier?
Да, в качестве драйвера для светодиодов.
You do not have the required permissions to view the files attached to this post.
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Сделал наконец удобную либу для кикада, с которой приятно будет разводить модули АЛУ. Сегодня получил заказанные два месяца назад платы с сердцем операции RR - модулем инкремента/декремента. По факту просто каскад трёх обычных полусумматоров, 9 тримуксов в сумме (один полусумматор - это 3 тримукса). Ну а LM324 нужен для четырёх светодиодов на плате модуля.
You do not have the required permissions to view the files attached to this post.
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:
TernarySystem wrote:Жду второй сезон о TRIADOR... когда будет анонс?
Второй сезон, наверное, будет чисто софтверный о базовой архитектуре; а уже третий с непосредственными железками АЛУ, которые я потихоньку готовлю. Про даты боюсь загадывать :(
Но очень надеюсь гораздо быстрее, нежели прошедшие три года.

Shaos wrote:LM324 - Quadruple Operational Amplifier?
Да, в качестве драйвера для светодиодов.

Image
Я что-то подобное пытался сделать при тестировании своего чипа, но оно не заработало и я в итоге вытащил операционники и проводочками соединил напрямую - двухцветные светодиоды после этого загорались нормально (резисторы я правда поменьше поставил в делитель) :lol:
test3-sch.jpg
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Shaos wrote:... сделать макрос JMP для дальних прыжков и пусть программист сам следит за своими адресами и содержимым R13:

Code: Select all

JMP MACRO L
    R1 SEG L
    RR -13
    JP OFF L
ENDM
Этот ассемблер может выдавать листинг файлы, пригодные для скармливания в эмулятор триадора (адреса будут укзаны в каждой строке как комментарии), а также бинарные файлы 2К-образа ПЗУ для моего логисимовского симулятора триадора
Наверное всё-таки на последних версиях C++ надо этот макро-ассемблер писать - назвать его скажем TRIADORA :lol:

Кроме макросов поддержать ключевые слова ORG, EQU, INCLUDE и ALIGN (для выравнивания на границу сегментов надо будет писать ALIGN 27 при этом возможная дырка будет заполнена нулевой командой ничегонеделанья RR 0). Всяких там DB небудет т.к. память данных нет возможности инициализировать кроме как писать туда через EX инструкции обращения к памяти - переменные объявлять адресами через EQU (я так для пиков пишу уже много лет точно зная где у меня та или иная переменная сидит).

Кроме того на примере выше видно присутствие ключевых слов SEG и OFF, которые из константы или метки (которая суть тоже константа, которая становится известной на поздних проходах) выделяют старшую триаду (SEGment) и младшую триаду (OFFset). Также внутри макросов будет возможным указывать локальные (для макроса) метки через ключевое слово LOCAL:

Code: Select all

; Refresh R13 with current segment identifier
RFR MACRO
    LOCAL L
    R1 SEG L
    RR -13
L:
ENDM
При кодогенерации при каждом использовании такого макроса будет ставиться метка с уникальным именем (с добавлением некоего уникального номера), например

Code: Select all

RFR
JP LL
RFR
LL:
будет преобразовано при первом проходе в

Code: Select all

R1 SEG L_1
RR -13
L_1:
JP LL
R1 SEG L_2
RR -13
L_2:
LL:
Возможно надо будет ещё поддержать ключевые слова FILE и LINE для отслеживания оригинальных источников строчек кода для корректного сообщения об ошибке в случае проблем с ассемблированием.

Ну и в дальнейшем надо будет добавить условную компиляцию с ключевыми словами IF, ELSE, ENDIF, NOT, AND, OR, EQ, NE, LT, LE, GT, GE ( всё по мотивам MASM ; )

А может в условия ещё добавить троичную инверсию INV ? :mrgreen:

P.S. IFDEF, IFNDEF и ELSEIF ненужны - планирую обойтись одним IF. Опция командной строки -DNAME для ассемблера будет означать тоже самое что и NAME EQU 1 внутри и далее можно писать IF NAME или IF NOT NAME и т.д. (отсутствие константы NAME будет равносильно 0). Плюс директива ERROR чтобы прервать ассемблирование с текстовым сообщением...

P.P.S. Обновлённый заголовочный файл для триадоры в соответствии с новыми веяньями:

 TRIADOR3.INC

Code: Select all

; TRIADOR-3 definitions for assembler TRIADORA v1.0
; Created in May 2020 by Alexander A. Shabarshin <me@shaos.net>
; This file is considered PUBLIC DOMAIN (intentionally put there by creator)

; 1-trit balanced ternary numbers

N   EQU -1
O   EQU  0
P   EQU  1

; 2-trit balanced ternary numbers

NN  EQU -4
NO  EQU -3
NP  EQU -2
ON  EQU -1
OO  EQU  0
OP  EQU  1
PN  EQU  2
PO  EQU  3
PP  EQU  4

; 3-trit balanced ternary numbers

NNN EQU -13
NNO EQU -12
NNP EQU -11
NON EQU -10
NOO EQU -9
NOP EQU -8
NPN EQU -7
NPO EQU -6
NPP EQU -5
ONN EQU -4
ONO EQU -3
ONP EQU -2
OON EQU -1
OOO EQU  0
OOP EQU  1
OPN EQU  2
OPO EQU  3
OPP EQU  4
PNN EQU  5
PNO EQU  6
PNP EQU  7
PON EQU  8
POO EQU  9
POP EQU  10
PPN EQU  11
PPO EQU  12
PPP EQU  13

; Ternary logic constants

NEG EQU -1
UNK EQU  0
POS EQU  1

; >>>>> SKIP MACROS

IFR4LEZ  EQU -13
IFR4NEZ  EQU -12
IFR4GEZ  EQU -11
IFR3LEZ  EQU -10
IFR3NEZ  EQU -9
IFR3GEZ  EQU -8
IFR2LEZ  EQU -7
IFR2NEZ  EQU -6
IFR2GEZ  EQU -5
IFR1LEZ  EQU -4
IFR1NEZ  EQU -3
IFR1GEZ  EQU -2
IFBORROW EQU -1
IFNOOVER EQU  0
IFCARRY  EQU  1
IFR1LTZ  EQU  2
IFR1EQZ  EQU  3
IFR1GTZ  EQU  4
IFR2LTZ  EQU  5
IFR2EQZ  EQU  6
IFR2GTZ  EQU  7
IFR3LTZ  EQU  8
IFR3EQZ  EQU  9
IFR3GTZ  EQU  10
IFR4LTZ  EQU  11
IFR4EQZ  EQU  12
IFR4GTZ  EQU  13

; Long jump to label L
JMP MACRO L
    R1 SEG L
    RR -13
    JP OFF L
ENDM

; Refresh R13 with current segment identifier
RFR MACRO
    LOCAL L
    R1 SEG L
    RR -13
L:
ENDM

; Decrement R1 with updating flag C
DECR1 MACRO
    RR -1
ENDM

; No operation (OOOOO)
NOOP MACRO
    RR  0
ENDM

; Increment R1 with updating flag C
INCR1 MACRO
    RR  1
ENDM

; >>>>> EXTENDED INSTRUCTIONS

; Halt and catch fire
HLT MACRO
    EX -13
ENDM

; Program EX using R1,R2,R3 and R4 as identifier of EX command to program
PEX MACRO
    EX 0
ENDM

; Indirect jump to R13,R1 with storing PC+1 to R12,R11
JPI MACRO
    EX 13
ENDM

; >>>>> BINARY TRITWISE OPERATIONS

CMP MACRO
    EX 1
ENDM

MIN MACRO
    EX 2
ENDM

MAX MACRO
    EX 3
ENDM

MUL MACRO
    EX 4
ENDM

SUM MACRO
    EX 5
ENDM

CON MACRO
    EX 6
ENDM

; >>>>> PREDEFINED PERMUTATIONS

CLC MACRO
    EX 7
ENDM

RLC MACRO
    EX 8
ENDM

RRC MACRO
    EX 9
ENDM

; >>>>> DATA MEMORY ACCESS

; Write R2,R1 to data memory address R4,R3
WMM MACRO
    EX 10
ENDM

; Read data memory from address R4,R3 and store lower triade to R1
RML MACRO
    EX 11
ENDM

; Read data memory from address R4,R3 and store higher triade to R1
RMH MACRO
    EX 12
ENDM

; Read data memory from address A and store value to R2,R1
RMA MACRO A
    R1 SEG A
    RR -4
    R1 OFF A
    RR -3
    RMH
    RR -2
    RML
ENDM

; Write R2,R1 to data memory address A
WMA MACRO A
    R1 SEG A
    RR -4
    R1 OFF A
    RR -3
    WMM
ENDM

; Write constant C to data memory address A
WMC MACRO A C
    R1 SEG A
    RR -4
    R1 OFF A
    RR -3
    R1 SEG C
    RR -2
    R1 OFF C
    WMM
ENDM

; >>>>> SUBROUTINES MACROS (SP=R10,R9)

; subroutine is called by CALL label

; if subrouting is not calling anything else then it can just do RET at the end

; if subrouting is calling something else (including itself) while working
; then it should do PUSH in the beginning to store current R12,R11 on the stack
; and it should do RETURN at the end to return to proper address from the stack

; to store pair of registers on the stack use PUSHRR and POPRR to retrieve them

CALL MACRO A
    R1 SEG A
    RR -13
    R1 OFF A
    JPI
ENDM

RET MACRO
    RR 12
    RR -13
    RR 11
    JPI
ENDM

SSP MACRO A
    R1 SEG A
    RR -10
    R1 OFF A
    RR -9
ENDM

PUSH MACRO
    RR 10
    RR -4
    RR 9
    RR -3
    RR 12
    RR -2
    RR 11
    WMM
    RR 9
    RR -1
    RR -9
    RR 10
    SK IFNOOVER
    RR -1
    RR -10
ENDM

RETURN MACRO
    RR 9
    RR 1
    RR -9
    RR -3
    RR 10
    SK IFNOOVER
    RR 1
    RR -10
    RR -4
    RMH
    RR -13
    RML
    JPI
ENDM

PUSHRR MACRO H L
    RR 10
    RR -4
    RR 9
    RR -3
    RR H
    RR -2
    RR L
    WMM
    RR 9
    RR -1
    RR -9
    RR 10
    SK IFNOOVER
    RR -1
    RR -10
ENDM

POPRR MACRO H L
    RR 9
    RR 1
    RR -9
    RR -3
    RR 10
    SK IFNOOVER
    RR 1
    RR -10
    RR -4
    RMH
    RR -H
    RML
;    IF L NE 1
    RR -L
;    ENDIF
ENDM

P.P.P.S. IF в последнем макросе закомментирован, т.к. в первой версии ассемблера я не планирую иметь условную компиляцию (в этом конкретном макросе условная компиляция предотвратила бы декремент R1, если макрос используется для вытаскивания из стека регистров R2,R1 в виде POPRR 2 1 и кстати в PUSHRR тоже надо бы что-то выдумать на тему R2,R1)

P.P.P.P.S. (добавлено 17 мая 2020 года) ещё можно программно нагенерить макросов с равно (сделав символ '=' разрешённым в именах макросов) типа R1=R2, R13=NOP и даже сделать макросы умеющие скажем R13=-13 или R5=+5 путём искусственной вставки пробела при первом проходе перед символами '-' или '+' если его там небыло, тогда R13=-13 будет воспринято как R13= -13 и сассемблируется вот таким макросом:

Code: Select all

R13= MACRO X
   R1 X
   RR -13
ENDM
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Ну так что, приступаю к написанию ассемблера triadora как описано выше?
Скажем сразу как PUBLIC DOMAIN :dj:
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Я не очень понимаю, зачем он нам нужен. У меня же уже есть ассемблер...
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:Я не очень понимаю, зачем он нам нужен. У меня же уже есть ассемблер...
Чтобы большие приложения писать, например тетрис :mrgreen:
Без макросов это почти нереально
Ну и выход будет совместим с твоим эмулятором
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Мне кажется, что ты бежишь сильно впереди паровоза :)
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Да не - нормально - в самый раз :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Три года спустя отрисовки на бумаге развёл и заказал самый тримуксожоркий срез АЛУ: RR. 52 корпуса dg403!
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:Три года спустя отрисовки на бумаге развёл и заказал самый тримуксожоркий срез АЛУ: RR. 52 корпуса dg403!
Надо посчитать сколько у меня получилось в логисимовском симуляторе триадора - вроде меньше...
haqreu wrote:Смерджил ; я помимо прочего исправил формат программ и перемешал скипы (если не забыл).
В методе cycle нужно засунуть return в условие для case -4 (строка 129), а то внешние EX-команды небудут нормально работать (PC небудет инкрементироваться):

Code: Select all

        case -4: { // EX: halt and catch fire if not processed
                     if (!do_ex(arg)) {
                       fHalt = true;
                       return;
                     }
                 } break;
и поменять местами if (fHalt) break; // halt and catch fire и if (verbose) display_memory_state(); в конце метода run, чтобы при окончании программы состояние регистров не печаталось два раза для EX -13 (т.к. после хальта PC не проинкрементируется и инкрементировать его нельзя т.к. при этом эмулятор вывалиться по ошибке что PC вылез за пределы программы)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Во какой интерфейс для гипотетического троичного компьютера TRIADOR-3A я придумал в текстовом экране 80x25 :mrgreen:

Code: Select all

         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
 R5       R6       R7       R8       R9       R10      R11      R12
                                                                                 < 1
  ####     ####     ####     ####     ####     ####     ####     ####    @@@@@@  < 2
 #    #   #    #   #    #   #    #   #    #   #    #   #    #   #    #   @@@@@@  < 3
 #    #   #    #   #    #   #    #   #    #   #    #   #    #   #    #   @@@@@@  < 4
  ####     ####     ####     ####     ####     ####     ####     ####    @@@@@@  < 5
 #    #   #    #   #    #   #    #   #    #   #    #   #    #   #    #   @@@@@@  < 6
 #    #   #    #   #    #   #    #   #    #   #    #   #    #   #    #   @@@@@@  < 7
  ####  #  ####  #  ####  #  ####  #  ####  #  ####  #  ####  #  ####  #         < 8
-------------------- ------------- ------------- -------------- ---------------- < 9
|()()()()()()()()()| |R1|()|()|()| |R5|()|()|()| |R9 |()|()|()| |R13 <|()|()|()| < 10
|()()()()()()()()()| ------------- ------------- -------------- ---------------- < 11
|()()()()()()()()()| |R2|()|()|()| |R6|()|()|()| |R10|()|()|()| |R13 >|()|()|()| < 12
|()()()()()()()()()| ------------- ------------- -------------- ---------------- < 13
|()()()()()()()()()| |R3|()|()|()| |R7|()|()|()| |R11|()|()|()| |PC()()()()()()| < 14
|()()()()()()()()()| ------------- ------------- -------------- ---------------- < 15
|()()()()()()()()()| |R4|()|()|()| |R8|()|()|()| |R12|()|()|()| |A|()|B|()|C|()| < 16
|()()()()()()()()()| ------------- ------------- -------------- ---------------- < 17
|()()()()()()()()()|                                                             < 18
|()()()()()()()()()| ##### ####   ###   ###  ####   ###  ####        ####   ###  < 19
|()()()()()()()()()|   #   #   #   #   #   # #   # #   # #   #           # #   # < 20
|()()()()()()()()()|   #   ####    #   ##### #   # #   # ####   ###   ###  ##### < 21
|()()()()()()()()()|   #   #   #   #   #   # #   # #   # #   #           # #   # < 22
--------------------   #   #   #  ###  #   # ####   ###  #   #       ####  #   # < 23
TRIADOR-3A v1.0.0                                                                < 24
________________________________________________________________________________ < 25
Пока будет как эмуль в линуксе (на базе эмуля haqreu с EX-расширениями), потом как эмуль в досе (а почему нет?), потом как эмуль в Xorya на PIC32 (с выходом на цветной телек), потом (возможно) как прошивка для FPGA с выходом на VGA ну и напоследок - как настоящий троичный (точнее гибридный) компьютер TRIADOR-3A построенный на троичном чипе Triador3000 :oidea: Вверху ряд 7-сегментных индикаторов (с точками) и экранчик 6x6 повторяющие интерфейс моей логисимовской версии триадора 2017 года (туда отображаются основных регистры). Далее слева экран из PEX-регистров 9x13 ( туда я буду делать ТЕТРИС : ) и справа - содержимое основных регистров (R13 представлен 2 раза - как вход и как выход) с расширенными флагами (A,B,C). Затем название TRIADOR-3A и последняя строка это вывод отладочной текстовой информации (если надо)...

P.S. В досе оно может выглядеть как-то вот так:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Shaos wrote:В досе оно может выглядеть как-то вот так:
или так (ещё похимичил с псевдографикой):
screen2.gif
P.S. Вот думаю наверное часы реального времени хотя бы с 1/10-секундной точностью не помешали бы.
Можно через виртуальную ячейку памяти данных организовать - рядом с особой ячейкой OOO OOO скажем.
2 трайта по 6 тритов, если инкрементировать их 10 раз в секунду, будут переполняться каждые 14.76 часов, а 3 трайта - каждые 448.4 дней
(чтобы поддержать полноценный unixtime с такой точностью потребуется чуть меньше 4 трайтов).
Либо сделать это программно по прерыванию от таймера 10 Гц - тогда ячейки лучше перенести в особое место, например 62,63,64 (трайт по адресу 64 считать младшим).
При обработке прерывания видимо придётся аппаратно сохранять регистры - как минимум R1,R2,R3,R4,R5,R11,R12 и R13.

Code: Select all

 align 27
timer:
 r4 OPN
 r3 POP
 RMH
 rr -2
 RML
 rr 1
 sk IFCARRY
 jp timer1r
 rr -5
 rr 2
 rr 1
 rr -2
 sk 0
 jp timer2
 rr 5
timer1r:
 WMM
 RET ; 4 instructions
timer2:
 rr 5
 WMM
 r1 seg timer2r
 rr -13
 r3 POO
 RMH
 rr -2
 RML ; new segment starts here
 rr 1
 sk IFCARRY 
 jp timer2r
 rr -5
 rr 2
 rr 1
 rr -2
 sk 0
 jp timer3
 rr 5
timer2r:
 WMM
 RET ; 4 instructions
timer3:
 rr 5
 WMM
 r3 PON
 RMH
 rr -2
 RML
 rr 1
 sk IFCARRY
 jp timer2r
 rr -5
 rr 2
 rr 1
 rr -2 ; new segment starts here
 ; ignore CARRY
 rr 5
 WMM
 RET ; 4 instructions
мда, проще по таймеру аппаратно инкрементировать - тогда особые ячейки таймера можно назначить в более логичном месте, скажем -1,-2,-3 (младшим будет трайт с адресом -1).

P.P.S. Наверное для круглоты имело бы смысл сделать счётчик времени не с 1/10, а с 1/9-секундной точностью или даже 1/27-секундной. В последнем случае для получения секунд надо будет просто отбросить младшую триаду счётчика, а в 4 трайта должен будет влезть 331.47 год (если считать 365.25 дней в году в среднем), но т.к. у нас половина диапазона будет с минусом, то это +165.73 лет в одну сторону и -165.73 в другую, т.е. от 1804 года до 2135-го (если точкой отсчёта такого юникстайма всё также считать 1 января 1970 года). Получается при частоте 27 Гц троичный таймер в
1 трайт будет покрывать 27 секунд (13.5 секунд без переполнения из плюса в минус)
2 трайта будут покрывать 5.47 часов (5 часов 28 минут и 3 секунды)
3 трайта будут покрывать 166.08 дней
4 трайта (как и было показано выше) будут покрывать 331.47 год

P.P.P.S. Хотя наверное считать десятые доли секунды всё-таки логичнее - тогда 4 трайта покроют почти 895 лет - от -447.48 до +447.48 или с 1522 по 2417 годы (если за ноль брать 1 января 1970 года), но мы можем начать с 3 трайтов, покрывающих только 448.4 дней (от 0 до 224.2 дней если использовать только положительные числа)...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net