MK-61s и «Спектрум»

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

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

На экране МК-61s показан интерфейс эмулятора ZX Spectrum с игрой, отображающей лабиринт и игровое меню.
Несколько игр из скачанной из интернета подборки, в которые я попробовал поиграть

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

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

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

На экране показаны скриншоты ZX Spectrum игр: лабиринт, аркада с прыжками через препятствия, платформер с зелеными врагами и счетчик очков.
Игры с расширенной графикой, в детстве о таком я и мечтать не мог

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

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

В случае «ПикоКалка» такое устройство нашлось — оказалось, что у него есть аналог южного моста — микроконтроллер «STM32F103C8T6» с процессором «Кортекс-М3», обслуживающий периферию. Он обменивается данными с центральным процессором через довольно медленную шину I²C, но соединён с ним ещё и через UART, где скорость на порядок выше.

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

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

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

Комментарии 4

Алексей Сугоняев № 1
А у RP2040 разве не два ядра?