image

Я, как и многие мои читатели, очень люблю игры. Уже довольно обширное число моих статей было посвящено ремонту и моддингу самых разных игровых консолей — как китайских «нонеймов», так и брендовых PSP и PS Vita! Однако, меня тянет к железу не только желание отремонтировать и поставить в строй «устаревшие» девайсы, но и мания делать и созидать что-то своё! А ещё я очень люблю программировать игры и графику сам. Недавно я загорелся идеей разработать с нуля свой портативный «тетрис»: от схемы и разводки платы, до написания прошивки и игр под нее. Что получается, когда программист, который поставил электронику практически во главе своей жизни, пытается сделать свое устройство? Читайте в статье!

Как я к этому вообще пришел?


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

image

Собрать свой гаджет в пределах одной-двух тысяч рублей стало вполне реальным. Люди собирают себе самые разные устройства, а игровые приставки — одна из самых популярных тем. Однако, для многих людей, которые только начинают знакомится с миром embedded-электроники, собрать консоль в своем корпусе с Raspberry Pi на борту и RetroPie в качестве оболочки — за счастье.

image

Однако есть определенная категория электронщиков, к которой отношусь и я — нам нужно делать всё с нуля! Свои проекты я стараюсь реализовывать на самопальных фреймворках/движках, точно также я мыслю и в подходе электроники — ну не могу я использовать чужие решения и стараюсь разобраться в вопросе сам. За моей спиной есть весьма интересные демки. Например, это моя игрушка с незамысловатым названием «ралли-кубок ТАЗов», которую я написал за неделю с нуля (рендерер, звук, ввод, редактор уровней — все свое) в 2022 году:

image

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

Из чего будем делать?


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

Характеристики моего девайса следующие:

  1. Процессор: двухядерный ARM микроконтроллер RP2040 на частоте 133мгц, построенный на архитектуре Cortex-M3. Сам процессор распаян на плате Raspberry Pi Pico.
  2. ОЗУ: 260 килобайт SRAM, встроена в процессор. Немного, но если грамотно распоряжаться ресурсами — то хватит.
  3. ПЗУ: 2Мб SPI Flash-памяти, также распаяны на плате.
  4. Дисплей: 1.8" TFT-матрица с разрешением 128x160. Выбор разрешения обусловлен производительностью будущей консоли — процессор банально не сможет заполнять матрицу с относительно высоким разрешением.
  5. Ввод: 6 кнопок, 4 из которых — направление, 2 — действий. В будущем могут добавиться еще несколько.
  6. Звук: динамик. Пока не знаю, с чего рулить будем — возможно, возьмем «железный» ШИМ-контроллер процессора, а возможно прикрутим внешний ЦАП с i2s.
  7. Питание: 3.7в аккумулятор BL-4C. Да, да, тот самый с Nokia и современных кнопочников! Аккумулятора, емкостью в 800мАч должно хватать хотя-бы на 4-5 часов игры. При этом зарядка АКБ обеспечивается модулем TP4056.

Весьма неплохо для самоделки, согласны? Как я уже говорил раннее, эти характеристики примерно соответствуют мобильным телефонам 2004-2006 годов — Nokia 6600, Sony Ericsson K510i, Samsung D800. Отличие лишь в ОЗУ (в телефонах её 2-4 мегабайта) и периферийных модулях типа контроллера дисплея.

image
На фото E398 — мобилка 2004 года выпуска, но она здесь не просто так. :)

Важную пометку нужно сделать касательно дисплеев: эти 1.8" матрицы бывают приходят с «синевой» — это не железная проблема и не совсем брак. Сам контроллер в дисплея в них сильно греется (хотя токоограничивающий резистор стоит) и негативно влияет на клей, из-за чего матрицы отклеивается от подсветки и слои поляризации начинают «синить» картинку. Лечится проклееванием подложки матрицы суперклеем.

image

RPi Pico я решил выбрать, поскольку информации про них достаточно мало, характеристики хорошие и пока что никто особо ничего на них не делал, тем более в рунете. А ещё у них очень удобное и простое SDK, практически bare-metal. ESP32, например, работает на FreeRTOS и имеет кучу библиотек, здесь же API простое и понятное.

image

Закупаем все необходимое и начинаем творить!

Графика


В первую очередь нам нужно подключить дисплей и что-нибудь на него вывести. Заодно и SPI погоняем на незнакомом чипсете, благо работа с ним очень простая — задаем конфигурацию пинам (gpio_set_function), настраиваем SPI-контроллер и можно посылать данные.

image

SPI у RP2040 работает на частоте вплоть до ~60мгц — это достойная скорость передачи, в том числе и для быстрого вывода графики. На самом деле, SPI даже предпочтительнее чем параллельный 8080-интерфейс для использования в микроконтроллерах: дело не только в количестве занимаемых пинов, но и в возможности использования DMA!

В подобных проектах всегда нужно делать так, чтобы дисплей можно было при необходимости поменять, а желательно вообще научить работать его с несколькими контроллерами: разные дисплеи одной диагонали могут использовать разные контроллеры. В моём случае, это ST7735. Для разрешений 240x320 используются ILI9325, ILI9341, ST7789. Команды инициализации дисплея честно позаимствованы, но именно в этом нет ничего зазорного — сама система команд относительно стандартизирована, отличается лишь первичная настройка питания, гамма-коррекции и т. д — часто init sequence вставляет сам производитель в даташит.

image

После инициализации дисплея пробуем что-нибудь вывести. Да, все работает без проблем. Пару важных нюансов: ST7735 требует посаженный на землю CS, в воздухе его оставлять нельзя, как некоторые ILI (вы ведь навряд ли будете вешать несколько устройств на одну шину с дисплеем, когда есть вторая?) и логическое состояние 1 на пине RESET (в воздухе и «на земле» он будет висеть в постоянном ресете).

image

Для полустатичной графики, можно обойтись лишь командами дисплея — например, тут есть удобные функции для заливки прямоугольников (setArea и пишем цвет без остановки) или скроллинга. Сделано это для более слабых микроконтроллеров. Нам они не подойдут — выделяем память под фреймбуфер/бэкбуфер и настраиваем канал DMA для разгрузки процессора в процессе передачи данных:

image

Саму картинку подготавливает процессор: именно он рисует картинки и он же делает их прозрачными. На него ложится основная работа, однако мы можем ему помочь разгрузиться, если отдадим передачу уже подготовленного кадра на дисплей на DMA (Direct Memory Access) — устройство в микроконтроллере, которое позволяет процессору настроить параметры передачи данных, а DMA их будет сам копировать из памяти или в память. Таким образом, можно реализовать асинхронное копирование нескольких блоков ОЗУ, или, как в моем случае — передачу буфера кадра на дисплей, пока процессор готовит следующий. Чем больше разрешение — тем больше эффекта от DMA!

image

Кроме того, важно выбрать формат цвета для нашего дисплея: я выбрал 2-х байтный RGB565 (5 бит красный, 6 бит зеленый, 5 бит синий). Это экономичный формат который выглядит красивее палитровой графики и кушает не так уж и много драгоценной памяти. Кроме того, на данный момент мы умеем отрисовывать изображения произвольных размеров с прозрачностью — вместо альфа-канала здесь используется так называемый colorkey — концепция, очень близкая к хромакею, только она берет в качестве трафарета конкретный цвет. В нашем случае это «255 0 255» (ярко розовый).

image

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

Ввод


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

image

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

image

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

image

Есть ещё способ реализации больших клавиатур и геймпадов: когда все кнопки вешаются на пару линий, где на выходе каждой кнопки есть резистор определенного номинала. ЦАП микроконтроллера считывает это значение (допустим — 1024 это вверх, а 2048 — вниз) и таким образом определяет текущую нажатую кнопку. Таким раньше любили промышлять китайцы, из-за чего нельзя было нажать одновременно вверх и вправо, или вниз и влево и т. п.

image

Пишем игру


Теперь у нас есть минимально-необходимая основа для написания игры. Первой игрой для своей консоли я решил написать классический шутер в космосе — летаем на кораблике и сбиваем врагов, попутно уворачиваясь от их пулек. Заодно проверим консоль на стабильность.
Писать я её решил в классическом C-стиле, как и принято в embedded-мире: без std и тем более stl, без ООП и виртуальных методов, аллокаций по минимуму. В общем, примерно как писали игры под GBA! В первую очередь, подготавливаем спрайты нашей игры, прямо в пейнте, а затем конвертируем их в представление обычного массива байтов в виде header-файла. На первых порах это удобнее, чем делать свой ассет-пул:

image

Архитектуру я организовал в виде нескольких подфункций, каждая из которых занимается своим стейтом (world/menu) и своими объектами (playerUpdate) и их отдельные версии для отрисовки. Сами игровые объекты я описал в виде структур, а центральным объектом сделал CWorld.

image

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

image

Единственные аллокации, что я использовал — это для пулов с пулями, и с врагами. Оба пула четко ограничены — до 8 врагов на экране, и до 16 пулек — вполне хватает. Динамические аллокации помогли мне найти серьезную ошибку в коде — в один из моментов игра просто валилась с Out Of Memory. После того, как я немного поменял условия и делал аллокейты тех же самых объектов каждый кадр — игра переставала крашится. Причина оказалась простая — невнимательность (вместо >= было >), по итогу при отрисовке спрайтов за пределами экрана, программа сама начинала портить вунтренние структуры аллокатара и самой игры (проявлялось в глюках и телепортациях). После фикса, все заработало как нужно. :)

image

Ну и для основной части геймплея с выстрелами и столкновениями, я предусмотрел несколько функций, которые спавнят игровые объекты и сами управляют пулом. Противники обновляются как обычно, для коллизий используется AABB (axis aligned bounding box, ну или его 2D-подмножество в виде rect vs rect).

image

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

image

Ниже выкладываю принципиальную схему устройства, она очень простая, поэтому смысла делить ее на несколько листов нет. Разводить учился, читая сервис-мануалы и схемы :)

image

Заключение


Полная цена сборки прототипа составила:

  • Raspberry Pi Pico — 557 рублей (но я брал на Яндекс Маркете, на «алике» дешевле — около 300 рублей).
  • Дисплей — 380 рублей, заказывал на «алике».
  • Макетка — 80 рублей, в местном радиомагазине.
  • Кнопки. По 5 или 10 рублей штучка, пусть будет 60 рублей.

По итогу, прототип мне обошелся в 1077 рублей. Бюджетненько, да, с учетом того, что можно сделать еще дешевле? Я тут так подумал, у меня есть желание развивать и поддерживать консоль в будущем и под консоль уже можно делать что-то своё… может, если вам будет интересно, делать их на заказ? Соберу вам по себестоимости (до 1.000 рублей) + доставка, если хочется попрограммировать под что-то маленькое, но самому паять не хочется. Мне было бы очень приятно. Пишите в личку или комменты, если вас заинтересовало бы такое! :)

image

Весь процесс разработки этого девайса занял у меня всего несколько дней. Я и до этого понимал концепцию работы 2D-графики на видеокартах прошлого века, поэтому ничего особо нового я для себя не открыл. Однако, я попробовал свои силы в разработке игровых девайсов, которые могут приносить удовольствие — как ментальное от самого процесса сборки и программирования, так и физическое от осознания того, что игра на нем работает. :)

Однако, это далеко не конец проекта! У нас ещё много работы: нужно развести и протравить полноценную плату, реализовать звук и API для сторонних игр, придумать корпус и распечатать его 3D-принтере. Кстати, я ведь обещал что скоро будут и другие интересные проекты с 3D-принтером: как минимум, мы доделаем предыдущий проект игровой консоли из планшета с нерабочим тачскрином и RPi Pico.



Возможно, захочется почитать и это:


Комментарии (46)


  1. bodyawm Автор
    27.07.2023 08:02
    +5

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


    1. RomanSk
      27.07.2023 08:02

      а исходник игрушки доступен? было бы интересно и ее портировать )


      1. bodyawm Автор
        27.07.2023 08:02
        +1

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


  1. fiego
    27.07.2023 08:02
    +7

    Есть смысл в этом проекте?

    Конечно, есть. В основном, на мой взгляд, в том, что автор с интересом и удовольствием провёл время.

    Из практических соображений, я бы брал таки ESP32, там и RAM/Flash больше, и SPI быстрее и если делать игровую платформу, то вайфай уже есть -- можно многопользовательские игры делать. Сам давно думаю про игровую платформу, но не могу придумать "идеал". Хочется дисплей побольше, где-то бы 3.5", но чтобы разрешение там было не таким большим, как у тех, что доступны. Самый "разумный" у меня есть ILI9341, 320x240 2.8" -- это самый близкий к желаемому. Но расход памяти под буфера/спрайты/виртуальные экраны довольно высок при таком разрешении. Вот и решил пока выждать, авось вернутся RPi Zero по 5 долларов...

    заказали бы его по себестоимости?

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


    1. bodyawm Автор
      27.07.2023 08:02
      +2

      Из практических соображений, я бы брал таки ESP32, там и RAM/Flash больше, и SPI быстрее

      У еспшки из серьезных преимуществ лишь наличие внешней SPI-шины для SRAM и встроенного DAC. Малинка по производительности уделает есп, т.к гонится аж до 400(!)мгц, правда, с соответствующим потреблением и тепловыделением :)

      В ОЗУ пока не упираемся, а ПЗУ хватает для игрушек уровня Java-игр с кнопочных мобилок (что уже неплохо для DIY!).

      Хочется дисплей побольше, где-то бы 3.5", но чтобы разрешение там было не таким большим, как у тех, что доступны

      Эт да. Вот бы хотя-бы 2.4" матрицу 128х160. Впрочем, если есть осцилл - можете купить китайский закос под Galaxy S2/S3/S4 с авито на Java (100-200 рублей стоят). Дисплеи у них с паябельными шлейфами с очень приятным шагом (1мм), 5в подсветкой, интерфейсом 8080 и достаточно низкого разрешения (240х320 на 5" - норма), распиновки на них нет, но с осциллом можно будет найти сигнальные линии прям на рабочей мобилке :) Бонусом - резистивный тачскрин.

      Вот и решил пока выждать, авось вернутся RPi Zero по 5 долларов...

      Не вернутся. Но для вас тоже есть вариант за норм деньги) Lctech Pi Zero на базе AllWinner F1C200s - ARMv5 ядро без FPU, 64мб DDR ОЗУ прямо на чипе, Linux/Melis OS в качестве системы. 1.5к рублей на алике. Что самое классное там - так это коннектор под 40pin дисплеи от навигаторов прямо. Подключаешь дисплей и он работает из коробки. Но тач (резистивный) работать не будет, по крайней мере, без отключения UART-консоли :c

      Модуль Lctech Pi F1C200S Linux с открытым исходным кодом | Запасные части | AliExpress

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

      Пока не знаю, почему на Хабре статья не зашла (возможно люди ожидали видеть готовое устройство), но на DTF уже несколько человек зарезервировали под себя и попросили собрать :)


      1. fiego
        27.07.2023 08:02

        но на DTF уже несколько человек зарезервировали под себя и попросили собрать :)

        Прошу прощения за необразованность, но это где?

        Я "из спортивного интереса" сделал себе "часики": https://www.youtube.com/watch?v=7H-2-X1M7PA -- заинтересовавшихся было чуть больше нуля.


        1. bodyawm Автор
          27.07.2023 08:02
          +3

          dtf.ru


          У меня ж техноблог, люди интересуются


        1. RomanSk
          27.07.2023 08:02

          часики прекрасны! а исходник доступен? хочу сконвертировать для своего мульти-девайса )


          1. fiego
            27.07.2023 08:02
            +1

            Внимательный зритель мог бы нажать на описании под видео "показать больше":

            Обратите внимание на последнюю строчку
            Обратите внимание на последнюю строчку

            Но, вдруг чего не видно, оставлю ссылку ещё и тут: https://github.com/jef-sure/ili9341_dgx


            1. RomanSk
              27.07.2023 08:02

              спасибо!


          1. fiego
            27.07.2023 08:02
            +1

            Кстати, если вдруг захочется рукописные шрифты самостоятельно делать, у меня для этого отдельный проект появился. Я его не закончил ещё, но получить нужные наборы кривых позволяет. В часах он не использовался, там я координаты "на глаз" подогнал. Изза незаконченности проекта, описания/документации нет, но, достаточно клонировать и загрузить в браузере index.html: https://github.com/jef-sure/hw-fonts


          1. fiego
            27.07.2023 08:02
            +1

            Кстати, если вдруг захочется рукописные шрифты самостоятельно делать, у меня для этого отдельный проект появился. Я его не закончил ещё, но получить нужные наборы кривых позволяет. В часах он не использовался, там я координаты "на глаз" подогнал. Изза незаконченности проекта, описания/документации нет, но, достаточно клонировать и загрузить в браузере index.html: https://github.com/jef-sure/hw-fonts


      1. NutsUnderline
        27.07.2023 08:02

        на ESP32-S3 предусмотрено несколько интерфейсов для дисплеев, включая RGB и есть готовые платы с дисплеями, да еще и с картридерами MicroSD. готовый набор по сути, что вполне может привлечь программистов не паяльщиков. Более того - odroid go на ней уже сделали

         F1C лучше все таки в baremetal попробовать было бы. Но это уже для тонких ценителей.


        1. bodyawm Автор
          27.07.2023 08:02

          Bare-metal интересно, да. А вот исходники RTOS Melis не дают, ток под другой чипсет(

          На еспшке 8080 интерфейс софтовый вродь



  1. RomanSk
    27.07.2023 08:02
    +1

    прекрасная статья, отличный проект! идея собственных консолей продолжает расширяться ) я свой тоже продолжаю ковырять )) https://www.espboy.com
    https://habr.com/ru/articles/558954/

    и даже уже есть для самостоятельной сборки упрощенный комплект https://oshwlab.com/espboy/espboy-easy-v1_copy


    1. bodyawm Автор
      27.07.2023 08:02

      Пасиб большое! Интересная тема, однако я беру чип помощнее как раз таки для того, чтобы получить крутой графон уровня сонериков. Аффинные трансформации, альфа-блендинг, возможно софтовый 3D-растеризатор (без FPU, угу) :)


      1. RomanSk
        27.07.2023 08:02
        +1

        отличные планы! но esp8266 тоже кое что может )) почти все из перечисленного опробовано. можете брать мои исходники и адаптировать. а может захочется собрать ESPboy и опробовать фирменные AppStore/WebAppStore и фирменные IDE -- LittleGameEngine/MicoJS? ))

        https://youtu.be/Us3U-DFOUJQ

        https://youtu.be/fPyr4FFCSZI

        https://youtu.be/qqwesfUvMiA

        https://youtu.be/bzgAMhvfRJU

        https://youtu.be/dR8sXnjZ5G4


        1. voldemar_d
          27.07.2023 08:02

          Смотрю статью и вижу, что Вы там пишете про разрешение 128*128 экрана EspBoy, но на фотографии вижу девайс, в котором запущен ZX Spectrum с игрой Dizzy. Там же разрешение 256*192, картинка масштабируется, что-ли?


          1. RomanSk
            27.07.2023 08:02

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

            картинка интерполируется до 128x128

            а в эмуляторе GameBoy есть выбор, обрезать края или тоже интерполировать


            1. voldemar_d
              27.07.2023 08:02

              А сложно доработать проект так, чтобы в экране 320х240 показывался экран Спектрума по центру без масштабирования? Или там каких-то ресурсов не хватает?


              1. bodyawm Автор
                27.07.2023 08:02

                Хватает, прост 1.8 дисплейчики копеечные) 1.8 150 рублей, 2.4 - 400 или 500 с тачскрином


              1. RomanSk
                27.07.2023 08:02

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


  1. voldemar_d
    27.07.2023 08:02

    Хороший проект. Но мне просто интересно: как в 1993 году игра Doom работала на одноядерном процессоре с частотой 33 МГц, с экраном 320х240, и производительности хватало, а Вы пишете, что выбрали 2-ядерный процессор с частотой 133 МГц для экрана с меньшим разрешением потому, что иначе производительности не хватит? И это при том, что в Doom 2.5-мерная графика, а здесь всего лишь 2-3 десятка спрайтов. Такое и на ZX Spectrum работало, пусть даже с куда более бедной цветовой палитрой. Я это к чему: может, для такой игры и Arduino хватило бы, если к нему памяти добавить для экранного буфера? Или выше про ESP написали.


    1. bodyawm Автор
      27.07.2023 08:02

      2 ядра мне изначально не были нужны, я взял RPi Pico поскольку про них мало информации и особо никто ничего серьезного не делал. Хотелось испытать его в деле. В думе, фактически выводом графики и звука занимаются отдельные чипы - на МК же эта работа ложится на проц (при наличии DMA, как я и показал в статье, это можно переложить на него).

      Основная суть в том, чтобы иметь задел на будущее: возможность применять аффинные трансформации к спрайтам, альфа-блендинг, выводить партиклы и.т.п. Про разрешение упор не столько в проц, сколько в ОЗУ - всего 264кб, 240x320 сожрет половину памяти :(

      Касательно частоты - консоль сейчас жрет слишком много (аж 0.2А), клок буду тормозить до 70мгц. Если что - астероиды в посте не единственная игра под нее :)


      1. RomanSk
        27.07.2023 08:02

        на RP2040 есть подобная консоль. кажись в том году сделали

        https://shop.pimoroni.com/products/picosystem?variant=32369546985555


        1. voldemar_d
          27.07.2023 08:02

          Что эта консоль, что EspBoy - out of stock :(


          1. RomanSk
            27.07.2023 08:02

            tindie.com запретил российским разработчикам публиковаться и paypal тоже всех залочил. на моем офф сайте www.espboy.com западным ребятам можно купить и они покупают. но я советую купить на Aliexpress копеечные детальки и на perfboard запаять согласно схемы с сайта. Или если что-то поприличнее, то взять Gerber DIY версию c easyeda.com и заказать у китайцев удобные готовые платки


      1. voldemar_d
        27.07.2023 08:02

        Половина памяти - а так ли это много? Сколько сейчас памяти код программы занимает? Если 10%, то и ладно. Нагрузку на процессор пробовали измерять? Например, если рендеринг производится с частотой 50 кадров/сек, сколько миллисекунд занимает подготовка данных для одного кадра? Если почти 20 мс, тогда это впритык. А если, например, всего 2 или 5 мс, то получится, что процессор почти не нагружен.


        1. bodyawm Автор
          27.07.2023 08:02

          Там же гарвардская архитектура - шины кода и данных отдельно. Обрабатывать 240х320 фреймбуфер, заливая его небольшими спрайтами - не проблема. Проблемы с филлрейтом могут начатся на полупрозрачных параллаксовых фонах только.


        1. RomanSk
          27.07.2023 08:02

          если рендерить по точкам, то это адски медленно

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

          https://github.com/xsrf/nbSPI

          Но так приходится извращаться потому, что DMA нету. А если есть DMA, все гораздо проще, но тогда приходится кучу памяти тратить на буфер экрана. Но если рендерить вручную, то буфер экрана можно делать под любую удобную грубину цвета, экономя память, но на лету преобразуя построчно вывод на дисплей... еще есть методика слайсами рендерить и игру и ее потом на дисплей, имея размер буфера скажем 1/4 экрана или 1/8. вообще разные методики есть которые "не в лоб"


  1. voldemar_d
    27.07.2023 08:02

    Есть ещё энтузиаст, который делал подобные проекты, например:

    https://youtu.be/wPVtNHVkfvM

    У него в канале и Tetris есть.


    1. RomanSk
      27.07.2023 08:02
      +1

      основные проекты по этой теме в мире это:

      1. www.arduboy.com

      2. www.pokitto.com

      3. www.gamebuino.com

      ну и мой

      4. www.espboy.com,

      есть еще куча, например PlayDate, но еще более специфические

      мой ESPboy может практически любой софт воспринимать от вышеперечисленных после перекомпиляции и небольших правок кода (а понаписано за последние годы для этих девайсов тонны всякого и комьюнити довольно активные, пришлось переделать основные их библиотеки под ESPboy), а для удобства загрузки приложений есть AppStore и WebAppStore, чего больше ни у одного проекта пока нет

      а вообще еще больший перечень консолей на MCU тут:

      https://github.com/oshaboy/awesome-indie-handhelds

      а более крутых тут:

      https://en.wikipedia.org/wiki/List_of_handheld_game_consoles


      1. bodyawm Автор
        27.07.2023 08:02

        Есть загрузчик бинарников, или прошивка статически линкуется?


        1. RomanSk
          27.07.2023 08:02

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

          еще можно через веб загружать https://espboy.m1cr0lab.com/demo/appstore/ через Arduino IDE и через tool от Espressif


          1. bodyawm Автор
            27.07.2023 08:02
            +1

            Так и не понял, там просто OTA-раздел используется, или именно самопальный формат?


            1. RomanSk
              27.07.2023 08:02

              ота


              1. bodyawm Автор
                27.07.2023 08:02
                +1

                Понял. Скрипт линкера вообще каша у есп канеш. Хотел протянуть стдлиб от свой прошивки в кастомные бинарники, но у тенсилики непонятный закрытый ABI и забил


                1. RomanSk
                  27.07.2023 08:02
                  +1

                  но у меня при компиляции внутри каждого основного кода добавляется еще код AppStore, который запускается, если стартануть консоль с зажатой кнопкой А или Б и таким образом всегда по OTA можно прошивку обновить, выбрав нужное из списка, если конечно доступен WiFi. потому, что каталог и приложения конечно же тоже из сети подгружаются и если я туда чего-то добавляю, у всех пользователей оно становится тоже доступно


                  1. bodyawm Автор
                    27.07.2023 08:02

                    Ну вот это и называется "как бы" статической линковкой, когда по сути сервисная часть прошивки линкуется с игрой)) В идеале конечно загружать сторонний код, но при этом прокидывать std и аллокатор от основной прошивки дабы не дублироваться.


                    1. RomanSk
                      27.07.2023 08:02

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


                      1. bodyawm Автор
                        27.07.2023 08:02

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


                      1. RomanSk
                        27.07.2023 08:02

                        Ну для меня такое дюже сложно )


      1. voldemar_d
        27.07.2023 08:02

        Спасибо за ссылки, поизучаю. Интересно, какие игры реализованы на Arduboy, где всего 2.5 килобайта памяти? OLED-дисплей SSD1306 в графическом режиме под буфер прилично памяти требует, что там еще запихать удаётся?


        1. bodyawm Автор
          27.07.2023 08:02

          2.5 килобайта ОЗУ. ПЗУ там 32кб, чего хватает под простую монохромную графику, или процедурно-генерируемую.


        1. RomanSk
          27.07.2023 08:02

          на Arduboy порядка 300 игр старой школы https://arduboy.ried.cl

          штук 150 я портировал уже на ESPboy и потихоньку остальные добиваю

          но последняя версия ArduboyFX имеет еще мегабайт флеша на борту и стали возможны игры совсем другого уровня, например https://community.arduboy.com/t/prince-of-arabia-fx

          еще более свежее достижение - парни научились на ЧБ OLED рисовать градации серого и сделали под это библиотеку, https://community.arduboy.com/t/arduboyg-grayscale-library теперь новые игры делаются еще более крутые с учетом 4 полутонов и FX памяти

          https://community.arduboy.com/t/untitled-grayscale-rpg-dev-log

          https://community.arduboy.com/t/dark-under-ii