+// (c) Copyright 2007 notaz, All rights reserved.
+// Free for non-commercial use.
+
+// For commercial use, separate licencing terms must be obtained.
+
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/syslimits.h> // PATH_MAX
#include "psp.h"
#include "menu.h"
#include "emu.h"
+#include "mp3.h"
#include "../common/emu.h"
#include "../common/lprintf.h"
#include "../../Pico/PicoInt.h"
-#define OSD_FPS_X 424
+#define OSD_FPS_X 432
// additional pspaudio imports, credits to crazyc
int sceAudio_38553111(unsigned short samples, unsigned short freq, char unknown); // play with conversion?
for (h = 0; h < 8; h++) {
p = (int *) (screen+x+512*(264+h));
p = (int *) ((int)p & ~3); // align
- memset32(p, 0, len);
+ memset32_uncached(p, 0, len);
}
if (is_active) { tmp = psp_screen; psp_screen = screen; } // nasty pointer tricks
emu_textOut16(x, 264, text);
{
memset(¤tConfig, 0, sizeof(currentConfig));
currentConfig.lastRomFile[0] = 0;
- currentConfig.EmuOpt = 0x1f | 0x680; // | confirm_save, cd_leds, 16bit rend
- currentConfig.PicoOpt = 0x0f | 0xc00; // | cd_pcm, cd_cdda
+ currentConfig.EmuOpt = 0x1d | 0x680; // | confirm_save, cd_leds, acc rend
+ currentConfig.PicoOpt = 0x0f | 0x1c00; // | gfx_cd, cd_pcm, cd_cdda
currentConfig.PsndRate = 22050;
currentConfig.PicoRegion = 0; // auto
currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP
static void set_scaling_params(void)
{
- int src_width, fbimg_width, fbimg_height, fbimg_xoffs, fbimg_yoffs;
+ int src_width, fbimg_width, fbimg_height, fbimg_xoffs, fbimg_yoffs, border_hack = 0;
g_vertices[0].x = g_vertices[0].y =
g_vertices[0].z = g_vertices[1].z = 0;
src_width = 256;
}
+ if (fbimg_width & 1) fbimg_width++; // make even
+ if (fbimg_height & 1) fbimg_height++;
+
if (fbimg_width >= 480) {
g_vertices[0].u = (fbimg_width-480)/2;
- g_vertices[1].u = src_width - (fbimg_width-480)/2;
+ g_vertices[1].u = src_width - (fbimg_width-480)/2 - 1;
fbimg_width = 480;
fbimg_xoffs = 0;
} else {
g_vertices[1].u = src_width;
fbimg_xoffs = 240 - fbimg_width/2;
}
+ if (fbimg_width > 320 && fbimg_width <= 480) border_hack = 1;
if (fbimg_height >= 272) {
g_vertices[0].v = (fbimg_height-272)/2;
g_vertices[1].y = fbimg_height;
if (fbimg_xoffs < 0) fbimg_xoffs = 0;
if (fbimg_yoffs < 0) fbimg_yoffs = 0;
+ if (border_hack) {
+ g_vertices[0].u++;
+ g_vertices[0].x++;
+ g_vertices[1].u--;
+ g_vertices[1].x--;
+ }
fbimg_offs = (fbimg_yoffs*512 + fbimg_xoffs) * 2; // dst is always 16bit
/*
*p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r;
}
-
+#if 0
static void dbg_text(void)
{
int *p, h, len;
for (h = 0; h < 8; h++) {
p = (int *) ((unsigned short *) psp_screen+2+512*(256+h));
p = (int *) ((int)p & ~3); // align
- memset32(p, 0, len);
+ memset32_uncached(p, 0, len);
}
emu_textOut16(2, 256, text);
}
-
+#endif
/* called after rendering is done, but frame emulation is not finished */
void blit1(void)
if (emu_opt & 2) osd_text(OSD_FPS_X, fps, 0, 0);
}
- dbg_text();
+ //dbg_text();
if ((emu_opt & 0x400) && (PicoMCD & 1))
cd_leds();
static void clearArea(int full)
{
if (full) {
- memset32(psp_screen, 0, 512*272*2/4);
+ memset32_uncached(psp_screen, 0, 512*272*2/4);
psp_video_flip(0);
- memset32(psp_screen, 0, 512*272*2/4);
+ memset32_uncached(psp_screen, 0, 512*272*2/4);
memset32(VRAM_CACHED_STUFF, 0xe0e0e0e0, 512*240/4);
memset32((int *)VRAM_CACHED_STUFF+512*240/4, 0, 512*240*2/4);
} else {
void *fb = psp_video_get_active_fb();
- memset32((int *)((char *)psp_screen + 512*264*2), 0, 512*8*2/4);
- memset32((int *)((char *)fb + 512*264*2), 0, 512*8*2/4);
+ memset32_uncached((int *)((char *)psp_screen + 512*264*2), 0, 512*8*2/4);
+ memset32_uncached((int *)((char *)fb + 512*264*2), 0, 512*8*2/4);
}
}
{
if (samples_made - samples_done < samples_block) {
// wait for data (use at least 2 blocks)
- lprintf("sthr: wait... (%i)\n", samples_made - samples_done);
+ //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);
if (ret < 0) lprintf("sthr: sceKernelWaitSema: %i\n", ret);
snd_playptr += samples_block;
if (snd_playptr >= sndBuffer_endptr)
snd_playptr = sndBuffer;
- if (ret)
- lprintf("sthr: outf: %i; pos %i/%i\n", ret, samples_done, samples_made);
+ // 1.5 kernel returns 0, newer ones return # of samples queued
+ if (ret < 0)
+ lprintf("sthr: sceAudio_E0727056: %08x; pos %i/%i\n", ret, samples_done, samples_made);
// shouln't happen, but just in case
if (samples_made - samples_done >= samples_block*3) {
static void sound_init(void)
{
SceUID thid;
+ int ret;
sound_sem = sceKernelCreateSema("sndsem", 0, 0, 1, NULL);
if (sound_sem < 0) lprintf("sceKernelCreateSema() failed: %i\n", sound_sem);
thid = sceKernelCreateThread("sndthread", sound_thread, 0x12, 0x10000, 0, NULL);
if (thid >= 0)
{
- sceKernelStartThread(thid, 0, 0);
+ ret = sceKernelStartThread(thid, 0, 0);
+ if (ret < 0) lprintf("sound_init: sceKernelStartThread returned %08x\n", ret);
}
else
lprintf("sceKernelCreateThread failed: %i\n", thid);
vidResetMode();
memset32(VRAM_CACHED_STUFF, 0xe0e0e0e0, 512*8/4); // borders
memset32((int *)VRAM_CACHED_STUFF + 512*232/4, 0xe0e0e0e0, 512*8/4);
- memset32((int *)psp_screen + 512*264*2/4, 0, 512*8*2/4);
+ memset32_uncached((int *)psp_screen + 512*264*2/4, 0, 512*8*2/4);
PicoDrawSetColorFormat(-1);
PicoScan = EmuScanSlow;
void emu_Loop(void)
{
+ static int mp3_init_done = 0;
char fpsbuff[24]; // fps count c string
unsigned int tval, tval_prev = 0, tval_thissec = 0; // timing
int frames_done = 0, frames_shown = 0, oldmodes = 0;
target_frametime = Pico.m.pal ? (1000000<<8)/50 : (1000000<<8)/60+1;
reset_timing = 1;
- // prepare CD buffer
- if (PicoMCD & 1) PicoCDBufferInit();
+ if (PicoMCD & 1) {
+ // prepare CD buffer
+ PicoCDBufferInit();
+ // mp3...
+ if (!mp3_init_done) {
+ i = mp3_init();
+ mp3_init_done = 1;
+ if (i) { engineState = PGS_Menu; return; }
+ }
+ }
// prepare sound stuff
PsndOut = NULL;
for (i = 0; i < currentConfig.Frameskip; i++) {
updateKeys();
SkipFrame(); frames_done++;
- if (PsndOut) { // do framelimitting if sound is enabled
+ if (!(currentConfig.EmuOpt&0x40000)) { // do framelimitting if needed
int tval_diff;
tval = sceKernelGetSystemTimeLow();
tval_diff = (int)(tval - tval_thissec) << 8;
if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection
reset_timing = 1;
- else if (PsndOut != NULL || currentConfig.Frameskip < 0)
+ else if (!(currentConfig.EmuOpt&0x40000) || currentConfig.Frameskip < 0)
{
// sleep if we are still too fast
if (tval_diff < lim_time)
}
// clear fps counters and stuff
- memset32((int *)psp_video_get_active_fb() + 512*264*2/4, 0, 512*8*2/4);
+ memset32_uncached((int *)psp_video_get_active_fb() + 512*264*2/4, 0, 512*8*2/4);
}