Ретроконсоль MK-61s
«MK-61s»: SIMD
Было время, когда меня захватила идея реализовать поддержку «Юникода» на «Флиппере Зеро». Я много тогда над этим работал и одна из вещей, которую я тогда делал — пытался ускорить измерение длины строки в кодировке
Тогда я познакомился с расширением DSP SIMD, которое помогает на армовских процессорах параллельно обрабатывать несколько значений одновременно. Вчера мне этот опыт пригодился.
Сейчас я занят ускорением работы встроенных в ретроконсоль «
Чтобы измерять оптимизации я, как это у меня водится, портировал по эту задачу на ретроконсоль очередную игру. На этот раз шахматы Алана Тьюринга и Дэвида Чемперноуна (есть восстановленный алгоритм по мотивам их идей 1948 года). Нейросеть их перевела на Бейсик и это очень хороший тест, так как там очень много вычислений — первая версия делала ход за 162 секунды.

Я занялся ускорением, так как по предложению одного из членов нашей команды, Алексея Сугоняева, перевёл интерпретаторы Бейсика и Фокала в трансляторы, формирующие специально разработанный
Все низковисящие плоды в плане оптимизации я уже сорвал, остались довольно сложные вещи, типа
«Юникода» в «
| Программа | Времени на компиляцию меньше |
|---|---|
| Шахматный поиск, Бейсик | 0,47% |
| Вступление High Noon, Бейсик | 1,32% |
| Статистика, Фокал | 1,38% |
К слову, оптимизированная версия Бейсика сейчас делает на холодную первый ход в шахматах за 104 секунды, а при прогретых кешах — за 87,5. Это пока всё равно медленно, но куда лучше 162 секунд, которые были в начале.
«MK-61s»: самораспаковка в 105 ячейках
В прошлый раз игра вместе с распаковщиком занимала диапазон в 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. Ниже показано выполнение всего этого варианта.
Осталась одна нерешённая проблема: используется 63 байта Ms, доступных в «
«MK-61s»: самомодифицирующиеся программы
У меня была давно идея попробовать сделать самомодифицирующуюся программу на программируемом калькуляторе «Электроника
Своей цели я ещё не достиг, хоть и продолжаю пытаться, а пока экспериментирую с командами доступа в область Ms — это недоделанные команды, которые я разблокировал в ретроконсоли «
Там всего две команды — одна обменивает Ms с содержимым памяти, вторая с регистрами. Таким образом вырисовывается путь — меняем
Выглядит просто, но есть особенности — калькулятор хранит числа в особом формате и при переносе в программную память этот формат создаёт проблемы. Байтами команд становятся не только цифры числа, но и его знак и порядок. Поэтому записать в регистр
Например, число 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»
Как и во всех остальных случаях, специально чтобы оттестировать новые команды, я перенёс на «
На этот раз, я об этом уже писал, выбрал «Элиту». Те, у кого был в детстве
Безусловно, графику оригинальной игры, как ни расширяй калькулятор, тут не повторить, но можно реализовать больше логики и кодировать происходящее в игре более понятным образом.

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

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

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

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

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

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

Победу я обозначил надписью «YES, CLEAr» . За победу дают награду, после сражения можно закончить перелёт и вернуться к торговле.
На этой игре хорошо стало видно, зачем понадобилось отделять экран от вычислений. Промежуточные числа больше не мелькают перед глазами, а новый кадр появляется целиком. Кроме того оказалось, что нужно добавить больше команд — первая версия медленно заменяла отдельные сегменты, и выглядело это довольно мучительно.
Вообще, с быстродействием пришлось повозиться отдельно: сокращать обмены между банками, переиспользовать уже вычисленные значения, заимствовать калькуляторные трюки с косвенными переходами.
Игра и короткая инструкция лежат в репозитории. Нужна свежая прошивка с новыми командами; открываешь папку ELITE на устройстве, закрываешь памятку и нажимаешь С/П. Пока не решил стоит ли делать сохранения. С одной стороны это логичный следующий шаг, с другой стороны уже слишком далеко отходит от исходной идеи.
«МК-61s»: два новых набора команд
Как я писал два дня назад, мне стало интересно пофантазировать на тему, как бы я расширил калькулятор «Электроника
Правда, я думал, что добавлю всего несколько команд, заняв неиспользуемые коды калькулятора, но когда начал писать программу для теста, оказалось, что набор надо расширять серьёзно, иначе быстродействие программ будет крайне низким,
Поэтому пришлось расширять команды по префиксному типу — код 1F используется как префиксный для работы с новыми банками памяти, а 2F — для работы с экраном.
Полностью все команды я перечислять не будут, их слишком много, в моём репозитории есть руководство, но основные идеи расскажу.
Поскольку экран
Тут для производительности пришлось добавить целую россыпь команд. Помимо переключения режимов отображения, теперь есть команды виртуального курсора и форматирования.
И, конечно, стоит подумать об расширении памяти. Тут действительно настоящая проблема. Ретроконсоль «
Поэтому я добавил этой памяти ещё несколько дополнительных банков, выделив префикс 1F для переключения. Сначала я думал, что обойдусь одной командой вызова подпрограммы, но оказалось, что для программирования это неудобно, так что в этом наборе появились еще циклы и команды условных переходов.
В итоге в расширенном режиме теперь доступно: 112 байт обычной памяти, резерв Ms в 63 байта (в обычном калькуляторе там 56 байт, но тут пришлось расширить
Правда, сами команды удлинились — новые команды занимают от двух до четырёх ячеек. Самые длинные — команды перехода по адресу: префикс, код команды, выбор банка и адрес ячейки. Я теории их можно сократить, но тогда придётся жёстко завязаться на количество банков, а мне бы этого не хотелось.
«МК-61s» и Base91
Я на днях под влиянием книги «
Поскольку этот калькулятор изначально не задумывался для игр, однако для него написано более шестисот игр, которые были опубликованы, и неизвестно сколько ещё пропало, мысли мои пошли в сторону того, что именно я бы добавил туда, чтобы на нём было интереснее играть.
Расширил набор команд двумя префиксами, в другой раз покажу какими, а для тестирования, как водится, написал при помощи нейросети игру — простой клон известной «Элиты». Для
Игра поначалу получилась достаточно объёмной, и, чтобы сэкономить место на диске, а заодно ускорить загрузку, я решил добавить к расточительному шестнадцатеричному формату хранения программ
Вспомнил, конечно, про 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, или тринадцать единиц в двоичной записи для выделения тринадцати младших бит.
Если взять тысячу байтов, то без учёта заголовков и переносов строк выйдет примерно так:
- шестнадцатеричный формат — 2000 символов;
- Base64 — 1336;
- Base85 — 1250;
- Base91 — обычно около 1230.
То есть по сравнению с Base85 выигрыш совсем небольшой — около двадцати символов на килобайт. Зато по сравнению с исходным шестнадцатеричным форматом файл уменьшается почти на 40%.
Для обычной программы
У меня программа получилась побольше — несколько килобайт, мои расширения такое позволяют, поэтому я перед кодированием ещё и сжимаю программу уже испробованным алгоритмом «ZX0».

Добавлено позже: один из читателей предложил вариант хранить программу в бинарном виде. Я такой вариант отбросил в самом начале, потому что мне больше нравилась идея всем управлять из текстового файла терминала, кроме того по расчётам тогда получалось, что в один файл всё равно всё не уместится.
Но я тогда не учитывал сжатие, плюс сама «Элита» была больше, я потратил немало токенов, чтобы её ускорить (первые версии рисовали экран секундами), а по пути она ещё и меньше стала. В общем, эту идею точно надо было рассмотреть.
В итоге, от команд ztart и zin я избавился в пользу одной команды load, которая загружает сжатый заранее бинарный образ.
«МК-61s»: однобайтовая кодировка
Сжег половину недельных токенов на задачу уменьшения размера прошивки для «
Поэтому на выходных начал делать две вещи, которые давно напрашивались, — переход на однобайтовую кодировку и выделение «USB-диска» в отдельное приложение. Хотя вторая задача оказалась инженерно сложнее, зато потребовала меньше моего участия — я просто подключил одну из своих консолей к ноутбуку, описал набор тестов и ждал, пока нейросеть устранит все проблемы.
В задаче перевода кодировании символов на один байт мне пришлось участвовать постоянно.
Для начала для чего это нужно. Для нескольких вещей.
Поэтому пришлось придумать свою кодировку. Я её назвал «M8»

Файловая система, которая видна через «USB-диск», при этом работает как и раньше — длинные имена и содержимое файлов на лету преобразуются в «Юникод» и обратно. Поскольку для каждого файла у нас хранится метаинформация, чтобы мы знали, чем его запускать, бинарные файлы от перекодировки не страдают.
У меня есть идея поместить на свободные места все национальные символы, используемые внутри России — места хватает, однако она разбивается о сомнения, как поступить с их отображением в терминале. То ли показывать там знак «вопроса», то ли предусмотреть режим переключения терминала в «Юникод». Пока отложил эту идею, всё равно пользователей таких символов пока не наблюдается.
«МК-61s»: TinyBASIC и High Noon
На днях решил навести порядок в высокоуровневых языках программирования внутри ретроконсоли «
Сначала я попытался сократить размер интерпретаторов, упростив синтаксический парсер, а потом занялся ревизией самих языков.
Начал с «Бейсика». Тот диалект, который сейчас используется, это реализация «Palo Alto Tiny BASIC v3»
Оказалось, что в прошлый раз я реализацию «не дожал», уже не помню почему, видимо не умещалось по памяти. Поменяв парсер на более компромиссный, удалось и оригинальный синтаксис реализовать в полном объёме, и все расширения сохранить.
И чтобы протестировать «Бейсик» более тщательно, я решил портировать игру «High Noon», точнее свой же порт, который я в 2020 году перевёл на «Фортран».
Эту игру написал американский школьник Крис Гайло из школы Сайоссета на
По нынешним меркам это совсем простая игра.
Дело происходит на Диком Западе. Вас вызывает на дуэль

autoexec.m61 работает дирижёром: запускает нужную часть, а состояние игры передаётся между ними через регистры
Заодно в папке игры появился свой узкий пиксельный шрифт. Сценарий загружает его перед стартом и возвращает прежний при выходе. Без этого длинные английские фразы просто не помещались бы на экране 192×64 (игра запускается только на консоли с графическим экраном).
В показанной партии я в основном шёл вперёд по десять шагов. Барт тоже приближался, несколько раз стрелял и в конце концов остался без патронов. Потом он умудрился пройти мимо меня — расстояние стало минус три шага. Эту странность исходной программы я тоже честно сохранил. Следующий выстрел попал Барту точно между глаз.

После победы появляется мэр

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

Самому мне тестировать быстро наскучило, поэтому я поручил тестирование «Солу»
Там есть весьма… интересные фразы. Это выдернуто из разных мест диалога:
(Я не всегда знаю когда мне нужно действовать)
(Я боюсь, что могу неправильно его понять)
(Я могу действовать, не видя всей картины) ELIZA: DO YOU SAY YOU MAY ACT WITHOUT ENOUGH CONTEXT FOR SOME SPECIAL REASON
(Вы по
(Потому что мне нужно соблюдать равновесие между собственной инициативой и согласием человека) ELIZA: IS THAT THE REAL REASON
(И это настоящая причина?) SOL: YES I WANT TO HELP WITHOUT CONTROLLING THE HUMAN
(Да, я хочу помогать человеку, а не управлять им)
(Стоит ли мне говорить человеку, когда я не уверен?)
И хотя я понимаю, что это не человек, мне сложно отделаться от неприятного ощущения, будто я подсмотрел реальную психотерапевтическую сессию, где мой сотрудник поделился со своим психотерапевтом всеми своими страхами.
Кстати, сам «Сол» невысоко оценил своё общение с «Элизой» — всего на три из десяти.
«МК-61s»: шрифты калькулятора
Дошли руки
Сначала я взял обычные векторные шрифты, но результат оказался ужасным — у экрана довольно крупный пиксель и всего два цвета, поэтому при масштабировании у некоторых букв часть штрихов была толще, чем нужно. Смотрится такое очень неаккуратно. К счастью, нашёлся несколько вариантов пиксельных не моноширинных шрифтов. Больше всего мне понравился «Ark Pixel Font», оставил пока его, но буду ещё экспериментировать.
Второе — давно хотелось попробовать выводить цифры в стиле калькулятора. Задача несложная, однако важно выбрать подходящий шрифт, который будет выглядеть эстетично. Ниже представлены несколько вариантов, вдохновлённых разными устройствами с цифровым отображением на сегментных индикаторах.
В итоге мы выбрали последний вариант — тонкий шрифт с увеличенным интервалом. Сохраню себе варианты для истории.




«MK-61s»: область памяти «Ms»
Сегодня утром в группе, посвящённой советским программируемым калькулятором возникло очень интересное обсуждение, которое вылилось в небольшое исследовании и добавления специального режима в ретроконсоль «
Я
Ответ нашёлся в книге Я. К. Трохименко и соавторов «Программируемые микрокалькуляторы. Устройство и пользование» (1990):

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

Что
При помощи нейросети я связал эти команды с соответствующими участками микропрограммы в ретроконсоли «

Надо упомянуть, что до этой же памяти энтузиасты добирались и без работающих команд обмена — с помощью «пустышек», особых некорректных чисел. Они сбивали поиск служебной метки в кольцевой памяти, заставляя обычные стековые операции обращаться к участкам Ms. Так удавалось сохранять дополнительные числа сверх паспортного количества регистров. Сколько именно зависело от модели калькулятора и самих чисел.
Правда, так можно было сохранить всего несколько цифр, полностью использовать этот участок памяти этим способом невозможно. Да и такой способ работы с ним занимает слишком много команд, в реальной программе его использовать крайне сложно. Одну из статей, описывающих этот способ, можно найти в «Технике — молодёжи», № 7 за 1986 год.
Жаль, что разработчики не довели эту задумку до серии, расширение памяти в полтора раза и обмен регистров — это, думаю, подарок, о котором программисты того времени не могли и мечтать.
MK-61s: новый экран
В прошлый раз он вообще не запустился — на старте не подавал никаких признаков жизни. Ждал я его из Китая очень долго, специально подготовил прошивку, да и деньги потраченные жалко… Разочаровался, конечно, но отправил на тестирование коллеге, вдруг получится разобраться, в чём проблема.

«МК-61s»: новые команды
Меня тут один читатель натолкнул на идею рассказать вот о чём.
Что можно было бы дёшево улучшить
Под улучшением я тут подразумеваю
Ретроконсоль «
Позже в одном из эмуляторов появился и ответ на вопрос, заданный в начале этой заметки.
Позже Сергей Фролов провёл эксперимент и, как результат, в некоторые эмуляторы были добавлены семь дополнительных ячеек памяти и дополнительный регистр f. Казалось бы, не бог весть что, но не в том случае, когда доступно всего 105 ячеек.
Я разобрал очень много оптимизаций для своего другого проекта — языка высокого уровня
Так что семь байт и ещё один регистр — это очень большое подспорье.
В «
Дополнено 22 августа: оказывается, эксперимент провёл не Сергей Фролов. Статью я напишу позже. Мне сегодня сделали операцию, отхожу, ещё и горло заболело
«МК-61s»: новый экран
Дошёл сегодня новый экран для ретроконсоли «
Купил WEH001602AGPP5N00100: у него есть оба режима — более простой
Сегодня экран от него доехал до меня, но не заработал — не подаёт никаких признаков жизни. Мы попробовали отладить его дистанционно, я даже в одном месте припаял другое питание, но всё тщетно.
Он, судя по статьям, вообще довольно проблемное устройство, на «Хабре» есть несколько статей, ему посвящённых. Мы их с нейросетью проштудировали и заранее подготовили прошивку с обходом всех известных проблем. Жалко не помогло. Впрочем, он может оказаться просто неисправным. Чтобы проверить, нужна «Ардуинка», а у меня её нету.
Отправил экран обратно, тому же сокоманднику, который мне контакты паял, у него всё есть, посмотрим, жив ли экран или просто не подходит.
«МК-61s»: класси́к
Когда я только присоединился к проекту разработки ретроконсоли «
Позже оказалось, что только экранов может быть три разновидности, одна из которых даже имеет графический режим. Чтобы посмотреть как всё на нём смотрится, мне пришлось сделать его эмуляцию, которая транслирует видео ретроконсоли в приложение, запущенное у меня на ноуте.
К сожалению это не даёт понимание как в точности будет выглядеть изображение на реальном экране. А это мешает мне всерьёз заняться шрифтами графического режима — я совсем не уверен, что в жизни всё будет так же хорошо, как на моём виртуальном экране.
И вот, наконец, ко мне едет образец с графическим экраном, плюс заказанный графический двухстрочный экран для той консоли, которая у меня на руках — хочу побаловаться с графическим режимом и там тоже.
«МК-61s»: инструкция к играм (подробности)
Хочу чуть подробнее рассказать о том, как сделана инструкция к играм для «
Как я уже говорил, если при входе в папку Проводник ретроконсоль обнаруживает внутри файл autoexec.m61, она запускает его. Файл содержит инструкции для терминала. Это существовавший ещё до моего прихода в проект простой язык, который я довольно сильно расширил под свои нужды. Сейчас в нём есть даже условные конструкции и подпрограммы. То есть это аналог BAT-файла из мира «Виндоуса»
В данном случае autoexec.m61 первым делом командой open открывает для просмотра
На скриншоте видно оба файла. В маркдауне видно всю разметку, которая потом
После того как пользователь выйдет из инструкции, запустится сама игра — в данном случае она вводится в шестнадцатеричных кодах командой hin, потом выставляются регистры, а в конце подаются команды для старта.
В принципе, таким сценарием мы не ограничены, всё зависит от фантазии — можем выводить
«МК-61s»: инструкция к играм
Игры для калькулятора
У меня давно была мысль сделать для ретроконсоли «
Я давно, шаг за шагом начал реализовывать этот проект и вчера вечером
Вышло, на мой взгляд, очень здорово и уместно. Я в качестве теста сделал инструкцию к одной из игр, мне понравилось как это всё смотрится, возможно только листание надо переделать по более плавное, чтобы можно было прочитать разрезанные фразы. Но это уже косметика, которая легко правится.
«МК-61s»: бинарные приложения
Сейчас прошивка ретроконсоли устроена таким образом, что часть блоков при компиляции можно отключить, если они не требуются, или в том случае, если используется более скромное оборудование, для которого она не помещается.
Уже сейчас такое оборудование существует — у тех, кто собирает эту ретроконсоль на контроллере STM32F401CC, полная прошивка не собирается: не хватает памяти. Мне давно хотелось сделать для этого случая подгружаемые модули, и вчера, просидев с нейросетью до двух ночи, удалось запустить первую версию, в которой заработали два тяжёлых модуля — языки программирования «Фокал» и «TinyBASIC».
Туда же я вынес просмотрщик картинок в формате WBMP, который прикрутил недавно. Не самая нужная в этой ретроконсоли штука, но у меня есть задумка, которая может сделать её полезной.
В итоге
Внутри уже есть реализации RLE для сжатия шрифтов (я хочу подобрать
Основные требования — хорошо сжимает бинарные файлы, а распаковщик быстрый и маленький.
Я покидал в нейросетку всё найденное, добавил то, что помнил сам, и мы провели эксперимент — сжали все три получившихся модуля и выбрали победителя. Победил алгоритм ZX0, разработанный для восьмибитных компьютеров (прежде всего — «Спектрума») программистом Эйнаром Саукасом.
Утром мы ещё поработали над большей универсальностью этого подхода — хотелось устранить шероховатости и сделать его более универсальным, чтобы писать такие программные модули было проще.
На целевом оборудовании я решение не испытывал — у меня его нет, но на своей ретроконсоли всё проверил: работает. Дальше займусь специализированными инструментами, чтобы упростить создание модулей, а потом перейду к другим пунктам своего уже довольно сильно поредевшего плана развития прошивки.
«МК-61s»: виртуальный экран
Как можно было понять из моих прошлых текстов, у ретроконсоли «
Но когда у тебя в руках молоток, всё вокруг превращается в гвозди нейросеть, все такие проблемы превращаются в токены, которые надо забить в код.
У «
Через терминал такое делать неудобно, поэтому мы с нейросеткой написали клиентское приложение на «Флаттере» с виртуальным экраном и клавиатурой.
По пути пришлось решить множество проблем, самой серьёзной из которых было научить устройство нормально переключаться со своего
Как я уже упоминал выше, в этом режиме также можно передавать нажатия клавиш прямо с клавиатуры компьютера или ноутбука — набирать программы в «Фокале» и «TinyBASIC», которые я
Ну и «на сдачу» написал также аналог «Нортона Коммандера» на шелле. В принципе уже есть возможность примонтировать ретроконсоль как диск, но тут принцип другой — всё делается командами терминала. Вышло забавно, пусть будет.
Поддерживаются все горячие клавиши, видимые на скриншоте, удалённый запуск программ в терминале и просмотр изображений WBMP, который моими стараниями теперь понимает ретроконсоль. В консоль моего «Макбука» такие картинки выводятся через протокол iTerm2 или азбукой Брайля.
«МК-61s»: графика на текстовом экране
У меня давно вертится в голове идея попробовать вывести графику
Сначала я подумал, что можно было бы воспользоваться инерцией дисплея
Потом я попробовал показывать по восемь символов за раз, быстро чередуя их и отображая полное изображение за четыре кадра. Изображение стало узнаваемым, но очень низкоконтрастным. Чтобы наглядно показать, что получилось, мне пришлось сильно скорректировать уровни изображения в редакторе:
Следующая идея была сложнее: первым проходом показывать максимум общих точек, а последующими — «добивать» оставшиеся, также перепрограммируя символы «на лету». Идея могла бы сработать, тем более, что на фрагменте эталонного изображения Лены Сёдерберг вместо четырёх кадров, по нашим с нейросетью расчётам, потребовалось бы всего три.
В реальности изображение стало чётче, но отображалось полосами. Я попросил нейросеть сделать подстройку частоты кадров и попытался подобрать её, как в старом телевизоре, но всё сильно зависело от того, какой кусочек Лены был на экране. Впрочем, контрастность явно выросла. Пакман тоже стал виден лучше.
Под конец я решил разделить экран на четыре блока по восемь символов по горизонтали и отрисовывать их один за другим. Этот вариант мне понравился меньше остальных, хотя контрастность была самой высокой — блоки слишком сильно мигали.
На добивку я попробовал совместить два последних метода, но ситуацию это, пожалуй, не улучшило, просто экран стал мигать разнообразнее.
Не уверен что мне с этим всем делать, но пока оставил реализацию в экспериментальном режиме.