1

(12 ответов, оставленных в Всякое разное)

uav1606 пишет:

Пишет, что "автор убрал это видео из открытого доступа".

Спасибо!
Исправил!

Однако, схема - схемой, а во сне обнаружил очередную проблему и сейчас пытаюсь её переварить.
Оказывается, в комбинаторике кода возможна ситуация, когда в префиксе и делегат, и базовый регистр - один и тот же РОН (ссылка на тот сегмент, что и основание). Что совсем уж нехорошо! neutral

P.S.: Соседние любительские архитектуры развиваются относительно легко, так как там всё по классике жанра.
А у меня - даже полный эмулятор на JavaScript не могу описать из-за кучи концептуальных нюансов.



2

(12 ответов, оставленных в Всякое разное)

Набросал эскиз схемы разбора потока префиксов на ТТЛ-номенклатуре и записал видео симуляции работы (или в YouTube).
Как-то не верится, что готовой индустриальной ИМС не существует!
Наверное, следует прошерстить справочники?

По анимации работы легко видеть, что принцип - аналогичен работе панели управления лифта, но работает по следующим правилам:

  • Нажатие кнопки у выключенного флажка - включает флажок и вырабатывает статус SHIFT

  • Нажатие «базовой кнопки» сбрасывает все флажки и вырабатывает статус ROTATE

  • Нажатие кнопки у уже включенного флажка повторно - сбрасывает остальные флажка и вырабатывает сигналы ROTATE и SHIFT

Можете запустить онлайн скрипт с визуализацией вычислений (строки is_rotate и is_shift производят аналогичные схеме действия), а так же запустить в онлайн эмуляторе аналогичный код ниже



3

(12 ответов, оставленных в Всякое разное)

Удалось продвинуться в концепции благодаря нейросетевым сессиям.

Научить нейросеть корректно генерировать код, увы, так и не удалось.
Бот это объясняет тем, что:

  1. Не имеет в своей БД аналогов

  2. Код является контекстно-зависимым

  3. WYSIWISC - целая философия

Например, рассмотрим пример кодирования выражения

B12 |= (B34 ^= C56 & A78) + (A98 - C765)

Атомарное кодирование:

BA              CTX     B,A
   B1           REG     B1
      A7        MOV     B1,A7
      A8        MOV     B1,A78
         1F     MOV     A1,B1   ; TMP_A1 = A78
      C5        MOV     B1,C5
      C6        MOV     B1,C56
         1C     AND     B1,A1   ; TMP_B1 = C56 & TMP_A1
         1F     MOV     A1,B1   ; TMP_A1 = TMP_B1
   B3           REG     B3
   B4           REG     B34
         1E     EOR     B34,A1  ; B34 ^= TMP_A1
CC              CTX     C,C
   C1           REG     C1
         7F     MOV     C1,C7
         6F     MOV     C1,C76
         5F     MOV     C1,C765 ; TMP_C1 = C765
   C2           REG     C2
      A9        MOV     C2,A9
      A8        MOV     C2,A98  ; TMP_C2 = A98
         CE     CLC
         1B     SBB     C2,C1   ; TMP_C2 -= TMP_C1
   C1           REG     C1
      B3        MOV     C1,B3
      B4        MOV     C1,B34  ; TMP_C1 = B34
         CE     CLC
         2A     ADC     C1,C2   ; TMP_C1 += TMP_C2
BC              CTX     B,C
   B1           REG     B1
   B2           REG     B12
      1D        OR      B12,C1  ; B12 |= TMP_C1

Контекстное кодирование:

BA B1           CTX     B1,A
      A7 A8     MOV     B1,A78
            1F  MOV     A1,B1   ; TMP_A1 = A78
      C5 C6     MOV     B1,C56
            1C  AND     B1,A1   ; TMP_B1 = C56 & TMP_A1
            1F  MOV     A1,B1   ; TMP_A1 = TMP_B1
   B3 B4        REG     B34
            1E  EOR     B34,A1  ; B34 ^= TMP_A1
CC C1           CTX     C1,C
      7F 6F 5F  MOV     C1,C765 ; TMP_C1 = C765
   C2           REG     C2
      A9 A8     MOV     C2,A98  ; TMP_C2 = A98
            CE  CLC
            1B  SBB     C2,C1   ; TMP_C2 -= TMP_C1
   C1           REG     C1
      B3 B4     MOV     C1,B34
            CE  CLC
            2A  ADC     C1,C2   ; TMP_C1 += TMP_C2
BC B1 B2        CTX     B12,C
            1D  OR      B12,C1  ; B12 |= TMP_C1

Линейное кодирование:

BA B1 A7 A8     MOV     B1,A78
            1F  MOV     A1,B1
      C5 C6     MOV     B1,C56
            1C  AND     B1,A1
            1F  MOV     A1,B1
   B3 B4    1E  EOR     B34,A1
CC C1 7F 6F 5F  MOV     C1,C765
   C2 A9 A8     MOV     C2,A98
         CE 1B  SUB     C2,C1
   C1 B3 B4     MOV     C1,B34
         CE 2A  ADD     C1,C2
BC B1 B2    1D  OR      B12,C1

Тем не менее, удалось решить давнюю проблему, концептуальную.

  1. Так называемые "маргиналы" корректнее именовать делегатами

  2. Которые можно использовать и для отладки кода

1100 90 90 80 80 12 34 00       DEF     98#D1+D3+24     ; D98 = 0x1104
1107 70 70 60 60 50 50 00       DBG     765#            ; TRACE(D765)
110E BC B1 90 90 80 80 7E       EOR     B1,98#,C7       ; B1 = [D1+D3+24] ^ C7

Конечно, так с ходу вникнуть и понять эти три строчки сложно. Попробую разъяснить:

  1. «90_90 80_80» - делегат, а «00» - «HLT», который под префиксами работает дефиникатором

  2. «70_70 60_60 50_50» - делегат, а «00» - «HLT», который под делигатом работает трассировщиком

  3. «90_90 80_80» - делегат, который подставляет вектор удалённо



4

(2 ответов, оставленных в Старый софт и игры)

Вчера занялся сегодня первым практическим опытом по исследованию запрещённого состояния RS-триггера (входы R и S устанавливаются и снимаются одновременно, что в справочниках рекомендуется категорически избегать).

Сделал эскизы в falstad (можно прослушать звук) и Logisim (симуляция схемы прерывается).

Спаял схему, взяв за основу ИМС К155ЛА3 1985 г.
Переменный резистор в 1,5 кОм выполняет функцию линии задержки, хотя выдаёт неожиданный эффект - баланс между лог "1" и "0" в генерации, а не в фиксации.
С питанием от Power-банка выдаёт частоту в ~25 МГц синусоидой.

P.S.: К сожалению, не разбираюсь в аналоговой технике.
А этот RS-триггер в подбном режиме ведёт себя именно как аналоговый узел.
На очереди ещё две схемы - на К155ТВ1 и К176ЛА7.



5

(2 ответов, оставленных в Старый софт и игры)

Как известно, все классические RS-триггеры имеют запрещённое состояние, когда входы R и S - активны (лог. "0" у К555ТР2).
Обычно, такую входную комбинацию справочники рекомендуют избегать, так как после неё триггер стабилизируется в неопределённое устойчивое состояние.

Эта тема меня интересовала довольно давно, так как "запретный плод - сладок".
И вот, решил я задать вопрос нейросети.

Использование "запрещённого состояния" (или метастабильности) на практике — тема малоизученная в стандартной цифровой логике, но потенциально интересная для нестандартных вычислений. Разберём несколько примеров, где можно использовать метастабильные единицы (МСЕ), такие как RS-триггеры с объединёнными входами R = S.

1. Генератор случайных чисел (метастабильный источник энтропии)
Если ввести триггер (например, из 74LS279) в метастабильное состояние и затем "сбросить" его в момент, когда тактовый сигнал подан на считывающий элемент, выходное значение будет случайным.
Это связано с тем, что физические шумы (тепловой, электромагнитные помехи) определяют, в какое состояние он перейдёт.
Применение:

  • ✔ Криптографические генераторы случайных чисел.

  • ✔ Физические модели случайности в вычислениях.

  • ✔ Исследования в квантовых вычислениях (аналог квазиквантовых эффектов).

2. Осциллятор с непредсказуемыми частотными характеристиками
Метастабильный триггер может переходить из одного состояния в другое с "дрожанием" частоты из-за изменений задержек.
В отличие от стабильных генераторов (на инверторах или LC-контуре), частота колебаний будет зависеть от малых внешних воздействий.
Применение:

  • ✔ Симуляция хаотических процессов.

  • ✔ Биологически правдоподобные модели (нервная система, биоритмы).

  • ✔ Встроенные источники детерминированного хаоса (например, для тестирования помехоустойчивости систем).

3. Клеточный автомат с неопределёнными переходами (квазиквантовый автомат)
В классических клеточных автоматах каждое состояние клетки чётко определяется входными данными.
Но если обновление клетки зависит от метастабильного триггера, то переходы становятся стохастическими.
Применение:

  • ✔ Симуляция квантовых эффектов (где вероятность важнее детерминизма).

  • ✔ Моделирование биологических процессов (развитие тканей, рост бактерий).

  • ✔ Эксперименты с самоорганизующимися системами.

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

  • ✔ Моделирование биологических нейронов с шумами.

  • ✔ Стохастические нейросети (например, для аппаратных генераторов вероятностных моделей).

5. Аналог "квантового" детектора
Можно создать датчик, который "чувствует" слабые внешние воздействия, переводящие его из метастабильного состояния в устойчивое.
Применение:

  • ✔ Чувствительные сенсоры (например, регистрации слабых электрических или магнитных полей).

  • ✔ Имитация квантового детектора (где результат измерения определяется внешними факторами).

Пример схемы:

  1. RS-триггер (74LS279) в метастабильном режиме.

  2. Воздействие (например, слабый сигнал от датчика) изменяет вероятность перехода в 0 или 1.

  3. Считывание состояния триггера даёт "квантовый" результат.

Вывод
Хотя метастабильные состояния обычно считаются нежелательными, их можно использовать для:

  • ✔ Генерации случайности (ГСЧ, стохастические системы).

  • ✔ Создания хаотичных генераторов.

  • ✔ Моделирования квантовых и биологических процессов.

  • ✔ Экспериментов с вероятностными вычислениями.

Если цель — исследование хаоса и неопределённости в вычислениях, то МСЕ (метастабильные единицы) на базе 74LS279 или других триггеров — отличный инструмент.

Тем самым, простейшая ИМС может найти применение у радиолюбителей в самых неожиданных местах.
Например, если элементами Пельтье обеспечить достаточно стабильную температуру каждого К555ТР2, можно построить перцептрон, в основе которого лежат стохастические процессы (например, зарегистрировать поток нейтрино или всплеск гравитационного поля при слиянии чёрных дыр).
Если с помощью синхрогенератора (типа "Любительских телевизионных игр" Овечкина) или ПК (типа РАДИО-86РК) выводить выход ИМС ТР2 на композитный сигнал телевизора, можно будет наблюдать довольно любопытную интерференционную картину (частота самовозбуждения ТР2 примерно от 18 до 50 МГц).

P.S.: На РАДИО-86РК это проще всего сделать, так как его К580ВГ75 имеет несколько выводов, программно управляемых атрибутами - можно в заданной области экрана активировать "самовозбуждение".



6

(12 ответов, оставленных в Всякое разное)

Вот этот шаблон даёт более-менее стабильный результат:

WYSIWISC (What You See Is What It Should Compute)

Условные сокращения:
1. io = 0xio, где i, o — BCD.
1.1. HLT/JMP (= 0x00).
1.1.1. Без префикса: IP → D0, IP ← 0x0000 (вызов БСВВ).
1.1.2. С префиксом `#Di+o`: D0 ← IP, IP ← Di+o (JMP).
1.2. Префиксы `#Di+o` (`[Di+o]`) (≠ 0x00).
2. TS = 0xTS, где T, S ∈ {0xA, 0xB, 0xC, 0xD}.
2.1. TR = TS, но S ≠ T.
2.2. TN = TS, но S = T.
3. Tn = 0xTn допускается после TS, если T совпадает с T из TS.
3.1. Tm = Tn Tn ... допускается после TS, если T совпадает с T из TS.
3.2. Выбирает T за основной операнд.
4. Rn = 0xRn допускается после TS, если R ≠ T из TS.
4.1. Rm = агрегация Rn Rn ... допускается после TS, если R ≠ T из TS.
4.2. Загружает R в основной операнд.
5. vF → Загружает Nv в T, если контекст TN.
5.1. wF = агрегация vF vF ... → Загружает Nw в T, если контекст TN.
6. vF → Сохраняет T в Rv, если контекст TR.
7. vU = 0xnU, где v — BCD, U ∈ {0xA–0xE}.
7.1. v → индекс S в контексте TS.
7.2. если T в TS = A и Rn = A0, U → {INC, DEC, CLR, SET, EOR}
7.3. если S в TS = A, 0U → {INC, DEC, CLR, SET, EOR} с условием CF
7.4. в остальных случаях U → ADC, SBB, AND, OR, EOR

Архитектура:
1. Регистр A0 → PSW.
1.1. Биты 0, 1, 2, 3 → флаги ZF/DF, CF, VF/BF, NF/AF.
1.1.1. Без префикса - управление флагами.
1.1.1.1. 0xCE → CLC (Carry Erase)
1.1.1.2. 0xCF → CMC (Carry Flip)
1.1.1.3. 0xAE → CLA (Absolute Erase)
1.1.2. С префиксами - управление потоком.
1.1.2.1. 0x12 0xCE → JNC #D1+2
1.6. Не операнд АЛУ.
1.6.1. TS = AX, Rn = A0 → vU унарная (INC, DEC, CLR, SET, NOT).
1.6.2. TS = XA → 0U условная унарная (INC, DEC, CLR, SET, NOT).
2. Регистр D0...D9
2.1. Регистровые пары B0C0...B9C9
2.2. Регистр D0 = LR

Стек:
1. Реализуется пользователем, указатель — любой удобный регистр.
2. D0 ← IP при JMP/HLT, подпрограммы должны сохранять D0.
3. RET = JMP #D0+1.

То есть, эта архитектура настолько проста, что базовые принципы умещаются в 50 строчек основных правил! cool

Однако, код генерировать без ошибок не может и объясняет это тем, что отсутствие битовых полей и акцент на когнитивное восприятие делает архитектуру из ряда вон, что не позволяет нейросети использовать стандартные шаблоны. Просит не менее сотни тысяч примеров, чтобы обучиться! lol

P.S.: Однао, нейросеть помогла подобрать простое название архитектуры, аналогично как WYSIWYG. wink
По-моему, это - лёгкая перезагрузка концепции.
И тему, тем самым, я переименовал. roll



7

(12 ответов, оставленных в Всякое разное)

Всю неделю я провёл в диалоге с нейросетью и попытался научить понимать код и генерировать код с языка Си.
Благодаря чему я:

  • Нашёл применение маргинальным указателям

  • Научился описывать архитектуру не языком алгоритмов, а на уровне справочных деклараций

Правда, нейросеть пока не научилась разбирать комплексные векторы, так как там очень много нюансов, даже после разбора реальной отлаженной JavaScript-функции с переводом в псевдокод, который она сгенерировала, но в другой сессии в нём находит ошибки.

Однако, местами удивляет логичностью кода.



8

(1 ответов, оставленных в Всякое разное)

Моё первое практическое знакомство с нейросетью DeepSeek я начал не со стандартных вопросов, которые обычно задают большинство пользователей, а сразу с небольшого теста, который я давно разработал в часы досуга для философских рассуждений.

Итак…

Дано:

  • «0» - лог. "0";

  • «1» - лог. "1";

  • «X» - лог. "0" или "1", состояние неопределённости;

  • «Z» - состояние, временно скрывающее «0», «1» или «X».

Расставь приоритеты.

Ответ:

В логических системах и цифровой электронике состояния сигналов обычно имеют следующие приоритеты (от высшего к низшему):

  1. "Z" (Высокий импеданс, отключенное состояние) — это состояние имеет наивысший приоритет, так как оно временно скрывает любое другое состояние ("0", "1" или "X"). Когда сигнал находится в состоянии "Z", он не влияет на другие сигналы в системе;

  2. "X" (Неопределённое состояние) — имеет средний приоритет. Оно может представлять как "0", так и "1", но не является активным состоянием, как "Z";

  3. "1" (Логическая единица) — имеет более низкий приоритет, чем "Z" и "X";

  4. "0" (Логический ноль) — имеет самый низкий приоритет.

Таким образом, приоритеты можно записать так: "Z" > "X" > "1" > "0".

Этот порядок важен, например, при разрешении конфликтов на шине или при моделировании логических схем.

Как видите, ничего необычного и нового для технарей.
Но, чтобы повысить градус и вывести рассуждения до общемирового уровня, следует двигаться к повседневному бытовому уровню…

Такая ситуация, допустим, бытовой или в медицине:

  • «0» - стерильные руки;

  • «1» - чистые, но не стерильные руки;

  • «Z» - руки в стерильных перчатках (чистота самих рук не важна или сомнительна);

  • «X» - чистота рук сомнительна (пусть даже они чисты).

Расставь приоритеты и обоснуй.

Ответ:

В данном контексте приоритеты будут определяться важностью соблюдения стерильности и чистоты в медицине или бытовых ситуациях. Основная цель — минимизировать риск заражения или загрязнения. Рассмотрим состояния и расставим приоритеты:

  1. "Z" — руки в стерильных перчатках: Это состояние имеет наивысший приоритет, так как стерильные перчатки полностью изолируют руки от внешней среды. Даже если руки под перчатками не стерильны или их чистота сомнительна, это не имеет значения, потому что перчатки обеспечивают защиту;

  2. "0" — стерильные руки: Стерильные руки важны, но их приоритет ниже, чем у состояния "Z", потому что стерильные перчатки обеспечивают более надёжную защиту. Стерильные руки могут быть необходимы, например, перед надеванием перчаток;

  3. "1" — чистые, но не стерильные руки: Чистые руки важны для повседневной гигиены, но их приоритет ниже, чем у стерильных рук, так как они не обеспечивают полной защиты от микроорганизмов;

  4. "X" — чистота рук сомнительна: Это состояние имеет самый низкий приоритет, так как сомнительная чистота рук представляет наибольший риск заражения или загрязнения.

Итоговый порядок приоритетов: "Z" > "0" > "1" > "X"

Обоснование:

  • "Z" (стерильные перчатки) — наивысший приоритет, так как это состояние обеспечивает максимальную защиту;

  • "0" (стерильные руки) — важно, но уступает "Z", так как стерильность рук может быть нарушена при контакте с окружающей средой;

  • "1" (чистые руки) — важно для гигиены, но не обеспечивает стерильности;

  • "X" (сомнительная чистота) — наименее предпочтительное состояние, так как представляет наибольший риск.

Таким образом, постулаты из области техники и информатики могут быть использованы в бытовых случаях тоже.

Усложняем…

Ситуация с детской комнатой:

  • «0» - ноль опасности, полная безопасность (мягкие углы, нет розеток и опасных предметов);

  • «1» - обычная жилая обстановка (имеются розетки, острые углы, сквозняки);

  • «Z» - замаскированная опасность (розетки закрыты заглушками, углы с мягкими накладками, шторы на окнах с фиксаторами);

  • «X» - уличная обстановка, полное отсутствие контроля над опасностями.

Расставь приоритеты и обоснуй.

Ответ:

В контексте детской комнаты приоритеты будут определяться уровнем безопасности для ребёнка. Основная цель — минимизировать риски травм и обеспечить максимальную защиту. Рассмотрим состояния и расставим приоритеты:

  1. "0" — ноль опасности, полная безопасность: Это состояние имеет наивысший приоритет, так как оно обеспечивает идеальные условия для безопасности ребёнка. Мягкие углы, отсутствие розеток и опасных предметов исключают возможность травм;

  2. "Z" — замаскированная опасность: Это состояние имеет второй по важности приоритет. Оно обеспечивает высокий уровень безопасности, но не является идеальным, так как потенциальные опасности (розетки, углы) всё ещё присутствуют, хотя и замаскированы. Например, розетки закрыты заглушками, а углы смягчены накладками;

  3. "1" — обычная жилая обстановках: Это состояние имеет более низкий приоритет, так как в комнате присутствуют потенциальные опасности (розетки, острые углы, сквозняки), которые не адаптированы для ребёнка. Такая обстановка требует постоянного контроля со стороны взрослых;

  4. "X" — уличная обстановка, полное отсутствие контроля над опасностями: Это состояние имеет самый низкий приоритет, так как уличная обстановка не контролируется и представляет наибольший риск для ребёнка.

Итоговый порядок приоритетов: "0" > "Z" > "1" > "X"

Обоснование:

  • "0" (полная безопасность) — наивысший приоритет, так как это идеальное состояние для детской комнаты, где все риски устранены;

  • "Z" (замаскированная опасность) — высокий приоритет, так как опасности минимизированы, но не устранены полностью;

  • "1" (обычная жилая обстановка) — более низкий приоритет, так как в комнате присутствуют потенциальные опасности, требующие контроля;

  • "X" (уличная обстановка) — наименее предпочтительное состояние, так как оно неконтролируемо и представляет наибольший риск.

Приоритетность уровней, как можно заметить, гуляет.
Потому, прошу навести порядок…

А теперь перечисли порядок приоритетов всех описанных случаев, обобщи и приведи к среднему показателю.

Ответ:

Давайте обобщим все описанные случаи и найдём средний показатель приоритетов для каждого состояния ("0", "1", "Z", "X") на основе их позиций в каждом из случаев.

Описанные случаи:

  1. Логические состояния: Приоритет: "Z" > "X" > "1" > "0";

  2. Ситуация с руками (медицина/быт): Приоритет: "Z" > "0" > "1" > "X";

  3. Ситуация с детской комнатой: Приоритет: "0" > "Z" > "1" > "X".

Обобщение:
Для каждого состояния ("0", "1", "Z", "X") подсчитаем средний приоритет на основе их позиций в трёх случаях. Чем меньше среднее значение, тем выше общий приоритет:

  • "Z": Логика - 1, Руки - 1, Комната - 2, Средний приоритет - (1+1+2)/3=1.33;

  • "0": Логика - 4, Руки - 2, Комната - 1, Средний приоритет - (4+2+1)/3=2.33;

  • "1": Логика - 3, Руки - 3, Комната - 3, Средний приоритет - (3+3+3)/3=3.00;

  • "X": Логика - 2, Руки - 4, Комната - 4, Средний приоритет - (2+4+4)/3=3.33.

Итоговый порядок приоритетов (от высшего к низшему):

  1. "Z" (средний приоритет: 1.33) — наивысший приоритет;

  2. "0" (средний приоритет: 2.33) — второй по важности;

  3. "1" (средний приоритет: 3.00) — третий по важности;

  4. "X" (средний приоритет: 3.33) — самый низкий приоритет.

Обоснование:

  • "Z" имеет наивысший средний приоритет, так как в двух случаях из трёх оно занимает первое место, а в одном — второе. Это состояние связано с максимальной защитой (например, стерильные перчатки или замаскированные опасности);

  • "0" занимает второе место, так как в одном случае оно на первом месте (детская комната), в другом — на втором (руки), а в логике — на последнем;

  • "1" стабильно занимает третье место во всех случаях, что отражает его среднюю значимость;

  • "X" имеет самый низкий приоритет, так как в двух случаях из трёх оно на последнем месте, а в логике — на втором.

Таким образом, обобщённый порядок приоритетов: "Z" > "0" > "1" > "X".

Иначе говоря, все объекты можно классифицировать и разделять на приоритетные группы:

  • Детские сады и ясли - категория "0" (родители могут быть спокойны);

  • Школы и летние лагеря - категория "1" (родители могут быть на связи);

  • Жилые комнаты или гостинницы - категории "Z" или "X" (родителям следует быть внимательными);

  • Всё остальное - категория "X" (родителям рекомендуется быть предельно внимательными).

Двигаемся дальше…

Можешь сам привести какой-нибудь аналогичный случай и пример?
Например, сравнивая планеты солнечной системы или регионы?

Ответ:

Конечно! Давайте рассмотрим аналогичный случай, сравнивая **регионы страны** по уровню безопасности для туристов. В этом примере мы можем использовать состояния "0", "1", "Z", "X" для описания уровня безопасности и комфорта в разных регионах.

Пример: Регионы страны и уровень безопасности для туристов.

  1. "0" — полная безопасность: Регион с идеальными условиями для туристов: низкий уровень преступности, развитая инфраструктура, отсутствие природных опасностей (например, землетрясений, наводнений).
    Пример: курортный город с круглосуточной охраной, медицинскими пунктами и чистыми пляжами;

  2. "1" — обычные условия: Регион с типичными условиями для жизни и туризма: умеренный уровень преступности, стандартная инфраструктура, возможны незначительные природные риски.
    Пример: крупный город с развитым транспортом, но с пробками и occasional petty crime;

  3. "Z" — замаскированные риски: Регион, где потенциальные опасности скрыты или минимизированы. Например, зоны с повышенной безопасностью благодаря усиленной охране или специальным мерам.
    Пример: закрытый курорт с охраняемой территорией, где туристы защищены от внешних угроз, но за пределами курорта могут быть опасности;

  4. "X" — неопределённость или высокий риск: Регион с неконтролируемыми опасностями: высокий уровень преступности, частые природные катаклизмы, отсутствие инфраструктуры.
    Пример: отдалённые районы с плохой транспортной доступностью, где туристы могут столкнуться с непредсказуемыми ситуациями.

Расстановка приоритетов:

  1. "0" — наивысший приоритет, так как это идеальные условия для туристов;

  2. "Z" — второй по важности, так как риски минимизированы, но не устранены полностью;

  3. "1" — средний приоритет, так как это обычные условия, которые требуют осторожности;

  4. "X" — самый низкий приоритет, так как это регионы с высоким риском.

Анализ:

  • "0" (полная безопасность) — это цель для туристов, поэтому оно имеет высший приоритет;

  • "Z" (замаскированные риски) — это компромисс между безопасностью и доступностью. Например, закрытые курорты могут быть дорогими, но они обеспечивают высокий уровень защиты;

  • "1" (обычные условия) — это стандартная ситуация, которая подходит для большинства туристов, но требует внимания;

  • "X" (неопределённость) — это регионы, которые лучше избегать, если туристы не готовы к рискам.

Обобщение:
Этот пример показывает, как приоритеты могут быть расставлены в зависимости от уровня безопасности и комфорта. Общие закономерности сохраняются:

  • "0" — идеальное состояние (высший приоритет);

  • "Z" — компромиссное состояние (высокий приоритет);

  • "1" — нейтральное состояние (средний приоритет);

  • "X" — опасное состояние (низкий приоритет).

Таким образом, приоритеты в разных случаях (логика, медицина, детская комната, туризм) зависят от контекста, но общие принципы (важность безопасности, контроля и минимизации рисков) остаются неизменными.

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

Следующие мои вопросы были такими…

Приведи аналогичный пример и рассуждение относительно времён средних веков и эпохи возраждения.

Обозначь ведущие приоритеты современного мира на текущий момент и проведи сравнительный анализ с концом 20-го века.

Подведя итоги, как изюминка на торте, я задал ключевой вопрос:

Может ли искусственный интеллект входить в категорию "Z" - нести скрытую угрозу, но стремиться занять положения "0" или "1"?
В каком случае искусственный интеллект может войти в категорию "X" и почему?
Что за этим последует и стоит ли это избегать?
Возможно ли это избежать?
Какие слои общества попадут в зону риска?
Какие расы, нации и т.д.?



9

(20 ответов, оставленных в Новости, анонсы, релизы.)

Задумался над Вашим постом и сделал набросок о моём первом знакомстве с Микро-ЭВМ. smile


Andrei88 пишет:

Очень было бы интересно почитать. То, что бытовые компьютеры использовали телевизиощики, многие писали, а вот как оно реально делалось - интересно поглядеть.

Это очень долгая история. В том смысле, что ещё с 90-х я мечтал занимиматься обработкой видео, но лишь в прошлом году нашёл качественно простой приём, чтобы видеоузел РАДИО-86РК синхронизировать с внешним источником сигнала. То есть, всё ещё на уровне теории. big_smile


uav1606 пишет:

Alikberov, повторю своё предложение - с удовольствием бы опубликовал в журнале Вашу статью про этот редактор в частности и про "Радио-86РК" вообще.

Да, я помню. Спасибо!

На РАДИО-86РК люблю проводить различные эксперименты.
"Победит" - просто программный код.
Но я также:

  • Проигрыватель видео попробовал написать (кажется, о нём уже многие знают)

  • Отладчик+дизассемблер, размещаемые прямо в ПЗУ (код отлажен и основные игры вполне работают)

  • Пытаюсь написать, если не подобие, то хотя бы пародию на "Wham!" от ZX-Spectrum

  • Жёстким программным хаком ВГ75 добился почти графического режима, но не отладил ещё

Тем для публикации хватит. wink
Только вот получится в один абзац. roll

На данный момент жду доставки ИМС LM1881 или К174ХА11, чтобы попробовать совместить композитное видео с кабельного канала с сигналом от РАДИО-86РК.
Схему уже придумал, осталось проверить в рамках "OSD с помощью РК".
Тоже очень любопытная тема (для меня), так как мечтал в детстве обрабатывать видео. big_smile

P.S.: Может пока затронуть соседнюю тему? smile
Может кого-то заинтересует "практическая мистика" на винтажном ноутбуке. big_smile
На РАДИО-86РК тоже есть аналогичная программа, но работает только в ручном режиме: Автоматический алгоритм только вот думаю начинать писать.


SergeCpp пишет:

Даже с трудом сообразил (и "технически" вряд ли аргументирую) странность предложения (на другом форуме в теме вашей) использовать директивы Монитора для поиска текста из редактора

За это время услышал много критики в адрес своей программы со стороны.
Многих смущает отсутствие встроенных возможностей сохранения файла. neutral
Однако, я это не делал по принципиальным соображениям. Сейчас объясню, почему…

Ещё со школы я мечтал написать собственный интерпретатор Бейсика, если говорить кратко…

Так вот, из моих "внутренних разработок" по проработке алгоритмов поиска по именам меток или переменных, а также - отладка ввода и вывода вещественных чисел (мантисса - 24 бита), потребовалась удобная процедура ввода с клавиатуры данных и их редактирования.
Сначала я обходился простыми подпрограммами ввода строки, что вскоре сильно сказалось на производительности разработки из-за их ограниченного функционала.
И я решил заняться этим вопросом, чтобы закрыть его и не возвращаться.

Так, спустя месяцы упорного кодирования и отладки, появился «Победит», как альтернатива функционалу операторов INPUT Бейсика или READLN Паскаля.
Да, «Победит» - именно мега-продинутый INPUT или READLN! big_smile

Тем самым, довольно странно иметь в операторе INPUT возможность сохранения в файл или поиска ключевого слова.
Всё, что требуется от INPUT - лишь ввод с клавиатуры требуемых данных.

Таким образом, сам «Победит» это выполняет и даже перевыполняет. Так как…

  1. Поддерживает буфер до 64 Кб (если, конечно, ПК это предоставляет)

  2. Поддерживает управляющие атрибуты ВГ75 (подчёркивание, мигание, цвет и т.п.)

  3. Имеет максимальную производительность даже при достаточно больших объёмах текста

  4. Поддерживает "световое перо" ВГ75 (любой стилус с адаптером)

(Дополнительный функционал определяется и поддерживается пользовательским CALLBACK-ом, который вызывается постоянно, как указывалось в начале темы.)

Говоря кратко, «Победит» - это просто "оператор INPUT" размером в 2 Кб и с предельным функционалом (ни один из Бейсиков не позволит ввести текст объёмом в десятки килобайт оператором INPUT). А через CALLBACK можно и производить всё остальное: Чтение/запись НГМД, поиск/замена по шаблону, трансляция/компиляция текста и т.д.

Размер в 2 Кб - позволяет прошить «Победит» в ПЗУ и вызывать его отовсюду, где это может потребоваться:

  • Форт

  • Лого

  • Паскаль

  • Си

P.S.: Получается, «Победит» - не "текстовый редактор", а "редактор текстового буфера".
P.P.S.: Недавно пытался подправить «Победит» под работу с "теневыми страницами" (как у К580ВМ1), но код в итоге вырос на 33 байта, что выходит за рамки 2048 под ПЗУ: Требуется пожертвовать производительностью процедур прокрутки экрана…



13

(2 ответов, оставленных в Старый софт и игры)

Как-то, в начале 2000-х, меня зацепила и заинтересовала тема т.н. "Торсионных Полей" в плане их элементарной детекции.
Если кто помнит, в те годы был некий какой-никакой бум "торсионщины" со всевозможными нормализаторами биополя, ауры и т.п.
Но меня интересовала сугубо "детективная" история.

Иными словами, так как в те годы с доступом в интернет было, мягко говоря, не очень, а про "Торсионные Поля" я знал лишь из книг по биоэнергетике и телепередач, приходилось мыслить "своими понятиями" и придумывать свои методы.

А так-как в радиоэлектроннике я никогда не мог разобраться, собственные разработки начал с эскизов цифровых схем.
Цифровой схемотехникой я овладел ещё в младших классах, так как "Булева Алгебра" и принцип "не соединять более одного цифрового выхода вместе" помогали везде…

Вот, значит, ровно двадцать лет назад я собрал свой первый прототип "детектора" на трёх ИМС: К155ЛА3, К531ИЕ17 и К155ИР1 со светодиодами.
Конечно, описание принципа работы здесь приводить не буду, так как форум - про программы. Скажу лишь, что схема почти работала. Реагировала на различные помехи, громовые разряды и т.п.

А теперь…
Собственно, к тематике форума…

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

Вашему вниманию предлагаю программу Сенсор, которую онлайн можно запустить лишь для ознакомления.

Но для работы требуется ноутбук без сети и диска



14

(4 ответов, оставленных в Старый софт и игры)

На самом деле, изначально видео на РК никак не планировал проигрывать.
Тема была в том, на сколько максимально быстро можно прокручивать экран вертикально и горизонтально, используя трюки со стеком (в играх ZX-Spectrum очень популярная практика).
Если вертикально в режиме 80x64 дамп во все 64 Кб вертикально удалось прогнать за 360 секунд (видео не дам: фоновая музыкальная вставка только в Телеграм-канале - YouTube заблокирует) против 436 секунд в режиме 64x25 штатным способом, то возник вопрос, на сколько скоро возможно копировать данные из внешнего ROM-Диска в экран (прокрутка - то же копирование массива со смещением в одну позицию, как все знают)?

То есть, это проигрывание фильмов возникло чисто побочно на фоне спортивного интереса догнать и перегнать всё и вся на программном уровне.

P.S.: Сейчас экспериментирую с воспроизведением несжатого звука из ROM-Диска по технологиям DSD/ШИМ/ИКМ, что крайне сложно.



Сам по себе РадиоЛюбительский Компьютер "Радио-86РК" (далее просто РЛК) довольно уникальная вещь:
Процессор - аналог Intel i8080A / К580ВМ80А на частоте 1,778 МГц.
Оперативная память - 16 Кб или 32 Кб.
Внешний накопитель - лента компакт-кассеты или накопитель на ПЗУ (ROM-Диск).
Дисплей - алфавитно-цифровой 64x25 на основе аналогов i8257 и i8275.

С одной стороны, он стал примером, как не надо (по мнению инженеров) строить Архитектуру Микро-ЭВМ.
С другой стороны, он установил свой стандарт для всех последующих РК-совместимых машин ("Орион", "Апогей" и т.п.).
С третьей стороны, его постоянно хочется как-то улучшить или переделать вовсе.
(Для регенерации ОЗУ использовались циклы ПДП с обеспечением непрерывного вывода экранного буфера на дисплей, что заметно сказывалось на общей производительности из-за разделения шин с процессором. При обмене с внешним накопителем ПДП отключался, экран темнел и программа могла работать в режиме реального времени на полной частоте.)

А так - это мой первый ПК, благодаря которому я в 13 лет уже освоился в машинном коду, так как ассемблер загружать было слишком дорого с ОЗУ в 16 Кб.

Бейсик был, но больше всего я любил сидеть в дампах. Аж до 1998 года, когда пересел на PC-XT совместимый "Поиск".

Когда появился ZX-Spectrum, наигравшись в его цветные игры, я вернулся к РК: Загружал в ZX игру Savage-3 с её музыкальной заставкой и переключал видеовход к РК.
А позже - и NES включал с игрой RoboCop-3 по ВЧ-каналу, переключал телевизор на НЧ-вход и ковырялся в дампах РЛК.

Причина - простая: Я сразу понял, что программировать гораздо интереснее прохождения любой игры!

Спустя все эти коды я продолжаю регулярно программировать различные восьмибитные алгоритмы на досуге, которых ещё никто не написал.

В качестве эксперимента попытался написать код на РАДИО-86РК для проигрывания несжатого видеоряда, закодированного символами алфавитно-цифрового терминала с подбором под соответствующие градации серого (как это было лет пятьдесять тому назад на ЭВМ с печатающими устройствами).
Дело в том, что возможность подключения внешнего ROM-Диска объёмом до 32 Кб существовала с самого начала. Позже уже добавили страничную организацию до 512 Кб или до 8 Мб. Что позволяет иметь всегда под рукой довольно внушительный массив программ.
(Теоретически, можно расширить и до 1 Гб, но пока нет необходимости.)

Существует несколько схем ROM-Диска, но все они используют один интерфейс.

Итак. Вот мой первый опыт:
Bad Apple (64x25)
Потом удалось чуть улучшить:
Bad Apple (64x50)
Можно заметить проблемы со звуком, которые не удавалось решить.
За основу я использовал набор символов для оттенков серого, который составил SHAOS.

Чуть позднее, SHAOS подхватил идею и разработал нормальный код для кодирования звукового видеоряда:
Bad Apple (64x50)
RickRoll (64x50)
Thank You (64x50)

В планах - добавить цвет (архитектурно РК это позволяет). roll

P.S.: Может тема заинтересует бывалых. wink



Все, кто знаком с ZX-Spectrum и его бессмертной трилогией Savage, наверно не были равнодушны к музыкальным заставкам этих игр. cool

Так как у меня РАДИО-86РК появился значительно раньше и я успел состояться как программист-дампёр, цветные графические игры на ZX-Spectrum меня впечатляли, но доступ к ресурсам из-под встроенного Бейсика с целью изучения ПК не как игрового автомата, а как архитектуры для разработки, задвигало Спектрум в дальний угол стола: Я грузил в него одну из нескольких игр с потрясающими музыкальными заставками и переключал сигнал Видео на РК.
Тем самым, в телевизоре играла фоном музыка из ZX-Spectrum, а изображение шло от РАДИО-86РК, где я сидел в дампах буквально по уши! big_smile
И была мечта перенести эти музыкальные плееры с Z80 на К580ВМ80, чтобы и РАДИО-86РК зазвучал теми же треками.

С тех пор прошло более четверти века. И, ушедшим уже, декабрём 2023 я решил заняться этим вопросом.
Ни о какой-либо доработке РАДИО-86РК речи не шло (типа, установка ВИ53 или даже AY), так как у меня был ZX-Spectrum Ленинград 48 Кб и звук был биперный, средствами процессора Z80.
Тем самым, весь музыкальный код под РАДИО-86РК на частоте 1,777 МГц нужно было разработать с нуля.
Конечно, есть ещё Музыкальная Система на три голоса. Но там используется специфический синтаксис 1970-х (даже писал конвертор в МИДИ давно) и она использует предкомпиляцию партитуры в некую стек-таблицу, что требует время и на длительную композицию просто не хватит памяти стека.

Решил идти трекерным путём и просто конвертировать музыкальные модули ProTracker с ZX-Spectrum или Amiga в формат файла магнитной ленты РАДИО-86РК - *.rk с помощью JavaScript-костыля.

В первую очередь - ковырнул код самой Музыкальной Системы и подсмотрел, что там происходит с командами запрета/разрешения прерывания DI/EI, так как в РАДИО-86РК вывод INTE не управляет контроллером прерываний, а идёт прямо на динамик для формирования звука.
С одной стороны - это очень удобно! Команды DI/EI выполняются ровно за 4 такта, что при частоте в 1,777 МГц может позволить генерировать звук программно с частотой до 222,222.222 Гц!
(Все телевизоры на это реагируют, если от моего КР-03 выводить сигнал звука одной проволокой без экрана.)

За месяц ежедневного напряжённого труда со всеми мысленными опытами с командами DI/EI в области ШИМ мне в конце-концов удалось более-менее приближенных результатов.

Например, оригинальный трек Savage-3 у меня сперва звучал как-то так и к настоящему моменту звучит уже вот так.

Естественно, всё пишу исключительно на ассемблере со строгим подсчётом тактов, так как проигрывание звуков на РАДИО-86РК - задача из области систем реального времени.
За период написания, переписывания и написания с нуля было написано более десятков тысяч строк в поиске наиболее оптимального кода.

Вот ссылка на плейлист, по которому легко проследить, как изменялось звучание по мере доработки кода и применения различных трюков.
(В отличии от ZX-Spectrum, в РАДИО-86РК тактовая частоте несколько ниже и для генерации звука оптимально уложиться в 100 тактов на одну итерацию цикла звукогенерации в настоящее время: Первые попытки еле укладывались в 220 тактов!)


SergeCpp пишет:

WEL -- это мой редактор (я автор). В Радио опубликована версия 2, о чём говорит контрольная сумма ED20.

Очень приятно встретить человека, чей код я неделями вбивал. big_smile

SergeCpp пишет:

Там (в журнале Радио) ещё один точно был опубликован немного позже.

Журнал Радио №10 за 1993 - последний, что мы получили. Потом приходилось выборочно покупать на рынке с рук.
Видимо, потому я не знаю ничего.
(FTP-архив - другая тема: Печатные журналы иначе воспринимаются.)

SergeCpp пишет:

Это было сделано, то ли версия 3 использовалась, то ли дальше -- слабо очень помню, всё же 30 лет прошло с тех пор.

Да, есть у меня крошечная мечта - свой Бейсик написать…
Начал было с однострочным редактором возиться, но потом подумал, что лучше написать универсальный на все случаи жизни.

Относительно недавно почти полностью переписал ПЗУ оригинального Монитора РК, добавив туда поддержку ROM-Дисков до 16 Мб в директиву R и «оконность» с поддержкой Escape-последовательности на уровне П/П F809, так как в оригинальной версии плотность кода невысока и позволяет добавить…
Демонстрация в YouTube



18

(12 ответов, оставленных в Всякое разное)

Восстановил таблицу команд этого процессора.

Спойлер

     +------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
     |  .0  |  .1  |  .2  |  .3  |  .4  |  .5  |  .6  |  .7  |  .8  |  .9  |  .A  |  .B  |  .C  |  .D  |  .E  |  .F  |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 0. | HLT  |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    |      | D0+1 | D0+2 | D0+3 | D0+4 | D0+5 | D0+6 | D0+7 | D0+8 | D0+9 | R,T0 | R,T0 | R,T0 | R,T0 | R,T0 | R,T0 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 1. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D1+0 | D1+1 | D1+2 | D1+3 | D1+4 | D1+5 | D1+6 | D1+7 | D1+8 | D1+9 | R,T1 | R,T1 | R,T1 | R,T1 | R,T1 | R,T1 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 2. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D2+0 | D2+1 | D2+2 | D2+3 | D2+4 | D2+5 | D2+6 | D2+7 | D2+8 | D2+9 | R,T2 | R,T2 | R,T2 | R,T2 | R,T2 | R,T2 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 3. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D3+0 | D3+1 | D3+2 | D3+3 | D3+4 | D3+5 | D3+6 | D3+7 | D3+8 | D3+9 | R,T3 | R,T3 | R,T3 | R,T3 | R,T3 | R,T3 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 4. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D4+0 | D4+1 | D4+2 | D4+3 | D4+4 | D4+5 | D4+6 | D4+7 | D4+8 | D4+9 | R,T4 | R,T4 | R,T4 | R,T4 | R,T4 | R,T4 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 5. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D5+0 | D5+1 | D5+2 | D5+3 | D5+4 | D5+5 | D5+6 | D5+7 | D5+8 | D5+9 | R,T5 | R,T5 | R,T5 | R,T5 | R,T5 | R,T5 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 6. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D6+0 | D6+1 | D6+2 | D6+3 | D6+4 | D6+5 | D6+6 | D6+7 | D6+8 | D6+9 | R,T6 | R,T6 | R,T6 | R,T6 | R,T6 | R,T6 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 7. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D7+0 | D7+1 | D7+2 | D7+3 | D7+4 | D7+5 | D7+6 | D7+7 | D7+8 | D7+9 | R,T7 | R,T7 | R,T7 | R,T7 | R,T7 | R,T7 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 8. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D8+0 | D8+1 | D8+2 | D8+3 | D8+4 | D8+5 | D8+6 | D8+7 | D8+8 | D8+9 | R,T8 | R,T8 | R,T8 | R,T8 | R,T8 | R,T8 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 9. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D9+0 | D9+1 | D9+2 | D9+3 | D9+4 | D9+5 | D9+6 | D9+7 | D9+8 | D9+9 | R,T9 | R,T9 | R,T9 | R,T9 | R,T9 | R,T9 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| A. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | A0   | A1   | A2   | A3   | A4   | A5   | A6   | A7   | A8   | A9   | A,A  | A,B  | A,C  | A,D  | AF   | AF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| B. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | B0   | B1   | B2   | B3   | B4   | B5   | B6   | B7   | B8   | B9   | B,A  | B,B  | B,C  | B,D  | BF   | BF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| C. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | C0   | C1   | C2   | C3   | C4   | C5   | C6   | C7   | C8   | C9   | C,A  | C,B  | C,C  | C,D  | CF   | CF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| D. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | D0   | D1   | D2   | D3   | D4   | D5   | D6   | D7   | D8   | D9   | D,A  | D,B  | C,D  | D,D  | DF   | DF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| E. | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  |
|    | E000 | E100 | E200 | E300 | E400 | E500 | E600 | E700 | E800 | E900 | EA00 | EB00 | EC00 | ED00 | EE00 | EF00 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| F. | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  |
|    | F000 | F100 | F200 | F300 | F400 | F500 | F600 | F700 | F800 | F900 | FA00 | FB00 | FC00 | FD00 | FE00 | FF00 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+

Сейчас сижу в рутине описания модели на Verilog, так как концептуально имеются некоторые трудности в описании некоторых команд.

Из таблицы можно заметить всего 7 основных групп команд:

  • HLT: Останов

  • REG: Активация конкретного регистра в качестве аккумулятора результата

  • ARG: Установка операндов для АЛУ-операций

  • CLR/NOT: Сброс/инверсия флагов AF/BF/CF/DF

  • INT: Программное прерывание на указанный адрес

  • ALU: Операции АЛУ

  • 99 префиксов-расширителей функциональности

Вот именно под префиксами логика работы команд меняется так сильно, что внятного описания действия операции ещё не найдено.

Возьмём за пример известную архитектуру x86 IA-32.

  • ADD EAX,CS: DS: ES: FS: GS:[BX]

  • ADD EAX,SS: ES: GS:[BX] - префиксами "закодировано" слово "SEG"

Такие инструкции искусственно вставлять в программу можно, хотя и мало толку. Но, в случае исключения, внутреннему отладчику такое странное сочетание префиксов может нести некую скрытую информацию.

Инструкция LEA EAX,[EAX+EAX*2+3] вроде бы работает и всё понятно.
Но, с позиции логического описания вектора адреса она - ошибочна, так как в качестве базового указателя и индекса здесь используется один регистр!
Да, для LEA-вычислений такой вектор может служить математическим выражением местами, но в качестве адресатора ячейки памяти это использовать нельзя: Получим исключение.

В моей архитектуре я к вопросу указателей подошёл со всей серьёзностью и строгостью. На аппаратном уровне сформирован "фильтр", который отсеивает такие ситуации.
Однако, система не генерирует "исключение", а помечает комбинацию префиксов особым флажком: "маргинальная адресация".

Чтобы понять механизм лучше, представьте, что в x86 инструкции "маргинализируют" указатель:

  • ADD EAX,[EBX+EBX*2+3] работает как ADD EAX,(EBX*2+3)

  • SUB EAX,[EBX+EBX*2+3] работает как SUB EAX,(EBX*2+3)

А вот что делать с командой "ADD [EBX+EBX*2+3],EAX" в таком случае?
Ведь не может она работать как "ADD (EBX*2+3),EAX" - логика здесь вообще не известна!
(Допустим, как CMP/TEST: Сложить (EBX*2+3) с EAX, но результат никуда не сохранять, только выставить флаги.)

И если Вы согласны, то...

Товарищи!
Вы на полпути к понимании концептуальной сложности "маргинальных указателей" в случае именно моей архитектуры...

А так как у меня регистр A0 используется за флаговый PSW, ряд операций вообще "в резерве":

  • ADD A0,A0 - как ADD PSW,PSW абсолютно бессмысленный

  • SUB A0,A0 - как SUB PSW,PSW абсолютно бессмысленный

  • AND A0,A0 - как AND PSW,PSW абсолютно бессмысленный

  • OR A0,A0 - как OR PSW,PSW абсолютно бессмысленный

  • EOR A0,A0 - как EOR PSW,PSW абсолютно бессмысленный

  • MOV A0,A0 - как MOV PSW,PSW абсолютно бессмысленный

(Есть мысль использовать такие операции для Форт-вычислений - в стеке внешнего сопроцессора.)

Для обработки префиксов-указателей и префиксов "маргиналов" был разработан Verilog-модуль и схема на ТТЛ (не закончена).
По схеме можно оценить, на сколько сложно обрабатывать "префиксы" вычислительно: Уйма К155ИМ3 и К555ИР23 с К555КП11.

С другой стороны, для "Homebrew Processor" я визуально через схему оцениваю, на сколько сложна архитектура.

Но, сложность имеет и другую сторону - ортогональную гибкость.
Ни в каком 8-битном процессоре невозможно описать операцию, типа:

; вот такой вектор "переваривает" Verilog-модель
ADD C5,[D1+2*D2+3*D3+4*D4+5*D5+6*D6+7*D7+8*D8+9*D9+65432]

; для компактности в ассемблере нужно использовать математическую нотацию и заменить квадратные скобки на решётку
ADD C5,#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432

; сам "маргинал" указывается непосредственно в имени инструкции
ADD1986 C5,#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432
; или перед решёткой
ADD C5,1986#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432

Ознакомиться/экспериментировать с кодированием инструкций можно по этой ссылке...

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

P.S.: Даже в JavaScript-эмуляторе я не знаю, как интерпретировать экзотические сочетания кодов, чтобы не допускать синонимов.
А на Verilog это на порядок сложнее...



С Первомаем, Товарищи!

Все эти дни вкалывал и шаманил над кодом.

Одерживая несколько побед на низком уровне, пришла мысль переименовать редактор в ПОБЕДИТ.
Думаю, никто меня не осудит.

Вот ссылка на онлайн запуск демонстрационного кода.
(Просто, нажмите Enter, а потом - F1/F2/F3/F4/F5)

P.S.: Версия вполне стабильная, неплохо описана (по нескольким нажатиям F1), шустрая.
Думаю, вполне может стать инструментальной.


Andrei88 пишет:

а делалась ли поддержка QWERTY-раскладки?

Года три тому назад я переписал родной Монитор на 80% и планировал ввести QWERTY-раскладку.
Но, так руки и не дошли.

Начал переписывать ПЗУ с того, что сделал поддержку изменяемого текстового окна в подпрограмме вывода символа на экран.
Потом переписал директивы D, L и M. Доработал директиву R для поддержки внешних ПЗУ до 16 Мб.

Осталось переписать подпрограммы ввода-вывода магнитофона для прозрачного подсчёта контрольной суммы. А также, клавиатуры, внедрив в неё поддержку переключения между задачами (подобно Alt+Tab).

Однако, силы природы решили меня остановить майским днём, спалив мой тюнер СТВ и мониторы.

P.S.: Исходники того Монитора не утеряны, но недоступны по причине неожиданных BSOD'ов.
Хотя, протестировать мой Монитор и запустить на нём игру "Жизнь" с поддержкой светового пера (мышки) можно по ссылке (нажать G и Enter не забудьте).
(Если после этого запустить из списка Built-in снизу файл "okoshki-demo.rkr", можно ознакомиться с его возможностями.)
Однако, текстовый редактор любителям куда нужнее, чем непонятный переписанный Монитор.


uav1606 пишет:

Выглядит вполне удобно.

Один знакомый подал идею, так как всякие демонстрации и игры сейчас многими делаются, а редакторов текста - совсем мало. Тем более пригодных для работы в ПЗУ.

uav1606 пишет:

Интересно бы на реальном железе проверить, но у меня нет "Радио-86РК" (всё как-то больше "Спектрумы" попадались).

Всё руки не доходят заняться восстановлением своего. Опасаюсь, что РФ2 там могла затереться за давностью лет.

И ещё несколько игр никак в сети не найду, а с плёнки (15 лет назад) вводились с ошибками. Нужно будет найти кассету и попробовать вновь.

  • BALL

  • SKYTHE

  • РАЛЛИ

  • САД

uav1606 пишет:

Кстати, а не хотели бы написать статью в журнал про "Радио-86РК"? Компьютер интересный, но про него практически не писали в журнале... (Разве что о портировании "Охоты на лис" на него.)

Если предлагаете, то можно, в перспективе.

Спасибо!



За весь период использования РЛК мне было известно, как минимум, два редактора:

  • ED.МИКРОН - входящий в состав транслятора ассемблера/дизассемблера (2Кб)

  • WEL - довольно объёмный редактор (5.5Кб)

Однако, все эти интрументы имеют один общий недостаток - посадка на нулевой адрес и низкоуровневая (RST командами) привязка к нему: Просто так их не переместишь!

Некогда прозвучавшая идея (не моя), что не плохо было бы иметь простой экранный редактор прямо в дополнительном ПЗУ (адреса F000-F7FF) не требующий загрузки и с быстрым запуском (директива U Монитора совершает переход на F000), заставил поразмышлять на тему.

Наконец-то, этим месяцем апрелем мне удалось найти в себе отголоски былого 8-битного опыта и тряхнуть стариной.
За основной рабочий инструмент был выбран онлайн-эмулятор РЛК rk86.ru со встроенным ассемблером и поддержкой т.н. светового пера, эмулируемым указателем мыши.

Всегда было интересно, как устроен текстовый редактор оболочки Norton Commander (Volcov Commander) с его функцией Wrap/UnWrap. И с чистого листа пришлось набивать текст листинга на ассемблере под вывод текста из памяти и его прокруткой на длинных строчках (до 255 символов).
Отображение корректных отступов табуляции оказалось очень интересной и сложной темой. А с горизонтальной прокруткой эта табуляция отняла у меня пару дней жёсткой отладки.

Короче говоря, апрель месяц был начат с написания кода текстового редактора и целых 10 дней ушло на то, чтобы заставить этот код хоть как-то предсказуемо работать.

Запустить всё это безобразие можно по этой ссылке (буфер текста уже предустановлен и есть обращение к коду отладчика, который тестирует работу ввода целых и дробных 24-битных, а также - распознаёт токены).

  • Клавиша F1 или Двойной клик мышью (световым пером) по позиции вызывает контекстное меню с опциями передачи управления пользовательскому коду или компилятору

  • Клавиши F2 и F3 прокручивают текст на экране назад и вперёд

  • Если мышью (световым пером) назад вне области редактирования текста, будет производиться горизонтальная или вертикальная прокрутка

  • Клавиши Delete/End/Home работают стандартно (в конкретном онлайн-эмуляторе)

В качестве примера, для оценки производительности кода, был добавлен листинг известной программы Вечный календарь.

Как сказанно выше, код адаптирован и транслирован в область F000-F7FF и запускается директивой U Монитора.
Перед началом он запросит адрес буфера с редактируемым текстом и следует корректно его ввести директивой X Монитора.

P.S.: Надеюсь, кому-то и пригодится.



23

(1 ответов, оставленных в Всякое разное)

Нa просторах всемирной сети можно найти множество интересных простейших утилит, работающих прямо на странице браузера и не требующих установки.

Конечно, есть более функциональные профессиональные средства, но они требуют регистрации или предлагают ознакомительный ограниченный сервис.

Решил я для собственных потребностей набросать простенький движок по отладке узких мест в MMX-цепочках, так как в том же «Visual Studio» всегда не хватало отката во времени значений регистров.

Предлагаемый здесь отладчик (ссылка не является полноценным ассемблером/эмулятором x86-архитектуры, а лишь собирает журнал изменения регистров (контекст процессора) построчно.
Тем самым, перемещая каретку по строкам листинга, в окошках с регистрами «x64»/«MMX»/«SSE» и «Canvas» синхронно будут отображаться все изменения, соответствующие действию конкретной инструкции на конкретной строке…

Интерфейс утилиты разрабатывался с максимальным акцентом на журналирование всего. Так, открытые пункты меню и выбранный стиль после перезагрузки страницы активируются вновь. Сохраняется содержимое редактируемого листинга (при условии наличия метки «revision ДАТА») и позиция каретки / выделение в нём.
Имеется поддержка подгрузки внешних листингов и стилей (ссылка на пример подгрузки вырви глаз стиля №10), которые также можно редактировать (двойной клик по любому пункту меню стилей загружает их в редактор).

Псевдо-ассемблер имеет собственные особенности и не транслирует текст инструкций в промежуточный псевдо-код, а симулирует исполнение сам на месте. Тем самым, имеются жёсткие ограничения на операциях работы с ОЗУ (которого нет) и циклы.

  • «MOVQ MM1,[high],[low]» имеет два указателя на переменные «high» и «low», которые загружаются в старшую и младшую половины соответственно. Это может быть полезным исключительно для предварительной инициализации регистров. Трюк работает со всеми операциями включительно

  • «.LOG "Any remark or comment"» заносит в журнал любую ремарку или комментарий

  • «.LOG "Specific for_mat_for_mmx_regs» предопределяет форматированный вывод MMX-регистров и заносит запись в журнал

  • «.LOG MM1» или «.LOG MM1,"Specific for_mat_for_mmx_regs"» печатает значение MMX-регистра, разделяя его шестнадцатеричные разряды знаком подчёркивания в указанных позициях

  • «.LOG CLEAR» очищает журнал

  • «.REPEAT» задаёт позицию начала макроцикла

  • «.REPEAT constant» или «.REPEAT variable» с числовой константой или именем переменной производит очередную итерацию макроцикла, пока их количество не достигнет определённой величины

  • «.CANVAS CLEAR» очищает графический холст

  • «.CANVAS MM1» ставит на графическом холсте очередной пиксель в позиции, определяемой в младших 16-битных словах рагистра MM1 как «X=LOWORD(MM1)» и «Y=HIWORD(MM1)», используя цвет из старших 32 бит MM1

  • «.CANVAS MM1,width» ставит на графическом холсте очередной пиксель в позиции, определяемой в младшем 32-битном слове регистра MM1 как виртуальный вектор на адрес пикселя в видеобуфере, с шириной строки, определяемой величиной width

Позицией ползунка можно выбирать конкретную итерацию макроцикла и отслеживать показания регистров в конкретный момент.
Зажимая клавиши «Home»/«End» в любом месте листинга можно прокручивать позицию ползунка и отслеживать историю отрабатывания инструкций внутри каждой итерации макроцикла…

P.S.: Надеюсь, тематически данная поделка отвечает критериям форума и заинтересует любителей старины как концепт к отладке MMX-кода…
В будущем неплохо бы разместить этот симулятор/отладчик в github-репозитории и купить отдельное доменное имя, чтобы наглядно и быстро демонстрировать работу MMX-технологии молодому поколению программистов…



24

(12 ответов, оставленных в Всякое разное)

Здeсь просто концептуальный приём.
Если на любительской практике наиболее доступными контроллерами периферии были ИМС серии i82xx, то ничто не мешает применять и триггеры/регистры серии sn74xx. Однако, концептуально я настоятельно рекомендую не коверкать карту дешифрации портов УВВ и назначать строгие адреса.
Например:

╔════╤════════╤════════════════════════════════════════════════════════════════╗
║ D9 │  ИМС   │ Описание доступа к ресурсам микросхемы через РОН процессора    ║
╠════╪════════╪════════════════════════════════════════════════════════════════╣
║0x06│ KS58006│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ16│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x31│ UM91531│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ19│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x70│ CMS8870│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ18│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x73│  74373 │ D0…D7 - Порты доступа к регистрам                              ║
║    │ 555ИР22│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x74│  7474  │ D0…D7 - Порты доступа к триггерам                              ║
║    │ 155ТМ2 │                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x10│AY3-8910│ D0…D7 - Порты доступа к Синтезатору звука                      ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x49│ YM2149 │ D0…D7 - Порты доступа к Синтезатору звука                      ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x51│TDA5051A│ D0…D7 - Порты доступа к AC-Модему                              ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x06│ DS2406 │ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x08│ DS2408 │ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x20│ DS18S20│ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x90│ DS9490R│ D0…D7 - Порты доступа к 1-Wire                                 ║
╚════╧════════╧════════════════════════════════════════════════════════════════╝

То есть, использовать можно любые ИМС, но при развязке дешифрации код из индекса конкретной ИМС должен отражаться и в индексе доступа.

Сегодня продолжил разработку эмулятора.
Добавил «Классический Режим» - режим работы ТТЛ-схемы в Logisim, где операция собирается из байтов не целым машинным циклом, а серией циклов.
В этим режиме в дизассемблере наглядно видно, как представлена та или иная команда в реальности.

Автозапуск
Классический режим

P.S.: На данный момент, из-за мелких неполадок ПК, заниматься разработкой получается раз в неделю…

25

(12 ответов, оставленных в Всякое разное)

Тут всё очень просто.

Говоря на языке z80/x86 с командами in/out, мы в регистр «B»/«DH» помещаем индекс ИМС конкретной серии, а в «C»/«DL» уже порт самой ИМС:

DH__DL
_B_ _C_
55h 00h|Порт A i8255 №1
55h 01h|Порт B i8255 №1
55h 02h|Порт C i8255 №1
55h 03h|Режим i8255 №1
55h 04h|Порт A i8255 №2
55h 05h|Порт B i8255 №2
55h 06h|Порт C i8255 №2
55h 07h|Режим i8255 №2
... ... ...
55h FCh|Порт A i8255 №64
55h FDh|Порт B i8255 №64
55h FEh|Порт C i8255 №64
55h FFh|Режим i8255 №64
-----------------------
53h 00h|Канал 0 i8253 №1
53h 01h|Канал 1 i8253 №1
53h 02h|Канал 2 i8253 №1
53h 03h|Режим i8253 №1
53h 04h|Канал 0 i8253 №2
53h 05h|Канал 1 i8253 №2
53h 06h|Канал 2 i8253 №2
53h 07h|Режим i8253 №2
... ... ...
53h FCh|Канал 0 i8253 №64
53h FDh|Канал 1 i8253 №64
53h FEh|Канал 2 i8253 №64
53h FEh|Режим i8253 №64

У меня в роли регистра «B»/«DH» выступает D₉, а D₈ выбирает порядковый номер в системе:

    MOV D9,0x55     ; Выбираем ИМС i8255/К580ВВ55
    MOV D8,1        ; Если в системе несколько i8255, указываем индекс
    MOV [BC1+1],D1  ; Считываем "Порт B" ИМС i8255 и сохраняем в память
    MOV D9,0x53     ; Выбираем ИМС i8253/К580ВИ53
    MOV D8,3        ; Если таймеров много, укажем индекс (1 из 256 штук)
    MOV D3,0xB6     ; Канал #2 в режим №3
    MOV D2,[BC1+1]  ; Младший байт коэффициента
    MOV D2,[BC1+2]  ; Старший байт коэффициента

Если по такой схеме к z80/x86 можно подключить до 64 штук i8253/i8255, то здесь можно подключить до 512 ИМС типа i8253/i8255, до 1024 ИМС типа i8275/i8279, до 128 ИМС типа i8257. То есть, суммарно - примерно до 25 тысяч различных периферийных интерфейсов. Думаю, хватит с лихвой!
Не так ли? roll