Порт FCE Ultra - NES (Dendy)

...
  • в общем теперь так... что с твоей версией(c местного ftp).. что с моей(с зеркала официального ftp), как я понял разницы нету(всмысле итог один и тот же, но размер файлов разный)...
    распоковал djgpp и menuetlibc....
    прописал все переменные среды(DJGPP, MENUETDEV - поставил c:\DJGPP\menuetos\ и в Path добавил пути к menuetos\include\, menuetos\linuxtools\, DJGPP\bin\)...
    распоковал FCEU_v0.1a_src.7z...
    получил кучу *.c, *.h, *.o и других файлов...
    у тебя там лежит уже скомпилированный fce(размер 263104)... рабочий...
    и fce.kex(размер 74292, сжатый kpack)... тоже рабочий...
    проверяю через KlbrInWin.exe, на "Matrix v0.06, The by Wojciech Andralojc (PD).nes" и "Tetramino v0.30 by Damian Yerrick (PD).nes"....

    Опыт 1:
    снес откомпилированные(но оставил *.o файлы)...
    сразу попытался собрать fce через MK.bat...
    получаю fce(размер 252352)... хм.. проверяю... рабочий.. =)...

    Опыт 2:
    снес fce и все *.o файлы... даже в подпапках.. =)...
    запускаю MKBase.bat... fce.o, m6502.o, mapper.o компилируються нормально.... вываливается ошибка на компиляции video.c..

    Code: Select all

    gcc -Wall    -c -o video.o video.c
    video.c: In function 'InitVirtualVideo':
    video.c:39: warning: assignment makes pointer from integer without a cast
    video.c: In function 'writepcx':
    video.c:65: error: expected ')' before 'PSS'
    video.c:65: warning: too few arguments for format
    video.c:73: warning: pointer targets in passing argument 1 of 'sprintf' differ i
    n signedness
    video.c:111: warning: pointer targets in passing argument 1 of 'sprintf' differ
    in signedness
    make.exe: *** [video.o] Error 1
    варнинги я как понял совсем не причер.. смотрю причину ерроров.. =)..
    так... чтото с переменной PSS... она определяется в version.h...
    залез туда... вижу:

    Code: Select all

    ...
    #if PSS_STYLE==2
    #define PSS "\\"
    #define PS '\\'
    #elif PSS_STYLE==1
    #define PSS "/"
    #define PS '/'
    #elif PSS_STYLE==3
    #define PSS "\\"
    #define PS '\\'
    #endif
    ...
    хм... видимо pss не определяеться.... т.е. PSS_STYLE не проходит...
    тут два вариант придумал... либо изменить в version.h вместо выше написанного...

    Code: Select all

    ...
    #define PSS "/"
    #define PS '/'
    ...
    либо
    вставить в первую строчку в файл Makefile.base строчку:

    Code: Select all

    TFLAGS  = -O2 -fomit-frame-pointer -DC80x86 -DLSB_FIRST -DVGA -DPSS_STYLE=1 -DDRIVER_DIR="\"menuet\""
    строчку взял из Makefile.menuet... кстати.. этот файл нигде не участвует.. ну и ладно.. =))..
    я рекомендую второй вариант... =)... благо с первым вариантов fce будет компилироваться и собираться... но работать не будет.. =)..
    ...
    чтож... пытаюсь снова скомпилировать.. получаю

    Code: Select all

    c:\DJGPP\bin\ld.exe: nest.o: No such file: No such file or directory (ENOENT)
    видимо не хватает файлика nest.o... иду в drivers\menuet\...
    выполняю команду make.... получаю ошибки(пока пишу две главные.. остальные может изчезнут)...

    Code: Select all

    nest.c:1:70: error: D:/OS/menuetos/include/menuet/os.h: No such file or directory (ENOENT)
    vgavblank.h:2:50: error: D:/OS/menuetos/include/SDL/SDL_timer.h: No such file or directory (ENOENT)
    хм... вижу что видимо стоят жесткие пути... иду исправлять.. =)...
    как не страно.. правильные(т.е. относительные пути для настроеной системы) были закоментированы... убираю полные пути... убираю коментарии.. опять make...
    nest.o собирается... хоть make и выдает вроде(пишу так, ибо я с майком крайне мало работал.. и плохо разбираюсь в ошибках) ошибку:

    Code: Select all

    nest.o:nest.c:(.text+0x40f): undefined reference to `_DriverInterface'
    nest.o:nest.c:(.text+0x7b1): undefined reference to `_LoadGame'
    nest.o:nest.c:(.text+0x7bd): undefined reference to `_InitMachine'
    nest.o:nest.c:(.text+0x7c6): undefined reference to `_TrashMachine'
    nest.o:nest.c:(.text+0x7d6): undefined reference to `_Run6502'
    nest.o:nest.c:(.text+0x7db): undefined reference to `_TrashFCE'
    nest.o:nest.c:(.text+0x7e0): undefined reference to `_TrashMachine'
    nest.o:nest.c:(.text+0x837): undefined reference to `_fceumain'
    nest.o:nest.c:(.text+0x986): undefined reference to `_SDL_Delay'
    make.exe: *** [nest] Error 1
    теперь MKBase.bat проходит нормально.. =).. буду запускать MK.bat..
    новая ошибка... не находит m.о... хотя он нормально собирается еще в MKBase.bat... это как я понял mapper'ы...
    смотрю в MK.bat... вижу

    Code: Select all

    mld fce fce.o mapper.o m6502.o video.o general.o endian.o svga.o sound.o nsf.o fds.o gg.o ines.o state.o nest.o m.o LibmSDL.a
    строчка сборки запускаемого файла... как я понял.. =)... чтож... нужный файл m.o лежит в папке mappers\.. чтоже.. исправляю MK.bat... добавляю гденить сверху строчку

    Code: Select all

    copy mappers\m.o m.o
    ...
    и о чудо... файл полностью собирается... получается fce размером 252352 байт... не верю глазам.. =)... такой же как и у тебя.. =)... контрольная сумма не совпадает только...
    запускаю KlbrInWin.exe... вбиваю путь... нажимаю enter... и УРА... работает.. =)...

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

    з.ы. компилировал и собирал программу три дня.. =)... не полные конечно.... первое с чем столкнулся - это найти средство сборки.. =).. потом помучался с version.h... и сильно и долго мучался с готовой но не рабочей программой.. =)... благо из двух вариантов(описанныйх выше) с version.h, я выбрал первый.. =)... а вот про нехватку нужных флагов для компилятора - я не догадывался.. поэтому и не мог собрать рабочую программу... решил написать опус о своих старанию сюда.. и о нерабочей программе(т.е. явно неправильной сборки)... но пока писал - проверял разные варианты.. и нарвался на правильный.. =)...
    надеюсь комунить сей рассказ понравиться.... а может и не понравиться... я получил опыт пока собирал проект... благо привык нажать одну кнопку.. и получить готовую прогу.. конечно для меня многое не понятно.... но все равно... =)... спасибо...
  • Молодец! Сам догадался, значит не так уж ты и не очень в Си. А я вот тут http://asper.ucoz.ru/load/0-0-0-2-20 уже исходник с исправленным Makefile.base и MK.bat закачал с намерением написать какие надо внести изменения в эти файлы в FCEU_v0.1a_src.7z.
    s1n wrote:получаю fce(размер 252352)... хм.. проверяю... рабочий.. =)...

    Размеры fce разные, потому что в архиве вариант скомпилированный с libc от Ярека, ты же скомпилировал с libc от Diamond'а.

    s1n wrote: Makefile.menuet... кстати.. этот файл нигде не участвует.. ну и ладно.. =))..


    поначалу я его использовал когда компилировал всё строчкой make -f Makefile.base, но потом решил, что лучше отдельно собирать базовый код и отдельно код относящийся к Колибри.

    s1n wrote:благо с первым вариантов fce будет компилироваться и собираться... но работать не будет.. =)..

    верно.

    s1n wrote:хм... вижу что видимо стоят жесткие пути... иду исправлять.. =)...
    как не страно.. правильные(т.е. относительные пути для настроеной системы) были закоментированы...

    У меня почему-то с относительными путями эти файлы не находятся, но на всякий случай (и для общего понимания дела) я их оставил в комментарии.

    s1n wrote:nest.o собирается... хоть make и выдает вроде(пишу так, ибо я с майком крайне мало работал.. и плохо разбираюсь в ошибках) ошибку:


    Эти undefined reference это функции определенные в других частях программы и не видимые в этом модуле.
    Мне было лень писать extern'ы и я просто забил на них, т.к. программа все равно собирается. Я подумал, что если у кого-то лени поменьше и есть желание то он всегда сможет исправить это самостоятельно.

    s1n wrote:вот мой путь к сборки твоей прогой... надеюсь тут ты подчерпнешь моменты чтобы исправить у себя, для наименьшей затраты для сборки программы...

    А я вот ещё вчера вечером самостоятельно исправил и надеялся тебе помочь :)

    s1n wrote:з.ы. компилировал и собирал программу три дня.. =)...

    это ещё ничего у меня ушло на это около месяца, учитывая то, что я до этого писал на Си (и С++) только для компиляторов фирмы Borland и ничего не знал о мэйкфайлах и встроенном ассемблере gcc, поэтому
    s1n wrote:благо привык нажать одну кнопку

    мне понятно :) .

    s1n wrote:конечно для меня многое не понятно.... но все равно... =)... спасибо...

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

    Вообще я бы хотел добавить ещё звук к эмулятору, но т.к. на мою аудиокарту пока нет драйвера, то и тестировать мне неначём. Поэтому если у кого-нибудь возникнет такое же желание и будет поддерживаемая Колибри аудиокарта...
  • решил поковырять FCEUv0.2src.7z.....
    в MK.bat прописал полный путь к libmSDL.a...

    Code: Select all

    mld nest drivers/menuet/nest.o D:/OS/menuetos/lib/libmSDL.a
    но у тебя в папке уже есть он... так что можно либо грохнуть libmSDL.a, либо изменить путь... примерно так..

    Code: Select all

    mld nest drivers/menuet/nest.o libmSDL.a
    и Makefile.win не собирается.. =).. но там не стал заморачиваться... мне он не очень нужен...
    и еще... зачем ты оставляешь в архиве с сорсами *.o и fce???

    з.ы. а ты changelog не ведешь??? просто интеерсно что ты добавил в новой версии... что убрал... readme твоего не видно в сорсах.. =)

    з.ы.2. добавил страничку на wiki (http://wiki.kolibrios.org/Applications/ru/FCEU)...
  • Исправил MK.bat. Выкинул всё лишнее. Ссылка та же.
    changelog не ведешь???

    Он идет вместе с бинарником, там же и readme.
    За страничку на wiki спасибо.
    Я там немножко ошибся. Можешь исправить:
    4. Заходишь в папку menuetos из пункта 2.

    на
    4. Заходишь в папку menuetos из пункта 3.
  • fix it.. =)...
    за сорсы обновленые спасибо.. буду вникать...
  • Недели через две будет новая версия, а пока Just for fun, пара старых версий с глючным выводом графики.
    http://narod.ru/disk/9897453000/FCEU_GluVers.7z.html
  • Версия порта 0.3.
    Версия эмулятора 0.96.

    - добавлено 33 новых маппера( 48, 51, 52, 57, 61, 72, 74, 77, 82, 83, 88, 92, 96, 114, 115-117, 140, 144, 152-156, 189, 227, 232, 234, 235, 242, 248-250 )
    - добавлены новые эмулируемые устройства ( power pads, game pads, zapper, arkanoid, shadow, Family BASIC Keyboard )
    - выбор виртуального джойстика
    - ускоренный вывод графики
    - вывод fps
    - сообщения теперь выводятся на доску отладки
    - см. файл "ChangeLog.txt" чтобы просмотреть весь список изменений

    _____________________________________________________________________________________________________________________________________________

    Port version 0.3.
    Emulator version 0.96.

    - 33 new mappers were add ( 48, 51, 52, 57, 61, 72, 74, 77, 82, 83, 88, 92, 96, 114, 115-117, 140, 144, 152-156, 189, 227, 232, 234, 235, 242, 248-250 )
    - new emulated devices were add ( power pads, game pads, zapper, arkanoid, shadow, Family BASIC Keyboard )
    - select virtual joysticks
    - faster graphics output
    - fps output
    - messages now output to the debug board
    - see file "ChangeLog.txt" for full list of changes
    Attachments
    FCEU_v0.3.7z (141.86 KiB)
    Downloaded 568 times
  • hidnplayr
    Duck hunt, Ski Or die! games would work now. :)
  • спасибо за обновления..
  • Пожалуйста. :)
    Работаю сейчас над звуком, тестирую в Qemu на SoundBlaster. Плохо, что нет статьи по работе со звуковыми драйверами (Infinity, Sound, SB16), из-за этого много времени уходит на копание в коде драйверов и понимание логики работы звуковой подсистемы Колибри. :(
    Может быть кто-нибудь мог бы взяться за написание такой статьи, а то кроме ac97snd и doom написанных Serge до сих пор не одно приложение не работает со звуком.
  • dosbox тоже работает со звуком.
    API для работы со звуком с интерфейсом для Си и реализацией на Fasm есть на svn в папке programs/develop/sdk/trunk/sound и в SDK. Копаться в драйверах необязательно.
    Ушёл к умным, знающим и культурным людям.
  • Действительно работает, хотя в Qemu насладиться звуком dosbox и не получается.
    SDK я конечно же смотрел, sound.lib с DJGPP не работает (видимо писалась под какой-то другой компилятор языка C с другим количеством подчеркиваний, не стал разбираться), но это не проблема все эти функции я переписал в отдельный модуль FCEU. Дело в том, что в эти функции мы передаем хэндлер буфера типа указатель на STREAM, как я понял, а у меня уже есть заполненный буфер в FCEU, содержимое которого мне просто нужно скопировать в буфер из которого и читаются сэмплы. Со звуком я раньше никогда не работал, так что может где-то что-то и напутал, но имеющийся, например, порт FCE Ultra под DOS, именно так и поступает выводя звук на SB16 аудиокарту.

    Цитата из файла porting.txt (документация по портированию FCE Ultra, поставляется вместе с исходниками):

    void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count);
    Called by FCE Ultra on every emulated frame. This function should
    perform the following three things(in any order):

    1.
    Update the data pointed to by the pointers passed to
    FCEUI_SetInput() and FCEUI_SetInputFC().
    2.
    Copy contents of XBuf over to video memory(or whatever needs to be
    done to make the contents of XBuf visible on screen).
    Each line is 256 pixels(and bytes) in width, and there can be 240
    lines. The pitch for each line is 272 bytes.
    XBuf will be 0 if the symbol FRAMESKIP is defined and this frame
    was skipped.
    3.
    Write the contents of "Buffer" to the sound device. "Count" is the
    number of samples to write. Only the lower 16-bits of each
    sample are used, so each 32-bit sample in "Buffer" can be converted to
    signed 16-bit by dropping the upper 16 bits.
    When sound was disabled for the frame, "Count" will be 0.


    Конец цитаты.

    Если работать напрямую с драйвером SB16, то другие аудиокарты конечно же не станут выводить звук, а то и что похуже случится. Если же работать с Infinity (что и в принципе и необходимо), то не вполне понятно как состыковать буфер, предоставляемый FCEUD_Update и STREAM.
  • Со звуком более - менее разобрался. Как оказалось создавать STREAM вручную не надо. Первым делом необходимо создать буфер через функцию CreateBuffer, которая создает буфер нужного формата и самостоятельно заполняет поля STREAM, после чего возвращает на него указатель через параметр. Существует несколько видов буферов: PCM_STATIC, PCM_RING, PCM_OUT и т.д. Некоторые функции драйвера Infinity предназначены для работы только с определенными видами буферов.
    Вобщем создаю буфер так:

    Code: Select all

       if (CreateBuffer(PCM_1_8_44, 0, &SndBuf)) //Create stream buffer
       {
         __kolibri__debug_str("create buffer return error\n\r");
         return 0;
       }
    звук вывожу в функции FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); через WaveOut(SndBuf,Buf,Count);
    Звук есть, но пока что лишь отдаленно напоминает то, что должно быть на самом деле. Продолжаю работать над этим.[/color]
  • Asper

    WaveOut() ,блокирует поток пока не прокачает все данные во внутренний буфер. И там большой лаг от вызова функции до вывода на чип (макс. 0.17с). лучше выводить звук через кольцевой буфер PCM_RING. Посмотри в исходниках Doom svn/programs/games/doom/trunk/s_sound.c S_Init() запускает в отдельном процессе sound_proc() и та выполняет всю работу по микшированию и выводу звука.
  • Who is online

    Users browsing this forum: No registered users and 1 guest