// additional pspaudio imports, credits to crazyc
int sceAudio_38553111(unsigned short samples, unsigned short freq, char unknown); // play with conversion?
// additional pspaudio imports, credits to crazyc
int sceAudio_38553111(unsigned short samples, unsigned short freq, char unknown); // play with conversion?
currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP
currentConfig.Frameskip = -1; // auto
currentConfig.volume = 50;
currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP
currentConfig.Frameskip = -1; // auto
currentConfig.volume = 50;
currentConfig.KeyBinds[ 4] = 1<<0; // SACB RLDU
currentConfig.KeyBinds[ 6] = 1<<1;
currentConfig.KeyBinds[ 7] = 1<<2;
currentConfig.KeyBinds[ 4] = 1<<0; // SACB RLDU
currentConfig.KeyBinds[ 6] = 1<<1;
currentConfig.KeyBinds[ 7] = 1<<2;
currentConfig.KeyBinds[13] = 1<<5;
currentConfig.KeyBinds[15] = 1<<6;
currentConfig.KeyBinds[ 3] = 1<<7;
currentConfig.KeyBinds[13] = 1<<5;
currentConfig.KeyBinds[15] = 1<<6;
currentConfig.KeyBinds[ 3] = 1<<7;
- currentConfig.scaling = 1; // bilinear filtering for psp
- currentConfig.scale = currentConfig.hscale32 = currentConfig.hscale40 = 1.0;
+ currentConfig.scaling = 1; // bilinear filtering for psp
+ currentConfig.scale = 1.20; // fullscreen
+ currentConfig.hscale40 = 1.25;
+ currentConfig.hscale32 = 1.56;
if (fbimg_yoffs < 0) fbimg_yoffs = 0;
fbimg_offs = (fbimg_yoffs*512 + fbimg_xoffs) * 2; // dst is always 16bit
if (fbimg_yoffs < 0) fbimg_yoffs = 0;
fbimg_offs = (fbimg_yoffs*512 + fbimg_xoffs) * 2; // dst is always 16bit
lprintf("set_scaling_params:\n");
lprintf("offs: %i, %i\n", fbimg_xoffs, fbimg_yoffs);
lprintf("xy0, xy1: %i, %i; %i, %i\n", g_vertices[0].x, g_vertices[0].y, g_vertices[1].x, g_vertices[1].y);
lprintf("uv0, uv1: %i, %i; %i, %i\n", g_vertices[0].u, g_vertices[0].v, g_vertices[1].u, g_vertices[1].v);
lprintf("set_scaling_params:\n");
lprintf("offs: %i, %i\n", fbimg_xoffs, fbimg_yoffs);
lprintf("xy0, xy1: %i, %i; %i, %i\n", g_vertices[0].x, g_vertices[0].y, g_vertices[1].x, g_vertices[1].y);
lprintf("uv0, uv1: %i, %i; %i, %i\n", g_vertices[0].u, g_vertices[0].v, g_vertices[1].u, g_vertices[1].v);
for (i = 0x3f/2; i >= 0; i--)
dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
for (i = 0x3f/2; i >= 0; i--)
dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
sceGuSync(0,0); // sync with prev
sceGuStart(GU_DIRECT, guCmdList);
sceGuDrawBuffer(GU_PSM_5650, (void *)offs, 512); // point to back buffer
sceGuSync(0,0); // sync with prev
sceGuStart(GU_DIRECT, guCmdList);
sceGuDrawBuffer(GU_PSM_5650, (void *)offs, 512); // point to back buffer
- {
- int i, *dpal = (void *)localPal, *spal = (int *)Pico.cram;
- for (i = 0x3f/2; i >= 0; i--)
- dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
- localPal[0xe0] = 0;
- Pico.m.dirtyPal = 0;
- need_pal_upload = 1;
- }
+ do_pal_update(0);
+
+ sceKernelDcacheWritebackAll();
- static int old_reg = 0;
- unsigned int col_g, col_r, *p;
+ unsigned int reg, col_g, col_r, *p;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r;
if (notice || (emu_opt & 2)) {
if (notice) osd_text(4, notice, 0);
if (notice || (emu_opt & 2)) {
if (notice) osd_text(4, notice, 0);
#define SOUND_BLOCK_COUNT 4
static short __attribute__((aligned(4))) sndBuffer[SOUND_BLOCK_SIZE_PAL*SOUND_BLOCK_COUNT + 44100/50*2];
#define SOUND_BLOCK_COUNT 4
static short __attribute__((aligned(4))) sndBuffer[SOUND_BLOCK_SIZE_PAL*SOUND_BLOCK_COUNT + 44100/50*2];
- // wait for data...
- //lprintf("sthr: wait... (%i/%i)\n", samples_done, samples_made);
- ret = sceKernelWaitSema(sound_sem, 1, 0);
+ // wait for data (use at least 2 blocks)
+ //lprintf("sthr: wait... (%i)\n", samples_made - samples_done);
+ while (samples_made - samples_done <= samples_block*2 && !sound_thread_exit)
+ ret = sceKernelWaitSema(sound_sem, 1, 0);
snd_playptr = sndBuffer;
if (ret)
lprintf("sthr: outf: %i; pos %i/%i\n", ret, samples_done, samples_made);
snd_playptr = sndBuffer;
if (ret)
lprintf("sthr: outf: %i; pos %i/%i\n", ret, samples_done, samples_made);
+
+ // shouln't happen, but just in case
+ if (samples_made - samples_done >= samples_block*3) {
+ //lprintf("block skip (%i)\n", samples_made - samples_done);
+ samples_done += samples_block; // skip
+ snd_playptr += samples_block;
+ }
+
sound_sem = sceKernelCreateSema("sndsem", 0, 0, 1, NULL);
if (sound_sem < 0) lprintf("sceKernelCreateSema() failed: %i\n", sound_sem);
sound_sem = sceKernelCreateSema("sndsem", 0, 0, 1, NULL);
if (sound_sem < 0) lprintf("sceKernelCreateSema() failed: %i\n", sound_sem);
sound_thread_exit = 0;
thid = sceKernelCreateThread("sndthread", sound_thread, 0x12, 0x10000, 0, NULL);
if (thid >= 0)
sound_thread_exit = 0;
thid = sceKernelCreateThread("sndthread", sound_thread, 0x12, 0x10000, 0, NULL);
if (thid >= 0)
samples_made = samples_done = 0;
if (PsndRate != PsndRate_old || (PicoOpt&0x0b) != (PicoOpt_old&0x0b) || Pico.m.pal != pal_old) {
samples_made = samples_done = 0;
if (PsndRate != PsndRate_old || (PicoOpt&0x0b) != (PicoOpt_old&0x0b) || Pico.m.pal != pal_old) {
sndBuffer_endptr = &sndBuffer[samples_block*SOUND_BLOCK_COUNT];
lprintf("starting audio: %i, len: %i, stereo: %i, pal: %i, block samples: %i\n",
sndBuffer_endptr = &sndBuffer[samples_block*SOUND_BLOCK_COUNT];
lprintf("starting audio: %i, len: %i, stereo: %i, pal: %i, block samples: %i\n",
// lprintf("signal, %i/%i\n", samples_done, samples_made);
ret = sceKernelSignalSema(sound_sem, 1);
// lprintf("signal ret %i\n", ret);
// lprintf("signal, %i/%i\n", samples_done, samples_made);
ret = sceKernelSignalSema(sound_sem, 1);
// lprintf("signal ret %i\n", ret);
- blit2("", (which & 0x1000) ? "LOAD STATE? (X=yes, O=no)" : "OVERWRITE SAVE? (X=yes, O=no)");
+ sceGuSync(0,0);
+ blit2("", (which & 0x1000) ? "LOAD STATE? (X=yes, O=no)" : "OVERWRITE SAVE? (X=yes, O=no)", 0);
- if (PicoOpt&0x10) {
- strcpy(noticeMsg, " 8bit fast renderer");
- } else if (currentConfig.EmuOpt&0x80) {
- strcpy(noticeMsg, "16bit accurate renderer");
- } else {
- strcpy(noticeMsg, " 8bit accurate renderer");
- }
+ if (PicoOpt&0x10)
+ strcpy(noticeMsg, "fast renderer");
+ else if (currentConfig.EmuOpt&0x80)
+ strcpy(noticeMsg, "accurate renderer");
+ else
+ {
+ for (u = 0; u < 28; u++)
+ if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1
+ (currentConfig.KeyBinds[u] & (1 << act))) keyc++;
+ for (u = 0; u < 28; u++)
+ if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2
+ (currentConfig.KeyBinds[u] & (1 << act))) keyc2++;
+ }
+ if (keyc > 1 || keyc2 > 1)
if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection
reset_timing = 1;
else if (PsndOut != NULL || currentConfig.Frameskip < 0)
if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection
reset_timing = 1;
else if (PsndOut != NULL || currentConfig.Frameskip < 0)