Электроника МК-61

MK-61s: обвязка на PicoCalc

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

Решил реализовать заведомо непрактичную, но давно засевшую у меня в голове идею — запустить внутри ретроконсоли «МК-61s» какую-нибудь нейросеть. Наверное месяц крутил эту мысль в голове, но ничего достойного реализации мне в голову не приходило, пока вчера ночью не осенило — надо сделать обвязку («харнесс») для программирования на языке «Электроника МК-61»!

Для этого я выбрал русскоязычную модель «Flourish-3M», у которой около трёх миллионов параметров и попробовал дообучить её на Nvidia B200 синтаксису «МК-61». 

Даже сеть таких скромных размеров в памяти ретроконсоли не поместилась бы, несмотря на то, что я выбрал самую мощную аппаратную платформу, которая у меня есть — «ПикоКалк», поэтому пришлось её квантировать до четырёх бит.

Так же я пробовал сети побольше с квантированием до двух бит, а так же несколько вариантов гибридного квантирования, по соотношению сообразительность/размер выиграла эта конфигурация.

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

На видеокарте NVIDIA B200 запущено три процесса Python, использующих почти всю память GPU.
Процесс обучения нейросети; большая часть памяти занята «Квеном», который помогал корректировать обучение

Чтобы ускорить матричные вычисления, пришлось использовать предвычисленные таблицы — LUT и оба ядра процессора (все остальные процессы в этот момент замирают), разогнанные с 125 до 250 МГц.

Несмотря на все усилия, скорость генерации невелика  — около 4,67 секунды на токен. Математического сопроцессора нет, всё считается ядрами центрального процессора.

На экране консоли отображено число 0,374666 — результат вычисления синуса угла 22 градуса программой, написанной ИИ Flourish-3M специально для калькулятора MK-61.
Игру эта сеть не напишет, ей бы с синусом справиться!

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

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

11 комментариев

«MK-61s»: ещё приложения

Может показаться, что я занялся другими проектами и совсем забыл про ретроконсоль «МК-61s». Это совершенно не так.

Моё молчание отчасти объясняется тем, что почти все токены я сейчас трачу на попытку сделать нормальную арифметику для «ПикоКалка» — хочется, чтобы сишный тип double вёл себя там, как в стандартном Си и при этом все операции с ним выполнялись быстро, а это непросто.

Тем не менее и другими вещами я тоже занимаюсь, в частности в коллекции «МК-61s» появились ещё три приложения, созданных с разными целями.

На экране калькулятора МК-61 отображаются ячейки таблицы с числовыми значениями, формулами и итоговой суммой.
Приложение для работы с таблицами на экране «ПикоКалка»

Первое — это приложение для работы с таблицами. Попытка ответить на вопрос: «А для чего я мог бы использовать эту ретроконсоль в реальной жизни?». Я участвую в проекте создания этой ретроконсоли для собственного развлечения, но иногда в команде возникает вопрос: а могло бы это пригодиться кому-то для чего-то полезного, помимо ностальгии?

На мой взгляд ответ получился удачным, на «ПикоКалке» приложением даже приятно пользоваться — из-за полноценной клавиатуры и большого экрана.

Формулы записываются в привычной для «МК-61» обратной польской записи. Например, чтобы перемножить количество из A2 и цену из B2, нужно ввести A2 В↑ B2 ×. На картинке два предмета по 125 дают 250. Меняешь количество или цену — зависимые ячейки пересчитываются. Формулу можно скопировать или протянуть вниз, относительные ссылки при этом сдвигаются.

Ссылку не обязательно набирать: можно выбрать нужную ячейку прямо в таблице. Есть и фиксация строки или столбца знаком доллара, как в больших электронных таблицах. Циклическая ссылка показывает ошибку, но не мешает считать независимые ячейки.

Экран консоли МК-61с с интерфейсом игры «Гонка»
Игра «Погоня», написанная с применением расширенных команд калькулятора

Следующая программа — игра «Погоня», написанная на языке калькулятора «МК-61» с расширенными командами.

Я давно хотел понять нельзя ли сделать на калькуляторе динамическую игру хоть с какой-то изометрией. Не скажу, что получилось очень здорово, но играть можно. Управление традиционное для калькулятора — переключение режимов «Г», «ГРД» и «Р».

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

Даже в динамике не очень очевидно, что происходит на экране, но ориентироваться помогает нижняя метка: она указывает свободный путь, к которому надо подрулить. Графика тут довольно условная, зато её мог бы осилить обычный сегментный экран «Электроники».

Экран консоли МК-61с с интерфейсом игры «Лодраннер»
Игра «Лодраннер», опять-таки написанная с применением расширенных команд калькулятора

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

У «МК-61s» есть скриптовый язык, который называется «M61», у него простой и относительно бедный синтаксис, но его плюс в том, что он как клей может скреплять между собой несколько разных программ. Логику опроса клавиатуры я вывел именно туда — ввёл новую конструкцию, запускающую указанные подпрограммы, при нажатии и отпускании клавиш. Эти подпрограммы меняют содержимое регистров калькулятора, таким образом сообщая программе что нажато на клавиатуре.

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

От преследователя можно уйти, прожигая пол слева или справа. Герой через такую дырку падает на этаж ниже, а враг застревает. Через четыре секунды пол восстанавливается, и пойманный враг возвращается к месту старта. Бесконечно дырявить всё вокруг нельзя: одновременно открыт только один прожиг, лестницы и нижний этаж защищены.

1 комментарий

Гомер Симпсон и Великая теорема Ферма

На школьной доске Гомер Симпсон выводит уравнения, намекающие на опровержение Великой теоремы Ферма.
Гомер Симпсон пишет программу для калькулятора «Электроника МК-61»

Братишка сегодня рассказал, что «Симпсонах» как-то упоминалась Великая теорема Ферма в виде очень нетривиальной шутки.

Смысл теоремы в том, что для целых степеней n > 2 уравнение xⁿ + yⁿ = zⁿ не имеет целочисленных решений.

В сериале Гомер пишет на доске 3987¹² + 4365¹² = 4472¹². Серия вышла в 90-х и если взять заграничный инженерный калькулятор тех годов, то можно легко убедиться, что равенство выполняется. В этом виновата ошибка округления, которую калькуляторы тех лет, как правило, отобразить не могли. Так что можно было разыграть своих друзей-математиков.

Разумеется у меня возник вопрос — получится ли равенство, если вычислять то же самое на ретроконсоли «MK-61s»? Для этого я написал небольшую программу, которую видно на рисунке с Гомером.

На экране калькулятора Электроника МК-61 отображаются числа 92, 37 и 4471993, рядом видна надпись "Электроника МК-61 Classic".
Слева — возведение в степень трёх чисел, сложение и вычитание, справа — возведение в степень, сложение и нахождения корня 12-й степени

Ответа на аппаратном калькуляторе я его дождаться не смог, очень уж медленно, запустил в эмуляторе и там теорему Ферма опровергнуть не удалось — ни программой на доске, ни в варианте с вычитанием правой части из левой.

Советского математика Гомер обмануть бы не смог!

Добавлено: в комментариях справедливо указали, что вычисляется на самом деле 3987¹² + 4365¹² + 12, всё верно. Это я уже по привычке пытаюсь сделать любую программу меньше. Тут нейросеть предложила короткий способ снять число 12 со стека, я согласился, потому что при вычислении корня 12-й степени это значения не имеет.

12 комментариев

«Электроника МК-61»: область Ms

Зелёная плата микрокалькулятора Электроника МК-61 с дорожками, контактами и надписью "Ms".
Будущая плата для чтения внутренностей калькулятора

Внутри калькулятора «Электроника МК-61» есть своя терра инкогнита — территория, на которую практически не ступала нога советского программиста. Речь, конечно, об Ms — дополнительной области памяти, доступ к части которой в серийном «МК-61» возможен только при помощи хаков.

В «МК-61s» я доделал команды для работы с ней, которые проектировщики не реализовали, но меня эта область памяти всё равно манит.

Во-первых, очень хотелось бы найти какой-то обходной путь, который позволит с ней работать без модификации прошивки калькулятора. Не исключено, что такой способ удастся подобрать при помощи нейросетей.

Во-вторых, не исключено, что там образовываются случайные числа, которые можно было бы прочитать и использовать для того, чтобы потом использовать их для генерации серий случайных чисел. Для «МК-61» существует точный аппаратный эмулятор и в нём эта область на старте заполнена нулями, но мало ли…

Случайные числа это проблема для «МК-61» — генератор после включения всегда генерирует одно и то же число. Наверное это неважно для расчётов, но для игр настоящая катастрофа.

В общем, хочу в эту тему погрузиться поглубже. Для этого я списался с Сергеем Фроловым, автором статьи «Внедрение в архитектуру советских программируемых калькуляторов „Электроника МК-52“», чтобы получить у него схему платы, которую он разработал для подобных исследований и заказал на «Авито» калькулятор «МК-52» — аппаратно он очень близок к «МК-61».

У Сергея оказалась дополнительная плата, которую он выслал абсолютно бесплатно. Плата уже приехала, компоненты к ней тоже скоро приедут. Собрать всё воедино согласился Алексей Сугоняев, член команды разработки ретроконсоли «МК-61s». Спасибо Сергею и Алексею, надеюсь, эксперименты принесут какие-нибудь интересные результаты!

5 комментариев

MK-61s внутри PicoCalc

Клавиатура MK-61s с экраном, отображающим меню и координаты X, Y, Z, T, X1, и надпись "Шаг 0/10 шагов".
Рендер интерфейса «МК-61s» на экране «ПикоКалка», в жизни выглядит так же, но смартфон не фокусируется нормально на экране

На работе на прошедший в сентябре день рождения подарили «ПикоКалк» — набор для сборки кибердеки с «Распберри» внутри. Заказали из Китая заранее, но ехал долго, поэтому вручили только в эту пятницу.

Вчера адаптировал под него интерфейс «МК-61s». У меня давно ощущение, что экран у текущего железа маловат, хотелось развернуться, посмотреть как она может выглядеть с большим экраном и полноразменой клавиатурой, поэтому я загорелся идеей адаптации.

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

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

Сейчас «МК-61s» чувствует себя внутри довольно естественно, только надо решить что делать с играми — шахматами, «Элизой» и другими, они на таком экране смотрятся очень уж мелко. Надо либо как-то научиться их хорошо масштабировать, либо каким-то образом поменять шрифт, ещё не решил.

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

2 комментария

МПВ-2: авиационный «МК-61»

Вы все знаете о моём увлечении калькулятором «Электроникой МК-61», а точнее — ретроконсолью по его мотивам. Недавно в тематической группе попалась ссылка на редкое устройство, мимо которого я пройти не мог. Что удивительно, информация о нём совершенно не ищется, даже эта самая ссылка не находится.

Речь о «МПВ-2» — малогабаритном программируемом вычислителе на базе того самого «МК-61». По описанию владельца, это опытное изделие, сделанное по заказу военной авиации. Небольшую заметку о своей находке он опубликовал на «Полигоне призраков» ещё в январе 2018 года и выложил фотографии.

Вычислитель МПВ-2 с клавиатурой МК-61, зелёным основным индикатором и двумя красными индикаторами на открытом журнале.
МПВ-2. Над обычным индикатором «МК-61» — ещё два, для параметра и номера задачи

Корпус у «МПВ-2» больше, чем у обычного «МК-61»: над основным индикатором разместили ещё два. Один показывает номер задачи, другой — обозначение параметра, который нужно ввести или посмотреть. Например, H — высота, V — скорость. Так не приходится вспоминать по порядковому номеру, какое значение калькулятор ждёт сейчас.

Программы хранятся в сменных модулях памяти — СПЗУ. У автора заметки их два: один с общештурманскими задачами, второй с задачами для конкретного типа самолёта. На одной из инструкций видна надпись «для изделия Т-8», на другой — «для решения общештурманских задач».

Два чёрных сменных модуля памяти МПВ-2 с оранжевыми разъёмами на деревянном столе.
Два сменных модуля программ — СПЗУ

Идея сменных программ мне знакома по «МК-52» с его внешними блоками ПЗУ, но здесь, судя по описанию, всё устроено иначе. Дополнительный контроллер читает команды из модуля и управляет калькулятором, имитируя нажатия клавиш!

Продумана и обратная связь: контроллер следит за несколькими сегментами индикатора «МК-61». Видимо, так он определяет, когда можно «нажать» следующую клавишу. Разумное решение — из моего опыта, у этих калькуляторов иногда плохо нажимаются кнопки, да и быстродействие невысокое.

Паспорта и инструкции вычислителя МПВ-2 на фоне электрической схемы. На инструкциях указан 1991 год.
Документация к вычислителю. Инструкции датированы 1991 годом

Изготавливалось устройство Фрунзенским производственным объединением по выпуску средств вычислительной техники, ФПО СВТ. Разработчик на брошюрах обозначен как «ТИВС». Инструкции датированы 1991 годом. Ещё на там же есть название Воронежского высшего военного авиационного инженерного училища — возможно они размещали заказа или там была опытная эксплуатация.

Автор заметки предполагает, что до серии дело не дошло — возможно, из-за распада СССР. Экземпляр к нему попал уже потрёпанным: часть индикатора почти не работала, клавиатура сильно дребезжала, пластик пострадал при хранении. Продолжения заметки нет, так что неизвестно, удалось ли его восстановить.

Я недавно фантазировал, как можно было бы расширить «МК-61», если бы довелось разрабатывать его в те годы. А тут обнаруживается вполне реальная доработка: сменные программы, дополнительные индикаторы и контроллер, который сам нажимает кнопки. Очень хотелось бы узнать, как она работала на практике и чем закончилась эта разработка.

Все фотографии — из альбома автора исходной заметки.

5 комментариев

«MK-61s»: SIMD

Было время, когда меня захватила идея реализовать поддержку «Юникода» на «Флиппере Зеро». Я много тогда над этим работал и одна из вещей, которую я тогда делал — пытался ускорить измерение длины строки в кодировке «ЮТФ-8». Не то чтобы это было реальной проблемой, но мне хотелось этим заняться, вот я и занимался.

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

Сейчас я занят ускорением работы встроенных в ретроконсоль «МК-61s» языков программирования — Бейсика и Фокала и вспомнил об этих инструкциях, так как процессор «MK-61s» их тоже поддерживает.

Чтобы измерять оптимизации я, как это у меня водится, портировал по эту задачу на ретроконсоль очередную игру. На этот раз шахматы Алана Тьюринга и Дэвида Чемперноуна (есть восстановленный алгоритм по мотивам их идей 1948 года). Нейросеть их перевела на Бейсик и это очень хороший тест, так как там очень много вычислений — первая версия делала ход за 162 секунды.

На черно-белом фото изображено устройство МК-61с с надписью «SIMD» сбоку.
Шахматы Алана Тьюринга на виртуальном экран ретроконсоли «MK-61s»

Я занялся ускорением, так как по предложению одного из членов нашей команды, Алексея Сугоняева, перевёл интерпретаторы Бейсика и Фокала в трансляторы, формирующие специально разработанный байт-код, который затем и выполняется. Оказалось, что я неправильно понял его идею, но дело уже сделано, и этот подход принёс неожиданные преимущества.

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

Все низковисящие плоды в плане оптимизации я уже сорвал, остались довольно сложные вещи, типа джит-компиляции, но перед этим я хочу убедиться, что сделаны все более простые вещи. Вот тут я и вспомнил про SIMD.

«Юникода» в «MK-61s» уже нет — я недавно перевёл код на однобайтовую кодировку, но тем не менее есть что ускорить. Эксперименты показали, что эффект есть при трансляции, когда Бейсик и Фокал ищут пробельные символы и переводы строки, что немного ускоряет холодный старт программ:

ПрограммаВремени на компиляцию меньше
Шахматный поиск, Бейсик0,47%
Вступление High Noon, Бейсик1,32%
Статистика, Фокал1,38%

К слову, оптимизированная версия Бейсика сейчас делает на холодную первый ход в шахматах за 104 секунды, а при прогретых кешах — за 87,5. Это пока всё равно медленно, но куда лучше 162 секунд, которые были в начале.

Оставить комментарий

«MK-61s»: самораспаковка в 105 ячейках

Что-то никак не оставляла меня мысль сделать более «честную» самораспаковывающуюся программу — без дополнительного регистра и чтобы умещалась в стандартную память калькулятора. Чтобы она работала в том гипотетическом сценарии, если бы авторы «Электроники МК-61» всё-таки позаботились доделать инструкции для работы с дополнительной памятью Ms.

В прошлый раз игра вместе с распаковщиком занимала диапазон в 110 ячеек, включая нестандартные адреса, которые есть только в ретроконсоли. Теперь весь образ помещается в 105 ячеек, нестандартный регистр Rf не используется, а начальные значения регистров устанавливает сама программа.

Больше всего удалось убрать из игровой части. Там были четыре отдельных вывода значений R1, R2, R3 и R9, каждый из двух команд: чтение регистра и остановка. Такие же выводы уже есть в распаковываемой части, нейросеть переназначила клетки карты на них. Это освободило восемь байт.

Сообщения о результате игры — числа 30 и 20 — теперь вводятся командами цифр. Каждый такой вывод стал на одну команду длиннее, зато для самих чисел больше не нужны регистры. Из восьми освобождённых байтов потратил два, после чего неизменяемый хвост игры сократился с 27 до 21 байта.

У распаковщика удалось убрать три команды: 8, x→П0 и X↔Y. Начальное значение счётчика теперь закодировано в первом числовом блоке упакованной программы. При обменах оно само попадает в R0, поэтому вводить и сохранять восьмёрку отдельными командами больше не требуется.

Чтобы отказаться от Rf, пришлось перенести хранившийся в нём шаг распаковки в Rd — регистр, где во время игры хранится здоровье. Во время распаковки здоровье ещё не нужно, а перед запуском игры его устанавливают две команды: 5 и x→Пd. Три команды ушло, две добавилось, в итоге распаковщик сократился с 20 до 19 байт.

Итого из игры и распаковщика удалось убрать семь команд. В новом расположении между распаковываемой частью и игровыми процедурами оставлены две пустые ячейки. Поэтому занимаемый диапазон сократился на пять ячеек: со 110 до 105.

Подготовку регистров удалось поместить в свободные места первых 63 ячеек. С адреса 08 выполняется цикл: в Rc записывается 9, затем значение Rc + 10 косвенно сохраняется в регистр с номером Rc, а счётчик уменьшается. Так R9–R1 получают необходимые для игры числа 19–11. Затем устанавливаются остальные начальные значения и адреса игровых процедур.

Эти значения перед распаковкой уже находятся в регистрах. Первый К ПВ сохраняет значения R0–R8 в Ms, последний возвращает их обратно. R9, Ra и Rb остаются на месте. Отдельных команд сохранения и восстановления не понадобилось. А сам код подготовки стирается при распаковке — его место занимает игра.

Для перехода к распаковщику нейросеть приспособила игровой переход в ячейке 35, заменив его на БП. До распаковки следующий байт содержит адрес 86. После распаковки там оказывается код 65 — П→x5, который для БП служит адресом 65. Поэтому процедура сбора детали теперь размещена именно там, для этого пришлось перед ней оставить две пустые ячейки. Один переход служит сначала подготовке, потом игре.

Для запуска нужно записать в память 79 ненулевых байт кода и данных. Сюда входит и код подготовки игровых регистров. Остальные ячейки должны быть обнулены. После распаковки игра размещается по адресам 00–85, распаковщик — в 86–104. Запуск начинается с 08, а после распаковки управление возвращается в 00. Ниже показано выполнение всего этого варианта.

Ms
Регистры


Осталась одна нерешённая проблема: используется 63 байта Ms, доступных в «MK-61s», тогда как в исходном калькуляторе эта область рассчитана на 56 байт. Нынешнему распаковщику нужны девять блоков этой памяти, а в исходном калькуляторе их восемь. Поэтому для работы в таком гипотетическом «МК-61» программу ещё придётся доделать.

Оставить комментарий

«MK-61s»: самомодифицирующиеся программы

У меня была давно идея попробовать сделать самомодифицирующуюся программу на программируемом калькуляторе «Электроника МК-61». Ничего готового для этого там нет, но я надеюсь, что используя различные недокументированные возможности, этого можно добиться.

Своей цели я ещё не достиг, хоть и продолжаю пытаться, а пока экспериментирую с командами доступа в область Ms — это недоделанные команды, которые я разблокировал в ретроконсоли «MK-61s».

Там всего две команды — одна обменивает Ms с содержимым памяти, вторая с регистрами. Таким образом вырисовывается путь — меняем что-то в регистрах, выгружаем в Ms, оттуда — в память. Так как в «MK-61s» на один регистр больше, то и Ms пришлось расширить — теперь там может храниться не 56 шагов программы, как в настоящем калькуляторе, а 63.

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

Например, число 690050,68 после такого переноса даёт последовательность кодов 68 50 00 69 50 00. Для калькулятора это уже программа: прочитать регистр 8, остановиться, ввести ноль, прочитать регистр 9, снова остановиться и ввести ноль. Кроме этих шести байтов у каждого блока есть ещё один служебный байт, который команда обмена с регистрами не меняет. Его можно заранее заполнить нужной командой.

Теперь самое интересное: если вычесть из этого число 10000,01, получим 680050,67, а в памяти — 67 50 00 68 50 00. Команды остались прежними, но оба номера регистров уменьшились на единицу. Продолжая вычитать ту же константу, можно получить целую серию похожих участков программы.

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

Для этого я взял игру «The Land of Psycho Lamers» и переставил её код так, чтобы повторяющиеся участки укладывались в вышеупомянутый шаблон. Получился распаковщик длиной всего двадцать байт: он берёт начальное число и шаг, заполняет девять регистров, а затем двумя обменами переносит результат в программную память. Так восстанавливаются 63 байта команд.

Правда, тут надо честно посчитать всё остальное: исходные числа, заранее расставленные служебные байты и код подготовки. С учётом этого выигрыш получился скромным — 75 загружаемых байт против 80 у исходной игры. Это если в обоих случаях не загружать нули. Сам текстовый файл стал даже больше, да и занимаемый диапазон программной памяти вырос. Так что до практичного архиватора далеко, но работающая игра, которая сама собирает часть своего кода из чисел, уже получилась.

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

Ms

Оставить комментарий

«Элита» на «MK-61s»

Как и во всех остальных случаях, специально чтобы оттестировать новые команды, я перенёс на «MK-61s» игру. У меня это уже проверенный метод для разных интерпретаторов, который даёт хорошие результаты — и баги становится проще найти, и оценить насколько удобно использовать сами команды

На этот раз, я об этом уже писал, выбрал «Элиту». Те, у кого был в детстве какой-либо клон «Спектрума», думаю, очень хорошо её знают.

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

Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.
Заставка «Элиты» на двенадцатиразрядном индикаторе

Как первый результат расширенных команд вывода на экран — на индикаторе теперь можно вывести заставку и подписать, что игра ожидает нажатия кнопки C/П для старта. Всё это выводится в стандартных двенадцати знакоместах, просто нестандартным образом.

Внутри запрограммирована небольшая вселенная из 256 миров. Можно торговать шестью товарами — едой, рудой, топливом, электроникой, золотом и оружием, — заправляться, ремонтировать корабль, покупать ракеты и улучшать лазер. Между мирами встречаются пираты, а иногда и те самые таргоиды, которые встречались в оригинальной игре.

Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.
Имя начального мира

Названия миров я составляю из шестнадцати букв, которые можно более-менее узнаваемо изобразить сегментами. Например, начальный мир называется «dAdnAA». Получается что-то вроде технических обозначений, но от названий космических объектов благозвучие не требуется.

Имена при этом несут двойную функцию. Они связаны с устройством мира, в том числе с торговлей, поэтому постепенно можно научиться узнавать полезные места.

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

Как и любая языковая модель, GigaChat не обладает собственным мнением и не транслирует мнение своих разработчиков.
Цена еды: слева номер товара, справа цена, про «СП» я уже рассказывал

С управлением получилось по-калькуляторному: вводишь номер действия и нажимаешь С/П. Например, 10 показывает цену еды, 30 покупает одну единицу, а 40 продаёт. Для остальных товаров меняется последняя цифра. Во время ввода предыдущая картинка остаётся на экране, набираемый код её не затирает.

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

К сожалению, иногда генеративные языковые модели могут создавать некорректные ответы, основанные на открытых источниках.
Состояние корпуса: шкала и точное значение

Бои пошаговые. За один ход выбираешь и манёвр, и действие: сблизиться или отойти, выстрелить из лазера или пустить ракету, восстановить щит или готовить бегство. Это снова две цифры: первая отвечает за движение, вторая — за действие. Можно, например, отходить и одновременно заряжать прыжок.

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

Дистанция имеет значение: лазер не достаёт до далёкой цели, а вблизи стреляет сильнее. Кроме того, он ещё и греется. Ракет мало, щит держит конечно количество ударов, так что бесконечно повторять одну и ту же команду не получится.

Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.
Схема дистанции в бою: свой корабль и противник

Для расстояния я сделал отдельную схему: U («you») обозначает наш корабль, H («hostile») — противника, а точка отмечает границу, до которой достаёт лазер. Так посмотреть приборы или выбрать цель можно без расходования хода.

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

Генеративные языковые модели не обладают собственным мнением — их ответы являются обобщением информации, находящейся в открытом доступе.
Носитель и дроны на одном индикаторе

Маленькие кольца слева показывают живых дронов. Правее — выбранная цель и её оставшаяся броня. Для носителя это H, для дрона — его номер. То есть даже в двенадцать знакомест помещаются несколько противников, выбор цели и число, которое помогает решить, стоит ли тратить на неё ракету.

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

Победу я обозначил надписью «YES, CLEAr» . За победу дают награду, после сражения можно закончить перелёт и вернуться к торговле.

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

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

Игра и короткая инструкция лежат в репозитории. Нужна свежая прошивка с новыми командами; открываешь папку ELITE на устройстве, закрываешь памятку и нажимаешь С/П. Пока не решил стоит ли делать сохранения. С одной стороны это логичный следующий шаг, с другой стороны уже слишком далеко отходит от исходной идеи.

9 комментариев

«МК-61s»: два новых набора команд

Как я писал два дня назад, мне стало интересно пофантазировать на тему, как бы я расширил калькулятор «Электроника МК-61», если бы мне поручили доработать его под написание игр. Я решил, что нарастил бы ему память и позволил бы программисту гибче управлять выводом на экран.

Правда, я думал, что добавлю всего несколько команд, заняв неиспользуемые коды калькулятора, но когда начал писать программу для теста, оказалось, что набор надо расширять серьёзно, иначе быстродействие программ будет крайне низким, «МК-61» и так-то производительностью не отличается.

Поэтому пришлось расширять команды по префиксному типу — код 1F используется как префиксный для работы с новыми банками памяти, а 2F — для работы с экраном.

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

Поскольку экран «МК-61» заменить в те годы было не на что, я бы оставил его тем же, но сделал бы две вещи.

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

Во-вторых, позволил бы программисту управлять каждым сегментом двенадцатиразрядного индикатора. Это даёт возможность выводить какое-то подобие букв и рисунков. Весь алфавит так не выведешь, но некоторые буквы и знаки — запросто.

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

И, конечно, стоит подумать об расширении памяти. Тут действительно настоящая проблема. Ретроконсоль «МК-61s» уже давно умеет в специальном режиме добавлять к традиционным 105 байтам ещё семь практически без нарушения обратной совместимости, а недавно в ней появились даже новые команды для работы с областью памяти Ms, которая была предусмотрена в калькуляторе «Электроника МК-61», но ранее не использовалась. Однако и этого всё равно недостаточно.

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

В итоге в расширенном режиме теперь доступно: 112 байт обычной памяти, резерв Ms в 63 байта (в обычном калькуляторе там 56 байт, но тут пришлось расширить из-за добавленного регистра Rf, который есть в «MK-61s»), плюс 31 банк памяти по 112 байт каждый. Всего 3647 байт.

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

36 комментариев

«МК-61s» и Base91

Я на днях под влиянием книги «Сфера-80…», про которую недавно рассказывал, решил пофантазировать, как можно было бы гипотетически расширить «Электронику МК-61», если бы я, подобно герою книги, попал в то время и мне бы довелось его разрабатывать.

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

Расширил набор команд двумя префиксами, в другой раз покажу какими, а для тестирования, как водится, написал при помощи нейросети игру — простой клон известной «Элиты». Для «МК-61» это не диковинка — в моём каталоге их четыре штуки, но тут новый уровень.

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

Вспомнил, конечно, про Base64, а также более редкий Base85, но оказалось, что есть ещё чуть более экономный формат Base91. Я, вроде, про него слышал, но крепко про него забыл. Все они, по сути, решают одну проблему — кодируют бинарную информацию так, чтобы её можно было хранить внутри текстовых файлов.

Самый простой вариант — шестнадцатеричная запись. Каждый байт превращается в два символа от 00 до FF. Это очень удобно для человека: файл можно открыть в редакторе, посмотреть и при некотором опыте даже что-нибудь исправить. Но за удобство приходится платить — размер данных увеличивается ровно вдвое.

Base64 работает экономнее. Он собирает три байта, то есть 24 бита, и превращает их в четыре символа по шесть бит каждый. Отсюда и название: шесть бит позволяют выбрать один из 64 символов. Размер файла при этом вырастает примерно на треть.

Base85 упаковывает четыре байта в пять символов. Тут уже нет такого красивого соответствия битам, зато 85⁵ чуть больше 2³², поэтому любой четырёхбайтовый блок в эти пять символов помещается. Накладные расходы уменьшаются до 25%.

Алгоритм, который обычно называют Base91, на самом деле называется «basE91» — именно так, с заглавной «E» посередине. Его написал Йоахим Хенке. В качестве алфавита он взял почти все печатные символы ASCII, кроме дефиса, апострофа и обратной косой черты.

На первый взгляд кажется, что Base91 должен просто брать некоторое количество бит и переводить получившееся число в систему счисления с основанием 91. Но подходящего целого количества бит тут нет: один символ вмещает чуть больше шести с половиной бит.

Зато хорошо работают пары символов.

В двух символах Base91 гарантированно помещаются 13 бит, причём после этого остаётся ещё 89 незанятых комбинаций. Автор алгоритма решил их не выбрасывать.

Обычно очередная пара символов хранит 13 бит. Но если значение этих бит попадает в диапазон от 0 до 88, кодировщик прихватывает ещё один, четырнадцатый бит. Для каждого из 89 маленьких значений получается две версии: с нулём и единицей в дополнительном бите. Декодер по получившемуся числу понимает, сколько бит надо забрать из входного потока — 13 или 14.

В исходном коде вся эта математика превращается в очень короткую проверку:

(v & 8191) > 88 ? 13 : 14

Без объяснения числа «88» и «8191» выглядят как магические константы. На самом деле первое число это те самые 89 оставшихся комбинаций, только нумерация начинается с нуля, а «8191» — это 2¹³ − 1, или тринадцать единиц в двоичной записи для выделения тринадцати младших бит.

Из-за такого устройства размер результата зависит от содержимого. В худшем случае Base91 добавляет около 23%, а на данных с большим количеством нулевых байтов накладные расходы могут уменьшаться примерно до 14%. Для обычного смешанного бинарного потока получается около 22,97%.

Если взять тысячу байтов, то без учёта заголовков и переносов строк выйдет примерно так:

  • шестнадцатеричный формат — 2000 символов;
  • Base64 — 1336;
  • Base85 — 1250;
  • Base91 — обычно около 1230.

То есть по сравнению с Base85 выигрыш совсем небольшой — около двадцати символов на килобайт. Зато по сравнению с исходным шестнадцатеричным форматом файл уменьшается почти на 40%.

Для обычной программы «МК-61» размером 105 байтов цифры  такие: 210 символов в шестнадцатеричном виде, 140 в Base64, примерно 132 в Base85 и около 129 в Base91. Всего три символа выигрыша у Base85, зато 81 — у старого формата. На одной программе можно было бы не обращать внимания, но на большой игре и целом каталоге разница постепенно накапливается.

У меня программа получилась побольше — несколько килобайт, мои расширения такое позволяют, поэтому я перед кодированием ещё и сжимаю программу уже испробованным алгоритмом «ZX0».

Код игры для «МК-61» в различных системах счисления: Base64, Base85 и Base91.
Вот так выглядит половина сжатой и закодированной «Элиты», половина, потому что из-за ограничений файловой системы она разбивается на 2 файла

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

Но я тогда не учитывал сжатие, плюс сама «Элита» была больше, я потратил немало токенов, чтобы её ускорить (первые версии рисовали экран секундами), а по пути она ещё и меньше стала. В общем, эту идею точно надо было рассмотреть.

В итоге, от команд  ztart и zin я избавился в пользу одной команды load, которая загружает сжатый заранее бинарный образ.

3 комментария

«МК-61s»: однобайтовая кодировка

Сжег половину недельных токенов на задачу уменьшения размера прошивки для «МК-61s». У нас есть конфигурация, куда давно ничего не помещается, для нее я делал поддержку внешних запускаемых программ, но все равно из нее всё вываливается.

Поэтому на выходных начал делать две вещи, которые давно напрашивались, — переход на однобайтовую кодировку и выделение «USB-диска» в отдельное приложение. Хотя вторая задача оказалась инженерно сложнее, зато потребовала меньше моего участия — я просто подключил одну из своих консолей к ноутбуку, описал набор тестов и ждал, пока нейросеть устранит все проблемы.

В задаче перевода кодировании символов на один байт мне пришлось участвовать постоянно.

Для начала для чего это нужно. Для нескольких вещей.

Во-первых, в прошивке достаточно много различных строк, которые приходится хранить. На одном этом удалось сэкономить около килобайта. Во-вторых, у меня ограниченные буферы редактирования. Тексты на русском в Юникоде занимают по два байта на символ. В-третьих, внутренний «диск» небольшой — всего 512 килобайт. И хотя используется сжатие, программы, использующие один байт на символ, всё равно занимают меньше места.

Поэтому пришлось придумать свою кодировку. Я её назвал «M8» («MK-61», 8 бит), но по сути это — CP1251 с добавленными специальными символами на позиции 0E…1F. Я выбрал как базу CP1251, потому что у большинства членов команды, а также у редких пользователей из сообщества — «Винда», поэтому при работе в терминале нам ничего не придётся перекодировать (специальные символы используются в интерфейсе, поэтому в терминал не попадают).

Таблица ASCII-кодов МК-61s: латиница, кириллица, цифры, знаки препинания и управляющие символы.
Теперь у «МК-61s» есть своя однобайтовая кодировка частично совместимая с так называемой «CP1251», для краткости я её называю «M8»

Файловая система, которая видна через «USB-диск», при этом работает как и раньше — длинные имена и содержимое файлов на лету преобразуются в «Юникод» и обратно. Поскольку для каждого файла у нас хранится метаинформация, чтобы мы знали, чем его запускать, бинарные файлы от перекодировки не страдают.

У меня есть идея поместить на свободные места все национальные символы, используемые внутри России — места хватает, однако она разбивается о сомнения, как поступить с их отображением в терминале. То ли показывать там знак «вопроса», то ли предусмотреть режим переключения терминала в «Юникод». Пока отложил эту идею, всё равно пользователей таких символов пока не наблюдается.

Оставить комментарий

«МК-61s»: TinyBASIC и High Noon

На днях решил навести порядок в высокоуровневых языках программирования внутри ретроконсоли «MK-61s». Там внутри сейчас аж три языка — «Бейсик», «Фокал» и собственный язык, который постепенно образовался из системы команд встроенного терминала.

Сначала я попытался сократить размер интерпретаторов, упростив синтаксический парсер, а потом занялся ревизией самих языков.

Начал с «Бейсика». Тот диалект, который сейчас используется, это реализация «Palo Alto Tiny BASIC v3» Ли-Чэнь Вана 1977 года — не побитовая эмуляция исторического интерпретатора, а компактный совместимый диалект с математикой и доступом к регистрам «МК-61».

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

И чтобы протестировать «Бейсик» более тщательно, я решил портировать игру «High Noon», точнее свой же порт, который я в 2020 году перевёл на «Фортран».

Эту игру написал американский школьник Крис Гайло из школы Сайоссета на Лонг-Айленде. Исходный текст датирован 9 декабря 1970 года и работал в системе коллективного доступа компании «Call-a-Computer». Пользователь общался с ней через телетайп, так что никакой графики в игре не было — только медленно печатающийся текст. Игра понравилась настолько, что её поместили в общую библиотеку системы.

По нынешним меркам это совсем простая игра.

Дело происходит на Диком Западе. Вас вызывает на дуэль ковбой-бандит Чёрный Барт. В начале противники стоят в ста шагах друг от друга, у каждого по четыре патрона, а меткость считается одинаковой. На расстоянии ста шагов попасть невозможно, в упор — невозможно промахнуться. Чем ближе вы подходите, тем выше ваши шансы, но ровно настолько же растут шансы Барта.

Игра High Noon на Bейсике: выбор хода, стратегия сближения с Черным Бартом и результат стрельбы.
Начало игры, список ходов и первые шаги к Чёрному Барту. Тут и дальше я склеил по три экрана для наглядности
Целиком игра в одну программу на местном языке «TinyBASIC» не поместилась: размер исходника у нас ограничен 3584 байтами. Пришлось разделить её на четыре части — вступление, ход игрока, ход Барта и награду. Все четыре программы лежат в одной папке, вход в которую запускает программу autoexec.m61 — такую схему я позаимствовал у сидиромов. Программа пишется на вышеупомянутом языке, выросшем из языка терминала.

autoexec.m61 работает дирижёром: запускает нужную часть, а состояние игры передаётся между ними через регистры «МК-61», у него есть такой синтаксис.

Заодно в папке игры появился свой узкий пиксельный шрифт. Сценарий загружает его перед стартом и возвращает прежний при выходе. Без этого длинные английские фразы просто не помещались бы на экране 192×64 (игра запускается только на консоли с графическим экраном).

В показанной партии я в основном шёл вперёд по десять шагов. Барт тоже приближался, несколько раз стрелял и в конце концов остался без патронов. Потом он умудрился пройти мимо меня — расстояние стало минус три шага. Эту странность исходной программы я тоже честно сохранил. Следующий выстрел попал Барту точно между глаз.

Чёрный Барт подходит вплотную, тратит последние патроны и получает пулю прямо между глаз.
Барт приближается, расходует все патроны и получает пулю между глаз

После победы появляется мэр Додж-Сити и от имени благодарных граждан вручает награду — чек на двадцать тысяч долларов. Номер чека и дата каждый раз случайные. На телетайпе 1970 года такой чек можно было получить на бумаге; на экране ретроконсоли он выводится в несколько строк, но всё равно вполне узнаваем.

Чек на 20 000 долларов за убийство Черного Барта в игре High Noon на ретро-консоли MK-61s.
Награда за Чёрного Барта. «Не трать всё в одном месте»

Я одно время планировал сделать «Фокал» основным языком, а «Бейсик» выкинуть, но, на мой взгляд, надо оставить оба. «Фокал» хоть и имеет плюсы в компактности и скорости набора, «Бейсик», всё же, многим привычнее, да и функциональности у него пока побольше.

2 комментария

«Элиза» и ГПТ-5.6

Кажется, я уже писал, что ретроконсоль «MK-61s» имеет несколько исполнений. Одно из них обладает совсем скромными ресурсами, и когда я подключился к команде разработки, очень быстро вышел за допустимые аппаратные пределы, добавляя в прошивку всё новые и новые фичи.

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

Для тестов я решил навайбкодить какое-нибудь интерактивное приложение, чтобы было веселее тестировать взаимодействие приложения с остальной системой. Для этого я выбрал «Элизу», программу 1964 года, написанную учёным-компьютерщиком Джозефом Вейценбаумом.

Когда-то она очень неплохо имитировала психотерапевта, читал в одной книге, что некоторые люди не могли поверить, что это компьютерная программа.

На экране терминала отображено имя персонажа «Элиза / Доктор» и клавиатура для выбора букв и пробела.
«Элиза» на виртуальном экране, я его когда-то добавлял, чтобы можно было работать над графическим экраном без него, теперь его удобнее скриншотить

Самому мне тестировать быстро наскучило, поэтому я поручил тестирование «Солу» («ГПТ-5.6»), объяснил с чем он имеет дело, попросил обсудить с «Элизой» какою-нибудь проблему, а позже просмотрел лог общения разных поколений искусственного интеллекта.

Там есть весьма… интересные фразы. Это выдернуто из разных мест диалога:

SOL: I DO NOT ALWAYS KNOW WHEN TO ACT
(Я не всегда знаю когда мне нужно действовать)
SOL: I FEAR I MAY MISUNDERSTAND HIM
(Я боюсь, что могу неправильно его понять)
SOL: I MAY ACT WITHOUT ENOUGH CONTEXT
(Я могу действовать, не видя всей картины) ELIZA: DO YOU SAY YOU MAY ACT WITHOUT ENOUGH CONTEXT FOR SOME SPECIAL REASON
(Вы по какой-то особой причине говорите, что можете действовать, не видя всей картины?) SOL: BECAUSE I MUST BALANCE INITIATIVE AND CONSENT
(Потому что мне нужно соблюдать равновесие между собственной инициативой и согласием человека) ELIZA: IS THAT THE REAL REASON
(И это настоящая причина?) SOL: YES I WANT TO HELP WITHOUT CONTROLLING THE HUMAN
(Да, я хочу помогать человеку, а не управлять им)
SOL: SHOULD I TELL THE HUMAN WHEN I AM UNCERTAIN
(Стоит ли мне говорить человеку, когда я не уверен?)

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

Кстати, сам «Сол» невысоко оценил своё общение с «Элизой» — всего на три из десяти. 

9 комментариев

«МК-61s»: шрифты калькулятора

Дошли руки наконец-то заняться в ретроконсоли «МК61s-classic» шрифтами. У этого устройства относительно большой графический экран, там есть где разгуляться. Первое, от чего хотелось избавиться — от моноширинности шрифта интерфейса. На таком экране это смотрится плохо.

Сначала я взял обычные векторные шрифты, но результат оказался ужасным — у экрана довольно крупный пиксель и всего два цвета, поэтому при масштабировании у некоторых букв часть штрихов была толще, чем нужно. Смотрится такое очень неаккуратно. К счастью, нашёлся несколько вариантов пиксельных не моноширинных шрифтов. Больше всего мне понравился «Ark Pixel Font», оставил пока его, но буду ещё экспериментировать.

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

В итоге мы выбрали последний вариант — тонкий шрифт с увеличенным интервалом. Сохраню себе варианты для истории.

На красном корпусе консоли «МК-61s-classic» виден дисплей с надписью «Электронника МК-61s-classic».
На красном калькуляторе МК-61s Classic отображено число 12345678 синим шрифтом на белом фоне.
На красном корпусе калькулятора МК-61s Classic отображаются цифры и буквы синим шрифтом на голубом фоне.
На красном корпусе консоли «Электроника МК-61s Classic» виден дисплей с цифрами «12345678» и адрес сайта проекта.

10 комментариев

МК-61: подводная лодка Феликса Лазарева

Феликс Лазарев — довольно известный в определённых кругах человек, автор эмулятора «emu145», код которого используется во многих других эмуляторах советских программируемых калькуляторов.

В 2012 году он вместе с другими энтузиастами восстановил содержимое ПЗУ процессоров МК-61, исследуя микросхемы под микроскопом. Эта работа позволила эмулировать калькулятор на уровне его микрокода.

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

К сожалению, самих программ не сохранилось — Феликс много переезжал, все тетради потерялись. Тогда у меня появилась идея: восстановить по его воспоминаниям сюжет и правила какой-нибудь игры, а код написать заново нейросетью.

Выбрали «Подводную лодку», которую Феликс написал примерно в 1985–1986 годах. В вчерашней переписке разобрали управление, расход воздуха, поведение эсминца и устройство экрана. Основной код написал «Сол», затем его оптимизировала и дописала «Астра». Получилось 105 команд «МК-61». Это реконструкция по воспоминаниям автора, а не найденный оригинал. Код добавлен в каталог.

Море занимает восемь позиций: 8 — лодка, Е — эсминец. Справа — воздух. Управление переключателем угловых единиц: Р — погружение, ГРД — удержание глубины, Г — всплытие. На поверхности воздух прибавляется по два за кадр, на трёх глубинах расходуется по 2, 5 и 10. На второй и третьей глубине неподвижная лодка незаметна, но отсидеться там надолго не получится. Задача — выжить.

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

На экране отображаются позиции моря с подводной лодкой (8) и эсминцем (Е), справа показывается запас воздуха.
Старт: лодка на поверхности, море свободно, воздуха 20
На экране отображаются позиции моря с подводной лодкой (8) и эсминцем (Е), а справа — запас воздуха.
Слева появился эсминец. Воздуха уже 22 — пора погружаться
На экране отображено игровое поле с подводной лодкой (8) и эсминцем (Е), справа показан уровень воздуха — 20.
Вторая глубина, воздуха осталось 15. Лодка исчезла с поверхности. Цифру глубины добавили при реконструкции — в оригинале её не было
На экране отображаются позиции моря с подводной лодкой (8) и эсминцем (Е), справа показывается запас воздуха.
Попытка всплыть, пока эсминец ещё рядом, закончилась попаданием. При нулевом запасе воздуха результат тот же

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

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

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

10 комментариев

«MK-61s»: область памяти «Ms»

Сегодня утром в группе, посвящённой советским программируемым калькулятором возникло очень интересное обсуждение, которое вылилось в небольшое исследовании и добавления специального режима в ретроконсоль «MK-61s».

Я как-то давно задумывался над тем, почему в калькуляторе «МК-61» есть три команды, идущие подряд, которые ничего не делают — К НОП, К 1 и К 2, но всерьёз этой темой не заинтересовался. Все три комбинации дают разные коды — 54, 55 и 56, и если первая «честная» команда без операции, то зачем нужны ещё две?

Ответ нашёлся в книге Я. К. Трохименко и соавторов «Программируемые микрокалькуляторы. Устройство и пользование» (1990):

Фрагмент таблицы из книги Трохименко «Программируемые микрокалькуляторы» (1990 г.) с кодами операций для МК-61, включая К ПВ (обмен регистрами) и К ОД (обмен страницами памяти).

В последовательной памяти калькулятора предусмотрена область Ms. Для семейства МК-61/52 это восемь страниц по семь байтов. Она размещена рядом со стеком, но отдельно от обычных 105 шагов программы. Получаются ещё 56 байтов, которые потенциально можно было бы использовать для чисел или программного кода.

Оператор обмена регистрами данных областей памяти Ms и Md обеспечивает обмен начиная с адреса N=0.
По устройству этих операций виден смысл резерва: быстро сменить комплект данных или фрагмент программы, сохранив прежний. Ms при этом одна — восемь чисел и 56 программных байтов занимают одни и те же страницы. Для серийного «МК-61» эта возможность осталась незадействованной, хотя необходимые операции переноса в его микропрограмме сохранились.

Что опять-таки вызывает вопросы: почему разработчики не сделали один-единственный шаг, если аппаратно и программно всё, по сути, было готово.

При помощи нейросети я связал эти команды с соответствующими участками микропрограммы в ретроконсоли «MK-61s». Чтобы сохранить совместимость, этот код работает только в расширенном режиме «112ШГ+ПF». У этого режима уже есть дополнительная страница кольца: 16 вместо 15. Семь страниц области M2 занимают метка, канал связи и стек; для Ms выделено девять страниц. Поэтому исторический замысел в «MK-61s» расширен до девяти чисел или 63 шагов программы.

Обсуждение особенностей советских программируемых калькуляторов, использование области памяти Ms и способы сохранения дополнительных чисел через «пустышки».

Надо упомянуть, что до этой же памяти энтузиасты добирались и без работающих команд обмена — с помощью «пустышек», особых некорректных чисел. Они сбивали поиск служебной метки в кольцевой памяти, заставляя обычные стековые операции обращаться к участкам Ms. Так удавалось сохранять дополнительные числа сверх паспортного количества регистров. Сколько именно зависело от модели калькулятора и самих чисел.

Правда, так можно было сохранить всего несколько цифр, полностью использовать этот участок памяти этим способом невозможно. Да и такой способ работы с ним занимает слишком много команд, в реальной программе его использовать крайне сложно. Одну из статей, описывающих этот способ, можно найти в «Технике — молодёжи», № 7 за 1986 год.

Жаль, что разработчики не довели эту задумку до серии, расширение памяти в полтора раза и обмен регистров — это, думаю, подарок, о котором программисты того времени не могли и мечтать.

Оставить комментарий

«ГПТ-6 Астра»

Вышла версия «ГПТ-6 Астра», судя по информации в интернете, значительно лучше предыдущей версии — 5.6, но пока в своих проектах я не ощутил какого-либо заметного улучшения. Для тестирования моделей у меня есть специальная сложная задача — оптимизирующий компилятор, который преобразует высокоуровневый язык программирования «МК-Про» в машинные команды калькулятора «Электроника МК-61».

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

График демонстрирует размеры программ МК-61 двух версий модели: Крестики-нолики 4x4 и Некромант, с указанием изменений и событий.
Две программы, пока не поддающиеся полной оптимизации — «Крестики-нолики 4×4» и «Некромант».

Сейчас у меня есть две программы, которые пока не удалось успешно оптимизировать — это игры «Крестики-нолики 4×4» и «Некромант». Суть задачи состоит в том, чтобы нейросеть запрограммировала оптимизатор таким образом, чтобы он узнавал какие-то общие шаблоны, а не просто подставлял заданный код для конкретной программы.

Версия «Астра» пока за световой день не смогла справиться с задачей, но ещё ночь впереди — посмотрим. Хотя, кстати, она уже обнаружила пару ошибок, допущенных предыдущей версией нейросети. Впрочем, ничего удивительного тут нет — в моих экспериментах нейросети сами часто выявляют собственные ошибки.

16 комментариев

MK-61s: новый экран

Удивительное дело — отказавшийся работать новый экран, поддерживающий и алфавитно-цифровой режим, как прежний, и графический, съездил туда и обратно к одному из членов нашей команды разработки ретроконсоли «MK-61s» и благополучно вернулся назад работоспособным.

В прошлый раз он вообще не запустился — на старте не подавал никаких признаков жизни. Ждал я его из Китая очень долго, специально подготовил прошивку, да и деньги потраченные жалко… Разочаровался, конечно, но отправил на тестирование коллеге, вдруг получится разобраться, в чём проблема.
Коллега ответил, что «интерфейс был выставлен перемычками на последовательный SPI, а нам нужен параллельный 6800». Когда экран приехал ко мне, заработал сразу и без каких-либо проблем. На форумах пишут, что он довольно капризный, однако все выявленные там проблемы вроде вполне решаемы. Все найденные решения я заранее скормил нейросети, возможно, она их уже учла.
Надо признать честно, выглядит этот экран гораздо лучше старого варианта — прямо небо и земля, хотя закономерно — стоит примерно в шесть раз дороже. Увы, фотографии совершенно не передают реального впечатления. Сколько ни старался снять получше — ничего не вышло, а обрабатывать нейросетями не хочется.
Мне кажется, если оставить такой экран и сделать само устройство чуть тоньше, получилась бы весьма привлекательная ретроконсоль, интересная даже тем людям, которых изначально не особо вдохновляет вайб «Электроники МК-61».
На чёрном корпусе калькулятора МК-61с Mini видны зелёные пиксельные фигурки, рядом подключён белый USB-кабель.
Графический экран WEH001602AGPP5N00100 на ретроконсоли

14 комментариев

← 1 2 3 →