Es muy facil listar directorios.
Antes de nada, tengo que decirte que yo no programo para PSP y lo que estoy viendo, es el modulo DevkitPro para PSP, asi que podria haber ligeras variaciones si estas usando otras librerias.
Lo que necesitas, son unas funciones de nombre 
opendir(), 
readdir() y 
closedir(), que se localizan en el fichero 
dirent.h 
¿como funcionan? 
Pues lo primero que tienes que hacer, es abrir un directorio usando la funcion 
opendir  y la ruta del directorio que queremos listar y esta funcion nos devolvera un puntero identificador de tipo 
DIR (estructura)  o NULL si no se pudo abrir.
Luego hay que crear un array de  estructura de tipo  
dirent, y una estructura puntero, para recibir el valor devuelto por 
readdir 
Esta funcion devolvera un puntero a una estructura dirent interna (que podemos copiar con un memcpy a nuestro array, para luego tratarlo o mejor aun, anteponiendo el * para que se copie la estructura interna sobre el elemento del  array ) o un NULL, que indicará que hemos alcanzado el final. La funcion recibe como argumento el puntero DIR que nos devolvio  
opendir , por cierto.
Una vez alcanzado el final (o el numero maximo admitido por nuestro array 
dirent , procedemos a cerrar con 
closedir
Vale, ahora pasemos a analizar los elementos de la estructura  
dirent  para saber lo que se nos ha devuelto.
d_stat  -> esto es una estructura 
SceIoStat  con los siguientes campos utiles:
st_attr-> atributos de la entrada, un flag con FIO_SO_IFDIR, 
indicara que la entrada es un directorio, mientras que un flag con FIO_SO_IFREG indicara que se trata de un fichero. Puesto que se tratan de flag de estado , hay que recurrir a hacer un AND logico, ya que  podria haber otros flags (de permisos) activos.
Tambien hay unas macros definidas para hacer la pregunta directamente, pasandole el valor de este campo:   FIO_SO_ISREG(m), para ficheros y FIO_SO_ISDIR(m) para directorios, que devolveran un valor distinto a 0 en caso afirmativo.
st_size -> aqui podremos conocer la longitud del fichero
Hay otros campos relacionados con los permisos de acceso y con la hora y fecha de creacion del fichero, etc, pero creo que eso excede de lo que necesitas y en todo caso, ya lo averiguaras por tu cuenta.
Bien, aparte del elemento 
d_stat, en una estructura 
dirent  existe otro dato util: el nombre del fichero o directorio que se almacena en el campo 
d_name 
Con esta informacion, deberias ser capaz ya de hacer lo que te proponias: poder listar un directorio  y seleccionar un fichero o incluso, entrar en nuevos directorios y proceder a listarlos. 
Espero haberte sido util 
