Post Reply 
 
Thread Rating:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Darkstalkers Chronicle: The Chaos Tower
03-03-2013, 03:26 PM (This post was last modified: 01-29-2015 09:12 PM by vnctdj.)
Post: #1
Darkstalkers Chronicle: The Chaos Tower
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


Attached File(s) Thumbnail(s)
       
Find all posts by this user
Quote this message in a reply
05-11-2013, 11:51 AM
Post: #2
RE: Darkstalkers Chronicle The Chaos Tower
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.")


Attached File(s) Thumbnail(s)
           
Find all posts by this user
Quote this message in a reply
07-05-2013, 11:43 AM (This post was last modified: 07-05-2013 11:45 AM by sfageas.)
Post: #3
RE: Darkstalkers Chronicle The Chaos Tower
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

Log :
Code:
http://pastebin.com/MgfxTCQG


Attached File(s) Thumbnail(s)
               
Find all posts by this user
Quote this message in a reply
07-07-2013, 05:03 PM
Post: #4
RE: Darkstalkers Chronicle The Chaos Tower
Black screen now with BR off(v0.8.1-401-g76c3f16)
Find all posts by this user
Quote this message in a reply
08-31-2013, 12:48 AM
Post: #5
RE: Darkstalkers Chronicle The Chaos Tower
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.
Find all posts by this user
Quote this message in a reply
10-24-2013, 08:50 AM (This post was last modified: 10-24-2013 08:51 AM by NickGrouwen.)
Post: #6
RE: Darkstalkers Chronicle The Chaos Tower
Yeah it doesn't work very well in v0.9.1 either once I get to character selection

Hi I'm Belgian and my English is so-so. I play on desktop PC running Windows 8.1. I don't have any technical knowledge
Find all posts by this user
Quote this message in a reply
11-22-2013, 04:16 PM
Post: #7
RE: Darkstalkers Chronicle The Chaos Tower
any news?

*updating compatibility list.

Phones: Poco F3 8GB/256GB (Snapdragon 870 5G) and Redmi Note 6 Pro 4/64GB (Snapdragon 636)

PC: AMD Ryzen 5 3600 / 16GB RAM DDR4 3600MHz / NVIDIA GTX 1660 Ti 6GB / Windows 10 Pro
Find all posts by this user
Quote this message in a reply
01-04-2014, 02:45 AM (This post was last modified: 01-04-2014 07:24 AM by synce.)
Post: #8
RE: Darkstalkers Chronicle The Chaos Tower
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
Find all posts by this user
Quote this message in a reply
01-05-2014, 10:20 PM
Post: #9
RE: Darkstalkers Chronicle The Chaos Tower
Test on v0.9.6-342 on USA same crash
   
info log: attach
debug log:
https://drive.google.com/file/d/0B3OaSde...sp=sharing


Attached File(s)
.txt  ppssppinfolog.txt (Size: 29.51 KB / Downloads: 917)

I want to be a crash fixer
PM me if you want to me look a game
Find all posts by this user
Quote this message in a reply
01-06-2014, 01:45 AM
Post: #10
RE: Darkstalkers Chronicle The Chaos Tower
It's hitting this:

Code:
    T *GetFast(SceUID handle)
    {
        const SceUID realHandle = handle - handleOffset;
        _dbg_assert_(SCEKERNEL, realHandle >= 0 && realHandle < maxCount && occupied[realHandle]); <-- BOOM
        return static_cast<T *>(pool[realHandle]);
    }

This means one of:

* 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;
    }
}

(and run in the debugger.)

-[Unknown]
Find all posts by this user
Quote this message in a reply
01-06-2014, 03:54 AM
Post: #11
RE: Darkstalkers Chronicle The Chaos Tower
@Unknown
Do you mean "run in the debugger" = run in the debug build ?

PS:I am at work,if tonight don't need overtime work,would come back home in 8 hours later

I want to be a crash fixer
PM me if you want to me look a game
Find all posts by this user
Quote this message in a reply
01-06-2014, 06:39 AM
Post: #12
RE: Darkstalkers Chronicle The Chaos Tower
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]
Find all posts by this user
Quote this message in a reply
01-06-2014, 06:58 AM
Post: #13
RE: Darkstalkers Chronicle The Chaos Tower
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
Find all posts by this user
Quote this message in a reply
01-06-2014, 02:20 PM
Post: #14
RE: Darkstalkers Chronicle The Chaos Tower
@Unknown
Attach modify code of crash trace picture
and Modify Debug log


Attached File(s) Thumbnail(s)
               

.zip  ppssppdebugv0.9.6-342mlog.txt.zip (Size: 312.67 KB / Downloads: 866)

I want to be a crash fixer
PM me if you want to me look a game
Find all posts by this user
Quote this message in a reply
01-06-2014, 02:53 PM
Post: #15
RE: Darkstalkers Chronicle The Chaos Tower
Okay, so that thread is "Task Level0". It does indeed destroy that thread:

sceKernelTerminateThread(326)
sceKernelDeleteThread(326)
Freeing thread stack Task Level0

It's created with priority 32:
326=sceKernelCreateThread(name=Task Level0, entry=0885575c, prio=32, stacksize=12288)

But changed later:
sceKernelChangeThreadPriority(326, 63)
(while on that thread in fact.)

This code should be removing it from priority 32 initially:
Code:
        int old = thread->nt.currentPriority;
        threadReadyQueue.remove(old, threadID);

And this code should be removing it on delete:
Code:
    int prio = __KernelGetThreadPrio(threadID);
    if (prio != 0)
        threadReadyQueue.remove(prio, threadID);

One of these isn't working. So let's try changing them, respectively, to:

Code:
        int old = thread->nt.currentPriority;
        threadReadyQueue.remove(old, threadID);
        NOTICE_LOG(HLE, "Removed thread %d from ready queue %d", threadID, old);

Code:
    int prio = __KernelGetThreadPrio(threadID);
    if (prio != 0) {
        threadReadyQueue.remove(prio, threadID);
        NOTICE_LOG(HLE, "Removed thread %d from ready queue %d for delete", threadID, prio);
    } else {
        ERROR_LOG(HLE, "UNABLE TO REMOVE %d from ready queue %d for delete", threadID, prio);
    }

If both of those are successful, I'm not sure what's going on. We could also log here for good measure:

Code:
    inline void remove(u32 priority, const SceUID threadID)
    {
        Queue *cur = &queues[priority];
        _dbg_assert_msg_(SCEKERNEL, cur->next != NULL, "ThreadQueueList::Queue should already be linked up.");

        for (int i = cur->first; i < cur->end; ++i)
        {
            if (cur->data[i] == threadID)
            {
                int remaining = --cur->end - i;
                if (remaining > 0)
                    memmove(&cur->data[i], &cur->data[i + 1], remaining * sizeof(SceUID));
                return;
            }
        }

        // Wasn't there.
    }

Change to:

Code:
    inline void remove(u32 priority, const SceUID threadID)
    {
        Queue *cur = &queues[priority];
        _dbg_assert_msg_(SCEKERNEL, cur->next != NULL, "ThreadQueueList::Queue should already be linked up.");

        for (int i = cur->first; i < cur->end; ++i)
        {
            if (cur->data[i] == threadID)
            {
                int remaining = --cur->end - i;
                if (remaining > 0)
                    memmove(&cur->data[i], &cur->data[i + 1], remaining * sizeof(SceUID));
                return;
            }
        }

        // Wasn't there.
        ERROR_LOG(HLE, "Unable to remove thread %d from queue %d - was not there", threadID, priority);
    }

And, no rush, I can wait.

-[Unknown]
Find all posts by this user
Quote this message in a reply
Post Reply 


Forum Jump: