|
Advanced MicroMachine (часть 3), Портирован эмулятор Nintendo GameBoy |
|
|
|
Nov 2 2008, 00:19
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-04-08
Пользователь №: 36 986

|
Приглашаю посетить ресурс: http://gamebox.uraldev.ru/forum/viewtopic....=5&p=13#p13кратко: на свой девайс (ARM9) портировал эмулятор популярной во всём мире карманной игровой приставки! Фотки, ссылки на видеоролики там же. Готов выслушать предложения, вопросы, критику, пожелания.
|
|
|
|
|
 |
Ответов
|
Nov 8 2008, 03:32
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-04-08
Пользователь №: 36 986

|
Код эмуляции Z80 взят из cingb029. Он чисто на Си. Не хочу обламывать, но имхо АРМ7 не хватит- у АРМ9 уже близко к пределу. Может потому что на асме не оптимизировано. х.з.
Дубль два по вопросу о быстром контроллере.
|
|
|
|
|
Nov 8 2008, 11:28
|
Гуру
     
Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741

|
Цитата(Glucik @ Nov 8 2008, 06:32)  Код эмуляции Z80 взят из cingb029. Он чисто на Си. Не хочу обламывать, но имхо АРМ7 не хватит- у АРМ9 уже близко к пределу. Может потому что на асме не оптимизировано. х.з. Спасибо, посмотрел эмулятор. Может ,как опытный в эмуляторостроении, подскажете- у меня есть задача модернизировать старинную систему, у которой процессор-z80. Система имеет кучу плат ввода-вывода и еще больше плат с памятью (на анлогах РФ1). Хочется вынуть родной Z80, вместо него вставить мелкую платку на LPC2148 (нужен быстрый интерфейс к компу и отладчик), в нем крутится эмулятор Z80 и в памяти хранится дамп прошивки прибора. Из-за этого внешняя шина освобождается только на операции обращения к портам. Такая система реализуема? Требуется сохранить тайминги как и на реальном Z80. По поводу быстрого эмулятора. В проекте gngeo есть модуль drz80 - эмулятор Z80 написнный на армовском ассемблере. Пока еще не разбирался с ним, но может инфа пригодиться.
|
|
|
|
|
Nov 11 2008, 18:52
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Команды z80 контроллер на LPC проэмулирует пожалуй быстрее чем они выполнялись на 8 МГц Z80. Но шинную активность ARM воспроизвести не сможет. Т.е. при эмуляции он безнадежно отстанет. И если в оригинальной проге есть зажержки включающие циклы на внешней шине, то здесь будет облом. Облом вообще будет поскольку сравнять скорость эмулятора и оригинала в проекте cingb нет никаких средств. Хотя поскольку тики Z80 там считаютcя, то можно было бы наверно по какому либо таймеру на промежутках по 10 мкс прецизионно тормозить эмулятор. Цитата(khach @ Nov 8 2008, 15:58)  Спасибо, посмотрел эмулятор. Может ,как опытный в эмуляторостроении, подскажете- у меня есть задача модернизировать старинную систему, у которой процессор-z80. Система имеет кучу плат ввода-вывода и еще больше плат с памятью (на анлогах РФ1). Хочется вынуть родной Z80, вместо него вставить мелкую платку на LPC2148 (нужен быстрый интерфейс к компу и отладчик), в нем крутится эмулятор Z80 и в памяти хранится дамп прошивки прибора. Из-за этого внешняя шина освобождается только на операции обращения к портам. Такая система реализуема? Требуется сохранить тайминги как и на реальном Z80. По поводу быстрого эмулятора. В проекте gngeo есть модуль drz80 - эмулятор Z80 написнный на армовском ассемблере. Пока еще не разбирался с ним, но может инфа пригодиться. Проектик да, впечатляет своей, так скажем, прямолинейной простотой. Портируется на ARM за час максимум. (По крайней мере у меня вышло так) Надо выкинуть пару DOS-овских функций прямого обращения к портам и еще кое какую лишнюю инициализацию. А правда в том, что на RTOS его портировать было бы гораздо проще и естественней. Поскольку этот эмулятор весь базируется на сервисах POSIX файловой системы, то скажем на той же ARTX прект даже не надо вычищать от файловых операций, как это пришлось скорее всего делать в вашем случае. Что касается LCD, то как видно в эмуляторе там просто делается периодический вывод в некий экранный буфер. Задача портирования была просто по прерываниям это буфер пересылать на LCD. Это работы еще на час. Итого цена портирования - 2 часа. Ну, спасибо. Обязательно применю этот проектик как демку в своих платформах. Остался только вопрос где сами игры достать. Не подскажете? Цитата(Glucik @ Nov 7 2008, 10:12)  Ога  И ОРТОДОКС вдобавок, млин... Ведь работает всё БЕЗ ОПЕРАЦИОННОЙ СИСТЕМЫ Напрямую с камешком... 
|
|
|
|
|
Nov 12 2008, 03:57
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-04-08
Пользователь №: 36 986

|
Цитата(AlexandrY @ Nov 11 2008, 21:52)  Ну, спасибо. Обязательно применю этот проектик как демку в своих платформах. Остался только вопрос где сами игры достать. Не подскажете? хттп://emu-russia.нет/ru/скачать/ромы/Nintendo-GameBoy-Color/0-Z/ хттп://emu-russia.нет/ru/скачать/ромы/Nintendo-GameBoy/0-Z/ В общем Google рулит  Цитата(AlexandrY @ Nov 11 2008, 21:52)  Что касается LCD, то как видно в эмуляторе там просто делается периодический вывод в некий экранный буфер. Задача портирования была просто по прерываниям это буфер пересылать на LCD. Можете, по-подробнее расписать, как вы видите портирование эмулятора cingb. Интересует в частности алгоритм всего эмулятора, а именно по части : 'Z80', железа и экранного буфера. Интересно услышать другие(не свои) мысли по данной теме! В gameboy.c есть такой фрагмент: Код /* video update */ lcdclks-=Z80_TICKS; if (LCDC & 0x80) { /* if lcd on */ if (lcdclks<0) { lcdphase++; if (lcdphase==3) { if ((LY>142)&&(LY<153)) { lcdclks=GB_VCLKS[3];lcdphase--; hdma_update(); if ((STAT&3)!=1) { /* v-blank */ STAT=(STAT&0xFC)|1;vblankoccured=1; vblankdelay=GB_VBLANKDELAYCLKS; } else { if (LY==148) drawscreen(); } } else { Интересует вот такое условие: if (LY==148) drawscreen();Тоесть если я прально понял, что как только счетчик координат по Y достиг значения 144 (т.е. весь буфер отрисован), то перекинуть буфер на экран. Вы же говорите, что можно на прерывание повешать. Вот интересно узнать - как можно? В самом эмуляторе используется только клавиатурное прерывание и всё. Весь цикл эмуляции в основной программе: Код Z80_HALTED=0; breakpoint=-1; lastbreakpoint=-1;skipover=0;db_trace=0; err=0; while (!err) { if (!Z80_HALTED) { err=ExecOpcode(); } /* update registers & interrupt processing */ gameboyspecifics(); } А синхронизация там достигается ожиданием обратного хода луча по кадру (60Гц), поэтому на быстрых ПК оно будет одинаково работать(если мониторы гонят кадр с 60 Гц, есть и 70 :/ ) На АРМ9 бОльшую часть времени именно съедает эмуляция 'Z80' и железа. Лишь только на втором месте стоИт перерисовка LCD.
Сообщение отредактировал Glucik - Nov 12 2008, 04:00
|
|
|
|
|
Nov 12 2008, 21:03
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Я сказал про прерывание просто потому чтоб вас не напрягать лишним упоминанием RTOS Но по жизни там где стоит drawscreen я посылаю ивент в RTOS и останавливаюсь на семафоре. Ивент вызывает в другой задаче процесс перекодировки экранного буфера и пересылку DMA непосредственно в LCD. В этой же задаче проверяется насколько опередил сигнал завершения формирования кадра в симуляторе реальное время для заданной частоты кадров. На разницу времени инициализируется таймер RTOS который потом и снимет семафор на продолжение работы симулятора. Это позволит добиться прецизионной покадровой синхронизации. Сделано так потому что, я этот симулятор планирую просто как одну из задач работающих на платформе. Т.е. при желании смогу запустить несколько симуляторов геймбоев одновременно. Одновременно экран геймбоя могу отдавать как картинку в вебстранице встроенного сервера любому клиенту через интернет. В идеале на локалке даже позволить играть с этим симулятором через WEB броузер используя видеострим в MPEG4. Плохо, что мужик там ничего не смог сделать со звуком и ему не удалось портировать свой движок под Windows. Но я тут думаю доделать это используя известный симулятор на PC для uC/GUI Цитата(Glucik @ Nov 12 2008, 08:27)  Можете, по-подробнее расписать, как вы видите портирование эмулятора cingb. Интересует в частности алгоритм всего эмулятора, а именно по части : 'Z80', железа и экранного буфера.
Интересно услышать другие(не свои) мысли по данной теме!
Тоесть если я прально понял, что как только счетчик координат по Y достиг значения 144 (т.е. весь буфер отрисован), то перекинуть буфер на экран.
Вы же говорите, что можно на прерывание повешать. Вот интересно узнать - как можно?
А синхронизация там достигается ожиданием обратного хода луча по кадру (60Гц), поэтому на быстрых ПК оно будет одинаково работать(если мониторы гонят кадр с 60 Гц, есть и 70 :/ )
На АРМ9 бОльшую часть времени именно съедает эмуляция 'Z80' и железа. Лишь только на втором месте стоИт перерисовка LCD.
|
|
|
|
|
Nov 13 2008, 02:06
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 22-04-08
Пользователь №: 36 986

|
Цитата(AlexandrY @ Nov 13 2008, 00:03)  Я сказал про прерывание просто потому чтоб вас не напрягать лишним упоминанием RTOS  Ничего страшного! Получилось, что я сам написал некое подобие ОСи. Только не real-time  Цитата(AlexandrY @ Nov 13 2008, 00:03)  Но по жизни там где стоит drawscreen я посылаю ивент в RTOS и... Спасибо за ответ! Цитата(AlexandrY @ Nov 13 2008, 00:03)  Плохо, что мужик там ничего не смог сделать со звуком и ему не удалось портировать свой движок под Windows. Но я тут думаю доделать это используя известный симулятор на PC для uC/GUI Звуковой движок брал из gnuboy 1.0.3 - отлично имплантируется в cingb  Кроме этого, сохр./восст. машины тоже самому нужно обдумать.
|
|
|
|
Сообщений в этой теме
Glucik Advanced MicroMachine (часть 3) Nov 2 2008, 00:19 zksystem Цитата(Glucik @ Nov 2 2008, 03:19) Пригла... Nov 6 2008, 09:16 Glucik Цитата(zksystem @ Nov 6 2008, 12:16) Эмул... Nov 7 2008, 05:42  zksystem Цитата(Glucik @ Nov 7 2008, 08:42) Ога
И... Nov 7 2008, 14:53   Glucik Цитата(zksystem @ Nov 7 2008, 17:53) Game... Nov 7 2008, 21:16    vik0 Цитата(Glucik @ Nov 7 2008, 23:16) какие ... Nov 8 2008, 17:12 afad Силён! Почти как у китайцев: http://media.mabi... Nov 7 2008, 14:05 Glucik Цитата(afad @ Nov 7 2008, 17:05) Силён... Nov 8 2008, 23:48  AVR Цитата(Glucik @ Nov 9 2008, 03:48) так ка... Nov 11 2008, 07:58   haker_fox Цитата(AVR @ Nov 11 2008, 15:58) Конечно ... Nov 11 2008, 08:19   Glucik Цитата(AVR @ Nov 11 2008, 10:58) Вы испол... Nov 12 2008, 06:02    AVR Цитата(Glucik @ Nov 12 2008, 10:02) Никак... Nov 12 2008, 08:13 khach А можете поделится кодом эмулятора Z80 на АРМе? И ... Nov 7 2008, 23:47 MrYuran Цитата(khach @ Nov 8 2008, 02:47) А может... Nov 11 2008, 08:10  LordVader Цитата(khach @ Nov 8 2008, 14:28) Хочется... Nov 11 2008, 09:53   vik0 Цитата(LordVader @ Nov 11 2008, 11:53) Дл... Nov 11 2008, 10:09    LordVader Цитата(vik0 @ Nov 11 2008, 13:09) Тогда м... Nov 11 2008, 10:13   khach Цитата(LordVader @ Nov 11 2008, 12:53) Дл... Nov 11 2008, 12:21    LordVader Цитата(khach @ Nov 11 2008, 15:21) Так и ... Nov 11 2008, 16:17      AVR Цитата(Glucik @ Nov 13 2008, 05:06) Ничег... Nov 13 2008, 08:33       Glucik Цитата(AVR @ Nov 13 2008, 11:33) А можно ... Nov 14 2008, 02:45        AlexandrY Тут согласен.
Показатель уровня - это не юзанье RT... Nov 14 2008, 06:12        AlexandrY Ну что, не все так гладко.
Этот симулятор с больш... Nov 14 2008, 17:03      AlexandrY Ну вот, портировал на Windows под движок симулятор... Nov 13 2008, 14:17       AlexandrY Отбой! Прочитал таки вашу статью о симуляторах... Nov 13 2008, 19:21 Glucik AlexandrY, напишите здесь хотя бы три названия ROM... Nov 14 2008, 22:24 AlexandrY 10-PIN BOWLVP
DA!DA!DA! TBDO
MIRACLE O... Nov 15 2008, 15:32 Glucik ну что я хочу сказать...
может оно и будет часть и... Nov 17 2008, 02:48 Glucik Портирован эмулятор NES !!!
Подробне... Dec 1 2008, 09:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|