<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://bolknote.ru/_styles/rss.xslt" type="text/xsl"?>
	<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
		<channel>
			<title>Евгений Степанищев</title>
			<link>https://bolknote.ru/</link>
			<description>Евгений Степанищев. Последние посты.</description>
			<language>ru</language>
			<generator>Register v2.0.0-edge.20261011.204623</generator>
			<docs>https://www.rssboard.org/rss-specification</docs>
			<ttl>10</ttl>
			<atom:link href="https://bolknote.ru/rss" rel="self" type="application/rss+xml" />
			<lastBuildDate>Sun, 11 Oct 2026 18:53:53 GMT</lastBuildDate>
			<item>
				<title>Тёплый октябрь</title>
				<link>https://bolknote.ru/all/teplyj-oktabr</link>
				<description>&lt;p&gt;Я осень не люблю, но в&amp;nbsp;этом году радует и&amp;nbsp;меня&amp;nbsp;— яркая, тёплая, бездождливая. Даже ставшие жёлтыми деревья не угнетают. Обычно в&amp;nbsp;конце года, едва начинают опадать листья, на меня наваливается хандра, но в&amp;nbsp;этом году пока о&amp;nbsp;ней не вспоминаю.&lt;/p&gt;&lt;p&gt;Пока тепло, друг позвал покататься с&amp;nbsp;знакомым ему лесником по лесам одного из отдалённых районов Татарстана. Я не отказался&amp;nbsp;— в&amp;nbsp;такие места без знающего человека не сунешься. Леса там не то чтобы глухие, но заблудиться&amp;nbsp;— раз плюнуть. За&amp;nbsp;всю поездку мы не встретили ни одного человека, впрочем, как и&amp;nbsp;других крупных животных.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.11@2x.jpg&quot; alt=&quot;На фоне осенних деревьев стоят два красных автомобиля с открытыми капотами.&quot; data-post-media-id=&quot;72&quot; data-post-media-identity=&quot;1&quot; width=&quot;1000&quot; height=&quot;562&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Это «Надежда», никогда их не видел, честно говоря, сначала я подумал, что это какая-то самоделка&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Ездили мы на «Надежде»&amp;nbsp;— автовазовском минивене. Впервые вижу эту машину. Честно сказать, когда я её только увидел, подумал, что это самоделка,&amp;nbsp;сделанная из «Нивы» и&amp;nbsp;«Газели». Оказалось&amp;nbsp;— нет, серийно выпускавшаяся модель.&lt;/p&gt;&lt;p&gt;Лесник оказался настоящим лихачём, не припомню, чтобы кто-то так смело штурмовал лес безо всяких дорог. «Надежда», несмотря на свой неказистый внешний вид, оказалось потрясающе проходимой машиной.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.11.1@2x.jpg&quot; alt=&quot;Лесистый пейзаж с преобладанием берёз, покрытых осенней листвой, среди которых видны упавшие стволы деревьев.&quot; data-post-media-id=&quot;73&quot; data-post-media-identity=&quot;1&quot; width=&quot;1000&quot; height=&quot;562&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Остатки землянки, перекрытие давно рухнуло, осталась только яма. Таких там полно&amp;nbsp;— когда-то там заготавливали лес, в&amp;nbsp;них жили рабочие&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Какой-то особой программы у&amp;nbsp;нас не было&amp;nbsp;— в&amp;nbsp;основном колесили по лесу, но кое-что приметное всё-таки было. Лесник обещал нам показать настоящие землянки и&amp;nbsp;заброшенный яблоневый сад на месте пионерского лагеря.&lt;/p&gt;&lt;p&gt;Землянка не впечатлила&amp;nbsp;— просто яма в&amp;nbsp;земле. Когда я в&amp;nbsp;детстве &lt;a href=&quot;https://bolknote.ru/all/zemlyanka&quot;&gt;нашёл землянку&lt;/a&gt;&amp;nbsp;в&amp;nbsp;своём родном городе, там было целое перекрытие, тут&amp;nbsp;же оно давно сгнило.&lt;/p&gt;&lt;p&gt;А&amp;nbsp;вот яблоневый сад понравился куда больше&amp;nbsp;— для пионеров когда-то посадили несколько сортов различных яблок и, несмотря на то, что они все выродились в&amp;nbsp;мелочь, яблоки с&amp;nbsp;некоторых деревьев были очень даже ничего.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.11.2@2x.jpg&quot; alt=&quot;Мужчина стоит рядом с большой кучей земли посреди леса.&quot; data-post-media-id=&quot;74&quot; data-post-media-identity=&quot;1&quot; width=&quot;1000&quot; height=&quot;562&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Я рядом с&amp;nbsp;муравейником&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Больше всего мне понравились гигантские муравейники, чем я изрядно удивил нашего провожатого&amp;nbsp;— для него они обычное явление. Не&amp;nbsp;думаю, что я когда-нибудь видел такие большие. Я даже не отказал себе в&amp;nbsp;удовольствии сфотографироваться рядом с&amp;nbsp;одним из них. Причём на снимке далеко это не самый большой&amp;nbsp;— якобы в&amp;nbsp;тех местах встречаются и&amp;nbsp;трёхметровые.&lt;/p&gt;&lt;p&gt;К&amp;nbsp;сожалению, не встретили&amp;nbsp;ли косуль, ни лосей. Их там много, но не повезло. Из&amp;nbsp;более-менее крупных животных видели только чёрных дятлов. К&amp;nbsp;сожалению, сфотографировать их не получилось&amp;nbsp;— очень уж они пугливые.&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/teplyj-oktabr</guid>
				<pubDate>Sun, 11 Oct 2026 16:36:54 GMT</pubDate>
				<comments>https://bolknote.ru/all/teplyj-oktabr#comment</comments>
			</item>
			<item>
				<title>«Пропьёшь» ли навык программировать?</title>
				<link>https://bolknote.ru/all/prop-es-li-navyk-programmirovat</link>
				<description>&lt;p&gt;Не&amp;nbsp;могу согласиться с&amp;nbsp;распространённой поговоркой «мастерство не пропьёшь». Обычно её понимают так: если у&amp;nbsp;человека есть талант или навык, он останется с&amp;nbsp;ним навсегда. Но&amp;nbsp;мой опыт говорит об обратном. Я, можно сказать, «пропил» по меньшей мере одно своё мастерство.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;начале девяностых я учился в&amp;nbsp;Лениногорском нефтяном техникуме, и&amp;nbsp;черчение давалось мне удивительно легко. Настолько легко, что очень скоро стало скучно. Мне казалось странным снова и&amp;nbsp;снова выводить одни и&amp;nbsp;те&amp;nbsp;же элементы, когда я и&amp;nbsp;без того безошибочно представлял деталь в&amp;nbsp;трёх проекциях и&amp;nbsp;разрезе. В&amp;nbsp;голове она возникала объёмной, а&amp;nbsp;на бумагу переносилась почти автоматически.&lt;/p&gt;&lt;p&gt;Думаю со стороны это казалось проявлением то&amp;nbsp;ли лени, то&amp;nbsp;ли наплевательского отношения к&amp;nbsp;предмету.&lt;/p&gt;&lt;p&gt;Именно из-за этого преподавательница не допустила меня до местной олимпиады по черчению. До&amp;nbsp;сих пор вспоминаю это с&amp;nbsp;сожалением: наша команда тогда с&amp;nbsp;треском проиграла, а&amp;nbsp;я сидел в&amp;nbsp;зале и&amp;nbsp;ловил себя на мысли, что знаю ответы на все без исключения задания.&lt;/p&gt;&lt;p&gt;Недавно, уже скорее из любопытства, я решил проверить, осталось&amp;nbsp;ли это умение. Оказалось&amp;nbsp;— нет. Тот навык исчез. Сегодня я уже не могу так&amp;nbsp;же отчётливо увидеть предмет в&amp;nbsp;голове сразу в&amp;nbsp;трёх проекциях и&amp;nbsp;мысленно «вращать» его, как делал это когда-то без малейших усилий.&lt;/p&gt;&lt;p&gt;Замечаю, что в&amp;nbsp;последнее время многие программисты задаются вопросом&amp;nbsp;— не исчезнет&amp;nbsp;ли их навык программирования, если они отдадут&amp;nbsp;эту часть работы&amp;nbsp;нейросетям? Думаю, им хочется услышать от как можно большего количества народу что-то ободряющее, вроде «конечно нет, ты что?», но история выше показывает, что навыки вполне себе исчезают без следа.&lt;/p&gt;&lt;p&gt;Вопрос только в&amp;nbsp;том зачем нам этот навык? Это как с&amp;nbsp;моим навыком черчения. Что такое должно произойти, чтобы он снова мне пригодился?&lt;/p&gt;&lt;p&gt;Пандора уже открыла свой пифос, нейросети никуда не исчезнут. У&amp;nbsp;нас сейчас переходный период, поэтому всё выглядит зыбко, но вектор-то вполне видно. Как когда-то ручной труд сменился промышленным производством в&amp;nbsp;силу очевидных причин, так и&amp;nbsp;ручное кодирование исчезнет по причине того, что нейросеть будет делать это всё быстрее и&amp;nbsp;дешевле.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Уже сейчас на двухсотдолларовой подписке при хорошем уровне понимании задачи и&amp;nbsp;контроле, можно за сутки сделать столько, сколько коллектив из нескольких разработчиков хорошего уровня будет делать месяцы! А&amp;nbsp;ведь это ещё не предел&amp;nbsp;— уровень нейросетей всё растёт и&amp;nbsp;из анонсов мы знаем, что каждая из компаний переднего края готовится выпустить свою нейросеть ещё более высокого уровня.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Другое дело, что поменялось всё слишком быстро и&amp;nbsp;никто не понимает толком как перестроить обучение. Дать каждому студенту подписку на нейросети и&amp;nbsp;сразу учить на какую-то смесь руководителя разработки с&amp;nbsp;примесью бизнес-анализа и&amp;nbsp;навыком тестирования? Так ведь человечество не настолько реактивно.&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Часть людей до сих пор находится на стадии отрицания вайбкодинга. Благо мемы годовой давности, когда код нейросети без ревью даже в&amp;nbsp;домашний проект класть было зазорно, помогают им жить в&amp;nbsp;своём иллюзорном мирке и&amp;nbsp;считать, что они трезво смотрят на мир.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Одно понятно. В&amp;nbsp;переходной стадии программисту надо одновременно развивать оба навыка&amp;nbsp;— программирования и&amp;nbsp;управления программирующими сетями. Руководители разработчиков оказались в&amp;nbsp;чуть более выгодном положении&amp;nbsp;— программировать им необязательно, а&amp;nbsp;управлять программирующими они уже умеют. Ну или должны уметь.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<guid isPermaLink="true">https://bolknote.ru/all/prop-es-li-navyk-programmirovat</guid>
				<pubDate>Sat, 10 Oct 2026 13:49:47 GMT</pubDate>
				<comments>https://bolknote.ru/all/prop-es-li-navyk-programmirovat#comment</comments>
			</item>
			<item>
				<title>Движок сайта: бессерверные боты</title>
				<link>https://bolknote.ru/all/dvizok-sajta-besservernye-boty</link>
				<description>&lt;p&gt;Я мало рассказываю о&amp;nbsp;своём движке сайта. Всё обещаю себе, что закончу и&amp;nbsp;тогда напишу большую обзорную статью, но на деле очень страшусь объёма работы: он уже очень многое умеет, а&amp;nbsp;то&amp;nbsp;ли ещё будет&amp;nbsp;— планов громадьё!&lt;/p&gt;&lt;p&gt;Поэтому лучше рассказывать потихоньку.&lt;/p&gt;&lt;p&gt;Со&amp;nbsp;сменой движка многие обратили внимание, что комментарии из моей группы в&amp;nbsp;«Телеграме» теперь транслируются на сайт. Ну как «транслируются»&amp;nbsp;— приходилось руками экспортировать их в&amp;nbsp;клиенте, потом загружать к&amp;nbsp;себе. Конечно, логичнее было&amp;nbsp;бы делать это через бота, да вот незадача&amp;nbsp;— его надо было&amp;nbsp;бы где-то хостить, а&amp;nbsp;с&amp;nbsp;учётом ограничений «Телеграма» в&amp;nbsp;нашей стране искать хостинг пришлось&amp;nbsp;бы за границей.&lt;/p&gt;&lt;p&gt;Выход на самом деле есть&amp;nbsp;— так называемые «бессерверные боты», недавно появившаяся у&amp;nbsp;«Телеграма» возможность. Небольшая цитата из&amp;nbsp;&lt;a href=&quot;https://core.telegram.org/bots/serverless&quot;&gt;руководства&amp;nbsp;&lt;i&gt;Telegram Serverless&lt;/i&gt;&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Telegram Serverless позволяет запускать серверный код бота и&amp;nbsp;мини-приложения прямо на инфраструктуре «Телеграма»&amp;nbsp;— не нужно настраивать серверы, поддерживать контейнеры в&amp;nbsp;рабочем состоянии и&amp;nbsp;думать о&amp;nbsp;масштабировании.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Одна проблема&amp;nbsp;— доступ пока дают не всем, сначала надо отстоять очередь. Я получил его вчера и&amp;nbsp;сразу с&amp;nbsp;нейросетью сделал бота для переноса комментариев. Теперь буду тестировать на живых обсуждениях.&lt;/p&gt;&lt;p&gt;Технически это набор обычных джаваскриптовых модулей. Для каждого события&amp;nbsp;— свой обработчик: &lt;code&gt;&lt;tt&gt;handlers/message.js&lt;/tt&gt;&lt;/code&gt; получает сообщения, &lt;code&gt;&lt;tt&gt;handlers/edited_message.js&lt;/tt&gt;&lt;/code&gt;&amp;nbsp;— правки. «Телеграм» вызывает функцию, она выполняет работу и&amp;nbsp;завершается. Код работает в&amp;nbsp;изолированной среде &lt;tt&gt;V8&lt;/tt&gt;; полноценной &lt;i&gt;Node.js&lt;/i&gt; со всеми &lt;tt&gt;npm&lt;/tt&gt;-пакетами там нет.&lt;/p&gt;&lt;p&gt;Подключение начинается в&amp;nbsp;&lt;a href=&quot;https://t.me/BotFather?startapp&quot;&gt;мини-приложении &lt;i&gt;BotFather&lt;/i&gt;&lt;/a&gt;: создаёшь бота, встаёшь в&amp;nbsp;очередь, когда она подошла, выбираешь бота, включаешь &lt;i&gt;Serverless&lt;/i&gt;&amp;nbsp;и&amp;nbsp;получаешь отдельный ключ для командной строки. На&amp;nbsp;компьютере нужен &lt;i&gt;Node.js 18&lt;/i&gt; или новее:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm create @tgcloud/bot my-bot
cd my-bot
npx tgcloud login
npx tgcloud push&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&lt;tt&gt;login&lt;/tt&gt;&lt;/code&gt; связывает проект с&amp;nbsp;ботом, &lt;code&gt;&lt;tt&gt;push&lt;/tt&gt;&lt;/code&gt; загружает код.&amp;nbsp;В&amp;nbsp;комплекте есть &lt;i style=&quot;text-wrap-mode: initial;&quot;&gt;SQLite&lt;/i&gt;, &lt;i style=&quot;text-wrap-mode: initial;&quot;&gt;Bot API&lt;/i&gt; и&amp;nbsp;&lt;code style=&quot;text-wrap-mode: initial;&quot;&gt;&lt;tt&gt;fetch&lt;/tt&gt;&lt;/code&gt; для внешних &lt;i style=&quot;text-wrap-mode: initial;&quot;&gt;HTTP&lt;/i&gt;-запросов. База сохраняется между вызовами, поэтому можно хранить пользователей, настройки, очередь заданий.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Понятно, что все шаги я описываю поверхностно, чтобы самому не забыть, для подробностей есть документация.&lt;/p&gt;&lt;p&gt;У&amp;nbsp;меня бот сначала сохраняет событие в&amp;nbsp;локальную базу, потом пробует передать его сайту. Если сайт недоступен, запись остаётся для повторной отправки. Если одно сообщение придёт дважды, второй комментарий из него не получится&amp;nbsp;— движок сайта помнит, что уже импортировал.&lt;/p&gt;&lt;p&gt;Связь со статьёй определяется по ссылке в&amp;nbsp;исходном посте канала&amp;nbsp;— я всегда ставлю её в&amp;nbsp;заголовке. Ответы сохраняют структуру обсуждения, а&amp;nbsp;мой &lt;i&gt;Telegram ID&lt;/i&gt; связан с&amp;nbsp;моей учётной записью на сайте, чтобы собственные комментарии узнавались как авторские. Так&amp;nbsp;же из комментариев переносятся картинки, видео, стикеры и&amp;nbsp;реакции, включая их снятие.&lt;/p&gt;&lt;p&gt;Приёмник на сайте защищён отдельным секретным ключом, поэтому злоумышленник не может прислать ему команду добавить комментарий. Сам сайт при этом за файлами в&amp;nbsp;«Телеграм» не ходит&amp;nbsp;— бот скачивает их у&amp;nbsp;себя и&amp;nbsp;отправляет вместе с&amp;nbsp;остальными данными.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Вот такая получилась схема. Я пока не знаю удастся&amp;nbsp;ли этим&amp;nbsp;же путём сделать публикацию заметок, но планирую попробовать, если получится, будет здорово.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA%20%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80/&quot;&gt;движок Регистр&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>движок Регистр</category>
				<guid isPermaLink="true">https://bolknote.ru/all/dvizok-sajta-besservernye-boty</guid>
				<pubDate>Sat, 10 Oct 2026 07:41:41 GMT</pubDate>
				<comments>https://bolknote.ru/all/dvizok-sajta-besservernye-boty#comment</comments>
			</item>
			<item>
				<title>«MK-61s»: SIMD</title>
				<link>https://bolknote.ru/all/mk-61s-simd</link>
				<description>&lt;p&gt;Было время, когда меня захватила идея реализовать поддержку «Юникода» на «Флиппере Зеро». Я много тогда над этим работал и&amp;nbsp;одна из вещей, которую я тогда делал&amp;nbsp;— пытался ускорить &lt;a href=&quot;https://bolknote.ru/all/konec-uskorennoy-strlen-na-flippere&quot;&gt;измерение длины строки&lt;/a&gt; в&amp;nbsp;кодировке «ЮТФ-8». Не&amp;nbsp;то чтобы это было реальной проблемой, но мне хотелось этим заняться, вот я и&amp;nbsp;занимался.&lt;/p&gt;&lt;p&gt;Тогда я познакомился с&amp;nbsp;расширением &lt;a href=&quot;https://arm-software.github.io/CMSIS_6/main/Core/group__intrinsic__SIMD__gr.html&quot;&gt;&lt;i&gt;DSP SIMD&lt;/i&gt;&lt;/a&gt;, которое помогает на армовских процессорах параллельно обрабатывать несколько значений одновременно. Вчера мне этот опыт пригодился.&lt;/p&gt;&lt;p&gt;Сейчас я занят ускорением работы встроенных в&amp;nbsp;ретроконсоль «&lt;i&gt;МК-61s&lt;/i&gt;» языков программирования&amp;nbsp;— Бейсика и&amp;nbsp;Фокала и&amp;nbsp;вспомнил об этих инструкциях, так как процессор «&lt;i&gt;MK-61s&lt;/i&gt;» их тоже поддерживает.&lt;/p&gt;&lt;p&gt;Чтобы измерять оптимизации я, как это у&amp;nbsp;меня водится, портировал по эту задачу на ретроконсоль очередную игру. На&amp;nbsp;этот раз&amp;nbsp;&lt;a href=&quot;https://bolknote.ru/all/shahmaty-alana-tyuringa&quot;&gt;шахматы Алана Тьюринга&lt;/a&gt;&amp;nbsp;и&amp;nbsp;Дэвида Чемперноуна&amp;nbsp;(есть восстановленный алгоритм по мотивам их идей 1948 года). Нейросеть их перевела на Бейсик и&amp;nbsp;это очень хороший тест, так как там очень много вычислений&amp;nbsp;— первая версия делала ход за 162 секунды.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.09.webp&quot; alt=&quot;На черно-белом фото изображено устройство МК-61с с надписью «SIMD» сбоку.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;71&quot; data-post-media-identity=&quot;1&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Шахматы Алана Тьюринга на виртуальном экран ретроконсоли «MK-61s»&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Я занялся ускорением, так как по предложению одного из членов нашей команды, Алексея Сугоняева, перевёл интерпретаторы Бейсика и&amp;nbsp;Фокала в&amp;nbsp;трансляторы, формирующие специально разработанный байт-код, который затем и&amp;nbsp;выполняется. Оказалось, что я неправильно понял его идею, но дело уже сделано, и&amp;nbsp;этот подход принёс неожиданные преимущества.&lt;/p&gt;&lt;p&gt;Во-первых, ускоряя виртуальную машину, мы ускоряем сразу оба языка, во-вторых, их можно мешать между собой, так как они оба транслируются в&amp;nbsp;один и&amp;nbsp;тот&amp;nbsp;же промежуточный язык.&lt;/p&gt;&lt;p&gt;Все низковисящие плоды в&amp;nbsp;плане оптимизации я уже сорвал, остались довольно сложные вещи, типа джит-компиляции, но перед этим я хочу убедиться, что сделаны все более простые вещи. Вот тут я и&amp;nbsp;вспомнил про &lt;i&gt;SIMD&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;«Юникода» в&amp;nbsp;«&lt;i&gt;MK-61s&lt;/i&gt;» уже нет&amp;nbsp;— я недавно &lt;a href=&quot;https://bolknote.ru/all/mk-61s-odnobajtovaa-kodirovka&quot;&gt;перевёл код&lt;/a&gt; на однобайтовую кодировку, но тем не менее есть что ускорить. Эксперименты показали, что эффект есть при трансляции, когда Бейсик и&amp;nbsp;Фокал ищут пробельные символы и&amp;nbsp;переводы строки, что немного ускоряет холодный старт программ:&lt;br&gt;&lt;/p&gt;&lt;table style=&quot;font-family: system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;Программа&lt;/th&gt;&lt;th style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;Времени на компиляцию меньше&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;Шахматный поиск, Бейсик&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;0,47%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;Вступление &lt;i&gt;High Noon&lt;/i&gt;, Бейсик&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;1,32%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;Статистика, Фокал&lt;/td&gt;&lt;td style=&quot;border-bottom: 1px solid color(srgb 0.905882 0.878431 0.831373 / 0.18);&quot;&gt;1,38%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class=&quot;&quot;&gt;К&amp;nbsp;слову, оптимизированная версия Бейсика сейчас делает на холодную первый ход в&amp;nbsp;шахматах за 104 секунды, а&amp;nbsp;при прогретых кешах&amp;nbsp;— за 87,5. Это пока всё равно медленно, но куда лучше 162 секунд, которые были в&amp;nbsp;начале.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-simd</guid>
				<pubDate>Fri, 09 Oct 2026 05:27:19 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-simd#comment</comments>
			</item>
			<item>
				<title>«MK-61s»: самораспаковка в 105 ячейках</title>
				<link>https://bolknote.ru/all/mk-61s-samoraspakovka-v-105-acejkah</link>
				<description>&lt;p&gt;Что-то никак не оставляла меня мысль сделать более «честную» самораспаковывающуюся программу&amp;nbsp;— без дополнительного регистра и&amp;nbsp;чтобы умещалась в&amp;nbsp;стандартную память калькулятора. Чтобы она работала в&amp;nbsp;том гипотетическом сценарии, если&amp;nbsp;бы авторы «Электроники МК-61» всё-таки позаботились доделать инструкции для работы с&amp;nbsp;дополнительной памятью &lt;tt&gt;Ms&lt;/tt&gt;.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;&lt;a href=&quot;https://bolknote.ru/all/mk-61s-samomodificiruusiesa-programmy&quot;&gt;прошлый раз&lt;/a&gt; игра вместе с&amp;nbsp;распаковщиком занимала диапазон в&amp;nbsp;110 ячеек, включая нестандартные адреса, которые есть только в&amp;nbsp;ретроконсоли. Теперь весь образ помещается в&amp;nbsp;105 ячеек, нестандартный регистр &lt;tt&gt;Rf&lt;/tt&gt; не используется, а&amp;nbsp;начальные значения регистров устанавливает сама программа.&lt;/p&gt;&lt;p&gt;Больше всего удалось убрать из игровой части. Там были четыре отдельных вывода значений &lt;tt&gt;R1&lt;/tt&gt;, &lt;tt&gt;R2&lt;/tt&gt;, &lt;tt&gt;R3&lt;/tt&gt; и&amp;nbsp;&lt;tt&gt;R9&lt;/tt&gt;, каждый из двух команд: чтение регистра и&amp;nbsp;остановка. Такие&amp;nbsp;же выводы уже есть в&amp;nbsp;распаковываемой части, нейросеть переназначила клетки карты на них. Это освободило восемь байт.&lt;/p&gt;&lt;p&gt;Сообщения о&amp;nbsp;результате игры&amp;nbsp;— числа &lt;tt&gt;30&lt;/tt&gt; и&amp;nbsp;&lt;tt&gt;20&lt;/tt&gt;&amp;nbsp;— теперь вводятся командами цифр. Каждый такой вывод стал на одну команду длиннее, зато для самих чисел больше не нужны регистры. Из&amp;nbsp;восьми освобождённых байтов потратил два, после чего неизменяемый хвост игры сократился с&amp;nbsp;27 до 21 байта.&lt;/p&gt;&lt;p&gt;У&amp;nbsp;распаковщика удалось убрать три команды: &lt;tt&gt;8&lt;/tt&gt;, &lt;tt&gt;x→П0&lt;/tt&gt; и&amp;nbsp;&lt;tt&gt;X↔Y&lt;/tt&gt;. Начальное значение счётчика теперь закодировано в&amp;nbsp;первом числовом блоке упакованной программы. При обменах оно само попадает в&amp;nbsp;&lt;tt&gt;R0&lt;/tt&gt;, поэтому вводить и&amp;nbsp;сохранять восьмёрку отдельными командами больше не требуется.&lt;/p&gt;&lt;p&gt;Чтобы отказаться от &lt;tt&gt;Rf&lt;/tt&gt;, пришлось перенести хранившийся в&amp;nbsp;нём шаг распаковки в&amp;nbsp;&lt;tt&gt;Rd&lt;/tt&gt;&amp;nbsp;— регистр, где во время игры хранится здоровье. Во&amp;nbsp;время распаковки здоровье ещё не нужно, а&amp;nbsp;перед запуском игры его устанавливают две команды: &lt;tt&gt;5&lt;/tt&gt;&amp;nbsp;и&amp;nbsp;&lt;tt&gt;x→Пd&lt;/tt&gt;. Три команды ушло, две добавилось, в&amp;nbsp;итоге распаковщик сократился с&amp;nbsp;20 до 19 байт.&lt;/p&gt;&lt;p&gt;Итого из игры и&amp;nbsp;распаковщика удалось убрать семь команд. В&amp;nbsp;новом расположении между распаковываемой частью и&amp;nbsp;игровыми процедурами оставлены две пустые ячейки. Поэтому занимаемый диапазон сократился на пять ячеек: со 110 до 105.&lt;/p&gt;&lt;p&gt;Подготовку регистров удалось поместить в&amp;nbsp;свободные места первых 63 ячеек. С&amp;nbsp;адреса &lt;tt&gt;08&lt;/tt&gt; выполняется цикл: в&amp;nbsp;&lt;tt&gt;Rc&lt;/tt&gt; записывается &lt;tt&gt;9&lt;/tt&gt;, затем значение &lt;tt&gt;Rc&lt;/tt&gt; + 10 косвенно сохраняется в&amp;nbsp;регистр с&amp;nbsp;номером &lt;tt&gt;Rc&lt;/tt&gt;, а&amp;nbsp;счётчик уменьшается. Так &lt;tt&gt;R9&lt;/tt&gt;–&lt;tt&gt;R1&lt;/tt&gt; получают необходимые для игры числа 19–11. Затем устанавливаются остальные начальные значения и&amp;nbsp;адреса игровых процедур.&lt;/p&gt;&lt;p&gt;Эти значения перед распаковкой уже находятся в&amp;nbsp;регистрах. Первый &lt;tt&gt;К ПВ&lt;/tt&gt; сохраняет значения &lt;tt&gt;R0&lt;/tt&gt;–&lt;tt&gt;R8&lt;/tt&gt; в&amp;nbsp;&lt;tt&gt;Ms&lt;/tt&gt;, последний возвращает их обратно. &lt;tt&gt;R9&lt;/tt&gt;, &lt;tt&gt;Ra&lt;/tt&gt; и&amp;nbsp;&lt;tt&gt;Rb&lt;/tt&gt; остаются на месте. Отдельных команд сохранения и&amp;nbsp;восстановления не понадобилось. А&amp;nbsp;сам код подготовки стирается при распаковке&amp;nbsp;— его место занимает игра.&lt;/p&gt;&lt;p&gt;Для перехода к&amp;nbsp;распаковщику нейросеть приспособила игровой переход в&amp;nbsp;ячейке &lt;tt&gt;35&lt;/tt&gt;, заменив его на &lt;tt&gt;БП&lt;/tt&gt;. До&amp;nbsp;распаковки следующий байт содержит адрес &lt;tt&gt;86&lt;/tt&gt;. После распаковки там оказывается код &lt;tt&gt;65&lt;/tt&gt;&amp;nbsp;— &lt;tt&gt;П→x5,&lt;/tt&gt; который для &lt;tt&gt;БП&lt;/tt&gt; служит адресом &lt;tt&gt;65&lt;/tt&gt;. Поэтому процедура сбора детали теперь размещена именно там, для этого пришлось перед ней оставить две пустые ячейки. Один переход служит сначала подготовке, потом игре.&lt;/p&gt;&lt;p&gt;Для запуска нужно записать в&amp;nbsp;память 79 ненулевых байт кода и&amp;nbsp;данных. Сюда входит и&amp;nbsp;код подготовки игровых регистров. Остальные ячейки должны быть обнулены. После распаковки игра размещается по адресам&amp;nbsp;&lt;tt&gt;00&lt;/tt&gt;–&lt;tt&gt;85&lt;/tt&gt;, распаковщик&amp;nbsp;— в&amp;nbsp;&lt;tt&gt;86&lt;/tt&gt;–&lt;tt&gt;104&lt;/tt&gt;. Запуск начинается с&amp;nbsp;&lt;tt&gt;08&lt;/tt&gt;, а&amp;nbsp;после распаковки управление возвращается в&amp;nbsp;&lt;tt&gt;00&lt;/tt&gt;. Ниже показано выполнение всего этого варианта.&lt;/p&gt;&lt;div class=&quot;post-html-block&quot; data-post-html-source=&quot;&amp;lt;style&amp;gt;
/* Local defaults for an ordinary article, without Codex&#039;s visualization CSS. */
#mk61-unpacker-auto-init {
  --foreground: var(--mk61-text, CanvasText);
  --muted-foreground: color-mix(in srgb, var(--foreground) 60%, transparent);
  --viz-series-1: var(--mk61-highlight, LinkText);
  --accent: color-mix(in srgb, var(--viz-series-1) 13%, Canvas);
  --font-size-small: 12px;
  --line-height-small: 16px;
  font: 13px/1.35 system-ui, sans-serif;
}
#mk61-unpacker-auto-init * { box-sizing: border-box; }
#mk61-unpacker-auto-init .viz-controls { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
#mk61-unpacker-auto-init .btn {
  appearance: none; padding: 4px 10px; border: 1px solid color-mix(in srgb, var(--foreground) 15%, transparent);
  border-radius: 5px; font: inherit; color: var(--foreground); background: transparent; cursor: pointer;
}
#mk61-unpacker-auto-init .btn:hover:enabled { background: color-mix(in srgb, var(--foreground) 6%, transparent); }
#mk61-unpacker-auto-init .btn:disabled { opacity: .35; cursor: default; }
#mk61-unpacker-auto-init [data-status] { padding-left: 4px; font-variant-numeric: tabular-nums; }
@media (pointer: coarse) {
  #mk61-unpacker-auto-init .btn { min-width: 44px; min-height: 44px; }
}
&amp;lt;/style&amp;gt;
&amp;lt;div id=&amp;quot;mk61-unpacker-auto-init&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;viz-controls&amp;quot;&amp;gt;
    &amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; data-back aria-label=&amp;quot;Предыдущая команда&amp;quot;&amp;gt;←&amp;lt;/button&amp;gt;
    &amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; data-next aria-label=&amp;quot;Следующая команда&amp;quot;&amp;gt;→&amp;lt;/button&amp;gt;
    &amp;lt;span class=&amp;quot;text-small tabular-nums&amp;quot; data-status aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div data-program class=&amp;quot;memory&amp;quot; role=&amp;quot;list&amp;quot; aria-label=&amp;quot;Программная память: ячейки 00–104&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;ms-label&amp;quot;&amp;gt;Ms&amp;lt;/div&amp;gt;
  &amp;lt;div data-ms class=&amp;quot;ms&amp;quot; role=&amp;quot;list&amp;quot; aria-label=&amp;quot;Девять блоков Ms по семь байтов&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;ms-label&amp;quot;&amp;gt;Регистры&amp;lt;/div&amp;gt;
  &amp;lt;div data-registers class=&amp;quot;registers&amp;quot; role=&amp;quot;list&amp;quot; aria-label=&amp;quot;Регистры R0–RE&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;noscript&amp;gt;Для пошагового просмотра нужен JavaScript.&amp;lt;/noscript&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
#mk61-unpacker-auto-init{container-type:inline-size;max-width:1000px;margin:auto;color:var(--foreground)}
#mk61-unpacker-auto-init .memory{display:grid;grid-template-columns:repeat(10,minmax(0,1fr));gap:2px;margin-top:8px}
#mk61-unpacker-auto-init .cell{padding:5px 3px;min-width:0;background:color-mix(in srgb,var(--foreground) 4%,transparent);white-space:nowrap;font-size:var(--font-size-small);line-height:var(--line-height-small);font-variant-numeric:tabular-nums}
#mk61-unpacker-auto-init .cell code{font:inherit;color:inherit;margin-right:4px;padding:0;background:none}
#mk61-unpacker-auto-init .cell.target{background:color-mix(in srgb,var(--viz-series-1) 7%,transparent)}
#mk61-unpacker-auto-init .cell.pending{color:var(--muted-foreground)}
#mk61-unpacker-auto-init .cell.changed{background:color-mix(in srgb,var(--viz-series-1) 22%,transparent)}
#mk61-unpacker-auto-init .cell.current{outline:2px solid var(--viz-series-1);outline-offset:-2px;background:var(--accent);color:var(--foreground)}
#mk61-unpacker-auto-init .ms-label{font-size:var(--font-size-small);font-weight:500;margin:10px 0 4px}
#mk61-unpacker-auto-init .ms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px}
#mk61-unpacker-auto-init .block{padding:6px 3px;background:color-mix(in srgb,var(--foreground) 4%,transparent);font-family:ui-monospace,monospace;font-size:var(--font-size-small);line-height:var(--line-height-small);text-align:center;white-space:nowrap}
#mk61-unpacker-auto-init .block.changed{background:color-mix(in srgb,var(--viz-series-1) 16%,transparent)}
#mk61-unpacker-auto-init .service{color:var(--muted-foreground)}
#mk61-unpacker-auto-init .registers{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px}
#mk61-unpacker-auto-init .register{display:flex;align-items:baseline;justify-content:space-between;gap:6px;padding:5px 6px;min-width:0;background:color-mix(in srgb,var(--foreground) 4%,transparent);font-family:ui-monospace,monospace;font-size:var(--font-size-small);line-height:var(--line-height-small);font-variant-numeric:tabular-nums;white-space:nowrap}
#mk61-unpacker-auto-init .register-name{color:var(--muted-foreground)}
#mk61-unpacker-auto-init .register.changed{background:color-mix(in srgb,var(--viz-series-1) 16%,transparent)}
@container(max-width:850px){#mk61-unpacker-auto-init .memory{grid-template-columns:repeat(7,minmax(0,1fr))}#mk61-unpacker-auto-init .registers{grid-template-columns:repeat(3,minmax(0,1fr))}}
@container(max-width:620px){#mk61-unpacker-auto-init .memory{grid-template-columns:repeat(5,minmax(0,1fr))}#mk61-unpacker-auto-init .ms{grid-template-columns:repeat(2,minmax(0,1fr))}#mk61-unpacker-auto-init .registers{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container(max-width:400px){#mk61-unpacker-auto-init .memory{grid-template-columns:repeat(3,minmax(0,1fr))}}
@container(max-width:340px){#mk61-unpacker-auto-init .ms,#mk61-unpacker-auto-init .registers{grid-template-columns:1fr}}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&amp;quot;application/json&amp;quot; id=&amp;quot;mk61-unpacker-auto-init-trace&amp;quot;&amp;gt;
{&amp;quot;variant&amp;quot;:&amp;quot;psycho-auto-init-79-run8&amp;quot;,&amp;quot;memories&amp;quot;:[&amp;quot;540000008000008a01054b094c008b6c010010bc6c5401114c5737008b06054a07004b5186404e5129008b0000000000008a6850006950000010000010400000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&amp;quot;,&amp;quot;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&amp;quot;,&amp;quot;546050006150008a6150006250008b625000635000546350006450008b645000655000516550006650008b6650006750008a6750006850000068500069500000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&amp;quot;],&amp;quot;ms&amp;quot;:[&amp;quot;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&amp;quot;,&amp;quot;540000008000008a01054b094c008b6c010010bc6c5401114c5737008b06054a07004b5186404e5129008b0000000000008a68500069500000100000104000&amp;quot;,&amp;quot;540000000000008a0000001110008b000000121000540000001310008b000000141000510000001510008b0000001610008a00000017100000000000181000&amp;quot;,&amp;quot;546050006150008a6150006250008b625000635000546350006450008b645000655000516550006650008b6650006750008a67500068500000685000695000&amp;quot;],&amp;quot;frames&amp;quot;:[[8,0,0,0],[9,0,0,0],[10,0,0,0],[11,0,0,1],[12,0,0,1],[13,0,0,2],[14,0,0,2],[15,0,0,3],[16,0,0,3],[17,0,0,3],[18,0,0,3],[19,0,0,3],[20,0,0,4],[21,0,0,4],[22,0,0,4],[23,0,0,4],[24,0,0,4],[25,0,0,5],[27,0,0,5],[28,0,0,5],[15,0,0,5],[16,0,0,5],[17,0,0,5],[18,0,0,5],[19,0,0,5],[20,0,0,6],[21,0,0,6],[22,0,0,6],[23,0,0,6],[24,0,0,6],[25,0,0,7],[27,0,0,7],[28,0,0,7],[15,0,0,7],[16,0,0,7],[17,0,0,7],[18,0,0,7],[19,0,0,7],[20,0,0,8],[21,0,0,8],[22,0,0,8],[23,0,0,8],[24,0,0,8],[25,0,0,9],[27,0,0,9],[28,0,0,9],[15,0,0,9],[16,0,0,9],[17,0,0,9],[18,0,0,9],[19,0,0,9],[20,0,0,10],[21,0,0,10],[22,0,0,10],[23,0,0,10],[24,0,0,10],[25,0,0,11],[27,0,0,11],[28,0,0,11],[15,0,0,11],[16,0,0,11],[17,0,0,11],[18,0,0,11],[19,0,0,11],[20,0,0,12],[21,0,0,12],[22,0,0,12],[23,0,0,12],[24,0,0,12],[25,0,0,13],[27,0,0,13],[28,0,0,13],[15,0,0,13],[16,0,0,13],[17,0,0,13],[18,0,0,13],[19,0,0,13],[20,0,0,14],[21,0,0,14],[22,0,0,14],[23,0,0,14],[24,0,0,14],[25,0,0,15],[27,0,0,15],[28,0,0,15],[15,0,0,15],[16,0,0,15],[17,0,0,15],[18,0,0,15],[19,0,0,15],[20,0,0,16],[21,0,0,16],[22,0,0,16],[23,0,0,16],[24,0,0,16],[25,0,0,17],[27,0,0,17],[28,0,0,17],[15,0,0,17],[16,0,0,17],[17,0,0,17],[18,0,0,17],[19,0,0,17],[20,0,0,18],[21,0,0,18],[22,0,0,18],[23,0,0,18],[24,0,0,18],[25,0,0,19],[27,0,0,19],[28,0,0,19],[15,0,0,19],[16,0,0,19],[17,0,0,19],[18,0,0,19],[19,0,0,19],[20,0,0,20],[21,0,0,20],[22,0,0,20],[23,0,0,20],[24,0,0,20],[25,0,0,21],[37,0,0,21],[38,0,0,21],[39,0,0,21],[29,0,0,21],[30,0,0,21],[31,0,0,21],[32,0,0,22],[33,0,0,22],[34,0,0,22],[35,0,0,23],[86,0,0,23],[87,1,1,23],[88,1,2,24],[89,1,2,24],[90,1,2,25],[91,1,2,25],[92,1,2,25],[93,1,2,26],[94,1,2,26],[95,1,2,27],[96,1,2,27],[97,1,2,27],[91,1,2,28],[92,1,2,28],[93,1,2,29],[94,1,2,29],[95,1,2,30],[96,1,2,30],[97,1,2,30],[91,1,2,31],[92,1,2,31],[93,1,2,32],[94,1,2,32],[95,1,2,33],[96,1,2,33],[97,1,2,33],[91,1,2,34],[92,1,2,34],[93,1,2,35],[94,1,2,35],[95,1,2,36],[96,1,2,36],[97,1,2,36],[91,1,2,37],[92,1,2,37],[93,1,2,38],[94,1,2,38],[95,1,2,39],[96,1,2,39],[97,1,2,39],[91,1,2,40],[92,1,2,40],[93,1,2,41],[94,1,2,41],[95,1,2,42],[96,1,2,42],[97,1,2,42],[91,1,2,43],[92,1,2,43],[93,1,2,44],[94,1,2,44],[95,1,2,45],[96,1,2,45],[97,1,2,45],[91,1,2,46],[92,1,2,46],[93,1,2,47],[94,1,2,47],[95,1,2,48],[96,1,2,48],[97,1,2,48],[99,1,2,48],[100,1,2,49],[101,1,3,50],[102,2,0,50],[103,2,0,50],[104,2,0,51],[0,2,0,51],[1,2,0,51],[2,2,0,51],[null,2,0,51]],&amp;quot;registers&amp;quot;:[[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 9.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 9.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000009  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 8.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000008  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 7.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000007  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 6.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000006  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 5.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000005  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 4.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000004  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 3.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000003  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 2.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000002  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 1.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 0.0000015  07&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 8.0000000  00&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 8.0000000  00&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 8.0000000  00&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 8.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 8.0000000  00&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000008  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000007  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000008  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000007  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 7.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000007  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000007  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000006  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000007  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000006  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 6.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000006  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000006  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000005  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000006  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000005  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot;-5.14E4086  02&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 5.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000005  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000005  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000004  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000005  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000004  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 0.74-0506 - 6&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 4.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000004  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000004  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000003  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000004  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000003  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot;-5.74C1101  03&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 3.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000003  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000003  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000002  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000003  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000002  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot;-1.000016C - 5&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 2.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000002  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot; 6.3005062  05&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000002  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000001  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot; 6.3005062  05&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000002  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000001  07&amp;quot;,&amp;quot;-0.94L0501  04&amp;quot;,&amp;quot; 6.3005062  05&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 1.0000000  00&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 6.2005061  05&amp;quot;,&amp;quot; 6.3005062  05&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 6.1005060  05&amp;quot;,&amp;quot; 6.2005061  05&amp;quot;,&amp;quot; 6.3005062  05&amp;quot;,&amp;quot; 6.4005063  05&amp;quot;,&amp;quot; 6.5005064  05&amp;quot;,&amp;quot; 6.6005065  05&amp;quot;,&amp;quot; 6.7005066  05&amp;quot;,&amp;quot; 6.8005067  05&amp;quot;,&amp;quot; 6.9005068  05&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 1.0000010  04&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;],[&amp;quot; 0.0000000  00&amp;quot;,&amp;quot; 1.1000000  01&amp;quot;,&amp;quot; 1.2000000  01&amp;quot;,&amp;quot; 1.3000000  01&amp;quot;,&amp;quot; 1.4000000  01&amp;quot;,&amp;quot; 1.5000000  01&amp;quot;,&amp;quot; 1.6000000  01&amp;quot;,&amp;quot; 1.7000000  01&amp;quot;,&amp;quot; 1.8000000  01&amp;quot;,&amp;quot; 1.9000000  01&amp;quot;,&amp;quot; 6.5000000  01&amp;quot;,&amp;quot; 7.0000000  01&amp;quot;,&amp;quot; 0.0000001  07&amp;quot;,&amp;quot; 5.0000000  00&amp;quot;,&amp;quot; 0.0000000  00&amp;quot;]]}
&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
(() =&amp;gt; {
  const root = document.getElementById(&#039;mk61-unpacker-auto-init&#039;);
  const data = JSON.parse(document.getElementById(&#039;mk61-unpacker-auto-init-trace&#039;).textContent);
  const bytes = text =&amp;gt; text.match(/../g).map(byte =&amp;gt; parseInt(byte, 16));
  const memories = data.memories.map(bytes);
  const msStates = data.ms.map(bytes);
  function formatRegister(display) {
    const decimal = display.match(/^([ -])([0-9]\.[0-9]{7}) ([ -])([0-9]{2})$/);
    if(decimal) {
      const number = Number((decimal[1] === &#039;-&#039; ? &#039;-&#039; : &#039;&#039;) + decimal[2] + &#039;e&#039; +
        (decimal[3] === &#039;-&#039; ? &#039;-&#039; : &#039;+&#039;) + decimal[4]);
      return number.toLocaleString(&#039;ru-RU&#039;, {useGrouping: false, maximumSignificantDigits: 8});
    }
    // Packed command bytes can temporarily form nondecimal mantissas.
    // Preserve the calculator&#039;s actual display symbols in those registers.
    return display.trim().replace(/ +/g, &#039; &#039;);
  }
  const registerStates = data.registers.map(values =&amp;gt; values.map(formatRegister));
  const hex = byte =&amp;gt; byte.toString(16).toUpperCase().padStart(2, &#039;0&#039;);
  const names = {
    0x10: &#039;+&#039;, 0x11: &#039;−&#039;, 0x14: &#039;X↔Y&#039;, 0x50: &#039;С/П&#039;, 0x51: &#039;БП&#039;,
    0x52: &#039;В/О&#039;, 0x54: &#039;НОП&#039;, 0x55: &#039;К ПВ&#039;, 0x56: &#039;К ОД&#039;,
    0x57: &#039;x≠0&#039;, 0x59: &#039;x≥0&#039;, 0x5D: &#039;L0&#039;, 0xBC: &#039;Кx→ПC&#039;
  };
  const addressCommands = new Set([0x51, 0x53, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E]);
  function command(byte, address, memory, pc) {
    if(address &amp;gt; 0 &amp;amp;&amp;amp; address !== pc &amp;amp;&amp;amp; addressCommands.has(memory[address - 1])) {
      return &#039;→&#039; + ((byte &amp;gt;&amp;gt; 4) * 10 + (byte &amp;amp; 15));
    }
    if(byte &amp;lt;= 9) return String(byte);
    if(byte &amp;gt;= 0x40 &amp;amp;&amp;amp; byte &amp;lt;= 0x4E) return &#039;x→П&#039; + hex(byte).slice(1);
    if(byte &amp;gt;= 0x60 &amp;amp;&amp;amp; byte &amp;lt;= 0x6E) return &#039;П→x&#039; + hex(byte).slice(1);
    if(byte &amp;gt;= 0x80 &amp;amp;&amp;amp; byte &amp;lt;= 0x8E) return &#039;КБП&#039; + hex(byte).slice(1);
    return names[byte] || &#039;·&#039;;
  }
  let index = 0;
  const back = root.querySelector(&#039;[data-back]&#039;);
  const next = root.querySelector(&#039;[data-next]&#039;);
  const status = root.querySelector(&#039;[data-status]&#039;);
  const program = root.querySelector(&#039;[data-program]&#039;);
  const ms = root.querySelector(&#039;[data-ms]&#039;);
  const registers = root.querySelector(&#039;[data-registers]&#039;);
  function render() {
    const [pc, memoryIndex, msIndex, registerIndex] = data.frames[index];
    const previous = data.frames[Math.max(0, index - 1)];
    const memory = memories[memoryIndex], oldMemory = memories[previous[1]];
    const currentMs = msStates[msIndex], oldMs = msStates[previous[2]];
    const registerValues = registerStates[registerIndex], oldRegisters = registerStates[previous[3]];
    status.textContent = index + &#039; / &#039; + (data.frames.length - 1);
    back.disabled = index === 0;
    next.disabled = index === data.frames.length - 1;
    program.innerHTML = memory.map((byte, address) =&amp;gt; {
      const mnemonic = command(byte, address, memory, pc);
      const pending = address &amp;lt; 63 &amp;amp;&amp;amp; byte === 0 &amp;amp;&amp;amp; address !== pc;
      const classes = [&#039;cell&#039;];
      if(address &amp;lt; 63) classes.push(&#039;target&#039;);
      if(pending) classes.push(&#039;pending&#039;);
      if(byte !== oldMemory[address]) classes.push(&#039;changed&#039;);
      if(address === pc) classes.push(&#039;current&#039;);
      const label = &#039;Адрес &#039; + String(address).padStart(2, &#039;0&#039;) + &#039;, &#039; + hex(byte) + &#039; &#039; + mnemonic;
      return &#039;&amp;lt;div role=&amp;quot;listitem&amp;quot; class=&amp;quot;&#039; + classes.join(&#039; &#039;) + &#039;&amp;quot; data-address=&amp;quot;&#039; + address +
        &#039;&amp;quot; data-byte=&amp;quot;&#039; + hex(byte) + &#039;&amp;quot; title=&amp;quot;&#039; + label + &#039;&amp;quot; aria-label=&amp;quot;&#039; + label +
        &#039;&amp;quot;&#039; + (address === pc ? &#039; aria-current=&amp;quot;step&amp;quot;&#039; : &#039;&#039;) + &#039;&amp;gt;&amp;lt;code&amp;gt;&#039; + hex(byte) + &#039;&amp;lt;/code&amp;gt;&#039; +
        (pending ? &#039;&#039; : mnemonic) + &#039;&amp;lt;/div&amp;gt;&#039;;
    }).join(&#039;&#039;);
    ms.innerHTML = Array.from({length: 9}, (_, block) =&amp;gt; {
      const start = block * 7;
      const word = currentMs.slice(start, start + 7);
      const changed = word.some((byte, offset) =&amp;gt; byte !== oldMs[start + offset]);
      const label = &#039;Блок Ms &#039; + block + &#039;: &#039; + word.map(hex).join(&#039; &#039;);
      return &#039;&amp;lt;div role=&amp;quot;listitem&amp;quot; class=&amp;quot;block&#039; + (changed ? &#039; changed&#039; : &#039;&#039;) + &#039;&amp;quot; data-block=&amp;quot;&#039; +
        block + &#039;&amp;quot; data-bytes=&amp;quot;&#039; + word.map(hex).join(&#039;&#039;) + &#039;&amp;quot; title=&amp;quot;&#039; + label +
        &#039;&amp;quot; aria-label=&amp;quot;&#039; + label + &#039;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;service&amp;quot;&amp;gt;&#039; + hex(word[0]) + &#039;&amp;lt;/span&amp;gt; &#039; +
        word.slice(1).map(hex).join(&#039; &#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;
    }).join(&#039;&#039;);
    registers.innerHTML = registerValues.map((value, register) =&amp;gt; {
      const name = &#039;R&#039; + register.toString(16).toUpperCase();
      const changed = value !== oldRegisters[register];
      const label = name + &#039; = &#039; + value;
      return &#039;&amp;lt;div role=&amp;quot;listitem&amp;quot; class=&amp;quot;register&#039; + (changed ? &#039; changed&#039; : &#039;&#039;) +
        &#039;&amp;quot; data-register=&amp;quot;&#039; + register + &#039;&amp;quot; data-display=&amp;quot;&#039; + data.registers[registerIndex][register] +
        &#039;&amp;quot; title=&amp;quot;&#039; + label + &#039;&amp;quot; aria-label=&amp;quot;&#039; + label + &#039;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;register-name&amp;quot;&amp;gt;&#039; +
        name + &#039;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;register-value&amp;quot;&amp;gt;&#039; + value + &#039;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&#039;;
    }).join(&#039;&#039;);
  }
  function move(delta) {
    const target = Math.max(0, Math.min(data.frames.length - 1, index + delta));
    if(target === index) return;
    index = target;
    render();
    if(window.openai?.setWidgetState) window.openai.setWidgetState({
      modelContent: {variant: data.variant, step: index, nextAddress: data.frames[index][0]},
      privateContent: {variant: data.variant, step: index}
    }).catch(() =&amp;gt; {});
  }
  back.addEventListener(&#039;click&#039;, () =&amp;gt; move(-1));
  next.addEventListener(&#039;click&#039;, () =&amp;gt; move(1));
  root.addEventListener(&#039;keydown&#039;, event =&amp;gt; {
    if(event.key !== &#039;ArrowLeft&#039; &amp;amp;&amp;amp; event.key !== &#039;ArrowRight&#039;) return;
    event.preventDefault();
    move(event.key === &#039;ArrowLeft&#039; ? -1 : 1);
  });
  function restore(state) {
    const saved = state?.privateContent;
    if(saved?.variant !== data.variant || !Number.isInteger(saved.step)) return;
    index = Math.max(0, Math.min(data.frames.length - 1, saved.step));
    render();
  }
  render();
  restore(window.openai?.widgetState);
  window.addEventListener(&#039;openai:set_globals&#039;, event =&amp;gt; restore(event.detail?.globals?.widgetState));
})();
&amp;lt;/script&amp;gt;&quot;&gt;
&lt;div id=&quot;mk61-unpacker-auto-init&quot;&gt;
  &lt;div class=&quot;viz-controls&quot;&gt;
    &lt;button class=&quot;btn&quot; type=&quot;button&quot; data-back aria-label=&quot;Предыдущая команда&quot;&gt;←&lt;/button&gt;
    &lt;button class=&quot;btn&quot; type=&quot;button&quot; data-next aria-label=&quot;Следующая команда&quot;&gt;→&lt;/button&gt;
    &lt;span class=&quot;text-small tabular-nums&quot; data-status aria-live=&quot;polite&quot;&gt;&lt;/span&gt;
  &lt;/div&gt;
  &lt;div data-program class=&quot;memory&quot; role=&quot;list&quot; aria-label=&quot;Программная память: ячейки 00–104&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;ms-label&quot;&gt;Ms&lt;/div&gt;
  &lt;div data-ms class=&quot;ms&quot; role=&quot;list&quot; aria-label=&quot;Девять блоков Ms по семь байтов&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;ms-label&quot;&gt;Регистры&lt;/div&gt;
  &lt;div data-registers class=&quot;registers&quot; role=&quot;list&quot; aria-label=&quot;Регистры R0–RE&quot;&gt;&lt;/div&gt;
  &lt;noscript&gt;Для пошагового просмотра нужен JavaScript.&lt;/noscript&gt;
&lt;/div&gt;

&lt;script type=&quot;application/json&quot; id=&quot;mk61-unpacker-auto-init-trace&quot;&gt;
{&quot;variant&quot;:&quot;psycho-auto-init-79-run8&quot;,&quot;memories&quot;:[&quot;540000008000008a01054b094c008b6c010010bc6c5401114c5737008b06054a07004b5186404e5129008b0000000000008a6850006950000010000010400000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&quot;,&quot;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&quot;,&quot;546050006150008a6150006250008b625000635000546350006450008b645000655000516550006650008b6650006750008a6750006850000068500069500000006e01104e506d01114d506e031159830300500200505655684d67604c14bc6d115d91405556054d52&quot;],&quot;ms&quot;:[&quot;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&quot;,&quot;540000008000008a01054b094c008b6c010010bc6c5401114c5737008b06054a07004b5186404e5129008b0000000000008a68500069500000100000104000&quot;,&quot;540000000000008a0000001110008b000000121000540000001310008b000000141000510000001510008b0000001610008a00000017100000000000181000&quot;,&quot;546050006150008a6150006250008b625000635000546350006450008b645000655000516550006650008b6650006750008a67500068500000685000695000&quot;],&quot;frames&quot;:[[8,0,0,0],[9,0,0,0],[10,0,0,0],[11,0,0,1],[12,0,0,1],[13,0,0,2],[14,0,0,2],[15,0,0,3],[16,0,0,3],[17,0,0,3],[18,0,0,3],[19,0,0,3],[20,0,0,4],[21,0,0,4],[22,0,0,4],[23,0,0,4],[24,0,0,4],[25,0,0,5],[27,0,0,5],[28,0,0,5],[15,0,0,5],[16,0,0,5],[17,0,0,5],[18,0,0,5],[19,0,0,5],[20,0,0,6],[21,0,0,6],[22,0,0,6],[23,0,0,6],[24,0,0,6],[25,0,0,7],[27,0,0,7],[28,0,0,7],[15,0,0,7],[16,0,0,7],[17,0,0,7],[18,0,0,7],[19,0,0,7],[20,0,0,8],[21,0,0,8],[22,0,0,8],[23,0,0,8],[24,0,0,8],[25,0,0,9],[27,0,0,9],[28,0,0,9],[15,0,0,9],[16,0,0,9],[17,0,0,9],[18,0,0,9],[19,0,0,9],[20,0,0,10],[21,0,0,10],[22,0,0,10],[23,0,0,10],[24,0,0,10],[25,0,0,11],[27,0,0,11],[28,0,0,11],[15,0,0,11],[16,0,0,11],[17,0,0,11],[18,0,0,11],[19,0,0,11],[20,0,0,12],[21,0,0,12],[22,0,0,12],[23,0,0,12],[24,0,0,12],[25,0,0,13],[27,0,0,13],[28,0,0,13],[15,0,0,13],[16,0,0,13],[17,0,0,13],[18,0,0,13],[19,0,0,13],[20,0,0,14],[21,0,0,14],[22,0,0,14],[23,0,0,14],[24,0,0,14],[25,0,0,15],[27,0,0,15],[28,0,0,15],[15,0,0,15],[16,0,0,15],[17,0,0,15],[18,0,0,15],[19,0,0,15],[20,0,0,16],[21,0,0,16],[22,0,0,16],[23,0,0,16],[24,0,0,16],[25,0,0,17],[27,0,0,17],[28,0,0,17],[15,0,0,17],[16,0,0,17],[17,0,0,17],[18,0,0,17],[19,0,0,17],[20,0,0,18],[21,0,0,18],[22,0,0,18],[23,0,0,18],[24,0,0,18],[25,0,0,19],[27,0,0,19],[28,0,0,19],[15,0,0,19],[16,0,0,19],[17,0,0,19],[18,0,0,19],[19,0,0,19],[20,0,0,20],[21,0,0,20],[22,0,0,20],[23,0,0,20],[24,0,0,20],[25,0,0,21],[37,0,0,21],[38,0,0,21],[39,0,0,21],[29,0,0,21],[30,0,0,21],[31,0,0,21],[32,0,0,22],[33,0,0,22],[34,0,0,22],[35,0,0,23],[86,0,0,23],[87,1,1,23],[88,1,2,24],[89,1,2,24],[90,1,2,25],[91,1,2,25],[92,1,2,25],[93,1,2,26],[94,1,2,26],[95,1,2,27],[96,1,2,27],[97,1,2,27],[91,1,2,28],[92,1,2,28],[93,1,2,29],[94,1,2,29],[95,1,2,30],[96,1,2,30],[97,1,2,30],[91,1,2,31],[92,1,2,31],[93,1,2,32],[94,1,2,32],[95,1,2,33],[96,1,2,33],[97,1,2,33],[91,1,2,34],[92,1,2,34],[93,1,2,35],[94,1,2,35],[95,1,2,36],[96,1,2,36],[97,1,2,36],[91,1,2,37],[92,1,2,37],[93,1,2,38],[94,1,2,38],[95,1,2,39],[96,1,2,39],[97,1,2,39],[91,1,2,40],[92,1,2,40],[93,1,2,41],[94,1,2,41],[95,1,2,42],[96,1,2,42],[97,1,2,42],[91,1,2,43],[92,1,2,43],[93,1,2,44],[94,1,2,44],[95,1,2,45],[96,1,2,45],[97,1,2,45],[91,1,2,46],[92,1,2,46],[93,1,2,47],[94,1,2,47],[95,1,2,48],[96,1,2,48],[97,1,2,48],[99,1,2,48],[100,1,2,49],[101,1,3,50],[102,2,0,50],[103,2,0,50],[104,2,0,51],[0,2,0,51],[1,2,0,51],[2,2,0,51],[null,2,0,51]],&quot;registers&quot;:[[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.5000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.5000000  01&quot;,&quot; 9.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 9.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000009  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 8.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000008  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 7.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000007  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 6.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000006  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 5.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000005  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 4.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000004  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 3.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000003  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 2.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000002  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 1.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000001  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 0.0000015  07&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 8.0000000  00&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 1.0000010  04&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;,&quot; 0.0000000  00&quot;],[&quot; 8.0000000  00&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 1.0000010  04&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 8.0000000  00&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 1.0000010  04&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 8.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 8.0000000  00&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000008  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000007  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000008  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000007  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.9005068  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 7.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000007  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000007  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000006  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000007  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000006  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 0.0000000  00&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 6.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000006  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000006  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000005  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000006  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000005  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot;-5.14E4086  02&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 5.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000005  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000005  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000004  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000005  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000004  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 0.74-0506 - 6&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 4.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000004  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000004  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000003  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000004  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000003  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot;-5.74C1101  03&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 3.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000003  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000003  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000002  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000003  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000002  07&quot;,&quot;-0.94L0501  04&quot;,&quot;-1.000016C - 5&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 2.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000002  07&quot;,&quot;-0.94L0501  04&quot;,&quot; 6.3005062  05&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000002  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000001  07&quot;,&quot;-0.94L0501  04&quot;,&quot; 6.3005062  05&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000002  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000001  07&quot;,&quot;-0.94L0501  04&quot;,&quot; 6.3005062  05&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 1.0000000  00&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000001  07&quot;,&quot; 6.2005061  05&quot;,&quot; 6.3005062  05&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000001  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 6.1005060  05&quot;,&quot; 6.2005061  05&quot;,&quot; 6.3005062  05&quot;,&quot; 6.4005063  05&quot;,&quot; 6.5005064  05&quot;,&quot; 6.6005065  05&quot;,&quot; 6.7005066  05&quot;,&quot; 6.8005067  05&quot;,&quot; 6.9005068  05&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000001  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000001  07&quot;,&quot; 1.0000010  04&quot;,&quot; 0.0000000  00&quot;],[&quot; 0.0000000  00&quot;,&quot; 1.1000000  01&quot;,&quot; 1.2000000  01&quot;,&quot; 1.3000000  01&quot;,&quot; 1.4000000  01&quot;,&quot; 1.5000000  01&quot;,&quot; 1.6000000  01&quot;,&quot; 1.7000000  01&quot;,&quot; 1.8000000  01&quot;,&quot; 1.9000000  01&quot;,&quot; 6.5000000  01&quot;,&quot; 7.0000000  01&quot;,&quot; 0.0000001  07&quot;,&quot; 5.0000000  00&quot;,&quot; 0.0000000  00&quot;]]}
&lt;/script&gt;
&lt;script&gt;
(() =&gt; {
  const root = document.getElementById(&#039;mk61-unpacker-auto-init&#039;);
  const data = JSON.parse(document.getElementById(&#039;mk61-unpacker-auto-init-trace&#039;).textContent);
  const bytes = text =&gt; text.match(/../g).map(byte =&gt; parseInt(byte, 16));
  const memories = data.memories.map(bytes);
  const msStates = data.ms.map(bytes);
  function formatRegister(display) {
    const decimal = display.match(/^([ -])([0-9]\.[0-9]{7}) ([ -])([0-9]{2})$/);
    if(decimal) {
      const number = Number((decimal[1] === &#039;-&#039; ? &#039;-&#039; : &#039;&#039;) + decimal[2] + &#039;e&#039; +
        (decimal[3] === &#039;-&#039; ? &#039;-&#039; : &#039;+&#039;) + decimal[4]);
      return number.toLocaleString(&#039;ru-RU&#039;, {useGrouping: false, maximumSignificantDigits: 8});
    }
    // Packed command bytes can temporarily form nondecimal mantissas.
    // Preserve the calculator&#039;s actual display symbols in those registers.
    return display.trim().replace(/ +/g, &#039; &#039;);
  }
  const registerStates = data.registers.map(values =&gt; values.map(formatRegister));
  const hex = byte =&gt; byte.toString(16).toUpperCase().padStart(2, &#039;0&#039;);
  const names = {
    0x10: &#039;+&#039;, 0x11: &#039;−&#039;, 0x14: &#039;X↔Y&#039;, 0x50: &#039;С/П&#039;, 0x51: &#039;БП&#039;,
    0x52: &#039;В/О&#039;, 0x54: &#039;НОП&#039;, 0x55: &#039;К ПВ&#039;, 0x56: &#039;К ОД&#039;,
    0x57: &#039;x≠0&#039;, 0x59: &#039;x≥0&#039;, 0x5D: &#039;L0&#039;, 0xBC: &#039;Кx→ПC&#039;
  };
  const addressCommands = new Set([0x51, 0x53, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E]);
  function command(byte, address, memory, pc) {
    if(address &gt; 0 &amp;&amp; address !== pc &amp;&amp; addressCommands.has(memory[address - 1])) {
      return &#039;→&#039; + ((byte &gt;&gt; 4) * 10 + (byte &amp; 15));
    }
    if(byte &lt;= 9) return String(byte);
    if(byte &gt;= 0x40 &amp;&amp; byte &lt;= 0x4E) return &#039;x→П&#039; + hex(byte).slice(1);
    if(byte &gt;= 0x60 &amp;&amp; byte &lt;= 0x6E) return &#039;П→x&#039; + hex(byte).slice(1);
    if(byte &gt;= 0x80 &amp;&amp; byte &lt;= 0x8E) return &#039;КБП&#039; + hex(byte).slice(1);
    return names[byte] || &#039;·&#039;;
  }
  let index = 0;
  const back = root.querySelector(&#039;[data-back]&#039;);
  const next = root.querySelector(&#039;[data-next]&#039;);
  const status = root.querySelector(&#039;[data-status]&#039;);
  const program = root.querySelector(&#039;[data-program]&#039;);
  const ms = root.querySelector(&#039;[data-ms]&#039;);
  const registers = root.querySelector(&#039;[data-registers]&#039;);
  function render() {
    const [pc, memoryIndex, msIndex, registerIndex] = data.frames[index];
    const previous = data.frames[Math.max(0, index - 1)];
    const memory = memories[memoryIndex], oldMemory = memories[previous[1]];
    const currentMs = msStates[msIndex], oldMs = msStates[previous[2]];
    const registerValues = registerStates[registerIndex], oldRegisters = registerStates[previous[3]];
    status.textContent = index + &#039; / &#039; + (data.frames.length - 1);
    back.disabled = index === 0;
    next.disabled = index === data.frames.length - 1;
    program.innerHTML = memory.map((byte, address) =&gt; {
      const mnemonic = command(byte, address, memory, pc);
      const pending = address &lt; 63 &amp;&amp; byte === 0 &amp;&amp; address !== pc;
      const classes = [&#039;cell&#039;];
      if(address &lt; 63) classes.push(&#039;target&#039;);
      if(pending) classes.push(&#039;pending&#039;);
      if(byte !== oldMemory[address]) classes.push(&#039;changed&#039;);
      if(address === pc) classes.push(&#039;current&#039;);
      const label = &#039;Адрес &#039; + String(address).padStart(2, &#039;0&#039;) + &#039;, &#039; + hex(byte) + &#039; &#039; + mnemonic;
      return &#039;&lt;div role=&quot;listitem&quot; class=&quot;&#039; + classes.join(&#039; &#039;) + &#039;&quot; data-address=&quot;&#039; + address +
        &#039;&quot; data-byte=&quot;&#039; + hex(byte) + &#039;&quot; title=&quot;&#039; + label + &#039;&quot; aria-label=&quot;&#039; + label +
        &#039;&quot;&#039; + (address === pc ? &#039; aria-current=&quot;step&quot;&#039; : &#039;&#039;) + &#039;&gt;&lt;code&gt;&#039; + hex(byte) + &#039;&lt;/code&gt;&#039; +
        (pending ? &#039;&#039; : mnemonic) + &#039;&lt;/div&gt;&#039;;
    }).join(&#039;&#039;);
    ms.innerHTML = Array.from({length: 9}, (_, block) =&gt; {
      const start = block * 7;
      const word = currentMs.slice(start, start + 7);
      const changed = word.some((byte, offset) =&gt; byte !== oldMs[start + offset]);
      const label = &#039;Блок Ms &#039; + block + &#039;: &#039; + word.map(hex).join(&#039; &#039;);
      return &#039;&lt;div role=&quot;listitem&quot; class=&quot;block&#039; + (changed ? &#039; changed&#039; : &#039;&#039;) + &#039;&quot; data-block=&quot;&#039; +
        block + &#039;&quot; data-bytes=&quot;&#039; + word.map(hex).join(&#039;&#039;) + &#039;&quot; title=&quot;&#039; + label +
        &#039;&quot; aria-label=&quot;&#039; + label + &#039;&quot;&gt;&lt;span class=&quot;service&quot;&gt;&#039; + hex(word[0]) + &#039;&lt;/span&gt; &#039; +
        word.slice(1).map(hex).join(&#039; &#039;) + &#039;&lt;/div&gt;&#039;;
    }).join(&#039;&#039;);
    registers.innerHTML = registerValues.map((value, register) =&gt; {
      const name = &#039;R&#039; + register.toString(16).toUpperCase();
      const changed = value !== oldRegisters[register];
      const label = name + &#039; = &#039; + value;
      return &#039;&lt;div role=&quot;listitem&quot; class=&quot;register&#039; + (changed ? &#039; changed&#039; : &#039;&#039;) +
        &#039;&quot; data-register=&quot;&#039; + register + &#039;&quot; data-display=&quot;&#039; + data.registers[registerIndex][register] +
        &#039;&quot; title=&quot;&#039; + label + &#039;&quot; aria-label=&quot;&#039; + label + &#039;&quot;&gt;&lt;span class=&quot;register-name&quot;&gt;&#039; +
        name + &#039;&lt;/span&gt;&lt;span class=&quot;register-value&quot;&gt;&#039; + value + &#039;&lt;/span&gt;&lt;/div&gt;&#039;;
    }).join(&#039;&#039;);
  }
  function move(delta) {
    const target = Math.max(0, Math.min(data.frames.length - 1, index + delta));
    if(target === index) return;
    index = target;
    render();
    if(window.openai?.setWidgetState) window.openai.setWidgetState({
      modelContent: {variant: data.variant, step: index, nextAddress: data.frames[index][0]},
      privateContent: {variant: data.variant, step: index}
    }).catch(() =&gt; {});
  }
  back.addEventListener(&#039;click&#039;, () =&gt; move(-1));
  next.addEventListener(&#039;click&#039;, () =&gt; move(1));
  root.addEventListener(&#039;keydown&#039;, event =&gt; {
    if(event.key !== &#039;ArrowLeft&#039; &amp;&amp; event.key !== &#039;ArrowRight&#039;) return;
    event.preventDefault();
    move(event.key === &#039;ArrowLeft&#039; ? -1 : 1);
  });
  function restore(state) {
    const saved = state?.privateContent;
    if(saved?.variant !== data.variant || !Number.isInteger(saved.step)) return;
    index = Math.max(0, Math.min(data.frames.length - 1, saved.step));
    render();
  }
  render();
  restore(window.openai?.widgetState);
  window.addEventListener(&#039;openai:set_globals&#039;, event =&gt; restore(event.detail?.globals?.widgetState));
})();
&lt;/script&gt;&lt;/div&gt;&lt;p class=&quot;&quot;&gt;&lt;br&gt;Осталась одна нерешённая проблема: используется 63 байта &lt;tt style=&quot;text-wrap-mode: initial;&quot;&gt;Ms&lt;/tt&gt;, доступных в&amp;nbsp;«&lt;i style=&quot;text-wrap-mode: initial;&quot;&gt;MK-61s&lt;/i&gt;», тогда как в&amp;nbsp;исходном калькуляторе эта область рассчитана на &lt;a href=&quot;https://bolknote.ru/mk-61s-oblast-pamati-ms&quot; style=&quot;text-wrap-mode: initial;&quot;&gt;56 байт&lt;/a&gt;. Нынешнему распаковщику нужны девять блоков этой памяти, а&amp;nbsp;в&amp;nbsp;исходном калькуляторе их восемь. Поэтому для работы в&amp;nbsp;таком гипотетическом «МК-61»&amp;nbsp;программу ещё придётся доделать.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-samoraspakovka-v-105-acejkah</guid>
				<pubDate>Wed, 07 Oct 2026 17:35:20 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-samoraspakovka-v-105-acejkah#comment</comments>
			</item>
			<item>
				<title>Движок сайта: боты</title>
				<link>https://bolknote.ru/all/registr-boty</link>
				<description>&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.06@2x.png&quot; alt=&quot;График показывает загрузку CPU, достигшую пика в 138% около 01.10, с общим средним значением 19.26%.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;70&quot; data-post-media-identity=&quot;1&quot; width=&quot;1000&quot; height=&quot;529&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Очередной бот нашёл кое-какие урлы, в&amp;nbsp;которые ему не надо. Наверное надо даже спасибо сказать ботам за нагрузочное тестирование сайта&lt;/div&gt;&lt;/div&gt;&lt;p&gt;В&amp;nbsp;«Регистре» (так называется мой новый движок для сайта), меня, помимо редактора, постоянно донимают боты поисковых систем, нейросетей и&amp;nbsp;так далее. Я даже не подозревал сколько их развелось и&amp;nbsp;с&amp;nbsp;какой страшной силой они молотят весь интернет. К&amp;nbsp;сожалению, некоторые из них игнорируют &lt;tt&gt;robots.txt&lt;/tt&gt;&amp;nbsp;и&amp;nbsp;заходят даже туда, куда просишь их не ходить.&lt;/p&gt;&lt;p&gt;Так как у&amp;nbsp;меня на сайте сменилась часть адресов из-за появления новых возможностей, боты тут&amp;nbsp;же побежали туда смотреть, что&amp;nbsp;же там появилось нового, создавая нагрузку на сайт. Честно сказать, не знаю, последуют&amp;nbsp;ли какие-то санкции от хостера, если ничего с&amp;nbsp;этим не делать, но проверять не хочется.&lt;/p&gt;&lt;p&gt;Поэтому я регулярно захожу в&amp;nbsp;панель администратора, чтобы посмотреть что у&amp;nbsp;меня с&amp;nbsp;нагрузкой и, если замечаю, что она в&amp;nbsp;красной зоне, выгружаю логи и&amp;nbsp;смотрю куда какой-нибудь очередной бот сунул свой любопытный нос. Решать проблему приходится по-разному&amp;nbsp;— оптимизацией запросов, кешированием, динамической генерацией ссылок или стандартными &lt;tt&gt;robots.txt&lt;/tt&gt; или &lt;tt&gt;nofollow&lt;/tt&gt;, если бот их слушается.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Кеш у&amp;nbsp;меня, кстати, сейчас устроен довольно сложно&amp;nbsp;— если доступен модуль &lt;tt&gt;APC&lt;/tt&gt;, либо есть &lt;tt&gt;/dev/shm&lt;/tt&gt;, то горячие пути кешируются туда, если недоступно, используется общий кеш на файловой системе.&amp;nbsp;Кеш без необходимости не сбрасывается, за этим я слежу отдельно. Инвалидация делается довольно топорно, надо&amp;nbsp;— сносим, примерно как было в&amp;nbsp;«Эгее», но, с&amp;nbsp;другой стороны, я не делаю высоконагруженный проект, чтобы с&amp;nbsp;этим отдельно заморачиваться.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA%20%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80/&quot;&gt;движок Регистр&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>движок Регистр</category>
				<guid isPermaLink="true">https://bolknote.ru/all/registr-boty</guid>
				<pubDate>Tue, 06 Oct 2026 09:13:19 GMT</pubDate>
				<comments>https://bolknote.ru/all/registr-boty#comment</comments>
			</item>
			<item>
				<title>Затычка в ванне</title>
				<link>https://bolknote.ru/all/zatycka-v-vanne</link>
				<description>&lt;p&gt;Минутка быта.&lt;/p&gt;&lt;p&gt;У&amp;nbsp;нас дома в&amp;nbsp;ванне Т-образная сливная пробка&amp;nbsp;— плоский диск, из центра которого выступает стержень. Несколько месяцев назад она стала интенсивно протекать. Я люблю с&amp;nbsp;утра в&amp;nbsp;тишине полежать в&amp;nbsp;ванне, мне это помогает проснуться. А&amp;nbsp;тут мало того, что тишины не получается&amp;nbsp;— очень хорошо слышно как через неё капает в&amp;nbsp;слив, так ещё и&amp;nbsp;вода уходит, всё время подливать приходится.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Поискал сначала отдельно сливную пробку, но там слишком много, побоялся ошибиться. Подумал, что может есть какие-то уплотнительные кольца, ведь очевидно, что дело не в&amp;nbsp;самой пробке, течёт через резиновое кольцо.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;На&amp;nbsp;«Озоне» нашёл «универсальную силиконовую уплотнительную манжету белую для сифона раковины и&amp;nbsp;ванны». Пришло четыре штуки. Разобрал сливную пробку, она элементарно развинчивается, надел два кольца на широкую часть, по обеим сторонам чёрной родной резинки, собрал и&amp;nbsp;протестировал&amp;nbsp;— набрал полную ванну и&amp;nbsp;оставил на день.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Не&amp;nbsp;ушло ни сантиметра! Тест считаю пройденным. Если у&amp;nbsp;вас та&amp;nbsp;же проблема, рекомендую сначала попробовать этот способ, прежде чем покупать новую сливную пробку.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.04@2x.webp&quot; alt=&quot;Два белых пластиковых затыка для ванны лежат рядом друг с другом на деревянной поверхности.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;69&quot; data-post-media-identity=&quot;1&quot; width=&quot;1000&quot; height=&quot;562&quot; loading=&quot;lazy&quot;&gt;&lt;/div&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/zatycka-v-vanne</guid>
				<pubDate>Sun, 04 Oct 2026 08:56:07 GMT</pubDate>
				<comments>https://bolknote.ru/all/zatycka-v-vanne#comment</comments>
			</item>
			<item>
				<title>Движок сайта: редактор</title>
				<link>https://bolknote.ru/all/dvizok-sajta-redaktor</link>
				<description>&lt;p class=&quot;&quot;&gt;Самым сложным в&amp;nbsp;собственном движке блога оказался, как ни странно, редактор. Я сразу нацелился на визуальное&amp;nbsp;редактирование, но с&amp;nbsp;нужными мне особенностями&amp;nbsp;— например, изображения автоматически сжимаются до оптимального формата и&amp;nbsp;описываются через нейросеть, чтобы потом легче было искать.&lt;/p&gt;
&lt;p class=&quot;&quot;&gt;Каждый день я дорабатываю движок, и&amp;nbsp;большинство коммитов касается именно редактора. Почти каждый день я пишу свои заметки на сайт и&amp;nbsp;почти каждый раз чем-нибудь недоволен и&amp;nbsp;что-то правлю в&amp;nbsp;редакторе. Он&amp;nbsp;стал настоящей головной болью.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Интересно, что похожие баги встречаются и&amp;nbsp;в&amp;nbsp;телеграмном редакторе, которым я недавно начал пользоваться для публикаций в&amp;nbsp;своём канале. Может они имманентно возникают при написании своего редактора с&amp;nbsp;нуля?&lt;/p&gt;&lt;p class=&quot;&quot;&gt;Как&amp;nbsp;бы то ни было, движок приобретает свои очертания. Только теперь они вырисовываются из опыта использования. Я был прав, когда решил начать им пользоваться на сайте, без этого ещё долго пришлось&amp;nbsp;бы вылавливать все ошибки и&amp;nbsp;неудобства.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA%20%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80/&quot;&gt;движок Регистр&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>движок Регистр</category>
				<guid isPermaLink="true">https://bolknote.ru/all/dvizok-sajta-redaktor</guid>
				<pubDate>Sat, 03 Oct 2026 19:11:59 GMT</pubDate>
				<comments>https://bolknote.ru/all/dvizok-sajta-redaktor#comment</comments>
			</item>
			<item>
				<title>«MK-61s»: самомодифицирующиеся программы</title>
				<link>https://bolknote.ru/all/mk-61s-samomodificiruusiesa-programmy</link>
				<description>&lt;p&gt;У&amp;nbsp;меня была давно идея попробовать сделать самомодифицирующуюся программу на программируемом калькуляторе «Электроника МК-61». Ничего готового для этого там нет, но я надеюсь, что используя различные недокументированные возможности, этого можно добиться.&lt;/p&gt;&lt;p&gt;Своей цели я ещё не достиг, хоть и&amp;nbsp;продолжаю пытаться, а&amp;nbsp;пока экспериментирую с&amp;nbsp;&lt;a href=&quot;https://bolknote.ru/all/mk-61s-oblast-pamati-ms&quot;&gt;командами доступа&lt;/a&gt; в&amp;nbsp;область &lt;tt&gt;Ms&lt;/tt&gt;&amp;nbsp;— это недоделанные команды, которые я разблокировал в&amp;nbsp;ретроконсоли «&lt;i&gt;MK-61s&lt;/i&gt;».&lt;/p&gt;&lt;p&gt;Там всего две команды&amp;nbsp;— одна обменивает&amp;nbsp;&lt;tt&gt;Ms&lt;/tt&gt;&amp;nbsp;с&amp;nbsp;содержимым памяти, вторая с&amp;nbsp;регистрами. Таким образом вырисовывается путь&amp;nbsp;— меняем что-то в&amp;nbsp;регистрах, выгружаем в&amp;nbsp;&lt;tt&gt;Ms&lt;/tt&gt;, оттуда&amp;nbsp;— в&amp;nbsp;память. Так как в&amp;nbsp;«&lt;i&gt;MK-61s&lt;/i&gt;» на один регистр больше, то и&amp;nbsp;&lt;tt&gt;Ms&lt;/tt&gt; пришлось расширить&amp;nbsp;— теперь там может храниться не 56 шагов программы, как в&amp;nbsp;настоящем калькуляторе, а&amp;nbsp;63.&lt;/p&gt;&lt;p&gt;Выглядит просто, но есть особенности&amp;nbsp;— калькулятор хранит числа в&amp;nbsp;особом формате&amp;nbsp;и&amp;nbsp;при переносе в&amp;nbsp;программную память этот формат создаёт проблемы. Байтами команд становятся не только цифры числа, но и&amp;nbsp;его знак и&amp;nbsp;порядок. Поэтому записать в&amp;nbsp;регистр какое-нибудь число и&amp;nbsp;получить из него произвольную последовательность команд не получится&amp;nbsp;— приходится подбирать числа под нужный код, а&amp;nbsp;иногда и&amp;nbsp;сам код под представление чисел.&lt;/p&gt;&lt;p&gt;Например, число &lt;tt&gt;690050,68&lt;/tt&gt; после такого переноса даёт последовательность кодов &lt;tt&gt;68&lt;/tt&gt; &lt;tt&gt;50&lt;/tt&gt; &lt;tt&gt;00&lt;/tt&gt; &lt;tt&gt;69&lt;/tt&gt; &lt;tt&gt;50&lt;/tt&gt; &lt;tt&gt;00&lt;/tt&gt;.&amp;nbsp;Для калькулятора это уже программа: прочитать регистр &lt;tt&gt;8&lt;/tt&gt;, остановиться, ввести ноль, прочитать регистр &lt;tt&gt;9&lt;/tt&gt;, снова остановиться и&amp;nbsp;ввести ноль. Кроме этих шести байтов у&amp;nbsp;каждого блока есть ещё один служебный байт, который команда обмена с&amp;nbsp;регистрами не меняет. Его можно заранее заполнить нужной командой.&lt;/p&gt;&lt;p&gt;Теперь самое интересное: если вычесть из этого число &lt;tt&gt;10000,01&lt;/tt&gt;, получим &lt;tt&gt;680050,67&lt;/tt&gt;, а&amp;nbsp;в&amp;nbsp;памяти&amp;nbsp;— &lt;tt&gt;67&lt;/tt&gt; &lt;tt&gt;50&lt;/tt&gt; &lt;tt&gt;00&lt;/tt&gt; &lt;tt&gt;68&lt;/tt&gt; &lt;tt&gt;50&lt;/tt&gt; &lt;tt&gt;00&lt;/tt&gt;. Команды остались прежними, но оба номера регистров уменьшились на единицу. Продолжая вычитать ту&amp;nbsp;же константу, можно получить целую серию похожих участков программы.&lt;/p&gt;&lt;p&gt;Я решил попробовать использовать это для программы, которая не просто сама себя модифицирует, а, в&amp;nbsp;идеале, сама себя распаковывает, то есть занимает меньше команд при вводе, чем в&amp;nbsp;памяти.&lt;/p&gt;&lt;p&gt;Для этого я взял игру «&lt;i&gt;&lt;a href=&quot;https://github.com/bolknote/MKPro/blob/main/games/adventure/the-land-of-psycho-lamers.md&quot;&gt;The Land of Psycho Lamers&lt;/a&gt;&lt;/i&gt;» и&amp;nbsp;переставил её код так, чтобы повторяющиеся участки укладывались в&amp;nbsp;вышеупомянутый шаблон. Получился распаковщик длиной всего двадцать байт: он берёт начальное число и&amp;nbsp;шаг, заполняет девять регистров, а&amp;nbsp;затем двумя обменами переносит результат в&amp;nbsp;программную память. Так восстанавливаются 63 байта команд.&lt;/p&gt;&lt;p&gt;Правда, тут надо честно посчитать всё остальное: исходные числа, заранее расставленные служебные байты и&amp;nbsp;код подготовки. С&amp;nbsp;учётом этого выигрыш получился скромным&amp;nbsp;— 75 загружаемых байт против 80 у&amp;nbsp;исходной игры. Это если в&amp;nbsp;обоих случаях не загружать нули. Сам текстовый файл стал даже больше, да и&amp;nbsp;занимаемый диапазон программной памяти вырос. Так что до практичного архиватора далеко, но работающая игра, которая сама собирает часть своего кода из чисел, уже получилась.&lt;/p&gt;&lt;p&gt;Ниже можно пройти распаковку по шагам. Хорошо видно, как сначала исходные данные уходят в&amp;nbsp;&lt;tt&gt;Ms&lt;/tt&gt;, затем из чисел строятся будущие команды, а&amp;nbsp;в&amp;nbsp;конце они одним обменом появляются в&amp;nbsp;основной памяти.&lt;/p&gt;&lt;div class=&quot;post-html-block&quot; data-post-html-source=&quot;&amp;lt;div id=&amp;quot;bolknote-ms-decompressor20&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;viz-controls&amp;quot;&amp;gt;&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; data-back aria-label=&amp;quot;Предыдущая команда&amp;quot;&amp;gt;←&amp;lt;/button&amp;gt;&amp;lt;button class=&amp;quot;btn&amp;quot; type=&amp;quot;button&amp;quot; data-next aria-label=&amp;quot;Следующая команда&amp;quot;&amp;gt;→&amp;lt;/button&amp;gt;&amp;lt;span data-status aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div data-program class=&amp;quot;memory&amp;quot; aria-label=&amp;quot;Программная память&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;h2&amp;gt;Ms&amp;lt;/h2&amp;gt;&amp;lt;div data-ms class=&amp;quot;ms&amp;quot; aria-label=&amp;quot;Девять блоков Ms&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;style&amp;gt;
#bolknote-ms-decompressor20{
  --msd20-foreground:currentColor;
  --msd20-primary:var(--link-color,#c76f5a);
  --msd20-muted:color-mix(in srgb,currentColor 58%,transparent);
  --msd20-accent:color-mix(in srgb,var(--msd20-primary) 16%,transparent);font:13px/1.35 system-ui,sans-serif;color:var(--msd20-foreground);max-width:1000px;margin:auto}
#bolknote-ms-decompressor20 .viz-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
#bolknote-ms-decompressor20 .btn{appearance:button;display:inline-flex;min-height:28px;align-items:center;justify-content:center;margin:0;padding:0 8px;border:1px solid color-mix(in srgb,currentColor 18%,transparent);border-radius:8px;color:inherit;background:color-mix(in srgb,currentColor 6%,transparent);font:inherit;cursor:pointer}
#bolknote-ms-decompressor20 .btn:not(:disabled):hover{background:color-mix(in srgb,currentColor 12%,transparent)}
#bolknote-ms-decompressor20 .btn:focus-visible{outline:2px solid var(--msd20-primary);outline-offset:2px}
#bolknote-ms-decompressor20 .btn:disabled{cursor:not-allowed;opacity:.4}
#bolknote-ms-decompressor20 h2{font-size:13px;font-weight:500;margin:12px 0 5px}
#bolknote-ms-decompressor20 .memory{display:grid;grid-template-columns:repeat(10,minmax(0,1fr));gap:2px;margin-top:10px}
#bolknote-ms-decompressor20 .cell{padding:5px 3px;min-width:0;background:color-mix(in srgb,var(--msd20-foreground) 4%,transparent);white-space:nowrap;font-size:12px;font-variant-numeric:tabular-nums}
#bolknote-ms-decompressor20 .cell code{font:inherit;color:inherit;margin-right:4px}
#bolknote-ms-decompressor20 .cell.target{background:color-mix(in srgb,var(--msd20-primary) 7%,transparent)}
#bolknote-ms-decompressor20 .cell.pending{color:var(--msd20-muted)}
#bolknote-ms-decompressor20 .cell.changed{background:color-mix(in srgb,var(--msd20-primary) 22%,transparent)}
#bolknote-ms-decompressor20 .cell.current{outline:2px solid var(--msd20-primary);outline-offset:-2px;background:var(--msd20-accent)}
#bolknote-ms-decompressor20 .changed{background:color-mix(in srgb,var(--msd20-primary) 16%,transparent)}
#bolknote-ms-decompressor20 .ms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px}
#bolknote-ms-decompressor20 .block{padding:6px;background:color-mix(in srgb,var(--msd20-foreground) 4%,transparent);font:12px/1.5 ui-monospace,monospace;text-align:center;white-space:nowrap}
#bolknote-ms-decompressor20 .block.changed{background:color-mix(in srgb,var(--msd20-primary) 16%,transparent)}
#bolknote-ms-decompressor20 .block .service{color:var(--msd20-muted)}
@media(max-width:800px){#bolknote-ms-decompressor20 .memory{grid-template-columns:repeat(5,minmax(0,1fr))}}
@media(max-width:580px){#bolknote-ms-decompressor20 .memory{grid-template-columns:repeat(3,minmax(0,1fr))}#bolknote-ms-decompressor20 .ms{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:360px){#bolknote-ms-decompressor20 .ms{grid-template-columns:1fr}}
&amp;lt;/style&amp;gt;
&amp;lt;script&amp;gt;
(()=&amp;gt;{
const root=document.getElementById(&#039;bolknote-ms-decompressor20&#039;);
const hex=n=&amp;gt;n.toString(16).toUpperCase().padStart(2,&#039;0&#039;);
const names={16:&#039;+&#039;,17:&#039;−&#039;,20:&#039;X↔Y&#039;,80:&#039;С/П&#039;,82:&#039;В/О&#039;,84:&#039;NOP&#039;,85:&#039;К ПВ&#039;,86:&#039;К ОД&#039;,89:&#039;x≥0&#039;,93:&#039;FL0&#039;,138:&#039;К БП A&#039;,139:&#039;К БП B&#039;,188:&#039;К x→ПC&#039;};
function cmd(b,a){if(a===105)return &#039;→98&#039;;if(a===80)return &#039;→80&#039;;if(b&amp;lt;=9)return String(b);if(b&amp;gt;=64&amp;amp;&amp;amp;b&amp;lt;=79)return &#039;x→П&#039;+(b-64).toString(16).toUpperCase();if(b&amp;gt;=96&amp;amp;&amp;amp;b&amp;lt;=111)return &#039;П→x&#039;+(b-96).toString(16).toUpperCase();return names[b]||&#039;код &#039;+hex(b);}
function pack(cents){if(!cents)return [0,0,0,0,0,0,0];let s=String(Math.abs(cents));let exp=s.length-3;let digits=s.padEnd(8,&#039;0&#039;).slice(0,8).split(&#039;&#039;).reverse().map(Number);digits.push(cents&amp;lt;0?9:0,((exp%10)+10)%10,Math.floor(Math.abs(exp)/10),exp&amp;lt;0?9:0);return [0,...Array.from({length:6},(_,i)=&amp;gt;digits[2*i]+16*digits[2*i+1])];}
function unpack(b){const digits=b.slice(1,5).reverse().map(x=&amp;gt;hex(x)).join(&#039;&#039;);if(/[^0-9]/.test(digits))return null;const exponent=(b[6]&amp;amp;15)*10+(b[5]&amp;gt;&amp;gt;4);return Math.round(Number(&#039;0.&#039;+digits)*10**(exponent+3))*((b[5]&amp;amp;15)===9?-1:1);}
const fmt=n=&amp;gt;n===null?&#039;—&#039;:(n/100).toLocaleString(&#039;ru-RU&#039;,{maximumFractionDigits:2,useGrouping:false});
const kernel=[86,85,104,79,103,8,64,20,96,76,20,188,111,17,93,152,64,85,86,82];
const tail=[110,1,16,78,80,109,1,17,77,80,110,3,17,89,128,108,80,111,80,97,80,98,80,99,80,105,80];
let mem=Array(110).fill(0),ms=Array(63).fill(0),regs=[0,11,12,13,14,15,16,17,18,19,30,20,0,5,0,0].map(n=&amp;gt;n*100),stack=[0,0,0,0];
for(const [a,b] of [[7,138],[14,139],[21,84],[28,139],[35,138],[42,139],[49,138]])mem[a]=b;
mem.splice(50,6,...pack(69005068).slice(1));mem.splice(56,7,...pack(1000001));mem.splice(63,27,...tail);mem.splice(90,20,...kernel);
let pc=90;const states=[];const push=x=&amp;gt;{stack=[x,stack[0],stack[1],stack[2]]};
function snap(note){states.push({mem:[...mem],ms:[...ms],regs:[...regs],stack:[...stack],pc,note});}
snap(&#039;До К ОД: исходные числа находятся в ячейках 49–62; Ms заполнена нулями.&#039;);
let guard=0;
while(pc!==null&amp;amp;&amp;amp;guard++&amp;lt;100){const at=pc,b=mem[pc];let note=&#039;&#039;;pc++;
if(b===86){const head=mem.slice(0,63);mem.splice(0,63,...ms);ms=head;note=&#039;К ОД: обмен первых 63 байтов программы и области Ms.&#039;;}
else if(b===85){for(let r=0;r&amp;lt;9;r++){const old=pack(regs[r]);regs[r]=unpack(ms.slice(r*7,r*7+7));ms.splice(r*7+1,6,...old.slice(1));}note=&#039;К ПВ: обмен числовых частей Ms и R0–R8. Служебные байты S сохраняются.&#039;;}
else if(b&amp;gt;=96&amp;amp;&amp;amp;b&amp;lt;=111){const r=b-96;push(regs[r]);note=&#039;Получено значение R&#039;+r.toString(16).toUpperCase()+&#039;: &#039;+fmt(stack[0])+&#039;.&#039;;}
else if(b&amp;gt;=64&amp;amp;&amp;amp;b&amp;lt;=79){const r=b-64;regs[r]=stack[0];note=&#039;Записано &#039;+fmt(stack[0])+&#039; в R&#039;+r.toString(16).toUpperCase()+&#039;.&#039;;}
else if(b===8){push(800);note=&#039;Введено 8 — начальный счётчик блоков.&#039;;}
else if(b===20){[stack[0],stack[1]]=[stack[1],stack[0]];note=&#039;X и Y поменялись местами.&#039;;}
else if(b===188){const r=regs[12]/100;regs[r]=stack[0];note=&#039;Косвенная запись: RC=&#039;+r+&#039;, поэтому &#039;+fmt(stack[0])+&#039; записано в R&#039;+r+&#039;.&#039;;}
else if(b===17){stack=[stack[1]-stack[0],stack[2],stack[3],stack[3]];note=&#039;Вычтен шаг 10000,01. Следующий шаблон: &#039;+fmt(stack[0])+&#039;.&#039;;}
else if(b===93){pc++;if(regs[0]&amp;gt;100){regs[0]-=100;pc=98;note=&#039;FL0: счётчик уменьшен до &#039;+fmt(regs[0])+&#039;, переход на 98.&#039;;}else note=&#039;FL0: счётчик равен 1; выход из цикла без его уменьшения.&#039;;}
else if(b===82){pc=null;note=&#039;В/О: возврат. Все 63 байта восстановлены; R0–R8 и Ms возвращены.&#039;;}
else throw Error(&#039;Неизвестная команда &#039;+b);
snap(&#039;Выполнено &#039;+at+&#039; · &#039;+hex(b)+&#039; &#039;+cmd(b,at)+&#039;. &#039;+note);
}
if(states.at(-1).pc!==null)throw Error(&#039;Цикл не завершён&#039;);
for(let r=0;r&amp;lt;9;r++){let expected=[mem[r*7],96+r,80,0,97+r,80,0];if(expected.some((v,i)=&amp;gt;mem[r*7+i]!==v))throw Error(&#039;Ошибка выходного блока&#039;);}
if(regs.slice(0,9).some((n,i)=&amp;gt;n!==[0,11,12,13,14,15,16,17,18][i]*100)||ms.some(Boolean))throw Error(&#039;Данные не восстановлены&#039;);
let index=0;const q=s=&amp;gt;root.querySelector(s);
function render(){const s=states[index],prev=states[Math.max(0,index-1)];q(&#039;[data-status]&#039;).textContent=index+&#039; / &#039;+(states.length-1);q(&#039;[data-back]&#039;).disabled=index===0;q(&#039;[data-next]&#039;).disabled=index===states.length-1;
q(&#039;[data-program]&#039;).innerHTML=s.mem.map((b,a)=&amp;gt;{const changed=b!==prev.mem[a],active=a===s.pc,pending=a&amp;lt;63&amp;amp;&amp;amp;b===0;return &#039;&amp;lt;div class=&amp;quot;cell &#039;+(a&amp;lt;63?&#039;target &#039;:&#039;&#039;)+(changed?&#039;changed &#039;:&#039;&#039;)+(pending?&#039;pending &#039;:&#039;&#039;)+(active?&#039;current&#039;:&#039;&#039;)+&#039;&amp;quot; title=&amp;quot;Адрес &#039;+a+&#039;&amp;quot; aria-label=&amp;quot;Адрес &#039;+a+&#039;, код &#039;+hex(b)+&#039;, &#039;+cmd(b,a)+&#039;&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&#039;+hex(b)+&#039;&amp;lt;/code&amp;gt;&#039;+(pending?&#039;&#039;:cmd(b,a))+&#039;&amp;lt;/div&amp;gt;&#039;;}).join(&#039;&#039;);
q(&#039;[data-ms]&#039;).innerHTML=Array.from({length:9},(_,r)=&amp;gt;{let a=r*7,block=s.ms.slice(a,a+7),changed=block.some((v,i)=&amp;gt;v!==prev.ms[a+i]);return &#039;&amp;lt;div class=&amp;quot;block &#039;+(changed?&#039;changed&#039;:&#039;&#039;)+&#039;&amp;quot; title=&amp;quot;Блок &#039;+r+&#039;, адреса &#039;+a+&#039;–&#039;+(a+6)+&#039;&amp;quot; aria-label=&amp;quot;Блок Ms &#039;+r+&#039;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;service&amp;quot;&amp;gt;&#039;+hex(block[0])+&#039;&amp;lt;/span&amp;gt; &#039;+block.slice(1).map(hex).join(&#039; &#039;)+&#039;&amp;lt;/div&amp;gt;&#039;;}).join(&#039;&#039;);}

function move(delta){index=Math.max(0,Math.min(states.length-1,index+delta));render();}
q(&#039;[data-back]&#039;).onclick=()=&amp;gt;move(-1);q(&#039;[data-next]&#039;).onclick=()=&amp;gt;move(1);
root.addEventListener(&#039;keydown&#039;,e=&amp;gt;{if(e.key===&#039;ArrowLeft&#039;||e.key===&#039;ArrowRight&#039;){e.preventDefault();move(e.key===&#039;ArrowLeft&#039;?-1:1);}});
render();
})();
&amp;lt;/script&amp;gt;
&quot;&gt;&lt;div id=&quot;bolknote-ms-decompressor20&quot;&gt;
  &lt;div class=&quot;viz-controls&quot;&gt;&lt;button class=&quot;btn&quot; type=&quot;button&quot; data-back aria-label=&quot;Предыдущая команда&quot;&gt;←&lt;/button&gt;&lt;button class=&quot;btn&quot; type=&quot;button&quot; data-next aria-label=&quot;Следующая команда&quot;&gt;→&lt;/button&gt;&lt;span data-status aria-live=&quot;polite&quot;&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;div data-program class=&quot;memory&quot; aria-label=&quot;Программная память&quot;&gt;&lt;/div&gt;
  &lt;h2&gt;Ms&lt;/h2&gt;&lt;div data-ms class=&quot;ms&quot; aria-label=&quot;Девять блоков Ms&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(()=&gt;{
const root=document.getElementById(&#039;bolknote-ms-decompressor20&#039;);
const hex=n=&gt;n.toString(16).toUpperCase().padStart(2,&#039;0&#039;);
const names={16:&#039;+&#039;,17:&#039;−&#039;,20:&#039;X↔Y&#039;,80:&#039;С/П&#039;,82:&#039;В/О&#039;,84:&#039;NOP&#039;,85:&#039;К ПВ&#039;,86:&#039;К ОД&#039;,89:&#039;x≥0&#039;,93:&#039;FL0&#039;,138:&#039;К БП A&#039;,139:&#039;К БП B&#039;,188:&#039;К x→ПC&#039;};
function cmd(b,a){if(a===105)return &#039;→98&#039;;if(a===80)return &#039;→80&#039;;if(b&lt;=9)return String(b);if(b&gt;=64&amp;&amp;b&lt;=79)return &#039;x→П&#039;+(b-64).toString(16).toUpperCase();if(b&gt;=96&amp;&amp;b&lt;=111)return &#039;П→x&#039;+(b-96).toString(16).toUpperCase();return names[b]||&#039;код &#039;+hex(b);}
function pack(cents){if(!cents)return [0,0,0,0,0,0,0];let s=String(Math.abs(cents));let exp=s.length-3;let digits=s.padEnd(8,&#039;0&#039;).slice(0,8).split(&#039;&#039;).reverse().map(Number);digits.push(cents&lt;0?9:0,((exp%10)+10)%10,Math.floor(Math.abs(exp)/10),exp&lt;0?9:0);return [0,...Array.from({length:6},(_,i)=&gt;digits[2*i]+16*digits[2*i+1])];}
function unpack(b){const digits=b.slice(1,5).reverse().map(x=&gt;hex(x)).join(&#039;&#039;);if(/[^0-9]/.test(digits))return null;const exponent=(b[6]&amp;15)*10+(b[5]&gt;&gt;4);return Math.round(Number(&#039;0.&#039;+digits)*10**(exponent+3))*((b[5]&amp;15)===9?-1:1);}
const fmt=n=&gt;n===null?&#039;—&#039;:(n/100).toLocaleString(&#039;ru-RU&#039;,{maximumFractionDigits:2,useGrouping:false});
const kernel=[86,85,104,79,103,8,64,20,96,76,20,188,111,17,93,152,64,85,86,82];
const tail=[110,1,16,78,80,109,1,17,77,80,110,3,17,89,128,108,80,111,80,97,80,98,80,99,80,105,80];
let mem=Array(110).fill(0),ms=Array(63).fill(0),regs=[0,11,12,13,14,15,16,17,18,19,30,20,0,5,0,0].map(n=&gt;n*100),stack=[0,0,0,0];
for(const [a,b] of [[7,138],[14,139],[21,84],[28,139],[35,138],[42,139],[49,138]])mem[a]=b;
mem.splice(50,6,...pack(69005068).slice(1));mem.splice(56,7,...pack(1000001));mem.splice(63,27,...tail);mem.splice(90,20,...kernel);
let pc=90;const states=[];const push=x=&gt;{stack=[x,stack[0],stack[1],stack[2]]};
function snap(note){states.push({mem:[...mem],ms:[...ms],regs:[...regs],stack:[...stack],pc,note});}
snap(&#039;До К ОД: исходные числа находятся в ячейках 49–62; Ms заполнена нулями.&#039;);
let guard=0;
while(pc!==null&amp;&amp;guard++&lt;100){const at=pc,b=mem[pc];let note=&#039;&#039;;pc++;
if(b===86){const head=mem.slice(0,63);mem.splice(0,63,...ms);ms=head;note=&#039;К ОД: обмен первых 63 байтов программы и области Ms.&#039;;}
else if(b===85){for(let r=0;r&lt;9;r++){const old=pack(regs[r]);regs[r]=unpack(ms.slice(r*7,r*7+7));ms.splice(r*7+1,6,...old.slice(1));}note=&#039;К ПВ: обмен числовых частей Ms и R0–R8. Служебные байты S сохраняются.&#039;;}
else if(b&gt;=96&amp;&amp;b&lt;=111){const r=b-96;push(regs[r]);note=&#039;Получено значение R&#039;+r.toString(16).toUpperCase()+&#039;: &#039;+fmt(stack[0])+&#039;.&#039;;}
else if(b&gt;=64&amp;&amp;b&lt;=79){const r=b-64;regs[r]=stack[0];note=&#039;Записано &#039;+fmt(stack[0])+&#039; в R&#039;+r.toString(16).toUpperCase()+&#039;.&#039;;}
else if(b===8){push(800);note=&#039;Введено 8 — начальный счётчик блоков.&#039;;}
else if(b===20){[stack[0],stack[1]]=[stack[1],stack[0]];note=&#039;X и Y поменялись местами.&#039;;}
else if(b===188){const r=regs[12]/100;regs[r]=stack[0];note=&#039;Косвенная запись: RC=&#039;+r+&#039;, поэтому &#039;+fmt(stack[0])+&#039; записано в R&#039;+r+&#039;.&#039;;}
else if(b===17){stack=[stack[1]-stack[0],stack[2],stack[3],stack[3]];note=&#039;Вычтен шаг 10000,01. Следующий шаблон: &#039;+fmt(stack[0])+&#039;.&#039;;}
else if(b===93){pc++;if(regs[0]&gt;100){regs[0]-=100;pc=98;note=&#039;FL0: счётчик уменьшен до &#039;+fmt(regs[0])+&#039;, переход на 98.&#039;;}else note=&#039;FL0: счётчик равен 1; выход из цикла без его уменьшения.&#039;;}
else if(b===82){pc=null;note=&#039;В/О: возврат. Все 63 байта восстановлены; R0–R8 и Ms возвращены.&#039;;}
else throw Error(&#039;Неизвестная команда &#039;+b);
snap(&#039;Выполнено &#039;+at+&#039; · &#039;+hex(b)+&#039; &#039;+cmd(b,at)+&#039;. &#039;+note);
}
if(states.at(-1).pc!==null)throw Error(&#039;Цикл не завершён&#039;);
for(let r=0;r&lt;9;r++){let expected=[mem[r*7],96+r,80,0,97+r,80,0];if(expected.some((v,i)=&gt;mem[r*7+i]!==v))throw Error(&#039;Ошибка выходного блока&#039;);}
if(regs.slice(0,9).some((n,i)=&gt;n!==[0,11,12,13,14,15,16,17,18][i]*100)||ms.some(Boolean))throw Error(&#039;Данные не восстановлены&#039;);
let index=0;const q=s=&gt;root.querySelector(s);
function render(){const s=states[index],prev=states[Math.max(0,index-1)];q(&#039;[data-status]&#039;).textContent=index+&#039; / &#039;+(states.length-1);q(&#039;[data-back]&#039;).disabled=index===0;q(&#039;[data-next]&#039;).disabled=index===states.length-1;
q(&#039;[data-program]&#039;).innerHTML=s.mem.map((b,a)=&gt;{const changed=b!==prev.mem[a],active=a===s.pc,pending=a&lt;63&amp;&amp;b===0;return &#039;&lt;div class=&quot;cell &#039;+(a&lt;63?&#039;target &#039;:&#039;&#039;)+(changed?&#039;changed &#039;:&#039;&#039;)+(pending?&#039;pending &#039;:&#039;&#039;)+(active?&#039;current&#039;:&#039;&#039;)+&#039;&quot; title=&quot;Адрес &#039;+a+&#039;&quot; aria-label=&quot;Адрес &#039;+a+&#039;, код &#039;+hex(b)+&#039;, &#039;+cmd(b,a)+&#039;&quot;&gt;&lt;code&gt;&#039;+hex(b)+&#039;&lt;/code&gt;&#039;+(pending?&#039;&#039;:cmd(b,a))+&#039;&lt;/div&gt;&#039;;}).join(&#039;&#039;);
q(&#039;[data-ms]&#039;).innerHTML=Array.from({length:9},(_,r)=&gt;{let a=r*7,block=s.ms.slice(a,a+7),changed=block.some((v,i)=&gt;v!==prev.ms[a+i]);return &#039;&lt;div class=&quot;block &#039;+(changed?&#039;changed&#039;:&#039;&#039;)+&#039;&quot; title=&quot;Блок &#039;+r+&#039;, адреса &#039;+a+&#039;–&#039;+(a+6)+&#039;&quot; aria-label=&quot;Блок Ms &#039;+r+&#039;&quot;&gt;&lt;span class=&quot;service&quot;&gt;&#039;+hex(block[0])+&#039;&lt;/span&gt; &#039;+block.slice(1).map(hex).join(&#039; &#039;)+&#039;&lt;/div&gt;&#039;;}).join(&#039;&#039;);}

function move(delta){index=Math.max(0,Math.min(states.length-1,index+delta));render();}
q(&#039;[data-back]&#039;).onclick=()=&gt;move(-1);q(&#039;[data-next]&#039;).onclick=()=&gt;move(1);
root.addEventListener(&#039;keydown&#039;,e=&gt;{if(e.key===&#039;ArrowLeft&#039;||e.key===&#039;ArrowRight&#039;){e.preventDefault();move(e.key===&#039;ArrowLeft&#039;?-1:1);}});
render();
})();
&lt;/script&gt;
&lt;/div&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-samomodificiruusiesa-programmy</guid>
				<pubDate>Fri, 02 Oct 2026 15:28:20 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-samomodificiruusiesa-programmy#comment</comments>
			</item>
			<item>
				<title>Сайт JELJAPAN</title>
				<link>https://bolknote.ru/all/sajt-jeljapan</link>
				<description>&lt;p&gt;Ну и&amp;nbsp;чтобы два раза не вставать, как говорится. Критика других&amp;nbsp;— самый примитивный жанр, стараюсь таким не увлекаться, но раз уж начал, проработаю до конца.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://bolknote.ru/all/sajt-cdek-forward&quot;&gt;До&amp;nbsp;«СДЕКа»&lt;/a&gt; у&amp;nbsp;меня был вариант заказать кронштейн из Японии. Неплохой вариант, там даже дешевле, чем везти из Великобритании. Заказать пытался через сайт «&lt;i&gt;JELJAPAN&lt;/i&gt;». Сам сайт доверия не вызывает&amp;nbsp;— похоже сделали его ещё в&amp;nbsp;90-е,&amp;nbsp;когда ни у&amp;nbsp;кого не было понимания как надо делать, да так и&amp;nbsp;оставили.&lt;/p&gt;&lt;p&gt;Но&amp;nbsp;решил попробовать. Оставил заявку, которая несколько дней повисела, а&amp;nbsp;потом отменилась безо всякой видимой причины. При этом даже никакого уведомления не пришло. Людям, очевидно, не нужны мои деньги, у&amp;nbsp;них и&amp;nbsp;так всё хорошо.&lt;/p&gt;&lt;p&gt;Тем не менее, решил дать сайту ещё один шанс&amp;nbsp;— написал сообщение, спросил что с&amp;nbsp;моей заявкой не так. В&amp;nbsp;ответ у&amp;nbsp;меня спросили «скакова» я региона страны. И&amp;nbsp;это как раз тот случай, который я описывал в&amp;nbsp;заметке про&amp;nbsp;&lt;a href=&quot;https://bolknote.ru/all/preskriptivizm-i-deskriptivizm&quot;&gt;прескриптивизм и&amp;nbsp;дескриптивизм&lt;/a&gt;. Ощущение, что со мной общаются не профессионалы. «Скакова», серьёзно? «С» и&amp;nbsp;«какова»?&lt;/p&gt;&lt;p&gt;Тут прослеживается чёткая тенденция&amp;nbsp;— сайт сделан халтурно, заявку закрыли без уточняющего вопроса, да ещё и&amp;nbsp;вопрос задают с&amp;nbsp;детскими ошибками.&lt;/p&gt;&lt;p&gt;Понесу&amp;nbsp;ли я сюда деньги? Конечно нет.&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.10.02.png&quot; alt=&quot;Михаил приветствует Евгения Степанищева и интересуется регионом страны. Евгений отвечает вопросом об отмене заявки №14254.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;68&quot; width=&quot;1664&quot; height=&quot;419&quot; loading=&quot;lazy&quot; style=&quot;color: inherit; font-size: 1em; text-wrap-mode: initial;&quot;&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/sajt-jeljapan</guid>
				<pubDate>Fri, 02 Oct 2026 05:26:08 GMT</pubDate>
				<comments>https://bolknote.ru/all/sajt-jeljapan#comment</comments>
			</item>
			<item>
				<title>Сайт CDEK Forward</title>
				<link>https://bolknote.ru/all/sajt-cdek-forward</link>
				<description>&lt;p&gt;На&amp;nbsp;днях выбирал с&amp;nbsp;помощью нейросети кронштейн для монитора жены. Нашёл хороший вариант, но возникла проблема: в&amp;nbsp;России он не продаётся. Можно было&amp;nbsp;бы поискать другой, но я уже закусил удила&amp;nbsp;— хочется именно этот.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;&lt;/p&gt;&lt;p&gt;Обычно в&amp;nbsp;таких случаях меня выручает «Бандеролька»&amp;nbsp;— сервис пересылки посылок, которым я пользуюсь уже много лет. Но&amp;nbsp;тут незадача: ни один из её адресов не подошёл. Где-то мешают таможенные ограничения, а&amp;nbsp;где-то доставка теперь возможна только внутри страны, где числится адрес.&lt;/p&gt;&lt;p&gt;Попросил нейросеть найти мне ещё какие-то варианты доставки. Нашёлся вариант через «СДЭК&amp;nbsp;Форвард»&amp;nbsp;— кронштейн можно купить в&amp;nbsp;Великобритании, а&amp;nbsp;у&amp;nbsp;«СДЭКа» как раз есть там адрес.&lt;/p&gt;&lt;p&gt;С&amp;nbsp;этого момента начался ад, с&amp;nbsp;которым нейросеть не справилась. Пришлось два раза обращаться в&amp;nbsp;поддержку.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Во-первых, мне не удалось сформировать заявку на выкуп товара. Интерфейс сообщал о&amp;nbsp;каком-то незаполненном поле, хотя я заполнил все&amp;nbsp;— на всякий случай даже необязательные.&lt;/p&gt;
&lt;p&gt;Помогла техподдержка. Оказалось, что нужно указать в&amp;nbsp;профиле адрес электронной почты и&amp;nbsp;ФИО. Я логинился через единый вход «СДЭК»&amp;nbsp;— у&amp;nbsp;меня там есть учётка, но почему-то «СДЭК» не передал эти данные в&amp;nbsp;«СДЭК&amp;nbsp;Форвард».&lt;/p&gt;
&lt;p&gt;Ок, пошел заполнять, и&amp;nbsp;тут меня ждало «во-вторых». Во-вторых, в&amp;nbsp;профиле эти поля оказались недоступными для редактирования. Сначала я недоумённо на них смотрел, потом разблокировал их через инструмент разработчика и&amp;nbsp;попробовал сохранить. Не&amp;nbsp;помогло.&lt;br&gt;&lt;br&gt;Пришлось снова писать в&amp;nbsp;поддержку. Там пояснили, что данные профиля надо править не в&amp;nbsp;профиле, а&amp;nbsp;в&amp;nbsp;меню «Виртуальный адрес». Кто&amp;nbsp;бы мог подумать?&lt;/p&gt;&lt;p class=&quot;&quot;&gt;После всех этих приключений у&amp;nbsp;меня всё получилось. Мне выделили сотрудницу, которая попробует выкупить для меня товар, но сначала выяснит, нет&amp;nbsp;ли в&amp;nbsp;Великобритании экспортных ограничений на кронштейны. В&amp;nbsp;списке ограничений их нет, но сотрудница пояснила, что правила часто меняются, придётся подождать пару дней.&lt;/p&gt;&lt;p class=&quot;&quot;&gt;В&amp;nbsp;общем, сайт делала ключница с&amp;nbsp;какой-то нечеловеческой логикой, я не понимаю как там люди вообще что-то заказывают? Все идут в&amp;nbsp;техподдержку что&amp;nbsp;ли?&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/sajt-cdek-forward</guid>
				<pubDate>Thu, 01 Oct 2026 15:17:57 GMT</pubDate>
				<comments>https://bolknote.ru/all/sajt-cdek-forward#comment</comments>
			</item>
			<item>
				<title>DeepSeek V4.1 Flash: ещё быстрее</title>
				<link>https://bolknote.ru/all/deepseek-v4-1-flash-ese-bystree</link>
				<description>&lt;p&gt;Я &lt;a href=&quot;https://bolknote.ru/all/deepseek-v4-1-flash-vtroe-bystree&quot;&gt;уже писал&lt;/a&gt; о&amp;nbsp;запуске модели «&lt;i&gt;DeepSeek V4.1 Flash»&lt;/i&gt;&amp;nbsp;на четырёх видеокартах &lt;i&gt;H200&lt;/i&gt;. Этой конфигурации хватает впритык и&amp;nbsp;мне пришлось немало повозиться, чтобы достичь приемлемой производительности.&lt;/p&gt;&lt;p&gt;Недавно выяснилось, что и&amp;nbsp;это не предел. Как-то раз, просматривая журнал при старте, я заметил, что фреймворк&amp;nbsp;«&lt;i&gt;SGLang»&lt;/i&gt; предупреждает об отсутствии готовых профилей для некоторых операций с&amp;nbsp;числами в&amp;nbsp;формате &lt;tt&gt;FP8&lt;/tt&gt;, вместо них загружался некий универсальный профиль.&lt;/p&gt;&lt;p&gt;Оказалось, что эти профили используются для работы с&amp;nbsp;матрицами и&amp;nbsp;получаются перебором различных конфигураций на конкретном оборудовании. Потенциально правильно подобранный профиль способен ускорить&amp;nbsp;инференс модели. А&amp;nbsp;поскольку наш текущий «&lt;i&gt;DeepSeek&lt;/i&gt;»&amp;nbsp;использует в&amp;nbsp;работе три типа данных, включая &lt;tt&gt;FP8&lt;/tt&gt;, я решил попробовать этот профиль создать.&lt;/p&gt;&lt;p&gt;Процедура несложная&amp;nbsp;— запускаешь специальный скрипт и&amp;nbsp;ждёшь. Правда, создать все нужные профили получилось только с&amp;nbsp;третьего раза. Они создаются под матрицы разного размера, и&amp;nbsp;нейросеть, которая запускала мне скрипт, нашла все подходящие размеры лишь на третьей попытке.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Показатель&lt;/th&gt;&lt;th&gt;До&lt;/th&gt;&lt;th&gt;После&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Самый медленный запрос&lt;/td&gt;&lt;td&gt;4,95 с&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2,46 с&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Пиковая скорость&lt;/td&gt;&lt;td&gt;1045 ток/с&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1811 ток/с&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Успешные запросы&lt;/td&gt;&lt;td&gt;12/12&lt;/td&gt;&lt;td&gt;12/12&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class=&quot;&quot;&gt;В&amp;nbsp;итоге разницу можно увидеть в&amp;nbsp;таблице выше&amp;nbsp;— тут результаты небольшого нагрузочного тестирования модели с&amp;nbsp;универсальным профилем и&amp;nbsp;профилем, подобранным под оборудование.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/ai/&quot;&gt;ИИ&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/gpu/&quot;&gt;gpu&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>ИИ</category>
				<category>программирование</category>
				<category>gpu</category>
				<guid isPermaLink="true">https://bolknote.ru/all/deepseek-v4-1-flash-ese-bystree</guid>
				<pubDate>Tue, 29 Sep 2026 19:18:30 GMT</pubDate>
				<comments>https://bolknote.ru/all/deepseek-v4-1-flash-ese-bystree#comment</comments>
			</item>
			<item>
				<title>«Элита» на «MK-61s»</title>
				<link>https://bolknote.ru/all/elita-na-mk-61s</link>
				<description>&lt;p&gt;Как и&amp;nbsp;во всех остальных случаях, специально чтобы оттестировать &lt;a href=&quot;https://bolknote.ru/all/mk-61s-dva-novyh-nabora-komand&quot; style=&quot;text-wrap-mode: initial;&quot;&gt;новые команды&lt;/a&gt;, я перенёс на «&lt;i style=&quot;text-wrap-mode: initial;&quot;&gt;MK-61s»&lt;/i&gt; игру. У&amp;nbsp;меня это уже проверенный метод для разных интерпретаторов, который даёт хорошие результаты&amp;nbsp;— и&amp;nbsp;баги становится проще найти, и&amp;nbsp;оценить насколько удобно использовать сами команды&lt;/p&gt;&lt;p&gt;На&amp;nbsp;этот раз, &lt;a href=&quot;https://bolknote.ru/all/mk-61s-i-base91&quot; style=&quot;text-wrap-mode: initial;&quot;&gt;я об этом уже писал&lt;/a&gt;, выбрал «Элиту». Те, у&amp;nbsp;кого был в&amp;nbsp;детстве какой-либо клон «Спектрума», думаю, очень хорошо её знают.&lt;/p&gt;&lt;p&gt;Безусловно, графику оригинальной игры, как ни расширяй калькулятор, тут не повторить, но можно реализовать больше логики и&amp;nbsp;кодировать происходящее в&amp;nbsp;игре более понятным образом.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.webp&quot; alt=&quot;Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;60&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Заставка «Элиты» на двенадцатиразрядном индикаторе&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как первый результат расширенных команд вывода на экран&amp;nbsp;— на индикаторе теперь можно вывести заставку и&amp;nbsp;подписать, что игра ожидает нажатия кнопки &lt;tt&gt;C/П&lt;/tt&gt; для старта. Всё это выводится в&amp;nbsp;стандартных двенадцати знакоместах, просто нестандартным образом.&lt;/p&gt;&lt;p&gt;Внутри запрограммирована небольшая вселенная из 256 миров. Можно торговать шестью товарами&amp;nbsp;— едой, рудой, топливом, электроникой, золотом и&amp;nbsp;оружием,&amp;nbsp;— заправляться, ремонтировать корабль, покупать ракеты и&amp;nbsp;улучшать лазер. Между мирами встречаются пираты, а&amp;nbsp;иногда и&amp;nbsp;те самые таргоиды, которые встречались в&amp;nbsp;оригинальной игре.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.1.webp&quot; alt=&quot;Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;61&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Имя начального мира&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Названия миров я составляю из шестнадцати букв, которые можно более-менее узнаваемо изобразить сегментами. Например, начальный мир называется «&lt;i&gt;dAdnAA&lt;/i&gt;». Получается что-то вроде технических обозначений, но от названий космических объектов благозвучие не требуется.&lt;/p&gt;&lt;p&gt;Имена при этом несут двойную функцию. Они связаны с&amp;nbsp;устройством мира, в&amp;nbsp;том числе с&amp;nbsp;торговлей, поэтому постепенно можно научиться узнавать полезные места.&lt;/p&gt;&lt;p&gt;Торговля устроена просто: смотрим цены, покупаем товар, выбираем соседний мир, летим, продаём. Топливо, которое лежит в&amp;nbsp;трюме,&amp;nbsp;— товар, бак заправляется отдельно.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.2.webp&quot; alt=&quot;Как и любая языковая модель, GigaChat не обладает собственным мнением и не транслирует мнение своих разработчиков.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;62&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Цена еды: слева номер товара, справа цена, про «СП» я уже рассказывал&lt;/div&gt;&lt;/div&gt;&lt;p&gt;С&amp;nbsp;управлением получилось по-калькуляторному: вводишь номер действия и&amp;nbsp;нажимаешь &lt;tt&gt;С/П&lt;/tt&gt;. Например, 10 показывает цену еды, 30 покупает одну единицу, а&amp;nbsp;40 продаёт. Для остальных товаров меняется последняя цифра. Во&amp;nbsp;время ввода предыдущая картинка остаётся на экране, набираемый код её не затирает.&lt;/p&gt;&lt;p&gt;Состояние корпуса, щита, бака, нагрев и&amp;nbsp;заполнение трюма показываются ещё и&amp;nbsp;шкалой из пяти секций. Точное значение остаётся рядом: шкала нужна, чтобы с&amp;nbsp;первого взгляда понять, много у&amp;nbsp;тебя осталось или мало.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.3.webp&quot; alt=&quot;К сожалению, иногда генеративные языковые модели могут создавать некорректные ответы, основанные на открытых источниках.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;63&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Состояние корпуса: шкала и&amp;nbsp;точное значение&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Бои пошаговые. За&amp;nbsp;один ход выбираешь и&amp;nbsp;манёвр, и&amp;nbsp;действие: сблизиться или отойти, выстрелить из лазера или пустить ракету, восстановить щит или готовить бегство. Это снова две цифры: первая отвечает за движение, вторая&amp;nbsp;— за действие. Можно, например, отходить и&amp;nbsp;одновременно заряжать прыжок.&lt;/p&gt;&lt;p&gt;Это, конечно, самое слабое место, калькулятор есть калькулятор, буквенного ввода нет, а&amp;nbsp;цифры запомнить куда сложнее.&lt;/p&gt;&lt;p&gt;Дистанция имеет значение: лазер не достаёт до далёкой цели, а&amp;nbsp;вблизи стреляет сильнее. Кроме того, он ещё и&amp;nbsp;греется. Ракет мало, щит держит конечно количество ударов, так что бесконечно повторять одну и&amp;nbsp;ту&amp;nbsp;же команду не получится.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.4.webp&quot; alt=&quot;Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;64&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Схема дистанции в&amp;nbsp;бою: свой корабль и&amp;nbsp;противник&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Для расстояния я сделал отдельную схему: &lt;tt&gt;U&lt;/tt&gt;&amp;nbsp;(«&lt;i&gt;you&lt;/i&gt;») обозначает наш корабль, &lt;tt&gt;H&lt;/tt&gt;&amp;nbsp;(«&lt;i&gt;hostile&lt;/i&gt;»)&amp;nbsp;— противника, а&amp;nbsp;точка отмечает границу, до которой достаёт лазер. Так посмотреть приборы или выбрать цель можно без расходования хода.&lt;/p&gt;&lt;p&gt;С&amp;nbsp;таргоидами интереснее: у&amp;nbsp;них есть корабль-носитель, который выпускает дронов. Поэтому просто расстрелять большой корабль недостаточно, надо убрать весь строй.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.5.webp&quot; alt=&quot;Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;65&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Носитель и&amp;nbsp;дроны на одном индикаторе&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Маленькие кольца слева показывают живых дронов. Правее&amp;nbsp;— выбранная цель и&amp;nbsp;её оставшаяся броня. Для носителя это &lt;tt&gt;H&lt;/tt&gt;, для дрона&amp;nbsp;— его номер. То есть даже в&amp;nbsp;двенадцать знакомест помещаются несколько противников, выбор цели и&amp;nbsp;число, которое помогает решить, стоит&amp;nbsp;ли тратить на неё ракету.&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.27.7.webp&quot; alt=&quot;К сожалению, иногда генеративные языковые модели могут создавать некорректные ответы, основанные на открытых источниках.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;67&quot; width=&quot;768&quot; height=&quot;256&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;После уничтожения всех противников: YES. CLEAr&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Победу я обозначил надписью «&lt;i&gt;YES, CLEAr&lt;/i&gt;»&amp;nbsp;. За&amp;nbsp;победу дают награду, после сражения можно закончить перелёт и&amp;nbsp;вернуться к&amp;nbsp;торговле.&lt;/p&gt;&lt;p&gt;На&amp;nbsp;этой игре хорошо стало видно, зачем понадобилось отделять экран от вычислений. Промежуточные числа больше не мелькают перед глазами, а&amp;nbsp;новый кадр появляется целиком. Кроме того оказалось, что нужно добавить больше команд&amp;nbsp;— первая версия медленно заменяла отдельные сегменты, и&amp;nbsp;выглядело это довольно мучительно.&lt;/p&gt;&lt;p&gt;Вообще, с&amp;nbsp;быстродействием пришлось повозиться отдельно: сокращать обмены между банками, переиспользовать уже вычисленные значения, заимствовать калькуляторные трюки с&amp;nbsp;косвенными переходами.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bolknote/MK61S_MINI/tree/main/programs/games/ELITE&quot;&gt;Игра и&amp;nbsp;короткая инструкция&lt;/a&gt;&amp;nbsp;лежат в&amp;nbsp;репозитории. Нужна свежая прошивка с&amp;nbsp;новыми командами; открываешь папку &lt;tt&gt;ELITE&lt;/tt&gt; на устройстве, закрываешь памятку и&amp;nbsp;нажимаешь &lt;tt&gt;С/П&lt;/tt&gt;. Пока не решил стоит&amp;nbsp;ли делать сохранения. С&amp;nbsp;одной стороны это логичный следующий шаг, с&amp;nbsp;другой стороны уже слишком далеко отходит от исходной идеи.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/elita-na-mk-61s</guid>
				<pubDate>Sun, 27 Sep 2026 16:09:48 GMT</pubDate>
				<comments>https://bolknote.ru/all/elita-na-mk-61s#comment</comments>
			</item>
			<item>
				<title>Отдохнул на острове</title>
				<link>https://bolknote.ru/all/otdohnul-na-ostrove</link>
				<description>&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.26@2x.webp&quot; alt=&quot;Закатное небо отражается в воде, дорога уходит вдаль мимо припаркованных машин.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;59&quot; width=&quot;1000&quot; height=&quot;562&quot; loading=&quot;lazy&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;У&amp;nbsp;нас с&amp;nbsp;одним из друзей сложилась традиция&amp;nbsp;— несколько раз за тёплый сезон мы уезжаем в&amp;nbsp;поход на выходные. С&amp;nbsp;ночёвкой в&amp;nbsp;палатках, если позволяет погода.&lt;/p&gt;&lt;p&gt;Ездим на необитаемый остров&amp;nbsp;— пройтись по пересечёнке, полюбоваться красотами, устать как собака, сварить кофе на берегу реки, развести костёр, вплипуть в&amp;nbsp;приключения. Места там шикарные, несколько всё портят две беды&amp;nbsp;— комары и&amp;nbsp;гадюки.&lt;/p&gt;&lt;p&gt;Правда, в&amp;nbsp;этом году мы оба как-то прилипли к&amp;nbsp;дивану. Ездили, если мне память не изменяет, всего два раза, а&amp;nbsp;с&amp;nbsp;палатками вообще не выбрались&amp;nbsp;— то у&amp;nbsp;него не складывается, то у&amp;nbsp;меня.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Сегодня удалось выбраться ещё раз. Правда, ночевать уже холодно, поэтому ездили одним днём. С&amp;nbsp;погодой повезло: тепло, ни ветра, ни дождя. Если верить прогнозу, это были последние такие выходные в&amp;nbsp;этом году.&lt;/p&gt;&lt;p&gt;Накануне, в&amp;nbsp;полном соответствии с&amp;nbsp;&lt;a href=&quot;https://bolknote.ru/all/paradoks-stepanischeva-vihlyanskogo&quot;&gt;парадоксом Степанищева—Вихлянского&lt;/a&gt;, никуда ехать не хотелось. Но&amp;nbsp;жена сказала: «Езжай, потом будешь жалеть». И&amp;nbsp;она оказалась права. Грех было упускать такую погоду, да и&amp;nbsp;отдохнул на природе просто шикарно.&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/otdohnul-na-ostrove</guid>
				<pubDate>Sat, 26 Sep 2026 19:42:57 GMT</pubDate>
				<comments>https://bolknote.ru/all/otdohnul-na-ostrove#comment</comments>
			</item>
			<item>
				<title>«МК-61s»: два новых набора команд</title>
				<link>https://bolknote.ru/all/mk-61s-dva-novyh-nabora-komand</link>
				<description>&lt;p&gt;Как я &lt;a href=&quot;https://bolknote.ru/all/mk-61s-i-base91&quot;&gt;писал два дня назад&lt;/a&gt;, мне стало интересно пофантазировать на тему, как&amp;nbsp;бы я расширил калькулятор «Электроника МК-61», если&amp;nbsp;бы мне поручили доработать его под написание игр. Я решил, что нарастил&amp;nbsp;бы ему память и&amp;nbsp;позволил&amp;nbsp;бы программисту гибче управлять выводом на экран.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Правда, я думал, что добавлю всего несколько команд, заняв неиспользуемые коды калькулятора, но когда начал писать программу для теста, оказалось, что набор надо расширять серьёзно, иначе быстродействие программ будет крайне низким, «МК-61» и&amp;nbsp;так-то производительностью не отличается.&lt;/p&gt;&lt;p&gt;Поэтому пришлось расширять команды по префиксному типу&amp;nbsp;— код &lt;tt&gt;1F&lt;/tt&gt;&amp;nbsp;используется как префиксный для работы с&amp;nbsp;новыми банками памяти, а&amp;nbsp;&lt;tt&gt;2F&lt;/tt&gt;&amp;nbsp;— для работы с&amp;nbsp;экраном.&lt;/p&gt;&lt;p&gt;Полностью все команды я перечислять не будут, их слишком много, в&amp;nbsp;моём репозитории есть &lt;a href=&quot;https://github.com/bolknote/MK61S_MINI/blob/main/doc/MK61s-mini-Extended-Opcodes.pdf&quot;&gt;руководство&lt;/a&gt;, но основные идеи расскажу.&lt;/p&gt;&lt;p&gt;Поскольку экран «МК-61» заменить в&amp;nbsp;те годы было не на что, я&amp;nbsp;бы оставил его тем&amp;nbsp;же, но сделал&amp;nbsp;бы две вещи.&lt;/p&gt;&lt;p&gt;Во-первых, развязал&amp;nbsp;бы вывод на экран с&amp;nbsp;регистром &lt;tt&gt;X&lt;/tt&gt;, что позволило избегать появления на экране промежуточных вычислений.&lt;/p&gt;&lt;p&gt;Во-вторых, позволил&amp;nbsp;бы программисту управлять каждым сегментом двенадцатиразрядного индикатора. Это даёт возможность выводить какое-то подобие букв и&amp;nbsp;рисунков. Весь алфавит так не выведешь, но некоторые буквы и&amp;nbsp;знаки&amp;nbsp;— запросто.&lt;/p&gt;&lt;p&gt;Тут для производительности пришлось добавить целую россыпь команд. Помимо переключения режимов отображения, теперь есть команды виртуального курсора и&amp;nbsp;форматирования.&lt;/p&gt;&lt;p&gt;И, конечно, стоит подумать об расширении памяти. Тут действительно настоящая проблема. Ретроконсоль «&lt;i&gt;МК-61s&lt;/i&gt;» уже давно умеет в&amp;nbsp;специальном режиме добавлять к&amp;nbsp;традиционным 105 байтам ещё&amp;nbsp;семь практически без нарушения обратной совместимости, а&amp;nbsp;недавно в&amp;nbsp;ней появились даже &lt;a href=&quot;https://bolknote.ru/all/mk-61s-oblast-pamati-ms&quot;&gt;новые команды&lt;/a&gt;&amp;nbsp;для работы с&amp;nbsp;областью памяти &lt;tt&gt;Ms&lt;/tt&gt;, которая была предусмотрена в&amp;nbsp;калькуляторе «Электроника МК-61», но ранее не использовалась. Однако и&amp;nbsp;этого всё равно недостаточно.&lt;/p&gt;&lt;p&gt;Поэтому я добавил этой памяти ещё&amp;nbsp;несколько дополнительных банков, выделив префикс &lt;tt&gt;1F&lt;/tt&gt;&amp;nbsp;для переключения. Сначала я думал, что обойдусь одной командой вызова подпрограммы, но оказалось, что для программирования это неудобно, так что в&amp;nbsp;этом наборе появились еще циклы и&amp;nbsp;команды условных переходов.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;итоге в&amp;nbsp;расширенном режиме теперь доступно: 112 байт обычной памяти, резерв &lt;tt&gt;Ms&lt;/tt&gt;&amp;nbsp;в&amp;nbsp;63 байта (в&amp;nbsp;обычном калькуляторе там 56 байт, но тут пришлось расширить из-за добавленного регистра &lt;tt&gt;Rf&lt;/tt&gt;, который есть в&amp;nbsp;«&lt;i&gt;MK-61s&lt;/i&gt;»), плюс 31 банк памяти по 112 байт каждый. Всего 3647 байт.&lt;/p&gt;&lt;p&gt;Правда, сами команды удлинились&amp;nbsp;— новые команды занимают от двух до четырёх ячеек. Самые длинные&amp;nbsp;— команды перехода по адресу: префикс, код команды, выбор банка и&amp;nbsp;адрес ячейки. Я теории их можно сократить, но тогда придётся жёстко завязаться на количество банков, а&amp;nbsp;мне&amp;nbsp;бы этого не хотелось.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-dva-novyh-nabora-komand</guid>
				<pubDate>Fri, 25 Sep 2026 18:36:31 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-dva-novyh-nabora-komand#comment</comments>
			</item>
			<item>
				<title>Первый месяц в новой школе</title>
				<link>https://bolknote.ru/all/pervyj-mesac-v-novoj-skole</link>
				<description>&lt;p&gt;Как я &lt;a href=&quot;https://bolknote.ru/all/v-tretij-raz-v-novyj-klass&quot;&gt;недавно писал&lt;/a&gt;, первого сентября дочка пошла в&amp;nbsp;новую школу. Поначалу она очень переживала&amp;nbsp;— что вполне понятно,&amp;nbsp;— дичилась и&amp;nbsp;довольно ультимативно заявляла, что не будет общаться с&amp;nbsp;одноклассниками. Но&amp;nbsp;быстро оттаяла, и&amp;nbsp;сейчас, к&amp;nbsp;концу сентября, переживания полностью её оставили.&lt;/p&gt;&lt;p&gt;Я полностью расслабиться до сих пор себе позволить не могу: это уже третья школа, и&amp;nbsp;везде всё начиналось достаточно хорошо. Тем не менее очень надеюсь, что больше менять школу не придётся.&lt;/p&gt;&lt;p&gt;Недавно нас позвали на индивидуальную встречу. Я поехать не смог&amp;nbsp;— встреча была в&amp;nbsp;рабочее время, а&amp;nbsp;у&amp;nbsp;меня сейчас на работе цейтнот,&amp;nbsp;— поэтому съездила жена. Еву очень хвалили, а&amp;nbsp;по итогам прислали бумагу, по которой школа вместе с&amp;nbsp;родителями выбирает направления развития ребёнка на ближайшее время. Бумага эта&amp;nbsp;— бальзам нам на душу, хочу выложить часть на память.&lt;/p&gt;&lt;p&gt;С&amp;nbsp;цифрами всё отлично: арифметика&amp;nbsp;— 98%, литературное чтение&amp;nbsp;— 93%, русский язык&amp;nbsp;— 90,5%, английский&amp;nbsp;— 80%. Английский на фоне остальных выглядит скромно, но 80%&amp;nbsp;— очень достойное «скромно».&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.25.1.webp&quot; alt=&quot;Таблица успеваемости школьницы Евы: математика 98%, литература 93%, русский язык 90,5%, английский язык 80%.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;53&quot; width=&quot;1589&quot; height=&quot;505&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Стартовые результаты по основным предметам&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Но&amp;nbsp;больше всего меня порадовали даже не проценты. Учитель написал, что Ева легко находит нужную информацию в&amp;nbsp;тексте, таблице или на рисунке, быстро выделяет данные, которые нужны для решения, и&amp;nbsp;не тратит время на лишнее. Если первый способ не подходит, пробует другие. Мёд, просто мёд для родительских сердца и&amp;nbsp;глаз.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.25.2.webp&quot; alt=&quot;Таблица с комментарием учителя о сильных сторонах дочери в учёбе: умение находить информацию, сравнивать, выстраивать связи и предлагать варианты решений.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;54&quot; width=&quot;1589&quot; height=&quot;1564&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Больше всего меня порадовали не проценты, а&amp;nbsp;это ↑↑↑&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Особенно приятно было прочитать про общение&amp;nbsp;— учитывая, что в&amp;nbsp;начале месяца дочка обещала вообще ни с&amp;nbsp;кем не общаться. Здесь&amp;nbsp;же написано, что она умеет и&amp;nbsp;говорить, и&amp;nbsp;слушать, и&amp;nbsp;договариваться, задаёт уточняющие вопросы, хорошо работает в&amp;nbsp;паре и&amp;nbsp;группе, помогает другим и&amp;nbsp;уверенно выступает перед классом.&lt;/p&gt;&lt;p&gt;Путь от «общаться ни с&amp;nbsp;кем не буду» до «надёжный партнёр в&amp;nbsp;любой совместной задаче» занял меньше месяца. Очень неплохо. Впрочем, она действительно такая&amp;nbsp;— ценит дружбу, любит помогать другим.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.25.3.webp&quot; alt=&quot;Ева умеет говорить, слушать, договариваться и показывать результаты своей работы.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;55&quot; width=&quot;1613&quot; height=&quot;535&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;«Не&amp;nbsp;общаться», говорила она&lt;/div&gt;&lt;/div&gt;&lt;p&gt;С&amp;nbsp;саморегуляцией тоже всё хорошо: Ева понимает, что нужно сделать к&amp;nbsp;концу урока, сохраняет ориентацию на результат, сама следует инструкции, умеет переключаться между заданиями и&amp;nbsp;может назвать свои эмоции. Я уже как-то писал, что саморефлексия ей даётся очень легко. Это точно не моё влияние, скорее жены, мне это даётся тяжелее. Я скорее, глядя на дочку, наконец стал понимать, как это делать.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.25.4.webp&quot; alt=&quot;Таблица оценки навыков дочери по саморегуляции, самоконтролю и целеполаганию с комментарием учителя о её успехах.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;56&quot; width=&quot;1717&quot; height=&quot;2247&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Про самоорганизацию и&amp;nbsp;самоконтроль&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Тут уже есть и&amp;nbsp;зона роста. Ева может сказать, получилось у&amp;nbsp;неё или нет, но пока не всегда понимает, почему именно ошиблась, и&amp;nbsp;чаще называет поверхностную причину. Будет учиться разбирать ошибки глубже. Полезный навык&amp;nbsp;— не уверен, что он и&amp;nbsp;у&amp;nbsp;меня-то вполне стабилен.&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.25.5.webp&quot; alt=&quot;Таблица сильных сторон и зон роста моей дочери Евы по результатам учебы в новой школе.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;57&quot; width=&quot;1675&quot; height=&quot;1484&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Сильные стороны и&amp;nbsp;пока единственная зона роста&lt;/div&gt;&lt;/div&gt;&lt;p&gt;В&amp;nbsp;общем, первый месяц получился отличным. Дочка не только справляется с&amp;nbsp;учёбой, но и&amp;nbsp;быстро освоилась, работает вместе с&amp;nbsp;другими детьми и, похоже, чувствует себя в&amp;nbsp;школе спокойно. Кажется, это и&amp;nbsp;есть главный успех.&lt;/p&gt;&lt;p&gt;Заранее праздновать я, конечно, не буду&amp;nbsp;— опыт научил. Но&amp;nbsp;пока поводов радоваться гораздо больше, чем переживать. Пусть так и&amp;nbsp;продолжается.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/daughter/&quot;&gt;дочка&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>дочка</category>
				<guid isPermaLink="true">https://bolknote.ru/all/pervyj-mesac-v-novoj-skole</guid>
				<pubDate>Fri, 25 Sep 2026 09:13:51 GMT</pubDate>
				<comments>https://bolknote.ru/all/pervyj-mesac-v-novoj-skole#comment</comments>
			</item>
			<item>
				<title>Прогресс по поиску могилы прадеда</title>
				<link>https://bolknote.ru/all/progress-po-poisku-mogily-pradeda</link>
				<description>&lt;p&gt;Проект по поиску могилы прадеда, пропавшего в&amp;nbsp;начале Великой Отечественной войны, пока приостановлен. Мы с&amp;nbsp;нейросетью написали целую кучу писем и&amp;nbsp;постепенно получаем ответы. В&amp;nbsp;основном отрицательные. Ни&amp;nbsp;у&amp;nbsp;кого ничего нет, а&amp;nbsp;что есть&amp;nbsp;— уже выложено в&amp;nbsp;интернет. Интернет я уже вычерпал досуха.&lt;/p&gt;&lt;p&gt;Основное направление поиска пока то&amp;nbsp;же самое&amp;nbsp;— отследить, куда уходили другие люди того&amp;nbsp;же призыва, и&amp;nbsp;по ним восстановить путь, но, опять-таки, всё упирается в&amp;nbsp;архивы. А&amp;nbsp;там живые люди, у&amp;nbsp;которых очередь таких, как я.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;паре мест запросили подтверждение родства. Тут мне очень сыграло на руку наличие &lt;a href=&quot;https://bolknote.ru/all/babushkino-svidetelstvo-o-rozhdenii&quot;&gt;свидетельства о&amp;nbsp;рождении бабушки&lt;/a&gt;, дочери разыскиваемого прадеда, которое родители очень вовремя мне привезли. Отправил всю цепочку, жду ответа.&lt;/p&gt;&lt;p&gt;По&amp;nbsp;моим расчётам эта фаза продлится примерно до декабря, после чего можно посмотреть на присланное и&amp;nbsp;планировать что&amp;nbsp;же делать дальше.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/myheritage/&quot;&gt;родовое дерево&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/starostin-f-n/&quot;&gt;Старостин Ф. Н.&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>родовое дерево</category>
				<category>Старостин Ф. Н.</category>
				<guid isPermaLink="true">https://bolknote.ru/all/progress-po-poisku-mogily-pradeda</guid>
				<pubDate>Thu, 24 Sep 2026 10:50:28 GMT</pubDate>
				<comments>https://bolknote.ru/all/progress-po-poisku-mogily-pradeda#comment</comments>
			</item>
			<item>
				<title>«МК-61s» и Base91</title>
				<link>https://bolknote.ru/all/mk-61s-i-base91</link>
				<description>&lt;p&gt;Я на днях под влиянием книги «&lt;a href=&quot;https://bolknote.ru/knigi-proekt-sfera-80-tz-dla-proslogo)&quot;&gt;Сфера-80…&lt;/a&gt;», про которую недавно рассказывал, решил пофантазировать, как можно было&amp;nbsp;бы гипотетически расширить «Электронику МК-61», если&amp;nbsp;бы я, подобно герою книги, попал в&amp;nbsp;то время и&amp;nbsp;мне&amp;nbsp;бы довелось его разрабатывать.&lt;/p&gt;&lt;p&gt;Поскольку этот калькулятор изначально не&amp;nbsp;задумывался&amp;nbsp;для игр, однако для него написано более шестисот игр, которые были опубликованы, и&amp;nbsp;неизвестно сколько ещё пропало, мысли мои пошли в&amp;nbsp;сторону того, что именно я&amp;nbsp;бы добавил туда, чтобы на нём было интереснее играть.&lt;/p&gt;&lt;p&gt;Расширил набор команд двумя префиксами, в&amp;nbsp;другой раз покажу какими,&amp;nbsp;а&amp;nbsp;для тестирования, как водится, написал при помощи нейросети игру&amp;nbsp;— простой клон известной «Элиты». Для «МК-61» это не диковинка&amp;nbsp;— в&amp;nbsp;моём каталоге их четыре штуки, но тут новый уровень.&lt;/p&gt;&lt;p&gt;Игра поначалу получилась достаточно объёмной, и, чтобы сэкономить место на диске, а&amp;nbsp;заодно ускорить загрузку, я решил добавить к&amp;nbsp;расточительному шестнадцатеричному формату хранения программ что-то более компактное.&lt;/p&gt;&lt;p&gt;Вспомнил, конечно, про &lt;tt&gt;Base64&lt;/tt&gt;, а&amp;nbsp;также более редкий &lt;tt&gt;Base85&lt;/tt&gt;, но оказалось, что есть ещё чуть более экономный формат &lt;tt&gt;Base91&lt;/tt&gt;. Я, вроде, про него слышал, но крепко про него забыл. Все они, по сути, решают одну проблему&amp;nbsp;— кодируют бинарную информацию так, чтобы её можно было хранить внутри текстовых файлов.&lt;/p&gt;&lt;p&gt;Самый простой вариант&amp;nbsp;— шестнадцатеричная запись. Каждый байт превращается в&amp;nbsp;два символа от &lt;tt&gt;00&lt;/tt&gt; до &lt;tt&gt;FF&lt;/tt&gt;. Это очень удобно для человека: файл можно открыть в&amp;nbsp;редакторе, посмотреть и&amp;nbsp;при некотором опыте даже что-нибудь исправить. Но&amp;nbsp;за удобство приходится платить&amp;nbsp;— размер данных увеличивается ровно вдвое.&lt;/p&gt;&lt;p&gt;&lt;tt&gt;Base64&lt;/tt&gt; работает экономнее. Он собирает три байта, то есть 24 бита, и&amp;nbsp;превращает их в&amp;nbsp;четыре символа по шесть бит каждый. Отсюда и&amp;nbsp;название: шесть бит позволяют выбрать один из 64 символов. Размер файла при этом вырастает примерно на треть.&lt;/p&gt;&lt;p&gt;&lt;tt&gt;Base85&lt;/tt&gt; упаковывает четыре байта в&amp;nbsp;пять символов. Тут уже нет такого красивого соответствия битам, зато 85⁵ чуть больше 2³², поэтому любой четырёхбайтовый блок в&amp;nbsp;эти пять символов помещается. Накладные расходы уменьшаются до 25%.&lt;/p&gt;&lt;p&gt;Алгоритм, который обычно называют &lt;tt&gt;Base91&lt;/tt&gt;, на самом деле называется «&lt;a href=&quot;https://sourceforge.net/projects/base91/files/basE91/0.6.0/&quot;&gt;&lt;i&gt;basE91&lt;/i&gt;&lt;/a&gt;»&amp;nbsp;— именно так, с&amp;nbsp;заглавной «&lt;i&gt;E»&lt;/i&gt; посередине. Его написал Йоахим Хенке. В&amp;nbsp;качестве алфавита он взял почти все печатные символы &lt;i&gt;ASCII&lt;/i&gt;, кроме дефиса, апострофа и&amp;nbsp;обратной косой черты.&lt;/p&gt;&lt;p&gt;На&amp;nbsp;первый взгляд кажется, что Base91 должен просто брать некоторое количество бит и&amp;nbsp;переводить получившееся число в&amp;nbsp;систему счисления с&amp;nbsp;основанием 91. Но&amp;nbsp;подходящего целого количества бит тут нет: один символ вмещает чуть больше шести с&amp;nbsp;половиной бит.&lt;/p&gt;&lt;p&gt;Зато хорошо работают пары символов.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;двух символах &lt;tt&gt;Base91&lt;/tt&gt; гарантированно помещаются 13 бит, причём после этого остаётся ещё 89 незанятых комбинаций. Автор алгоритма решил их не выбрасывать.&lt;/p&gt;&lt;p&gt;Обычно очередная пара символов хранит 13 бит. Но&amp;nbsp;если значение этих бит попадает в&amp;nbsp;диапазон от 0 до 88, кодировщик прихватывает ещё один, четырнадцатый бит. Для каждого из 89 маленьких значений получается две версии: с&amp;nbsp;нулём и&amp;nbsp;единицей в&amp;nbsp;дополнительном бите. Декодер по получившемуся числу понимает, сколько бит надо забрать из входного потока&amp;nbsp;— 13 или 14.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;&lt;a href=&quot;https://github.com/bwaldvogel/base91/blob/main/src/main/java/de/bwaldvogel/base91/Base91.java&quot;&gt;исходном коде&lt;/a&gt; вся эта математика превращается в&amp;nbsp;очень короткую проверку:&lt;/p&gt;&lt;pre&gt;(v &amp;amp; 8191) &amp;gt; 88 ? 13 : 14&lt;/pre&gt;&lt;p&gt;Без объяснения числа «88» и&amp;nbsp;«8191» выглядят как магические константы. На&amp;nbsp;самом деле первое число это те самые 89 оставшихся комбинаций, только нумерация начинается с&amp;nbsp;нуля, а&amp;nbsp;«8191»&amp;nbsp;— это &lt;code dir=&quot;ltr&quot;&gt;2¹³ − 1&lt;/code&gt;, или тринадцать единиц в&amp;nbsp;двоичной записи для выделения тринадцати младших бит.&lt;/p&gt;&lt;p&gt;Из-за такого устройства размер результата зависит от содержимого. В&amp;nbsp;худшем случае &lt;tt&gt;Base91&lt;/tt&gt; добавляет около 23%, а&amp;nbsp;на данных с&amp;nbsp;большим количеством нулевых байтов накладные расходы могут уменьшаться примерно до 14%. Для обычного смешанного бинарного потока получается около 22,97%.&lt;/p&gt;&lt;p&gt;Если взять тысячу байтов, то без учёта заголовков и&amp;nbsp;переносов строк выйдет примерно так:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;шестнадцатеричный формат&amp;nbsp;— 2000 символов;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;Base64&lt;/tt&gt;&amp;nbsp;— 1336;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;Base85&lt;/tt&gt;&amp;nbsp;— 1250;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;Base91&lt;/tt&gt;&amp;nbsp;— обычно около 1230.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;То есть по сравнению с&amp;nbsp;&lt;tt&gt;Base85&lt;/tt&gt; выигрыш совсем небольшой&amp;nbsp;— около двадцати символов на килобайт. Зато по сравнению с&amp;nbsp;исходным шестнадцатеричным форматом файл уменьшается почти на 40%.&lt;/p&gt;&lt;p&gt;Для обычной программы «МК-61» размером 105 байтов цифры&amp;nbsp; такие: 210 символов в&amp;nbsp;шестнадцатеричном виде, 140 в&amp;nbsp;&lt;tt&gt;Base64&lt;/tt&gt;, примерно 132 в&amp;nbsp;&lt;tt&gt;Base85&lt;/tt&gt; и&amp;nbsp;около 129 в&amp;nbsp;&lt;tt&gt;Base91&lt;/tt&gt;. Всего три символа выигрыша у&amp;nbsp;&lt;tt&gt;Base85&lt;/tt&gt;, зато 81&amp;nbsp;— у&amp;nbsp;старого формата. На&amp;nbsp;одной программе можно было&amp;nbsp;бы не обращать внимания, но на большой игре и&amp;nbsp;целом каталоге разница постепенно накапливается.&lt;/p&gt;&lt;p&gt;У&amp;nbsp;меня программа получилась побольше&amp;nbsp;— несколько килобайт, мои расширения такое позволяют, поэтому я перед кодированием ещё и&amp;nbsp;сжимаю программу уже испробованным алгоритмом «&lt;i&gt;&lt;a href=&quot;https://bolknote.ru/all/mk-61s-binarnye-prilozheniya&quot;&gt;ZX0&lt;/a&gt;».&lt;/i&gt;&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.23@2x.webp&quot; alt=&quot;Код игры для «МК-61» в различных системах счисления: Base64, Base85 и Base91.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;51&quot; width=&quot;1000&quot; height=&quot;285&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Вот так выглядит половина сжатой и&amp;nbsp;закодированной «Элиты», половина, потому что из-за ограничений файловой системы она разбивается на 2 файла&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;i&gt;Добавлено позже:&lt;/i&gt;&amp;nbsp;один из читателей предложил вариант хранить программу в&amp;nbsp;бинарном виде. Я такой вариант отбросил в&amp;nbsp;самом начале, потому что мне больше нравилась идея всем управлять из текстового файла терминала, кроме того по расчётам тогда получалось, что в&amp;nbsp;один файл всё равно всё не уместится.&lt;/p&gt;&lt;p&gt;Но&amp;nbsp;я тогда не учитывал сжатие, плюс сама «Элита» была больше, я потратил немало токенов, чтобы её ускорить (первые версии рисовали экран секундами), а&amp;nbsp;по пути она ещё и&amp;nbsp;меньше стала. В&amp;nbsp;общем, эту идею точно надо было рассмотреть.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;итоге, от команд&amp;nbsp; &lt;tt&gt;ztart&lt;/tt&gt; и&amp;nbsp;&lt;tt&gt;zin&lt;/tt&gt; я избавился в&amp;nbsp;пользу одной команды &lt;tt&gt;load&lt;/tt&gt;, которая загружает сжатый заранее бинарный образ.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-i-base91</guid>
				<pubDate>Wed, 23 Sep 2026 16:15:13 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-i-base91#comment</comments>
			</item>
			<item>
				<title>Прескриптивизм и дескриптивизм</title>
				<link>https://bolknote.ru/all/preskriptivizm-i-deskriptivizm</link>
				<description>Я как-то не заметил, как начался мой переход от прескриптивизма к&amp;nbsp;дескриптивизму. Долгие годы я был непоследовательным прескриптивистом&amp;nbsp;— переучивал себя на литературную норму, поправлял всех вокруг, но легко прощал себе любые вольности обращения с&amp;nbsp;языком.&lt;p&gt;&lt;br&gt;&lt;span style=&quot;text-wrap-mode: initial;&quot;&gt;  

&lt;/span&gt;Мне вполне вольготно жилось в&amp;nbsp;этой позиции, но какое-то время назад я понял, что моё мировоззрение изменилось. Убеждение «вот так говорят, а&amp;nbsp;так не говорят» сменилось на «давайте делать язык богаче, а&amp;nbsp;не беднее». Не&amp;nbsp;заменять «одолжил» на «занял», «надел» на «одел», «из» на «с», «последний» на «крайний» и&amp;nbsp;так далее. Просто потому что это ведёт к&amp;nbsp;потере оттенков.&lt;span style=&quot;text-wrap-mode: initial;&quot;&gt;&lt;br&gt;&lt;br&gt;Я очень приветствую появление новых слов, кроме случая когда заимствования заменяют то, что уже существует («ред флаг» = «красный флаг») и&amp;nbsp;особенно меня радует появление новых слов, которые язык изобретает самостоятельно (прекрасный «воздухан» и&amp;nbsp;неуклюжее «жиза»).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: initial;&quot;&gt;Я до сих пор поправляю окружающих, но далеко не всех. Например, поправляю дочку, чтобы она говорила правильно, просто потому что литературная норма и&amp;nbsp;умение говорить ассоциируется с&amp;nbsp;профессионализмом, а&amp;nbsp;я ей желаю успешной профессиональной карьеры. Пока у&amp;nbsp;неё планы стать дизайнером интерьеров.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: initial;&quot;&gt;Не&amp;nbsp;факт, что лет через пять мы не будем общаться через речевые фильтры, которые будут поправлять все огрехи, синхронизируя губы, но личное общение, я уверен, всё равно не исчезнет.&lt;/span&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<guid isPermaLink="true">https://bolknote.ru/all/preskriptivizm-i-deskriptivizm</guid>
				<pubDate>Wed, 23 Sep 2026 09:09:44 GMT</pubDate>
				<comments>https://bolknote.ru/all/preskriptivizm-i-deskriptivizm#comment</comments>
			</item>
			<item>
				<title>«МК-61s»: однобайтовая кодировка</title>
				<link>https://bolknote.ru/all/mk-61s-odnobajtovaa-kodirovka</link>
				<description>&lt;p&gt;Сжег половину недельных токенов на задачу уменьшения размера прошивки для «&lt;i&gt;МК-61s&lt;/i&gt;». У&amp;nbsp;нас есть конфигурация, куда давно ничего не помещается, для нее я делал поддержку внешних запускаемых программ, но все равно из нее всё вываливается.&lt;/p&gt;&lt;p&gt;Поэтому на выходных начал делать две вещи, которые давно напрашивались,&amp;nbsp;— переход на однобайтовую кодировку и&amp;nbsp;выделение «&lt;i&gt;USB&lt;/i&gt;-диска» в&amp;nbsp;отдельное приложение. Хотя вторая задача оказалась инженерно сложнее, зато потребовала меньше моего участия&amp;nbsp;— я просто подключил одну из своих консолей к&amp;nbsp;ноутбуку, описал набор тестов и&amp;nbsp;ждал, пока нейросеть устранит все проблемы.&lt;/p&gt;&lt;p&gt;В&amp;nbsp;задаче перевода кодировании символов на один байт мне пришлось участвовать постоянно.&lt;/p&gt;&lt;p&gt;Для начала для чего это нужно. Для нескольких вещей.&lt;/p&gt;&lt;p&gt;Во-первых, в&amp;nbsp;прошивке достаточно много различных строк, которые приходится хранить. На&amp;nbsp;одном этом удалось сэкономить около килобайта. Во-вторых, у&amp;nbsp;меня ограниченные буферы редактирования. Тексты на русском в&amp;nbsp;Юникоде занимают по два байта на символ. В-третьих, внутренний «диск» небольшой&amp;nbsp;— всего 512 килобайт. И&amp;nbsp;хотя используется сжатие, программы, использующие один байт на символ, всё равно занимают меньше места.&lt;/p&gt;&lt;p&gt;Поэтому пришлось придумать свою кодировку. Я её назвал «&lt;i&gt;M8&lt;/i&gt;» («MK-61», 8 бит), но по сути это&amp;nbsp;— &lt;i&gt;CP1251&lt;/i&gt; с&amp;nbsp;добавленными специальными символами на позиции 0E…1F. Я выбрал как базу &lt;i&gt;CP1251&lt;/i&gt;, потому что у&amp;nbsp;большинства членов команды, а&amp;nbsp;также у&amp;nbsp;редких пользователей из сообщества&amp;nbsp;— «Винда», поэтому при работе в&amp;nbsp;терминале нам ничего не придётся перекодировать (специальные символы используются в&amp;nbsp;интерфейсе, поэтому в&amp;nbsp;терминал не попадают).&lt;/p&gt;&lt;div class=&quot;post-picture post-media-picture&quot;&gt;&lt;img class=&quot;post-media-image&quot; src=&quot;https://bolknote.ru/_pictures/bolknote/images/2026.09.22.webp&quot; alt=&quot;Таблица ASCII-кодов МК-61s: латиница, кириллица, цифры, знаки препинания и управляющие символы.&quot; decoding=&quot;async&quot; data-post-media-id=&quot;50&quot; width=&quot;1313&quot; height=&quot;801&quot; loading=&quot;lazy&quot;&gt;&lt;div class=&quot;post-caption&quot;&gt;Теперь у&amp;nbsp;«МК-61s» есть своя однобайтовая кодировка частично совместимая с&amp;nbsp;так называемой «CP1251», для краткости я её называю «M8»&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Файловая система, которая видна через «&lt;i&gt;USB&lt;/i&gt;-диск», при этом работает как и&amp;nbsp;раньше&amp;nbsp;— длинные имена и&amp;nbsp;содержимое файлов на лету преобразуются в&amp;nbsp;«Юникод» и&amp;nbsp;обратно. Поскольку для каждого файла у&amp;nbsp;нас хранится метаинформация, чтобы мы знали, чем его запускать, бинарные файлы от перекодировки не страдают.&lt;/p&gt;&lt;p&gt;У&amp;nbsp;меня есть идея поместить на свободные места все национальные символы, используемые внутри России&amp;nbsp;— места хватает, однако она разбивается о&amp;nbsp;сомнения, как поступить с&amp;nbsp;их отображением в&amp;nbsp;терминале. То&amp;nbsp;ли показывать там знак «вопроса», то&amp;nbsp;ли предусмотреть режим переключения терминала в&amp;nbsp;«Юникод». Пока отложил эту идею, всё равно пользователей таких символов пока не наблюдается.&lt;/p&gt;&lt;p class=&quot;article_tags&quot;&gt;
	Ключевые слова:
	&lt;a href=&quot;https://bolknote.ru/tags/webdev/&quot;&gt;программирование&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/elektronika-mk-61/&quot;&gt;Электроника МК-61&lt;/a&gt;, &lt;a href=&quot;https://bolknote.ru/tags/mk-61s-2/&quot;&gt;Ретроконсоль MK-61s&lt;/a&gt;&lt;/p&gt;</description>
				<dc:creator>Евгений Степанищев</dc:creator>
				<category>программирование</category>
				<category>Электроника МК-61</category>
				<category>Ретроконсоль MK-61s</category>
				<guid isPermaLink="true">https://bolknote.ru/all/mk-61s-odnobajtovaa-kodirovka</guid>
				<pubDate>Tue, 22 Sep 2026 09:05:01 GMT</pubDate>
				<comments>https://bolknote.ru/all/mk-61s-odnobajtovaa-kodirovka#comment</comments>
			</item>
		</channel>
	</rss>
