BennuGD PSP

Started by DCelso, January 12, 2011, 12:01:56 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

no pienses en el loop, busca el error debugueando... quita el joy y no uses ninguna variable...

primero mira donde casca (a nivel C) y luego da otro paso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

ok, asias, eso haré
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

jo, no me va el psplinkusb, consigo conectar con la psp desde mi pc, pero a la hora de ejcutar cualquier .elf me dice que es un .elf no válido, cago en la madre del topo.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

jajaja, esa de la madre del topo nunca la escuche.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Splinter, solucioné el problema de los colores en las funciones de pintado manual cambiando bitmap_create_format por esto



PIXEL_FORMAT * bitmap_create_format( int bpp )
{
    PIXEL_FORMAT *format;

    /* Allocate an empty pixel format structure */
    format = malloc( sizeof( *format ) );
    if ( !format ) return( NULL );

    /* Set up the format */

    format->palette = NULL;
    format->depth = bpp;
    format->depthb = ( bpp + 7 ) / 8;

    if ( bpp == 32 )
    {
        format->Aloss = 0;
        format->Rloss = 0;
        format->Gloss = 0;
        format->Bloss = 0;

#ifdef TARGET_PSP
        format->Ashift = 0x18;
        format->Rshift = 0x00;
        format->Gshift = 0x08;
        format->Bshift = 0x10;
        format->Amask = 0xFF000000;
        format->Rmask = 0x000000FF;
        format->Gmask = 0x0000FF00;
        format->Bmask = 0x00FF0000;
#else
        format->Ashift = 0x18;
        format->Rshift = 0x10;
        format->Gshift = 0x08;
        format->Bshift = 0x00;
        format->Amask = 0xFF000000;
        format->Rmask = 0x00FF0000;
        format->Gmask = 0x0000FF00;
        format->Bmask = 0x000000FF;
#endif
    }
    else if ( bpp > 8 )
    {
        /* R-G-B */
        if ( bpp > 24 ) bpp = 24;

        format->Aloss = 8;
        format->Rloss = 8 - ( bpp / 3 );
        format->Gloss = 8 - ( bpp / 3 ) - ( bpp % 3 );
        format->Bloss = 8 - ( bpp / 3 );

        format->Ashift = 0;
        format->Gshift = ( bpp / 3 );

        format->Amask = 0;
        format->Gmask = (( 0xFF >> format->Gloss ) << format->Gshift );

#ifdef TARGET_PSP
        format->Rshift = 0;
        format->Bshift = (( bpp / 3 ) + ( bpp % 3 ) ) + ( bpp / 3 );
#else
        format->Rshift = (( bpp / 3 ) + ( bpp % 3 ) ) + ( bpp / 3 );
        format->Bshift = 0;
#endif

        format->Rmask = (( 0xFF >> format->Rloss ) << format->Rshift );
format->Bmask =  (( 0xFF >> format->Bloss ) << format->Bshift) ;

    }
    else
    {

        format->Rloss = 8;
        format->Gloss = 8;
        format->Bloss = 8;
        format->Aloss = 8;

        format->Rshift = 0;
        format->Gshift = 0;
        format->Bshift = 0;
        format->Ashift = 0;

        format->Rmask = 0;
        format->Gmask = 0;
        format->Bmask = 0;
        format->Amask = 0;
    }

    return( format );
}


¿Como lo ves?
Me tuve que crear una aplicacioncilla en SDL para ver los valores de mask y shift que usaba SDL tanto en pc como en psp para comprobar las diferencias

//Set up screen
screen = SDL_SetVideoMode(480, 240, 16, SDL_SWSURFACE);
hello = SDL_GetVideoSurface();
printf("**********16************************\n");
printf("hello->format->Amask:%08x\n", hello->format->Amask);
printf("hello->format->Rmask:%08x\n", hello->format->Rmask);
printf("hello->format->Gmask:%08x\n", hello->format->Gmask);
printf("hello->format->Bmask:%08x\n", hello->format->Bmask);
printf("hello->format->Ashift:%02x\n", hello->format->Ashift);
printf("hello->format->Rshift:%02x\n", hello->format->Rshift);
printf("hello->format->Gshift:%02x\n", hello->format->Gshift);
printf("hello->format->Bshift:%02x\n", hello->format->Bshift);
printf("hello->format->Aloss:%02x\n", hello->format->Aloss);
printf("hello->format->Rloss:%02x\n", hello->format->Rloss);
printf("hello->format->Gloss:%02x\n", hello->format->Gloss);
printf("hello->format->Bloss:%02x\n", hello->format->Bloss);
printf("**********16************************\n");
while ((SDL_JoystickGetButton(stick, PSP_CIRCLE_BUTTON) == 0
&& SDL_GetKeyState(0)[SDLK_ESCAPE] == 0)) {
SDL_PollEvent(&event);
}
printf("**********32************************\n");
screen = SDL_SetVideoMode(480, 240, 32, SDL_SWSURFACE);
hello = SDL_DisplayFormatAlpha(SDL_GetVideoSurface());
printf("hello->format->Amask:%08x\n", hello->format->Amask);
printf("hello->format->Rmask:%08x\n", hello->format->Rmask);
printf("hello->format->Gmask:%08x\n", hello->format->Gmask);
printf("hello->format->Bmask:%08x\n", hello->format->Bmask);
printf("hello->format->Ashift:%02x\n", hello->format->Ashift);
printf("hello->format->Rshift:%02x\n", hello->format->Rshift);
printf("hello->format->Gshift:%02x\n", hello->format->Gshift);
printf("hello->format->Bshift:%02x\n", hello->format->Bshift);
printf("hello->format->Aloss:%02x\n", hello->format->Aloss);
printf("hello->format->Rloss:%02x\n", hello->format->Rloss);
printf("hello->format->Gloss:%02x\n", hello->format->Gloss);
printf("hello->format->Bloss:%02x\n", hello->format->Bloss);
while ((SDL_JoystickGetButton(stick, PSP_CIRCLE_BUTTON) == 0
&& SDL_GetKeyState(0)[SDLK_ESCAPE] == 0)) {
SDL_PollEvent(&event);
}


También tuve que modificar otra funcións que hace uso de máscaras "hardcode"

static void init_conversion_tables()
{
    uint8_t r, g, b ;
    int n ;

    /* Alloc space for the lookup tables */

    convert565ToScreen = ( uint16_t * ) malloc( sizeof( uint16_t ) * 65536 );
    if ( !convert565ToScreen ) return ;

    convertScreenTo565 = ( uint16_t * ) malloc( sizeof( uint16_t ) * 65536 );
    if ( !convertScreenTo565 )  // No memory
    {
        free( convert565ToScreen );
        return ;
    }

    /* Special case if screen already in 565 format */
#ifdef TARGET_PSP
    if ( sys_pixel_format->Rmask == 0x001F &&
            sys_pixel_format->Gmask == 0x07E0 &&
            sys_pixel_format->Bmask == 0xF800 )
#else
        if ( sys_pixel_format->Rmask == 0xF800 &&
                sys_pixel_format->Gmask == 0x07E0 &&
                sys_pixel_format->Bmask == 0x001F )
#endif
    {
        for ( n = 0; n < 65536; n++ )
        {
            convert565ToScreen[ n ] = n;
            convertScreenTo565[ n ] = n;
        }
        return ;
    }

    /* Create a fast lookup array */

    for ( n = 0; n < 65536; n++ )
    {
        /* Calculate conversion from 565 to screen format */

#ifdef TARGET_PSP
        b = (( n >> 8 ) & 0xF8 ) >> sys_pixel_format->Bloss ;
        g = (( n >> 3 ) & 0xFC ) >> sys_pixel_format->Gloss ;
        r = (( n << 3 ) & 0xF8 ) >> sys_pixel_format->Rloss ;
#else
        r = (( n >> 8 ) & 0xF8 ) >> sys_pixel_format->Rloss ;
        g = (( n >> 3 ) & 0xFC ) >> sys_pixel_format->Gloss ;
        b = (( n << 3 ) & 0xF8 ) >> sys_pixel_format->Bloss ;
#endif
        convert565ToScreen[ n ] = ( r << sys_pixel_format->Rshift ) | ( g << sys_pixel_format->Gshift ) | ( b << sys_pixel_format->Bshift ) ;

        /* Calculate conversion from 565 to screen format */

        r = ((( n & sys_pixel_format->Rmask ) >> sys_pixel_format->Rshift ) << sys_pixel_format->Rloss );
        g = ((( n & sys_pixel_format->Gmask ) >> sys_pixel_format->Gshift ) << sys_pixel_format->Gloss );
        b = ((( n & sys_pixel_format->Bmask ) >> sys_pixel_format->Bshift ) << sys_pixel_format->Bloss );
#ifdef TARGET_PSP
        convertScreenTo565[ n ] = (( b & 0xF8 ) << 8 ) | (( g & 0xFC ) << 3 ) | (( r & 0xF8 ) >> 3 ) ;
#else
        convertScreenTo565[ n ] = (( r & 0xF8 ) << 8 ) | (( g & 0xFC ) << 3 ) | (( b & 0xF8 ) >> 3 ) ;
#endif
    }
    conversion_tables_ok = 1;
}



Esto no soluciona el cambio de colores al leer los ficheros png, fpt o fnt, ya que en la lectura se usa el create format para crear el formato y luego se le asignan los bytes de color manualmente sin usar los valores de masc, shift, loss que nos dió create format, por tanto tuve que meter unos cuantos ifs en las funciones de lectura para que cuando sea psp girara los valores R y B.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

Como es evidente, esto no arregla los cuelgues aleatorios que se me producen en psp, pero bueno, como encontré esto fácil de solventar pensé a ver si de casualidad se arreglan los cuelgues pero na de na, siguen estando :D.

A ver si consigo poder mostrar trazas de stdout y stdin de la psp en el pc y hago las trazas al código del while y un frame :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

hay un tema de byteorder por lo visto... pero solo para el video...

bueno, hay otras funciones, todo el blitter que hace rotaciones y mascaras de forma manual, si no me equivoco, hay que revisarlo...

pero bueno, esto tiene solucion, lo voy a emparchar en el codigo de forma prolija y revisar todo... igual el cambio no va a ser muy diferente de lo que vos hiciste.

karma y gracias por el trabajo y la info.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ya creo que no soluiciona los cuelgues.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

splinter, para mí que esto de invertir los shift y los mask en PSP solo para el video es fallo del port de SDL, ya que hay un código de SDL para PC por ahí que usa SDL_BYTE_ORDER para usar unos shift o mask dependiendo de éste, pero claro está que como tanto el PC como PSP son little endian pues no sirve porque entran ambos por la misma condición y no invierte las máscaras, para mí que quien programó SDL para psp la fastidió sin querer en ese sentido, fijo que se pensaba que psp era bigendian y lo programó mal sin querer :D.
Si te pones a hacer el cambio en el port oficial sería bueno que usaras SDL_BYTE_ORDER y/o TARGET_PSP para invertir las máscaras también así de paso solventas el problema para los ports de mac y wii :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

no creo que sea un bug de SDL, si los ejemplos de ellos lo usan.

no, no puedo usar SDL_BYTE_ORDER, porque significa ponerle dependencia a todo bennugd de SDL y eso es retorceder... por otro lado, bennugd usa las mismas condiciones que usa SDL para determinar el byteorder, obviamente no tiene invertido el byteorder, si asi fuera no funcionaria nada.

yo creo que no es un bug, sino que es cuestion de la grafica de estas plataformas, o no se, no tengo ninguna de las plataformas mencionadas para probar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

ok, entiendo, y otra forma de detectar el byteorder independiente de sdl? como por ejemplo

| const int __endian_detect = 1;
|
| inline bool __little_endian() { return *(char *)&__endian_detect == 1;}

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

ya se esta haciendo independiente de SDL...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Compilados los últimos fuentes de SVN con mismos resultados, se cuelgan aleatoriamente los juegos.
La versión bgdi sin sonido funciona mil veces mejor, vamos no se cuelga tanto, casi ni se cuelga, pero aún asi a veces se cuelga :D.

No puedo hacer mejores tests para detectar el posible fallo hasta que no consiga echar a andar el ejecutar juegos en la psp y ver los resultados de las salidas stdout y stderr en el pc. Usbhost en cuestión no me funciona en mi psp, cagoento.

Me gustaría que me dijerais juegos simplones en código para probar en la psp a ver si sirven para detectar las funciones que fallan.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

free, toma la versión última que tengo para que pruebes si quieres el hardcorefight antes de subirlo si quieres.
http://www.mediafire.com/?94nue2ohk44q4n1

Te advierto que es la mas estable que tengo, capa a posta el sonido, pero de forma transparente, no tienes que tocar nada en los .prg.
También le es indiferente el nombre del .dcb que le pongas, busca en el directorio del eboot.pbp cualquier *.dcb y abre el primero :), con tiempo incluso se podría hacer un menú de seleccion :D.
Si da errores lo muestra en la pantalla, (y los say tambien salen en pantalla. creo :D ) (Se queda bloqueado a posta para poder leerlo pero te puedes escapar con la tecla select o home)
Tiene solucionado el tema de colores tanto en imagenes pintadas desde bennu como recursos cargados .png, .fpg o fnt. (Si ves algun color cambiado en algun recurso, dimelo y pásame el recurso en cuestion y lo corrijo en un plisplas).

No tiene ningun mod capado pero tampoco tiene ningun mod no oficial, asi que si necesitas alguno en cuestión para el juego dimelo y lo inserto tb.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Ok thanks. Lo probaré hoy de forma rapida, de la velocidad dependerá mi decision de perder o no tiempo con este port, quedas ya avisado (que encima para mi jugar sin sonido no me va, pero a otros seguro que si...)