|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Давайте думать над железкой (TRIADOR)
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Ну я там выше писал ведь примеры - MIN, MAX, MSK, CMP и может быть SUM То какие расширенные команды точно нужны можно проверить скажем на подпрограмме умножения триад, на выходе которой получается 6-тритный результат: Тут кроме JPI ещё используются RRC, RLC, ADD, ADC, SUB, SBC и оно уже занимает 2 с половиной страницы - если городить анализаторы переноса и инверсию+сложение вместо вычитания, то будет ещё длиннее... P.S. Для первоначального RLC/RRC пришлось обнулять флаг C таким образом: R1 0 ; R1=0 RR 1 ; R1++ (C=O) поэтому отдельная команда обнуления переноса CLC не помешала бы ( и её кстати можно изобразить из супер-пупер программируемой пермутации, что я изобрёл на предыдущей странице как собственно и RLC/RRC : ) P.P.S. Анализатор наличия переноса/заёма на самом деле относительно простой - для сложения: SK 0 ; skip if C==O RR 1 ; R1++ и для вычитания: SK 0 ; skip if C==O RR -1 ; R1-- так что возможно ADC и SBC действительно ненужны P.P.P.S. По поводу ненужности SUB - по идее таки да, чтобы изобразить R2-R1 надо лишь OP PON сделать перед сложением - вот вариант где кроме JPI есть только RLC,RRC и ADD, и он только на 6 инструкций длиннее:
|
05 May 2020 01:45 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
это что за модный листинг такой? чем его интерпретируешь?
|
05 May 2020 02:34 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
пока только головой получается, что я таки согласился с вами со всеми, что один единственный ADD может быть вполне самодостаточен чтобы покрыть все сложения и вычитания, но вот без RLC и RRC не обойтись никак (ну и до кучи CLC можно добавить): NNNNN - EX -13 -> ADD (C,R1=R1+R2) <<<<< единственный железобетонный ADD (а нужен ли он?) NNNNO - EX -12 -> CUSTOM CIRCUIT -12 NNNNP - EX -11 -> CUSTOM CIRCUIT -11 NNNON - EX -10 -> PMT-10 (programmable by PEX) NNNOO - EX -9 -> PMT-9 (programmable by PEX) NNNOP - EX -8 -> PMT-8 (programmable by PEX) NNNPN - EX -7 -> RLC (could be implemented as hardwired PMT) NNNPO - EX -6 -> CLC (could be implemented as hardwired PMT) NNNPP - EX -5 -> RRC (could be implemented as hardwired PMT) NNONN - EX -4 -> RMH (read higher triad from memory [27*R4+R3] to R1) NNONO - EX -3 -> WMM (write R2,R1 to memory [27*R4+R3]) NNONP - EX -2 -> RML (read lower triad from memory [27*R4+R3] to R1) NNOON - EX -1 -> JPI (store current PC+1 to R4,R3 and jump to R13,R2) NNOOO - EX 0 -> PEX (program OPB instances below and PMT instances above) NNOOP - EX +1 -> OPB №1 (R1=R1 o R2) - programmable by PEX or hardwired MSK? NNOPN - EX +2 -> OPB №2 (R1=R1 o R2) - programmable by PEX or hardwired MAX? NNOPO - EX +3 -> OPB №3 (R1=R1 o R2) - programmable by PEX or hardwired MIN? NNOPP - EX +4 -> OPB №4 (R1=R1 o R2) - programmable by PEX or hardwired CMP? NNPNN - EX +5 -> OPB №5 (R1=R1 o R2) - programmable by PEX or hardwired SUM? NNPNO - EX +6 -> OPB №6 (R1=R1 o R2) - programmable by PEX or hardwired OVF? NNPNP - EX +7 -> OPB №7 (R1=R1 o R2 where o is programmable by PEX or manually) NNPON - EX +8 -> OPB №8 (R1=R1 o R2 where o is programmable by PEX or manually) NNPOO - EX +9 -> OPB №9 (R1=R1 o R2 where o is programmable by PEX or manually) NNPOP - EX +10 -> CUSTOM CIRCUIT +10 (programmable by PEX?) NNPPN - EX +11 -> CUSTOM CIRCUIT +11 NNPPO - EX +12 -> CUSTOM CIRCUIT +12 NNPPP - EX +13 -> HLT ( halt and catch fire ; ) P.S. Вариант без обязательного ADD и с переносом всех "программируемых" команд и пользовательских схем вверх для логичности: NNNNN - EX -13 -> HLT ( halt and catch fire ; ) <<<<<<< перенесено по просьбе haqreu NNNNO - EX -12 -> CUSTOM CIRCUIT C (read any registers, writes R1 and C) NNNNP - EX -11 -> CUSTOM CIRCUIT B (read any registers, writes R1 and C) NNNON - EX -10 -> CUSTOM CIRCUIT A (read any registers, writes R1 and C) <<<< например это может быть ADD (C,R1=R1+R2) NNNOO - EX -9 -> PMT-9 (programmable by PEX) NNNOP - EX -8 -> PMT-8 (programmable by PEX) NNNPN - EX -7 -> PMT-7 (programmable by PEX) NNNPO - EX -6 -> OPB-6 (R1 = R1 o R2) - programmable by PEX NNNPP - EX -5 -> OPB-5 (R1 = R1 o R2) - programmable by PEX NNONN - EX -4 -> OPB-4 (R1 = R1 o R2) - programmable by PEX NNONO - EX -3 -> OPB-3 (R1 = R1 o R2) - programmable by PEX NNONP - EX -2 -> OPB-2 (R1 = R1 o R2) - programmable by PEX NNOON - EX -1 -> OPB-1 (R1 = R1 o R2) - programmable by PEX NNOOO - EX 0 -> PEX (program customizable EX instructions above using R1,R2,R3,R4) NNOOP - EX +1 -> CMP (hardwired OPB) NNOPN - EX +2 -> MIN (hardwired OPB) NNOPO - EX +3 -> MAX (hardwired OPB) NNOPP - EX +4 -> MUL (hardwired OPB) <<< это то что я раньше MSK называл - у людей это MUL NNPNN - EX +5 -> SUM (hardwired OPB) NNPNO - EX +6 -> CON (hardwired OPB) <<< консенсус (бывший OVF - для генерации трита переноса при суммировании) NNPNP - EX +7 -> CLC (hardwired PMT) <<< или очистка флага C слишком простая команда, чтобы под неё целый PMT отводить? NNPON - EX +8 -> RLC (hardwired PMT) NNPOO - EX +9 -> RRC (hardwired PMT) NNPOP - EX +10 -> WMM (write R2,R1 to memory [27*R4+R3]) NNPPN - EX +11 -> RML (read lower triad from memory [27*R4+R3] to R1) NNPPO - EX +12 -> RMH (read higher triad from memory [27*R4+R3] to R1) NNPPP - EX +13 -> JPI (store current PC+1 to R12,R11 and jump to R13,R1) <<<< сохранять в R12,R11 и прыгать на R13,R1 вроде логичнее?
PEX может программировать любые команды вверх и у каждой будет 9-тритовый регистр, который может быть использован внутри схемы. При попытке запрограммировать команды вниз PEX приведёт систему в режим Halt (либо ничего не произойдёт - надо подумать). Часть регистров PEX (а то может быть и все 13) можно использовать для вывода - например на светодиодный дисплейчик: (Автор гифки - JeNNeR)
|
05 May 2020 02:36 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
тупые вопросы: 1) что такое триада? 2) что такое rotate through C?
|
05 May 2020 02:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
1) триада это 3 трита 2) если имеем R1=XYZ и C то после выполнения RLC получили бы C=X R1=YZC а после выполнения RRC получим R1=CXY C=Z т.е. вращаем по кольцу в котором 4 элемента - три трита регистра R1 и флаг C
|
05 May 2020 02:53 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Ага, понял. Зачем вращать налево - понимаю, это умножение на 3. Зачем вращать направо?
|
05 May 2020 02:56 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
деление на 3 но в данном конкретном случае просто очередной трит выталкивается во флаг C и далее мы на него глядя либо прибавляем сдвинутое налево (при C=P), либо вычитаем сдвинутое налево (при C=N) либо идём на следующий цикл (при C=O) P.S. А вот интересно можно ли ADD реализовать с помощью OPB? Скажем запрограммированный как SUM бинарный оператор сложит триты и далее надо понять были ли переносы: N+N=P --> N N+O=N N+P=O O+N=N O+O=O O+P=P P+N=O P+O=P P+P=N --> P Выходит чтобы переносы узреть нужен OPB=NOOOOOOOP и далее корректируем: скажем PPP+OOP SUM даст PPN OVF даст OOP сдвигаем влево - OPO складываем снова потритно SUM даст PNN OVF даст OPO сдвигаем влево - POO складываем снова потритно SUM даст NNN OVF даст POO сдвигаем влево - OOO (и C=P) алгоритм пойдет на сложение и получит все тот же NNN и выскочит т.к. OVF вернет 0 получается без ADD тоже можно обойтись тут в худшем случае будет 3 прохода (как в вышеописанном примере), а в лучшем - только 1 (когда переносов не выявится на первом же шаге) ну что - делаем триадор без сумматора?
|
05 May 2020 03:04 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
ладно, лишнюю болтовню я удаляю, согласен с тем, что вращение хорошо, из него сделать деление несложно.
|
05 May 2020 04:14 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
заслал пулл-реквест https://github.com/ssloy/triador/pull/2там 2 коммита - фикс OP и виртуальный метод для внешней обработки EX, чтобы можно было кастомно расширять не трогая исходники триадора P.S. уже 4 коммита - коммент поправил в обработчике EX и переименовал виртуальный метод в do_ex чтобы стилю соответстовал
|
05 May 2020 19:25 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Смерджил ; я помимо прочего исправил формат программ и перемешал скипы (если не забыл). Актуальное описание архитектуры тут и тутТекущий вариант сложения выглядит следующим образом: Там в итоге побились программы, как найду время, почищу всё.
|
05 May 2020 23:47 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Прицепил обновлённые доки на первой странице этого топика и обновил список скипов там же На досуге попробую реализовать последний вариант EX-таблицы что выше и постараюсь написать программу умножения без ADD P.S. Halt and catch fire вроде бы у тебя был EX 13?P.P.S. Думаю про "вумный" ассемблер, который будет псевдоинструкцию JMP label превращать либо в JP x (если передача управления происходит в пределах страницы и R13 не поменялся) либо в
R1 y RR -13 JP x
(если метка лежит за пределами страницы или R13 больше не совпадает с номером сегмента куда идёт переход)
Плюс макросы поддержать, например для того же CLC можно иметь: И видимо надо этот ассемблер научить отслеживать где будет неявная порча регистра R1 внутри макроса и попытка его использовать после макроса чтобы выдавать ошибку. R13 тоже придётся отслеживать чтобы корректно JMP компилировать в одну либо 3 инструкции? Ну или просто сделать макрос JMP для дальних прыжков и пусть программист сам следит за своими адресами и содержимым R13: Этот ассемблер может выдавать листинг файлы, пригодные для скармливания в эмулятор триадора (адреса будут укзаны в каждой строке как комментарии), а также бинарные файлы 2К-образа ПЗУ для моего логисимовского симулятора триадора TRIADOR2.INC | | | | Code: ; TRIADOR-2 definitions for assembler TRIADORA ; Created by Alexander A. Shabarshin <me@shaos.net>
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
; >>>>> SKIP MACROS
IF_R4LE0 EQU -13 IF_R4NE0 EQU -12 IF_R4GE0 EQU -11 IF_R3LE0 EQU -10 IF_R3NE0 EQU -9 IF_R3GE0 EQU -8 IF_R2LE0 EQU -7 IF_R2NE0 EQU -6 IF_R2GE0 EQU -5 IF_R1LE0 EQU -4 IF_R1NE0 EQU -3 IF_R1GE0 EQU -2 IF_BORROW EQU -1 IF_NOOVER EQU 0 IF_CARRY EQU 1 IF_R1LT0 EQU 2 IF_R1EQ0 EQU 3 IF_R1GT0 EQU 4 IF_R2LT0 EQU 5 IF_R2EQ0 EQU 6 IF_R2GT0 EQU 7 IF_R3LT0 EQU 8 IF_R3EQ0 EQU 9 IF_R3GT0 EQU 10 IF_R4LT0 EQU 11 IF_R4EQ0 EQU 12 IF_R4GT0 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 L: RR -13 ENDM
; Clear flag C CLC MACRO R1 0 RR 1 ENDM
; Decrement R1 with updating flag C DEC MACRO RR -1 ENDM
; No operations NOP MACRO RR 0 ENDM
; Increment R1 with updating flag C INC MACRO RR 1 ENDM
; >>>>> EXTENDED INSTRUCTIONS
; 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 1 ENDM
; >>>>> DATA MEMORY ACCESS
; Read data memory from address R4,R3 and store lower triade to R1 RML MACRO EX 2 ENDM
; Write R2,R1 to data memory address R4,R3 WMM MACRO EX 3 ENDM
; Read data memory from address R4,R3 and store higher triade to R1 RMH MACRO EX 4 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 EX 4 RR -2 EX 2 ENDM
; Write R2,R1 to data memory address A WMA MACRO A R1 SEG A RR -4 R1 OFF A RR -3 EX 3 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 EX 3 ENDM
; >>>>> BINARY TRITWISE OPERATIONS
MIN MACRO EX 5 ENDM
MSK MACRO EX 6 ENDM
MAX MACRO EX 7 ENDM
SUM MACRO EX 8 ENDM
OVF MACRO EX 9 ENDM
CMP MACRO EX 10 ENDM
; >>>>> PREDEFINED PERMUTATIONS
RLC MACRO EX 11 ENDM
RRC MACRO EX 12 ENDM
; >>>>> HALT AND CATCH FIRE
HLT MACRO EX 13 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
CALL MACRO A R1 SEG A RR -13 R1 OFF A EX 1 ENDM
RET MACRO RR 12 RR -13 RR 11 EX 1 ENDM
SP 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 EX 3 RR 9 RR -1 RR -9 RR 10 SK 0 RR -1 RR -10 ENDM
RETURN MACRO RR 9 RR 1 RR -9 RR -3 RR 10 SK 0 RR 1 RR -10 RR -4 EX 4 RR -13 EX 2 EX 1 ENDM
PUSHRR MACRO H,L RR 10 RR -4 RR 9 RR -3 RR H RR -2 RR L EX 3 RR 9 RR -1 RR -9 RR 10 SK 0 RR -1 RR -10 ENDM
POPRR MACRO H,L RR 9 RR 1 RR -9 RR -3 RR 10 SK 0 RR 1 RR -10 RR -4 EX 4 RR -H EX 2 ; IF L NE 1 RR -L ; ENDIF ENDM
| | | | |
чего-то пуши с попами тяжеловастые получаются - в половину сегмента длиной - наверное надо подумать про микрокодовые CALL и RET внутри кастомных EX-команд или у нас типа RISC?...
|
06 May 2020 00:55 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Адреса Oxxxxx отображаются на первый килобайт ПЗУ, а Pxxxxx - на второй, вот его как раз и можно листать, скажем записывая 2 триады по адресу PPP PPP через EX - получается мы можем листать 729 страниц по 243 ячеек каждая или 177147 ячеек всего (плюс нелистаемые 243 ячейки в области Oxxxxx где может сидеть BIOS) - тетрис думаю в такое страничное ПЗУ должен влезть Nxxxxx как и написано выше может являться частью ОЗУ, которое доступно для записи и чтения через EX (т.е. верхние 243 слова ОЗУ будут отображаться в память программ для возможной загрузки и запуска пользовательского кода) - ОЗУ также можно будет частично заставить листаться, если 729 слов окажется мало...
|
09 May 2020 01:25 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Да что ж ты так торопишься с расширением-то! HCF я хочу в EX -13, этой команде нельзя не дать красивый номер NN NNN.
|
09 May 2020 01:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
ок, а то ты было её в EX 0 сдвинул в последнем варианте и я пока расширяюсь "виртуально", чтобы поглядеть что из этого может получиться в симуляторе P.S. я там на первой странице примерно разбил архитектуру на "поколения": я пытаюсь 3е поколение продумать (и просимулировать) в том объёме, чтобы можно было реальный чип троичного микроконтроллера (с внешней памятью) сделать | | | | Shaos wrote: Вариант без обязательного ADD и с переносом всех "программируемых" команд и пользовательских схем вверх для логичности: NNNNN - EX -13 -> HLT ( halt and catch fire ; ) <<<<<<< перенесено по просьбе haqreu NNNNO - EX -12 -> CUSTOM CIRCUIT C (read any registers, writes R1 and C) NNNNP - EX -11 -> CUSTOM CIRCUIT B (read any registers, writes R1 and C) NNNON - EX -10 -> CUSTOM CIRCUIT A (read any registers, writes R1 and C) <<<< например это может быть ADD (C,R1=R1+R2) NNNOO - EX -9 -> PMT-9 (programmable by PEX) NNNOP - EX -8 -> PMT-8 (programmable by PEX) NNNPN - EX -7 -> PMT-7 (programmable by PEX) NNNPO - EX -6 -> OPB-6 (R1 = R1 o R2) - programmable by PEX NNNPP - EX -5 -> OPB-5 (R1 = R1 o R2) - programmable by PEX NNONN - EX -4 -> OPB-4 (R1 = R1 o R2) - programmable by PEX NNONO - EX -3 -> OPB-3 (R1 = R1 o R2) - programmable by PEX NNONP - EX -2 -> OPB-2 (R1 = R1 o R2) - programmable by PEX NNOON - EX -1 -> OPB-1 (R1 = R1 o R2) - programmable by PEX NNOOO - EX 0 -> PEX (program customizable EX instructions above using R1,R2,R3,R4) NNOOP - EX +1 -> CMP (hardwired OPB) NNOPN - EX +2 -> MIN (hardwired OPB) NNOPO - EX +3 -> MAX (hardwired OPB) NNOPP - EX +4 -> MUL (hardwired OPB) <<< это то что я раньше MSK называл - у людей это MUL NNPNN - EX +5 -> SUM (hardwired OPB) NNPNO - EX +6 -> CON (hardwired OPB) <<< консенсус (бывший OVF - для генерации трита переноса при суммировании) NNPNP - EX +7 -> CLC (hardwired PMT) <<< или очистка флага C слишком простая команда, чтобы под неё целый PMT отводить? NNPON - EX +8 -> RLC (hardwired PMT) NNPOO - EX +9 -> RRC (hardwired PMT) NNPOP - EX +10 -> WMM (write R2,R1 to memory [27*R4+R3]) NNPPN - EX +11 -> RML (read lower triad from memory [27*R4+R3] to R1) NNPPO - EX +12 -> RMH (read higher triad from memory [27*R4+R3] to R1) NNPPP - EX +13 -> JPI (store current PC+1 to R12,R11 and jump to R13,R1) <<<< сохранять в R12,R11 и прыгать на R13,R1 вроде логичнее?
PEX может программировать любые комманды вверх и у каждой будет 9-тритовый регистр, который может быть использован внутри схемы. При попытке запрограммировать команды вниз PEX приведёт систему в режим Halt (либо ничего не произойдёт - надо подумать). Часть регистров PEX можно использовать для вывода - например на светодиодный дисплейчик: (Автор гифки - JeNNeR) | | | | |
P.P.S. Может быть PEX при R4=0 заставить программировать границы программируемых OPB / PMT / CUSTOM CIRCUIT ? Как например R1 - будет означать начало области PMT (т.е. область OPB будет простираться от -1 до предыдущего индекса - сделав R1=-1 можно запретить OPB вовсе), R2 - начало области CUSTOM CIRCUITS и R3 - начало области HLT (при желании можно сделать разные хальты, которые скажем разные лампочки будут зажигать при остановке) (значения по умолчанию -7, -10 и -13)
|
09 May 2020 10:58 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
где-то на тысячном корпусе микросхем для триадора я всё же запаял один задом наперёд
|
12 May 2020 11:36 |
|
|
Who is online |
Users browsing this forum: No registered users and 4 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
|
|