Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эмуляция ARM на другом ARM - насколько проблематично?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ganster
Много уж у нас эмуляторов на Siemens сделано(NES, Sega GameGear/MasterSystem/Megadrive, Gameboy(color) и даже SNES), но вот больше всего интерисует консолька GameBoy Advanced. Игр много, да еще и каких! И самое главное - процессор той же архитектуры, но в 12 раз слабее чем на телефоне! Только вот попытка портирования VisualBoyAdvanced(не моя) не дала желаемого результата - эмулятор беспощадно пожирая больше 7 мегабайт опреративы выдавал с трудом около 1 fps sad.gif В итоге проект умер только появившись... Посмотрев исходники увидел кучу ненужного кода, т.к. оригинал эмулятора написан для x86 и процессор эмулируется целиком и полностью => есть возможности оптимизации переписав команды процессора и SWI-функции биоса на ассемблер(процессор-то и там, и там ARM => инструкции одинаковые), но те же графические режимы, клавиатуруру(про звук уж молчу) придется эмулировать, т.к. у нас дисплей работает только в графическом режиме 16бит(5-6-5), клавиатура опрашивается совсем по-другому...
Еще предлагали ремапить память и дописать нужные функции в саму прошивку и запускать ромы уже без эмуляции, но тут тоже как минимум две сложности: найти инициализацию MMU в ~32mb бинарнике дизассемблером и добавить адресацию как в gba+дописать хуки на запуск SWI, но курить сотни мегабайт кода в дизассемблере - жуткая перспектива. Ну и непонятно как можно будет тогда тормозить выполнение кода...

Так вот, вопрос собственно в том, возможно ли получить приемлемую скорость эмуляции в каким-нибудь образом? Может кто чего посоветует? Рассмотрю любые за и против, не откажусь от исходников эмуляторов сего девайса под арм, если таковые имеются.

Код
Железо GBA:
CPU: ARM7TDMI 32bit RISC CPU, 16.78MHz
BIOS ROM     16 KBytes
Work RAM     288 KBytes (32K in-chip + 256K on-board)
VRAM         96 KBytes
OAM          1 KByte (128 OBJs 3x16bit, 32 OBJ-Rotation/Scalings 4x16bit)
Palette RAM  1 KByte (256 BG colors, 256 OBJ colors)
Display      240x160 pixels (2.9 inch TFT color LCD display)
Gamepad      4 Direction Keys, 6 Buttons


Код
Телефон(BenQ-Siemens E71):
CPU:  SGOLD2(ARM926EJ-S) 208MHz
RAM:  можно очистить до ~9mb
Display: 240x320 262 тысячи цветов, напрямую со ScreenBuffer можно работать только в 16bit 5-6-5
Gamepad: вся клавиатура телефона
+возможность загружать бинарники напрямую процессором(elf скомпилированный IAR)
AlexandrY
Чет вы темните. Ни в какой мобиле код не занимает 32 метра. Там ресурсы в основном место занимают.
IDA находит обращение к определенным регистам, а тем более к сопроцессору для инициализации MMU на раз-два.
А всякие NES-ы, Gameboy-и тут какой-то любитель тож щелкает как семечки.
Может вы плохо знаете набортную периферию SGOLD-а (таймера, PLL-ы, распределение клоков ) и пытаетесь симулировать без ее использования?


Цитата(Ganster @ Feb 13 2009, 17:27) *
Много уж у нас эмуляторов на Siemens сделано(NES, Sega
Так вот, вопрос собственно в том, возможно ли получить приемлемую скорость эмуляции в каким-нибудь образом? Может кто чего посоветует? Рассмотрю любые за и против, не откажусь от исходников эмуляторов сего девайса под арм, если таковые имеются.
Ganster
Ну если точнее, то 20мб чистого кода, это без файловой системы, графики, ленгпака, и т.п. Сопроцессора кстати насколько я знаю в SGOLD нет.
Насчет периферии - я написал что подход со стороны запуска рома напрямую мне как раз нравится меньше всего, т.к. заморочек там правда не огребешься. Я представляю себе эмулятор как некий интерпретатор, т.е. грузим из рома команду, вместо регистров подсовываем заранее подготовленные ячейки в памяти(не есть хорошо, но в данном случае лучше не сделать), меняем вызовы из адресного пространства железок на самописные функции-эмуляторы, и т.д. Вопрос как раз в том, будет ли эффективен такой подход? Хватит ли ресурсов процессора хоть в теории? Впринципе достаточно 15 кадров в секунду с правильным пропуском промежуточных кадров, т.к.дисплей у нас обновляется примерно с такой скоростью.
Artem_Petrik
Есть готовый симулятор GBA для смартфонов на базе 9 симбиана. Там, вроде, все нормально работает. По крайней мере, когда я только купил свой смарт, и искал для него софт, мне попался сайт, где среди новостей софта для S60 смартов больше половины были образы игрух от GBA. Естественн там же был симулятор, и большая инструкция чего-куда. Судя по отзывам люди себе ставили, и у многих нормально работало. Однако себе не ставил, и адреса, естественно не помню.
Так что можно поискать исходники того эмулятора, либо, если более интересен не процесс, а результат, купить себе смарт с 9-й симбой вместо сименса, и играться до упаду.
Ganster
Ну...менять телефон ради эмулятора практически равносильно тому, что менять linux на windows, потому что "там все уже настроено". Это не наши методы smile.gif
А вот исходник эмулятора под symbian конечно правда был бы интересен, т.к.он говорят даже на обычных s60, которые послабее сименса будут, вполне играбелен. Но чудес не бывает - найти исходники софтины под симбу равносильно тому, что попросить у Microsoft сделать windows опенсорс...нету их, и не будет. sad.gif

В данный момент меня интерисует профессиональная оценка "на глаз" возможно ли получить приемлимую скорость эмуляции одного на другом. Ну и насколько сумасшедшая идея с прямым запуском рома. Хотя на такие подвиги врятли меня хватит, на такое способен разве что Rst7 написавший elfloader на наши девайсы, да только врятли его игрушки заинтерисуют. smile.gif
Artem_Petrik
Цитата(Ganster @ Feb 14 2009, 01:10) *
Ну...менять телефон ради эмулятора практически равносильно тому, что менять linux на windows, потому что "там все уже настроено". Это не наши методы smile.gif

Прекрасно вас понимаю, сам таким был smile.gif. Сейчас однако смотрю на вещи иначе. Поменять телефон намного дешевле, чем потратить несколько месяцев на написание своего эмулятора. Результат работы вы врядли продадите, а телефон через пару лет и так придется менять. Будущее сименсов весьма туманно, неизвестно бдут ли их через несколько лкт вообщк производить.
Хотя в виде хобби - конечно вполне... И опыта даст много. Если времени не жалко.

Что касается принципиальной возможности - раз на симбе сделали, значит и семен потянет.
Идея с прямым запуском рома вовсе не сумашедшая. По этому поводу стоит посмотреть принцип построения виртуальной машины на PC (vmware или другой). Здесь смысл вобщем-то тот же.
Ganster
Именно! Важен не результат, а сам процесс smile.gif Все-таки решено попытаться порыть в направлении прямого запуска... Но теперь возник вопрос как раз по части программирования, а не теоретических размышлений. Как все-таки переадресовать память(ну т.е. добавить свои виртуальные странички)? Знаю что можно делать это на лету, т.к. тот же armdebuger может "виртуально" патчить работающий телефон используя замещение страниц флеш. Только вот ковыряние кучи огромных доков по арм ничего не дало, везде пишут для чего эта адресация нужна, и как это круто, а вот как это дело на практике организовать не могу найти. Вот если кто-нибудь поделится примерчиком такой операции, или доками, где это точно будет описано - буду премного благодарен. wink.gif
Artem_Petrik
Цитата(Ganster @ Feb 15 2009, 07:57) *
Как все-таки переадресовать память(ну т.е. добавить свои виртуальные странички)? Знаю что можно делать это на лету, т.к. тот же armdebuger может "виртуально" патчить работающий телефон используя замещение страниц флеш. Только вот ковыряние кучи огромных доков по арм ничего не дало, везде пишут для чего эта адресация нужна, и как это круто, а вот как это дело на практике организовать не могу найти. Вот если кто-нибудь поделится примерчиком такой операции, или доками, где это точно будет описано - буду премного благодарен. wink.gif

Тут надо грызть доки по MMU. К сожалению я с 9-ми армами еще не работал, поэтому ничего толком подсказать не смогу. По идее MMU во всех ARM926EJ-S должны быть одинаковые, и, возможно, поможет документация и примеры к более распространенным процессорам данной архитектуры, от Atmel например. Впрочем я могу ошибаться. Надеюсь вам помогут "гуру" по 9-м армам, коих есть на этом форуме.
zksystem
В эмуляции GBA у вас проблемы не с CPU возникнут, а скорее с видеоконтроллером, а он там достаточно сложный... слои, спрайты, прозрачность, аппаратный поворот спрайтов и так далее...
Ganster
Да нет, это как раз проще всего будет. Все что можно написать без использования всяких хитромудрых инструкций процессора, это сколько угодно smile.gif
Блин, какие же ужасные доки по арм'ам пишут, без 100грамм вобще ничего не понять %)
zksystem
Цитата(Ganster @ Feb 17 2009, 17:09) *
Да нет, это как раз проще всего будет. Все что можно написать без использования всяких хитромудрых инструкций процессора, это сколько угодно smile.gif
Блин, какие же ужасные доки по арм'ам пишут, без 100грамм вобще ничего не понять %)

а вы писали что-нибудь для GBA? Работали с его экраном, видеопроцессором? насколько мне известно, самая большая проблема всех эмуляторов - именно видео и звук. сходите на для начала на http://gbadev.org/docs.php , ознакомьтесь, GBA это игровая консоль, а не просто АРМ с экраном.
Ganster
Да читал я спецификации его! Ничего сложного нет, а звук мне не нужен. Тормоза как раз из-за сложности арм-процессора. В тех же исходниках VisualBoyAdvanced код эмуляции дисплея довольно мелкий и простой, а вот в самой эмуляции процессора идет огромный файл, где например банальная инструкция ldr расписана на пару страниц. Тем более вывод изображения у меня будет сделан довольно хитро...есть вобщем идеи в этом направлении, да и ресурсов остается вполне достаточно smile.gif
Главный вопрос стоит все-таки в том как ремапить память на лету(резервировать громадный кусок оперативы при включении не кошерно smile.gif ), в доке по процессору написано что можно заставить сопроцессор обновить таблицу релокаций без софт ресета, но вот описано оно там все жутко, я не уверен даже что она бы на русском была понятной)
zksystem
Цитата(Ganster @ Feb 17 2009, 20:20) *
Да читал я спецификации его! Ничего сложного нет, а звук мне не нужен. Тормоза как раз из-за сложности арм-процессора. В тех же исходниках VisualBoyAdvanced код эмуляции дисплея довольно мелкий и простой, а вот в самой эмуляции процессора идет огромный файл, где например банальная инструкция ldr расписана на пару страниц. Тем более вывод изображения у меня будет сделан довольно хитро...есть вобщем идеи в этом направлении, да и ресурсов остается вполне достаточно smile.gif
Главный вопрос стоит все-таки в том как ремапить память на лету(резервировать громадный кусок оперативы при включении не кошерно smile.gif ), в доке по процессору написано что можно заставить сопроцессор обновить таблицу релокаций без софт ресета, но вот описано оно там все жутко, я не уверен даже что она бы на русском была понятной)

Еще вопрос, эмулятор коммерческий? Там у GBA на ROM-BIOS бальшой копирайт стоит smile.gif
p.s. Звук вам не нужен... а кому нафиг такой эмуль нужен?
p.p.s. Может вам для начала сделать эмуль GameBoy Color? эмулятор Z80 вроде как проще будет сделать...
p.p.p.s. По командам ARM - это к rst7, он гуру в этом smile.gif (и в z80 тоже) rolleyes.gif
Ganster
Цитата
Еще вопрос, эмулятор коммерческий? Там у GBA на ROM-BIOS бальшой копирайт стоит smile.gif

Да какая может быть коммерция на самодельной платформе? Тем более что сам же Rst7 как автор эльфлоадера наложил табу на коммерческие проекты smile.gif
Цитата
p.s. Звук вам не нужен... а кому нафиг такой эмуль нужен?

Большинство эмуляторов консолей на мобильные устройства без звука из-за сложностей реализации и вообще отсутствии в нем необходимости как в таковом. Не вижу смысла в таких выражениях, к примеру марио без фоновой пищалки бегает так же :D
Цитата
p.p.s. Может вам для начала сделать эмуль GameBoy Color? эмулятор Z80 вроде как проще будет сделать...

GameboyColor давно уже есть, шапку читаем, да и то что я делаю это не совсем эмулятор-то, в этом и сложность.
Цитата
p.p.p.s. По командам ARM - это к rst7, он гуру в этом (и в z80 тоже)

Сам знаю, и с удовольствием бы обратился, но:
1) Как я уже сказал игрушки ему врятли интересны;
2) Он вообще не любитель отвечать на вопросы, похоже из-за активности "недопонимающих" после появления эльфлоадера smile.gif
%-)
а что если... взять тотже AT91RM9200, настроить MMU так, чтобы адреса памяти и периферии транслировались на ARM'овские и через небольшой дешифратор адресов - а далее на памяти ROM, RAM и периферийники собственно (которые могут эмулироваться на FPGA или навороченном DSP)???

ну чем не идея? wink.gif

перед этим небольшой бутлодер будет инициализировать сам ARM9 и заливать образ игры(ROM) в память ARMа?

правда под сомнением два вопроса: прерывание внешних устройств и DMA-передачи из памяти в видеоконтроллер (или то что его эмулирует) GBA

думается что DMA-запросы прийдется софтово эмулировать как внешнее прерывание ARM'а

гуру, что скажете?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.