Uzix | микроблог

Он смог...

Очередная змейка от Квена 3.8 27b. Хотя не совсем очередная - она под MS-DOS.

Три дня и три ночи пыхтел Квен и всё же выдавил из своих кишок что-то рабочее, хотя я уже потерял надежду и сон. Это первый случай у меня когда локальная нейронка смогла сделать для MS-DOS что-то как минимум не падающее сразу на запуске. Раньше так получалось только у Кодекса. Качественный скачок случился когда на второй день я устал после нескольких десятков тестов кидать скриншоты с ошибками и сказал Квену - на тебе exe-шник DOSBox, долбись сам.

Промпта особого не было, но делал в два этапа. Сначала подсунул компилятор openwatcom, библиотеку allegro и попросил сделать hello world на ней. Второй сессией я просто сказал сделать нормальную змейку с красивой графикой и музыкой.

snake-dos.7z 7.8 MB

Небольшой анонс. Сделал свою вариацию Мурмулятора - Мурмулятор.1010: плата ра...

Небольшой анонс. Сделал свою вариацию Мурмулятора - Мурмулятор.1010: плата размером 10x10см для корпуса Gainta G738 / G706. Мурмулятор (https://murmulator.ru/) — это одноплатный DIY микрокомпьютер на базе Raspberry Pi Pico (не путать с “большими” Raspberry Pi), предназначенный для эмуляции популярных 8- и 16-битных платформ, таких как ZX Spectrum, NES, IBM PC и т.д.

  • Полная совместимость по прошивкам с Мурмулятором версии M2P2;
  • Микроконтроллер RP2350B;
  • Видео HDMI + VGA + композит (ТВ). Всё можно запаять одновременно, VGA - выносной разъём или вместо HDMI;
  • Звук PWM + I2S TDA1387T (переключается перемычками) + операционый усилитель LMV358;
  • USB хаб HS8836A;
  • WiFi ESP8266;
  • RTC DS3231MZ;
  • 2 PSRAM ESP-PSRAM64 на SPI и QSPI;
  • Питание Type C.

Пока пусть полежит-настоится, потом закажу, соберу, по результатам выложу в open source.

Портировал на MiSTer FPGA свежую версию TSConf...

Портировал на MiSTer FPGA свежую версию TSConf с некоторыми доработками. Отличия от официального ядра TSConf для MiSTer:

  • Синхронизировано с апстримом TSConf на 15 июля 2026 года
  • Видеорежимы 48.8 и 60 Гц
  • Поддержка OPL3 (на основе кода из ao486)
  • Вывод MIDI через порты ввода-вывода AY (нужно включить в меню мистера UART MODE CONNECTION - MIDI)
  • UART через ZiFi-совместимые порты
  • Улучшено качество звука на аналоговых платах MiSTer FPGA без ЦАП I2S
  • Два настраиваемых джойстика с поддержкой режимов 8-битного Kempston, Sinclair, Cursor и QAOPM
  • Поддержка колеса мыши Kempston
  • Возможность поменять местами кнопки мыши Kempston
  • Раскладка клавиатуры приведена в соответствие с ZX Evolution
  • Улучшена совместимость с контроллерами клавиатур PS/2
  • Можно одновременно использовать две SD-карты: карта № 1 — VHD-образ, хранящийся на основной SD-карте MiSTer, а карта № 2 — физическая дополнительная SD-карта. Если VHD-образ не подключён, физическая дополнительная SD-карта становится картой № 1
  • Переключаемая панорама PSG: ABC или ACB
  • Выход магнитофона подмешивается в общий аудиовыход
  • Исправлен видеоглюк в Demorama
  • Различные улучшения и исправления, о которых даже я уже не помню

Ссылка на исходный код и бинарники: https://github.com/UzixLS/TSConf_MiSTer

Сдул пыль со старого проекта - PCI-OPL3...

Сдул пыль со старого проекта - PCI-OPL3. Полтора года назад остановился на том, что в некотором софте карта определяется через раз. Как работает алгоритм детекта? Код записывает значение в регистр чипа OPL для запуска таймера, ждёт некоторое время, а затем читает регистр статуса - переполнился таймер или нет. Чтение и запись регистров на карте работают стабильно и без ошибок. Но, как оказалось, слишком быстро. Чтобы не реализовывать полноценную задержку на системном таймере, авторы некоторого софта полагались на то, что длительность инструкции чтения/записи регистров будет фиксирована, и для создания задержки просто делали несколько чтений в цикле. Для ISA это работало, для PCI уже нет.

В своей карте я применил PCI-ISA мост CH365P. Он довольно примитивный и не умеет растягивать I/O циклы, а значит это придётся делать софтово. Для этого вместе с кодексом я набросал простой драйвер, который через EMM386 перехватывает обращения к портам карты и вставляет дополнительные циклы ожидания.

На первый взгляд это работает нормально. Попроверяю ещё - и можно релизить.

И снова про нейросети, но для спектрума...

Нейронки, оказывается, вполне умеют писать ассемблерный код для ZX Spectrum.

Есть у меня плеер MIDI, и в нём есть драйвер FAT32. Дал бесплатному Codex простой промпт: “Это проект плеера для ZX Spectrum, написан на sjasm. Для проверки и сборки используется команда make all. В src\fatfs.asm находится драйвер FAT32. Добавь в него поддержку FAT16.” - никакой другой настройки, никакого дополнительного контекста. Задача так-то не сложная, но мне всё время было недосуг вспоминать/заново разбираться с устройством FAT (правда, всё равно пришлось чтобы сделать ревью). К моему удивлению, нейрока не просто справилась, но сделала это с первой попытки, написала вполне пригодный код и ничего при этом не поломала. Нашлось пара мелких косяков оптимизации, но спустя пару промптов нейронка всё сама и поправила. Ну и комментариев маловато оставила, их я уже сам добавил в процессе ревью.

А вот с локальными моделями этот же эксперимент, к сожалению, провалился. Все три опробованные модели - Qwen3.6-27B-Q6_K, Qwen3-Coder-Next-UD-Q4_K_XL и Qwen3.5-122B-A10B-UD-Q3_K_XL явно не понимали что здесь происходит, почему при сборке всё время мешает какой-то там ассерт на размер структуры, и вообще за что им всё это :)

Коммит для любопытных.

Про нейросети...

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

Хотя есть кое-что. Оказывается, существуют майнерские GPU, которые на барахолках продаются чуть ли не на развес. В теории - это древние убитые карты которые уже ничего не могут. Но на практике оказалось что они довольно неплохи как входной билет в локальный запуск LLM - чтобы понять надо ли оно мне вообще не тратя большие суммы. Я приобрёл пару таких GPU: P102-100 и CMP 50HX (она поновее, но, как оказалось, хуже) по 10Гб VRAM каждая. Чтобы вместить три (вместе с уже имеющейся RTX 5060 16Gb) карты в корпус - пришлось немного поработать дрелью и метчиком, и добавить дополнительный слот с помощью адаптера M.2 - PCIe.

Что по результату: получившая конфигурация запускает с удовлетворительной скоростью Qwen 3.6 и Gemma 4 - лучшие сейчас нейросети из небольших. Это, конечно, не Codex или Claude, но для типовых простых задач кодинга они вполне пригодны.
Прямо сейчас я с помощью Qwen полностью переделываю свой сайт err200.net. Вёрсткой я никогда не любил заниматься, и без нейронок скорее бы его удалил чем переделал. Но когда можно написать “Сделай мне сайт на Hugo”, “Сделай переключатель светлой/тёмной темы”, “Импортируй записи из моего блога в Telegram” или даже “Что-то тут криво выглядит, почини” - а затем просто наблюдать как нейронка сражается с километровыми манускриптами CSS и JS - то почему бы и нет :)

Понемногу продвигается IO плата...

Понемногу продвигается IO плата для MiSTer FPGA. Кстати, кто-нибудь встречал переходник с MicroSD на FFC (тонкий шлейф)? Хочу вывести карту памяти с платы Мистера на заднюю панель, но для этого нужно делать отдельную плату толщиной 0.6-0.8мм, может есть что-нибудь готовое?

Бывает вот сидишь...

Бывает вот сидишь, потихоньку ковыряешься в заброшенном проекте, правишь в коде свои глупые ошибки. И, ВНЕЗАПНО, в самый неожиданный момент оно начинает работать :o

SPDIF в OtterlyMIDI заиграл. Я успел пожалеть что решил сделать его по хардкору - без специализированного модуля SAI (которого нет в дешёвых попсовых контроллерах), а жонглируя битами в I2S + в последнем свободном SPI. Но каким-то магическим образом биты всё же встали на свои места, сложились в манчестерский код, который сложился в семплы, которые сложились в музыку. Ура!