Anuncios Google

Complicando un poco nuestro programa

Tutoriales Avanzados Homebrewes

Después que leer el capi­tulo 1 y el capitulo 2, ya debes tener tu entorno de desarrollo completamente funcional, y has compilado tu primer programa basico para la PSP. Es hora de avanzar a mejores cosas y mas grandes. El "hola mundo" es una aplicacion perfecta, una gran experiencia para aprender, pero no hace nada. Eso es lo que este tutorial va a pretender enmendar. Como hacer que nuestros programas hagan las cosas.

En este capitulo no lo vamos a cubrir todo, ni podremos crear el programa completamente funcional que tengamos ideado hacer funcionar en nuestra PSP. Nos lo tomaremos como los primeros pasos. Aprenderemos los componentes basicos de programacion de la PSP. (en C) Volveremos a abrir nuestra primera aplicacion con el editor, en la cual editaremos algunas lineas y añadiremos otras para lograr que nuestro homebrew haga algo.

Lee el capitulo 2, si no tienes nociones de como establecer un programa basico es un requisito previo para este tutorial.

El producto final de este tutorial sera un programa que cuenta hacia arriba hasta que el usuario apriete un boton o hasta que el contador llegue a un límite predefinido. Una aplicacion perfecta para dar los primeros pasos; combina varios elementos de core de programas C, para crear un resultado util y sencillo sin requerir muchas funciones de programa especi­ficas. Cubriremos en este capitulo las variables, las declaraciones de  if/then, los loops, el texto que formatear, e interactuar con los botones.

Antes de nada, necesitaremos agregar dos encabezamientos mas include. El primero debera darnos un poco mas de control sobre la pantalla (imprescindible para uno de las funciones que usaremos posteriormente). El segundo archiva la pulsacion de los botones de la PSP. Hay que agregar estos dos archivos, pspdisplay.H y pspctrl.H. Debajo de las 2 lineas #include que ya teniamos, incluiremos las declaraciones:

#include <pspdisplay.h>
#include <pspctrl.h>

Y ese es todo el arreglo extra que necesitamos. Ahora procederemos a hacer nuestro codigo mas funcional. A partir de aqui todo el codigo que vamos a añadir sera dentro de la funcion main , reemplazando la declaracion de printf de el capitulo 2. Lo primero que haremos es declar las variables que utilizaremos en nuestro programa de la siguiente forma.

//EJAMPLO (Psuedo Codigo)
//NO AÑADIR AL PROGRAMA
type name=value; 

El tipo indica el de tipo datos de la variable. Cada dato que escribe el tipo puede contener solo los datos del tipo que se indique. Por ejemplo, si escribimos  int puede contener cualquier numero no decimal desde -32767 a 32767. Un float es como un int, pero puede tener decimales. El char puede contener una letra. Para nuestro programa, solo usaremos el int y un tipo especi­fico de PSP llamado SceCtrlData que contiene el estado de los botones de los controles de la PSP.

Declamos las dos variables que utilizaremos, metemos las dos lineas de codigo siguientes codigo en nuestro programa (éstos deben ir en lugar de la linea printf("Hola Mundo"); que escribimos en el capitulo 2; después de la li­nea SetupCallbacks();.

int counter = 0;
int i = 0; SceCtrlData pad;

Asi­ que ahora tenemos tres variables que podemos utilizar. Dos del tipo int, nombrados como counter e i conteniendo un valor de cero como inicio. Y uno de tipo SceCtrlData, nombrado como pad, que es llenado las pulsaciones de los botones. Esto es algo a tener presente al escribir tus propios programas. Si declaras una variable sin inicializarla (como nuestra variable pad), no estara vaci­o. Contendra la informacion que estava previamente en ese trozo de la memoria. Declarar la variable asigna una cierta cantidad del espacio de la memoria para la variable para ser almacenada. La inicializacion es lo que lo vaci­a y nos permite utilizarlo. La razon que nosotros no hemos inicializado pad al mismo tiempo que declaramos que es porque no tendri­a realmente sentido. Desde que tiene el boton la entrada, no lo puede inicializar escribiendo a maquina un valor. Nosotros lo inicializaremos mas tarde, antes de que vayamos a utilizar para algo.

Ahora nosotros le daremos al usuario algunas instrucciones. La forma de hacerlo es utilizando printf les mostramos un mensaje. Asi­ agregamos el siguiente codigo después de declarar la variables:

printf("Pulsa [X] para iniciar el contador");

¿Te parece familiar? Bueno. Es la misma funcion que utilizamos para producir nuestro "Hola Mundo" enel capitulo 2. Si se te ha ocurrido compilar y ejecutar la aplicacion en tu PSP. Ahora verias Pulsa [X] para iniciar el contador, en vez del antiguo Hola Mundo.

Ahora necesitamos decirle al programa que espere hasta que el usuario apriete el boton X. Puede parecer quee sto podri­a ser una cosa muy difi­cil de hacer. Afortunadamente, tenemos algo que funciona a la perfeccion para este problema. Se llama un loop. Basicamente lo que hace es correr por un bloque de codigo muchas veces. Hay los tipos diferentes de loop disponibles.(for, while, do while, etc), pero en este tutorial solo introduce dos de esos loops, el loop while y el loop for. Es un concepto simple, cuando nuestro programa esta trabajando, hacemos una declaracion informando al usuario, seguido de un loop que funcionara mientras se cumpla esa declaracion. Por ejemplo, si tuvieramos un bloque de codigo que incremente una variable (empezando con un valor de cero) en uno cada vez el loop corra, y la declaracion que pusieramos al loop fuera i<10 ejecutari­a el codigo del loop diez veces, porque en el undécimo tiempo cuando se verifica el valor de la variable, sera 10, que no es menos de 10, asi­ que la declaracion seri­a falsa. Otro concepto importante que necesitaremos aprender es que verdadero y falso son sinonimo de 1 y 0 respectivamente.

Nuestro loop no sera de la forma clasica. Podri­a serlo facilmente, pero he examinado un puñado de codigo de proyectos de PSP, y siempre lo hacen esta forma, asi­ que sera bueno acostumbrarnos en las formas que posteriormente iremos viendo en los homebrews de la gente. De todos modos, lo que estaremos haciendo no es mas que un loop infinito. No es realmente infinito aunque, porque (como tan convenientemente no mencioné antes), hay otra forma de salir de un loop aparte de la declaracion del control que se vuelve falsa. Eso es la declaracion de interrupcion.(Break) Introduciremos el principio de nuestro lopp.

while(1) {

Cuando veamos esta declaracion del control siempre evaluara a verdadero, porque 1 es igual que verdadero. Asi­ que el codigo siguiente (las li­neas entre el paréntesis de apertura y el paréntesis de conclusion) ejecutara repetidas veces hasta que encuentre una declaracion de interrupcion.

La proxima li­nea es donde ponemos el valor de pad. Utiliza una funcion que se define en el archivo pspctrl.H que incluimos al principio. Esto es una llamada de la funcion. Ante todo, nosotros le pasamos dos valores a la funcion.No modifiques nada de aqui, Solo necesitamos separar los valores con una coma. La segunda cosa que es un poco diferente es que pasaremos una variable. Ponemos el nombre de la variable en vez de un numero. La tercera cosa que es caprichosa es que necesitamos pasarlo con el operador & delante de la variable. Indica realmente la direccion del operador, y cuando tengamos mas conocimientos nos familizaremos con ello. Basicamente lo que hace es en vez de pasar el valor de la variable, pasa la direccion de la memoria. Por ahora, no sabemos lo suficiente para ser capaces de cambiar el valor de una variable que necesite utilizar el operador &. Asi­ que aqui­ esta como pondremos pad para contener la posicion actual de los controles de la PSP:

sceCtrlReadBufferPositive(&pad, 1);

Si te preguntas para que es el 1 , no te preocupes por ello. Pone el numero de buferes a leer, pero siempre he visto usar 1. Honestamente, yo no sé por qué querri­a modificar nada de la variable pad (si hay una razon, alguien por favor me lo aclara, y yo lo puedo agregar aqui­).

La proxima li­nea contiene una la declaracion if. Nos sirve para poder programar la logica en nuestras aplicaciones. Lo qué hace es ejecutar un bloque de codigo si una declaracion evalua a verdadero. Aqui­, lo que queremos hacer es un break fuera del loop si se pulsa el boton X. El cuál, pause efectivamente  nuestro programa y pasa a la proxima seccion. Si la declaracion evalua a falso, acaba de saltar el codigo, y si hay una declaracion else, ejecuta ese bloque de codigo. Nosotros no tenemos ninguna declaracion mas, asi­ que volvera al loop otra vez, verificando continuamente la posicion de los botones, y viendo si se ha apretado el boton X. Mientras estamos en ello, nosotros cerraremos nuestro loop terminando un paréntesis de la conclusion.

          if(pad.Buttons & PSP_CTRL_CROSS) {
                    break;
          }
} 

La declaracion en el if() se traduce como Si se pulsa el boton X.... Si ese boton se pulsa, hara el break, si no, continuara con el loop.

Cuando el usuario pulsa el boton X, nosotros queremos empezar un contador que funcionara hasta que el usuario pulse el boton O. ¿Asi­ que qué hacemos nosotros? ¡Acertaste, otro loop! Asi­ que empezaremos este loop, y agregaremos en el codigo de la salida (Sustituyendo por PSP_CTRL_CIRCLE en lugar de PSP_CTRL_CROSS).

while(1) {
          sceCtrlReadBufferPositive(&pad, 1);
          if(pad.Buttons & PSP_CTRL_CIRCLE) {
                    break;
          } 

Ahora, necesitamos utilizar una funcion nueva. Para limpiar la pantalla. Recordad que tenemos Pulsa X para iniciar el contador en la pantalla, necesitamos borrar eso.

pspDebugScreenClear ();

Con esta linea se limpiara la pantalla, asi­ que ahora estamos listos para imprimir de nuevo(y decir al usuario como ellos pueden parar el contador y salir el programa).

La primera li­nea te tiene que parecer familiar. Es una declaracion sencilla printf. Un detalle que puede parecerte extraño es el \n al final de la linea. \N es un caracter especial que significa una li­nea nueva. Asi­ que el caracter nuevo de la li­nea es el equivalente de apretar ENTER en su teclado. La segunda declaracion de printf es un poco diferente. Nosotros necesitamos imprimir nuestra variable counter. Para hacer esto, nosotros utilizaremos el operador  %. Basicamente esto significa que queremos mostrar una variable, y el caracter que sigue dice al programa que tipo de variable es. Para un entero, nosotros hacemos el uso i (i ntegrar) El segundo parametro que pondremos es que variable queremos que imprima. En nuestro caso queremos imprimir la variable counter. Asi­ que agregamos dos li­neas mas en el programa.

          printf("Pulsa [O] para parar el contador\n");
          printf("Contador: %i", counter); 

Ahora necesitamos aumentar nuestro contador en uno para que la proxima vez que haga el loop, el numero mostrado sea uno mas alto. ¿No seri­a realmente un contador si no hicieramos esto. Podri­amos hacer esto en uno de dos formas. La primera, menos comun seria poniendo counter = counter+1; funciona perfectamente bien, pero hay una forma mas facil. Para incrementar una variable por uno, utilizaremos el operador + +.

            counter++;

Es exactamente lo mismo que  counter = counter+1;. Pero queda mas elegante, ¿no creeis?

Ahora necesitamos meter una pausa corta para incluir el trabajo del boton Home. Aqui­ estaremos utilizando otro loop for. Este loop es ligeramente distinto del lopp while. Toma tres parametros. El primero es la inicializacion; pondra la variable para el principio del loop. El segundo es la declaracion del control, que hace la misma funcion que la declaracion de control en el loop while. Y el tercero es lo nosotros queremos que le suceda a nuestra variable al final de cada loop.

          for(i=0; i<5; i++) {
                    sceDisplayWaitVblankStart();
          } 

Esto ejecutara nuestra li­nea de codigo 5 veces (cuando sea i = 0, 1, 2, 3, y 4).

Y finalmente, necesitamos terminar el bloque de codigo por el que el loop corre por con un paréntesis sencillo de conclusion

}

Ahora acabar. Esto es el codigo que correra después que se ejecute la declaracion break . Queremos mostrar un mensaje sencillo, y el conde final de nuestro contador. Asi­ que vaciaremos la pantalla y utilizaremos declaraciones mas de printf como hicimos en el loop, pero con un texto diferente.

pspDebugScreenClear();
printf("Contador finalizado.");
printf("Resultado final: %i", counter); 

¡Y tenemos nuestro nuevo codigo listo! Ahora con un par de cambios esteticos del capitulo 2.

Recordad que necesitaremos cambiar los valores basicos del Makefile para reflejar nuestro programa nuevo. Editalo y cambia el ti­tulo a uno que creas conveniente para el programa nuevo. Llamare al mi­o Contador. Y cambia también el objetivo.  Ahora experimenta un poco y construye un simple programa. Empiezas a tener las habilidades basicas que necesitas para crear sus propios programas (los basados en texto por lo menos).

¡Buena suerte, y diviertete!

4.464285
Tu voto: Ninguno Votos totales: 4.5 (28 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de barney77

Aclarame algo abis, porque

Aclarame algo abis, porque cuando sumas el contador con counter++ pones el ";" y en el for con i++ no lo pones, otra cosa más los loop's van dentro de la int o no?, esque el compilador me marca varios errores con los } y no puedo resolverlo, os pongo mi code:

 

/* Contador - Segunda Aplicación y Compilación by B77*/
 
#include<pspkernel.h> /*Incluimos las librerias*/
#include<pspdebug.h>
#include<pspdisplay.h>
#include<pspctrl.h>
PSP_MODULE_INFO("Hola Mundo",0,1,1); /*Definimos el modulo de el programa, esto no impota mucho(mi programa podra compilar sin el), pero si, es cierto, es ideal para tener un buen orden*/
#define printf pspDebugScreenPrintf
 
/* Llamada de salida */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;
 
          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);
 
          sceKernelSleepThreadCB();
 
          return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
          int thid = 0;
 
          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }
 
          return thid;
} 
 /*Está función es necesaria, sin ella solo veriamos por unos segundos el programa, con esta funcion se espera a que el usuario se salga(osea, con el tipico menu de Home)*/
 
int main() {
    pspDebugScreenInit();
    SetupCallbacks();
    int counter = 0;
    int i = 0; SceCtrlData pad;
    printf("Pulsa X para iniciar el contador");
    while(1){
         sceCtrlReadBufferPositive(&pad,1);
         if(pad.Buttons & PSP_CTRL_CROSS) {
                        break;
         }
while(1){
         sceCtrlReadBufferPositive(&pad,1);
         if(pad.Buttons & PSP_CTRL_CIRCLE) {
                        break;
         } 
    pspDebugScreenClear();
    printf("Pulsa O para parar el contador\n");
    printf("Contador: %i",counter);
    counter++; /*Notar que tambien se pudo hacer como en Lua, counter=counter+1*/
    for(i=0; i<5; i++) {
             sceDisplayWaitVblankstart();
             }
    pspDebugScreenClear();
    printf("Contador finalizado.");
    printf("Resultado final: %i", counter); 
    sceKernelSleepThread();
    return 0;
}
}
}

Como puedes ver he cambiado el code, y esque con tantos errores por los } tuve que modificarlo, bien, el compilador me marca errores en las lineas:

71:2, otro que dice: main.cpp: In function' int main()':, en la 62, al parecer algo de que no defini la funcion de el for y el que me ha marcado en todos mis errores al compilar: make: ***[main.o] Error 1.

Mis conclusiones, en el primer error, pienso ha de ser por los }, pero pues ya modifique totalmente el code y nada, en el segundo, pues ni idea, segun yo la int esta perfecta, en el tercero igual, no se.

Otra duda, como copeo el texto que me da el compilador?, el del error como lo copeo?, para ponertelo bien

EDITO: Volvi a hacer el code como el del tuto:

/* Hello World - Primera Aplicación y Compilación by B77*/
 
#include<pspkernel.h> /*Incluimos las librerias*/
#include<pspdebug.h>
#include<pspdisplay.h>
#include<pspctrl.h>
PSP_MODULE_INFO("Hola Mundo",0,1,1); /*Definimos el modulo de el programa, esto no impota mucho(mi programa podra compilar sin el), pero si, es cierto, es ideal para tener un buen orden*/
#define printf pspDebugScreenPrintf
 
/* Llamada de salida */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;
 
          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);
 
          sceKernelSleepThreadCB();
 
          return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
          int thid = 0;
 
          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }
 
          return thid;
} 
 /*Está función es necesaria, sin ella solo veriamos por unos segundos el programa, con esta funcion se espera a que el usuario se salga(osea, con el tipico menu de Home)*/
 
int main() {
    pspDebugScreenInit();
    SetupCallbacks();
    int counter = 0;
    int i = 0; SceCtrlData pad;
    printf("Pulsa X para iniciar el contador");
    while(1){
         sceCtrlReadBufferPositive(&pad,1);
         if(pad.Buttons & PSP_CTRL_CROSS) {
                        break;
         }
} 
 
while(1){
         sceCtrlReadBufferPositive(&pad,1);
         if(pad.Buttons & PSP_CTRL_CIRCLE) {
                        break;
         }
} 
    pspDebugScreenClear();
    printf("Pulsa O para parar el contador\n");
    printf("Contador: %i",counter);
    counter++; /*Notar que tambien se pudo hacer como en Lua, counter=counter+1*/
    for(i=0; i<5; i++) {
             sceDisplayWaitVblankstart();
             }
			 	pspDebugScreenClear();
    printf("Contador finalizado.");
    printf("Resultado final: %i", counter); 
    sceKernelSleepThread();
    return 0;
}	

Y exactamente los mismos errores

EDITO2: Usando el code que te deje arriba(el segundo), el error estaba en el for, en el sceDisplayWaitVblanStart(); lo escribi mal(el start sin mayuscula), gracias por el tuto :D. Aunque el resultado final es 1 y presiono X o Circulo y nada D:, deja lo checo bien.

Veamos...

Cuando se usa variable++, va ; porque así debe terminar cada sentencia en C. En el for no se pone, porque así va su sintaxis:

//Ejemplo de for
 
for(i=inicio;i<=fin;paso)
{
  //bloque de código a ejecutar
}
 
 
//inicio es el número donde va iniciar el ciclo
//fin el número donde termina el conteo
//paso, el incremento de la variable en cada pasada del ciclo 

Sobre el error de tu línea 62, es porque la función está mal escrita, ni más ni menos. Tienes sceDisplayWaitVblankstart(); cuando debería ser sceDisplayWaitVblankStart();

PD. Tu firma incumple... está enorme ¬¬

Imagen de barney77

Si ya está solucionado,

Si ya está solucionado, exctamente era eso, de todos modos gracias y me aclaraste eso :D.

PD: Lo siento, ahora la edito.

Imagen de Robione22

Solo una cosa.

Muy buen tuto, pero aquí hay un "problemita".

En la parte del código que dice:

pspDebugScreenClear();
printf("Contador finalizado.");
printf("Resultado final: %i", counter); 

Nos muestra Contador Finalizado.Resultado final: 55 (por decir un número), a lo que voy es que se ve algo mal que este todojunto XD.

Creo que lo ideal sería ponerlo así:

pspDebugScreenClear();
printf("Contador finalizado.\n");
printf("Resultado final: %i", counter); 

Para dar un salto de línea entre ambos printfs

Salu2

Imagen de arielnmz

puedes subir el main.c ya

puedes subir el main.c ya hecho? o alguien que si le salio lo puede subir? nadamas no entiendo nada esta... todo hecho bolas el tuto...

duda

¿Que significa: error. expected identifier or '('before 'while' y como se soluciona?

Gracias por adelantado.

Imagen de arima_kun

revisa la linea

te esta diciendo que en tu expresion esta mal el parantesis antes de while

revisa la linea y corrige el error

lo tengo

Justamente de la misma forma que lo pone en el tutorial y aun asi me sigue diciendo que esta mal y ahora me salen otro error mas: expected expression before 'int' .

Gracias por adelantado

Dos lineas donde me sale el error:

while (1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CROSS) {
break;
}
}
while (1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CIRCLE) {
break;
}
pspDebugScreenClear ();
printf("Pulsa O para para el contador\n")
printf("Contador: %i", counter);
counter++; 

Como se nota que no se nada de lenguaje en CTongue out

Configurar mi makefile

Buenas estoy programando una tonteria para ir empezando a programar y nose como añadir la libreria power -lpsppower_2 al makefile, ¿donde se pone?. Simplemente es para cambiar la velocidad del CPU

Os pongo mi Makefile:

TARGET = MiPrograma
OBJS = main.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS =

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Mi Programa de PSP

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Salu2 Wink

Imagen de Gohrum

genial

Qué puedo decir? Simplemente genial, me ha funcionado muy bien e incluso ya he empezado a idear algunas cosas :) Muchisimas mil gracias (ahora a por el 3 y ultimo paso) pena que ps2dev este caida...


Muerta la rabia, se acabaron los perros.

Podria poner alguien el programa

Sé programar en C y algo de C++, pero me he liado y se queda en "Pulse X para iniciar contador."

No sé en que me habré equivocado, pero no doy con la solucion

Un saludo y gracias por el tutorial, ya llevaba tiempo queriendo hacer algo en psp.

Por cierto, saben donde ver las funciones de las librerias?? gracias.

Edito: Solucionado. Gracias de todas formas 

Imagen de Poseidon_zodiac

no puedo!!!!

no puedo compilar el programa, me pasa una serie de errores relacionados con las funciones creadas al principio del programa, alguien sabe que puedo hacer??? porfavor una respuesta....
de antemano gracias.

Imagen de Elfen

Esta bien el tutorial?

Puede que sea por la hora que es pero e hecho todos los pasos y no me funciona es mas al compilarlo me da un monton de errores, lo e revisado y escrito de nuevo y nada los mismos errores, puede que haya algun fallo en el tutorial??

Imagen de Elfen

Lo consegui!!!!!!!!

Fue un fallo tonto...oye alguien sabe cuando se va a publicar el siguiente tutorial...esq tengo bastantes conocimientos de ingles y a kien lo este aciendo le podria ayudar a traducir

Imagen de Miquel Carol

Seguramente mañana

Pensava publicar el siguiente capitulo. De todos modos me pondre en contacto contigo via mail.

Imagen de Elfen

no es por meter presion!!

No deberia estar ya aki el tutorial??? si necesitas ayuda tu pide y lo siento si te sientes presionado o agoviado

Imagen de Elfen

casi ya he termindanado de traducir el 4º tutorial

De todos modos si dices que tu ya lo tienes pues nada, si tienes alguna duda sobre alguna parte no dudes en consultar.Empezare a traducir el nº5.

Imagen de Elfen

OK

X mi de acuerdo...te ayudare en lo que kieras y pueda, y muchas gracias po hacer estos tutoriales, gracias a estos estoy empezando a hacer lo que mas me gusta

módulos y programas de PSP

¿De donde se pueden sacar los módulos de la PSP? de la memoria flash? es para saber que hacen las funciones y los procedimientos que usas ahí y ver los otros "más complicados". Gracias ;)

Imagen de Miquel Carol

Hay un PDF de documentación

Se que PSPDEV publico hace relativamente poco un PDF con la documentacion intrna y las unciones que comentas. A ver si lo encuentro y os lo publico por aqui. el titulo era algo asi como"another PSP manual" o algo asi.


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.