Autor Tema: BennuGD PSP  (Leído 75768 veces)

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #210 en: Marzo 05, 2011, 08:00:32 pm »
bueno, a ver, si accede o no a posiciones de 16bits se prueba facil con un programa simple...

Código: [Seleccionar]
private
 int a = 12345678h;
 byte * p;

begin

p = &a;

say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);

end

cada valor deberia ser diferente
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6384
  • Karma: 164
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re: BennuGD PSP
« Respuesta #211 en: Marzo 05, 2011, 08:17:42 pm »
XCelso, deberías hablar con Misato de GP32Spain. Seguramente haya más de un programador de PSP por allí, pero ella es la que siempre salta cuando se habla de ese tema.

Por otro lado ¿alguien me podría explicar, de forma extremadamente resumida, cómo se accede al buffer de sonido? para hacerme una idea de cómo trabaja internamente SDL o cualquier librería de sonido (sobre todo, la parte en la que da igual la plataforma en la que se trabaje). Es para ir mirando cuan difícil sería desarrollar una librería de sonido alternativa a SDL_Mixer.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #212 en: Marzo 05, 2011, 08:29:13 pm »
bueno, a ver, si accede o no a posiciones de 16bits se prueba facil con un programa simple...

Código: [Seleccionar]
private
 int a = 12345678h;
 byte * p;

begin

p = &a;

say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);

end

cada valor deberia ser diferente
:o, muchas gracias, lo probaré en breve.

Por otro lado, programa c/SDL pseudo análogo al de bennu con recursos iguales no cuelga la psp, aunque sí hace que cuando el .xm tiene mucha caña se enlentezca el sonido.

Código: [Seleccionar]
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_mixer.h>

#define PSP_TRIANGLE_BUTTON 0
#define PSP_CIRCLE_BUTTON 1
#define PSP_X_BUTTON 2
#define PSP_SQUARE_BUTTON 3
#define PSP_L_BUTTON 4
#define PSP_R_BUTTON 5
#define PSP_DOWN_BUTTON 6
#define PSP_LEFT_BUTTON 7
#define PSP_UP_BUTTON 8
#define PSP_RIGHT_BUTTON 9
#define PSP_SELECT_BUTTON 10
#define PSP_START_BUTTON 11
#define PSP_LEFT_RIGHT_AXIS 0
#define PSP_UP_DOWN_AXIS 1

#if defined(TARGET_PSP)
#include "callbacks_psp.h"
PSP_MODULE_INFO("mixerExample", PSP_MODULE_USER, 1, 0); // user mode
#endif
int main(int argc, char *argv[]) {
int quit = 0;
SDL_Event event;
SDL_Surface* hello = NULL;
SDL_Surface* message = NULL;
SDL_Surface* message_up = NULL;
SDL_Surface* message_down = NULL;
SDL_Surface* message_a, *message_s, *message_z, *message_x;
SDL_Surface* screen = NULL;
TTF_Font *font = NULL;
SDL_Color textColor = { 0, 255, 0 };
SDL_Rect offset;
int have_joy = 0;
SDL_Joystick *stick;

Uint8 *keystates;

Mix_Music *music = NULL;

#ifdef TARGET_PSP
PSP_HEAP_SIZE_MAX ();
pspDebugScreenInit();
SetupCallbacks();
#endif
//Start SDL
SDL_Init(SDL_INIT_EVERYTHING);

TTF_Init();

Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096);

//Check if there's any joysticks
if (SDL_NumJoysticks() > 0) {
have_joy = 1;
stick = SDL_JoystickOpen(0);
}

//Set the window caption
SDL_WM_SetCaption("Hello World", NULL);

//Set up screen
screen = SDL_SetVideoMode(480, 240, 32, SDL_SWSURFACE);
//Load image
//hello = SDL_LoadBMP( "hello.bmp" );
hello = IMG_Load("hello.jpg");

font = TTF_OpenFont("lazy.ttf", 28);

message_up = TTF_RenderText_Solid(font, "up", textColor);
message_down = TTF_RenderText_Solid(font, "down", textColor);
message_a = TTF_RenderText_Solid(font, "a", textColor);
message_s = TTF_RenderText_Solid(font, "s", textColor);
message_z = TTF_RenderText_Solid(font, "z", textColor);
message_x = TTF_RenderText_Solid(font, "x", textColor);

//While the user hasn't quit
offset.x = 0;
offset.y = 150;
while (quit == 0) {
keystates = SDL_GetKeyState(NULL);
if (keystates[SDLK_UP]) {
offset.y--;
}
if (keystates[SDLK_DOWN]) {
offset.y++;
}
while (SDL_PollEvent(&event)) {

if (event.type == SDL_JOYBUTTONDOWN) {
switch (event.jbutton.button) {
case PSP_SQUARE_BUTTON:
message = message_a;
music = Mix_LoadMUS("BossCourage.xm");
break;
case PSP_TRIANGLE_BUTTON:
message = message_s;
if (Mix_PlayingMusic() == 0) {
//Play the music
if (Mix_PlayMusic(music, -1) == -1) {
return 1;
}
}
break;
case PSP_X_BUTTON:
message = message_z;
Mix_HaltMusic();
break;
case PSP_L_BUTTON:
message = message_z;
Mix_VolumeMusic(50);
break;
case PSP_R_BUTTON:
message = message_z;
Mix_VolumeMusic(100);
break;
case PSP_CIRCLE_BUTTON:
message = message_x;
//Free the music
Mix_FreeMusic(music);
break;

case PSP_SELECT_BUTTON: {
SDL_Event quit;
quit.type = SDL_QUIT;
SDL_PushEvent(&quit);
break;
}

}
}

//If a axis was changed
if (event.type == SDL_JOYAXISMOTION) {
//If joystick 0 has moved
if (event.jaxis.which == 0) {
//If the X axis changed
if (event.jaxis.axis == 0) {
//If the X axis is neutral
if ((event.jaxis.value > -8000) && (event.jaxis.value
< 8000)) {
}
//If not
else {
//Adjust the velocity
if (event.jaxis.value < 0) {
offset.x--;
} else {
offset.x++;
}
}
}
//If the Y axis changed
else if (event.jaxis.axis == 1) {
//If the Y axis is neutral
if ((event.jaxis.value > -8000) && (event.jaxis.value
< 8000)) {
}
//If not
else {
//Adjust the velocity
if (event.jaxis.value < 0) {
offset.y--;
} else {
offset.y++;
}
}
}
}
}
if (event.type == SDL_KEYDOWN) {
//Set the proper message surface
switch (event.key.keysym.sym) {
case SDLK_UP:
message = message_up;
break;
case SDLK_DOWN:
message = message_down;
break;
case SDLK_ESCAPE: {
SDL_Event quit;
quit.type = SDL_QUIT;
SDL_PushEvent(&quit);
}
break;

case SDLK_a:
message = message_a;
music = Mix_LoadMUS("BossCourage.xm");
break;
case SDLK_s:
message = message_s;
if (Mix_PlayingMusic() == 0) {
//Play the music
if (Mix_PlayMusic(music, -1) == -1) {
return 1;
}
}
break;
case SDLK_z:
message = message_z;
Mix_HaltMusic();
break;
case SDLK_q:
message = message_z;
Mix_VolumeMusic(50);
break;
case SDLK_w:
message = message_z;
Mix_VolumeMusic(100);
break;
case SDLK_x:
message = message_x;
//Free the music
Mix_FreeMusic(music);
break;
default:
break;
}
}
if (event.type == SDL_QUIT) { //Quit the program
quit = 1;
}
}
//Apply image to screen
SDL_BlitSurface(hello, NULL, screen, NULL);
SDL_BlitSurface(message, NULL, screen, &offset);
//Update Screen
SDL_Flip(screen);
}

//Free the loaded image
SDL_FreeSurface(hello);

SDL_FreeSurface(message_up);
SDL_FreeSurface(message_down);

//Close the font that was used
TTF_CloseFont(font);

//Free the music
//Mix_FreeMusic(music);

//Quit SDL_mixer
Mix_CloseAudio();

//Quit SDL_ttf
TTF_Quit();

//Close the joystick
SDL_JoystickClose(stick);

//Quit SDL
SDL_Quit();

#ifdef TARGET_PSP
sceKernelExitGame();
#endif
return 0;
}


Nota, he usado eventos para las teclas y joystick para usar el estado keydown, cosa que bennu no hace, así que reprogramaré esto usando el sdl getjoybutton que usa bennu no vaya a ser esto el problema y me lo salte :D, así intentarlo hacer lo más fiel posible a lo que hace bennu.
Monstruos Diabólicos

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #213 en: Marzo 05, 2011, 08:34:29 pm »
debo comentar que el modulo de sonido hace uso de la zlib...

nuevamente, y por enesima vez, por favor, elimina el uso de la zlib y usa recursos no comprimidos y vuelve a probar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #214 en: Marzo 05, 2011, 08:51:21 pm »
Splinter eso hago, no uso nada comprimido y activé en la compilacion lo que me dijiste del nozlib.

Por otro lado, me vais a matar sí o sí. resulta que ese ejemplito va perfecto en la psp. ;'(
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_key"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(480,240,32);
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
end
Pero curiosamente al hacerle el bucle loop bloquea a la psp después de mostrar la info

Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_key"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(480,240,32);
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
while(!(get_joy_button(0,0) OR key(_esc)) )
frame;
end
end

Voy a quitar modkey por si es eso, ya que la psp no tiene, y acto seguido quitaré los says a ver si el bucle por sí solo casca.
Monstruos Diabólicos

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

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #215 en: Marzo 05, 2011, 09:01:28 pm »
juas, me mondo y me parto,
este muestra la info y cuelga la psp.
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_video"
#define PSP_TRIANGLE_BUTTON 0
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(480,240,32);
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
while(!get_joy_button(0,PSP_TRIANGLE_BUTTON) )
frame;
end
end


este no cuelga la psp y va bien ( osea no muestra nada, queda en bucle y puedes salirte con el bótón triángulo)
Código: [Seleccionar]
import "mod_joy"
import "mod_video"
#define PSP_TRIANGLE_BUTTON 0
begin
set_mode(480,240,32);
while(!get_joy_button(0,PSP_TRIANGLE_BUTTON) )
frame;
end
end


Osea la combinación de mostrar datos desalineados con el bucle  cuelga la psp.

Voy a no mostrar datos desalineados a ver si no la cuelga.
Monstruos Diabólicos

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

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #216 en: Marzo 05, 2011, 09:33:25 pm »
Pa mear y no echar gota.
esto muestra los dos datos y  cuelga la psp a veces sí a veces no.
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_video"
#define PSP_TRIANGLE_BUTTON 0
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(480,240,32);
say(p[0]);
say(p[2]);
while(!get_joy_button(0,PSP_TRIANGLE_BUTTON) )
frame;
end
end



Y esto y para incredulidad mia, hace lo mismo, a veces se cuelga a veces no.
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_video"
#define PSP_TRIANGLE_BUTTON 0
begin
set_mode(480,240,32);
while(!get_joy_button(0,PSP_TRIANGLE_BUTTON) )
frame;
end
end
Monstruos Diabólicos

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #217 en: Marzo 05, 2011, 09:45:41 pm »
realmente no le veo sentido, y con un while(1)?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #218 en: Marzo 05, 2011, 09:57:48 pm »
a veces si a veces no
Código: [Seleccionar]
import "mod_video"
begin
set_mode(200,200,16);
while (1)
frame;
end
end

Está claro que o bien me he cargao la psp :D, o bien algo estoy haciendo mal, porque esto ni es normal ni tiene sentido.
Monstruos Diabólicos

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

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #219 en: Marzo 05, 2011, 10:05:56 pm »
Usando loop en vez de while lo mismo. (¿cómo implementa los bucles benno?)

Pero si quito el loop va perfecto, he ejecutado este código más de 10 veces esperando a que se me colgase y no se cuelga, todo perfecto las más de diez veces.

Código: [Seleccionar]
import "mod_say"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(320,480,32);
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
frame;
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
frame;
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
frame;
end

Voy a ponerle un puñao más a ver que pasa.
hecho, perfectísimo también, (repetí los says unas 10 veces más).
Voy a ponerle ahora un for hasta mil. hecho, perfecto también
Código: [Seleccionar]
import "mod_say"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(320,480,32);
for (x=0;x<100;x++)
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
frame;
end
end

y si le pongo un for infinito, a ver... hecho, va de lujo también
Código: [Seleccionar]
import "mod_say"
import "mod_video"
import "mod_joy"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(320,480,32);
for (x=0;x<100;)
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
if (get_joy_button(0,0))
break;
end
frame;
end
end

Voy a simular el while primero con un for para ver que pasa ... Ostras tu, esto casca a veces
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(320,280,16);
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
while(!get_joy_button(0,0) )
frame;
end
end
Esto no casca nunca
Código: [Seleccionar]
import "mod_say"
import "mod_joy"
import "mod_video"
private
int a = 12345678h;
byte * p;
begin
p = &a;
set_mode(320,280,16);
while(!get_joy_button(0,0) )
say(p[0]);
say(p[1]);
say(p[2]);
say(p[3]);
frame;
end
end
¿Las aletoriedades de casque se produce cuando se deja el bucle solo con la sentencia frame?, voy a probar a hacer una asignación tonta en el bucle.
« última modificación: Marzo 05, 2011, 10:33:30 pm por DCelso »
Monstruos Diabólicos

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #220 en: Marzo 05, 2011, 10:31:51 pm »
jajaja, el for es un while sin incrementos, ni inicializacion, y un loop es un while sin condicion, como un goto...

me parece que esto va por otro lado, modulos que se cargan (cierto que aca se carga todo, entonces que se inicializan).

que valores muestran los says?

no me comentaste eso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #221 en: Marzo 05, 2011, 10:36:17 pm »
Los mismos que en pc.
120
86
52
18
Ya veo que estoy haciendo pruebas estúpidas :D, algo es algo, por ahora veo que el while tampoco casca si hace los says dentro, solo casca si lo dejo solo con la sentencia frame.
Monstruos Diabólicos

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #222 en: Marzo 05, 2011, 10:40:23 pm »
para nada es una prueba estupida, esto confirma que el acceso a las direcciones no esta alineado a 16bits... entonces el problema no viene por ahi, no por lo menos en psp.

tenes alguna forma de ver el consumo de memoria? a ver si no hay un memory leak por ahi?

podes deshabilitar la inicializacion del modulo de eventos de la SDL? solo dejar lo basico, el video.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

  • Hero Member
  • *****
  • Mensajes: 3708
  • Karma: 181
Re: BennuGD PSP
« Respuesta #223 en: Marzo 05, 2011, 10:48:05 pm »
Umm, pues no se a qué te referes, ¿a quitar mod_joy?, ya lo hice y pasaba lo mismo,
Bueno he dejado un say("") antes del frame en el bucle y también casca aleatoriamente la aplicación, nose, ¿puede que sea problema de pintar varios frames negros enteros de seguido?, voy a probar a poner un puñao de frames del tirón justo despues de mostrar los datos, a ver si finaliza bién o se cuelga en el proceso.
esto es un poco frustrante, no encuentro la salida, voy a tener que dejarlo hasta que se me pase el cabreo :D, pero antes voy a probar lo de muchos frames de seguido :D.
Monstruos Diabólicos

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12919
  • Karma: 378
Re: BennuGD PSP
« Respuesta #224 en: Marzo 05, 2011, 10:53:13 pm »
callbacks de inicializacion
Download Lastest BennuGD Release: http://www.bennugd.org/node/2