Page 4 of 6

Re: Порт FCE Ultra

Posted: Sat Dec 13, 2008 10:10 pm
by Asper
barsuk прав.
Целым архив залить всё равно не удалось, но это видимо связано с политикой провайдера или клуба, где я сижу (хотя скачивать "большие" файлы могу без проблем).
Закачал и DJGPP и menuetlibc.

http://ftp.kolibrios.org/users/Asper/

Re: Порт FCE Ultra

Posted: Sun Dec 14, 2008 10:47 pm
by s1n
в общем теперь так... что с твоей версией(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, я выбрал первый.. =)... а вот про нехватку нужных флагов для компилятора - я не догадывался.. поэтому и не мог собрать рабочую программу... решил написать опус о своих старанию сюда.. и о нерабочей программе(т.е. явно неправильной сборки)... но пока писал - проверял разные варианты.. и нарвался на правильный.. =)...
надеюсь комунить сей рассказ понравиться.... а может и не понравиться... я получил опыт пока собирал проект... благо привык нажать одну кнопку.. и получить готовую прогу.. конечно для меня многое не понятно.... но все равно... =)... спасибо...

Re: Порт FCE Ultra

Posted: Mon Dec 15, 2008 7:20 am
by Asper
Молодец! Сам догадался, значит не так уж ты и не очень в Си. А я вот тут 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:конечно для меня многое не понятно.... но все равно... =)... спасибо...

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

Вообще я бы хотел добавить ещё звук к эмулятору, но т.к. на мою аудиокарту пока нет драйвера, то и тестировать мне неначём. Поэтому если у кого-нибудь возникнет такое же желание и будет поддерживаемая Колибри аудиокарта...

Re: Порт FCE Ultra

Posted: Mon Dec 15, 2008 9:53 am
by s1n
решил поковырять 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)...

Re: Порт FCE Ultra

Posted: Tue Dec 16, 2008 12:52 pm
by Asper
Исправил MK.bat. Выкинул всё лишнее. Ссылка та же.
changelog не ведешь???

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

на
4. Заходишь в папку menuetos из пункта 3.

Re: Порт FCE Ultra

Posted: Tue Dec 16, 2008 1:13 pm
by s1n
fix it.. =)...
за сорсы обновленые спасибо.. буду вникать...

Re: Порт FCE Ultra

Posted: Mon Jun 15, 2009 9:44 pm
by Asper
Недели через две будет новая версия, а пока Just for fun, пара старых версий с глючным выводом графики.
http://narod.ru/disk/9897453000/FCEU_GluVers.7z.html

Re: Порт FCE Ultra

Posted: Thu Jul 09, 2009 5:07 pm
by Asper
Версия порта 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

Re: Порт FCE Ultra

Posted: Thu Jul 09, 2009 5:11 pm
by Asper
hidnplayr
Duck hunt, Ski Or die! games would work now. :)

Re: Порт FCE Ultra

Posted: Fri Jul 10, 2009 9:56 am
by s1n
спасибо за обновления..

Re: Порт FCE Ultra

Posted: Fri Jul 10, 2009 10:44 am
by Asper
Пожалуйста. :)
Работаю сейчас над звуком, тестирую в Qemu на SoundBlaster. Плохо, что нет статьи по работе со звуковыми драйверами (Infinity, Sound, SB16), из-за этого много времени уходит на копание в коде драйверов и понимание логики работы звуковой подсистемы Колибри. :(
Может быть кто-нибудь мог бы взяться за написание такой статьи, а то кроме ac97snd и doom написанных Serge до сих пор не одно приложение не работает со звуком.

Re: Порт FCE Ultra

Posted: Fri Jul 10, 2009 3:26 pm
by diamond
dosbox тоже работает со звуком.
API для работы со звуком с интерфейсом для Си и реализацией на Fasm есть на svn в папке programs/develop/sdk/trunk/sound и в SDK. Копаться в драйверах необязательно.

Re: Порт FCE Ultra

Posted: Wed Jul 15, 2009 9:10 pm
by Asper
Действительно работает, хотя в 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.

Re: Порт FCE Ultra

Posted: Thu Aug 20, 2009 11:31 am
by Asper
Со звуком более - менее разобрался. Как оказалось создавать 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]

Re: Порт FCE Ultra

Posted: Thu Aug 20, 2009 2:14 pm
by Serge
Asper

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