Давайте думать над железкой (TRIADOR)
Moderator: haqreu
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Без памяти программ мой триадор будет иметь меньше 250 тримуксов, то есть меньше 500 муксов. А если сделать память программ с запоминанием по уровню (вроде бы, я даже представляю как), то влезет с хорошим запасом.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Вообще-то да, я в своём логисимовском варианте (с двоичной памятью, где нету пока ни джампов, ни скипов) насчитал 272 мультиплексора - так что можем и влезтьhaqreu wrote:Без памяти программ мой триадор будет иметь меньше 250 тримуксов, то есть меньше 500 муксов. А если сделать память программ с запоминанием по уровню (вроде бы, я даже представляю как), то влезет с хорошим запасом.

P.S. Оставаясь в DIP48 минимальная распиновка может быть такой:
1 земля
1 питание
1 вход тактирования
6 адрес для внешней памяти
5 слово из внешней памяти
3 тестовых выхода (подцепляются к внутренним точкам в зависимости от тестового адреса)
3 тестовый адрес (чтобы покрыть 27 тестовых триад идущих изнутри схемы для тестовых целей)
3 входы для R13 (по умолчанию цепляются к выходам R13) - это нужно для организации клавиатуры калькулятора (можно это автоматом зацепить на R13 если скажем тестовый адрес будет NNN)
вместо вывода содержимого ВСЕХ регистров одновременно, просто цепляем их на тестовые выходы при выборе специального тестового адреса (скажем от OOP до PPP будут цепляться к регистрам, OOO и OON к половинкам PC и т.д.)
всего получилось 23 ноги
для организации EX снаружи нужно будет ещё 4 ноги отвести под ввод результата (для записи в регистр R1 и флаг C) и 5й сигнал управления куда пишем - в регистр R1 (+1), никуда (0) или в PC (-1)
в этом случае получится 28 ног (остальные ноги будут задействованы под другие тестовые схемы) - если всё с ходу заработает, то можно будет остатки кристаллов запаковать в DIP28 и раздавать как законченный троичный микроконтроллер

P.P.S. Забыл про вход сброса. Кроме того можно предусмотреть несколько сигналов для наращивания разрядности (путем подключения нескольких модулей в параллель) - как минимум надо иметь 2 входа для инкремента и декремента (от соседней младшей секции), а также что-то придумать со знаком в скипах (например вход определения знака от соседней старшей секции).
Только я пока не понял хватит ли одного входа или надо иметь 4 входа для всех четырех регистров (скорее всего всех 4х). Ещё копирование числа в регистр - старшую половинку регистров надо обнулять - для этого ещё один вход будет нужен. Точнее не обнулять, а заполнять знаком записываемым в младшую половинку числом (берётся из кода команды)...
В любом случае мы уже вылезаем за пределы DIP28, но остаемся в пределах DIP40...
P.P.P.S. Кстати я всё ещё планирую сделать одноплатный вариант триадора-калькулятора...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Я тут подумал, что в принципе можно обойтись без регистра инструкций. Его единственное назначение - сделать задержку в выборке новой инструкции при изменениях в счётчике (это важно для безусловных переходов). Но внутри счётчика ведь стоят ячейки памяти с запоминанием по фронту NOP, ведущая и ведомая защёлки. В данный момент при записи в счётчик я пишу одно и то же значение и в ведущую, и в ведомую. А ведь можно сделать запись только в ведущую, и ведомая получит новое значение только после клока. Вот вам и необходимая задержка....
И ведь когда-то Shaos мне объяснял, что так делать не надо, правда, в несколько другом контексте. Только не могу вспомнить, почему.
Буду думать и, возможно, резать дорожки на текстолите
Если получится, то это ж целых 10 тримуксов экономии.
UPDATE "на всякий случай". Мда
viewtopic.php?f=79&t=11303&start=15#p135556
И ведь когда-то Shaos мне объяснял, что так делать не надо, правда, в несколько другом контексте. Только не могу вспомнить, почему.
Буду думать и, возможно, резать дорожки на текстолите

Если получится, то это ж целых 10 тримуксов экономии.
UPDATE "на всякий случай". Мда

viewtopic.php?f=79&t=11303&start=15#p135556
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Пришло время описать очередной кусок АЛУ. В железе ещё не тестировал, но ошибиться там негде. Итак, инструкция SK.
Начинается всё с того, что нам нужно из оперативной памяти вытащить регистр R1, R2, R3 или R4. Выбор регистра зависит от старших двух тритов операнда команды (OC3 и OC2).

Обратите внимание, что когда OC3=OC2=0, то в моей аппаратной реализации будет выбран регистр R1, но это не суть важно, т.к. в таком случае всё равно результат операции будет зависеть не от регистров, но от флага заёма-переноса.
Итак, в память мы обратились, из памяти получили число Q. Теперь готовим 9 линий c условиями:

И используем эти условия в зависимости от знака числа (OC3 OC2) (он посчитан на верхней картинке) и младшего трита OC1:

Особенностью аппаратной реализации является то, что на линии skip next появляется хоть какой-то сигнал только если нужно пропускать команду. Если ничего пропускать не нужно, то линия ни к чему не подключена. Ну а дешифратор команд сам слабо подтягивает эту линию к -5 В, это используется как раз для сброса флага переноса.
В следующих сериях ждите последний (самый толстый) срез АЛУ: команды копирования.
Начинается всё с того, что нам нужно из оперативной памяти вытащить регистр R1, R2, R3 или R4. Выбор регистра зависит от старших двух тритов операнда команды (OC3 и OC2).

Обратите внимание, что когда OC3=OC2=0, то в моей аппаратной реализации будет выбран регистр R1, но это не суть важно, т.к. в таком случае всё равно результат операции будет зависеть не от регистров, но от флага заёма-переноса.
Итак, в память мы обратились, из памяти получили число Q. Теперь готовим 9 линий c условиями:

И используем эти условия в зависимости от знака числа (OC3 OC2) (он посчитан на верхней картинке) и младшего трита OC1:

Особенностью аппаратной реализации является то, что на линии skip next появляется хоть какой-то сигнал только если нужно пропускать команду. Если ничего пропускать не нужно, то линия ни к чему не подключена. Ну а дешифратор команд сам слабо подтягивает эту линию к -5 В, это используется как раз для сброса флага переноса.
В следующих сериях ждите последний (самый толстый) срез АЛУ: команды копирования.
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Симпатично, и заодно будут одинаковой длительности ступеньки. Правда, использование двоичной техники 

-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Вот так должен будет выглядеть АЛУ, вид с высоты птичьего полёта:

В нём пять срезов, отвечающих каждый за свою операцию, и одна ячейка памяти - флаг переноса. Флаг переноса недоступен снаружи АЛУ. Его значение устанавливается только срезом RR, а читается только срезом SK.
Каждый срез нарисован коробочкой, в которой входные сигналы обозначены слева, а генерируемые выходные сигналы обозначены справа.
Так, например, в срезе SK (я его рисовал на уровне тримуксов на предыдущей странице), реальный выход только один - сигнал SKIP_NEXT, но в то же время этот срез обязан обратиться к регистрам, поэтому он на выходах Rhi, Rmi, Rlo генерирует номер регистра для платы памяти, и потом на входах Qhi, Qmi, Qlo читает его значение.
Все входы-выходы АЛУ соответствуют общей схеме триадора:

Единственный недокументированный срез остался RR. В скором времени надеюсь нарисовать полную его схему на уровне тримуксов.

В нём пять срезов, отвечающих каждый за свою операцию, и одна ячейка памяти - флаг переноса. Флаг переноса недоступен снаружи АЛУ. Его значение устанавливается только срезом RR, а читается только срезом SK.
Каждый срез нарисован коробочкой, в которой входные сигналы обозначены слева, а генерируемые выходные сигналы обозначены справа.
Так, например, в срезе SK (я его рисовал на уровне тримуксов на предыдущей странице), реальный выход только один - сигнал SKIP_NEXT, но в то же время этот срез обязан обратиться к регистрам, поэтому он на выходах Rhi, Rmi, Rlo генерирует номер регистра для платы памяти, и потом на входах Qhi, Qmi, Qlo читает его значение.
Все входы-выходы АЛУ соответствуют общей схеме триадора:

Единственный недокументированный срез остался RR. В скором времени надеюсь нарисовать полную его схему на уровне тримуксов.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Возвращаясь к сообщению от 27 ноября прошлого года про возможную программируемость EX инструкций - на самом деле программировать можно не только логические операции (OPB), но и арифметические - и вот каким образом:Shaos wrote:По поводу EX - по идее программировать надо только OPB и их будет больше одного (например один запрограммировать как потритовый MAX, другой как потритовый MIN и т.д.) поэтому - EX 0 отведём под программирование OPB - в R1 будет код какой EX программируем (1,2,3 и т.д.), в R2,R3,R4 соответственно 9-тритовый код универсальной бинарной троичной операции. Кроме того надо добавить доступ к памяти и ALU:
NNNNN - EX -13 -> RML (read lower triad from memory [R3,R4] to R1)
NNNNO - EX -12 -> WMM (write R2,R1 to memory [R3,R4])
NNNNP - EX -11 -> RMH (read higher triad from memory [R3,R4] to R1)
NNNON - EX -10 -> RRC (rotate R1 right through C)
NNNOO - EX -9 -> SUB (C,R1=R1-R2)
NNNOP - EX -8 -> SBC (C,R1=R1-R2+C)
NNNPN - EX -7 -> RLC (rotate R1 left through C)
NNNPO - EX -6 -> ADD (C,R1=R1+R2)
NNNPP - EX -5 -> ADC (C,R1=R1+R2+С)
NNONN - EX -4 -> TSK (ternary skip on R4 sign) ??? \
NNONO - EX -3 -> TSK (ternary skip on R3 sign) ??? -} не, не нравится мне двойной скип...
NNONP - EX -2 -> TSK (ternary skip on R2 sign) ??? /
NNOON - EX -1 -> JPI (store current PC+1 to R3,R4 and jump to R13,R2)
NNOOO - EX 0 -> PEX (program OPB instances below)
NNOOP - EX +1 -> OPB №1 (R1=R1 o R2)
NNOPN - EX +2 -> OPB №2 (R1=R1 o R2)
NNOPO - EX +3 -> OPB №3 (R1=R1 o R2)
NNOPP - EX +4 -> OPB №4 (R1=R1 o R2)
...
P.S. Команда JPI может быть использована, чтобы сымитировать CALL и RET
Напомню, что PEX программирует команды в EX беря триады из R1,R2,R3 и R4
В случае логической команды (OPB) R1-R2-R3 могут задавать 9-тритовый код бинарной операции, а R4 - код команды, которую мы собственно меняем в блоке EX (это логичнее того, что я писал в процитированном выше)
В случае арифметической команды R4 всё также может задавать код команды, а вот другие регистры могут интерпретироваться следующим образом:
R1 и R2 задают входные аргументы - отрицательное число означает регистр берётся с отрицанием, -1 и +1 всё также будут означать R1-1 и R1+1 и 0 будет означать R1
R3 несёт в себе 3 трита, которые программируют разные опциональные вещи для арифметики, например:
старший трит:
+1 означает, что мы прибавляем флаг C
0 означает игнорирование флага C (и на входе, и на выходе)
-1 означает, что мы вычитаем флаг C (а имеет ли это смысл?)
средний трит:
+1 означает, что мы сдвигаем первый аргумент влево на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
0 означает неизменный первый аргумент
-1 означает, что мы сдвигаем первый аргмуент вправо на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
младший трит:
+1 означает, что второй аргумент мы считаем числом, а не указателем на регистр
0 означает неизменный второй аргумент
-1 означает использование теневых регистров (?)
в результате арифметической операции всегда будет устанавоиваться флаг C (и результат всегда будет сохраняться в R1)
Таким образом мы покрыли и сложение-вычитание, и сдвиги, а также их комбинации - теперь можно одной инструкцией делать всякие хитрые вещи типа:
R1 = R13 + R1 + 1
или
R1 = 3 * R12 - R11 + С
или
R1 = R4 / 3 + 0
и т.д.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Начинаю рисовать последний срез АЛУ: операцию RR. Как и раньше, внешние сигналы подписаны оранжевым, а внутренние сигналы подписаны фиолетовым. Напоминаю, чем занимается эта операция:
OC4 и OC5 у всех опкодов равны OO, поэтому они участвуют только в генерации сигнала EN_RR на уровне дешифратора инструкций, и в АЛУ не используются. Младшие же три трита говорят, откуда куда нужно копировать. Если младшие три трита образуют отрицательное число, то мы копируем из из R1 в минус OC3-1, а если младшие три трита OC3-1 дают положительное число, то мы копируем из OC3-1 в R1.
Поэтому вот первый кусок среза АЛУ, который занимается генерацией адресов регистров. Перво-наперво мы сразу готовим минус OC3-1; затем в зависимости от знака OC3-1 мы готовим шесть сигналов FROM и TO:

Ну а затем остаётся адресовать память в зависимости от текущего цикла. Напоминаю, что цикл N служит для запроса опкода из памяти команд, цикл O для запроса из регистров во временный буфер АЛУ, а цикл P для сохранения результата вычислений обратно в память.

Как и раньше, синим покрашены мультиплексоры, которые не участвуют непосредственно в вычислениях, но устраняют конфликты между срезами АЛУ в генерации различных выходных сигналов АЛУ. Пойду рисовать остаток среза.
Code: Select all
OONNN — copy R1 to R13
OONNO — copy R1 to R12
OONNP — copy R1 to R11
OONON — copy R1 to R10
OONOO — copy R1 to R9
OONOP — copy R1 to R8
OOPON — copy R1 to R7
OOPOO — copy R1 to R6
OOPOP — copy R1 to R5
OOONN — copy R1 to R4
OOONO — copy R1 to R3
OOONP — copy R1 to R2
OOOON — decrement R1, set borrow/carry flag
OOOOO — no operation
OOOOP — increment R1, set borrow/carry flag
OOOPN — copy R2 to R1
OOOPO — copy R3 to R1
OOOPP — copy R4 to R1
OOPNN — copy R5 to R1
OOPNO — copy R6 to R1
OOPNP — copy R7 to R1
OOPON — copy R8 to R1
OOPOO — copy R9 to R1
OOPOP — copy R10 to R1
OOPPN — copy R11 to R1
OOPPO — copy R12 to R1
OOPPP — copy R13 to R1
Поэтому вот первый кусок среза АЛУ, который занимается генерацией адресов регистров. Перво-наперво мы сразу готовим минус OC3-1; затем в зависимости от знака OC3-1 мы готовим шесть сигналов FROM и TO:

Ну а затем остаётся адресовать память в зависимости от текущего цикла. Напоминаю, что цикл N служит для запроса опкода из памяти команд, цикл O для запроса из регистров во временный буфер АЛУ, а цикл P для сохранения результата вычислений обратно в память.

Как и раньше, синим покрашены мультиплексоры, которые не участвуют непосредственно в вычислениях, но устраняют конфликты между срезами АЛУ в генерации различных выходных сигналов АЛУ. Пойду рисовать остаток среза.
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Итак, окончание среза RR. Напоминаю, что на цикле N мы получаем инструкцию, на цикле O мы копируем из памяти во внутренний буфер, а на цикле P копируем результат обратно в память. Это означает, что если цикл = P и присутствует сигнал EN_RR, то мы пропускаем клок в карту памяти:

Адресация карты памяти была разобрана ранее, теперь нам осталось только подготовить вход A карты памяти и borrow/carry флаг.
Вот остаток среза:

На цикле O мы копируем из выбранного регистра в три ячейки буфера, а затем, если знак OC3-2 ненулевой, подаём этот буфер на вход карты памяти A. Если же OC3-2 нулевой, то нам нужно увеличить/уменьшить на единичку значение в буфере. Пропускаем буфер через каскад полусумматоров, и его выход снова идёт на вход памяти.
Ну и в качестве финального аккорда второй выход каскада полусумматоров идёт на вход ячейки borrow/carry, и мы клокаем его только если OC3=0 и OC2=0 и OC1!=0.
На всякий случай, упрощённая версия этого среза подробно расписана тут:
https://habr.com/post/337606/
В сумме этот срез требует 59 мультиплексоров (30 платок тримукса). Теперь АЛУ полностью документирован, осталось развести и паять.

Адресация карты памяти была разобрана ранее, теперь нам осталось только подготовить вход A карты памяти и borrow/carry флаг.
Вот остаток среза:

На цикле O мы копируем из выбранного регистра в три ячейки буфера, а затем, если знак OC3-2 ненулевой, подаём этот буфер на вход карты памяти A. Если же OC3-2 нулевой, то нам нужно увеличить/уменьшить на единичку значение в буфере. Пропускаем буфер через каскад полусумматоров, и его выход снова идёт на вход памяти.
Ну и в качестве финального аккорда второй выход каскада полусумматоров идёт на вход ячейки borrow/carry, и мы клокаем его только если OC3=0 и OC2=0 и OC1!=0.
На всякий случай, упрощённая версия этого среза подробно расписана тут:
https://habr.com/post/337606/
В сумме этот срез требует 59 мультиплексоров (30 платок тримукса). Теперь АЛУ полностью документирован, осталось развести и паять.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Общее количество тримуксов уже известно?haqreu wrote:В сумме этот срез требует 59 мультиплексоров (30 платок тримукса). Теперь АЛУ полностью документирован, осталось развести и паять.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
На весь триадор? С точностью до +- 10 могу посчитать, да. Единственная не нарисованная ещё схема - это схема инициализации.
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Давайте думать над железкой
Я тут по случаю читал цикл статеек: История языков программированияLavr wrote:Я не готов это детально прокомментировать сейчас, но мне казалось, в троичной системе должен бытьhaqreu wrote:По знаку можно иметь три разных джампа - jump zero, jump positive, jump negative...
один условный джамп на три условия.
Так оказывается один условный джамп на три условия был ещё в FORTRAN-e:

Насколько я припоминаю, и в старых BASIC-ax похожая конструкция была...При этом Фортран оставался языком, приближенным к машинам.
Например, там существовало такое:
if (выражение) doneg, dozero, dopos
iLavr
-
- Devil
- Posts: 905
- Joined: 26 May 2003 06:57
Re: Давайте думать над железкой
Был ещё в Фокале.Lavr wrote:Так оказывается один условный джамп на три условия был ещё в FORTRAN-e
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Лучшие игры 2020
Два года уж как скоро будет - подходит такое решение то?Shaos wrote:Возвращаясь к сообщению от 27 ноября прошлого года про возможную программируемость EX инструкций - на самом деле программировать можно не только логические операции (OPB), но и арифметические - и вот каким образом:Shaos wrote:По поводу EX - по идее программировать надо только OPB и их будет больше одного (например один запрограммировать как потритовый MAX, другой как потритовый MIN и т.д.) поэтому - EX 0 отведём под программирование OPB - в R1 будет код какой EX программируем (1,2,3 и т.д.), в R2,R3,R4 соответственно 9-тритовый код универсальной бинарной троичной операции. Кроме того надо добавить доступ к памяти и ALU:
NNNNN - EX -13 -> RML (read lower triad from memory [R3,R4] to R1)
NNNNO - EX -12 -> WMM (write R2,R1 to memory [R3,R4])
NNNNP - EX -11 -> RMH (read higher triad from memory [R3,R4] to R1)
NNNON - EX -10 -> RRC (rotate R1 right through C)
NNNOO - EX -9 -> SUB (C,R1=R1-R2)
NNNOP - EX -8 -> SBC (C,R1=R1-R2+C)
NNNPN - EX -7 -> RLC (rotate R1 left through C)
NNNPO - EX -6 -> ADD (C,R1=R1+R2)
NNNPP - EX -5 -> ADC (C,R1=R1+R2+С)
NNONN - EX -4 -> TSK (ternary skip on R4 sign) ??? \
NNONO - EX -3 -> TSK (ternary skip on R3 sign) ??? -} не, не нравится мне двойной скип...
NNONP - EX -2 -> TSK (ternary skip on R2 sign) ??? /
NNOON - EX -1 -> JPI (store current PC+1 to R3,R4 and jump to R13,R2)
NNOOO - EX 0 -> PEX (program OPB instances below)
NNOOP - EX +1 -> OPB №1 (R1=R1 o R2)
NNOPN - EX +2 -> OPB №2 (R1=R1 o R2)
NNOPO - EX +3 -> OPB №3 (R1=R1 o R2)
NNOPP - EX +4 -> OPB №4 (R1=R1 o R2)
...
P.S. Команда JPI может быть использована, чтобы сымитировать CALL и RET
Напомню, что PEX программирует команды в EX беря триады из R1,R2,R3 и R4
В случае логической команды (OPB) R1-R2-R3 могут задавать 9-тритовый код бинарной операции, а R4 - код команды, которую мы собственно меняем в блоке EX (это логичнее того, что я писал в процитированном выше)
В случае арифметической команды R4 всё также может задавать код команды, а вот другие регистры могут интерпретироваться следующим образом:
R1 и R2 задают входные аргументы - отрицательное число означает регистр берётся с отрицанием, -1 и +1 всё также будут означать R1-1 и R1+1 и 0 будет означать R1
R3 несёт в себе 3 трита, которые программируют разные опциональные вещи для арифметики, например:
старший трит:
+1 означает, что мы прибавляем флаг C
0 означает игнорирование флага C (и на входе, и на выходе)
-1 означает, что мы вычитаем флаг C (а имеет ли это смысл?)
средний трит:
+1 означает, что мы сдвигаем первый аргумент влево на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
0 означает неизменный первый аргумент
-1 означает, что мы сдвигаем первый аргмуент вправо на 1 трит (с использованием флага C, если предыдущий трит не равен нулю)
младший трит:
+1 означает, что второй аргумент мы считаем числом, а не указателем на регистр
0 означает неизменный второй аргумент
-1 означает использование теневых регистров (?)
в результате арифметической операции всегда будет устанавоиваться флаг C (и результат всегда будет сохраняться в R1)
Таким образом мы покрыли и сложение-вычитание, и сдвиги, а также их комбинации - теперь можно одной инструкцией делать всякие хитрые вещи типа:
R1 = R13 + R1 + 1
или
R1 = 3 * R12 - R11 + С
или
R1 = R4 / 3 + 0
и т.д.

P.S. Не надо удивляться тому, что это сообщение возникло ниоткуда - это сделано специально, чтобы сдвинуть первое видео из троичного сериала от haqreu на следующую страницу

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Вам это может показаться удивительным, но я жив и от своих планов не отказывался!
Давайте праздновать сто пятидесятый день рождения дедушки Ленина!
В принципе, никакой новой информации, просто я наконец-то закончил плату памяти с тринадцатью трёхтритными ячейками памяти, что подробно описываю.
Давайте праздновать сто пятидесятый день рождения дедушки Ленина!
В принципе, никакой новой информации, просто я наконец-то закончил плату памяти с тринадцатью трёхтритными ячейками памяти, что подробно описываю.