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

«МК-61s»: графика на текстовом экране

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

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

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

Зелёный LCD-дисплей показывает: верхняя строка — «4G» и «12:00», нижняя — «6» и «PM».
Это — «Пакман», гоняющийся за привидением.

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

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

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

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

Не уверен что мне с этим всем делать, но пока оставил реализацию в экспериментальном режиме.

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

«МК-61s»: часы на экране

Выяснилось, что на борту ретроконсоли «MK-61s» есть аппаратные часы, и даже предусмотрена батарейка для них — просто у ребят, занимающихся консолью, не дошли руки ими заняться.

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

Пока ехал с работы домой, пришла мысль попробовать выделить под них два программируемых знакоместа, каким-то образом уместив в каждом по два числа. Там довольно тесно — каждое знакоместо имеет размер всего 5×7 пикселей.

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

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

Как шрифт выглядит на реальном устройстве с сомнительной «восьмёркой» можно увидеть на фотографии ниже:

Электроника МК-61s-Mini: зелёный дисплей с «0. P 21:35», надписи «ЭЛЕКТРОНИКА МК-61s-Mini» и ссылка на GitHub; кнопки MENU, ESC, OK, стрелки, [USER], Р, ГРД, Г.

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

«МК-61» и случайные числа

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

На дисплее калькулятора «ЭЛЕКТРОНИКА МК 61» отображается число 4.04067 -01, видны переключатели «Вкл», «ГРД» и кнопки с обозначениями функций.
На старте генератор случайных чисел на реальном калькуляторе всегда выводит одно и то же число

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

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

Распределение сильно лучше: на десяти тысячах запусков старый генератор дал 179 случайных значений, а новый — 9957.

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

«МК-61»: размер программ

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

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

Например, на приведённом тетрадном развороте справа видно значения, которые надо ввести до ввода программы.

Рукописная программа «Звёздный бой» для ЭВМ: таблица команд с адресами, кодами и комментариями по вводу координат, вычислению энергии, выводу символов победы и управлению кораблём.
Разворот тетради Александра Долгушина, автора кучи программ для «Электроники МК-61»

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

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

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

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

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

«МК-Про»: далеко ли до «отлично»?

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

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

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

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

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

График изменения размера в клетках с 28 мая по 11 июля: рост до 386 (полная игра), затем резкое снижение до 134 (UI fix), стабилизация около лимита 105.
Там где значения плюсовые — это исправления каких-то багов оптимизатора

Добавлено позднее: в итоге сеть мне сначала довела почти до 105 байт, а потом откатила часть прогресса, сделанного другими сетями и теперь программа у нас занимает 154 байта. Причина — оптимизации слишком заточены под конкретную программу, что противоречит задаче.

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

«МК61s»: распробовал «Фейбл 5»

Скриншот Finder macOS: папка /Volumes/MK61S FS с тремя файлами .M61 — Bumblebee Fly, Fox Hunting, Infinity Story — с иконками вопроса.

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

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

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

Я написал «ГПТ-5.5» всю первую версию, которая довольно неплохо работала, пока я не стал копировать файлы группами — на группе по пять файлов возникал сбой, диск пропадал и операция прерывалась. С «ГПТ-5.5» я просидел до часу ночи, но баг не лечился. Мы даже делали псевдофайл, в который сохранялись команды операционной системы, чтобы разобраться в ситуации, но всё тщетно.

«ГПТ-5.5» мне говорил «вот новая прошивка, я всё починил», но баг никуда не уходил — простое копирование пяти файлов опять всё роняло.

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

Что я хотел сказать этой историей — человек так не сможет.

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

Документалка об «Электронике МК-61»

Мужчина в клетчатой рубашке говорит в микрофон. Слева иллюстрация Евгения Степанищева и текст «ништяки для МК 61, ссылка в описании». Фон: неон JS, постер Oasis.

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

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

За этот опыт я очень благодарен Ивану.

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

Фильм уже неделю как был готов — оставалось дождаться только рекламодателя. Результат мне так понравился, что я буквально дождаться не мог момента, когда смогу разослать его всем. С особым удовольствием отправил ссылку ребятам из чата о ретроконсоли «MK61s». Надеюсь, им это согреет душу!

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

«МК-61s»: русские буквы

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

Таблица символов кодовой страницы CP437: десятичные коды от 32 до 255, соответствующие ASCII-символы, латиница, кириллица, японские катакана и специальные графические символы.

Как же делается русификация? Секрет в том, что в позициях от нуля до семи стоят символы, которые можно определять самостоятельно. Пришлось написать упаковщик, который, выводя на экран русские символы, на самом деле заменяет их латиницей, а те буквы, которые есть только в русском, распихивает по восьми символам, которые можно рисовать самостоятельно. Если позиций не хватает, пытается минимально изуродовать вывод, заменяя «Ч» на «4» и «У» на «Y».

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

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

Доработка «МК-61s»

Программировать всякие железки — увлекательнейшее занятие. За ночь и утро я её русифицировал (решив проблему распихивания русских букв на восьми программируемым знакоместам), выделил слой примитивов работы с экраном, что позволило объединить две прошивки в одну, добавил интепретаторы двух языков (Бейсик и Фокал), сделал файловую систему с монтированием этой системы на компьютере и ещё многое другое.

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

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

В «МК-61s» я сделал то же самое — на клавиатуре есть буквы от «a» до «e» для ввода имён регистров и некоторые другие буквы, на них я завязал ввод операторов, по пути переименовав некоторые из них — ASK, BRANCH, COMMENT, DO и так далее. А остальные буквы вводятся на цифровой клавиатуре, как это раньше делали с СМС — нажимаем K («клавиша»), а потом нужную цифровую кнопку на каждой из которой сидят по три или четыре цифры, как на старых кнопочных телефонах.

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

Электроника МК-61s-Mini с экраном «ГРОМКОСТЬ 0, СКОРОСТЬ ТУРБО» и клавиатурой, подключена кабелем к USB; ссылка на GitHub: https://github.com/un7fg0/mk61s_mini

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

Ретроконсоль «МК-61s»

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

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

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

Дополнено: немножко разобрался, но вопросов стало только больше. Для работы с прошивкой предназначен разъём слева, устройство надо перевести в режим DFU через меню. Но, самое главное, — дата прошивки 10 мая 2026 года, а репозиторий устройства не обновлялся уже восемь месяцев. Вопрос — где же идёт работа?

Да и размеры не совпадают. Я слил прошивку с устройства, она там занимает около 80КБ, тогда как, если собрать прошивку из репозитория, она займёт около 60. Ничего не понимаю.

Калькулятор ЭЛЕКТРОНИКА МК-61s-Mini на фоне зелени. На корпусе URL: https://github.com/un7fg0/mk61s_mini

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

О разном

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

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

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

Говорят нам на днях должны вернуть нейросеть «Фейбл 5», на которую американское правительство наложило запрет. Сам я её погонять успел мало, но те, кто успел, говорят, что она программирует уже на уровне синьора. Ну проверим, у меня задача для неё есть — довести в «МК-Про» оптимизатор до такого уровня, чтобы повторить или превзойти по компактности вариант Сергея Анварова игры «Пещера сокровищ».

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

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

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

«МК-Про»: два регистра в одном

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

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

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

Идея в том, что два целых числа с известными диапазонами можно упаковать в одно число: одно — в целую часть, другое — в дробную. Тогда извлечь их можно операциями нахождения целой части (K [x]) и дробной части (K {x}), причём дробную часть потом часто можно и не домножать: транслятор может заменить всю арифметику с ней так, что всё будет работать ожидаемым образом, но вместо диапазона 0…9 будет использоваться диапазон 0…0,9.

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

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

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

В общем, зарядил я «Кодекс», чтобы он покопался в микрокоде калькулятора и алгоритмически повторил код, реализующий тригонометрию в Си++. Цель была обозначена, на мой взгляд, очень чётко. Но не зря я говорю, что нейросеть иногда похожа на джина, который всё, что можно понять двояко, вывернет вам во вред.

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

А там, как говорят поляки «wygląda jak gówno, a smakuje jeszcze lepiej» — «выглядит как говно, а на вкус ещё лучше». Пятьдесят тысяч строк отвратительного лапшекода, сгенерированного программно из ПЗУ «МК-61».

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

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

«МК-Про»: переписано на Си++

Сегодня наконец закончился процесс переноса кода «МК-Про» на C++. Переписывание заняло около восьми дней, использовались три нейросети. Основной каркас был перенесён с помощью «ГПТ-5.5», часть тестов довольно механически переносилась нейросетью «ГПТ-5.3-Кодекс-Спарк», а последние штрихи вносил и баги чинил «Опус 4.8».

Производительность трансляции улучшилась в среднем в 2,5 раза. Есть один регресс у одной короткой программы, которая выполняются до 50 миллисекунд, но это, скорее всего, погрешность: не исключено, что в этот момент в фоне стартовало что-то тяжёлое.

За восемь дней было переписано 122 тысячи строк, которые превратились в 145,5 тысяч строк на C++.

Таблица сравнения времени выполнения примеров на TypeScript и C++: C++ быстрее в большинстве случаев (от 1.13x до 9.52x), кроме e-94-digits, где TS быстрее в 1.67x.

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

Программируемые калькуляторы и баги

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

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

Таких багов я знаю два: функция вычисления максимума считает ноль самым большим числом (можно попробовать ввести 500 В↑ 0 max, чтобы убедиться), а второй — генератор случайных чисел начинает зацикливаться, если попробовать взять целую часть случайного числа.

Сравнение раскладок калькулятора ЭЛЕКТРОНИКА МК 61: слева латиница, справа кириллица с кнопками F, K и цветными функциями.
Разворот из брошюры «Elektronika MK-61 Calculator Operating Instructions»

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

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

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

«МК-Про»: прогресс по переводу на Си++

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

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

В данном случае мы наблюдаем горе от ума: сеть попроще — GPT-5.3-Codex-Spark — перебрасывает код именно по той схеме, которая была у меня в голове: «айда перепишем, а потом посмотрим на тесты», но у неё быстро кончаются лимиты. А вот ГПТ-5.5 работает более методично: переписывает кусками, основываясь на том, что показывают тесты. Так медленнее, да ещё и тесты гоняются по многу минут, а их много, поэтому всё и идёт туго.

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

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

«МК-Про»: переписываю на Си++

Сейчас транслятор «МК-Про» — языка высокого уровня для «Электроники МК-61» — написан на ТайпСкрипте. Я выбрал этот язык по двум причинам: хотелось на него посмотреть, и была идея прикрутить транслятор к эмулятору «МК-61», который работает в браузере.

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

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

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

Скриншот редактора кода с открытым файлом compiler.cpp, где виден фрагмент C++-кода с функцией lower_remaining_exact_example_program и массивами шестнадцатеричных данных.

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

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

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

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

В процессе вышел на архивный сайт, где когда-то были опубликованы самоиздатовские выпуски клуба любителей игровых программ «КЛИП» — довольно известного и хорошо организованного движения ранних 90-х. Его участники увлекались программированием на «МК-61», а лучшие программы публиковались.

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

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

Разворот журнала «Экспресс» (09.91): опрос читателей, объявления о продаже игр, таблица паролей к «Защитнику», редакция и логотип клуба любителей игровых программ.
Разворот девятого номера «Экспресса» (1991 год) — издания клуба по калькулятору «Электроника МК-61»

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

«МК-Про»: ЯП высокого уровня для «МК-61»

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

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

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

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

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

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

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

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

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

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

Попробовал «Кодекс»

Так исторически сложилось, что серьёзно программировать с нейросетями я начал с «Курсора». До сих пор его использую, и планов куда-то переходить у меня не появлялось.

«Курсор» — специализированная среда разработки, заточенная под работу с нейросетями. В ней есть очень много специальных костыликов, позволяющих нейросети делать свою работу. Такие среды дают огромный прирост по сравнению с копированием кода из окна нейросети — тем, с чего мы все начинали.

Недавно братишка уговорил меня попробовать «Кодекс» — конкурирующую среду разработки, которую делает компания «Оупен-Эй-Ай». Аргумент он привёл очень убедительный — стоимость.

Не обманул: позже я убедился, что в рамках подписки за двести долларов можно работать почти с любой интенсивностью. Там, где в «Курсоре» легко тратились двести долларов в день, тут я, заплатив один раз, больше ничего не плачу́.

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

При этом с «Курсором» мне работать приятнее. Не из-за эффекта утёнка, а из-за двух вещей, которые в «Кодексе» сделаны плохо.

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

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

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

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

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

Выводы.

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

Бюджет «Курсора» буду тратить на работе. Во-первых, это позволит мне программировать для себя и компании в один и тот же день: раньше я разделял их, чтобы чётче понимать, сколько денег мне надо вернуть; во-вторых, затраты на управление для меня дороже в рабочее время, у меня очень высокая загрузка, и всё время дёргаться и смотреть, что там сделала сеть, для меня не вариант.

Скриншот интерфейса «Оптимизатор» с текстом о компиляции X2, ветках, масках и проверке кода; видны меню слева, панель среды справа и поле ввода внизу.

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

Хаки в «Электронике МК-61»

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

В коде программы «Рембо-III» есть несколько похожих мест (я буду приводить код на языке «МК-Про» для наглядности):

fn lost() {
  halt("ЕГГОГ")
}

fn front_stop() {
    …
    if cells[7] < 0 {
      lost()
    }
    …
}

Если некое проверяемое значение меньше нуля (в двух остальных местах — меньше или равно нулю), то пишем на экране «ЕГГОГ» — слово «error», это одно из немногих слов, которое калькулятор способен отобразить, так как у него есть специальная логика для отображения некоторых букв, поэтому его часто используют для обозначения проигрыша.

Мой оптимизатор умеет заменять halt("ЕГГОГ") одним опкодом, потому что это «встроенное» в калькулятор слово, но тут он пишет относительно много кода — проверка условия и вызов, тогда как проверку и вывод «еррора» можно объединить в один опкод — F √ или F lg в зависимости от условия.

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

В «Рембо-III» это сокращает программу на четыре байта. Это существенно, когда у доступно так мало памяти.

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

← 1 2 3 →