Emuladors Gameboy (Gearboy, Mednafen-VBA)

De wikijoan
Salta a la navegació Salta a la cerca

Gameboy - Gearboy (descartat)

Introducció

Instal.lació

Install and configure SDL 2 for development.

$ scp SDL2-2.0.3.tar.gz pi@192.168.1.35:/home/pi
$ cd ~/SDL2-2.0.3

Instal.lo les dependències per a la RPi (veure més avall):
$ sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev  
$ sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev

$ ./configure
$ make
$ sudo make install
$ sdl2-config --version
2.0.3

Un cop instal.lada la llibreria SDL 2.0 (de fet ja tenia la versió 2.0.1 instal.lada...), procedeixo a instal.lar l'emulador gearboy:

$ scp Gearboy-master.zip  pi@192.168.1.35:/home/pi/

MILLOR: En comptes de descarregar el zip també puc baixar l'estat actual del projecte:

$ svn co https://github.com/drhelius/Gearboy.git

A la RPi:

$ unzip Gearboy-master.zip
$ cd ~/Gearboy-master/platforms/raspberrypi/Gearboy
$ make
...
/usr/bin/ld: main.o: undefined reference to symbol 'vc_dispmanx_element_add'
//opt/vc/lib/libbcm_host.so: error adding symbols: DSO missing from command line
collect2: ld returned 1 exit status
Makefile.include:16: recipe for target 'gearboy.bin' failed
make: *** [gearboy.bin] Error 1

Després de bastanta estona dóna un error en la compilació.

Mirar:

'vc_dispmanx_element_add' té a veure amb OpenGL.


Finalment afegeixo -lbcm_host i es soluciona el problema vc_dispmanx_element_add, però aleshores

/usr/bin/ld: ../../../src/audio/Blip_Buffer.o: undefined reference to symbol 'pow@@GLIBC_2.4'
//lib/arm-linux-gnueabihf/libm.so.6: error adding symbols: DSO missing from command line
collect2: ld returned 1 e

i la solució està aquí

S'ha d'afegir també -lm

LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lm -lbcm_host -lGLESv2 -lEGL -lopenmaxil -lvcos -lvchiq_arm -lrt `sdl2-config --libs`

i es crea l'executable gearboy.bin La definició de les tecles està definida a main.cpp

Where is the config file for gearboy? Id like to map the buttons on my custom joystick :( It doesn't seem like there is a config file for Gearboy. The keys are hardcoded in src/input.cpp


Copiem les ROMs:

$ scp * pi@192.168.1.35:/home/pi/roms_gameboy_color

Les roms ja carreguen correctament:

/home/pi/Gearboy-master/platforms/raspberrypi/Gearboy/gearboy-bin /home/pi/roms/gb/speedy_gonzales_-_aztec_adventure.gbc

El problema està en què de moment no funcionen les tecles, que ho hauré d'arreglar. Per tal d'arreglar-ho estudio una mica de SDL2.0 per tal de veure perquè no funcionen els events del teclat. Ho faig a Linux i a la RPi. Segueixo un tutorial de SDL2:

Quan faig una modificació al fitxer main.cpp, per tal de recompilar els fitxers main.o i main.cpp sense haver de recompilar tot el projecte (que necessita 20 minuts):

#rm main.o
#rm gearboy.bin
cc -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux  -I../../../src/ -I./ -c main.cpp -o main.o

cc -o gearboy.bin -Wl,--whole-archive main.o ../../../src/MBC2MemoryRule.o ../../../src/Audio.o ../../../src/MBC1MemoryRule.o ../../../src/IORegistersMemoryRule.o ../../../src/audio/Gb_Apu.o ../../../src/MultiMBC1MemoryRule.o ../../../src/GearboyCore.o ../../../src/audio/Multi_Buffer.o ../../../src/audio/Effects_Buffer.o ../../../src/MBC5MemoryRule.o ../../../src/audio/Gb_Apu_State.o ../../../src/audio/Blip_Buffer.o ../../../src/MemoryRule.o ../../../src/Input.o ../../../src/Processor.o ../../../src/Video.o ../../../src/Memory.o ../../../src/Cartridge.o ../../../src/MBC3MemoryRule.o ../../../src/RomOnlyMemoryRule.o ../../../src/CommonMemoryRule.o ../../../src/audio/Sound_Queue.o ../../../src/audio/Gb_Oscs.o ../../../src/opcodes.o ../../../src/opcodes_cb.o -L/opt/vc/lib/ -lm -lbcm_host -lGLESv2 -lEGL -lopenmaxil -lvcos -lvchiq_arm -lrt `sdl2-config --libs` -lstdc++ -Wl,--no-whole-archive -rdynamic

Allò important per tal de què funcioni el teclat és compilar SDL2.0 a la RPi tal com explica el fitxer README-raspberrypi.txt:

===============================================================================
 Raspbian Build Dependencies
===============================================================================

sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev

You also need the VideoCore binary stuff that ships in /opt/vc for EGL and
OpenGL ES 2.x, it usually comes pre installed, but in any case:
    
sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev

NOTA. Finalment, tot i que tenia esperances de què funcionés, el comportament del teclat és molt inestable, va lent i el so és terrible. A més que depèn de SDL2. Tenint en compte de què amb mednafen funciona Gameboy a temps real i amb un bon so, de moment no hi ha color i descarto Gearboy.

Gameboy -Gcat (descartat)

Només emula la gameboy, no pas la Gameboy color.

http://gcat.org.uk/emul/
$ tar xvzf gcat-gameboy-1.2.tar.gz
$ cd gcat-gameboy-1.2/

Arrow keys - emulate the Gameboy controller's D-pad
 A & S      - emulate the Gameboy controller's A and B buttons
 Space      - emulates the Start button
 Enter      - emulates the Select button
 Escape     - exits the emulator


$ make
gcc -c -o emulator.o emulator.c -I/opt/vc/include/ -I./ -I/opt/vc/src/hello_pi/libs/ilclient -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/
gcc -c -o z80.o z80.S
gcc -c -o gameboy.o gameboy.c
gcc -o gameboy emulator.o z80.o gameboy.o -L/opt/vc/lib/ -lGLESv2 -lEGL -lopenmaxil -lbcm_host /opt/vc/src/hello_pi/libs/ilclient/libilclient.a
gcc: error: /opt/vc/src/hello_pi/libs/ilclient/libilclient.a: No such file or directory
Makefile:10: recipe for target 'gameboy' failed

El que falta és compilar el codi font de /opt/vc/src:
$ cd /opt/vc/src/hello_pi
$ rebuild.sh
i ara ja tenim el fitxer /opt/vc/src/hello_pi/libs/ilclient/libilclient.a

I és que hi ha una alternativa a utilitzar SDL per fer gràfics des de la consola:
*http://www.raspberrypi.org/forums/viewtopic.php?t=6750
<pre>
My port is intended to run from the command line, with no X server running. It uses EGL/OpenVG to render directly to a fullscreen framebuffer.

i precisament en el directori /opt/vc/src hi ha exemples de com es faria.

Torno a compilar i ara: /usr/bin/ld: /opt/vc/lib//libopenmaxil.so: undefined reference to symbol 'vcos_generic_mem_alloc_aligned'

El que provaré és fer http://www.raspbian.org/RaspbianXBMC

sudo rpi-update

   sudo reboot

Install/upgrade build tools and dependencies.

   sudo apt-get update
   sudo apt-get upgrade

i si no em surt enviaré un mail. Un cop fet el rpi-update, update, upgrade, estaria bé tornar a compilar el gearboy.

No cal tanta història i per tal de què compili s'ha d'afegir -lvcos i -lpthread en el Makefile

CFLAGS+=-DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I$(SDKSTAGE)/opt/vc/include/

LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lGLESv2 -lEGL -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lrt -lpthread /opt/vc/src/hello_pi/libs/ilclient/libilclient.a

INCLUDES+=-I$(SDKSTAGE)/opt/vc/include/ -I./ -I/opt/vc/src/hello_pi/libs/ilclient -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux 

all: gameboy

gameboy: emulator.o z80.o gameboy.o
	gcc -o gameboy emulator.o z80.o gameboy.o $(LDFLAGS)

emulator.o: emulator.c
	gcc -c -o emulator.o emulator.c $(INCLUDES) $(CFLAGS)

gameboy.o: gameboy.c
	gcc -c -o gameboy.o gameboy.c

z80.o: z80.S
	gcc -c -o z80.o z80.S

Mednafen (Visualboyadvance)

Per tal d'emular Gameboy (gb i gbc), a Piplay es fa servir mednafen. mednafen és un emulador que emula diferents sistemes i que en la versió piplay-0.8-beta7 ja està configurat. Com que he tingut problemes per fer funcionar i configurar Gearboy, l'emulador de gameboy el faré amb mednafen, i això vol dir partir de la imatge de piplay.

L'emulació de Gameboy a mednafen està basant en VBA-M (Visualboyadvance), que és el projecte actiu:

Però aquest projecte és difícil de compilar sense les eines adequades, i no hi ha cap informació per a la RPi. Per tant, haurem de confiar en la versió de mednafen per a la RPi-

  • A piplay-0.8 els emuladors estan a ~/pimame/emulators i concretament ~/pimame/emulators/mednafen. Aquí hi ha congigure, Makefile, i la carpeta src/.
  • A piplay-0.8 les ROMs estan a ~/pimame/roms i concretament ~/pimame/roms/gb
  • A piplay-0.8 el menu inicial està a ~/pimame/pimame-menu, concretament els scripts meny.py i launchmenu.py, i hi ha un fitxer de configuració important que és el config.yaml. Concretament, la part que afecta al llençament de l'emulador de Gameboy és:
menu_items:
...
  - label: Gameboy
    visible: Yes
    roms: /home/pi/pimame/roms/gb/
    full_path: yes
    extension: yes
    command: export LD_LIBRARY_PATH=/home/pi/pimame/dispmanx/build/.libs/ && /home/pi/pimame/emulators/mednafen/src/mednafen
...

Per tant, si vull llençar una rom de Gameboy:

$ export LD_LIBRARY_PATH=/home/pi/pimame/dispmanx/build/.libs/
$ /home/pi/pimame/emulators/mednafen/src/mednafen /home/pi/pimame/roms/gb/speedy_gonzales_-_aztec_adventure.gbc

I els jocs funcionen correctament i el so, que és important, també.


Fitxer de configuració. Mapejat del teclat. /home/pi/.mednafen/mednafen-09x.cfg cerco per gb (gb i gbc) per cercar totes les configuracions que afecten a Gameboy i Gameboy Color. Per ex, cap a la línia 447:

;Enable (automatic) usage of this module.
gb.enable 1

i concretament m'interessa el mapejat del teclat per adaptar-ho a les meves necessitats.

;Exit
command.exit keyboard 293~keyboard 27
...
;gb, Built-In, Gamepad: A
gb.input.builtin.gamepad.a keyboard 259

;gb, Built-In, Gamepad: B
gb.input.builtin.gamepad.b keyboard 258

;gb, Built-In, Gamepad: DOWN ↓
gb.input.builtin.gamepad.down keyboard 115

;gb, Built-In, Gamepad: LEFT ←
gb.input.builtin.gamepad.left keyboard 97

;gb, Built-In, Gamepad: Rapid A
gb.input.builtin.gamepad.rapid_a

;gb, Built-In, Gamepad: Rapid B
gb.input.builtin.gamepad.rapid_b

;gb, Built-In, Gamepad: RIGHT →
gb.input.builtin.gamepad.right keyboard 100

;gb, Built-In, Gamepad: SELECT
gb.input.builtin.gamepad.select keyboard 9

;gb, Built-In, Gamepad: START
gb.input.builtin.gamepad.start keyboard 13

;gb, Built-In, Gamepad: UP ↑
gb.input.builtin.gamepad.up keyboard 119

Originalment el mapeig es el següent:

EXIT: 27 (ESC)
A: 259 (3 del teclat numèric)
B: 258 (2 del teclat numèric)
LEFT: 97 (a)
RIGHT: 100 (d)
UP: 119 (w)
DOWN; 115 (s)
SELECT: 9 (TAB)
START: 13 (ENTER)

Canvio la configuració a (màquina de 7 botons):

  • ESC: 0
  • START: 1
  • SELECT: 2
  • B: 3 (a la Gameboy el botó B està a l'esquerre del A)
  • A: 4

Per trobar els keycodes adequats confio en SDL_keysym.h: (tinc una còpia a MAME/docs)

	SDLK_0			= 48,
	SDLK_1			= 49,
	SDLK_2			= 50,
	SDLK_3			= 51,
	SDLK_4			= 52,
	SDLK_5			= 53,
	SDLK_6			= 54,
...
	SDLK_UP			= 273,
	SDLK_DOWN		= 274,
	SDLK_RIGHT		= 275,
	SDLK_LEFT		= 276,

I per tant el fitxer de configuració queda:

;Exit
command.exit keyboard 293~keyboard 27~keyboard 48
...
;gb, Built-In, Gamepad: A
gb.input.builtin.gamepad.a keyboard 52

;gb, Built-In, Gamepad: B
gb.input.builtin.gamepad.b keyboard 51

;gb, Built-In, Gamepad: DOWN ↓
gb.input.builtin.gamepad.down keyboard 274

;gb, Built-In, Gamepad: LEFT ←
gb.input.builtin.gamepad.left keyboard 276

;gb, Built-In, Gamepad: RIGHT →
gb.input.builtin.gamepad.right keyboard 275

;gb, Built-In, Gamepad: SELECT
gb.input.builtin.gamepad.select keyboard 50

;gb, Built-In, Gamepad: START
gb.input.builtin.gamepad.start keyboard 49

;gb, Built-In, Gamepad: UP ↑
gb.input.builtin.gamepad.up keyboard 273

Un tema interessant és que veig com puc associar vàries tecles a la mateixa funció. Per ex, sortir és el 0, però vull que continuï funcionant el Escape:

;Exit
command.exit keyboard 293~keyboard 27~keyboard 48

I finalment el tema de salvar els estats dóna bastant pel sac, doncs coincideix amb les meves tecles i si ho comento tornen a aparèixer. La solució és canviar el mapping, per exemple afegint un 0:

;Save state 0 select
command.0 keyboard 480

;Save state 1 select
command.1 keyboard 490

;Save state 2 select
command.2 keyboard 500

;Save state 3 select
command.3 keyboard 510

;Save state 4 select
command.4 keyboard 520

;Save state 5 select
command.5 keyboard 530

;Save state 6 select
command.6 keyboard 540

El Speedy Gonzales funciona a les mil meravelles, amb un so perfecte.

Instal.lació de Mednafen des de les fonts a la RPi B+

He provat de compilar el projecte des de zero però no ha funcionat. Tant se val. El que he de fer és partir de la imatge piplay-0.8-beta9 (que funciona tant per a la RPi B+ com la 2), i netejar tot el que no necessito. Els emulador de GB els faré funcionar a partir del mednafer (el gba ja ho tinc solucionat sense mednafen). M'oblido de compilar des de les fonts.

ROMs

Jocs

Jocs importants

highest rated a:

Ultraman (Japan)
Pokemon De Panepon (Japan)
Yuu Yuu Hakusho - Makai Touitsu (Japan)
Kirbys Star Stacker
Donkey Kong Land Iii (V1.1)
55 Game Hk
Gargoyles Quest - Ghostsn Goblins
Marus Mission
Tiny Toon Adventures - Babs Big Break
Nettou King Of Fighters 96 (Japan)
Pocket Bomberman
Legend Of Zelda, The - Links Awakening Dx (V1.2) (Italian)
Who Wants To Be A Millionaire - 2nd Edition
Mario Bob Demo (Public Domain)
Magical Drop
Survival Kids
Moomins Tale
Yuu Yuu Hakusho - Ankoku Bujutsu Kai (Japan)
Mortal Kombat Ii
Nettou King Of Fighters 96
Super Donkey Kong Gb (Japan)
Qix (Usajapan)
Fushigi No Dungeon - Fuurai No Shiren Gb2 - Sabaku No Majou (Japan)
Dai-2-Ji Super Robot Taisen G (Japan)[T+Chi]
Power Rangers - Lightspeed Rescue
Magic Maze
Adventures Of Lolo
Lion King, The - Simbas Mighty Adventure
Pokemon Trep Edition V0.01 (Blue Hack)
Qix Adventure
Magi Nation
Racing Mini 4wd (Japan)
V-Rally - Championship Edition
Hokuto No Ken - Fist Of The North Star (Japan)
Pokemon Cute V1.4 (Yellow Hack)
Probotector
Madden Nfl 2000
Kaeruno Tameni (Japan)
Pokemon Puzzle Challenge
Metroid Ii - Return Of Samus
Driver - You Are The Wheelman
G1 King - 3 Biki No Yosouya (Japan)
Z - The Miracle Of The Zone (Japan)
Metal Gear - Ghost Babel (Japan)
Elevator Action
Kirbys Pinball Land
Batman Beyond - Return Of The Joker
Dragon Warrior Monsters 2 - Taras Adventure
Lufia - The Legend Returns

Speedy Gonzales: Aztec Adventure (Game Boy - 1999)

Effect	Password
2	6483
3	2397
4	9853
5	5629
6	5141

Són 6 temes, i cada tema consta de 3 stages.

...a password is only given at the end of a level, and its pretty tough to get through all three stages and an end-boss on four meager lives, especially since bottomless pits and long rows of deadly spikes are constant obstacles. És a dir, que sembla ser que quan es completa els 3 stages et deu demanar el password.

$ xxd speedy\ gonzales\ -\ aztec\ adventure\ \(u\)\ \[c\]\[t1\].gbc | more
...
0000110: 000c 000d 0008 111f 8889 000e dccc 6ee6  ..............n.
0000120: dddd d999 bbbb 6763 6e0e eccc dddc 999f  ......gcn.......
0000130: bbb9 333e 5350 4545 4459 474f 4e5a 4120  ..3>SPEEDYGONZA 
0000140: 2b35 2080 4242 0019 0500 0133 00a8 a06a  +5 .BB.....3...j
0000150: 01e8 03f3 2100 c8f9 5721 00c0 af22 7cfe  ....!...W!..."|.
0000160: e020 f979 ea30 c378 ea31 c37a cd04 03fb  . .y.0.x.1.z....
...

Shrek: Fairy Tale FreakDown

Passwords i trucos de Shrek: Fairy Tale FreakDown (GBC):


creat per Joan Quintana Compte, febrer 2015