rom_data -> rom_loaded
[libpicofe.git] / psp / emu.c
index 6ce910d..a5e6ba7 100644 (file)
--- a/psp/emu.c
+++ b/psp/emu.c
@@ -1,3 +1,8 @@
+// (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 "menu.h"
 #include "emu.h"
 #include "mp3.h"
+#include "asm_utils.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?
@@ -27,7 +33,7 @@ int sceAudioOutput2GetRestSample();
 
 char romFileName[PATH_MAX];
 unsigned char *PicoDraw2FB = (unsigned char *)VRAM_CACHED_STUFF + 8; // +8 to be able to skip border with 1 quadword..
-int engineState;
+int engineState = PGS_Menu;
 
 static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos
 static unsigned int noticeMsgTime = 0;
@@ -192,7 +198,6 @@ static void set_scaling_params(void)
        if (fbimg_width >= 480) {
                g_vertices[0].u = (fbimg_width-480)/2;
                g_vertices[1].u = src_width - (fbimg_width-480)/2 - 1;
-               if (fbimg_width == 480) border_hack = 1;
                fbimg_width = 480;
                fbimg_xoffs = 0;
        } else {
@@ -200,6 +205,7 @@ static void set_scaling_params(void)
                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;
@@ -234,25 +240,25 @@ static void set_scaling_params(void)
 
 static void do_pal_update(int allow_sh)
 {
-       unsigned int *spal=(void *)Pico.cram;
        unsigned int *dpal=(void *)localPal;
        int i;
 
-       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);
+       do_pal_convert(localPal, Pico.cram, currentConfig.gamma);
 
        if (allow_sh && (Pico.video.reg[0xC]&8)) // shadow/hilight?
        {
                // shadowed pixels
                for (i = 0x3f/2; i >= 0; i--)
-                       dpal[0x20|i] = dpal[0x60|i] = (dpal[i]>>1)&0x738e738e;
+                       dpal[0x20|i] = dpal[0x60|i] = (dpal[i]>>1)&0x7bcf7bcf;
                // hilighted pixels
                for (i = 0x3f; i >= 0; i--) {
-                       int t=localPal[i]&0xe71c;t+=0x4208;
-                       if (t&0x20) t|=0x1c;
-                       if (t&0x800) t|=0x700;
-                       if (t&0x10000) t|=0xe000;
-                       t&=0xe71c;
+                       int t=localPal[i]&0xf79e;t+=0x4208;
+                       if (t&0x20) t|=0x1e;
+                       if (t&0x800) t|=0x780;
+                       if (t&0x10000) t|=0xf000;
+                       t&=0xf79e;
                        localPal[0x80|i]=(unsigned short)t;
                }
                localPal[0xe0] = 0;
@@ -508,7 +514,7 @@ static int sound_thread(SceSize args, void *argp)
        {
                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);
@@ -523,12 +529,13 @@ static int sound_thread(SceSize args, void *argp)
                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) {
-                       lprintf("sthr: block skip (%i)\n", samples_made - samples_done);
+                       //lprintf("sthr: block skip (%i)\n", samples_made - samples_done);
                        samples_done += samples_block; // skip
                        snd_playptr  += samples_block;
                }
@@ -543,6 +550,7 @@ static int sound_thread(SceSize args, void *argp)
 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);
@@ -553,7 +561,8 @@ static void sound_init(void)
        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);
@@ -865,6 +874,7 @@ static void simpleWait(unsigned int until)
 
 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;
@@ -894,8 +904,16 @@ void emu_Loop(void)
        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;
@@ -973,7 +991,7 @@ void emu_Loop(void)
                        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;
@@ -1018,7 +1036,7 @@ void emu_Loop(void)
 
                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)
@@ -1057,3 +1075,19 @@ void emu_ResetGame(void)
        reset_timing = 1;
 }
 
+void emu_HandleResume(void)
+{
+       if (!(PicoMCD & 1)) return;
+
+       // reopen files..
+       if (Pico_mcd->TOC.Tracks[0].F != NULL)
+       {
+               lprintf("emu_HandleResume: reopen %s\n", romFileName);
+               pm_close(Pico_mcd->TOC.Tracks[0].F);
+               Pico_mcd->TOC.Tracks[0].F = pm_open(romFileName);
+               lprintf("reopen %s\n", Pico_mcd->TOC.Tracks[0].F != NULL ? "ok" : "failed");
+       }
+
+       mp3_reopen_file();
+}
+