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

bueno, a ver, si accede o no a posiciones de 16bits se prueba facil con un programa simple...


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

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

Quote from: SplinterGU on March 05, 2011, 08:00:32 PM
bueno, a ver, si accede o no a posiciones de 16bits se prueba facil con un programa simple...


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.


#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

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

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. ;'(

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


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

juas, me mondo y me parto,
este muestra la info y cuelga la psp.

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)

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

Pa mear y no echar gota.
esto muestra los dos datos y  cuelga la psp a veces sí a veces no.

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.

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

realmente no le veo sentido, y con un while(1)?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

a veces si a veces no

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

#219
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.


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

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

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

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

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.
Monstruos Diabólicos

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

SplinterGU

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

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

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

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

callbacks de inicializacion
Download Lastest BennuGD Release: http://www.bennugd.org/node/2