Dado que la PSP evoluciona, lo hace también la scene (normalmente más rápido :P), lo que provoca cambios en el pspsdk que debemos adoptar lo antes posible para no quedarnos obsoletos. En este caso vamos a hacer compatibles nuestros programas al modelo slim de PSP y a las PSP clásicas con firmwares actuales (versiones 3.XX y posteriores). Es indispensable leer y entender la receta “Aplicaciones portables entre PSP y GNU/Linux con SDL”.
Introducción
Hasta ahora, cuando desarrollábamos software para nuestras portátiles, no teníamos ningún tipo de limitación: toda la máquina era para nosotros. Esto era debido a que las aplicaciones se podían ejecutar como kernel thread, es decir: con todos los privilegios. A partir del firmware 2.71 esto no es posible, y si nuestros ejecutables se configuran como kernel thread, obtendremos un bonito “No se pudo iniciar el juego” cuando intentemos ejecutarlo. Igualmente obtendremos un error si, aún siendo user thread, hacemos llamadas a objetos del espacio del kernel.
Configurar el programa como user thread
Como ya explicamos en anteriores recetas, el modo del hilo viene configurado por:
PSP_MODULE_INFO(“module_name”, 0, 1, 1);
Aquí viene el primer cambio, a partir de ahora lo configuraremos como:
PSP_MODULE_INFO(“module_name”, 0, 1, 0);
Ahora tenemos el siguiente problema: en este modo de ejecución, se asignan 64Kb de memoria para el heap de nuestras aplicaciones, por tanto se recomienda allocatar una buena cantidad de memoria al principio del programa, esto se consigue con:
PSP_HEAP_SIZE_KB(20480);
Con esto ya tenemos el código listo, ahora a compilar… ;)
Cambios en el Makefile
Afortunadamente no hay mucho que cambiar, sólo que no podemos genera un archivo elf sino que ahora hemos de crear un prx, además también hay que indicar que queremos crear un archivo para firmware 3.71 o superior, todo se consigue símplemente con:
BUILD_PRX = 1
PSP_FW_VERSION = 371
EXTRA_TARGETS = EBOOT.PBP
include $(PSPSDK)/lib/build.mak
En realidad basta con añadir las dos primeras lineas a nuestros makefiles… ;)
Apéndice A: adaptando aplicaciones con SDL
Ya hablamos en recetas anteriores sobre SDL, ahora vamos a hablar un poco de sus “tripas”. SDL tiene un componente llamado SDLmain que se incluye automáticamente en los programas que usan esta librería. Ese componente permite abstraer algunos detalles de las arquitecturas, por ejemplo, en las aplicaciones para PSP nos ahorra tener que definir nuestro PSP_MODULE_INFO porque SDLmain tiene su propia definición. Al igual que instala sus propios manejadores para el callback de terminación. Esto antes nos suponía una comodidad y una ventaja, sin embargo ahora, nos viene un poco mal debido a que SDLmain asume que nuestro programa se va a ejecutar como kernel thread y no es cierto.
Afortunadamente no hay que tocar mucho código, excepto incluír todo aquello que SDLmain hacía automáticamente:
- PSP_MODULE_INFO
- ExitThread y ExitCallback
Ahora debemos modificar los
makefiles, dado que los
CFLAGS y los
LIBS (parámetros al
linkador) los establecemos haciendo uso de
sdl-config que tenemos en nuestro
pspsdk, es decir:
PSPBIN = $(shell psp-config —psp-prefix)/bin
SDL_CONFIG = $PSPBIN/sdl-config
CFLAGS = $(shell $SDL_CONFIG) —cflags
LIBS = $(shell $SDL_CONFIG) —libs
Lo que hace que nuestras variables tomen estos valores:
CFLAGS = -I/usr/local/pspdev//psp/include/SDL -Dmain=SDL_main
LIBS = -L/usr/local/pspdev//psp/lib -lSDLmain -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev//psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet
¿Estáis viendo el SDLmain? pues eso hay que quitarlo ;)
Quitaremos la invocación a sdl-config y estableceremos
dichas variables directamente:
CFLAGS = -I/usr/local/pspdev//psp/include/SDL
LIBS = -L/usr/local/pspdev//psp/lib -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev//psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet
Y con eso y un bizcocho… está listo ;)