03-03-2013, 03:26 PM (This post was last modified: 01-29-2015, 09:12 PM by vnctdj.)
Region : EU
Format : ISO
Version : v0.6-903-g1b1252b
Game ID : ULES00016
OS : Win
Compatability : Ingame
Notes : Missing menu options and character selection-Invisible characters ingame
Region: US
Format: ISO
Version: v0.7.6-15-g9ad1c08
Game ID: ULUS10005
OS: Win7 64-bit
Compatibility: In-game
Notes: Same as above; character sprites don't show up in-game or on selection menus, and character select options such as normal/turbo and which character version you're using are invisible. The game otherwise runs normally and at full speed, albeit with no music. (My testing involved Tower mode, AKA "the only reason to play the PSP port.")
07-05-2013, 11:43 AM (This post was last modified: 07-05-2013, 11:45 AM by sfageas.)
Progress!Graphics are visible but they are repeating in main menu and ingame.Game seems to hang twice,one before the intro and another one after start game,just press X to move on.All that if you disable buffered rendering.With BR it doesn't hang but the graphics are invisible
I was wondering if theres any plans on getting this game running?It was my first game on the psp,I've been wanting to play it but my psp died a year ago.
01-04-2014, 02:45 AM (This post was last modified: 01-04-2014, 07:24 AM by synce.)
ULJM-05005 (Japan) crashes PPSSPP v0.9.6.2 after pressing Start on the title menu. Tested with various settings, no luck getting it running.
On 0.9.1 it has the same problems others have mentioned
EDIT: Bypassed crash by downloading a clear file for the game, strange... Invisible problem persists though
EDIT 2: Game seems working fine on v096-317, just enable GPU buffer rendering
* The game is deleting a thread in a way that doesn't remove it from the thread queues.
* The game is writing somewhere that is corrupting PPSSPP's memory.
* A buffer overflow in PPSSPP is overwriting PPSSPP's memory.
But, your crash seems to indicate a crazy value of priority, which suggests one of the latter...
In sceKernelThread.cpp, find:
Code:
void __KernelChangeReadyState(Thread *thread, SceUID threadID, bool ready)
{
// Passing the id as a parameter is just an optimization, if it's wrong it will cause havoc.
_dbg_assert_msg_(SCEKERNEL, thread->GetUID() == threadID, "Incorrect threadID");
int prio = thread->nt.currentPriority;
if (thread->isReady())
{
if (!ready)
threadReadyQueue.remove(prio, threadID);
}
else if (ready)
{
if (thread->isRunning())
threadReadyQueue.push_front(prio, threadID);
else
threadReadyQueue.push_back(prio, threadID);
thread->nt.status = THREADSTATUS_READY;
}
}
Change to:
Code:
void __KernelChangeReadyState(Thread *thread, SceUID threadID, bool ready)
{
// Passing the id as a parameter is just an optimization, if it's wrong it will cause havoc.
_dbg_assert_msg_(SCEKERNEL, thread->GetUID() == threadID, "Incorrect threadID");
int prio = thread->nt.currentPriority;
if (prio < 0 || prio > 127) {
NOTICE_LOG(HLE, "Wackjob crazy priority %d for thread %d", prio, threadID);
DebugBreak();
thread->nt.currentPriority = 127;
return;
}
if (thread->isReady())
{
if (!ready)
threadReadyQueue.remove(prio, threadID);
}
else if (ready)
{
if (thread->isRunning())
threadReadyQueue.push_front(prio, threadID);
else
threadReadyQueue.push_back(prio, threadID);
thread->nt.status = THREADSTATUS_READY;
}
}
Also:
Code:
Thread *__KernelNextThread() {
SceUID bestThread;
// If the current thread is running, it's a valid candidate.
Thread *cur = __GetCurrentThread();
if (cur && cur->isRunning())
{
bestThread = threadReadyQueue.pop_first_better(cur->nt.currentPriority);
if (bestThread != 0)
__KernelChangeReadyState(cur, currentThread, true);
}
else
bestThread = threadReadyQueue.pop_first();
// Assume threadReadyQueue has not become corrupt.
if (bestThread != 0)
return kernelObjects.GetFast<Thread>(bestThread);
else
return 0;
}
Change to:
Code:
Thread *__KernelNextThread() {
SceUID bestThread;
// If the current thread is running, it's a valid candidate.
Thread *cur = __GetCurrentThread();
if (cur && cur->isRunning())
{
bestThread = threadReadyQueue.pop_first_better(cur->nt.currentPriority);
if (bestThread != 0)
__KernelChangeReadyState(cur, currentThread, true);
}
else
bestThread = threadReadyQueue.pop_first();
// Assume threadReadyQueue has not become corrupt.
if (bestThread != 0) {
u32 errorIgnored;
Thread *t = kernelObjects.Get<Thread>(bestThread, errorIgnored);
if (t == NULL && bestThread != 0) {
NOTICE_LOG(HLE, "ACK ACK ACK ACK Invalid thread id %d on thread queue", bestThread);
DebugBreak();
// Try, try again?
t = __KernelNextThread();
}
if (t == NULL) {
NOTICE_LOG(HLE, "ACK ACK ACK ACK Thread queue empty");
DebugBreak();
// Just brute force it, hopefully...
return kernelObjects.Get<Thread>(threadIdleID[0], errorIgnored);
}
return t;
} else {
return 0;
}
}
OK.Will try when I get back home.
PS:Bad news,tonight I need overtime to work .maybe 1:00 am )hong kong time) to get back home
(01-06-2014, 06:39 AM)[Unknown] Wrote: Yeah, with the debugger "attached" - e.g. press F5 in Visual Studio. It will break back to the code as soon as something crazy happens.
-[Unknown]
I want to be a crash fixer
PM me if you want to me look a game