Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Выкладываю сорцы эмулятора SEGA Master System / Game Gear (2 эмулятора в одном) для STM32H743 (отладочная плата Nucleo-H743).
1) Управление:
U D L R B A Select Start (в Master System: "B" - начать игру, "Start" - пауза/снятие с паузы)
X - сохранить стейт Y - восстановить стейт
Стейт остаётся живым после ресета CPU.
2) Конфиг:
Файл Port.h:
a)
CODE
#define EMU_SMS 0 /* SEGA Master System */ #define EMU_GG 1 /* SEGA Game Gear */
#define EMU_TYPE EMU_GG
Тип эмулируемой консоли: обязательно не забыть изменить его, если нужно. Зависит от ROM'а: файлы *.gg - Game Gear, *.sms - Master System
Только в режиме Game Gear доступен фильтр SaI2x: исходный кадр 160x144 преобразуется в 320x240. В режиме Master System изображение выводится без фильтра: кадр 256x192 по центру
Тип контроллера дисплея LCD от Sony Ericsson K790(i)/K800(i). У меня есть оба варианта дисплеев - оба отлично работают (с контроллером Toshiba, чисто субъективно, качество картинки чуть-лучше).
3) Регион.
Japan. NTSC. Именно в такой конфигурации доступен FM синтезатор в играх, где он есть. FM синтезатор звука есть только в Master System. В Game Gear всегда был только PSG.
Отличия звука PSG от FM. PSG звучит довольно примитивно, "школьный" звук. FM - звук более сложнее и богаче.
Массив констант dphaseTable был посчитан на ПК и статически линкуется во Flash контроллера. Размер 256 кБ. Массив констант tllTable был посчитан на ПК и статически линкуется во Flash контроллера. Размер 128 кБ.
Это высвободило 384 кБ оперативной памяти SRAM контроллера.
Эмуляция процесосра Z80:
CODE
BIG_FLAGS_ARRAY=0 /* DISABLED big flags array for ADD/ADC/SUB/SBC/CP results */
Это высвободило 256 кБ кучи (heap).
c) Загрузка ROM'ов:
ROM игры не дублируется в SRAM, а читается из Flash-памяти напрямую.
Все эти мероприятия позволили запустить эмулятор на STM32H743 со звуком,с возможностью сохраняться и с фильтром SaI2x (фильтр только в режиме Game Gear).
5) Кастомизация времянок для LCD.
Дисплей подключен к FMC в режиме NAND. Именно в этом режиме есть возможность выставить нужный холд после защёлкивания данных (tAH >= 15 ns) без понижения тактовой частоты FMC. Это полностью устраняет костыли (как программные, так и аппаратные) в работе дисплея и делает его работу устойчивой. Это касается варианта LCD с контроллером Toshiba: JBT6K71. Подробнее тут: https://electronix.ru/forum/index.php?showtopic=148029
6) Опции компиляции.
Обязательно глобально задефайнить ALIGN_DWORD, иначе может быть эксепшн из-за доступа к невыровненным данным (ARM всё-таки ). Floating Point Hardware - Use Double Precision - ускоряет расчёты инициализационных таблиц в эмуляторе YM2413.
7) Эмулятор использует стек (stack) и кучу (heap).
8) Регионы и секции расписаны в файле scatter.sct
9) ROM'ы игр класть в папку ROMs. Файл игры вписывать в файл Game.S (пример: INCBIN ROMs\FM\Shinobi.sms). И не забыть в Port.h поставить нужный тип эмулируемой приставки: EMU_TYPE !!! Ну и пересобрать не забыть
10) Игры(ROM'ы) можно брать тут (там же и описание игр с картинками) :
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Выкладываю исходник своего порта под Nucleo-H743.
1) Изменения:
a ) Переделана эмуляция звука. Звуковой модуль взят из эмулятора Ootake v2.90. До переделки звук был просто ужасен (там где он ещё был).
b ) Ввёл обработку прерывания таймера CPU H6280. Те игры, где звук пропадал, теперь идут со звуком.
c ) Переделал рендерер. Спрайты и фон выводятся с учётом приоритетов, что устраняет артефакты в виде чёрных спрайтов.
d ) Сделал сохранение/восстановление состояния.
2) Оптимизация по потреблению памяти SRAM:
a ) Массив констант bp_lut (render.c) просчитан на ПК и зашит во Flash контроллера (освободило 256 кБ)
b ) Массив констант _NoiseTable.bin (psg.c) просчитан на ПК и зашит во Flash контроллера (освободило 32 кБ)
c ) Укорочен буфер очереди звука: APUQUEUE_SIZE 8 кБ вместо 128 кБ. Не смертельно.
d ) Видеобуфер кадра 1024x256 заменён на буфер строки 1024x1. Отрисовка на дисплей построчно (render.c)
e ) В стейт не пишутся: буфер очереди звука (_Queue) и RAM привода CD (cdram). Не смертельно (ибо не нужно).
После этих мероприятий, удалось оставшиеся переменные распихать по всей SRAM контроллера STM32H743.
3) LCD работает в портретном режиме (отрисовка кадра перпендикулярна направлению луча развёртки). Бит скорости отключен (HWM=0). Пришлось сделать так, потому что в этом случае сохраняется возможность построчно отрисовывать кадр с буферизацией всего в одну линию без дополнительных команд LCD по смене координат.
4) Опции компиляции:
Глобально задефайнить FAST_MEM. Включить Floating Point Hardware - Use Double Precision - для увеличения скорости эмуляции звуковой системы приставки.
5) Управление:
U D L R B A Select Start
X - сохранить стейт Y - восстановить стейт
6) Эмулятор использует стек (stack) и НЕ использует кучу (heap).
Конвертер используется свой (писал на Pascal в 2009 г.).
Полученный *.bin закидываем в папку ROMs. В файле rom.S правим название игры (пример: INCBIN ROMs\PowerGate.bin) и пересобираем проект. И прошиваем контроллер.
В папке ROMs оставил несколько сконверченных игр, готовых к использованию. Конвертилка - в следующем посте.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Последние 2 эмулятора используют подключение дисплея к банку NAND FMC, поэтому схема соединения с отладкой Nucleo-H743 для них чуть-изменилась (LCD !CS):
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (ведущий специалист @ Aug 1 2018, 03:32 PM)
Как я понял джойстик = тупо набор кнопок?
Пока да. Но надо думать, чем заменить. Сеговский джойстик не подойдёт, потому что хочу в формфактор кредитки уложиться. Поэтому управление должнобыть ON-BOARD.
Это могут быть прорезиненные кнопки, кнопки с мягким нажатием или вообще на сенсорные замахнуться. Тестировать нужно, чтоб нетрудно было играть. И расстояния между кнопками тоже подбирать прийдётся.
Пришел к выводу, что 10 кнопок хватит + Reset.
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
В очередной раз перенёс многострадальный чип-селект LCD на свободный пин, потому что появилась SD карта. И как-бы с отдельными блоками не особо разбежаться, но всё-же удалось!
Таблица подключения для плеера видео-аудио такая:
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
надо думать, чем заменить. Сеговский джойстик не подойдёт, потому что хочу в формфактор кредитки уложиться. Поэтому управление должнобыть ON-BOARD.
Это могут быть прорезиненные кнопки, кнопки с мягким нажатием или вообще на сенсорные замахнуться. Тестировать нужно, чтоб нетрудно было играть. И расстояния между кнопками тоже подбирать прийдётся.
Пришел к выводу, что 10 кнопок хватит + Reset.
Думал об этом. При таком раскладе получится малюсенький экран и консоль в минимум 15см в длину. А вообще, чтобы удобнее в руке держать - желательно выбрать длину между кнопками 15-20см. Тут ждет засада, маленький экран на фоне большого девайса. Тут уже целесообразнее взять экран 4,3 дюйма. Я бы наверное так и сделал.Раз уж применен процессор по цене более 2к рублей - можно тратиться по полной и взять подороже жк. Либо уже психовать и мельчить в ущерб удобства играния.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Схема ниже (сильно напоминает nanoPlayer ).
Некоторые моменты:
U1 - дисплей от телефона Sony Ericsson K800i с контроллером Toshiba. Также поддерживаются дисплеи от телефона K790i и контроллером Renesas.
U2 - CPU. Он тут самый главный. Положение выводов частично совпадает с STM32F407 QFP100. Различие в выводах слева и внизу. Тактируется от внутренних генераторов.
U3 - токовый УНЧ с дифференциальным выходом.
U4 - матрица суппрессоров. для защиты от статического электричества (актуально при подсоединении/отсоединении наушников).
U5 - питание на аналоговую часть схемы. Ultra LDO. Imax = 150 mA.
U6 - Step-Up для подсветки светодиодов дисплея. Из китайского модуля DC-DC MT3608.
U8 - питание на цифровую часть схемы. Ultra LDO. Imax = 0.5 A. Такой стоит в отладке Nucleo-H743. Компактный корпус DFN6 (3x3 mm. Для 2x2 mm распиновка микросхемы другая!)
J1 - разъём для наушников. При включении наушников динамик отключается.
J2 - слот Micro SD с пружинкой.
J3 - разъём для программирования МК.
J4 - зарядка аккумулятора через USB. Imax= 0.5 A
D1 - CRASH LAMP. Для отладки.
D3 - светодиод зарядки аккумулятора. Гаснет при полном завершении зарядки.
L7 - ферритовая бусина на SDIO CLK. Без неё на макете SD карта не пашет.
S1..S10 - кнопки управления. Планируются долговечные.
R14||C22 - ФНЧ с частотой среза 23 кГц.
LCD_VSYNC - сигнал для кадровой синхронизации. Возможен как программный опрос через порт ввода, так и внешнее прерывание(линия EXTI2).
Обновление: R22 - задаёт ток подсветки дисплея. Выбран ток 10 мА, дисплей светит очень ярко. Можно уменьшить ток вообще до 5 мА без ущерба яркости.
Это сообщение отредактировал Gospodin_Riba - Aug 21 2018, 01:22 PM
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 12972
Пользователь №: 55667
Регистрация: 10-November 09
Место жительства: BY
На дендике играли в детстве сутками напролёт, передавали приставки/джойстики по рукам - месяцами вся детвора резалась, резиновые они были в джойстиках...
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (Ferrum-1827 @ Aug 21 2018, 05:26 PM)
На дендике играли в детстве сутками напролёт, передавали приставки/джойстики по рукам - месяцами вся детвора резалась, резиновые они были в джойстиках...
Там силиконовые кнопки. Взял сеговский джойстик и прикинул, что не моё, так как : 1) сильно большие 2) требует крепления
Вот рассматриваю ещё один вариант - мембранные кнопки с телефона. В виде кругляшков. Просто кладутся на плату. Зафиксировать можно прозрачным скотчем. Легко меняются на уровне пользователя без перепайки - отодрал скотч и заменил кругляшок. Всё.
И проще и места меньше. Лучшие мембраны дают до 1 млн. нажатия!
Ещё немаловажно, есть всегда доступ к контакту, который может быть нарушен из-за влаги или окисления.
Ниже картинка имеющихся в наличии вариантов.
"Обычные" тактовые кнопки просто часто перестают работать на замыкание, хотя щёлкают. Интересно узнать бы причину.
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Развёл тестовую плату под мембранные кнопки. Ширина платы = ширине кредитки. Фотки ниже. Кнопки закрепил широким прозрачным скотчем (все сразу).
Поиграл в игры. Вывод - очень неудобны! Хуже, чем обычные кнопки.
Что не устраивает:
1) Кнопки совсем не чувствуются пальцами, так как они почти плоские. Из-за этого часто промахи, особенно на крестовине - вниз и влево.
2) Слабая обратная связь с кнопкой. Не чувствется тактильности.
3) Требуется больше усилия на нажатие, так как из-за отсутствия толкателя, задействована бОльшая площадь пальца.
Очень сложно уворачиваться от пуль и тяжело производить быстрые многократные нажатия.
4) Маленькая дистанция между кнопками и общая малая ширина - тяжело держать в обеих руках и перебирать пальцами.
Вынужден пересмотреть форм-фактор в пользу удобства играбельности............
Как вариант - "сосиска": крестовина слева, в центре - экран, справа -остальные кнопки.
Можно даже с сеговского джойстика взять. Но тогда обязателен корпус с креплениями. Зато будет чертовски удобно играть, при условии если выдержать дистанцию между кнопками и общую длину в двух руках.
Это сообщение отредактировал Gospodin_Riba - Aug 23 2018, 10:15 AM
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Вот рассматриваю ещё один вариант - мембранные кнопки с телефона. В виде кругляшков.
У таких тоже есть чудесные поломки в виде протирания пятачков на плате. Если плата на заводе с такими кнопками не будет покрыта особым покрытием - поработает месяц ))).
После долгих обдумываний - решил. h7 проц - необоснованно дорог. 2к рубля как то отдавать неохота. Да и ждать понижения цен на этот девайс как то ... не стоит. Автору респект за тему конечно, но ... опять же мое мнение - повторяемость устройств - не для обычных эмбеддеров со среднестатистическим доходом равна нулю. Ввиду этого есть мысль перенести проект на тот же nuvoton n32926 https://ru.aliexpress.com/item/1pcslot-N329...iceBeautifyAB=0 (раза в 3 дешевле) либо какой нибудь более доступный, к примеру V3S https://ru.aliexpress.com/item/ALLWINNER-CP...2717796689.html На первый имеется полноценная абсолютно рабочая и опробыванная SDK как под кейлом так и под линукс (самолично качал с фтп выпрошенного у китайца). Второй проц - ну не знаю, вроде что то есть под него но пока все теория. Короче, предлагаю продвигать тему на нувотоне. Желающим скину SDK.
Это сообщение отредактировал ведущий специалист - Aug 23 2018, 03:57 PM
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (Ведущий специалист)
h7 проц - необоснованно дорог. 2к рубля как то отдавать неохота
Для меня - это хобби. Хобби - не место, где нужно экономить.
QUOTE (Ведущий специалист)
Да и ждать понижения цен на этот девайс как то ... не стоит
Ждать - это вообще непозволительная роскошь. Особенно, если учесть, что средняя продолжительность жизни человека 70-80 лет. Никогда не понимал "ждунов" (это обобщение, к Ведущему специалисту это НЕ относится!), которые чего-то там выжидают... Особенно снижения цен. Это капец. Для прояснения обстановки, рекомендую почитать вот эту тему:
В свете вышеуказанных событий, я уже перешёл на "подножный корм" - б/у мелочёвку с плат телефонов/ноутбуков. Потому что покупать резистор одного номинала от 1000 штук как-то совсем не катит. Ну и ряд 0402 в местных магазинах не продают. Не говоря уже о конденсаторах 0805 емкостью от 10 мкФ и выше. С телефонов выковыриваю.
QUOTE (Ведущий специалист)
перенести проект на тот же nuvoton n32926
240 МГц - частота маловата. Забудьте про SNES, СЕГу и другие приставки, в которых эмулируется два процессора в связке: M68000+Z80
По поводу аллвинеров - имею негативные результаты исследований в области данных процессоров. 1 - апельсин зиро. Убогая виснущая хрень, перегревающаяся уже при загрузке операционки. 2 - HI3516D. Долгое мучение с портированием драйверов и прочих работ. Здесь результаты получше - но скудная документация так и не позволила довести проект до конца (хотя линукс полноценно был собран и даже работал). 3 - апельсин 2джи иот - слов нет....груда железа. Сделав выводы - решил больше не касаться детищ аллвиннера (как бы завлекательно не выглядел v3s). Гораздо лучше в этом плане ведут себя малиновые процыки. Их и рекомендую.
Или лёд тронулся?
QUOTE (Ведущий специалист)
На первый имеется полноценная абсолютно рабочая и опробыванная SDK как под кейлом так и под линукс (самолично качал с фтп выпрошенного у китайца). Второй проц - ну не знаю, вроде что то есть под него но пока все теория.
Ну всё-же они заточены под Linux. С таким подходом проще взять Робеспьери-Пи и Retro-Pie. И не надо вообще ничего делать.
QUOTE (Ведущий специалист)
Короче, предлагаю продвигать тему на нувотоне. Желающим скину SDK.
Я бы с удовольствием, тем более внутренней памяти там больше, но "дайте хотя бы 400 МГц"!
Буду доводить сабж до физического завершения с STM32H743 QFP100. Слишком много времени потрачено, и денег тоже. К тому же, наработки имеются. Лично мне, глупо бросать всё на середине пути!
Это сообщение отредактировал Gospodin_Riba - Aug 24 2018, 03:34 AM
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Я так и предполагал. Имею в наличии нуклео на h743. Я так понимаю, на ней можно будет запустить ваш проект? p/s у моего поставщика stm32h743vi выходит под 3к. В теории, если шину увеличить до 16 бит fps вырастет?
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (Kitano8 @ Aug 24 2018, 08:15 AM)
Я так и предполагал. Имею в наличии нуклео на h743. Я так понимаю, на ней можно будет запустить ваш проект? p/s у моего поставщика stm32h743vi выходит под 3к. В теории, если шину увеличить до 16 бит fps вырастет?
Все исходники, которые выложены в этой теме имеено под нуклео-h743. Таблица подключения выложена здесь же. В архивах также готовые к использованию прошивки.
Поддержка Нуклео-h743 100%.
А вот stm32h743vi - я ещё не запускал. Конечно, нужно будет адаптировать эмуляторы под него отдельно (как минимум переназначить другие GPIO на кнопки, и SDIO2 взять вместо SDIO1 )
Если шина будет 16 бит, то скорость отрисовки возрастёт примерно в 2 раза - через CPU или через DMA. Общий FPS эмулятора будет больше только в случае отрисовки CPU. В случае с DMA разницы в быстродействии с вариантом шины 16 бит по сравнению с 8 бит практически не будет (потому что отрисовка дисплея занимает меньше времени, чем всё остальное и в случае с DMA выполняется параллельно).
Пошёл делать второй вариант управления - на китайских щелкунчиках 12x12 мм.Такой же размер будет и у Omron-овских кнопок на 3 млн. нажатия. Вроде как уже должно быть более удобнее играть:
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)