Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
О том как был портирован эмулятор SEGA MegaDrive на C6745 читайте на предыдущей странице!
QUOTE
не смог удержатся, чтоб не пройти квест по сборке эмуля Gens в архидревней ламповой шизюал студио 6.. до этого почемуто не получалось. какойто заклин, происходил.. а тут собралось .. аж самому странно.. Ну специфика тут больше х86-ая..
Святое правило: собирать проект в той среде, в которой написал его автор. Неприложная истина.
Следующий шаг - выкидаваем всё виндуозное и заменяем на микроконтроллерное
И ещё, данный эмулятор не на асме частично? Если часть на асме и нет того же кода на С, то можно забить.
Это сообщение отредактировал Gospodin_Riba - Apr 24 2019, 01:04 PM
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
И ещё, данный эмулятор не на асме частично? Если часть на асме и нет того же кода на С, то можно забить.
ну да.. асма там более чем навалом... особенно в StarScream движке 86000 процессора... удивила производительность на скинутом по FSB и множителям до 580мгц атом N430 х86
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Итак, после успеха с SEGA MegaDrive, я принялся портировать эмулятор SNES. Взял за основу SNES9x и стал его пилить...
Успешно портировал, вывод графики на дисплей снова повешал на встроенный со-процессор (PRUSS), так как он занимает довольно много времени.
А также, в эмуляторе применил полезное свойство DSP C6745 - это unaligned word access! тоже повысило быстродействие - теперь память ROM'а парсится не байтами, а словами (двойными/четверными). И пофиг, что адрес может быть не выровнен (такое может быть в эмуляторе запросто!). По этой причине, ARM'ы опять в пролёте, так как они не работают с невыровненными указателями и валятся сразу в экспешн )
Вот для примера (без поддержки невыровненных адресов - только побайтово и через сдвиги):
CODE
#define READ_WORD(s) ( *(uint8 *) (s) |\ (*((uint8 *) (s) + 1) << 8))
#define READ_DWORD(s) ( *(uint8 *) (s) |\ (*((uint8 *) (s) + 1) << 8) |\ (*((uint8 *) (s) + 2) << 16) |\ (*((uint8 *) (s) + 3) << 24))
#define WRITE_WORD(s, d) *(uint8 *) (s) = (d), \ *((uint8 *) (s) + 1) = (d) >> 8
#define WRITE_DWORD(s, d) *(uint8 *) (s) = (uint8) (d), \ *((uint8 *) (s) + 1) = (uint8) ((d) >> 8),\ *((uint8 *) (s) + 2) = (uint8) ((d) >> 16),\ *((uint8 *) (s) + 3) = (uint8) ((d) >> 24)
А вот с unaligned:
QUOTE
#define READ_WORD(s) (_mem2 (s))
#define READ_DWORD(s) (_mem4(s))
#define WRITE_WORD(s, d) (_mem2 (s)) = (d)
#define WRITE_DWORD(s, d) (_mem4(s)) = (d)
Очевидно, что второй вариант (поддерживаемый C6745 и x86) - выполняется быстрее
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
В общем получилось вполне играбельно. SNES также как и SEGA MegaDrive требует кучу ресурсов. Если у СЕГи - это процессоры, то у SNES - навороченная графика.
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (microxa @ Apr 24 2019, 06:21 PM)
ну да.. асма там более чем навалом... особенно в StarScream движке 86000 процессора... удивила производительность на скинутом по FSB и множителям до 580мгц атом N430 х86
ну так ASM же)))
который к сожалению не перетащишь на другие платформы. Если портирование - то тут только "C" рулит. Не зря, K&R называли этот язык "переносным ассемблером"
А вот Unity всякие с C# в пролёте... С ПК никуда больше не перетаскивается код
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
При портировании эмулятора учтены особенности C6745:
- unaligned word access для парсинга РОМ-сетов - отрисовка встроенным со-процессором PRUSS, работающем на частоте в2 раза ниже C6745-го - деление заменено умножением (для вещественных чисел) - конвеер кода (параллельное исполнение нескольких ассемблерных инструкций)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Форум медленно подыхает...
Перенес эмулятор Capcom Play System 1 и 2. За основу брал caname. Задолбался его вычищать. Учитывая большую любовь MAME к точности эмуляции, большой скорости ждать не пришлось.
Эмулятор ворочает на C6745 на 35..40 FPS, вместо целевых 60. Но это лучше, чем ничего.
Размер экрана в CPS1,2 384x224 пикселей (логически до 512x256 - скролл).
Результаты поразительны: - быстродействие увеличилось (синхронизация кадров убрана, чтобы оценить максимальную производительность):
все это конечно хорошо еслиб не было немного грусно: а именно.. вот например занимаюсь эмулятором бк0010 с 2 двумя способами - 1ый фреймовый. с синхронизацией по звуку. всем хорош.. но есть и второй... бесфреймовый метод. синхра по тактам процессора. и все не очень.. особенно на х86-том.. у которого все плохо с таймерами реального времени (команды RDTSC токо относительно хорошие).. ... а вот ARM-овая малинка могла же ведь через контролер DMA в пин радио передовать аж под 100мгц..
Результаты поразительны: - быстродействие увеличилось (синхронизация кадров убрана, чтобы оценить максимальную производительность):
все это конечно хорошо еслиб не было немного грусно: а именно.. вот например занимаюсь эмулятором бк0010 с 2 двумя способами - 1ый фреймовый. с синхронизацией по звуку. всем хорош.. но есть и второй... бесфреймовый метод. синхра по тактам процессора. и все не очень.. особенно на х86-том.. у которого все плохо с таймерами реального времени (команды RDTSC токо относительно хорошие).. ... а вот ARM-овая малинка могла же ведь через контролер DMA в пин радио передовать аж под 100мгц..
Результаты поразительны: - быстродействие увеличилось (синхронизация кадров убрана, чтобы оценить максимальную производительность):
все это конечно хорошо еслиб не было немного грусно: а именно.. вот например занимаюсь эмулятором бк0010 с 2 двумя способами - 1ый фреймовый. с синхронизацией по звуку. всем хорош.. но есть и второй... бесфреймовый метод. синхра по тактам процессора. и все не очень.. особенно на х86-том.. у которого все плохо с таймерами реального времени (команды RDTSC токо относительно хорошие).. ... а вот ARM-овая малинка могла же ведь через контролер DMA в пин радио передовать аж под 100мгц..
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE
а вот ARM-овая малинка могла же ведь через контролер DMA в пин радио передовать аж под 100мгц..
Эти ваши малинки в пролёте. PRUSS в DSP позволяют на 228 МГц шевелить пинами. Потому что PRUSS - programmable realtime unit sub-system
QUOTE
все это конечно хорошо еслиб не было немного грусно: а именно.. вот например занимаюсь эмулятором бк0010 с 2 двумя способами - 1ый фреймовый. с синхронизацией по звуку. всем хорош.. но есть и второй... бесфреймовый метод. синхра по тактам процессора. и все не очень.. особенно на х86-том.. у которого все плохо с таймерами реального времени (команды RDTSC токо относительно хорошие)..
Зачем мудрить? В эмуляторах проще делать синхронизацию кадров по прерыванию заполнения аудио-буфера.
Расчет идет от задания требуемого FPS: допустим 60. Значит, зная разрядность семпла , частоту дискретизации и число каналов - можно получить длину буфера в байтах:
48000*2*1/60 = 1600 байт - это однаполовинка аудио-буфера. 48 кГц, 16 бит, 1 канал. прерывание по заполнению будет происходить ровно 60 раз за 1 секунду.
И всё замечательно! Вызов эмулятора звуковой системы(апдейт звуковой волны эмулируемых чипов ) - желательно тоже разместить в обработчик прерывания (чтобы при снижении FPS на тяжелых местах -темп звука снижался, но хрипеть зато не будет )))
Что касается RDTSC - в DSP, ARM-ахи блекфинах - тоже есть счетчик тактов ядра (или счетчик тактов системной шины).
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Перенёс эмулятор GameBoy Advance.
Оптимизировал насколько смог: 1) таблицы переходов для ARM и Thumb вместо огроменных switch-case'ов на 4096 значений 2) переделал рендерер 3) отрисовка с помощью PRUSS построчно
С 15 FPS поднял до 25 - 30 FPS. Но этого мало. Надо 60 FPS. Звук отключен, так как он лагает - проигрывается дважды. В GBA неудачная архитектура звуковой системы - задержки зависят от CPU и таймеров. Поэтому на распев тянуть ноты не вышло.
Она позволяет много чего делать со звуком: изменять темп с сохранением тона, подымать тон с сохранением темпа, ресемплинг, вычисления BPM. Куча фильтров-интерполяторов: Шеннона, Кубический, Линейный. Антиалиасинговый фильтр.
Темп звука в эмуляторе растягивается в 2...3 раза (30 - 20 FPS), при этом тональность остаётся той же.
OpenTyrian на макете игровой консоли BlackPrism (TMS320C6745 DSP). Особо каких-либо проблем, связанных с производительностью - не было. Так как всё-же это нативное приложение, а не эмуляция:
По-лучше, чем у ведроида, но всёравно сосач ))) Полупрозрачность у облаков отключена и звук местами хрипит, так как не хватило ума сделать обработку звука правильно ))
P.S. и видео между уровнями выпилены (глядел исходники порта Dingoo ). Выпилены - потому что там CPU кидает эксепшн из-за обращения к невыровненным данным памяти во время парсинга видео )) в своих железках я это пофиксил)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)