Homebrew Citra - Unofficial \ Chinese builds discussion

player594

Well-Known Member
Member
Joined
Dec 25, 2006
Messages
458
Trophies
1
XP
1,894
Country
United States
First of all, I need to clarify a point: I have already given up getting respect from drwhojan. If you look back the history of this thread, I, along with other devs, have been trying to pay respect to him (and everyone), but what I got is either equivocate reply, ignoring, and disrespect on the open source spirit. I do understand and highly agree with you on the truth of "Give respect if you want respect in return" - and also in turn, if I don't want ones respect, I don't have to pay respect to them any more.

Second, even though I don't expect respect, I think my "anti-insult" subconscious functionality was still working when I made that post, because what I described, although probably too straight forward (because I figured euphemism didn't work for him), was merely describing and asking for facts. Let me analyze my own words for you:

"You haven't answered my question"
You probably didn't know this so I don't blame you. I have asked the same question below on github (probably twice) but he hadn't answered it; instead he kept turning aside from topic to something else

"did you actually managed to pass the famous XY intro freeze, or you just assumed that you can"
This was asking to clarify his previous (again) equivocate comment "this fixes the intro freeze", and I enumerated the two possibilities that I can think of when one seems like describing a "near-fact": tested or assumed.

"I won't read your non-sense"
OK I lied a little: because I indeed first read some of his other material on github, I already knew that what he wrote was non-sense. The word "non-sense" here describes a technical state, where what he said or did didn't make sense by logic, and/or by some simple hacking knowledge. I know the "hacking knowledge" is probably too much to say here (I can continue if you want to read), so let me just give one simple example of non-sense he did: he opened a PR on github to the master branch, in order to fix a bug that exists in MY fork but doesn't exist in the master branch. (See the post above https://gbatemp.net/threads/citra-unofficial-chinese-builds-discussion.431974/page-450#post-8366749)

"until you answer this question"
This is for the sake of fairness. He kept asking me to read (and accept) what he wrote, while refusing to directly answer my question (which came from me reading his stuff). It is unfair to me if I have to accept his thing without being able to question it.

As you can see, I managed to make my words insult-free (even if I intended to insult). If one still call this insult and say I was acting like an elitist, then they are the one who find themselves weak and who admit that who lower themselves in front of me. If you are not such person, stop being hypocritical to help those who treat themselves weak, and do real talk with me. I am even fine if you "act like an elitist" over me. What I am not fine with is acting weak and attacking me from moral high ground.

Still sound like an elitist, but whatever.
 

wwylele

Well-Known Member
Member
Joined
Oct 17, 2015
Messages
151
Trophies
0
Age
28
XP
395
Country
China
@wwylele Fire Emblem Warriors Fixed and Broken by #4392
https://github.com/citra-emu/citra/pull/4392

Needs Investigating ? :wtf: , Must have been some think added much later time...

Gone into Panic mode.
------

When tested it on a Working Build it dose CreateMemoryBlock

Code:
Kernel.SVC <Warning> core\hle\kernel\svc.cpp:Kernel::CreateMemoryBlock:1169: called addr=0x005FC000
Kernel.SVC <Warning> core\hle\kernel\svc.cpp:Kernel::CreateMemoryBlock:1169: called addr=0x005FE000
Kernel.SVC <Warning> core\hle\kernel\svc.cpp:Kernel::CreateMemoryBlock:1169: called addr=0x005FD000
Service.IR <Info> core\hle\service\ir\ir_user.cpp:Service::IR::IR_USER::InitializeIrNopShared:258: called, shared_buff_size=4096, recv_buff_size=82, recv_buff_packet_count=1, send_buff_size=18, send_buff_packet_count=1, baud_rate=4

For This Game ^
What is the working build number?
 

drwhojan

Well-Known Member
Member
Joined
Jul 14, 2009
Messages
4,196
Trophies
1
Age
45
Location
Where I Am!
XP
1,702
Country
United Kingdom
What is the working build number?

I need more time for checking, I gone though all citra canary builds from 10 days ago non worked.

It was one of my local msvc builds with you're PR merged, The working one must have bean some think I added too it..

Just ones of though's wtf I did sort of thing.. Will figure it out and post back soon.

EDIT: Recompiling.
 
Last edited by drwhojan,

drwhojan

Well-Known Member
Member
Joined
Jul 14, 2009
Messages
4,196
Trophies
1
Age
45
Location
Where I Am!
XP
1,702
Country
United Kingdom
Forget it ^, It was still that old shit in there - That did fix it.

kernal / memory.cpp Allocating memory o3ds 5 to 6 n3ds

And adding new FCRAM_N3DS_SIZE

Code:
    // New 3DS layouts
    {0x07C00000, 0x06400000, 0x02000000}, // 6
    {0x0B200000, 0x02E00000, 0x02000000}, // 7
};

void KernelSystem::MemoryInit(u32 mem_type) {
    // TODO(yuriks): On the n3DS, all o3DS configurations (<=5) are forced to 6 instead.
    ASSERT_MSG(mem_type <= 6, "New 3DS memory");
    ASSERT(mem_type != 1);

    // The kernel allocation regions (APPLICATION, SYSTEM and BASE) are laid out in sequence, with
    // the sizes specified in the memory_region_sizes table.
    VAddr base = 0;
    for (int i = 0; i < 3; ++i) {
        memory_regions[i].Reset(base, memory_region_sizes[mem_type][i]);

        base += memory_regions[i].size;
    }

    // We must've allocated the entire FCRAM by the end
    ASSERT(base == Memory::FCRAM_N3DS_SIZE);

kernal / kernal.cpp -> Same Memory of 6 n3ds / Why can't we keep "system_mode" ? and place the 6 n3ds else where..

EDIT: Yes we can / MemoryInit(system_mode = 6);

Code:
/// Initialize the kernel
KernelSystem::KernelSystem(u32 system_mode) {
    MemoryInit(6);
 
Last edited by drwhojan, , Reason: typo fix
  • Like
Reactions: JPXZ and xmeee978

dissidius

New Member
Newbie
Joined
Nov 25, 2009
Messages
2
Trophies
0
XP
3
Country
Albania
hello everyone
can anyone redirect me to the best build to play jrpgs like fire emblem awakening for excample???
if possible obviously :)
Best Regards!
 

warweeny

Well-Known Member
Member
Joined
Apr 25, 2011
Messages
319
Trophies
0
XP
1,140
Country
Netherlands
i stopped making builds because i will get a 3ds soon

Could you post your "final" build?
That way i (and others of course) would at least have the latest build you made, seeing you are one of the few remaining in terms of custom builds, i'd like to have the latest build you made, in case the main branch is still worse than yours.
 

drwhojan

Well-Known Member
Member
Joined
Jul 14, 2009
Messages
4,196
Trophies
1
Age
45
Location
Where I Am!
XP
1,702
Country
United Kingdom
@drwhojan You haven't answered my question: did you actually managed to pass the famous XY intro freeze, or you just assumed that you can?

As a Follow up on the other had I don't think fixing the Music in the game would fix the deadlock/freeze anyway, has to be some think deeper..

EDIT: Yes it is.. ^, Seams to be around setting channels between the pipe and buffer Audio / Binary
Set "RegisterInterruptEvents"

const DspPipe pipe = static_cast<DspPipe>(channel);
to
const DspPipe pipe = static_cast<DspPipe>(channel, 3);

And it will Deadlock/Freeze a lot Sooner in FMV, Extra sounds missing so its Locking on "WriteProcessPipe"

https://www.3dbrew.org/wiki/DSP:ReadPipeIfPossible#Channel_3_.28Binary.29

Code:
Audio.DSP <Error> audio_core\hle\hle.cpp:AudioCore::DspHle::Impl::PipeWrite:139
: DspPipe::Audio: Unexpected buffer length 32 was written <- Odd ?

DSP_DSP::SetSemaphore:71: (STUBBED) called, semaphore_value=4000

DSP_DSP::WriteProcessPipe:119: channel=2, size=0x4, buffer_size=4 <- Audio 2 Channel
DSP_DSP::WriteProcessPipe:119: channel=3, size=0x20, buffer_size=20 <- Binary 3 Channel

DSP_DSP::ReadPipeIfPossible:178: channel=2, peer=0, size=0x0002, pipe_readable_size=0x0020 <- Audio 2 Channel
DSP_DSP::ReadPipeIfPossible:178: channel=2, peer=0, size=0x001E, pipe_readable_size=0x001E <- Audio 2 Channel , 1E can't be used.

DSP_DSP::RegisterInterruptEvents:261: Registered interrupt=2, channel=3 <- Interupt ?, <- Binary 3 Channel
DSP_DSP::RegisterInterruptEvents:265: Unregistered interrupt=2, channel=3

DSP_DSP::SetSemaphoreMask:287: (STUBBED) called mask=0x00002000

So how to split the two channels in the one "WriteProcessPipe" ?..
 
Last edited by drwhojan, , Reason: fixed info

drwhojan

Well-Known Member
Member
Joined
Jul 14, 2009
Messages
4,196
Trophies
1
Age
45
Location
Where I Am!
XP
1,702
Country
United Kingdom
^ Though't might be some think like this

Code:
void DSP_DSP::WriteProcessPipe(Kernel::HLERequestContext& ctx) {
    IPC::RequestParser rp(ctx, 0x0D, 2, 2);
    const u32 channel = rp.Pop<u32>();
    const u32 size = rp.Pop<u32>();
    auto buffer = rp.PopStaticBuffer();

    const DspPipe pipe = static_cast<DspPipe>(DspPipe::Audio, channel, 2);
    const DspPipe pipe2 = static_cast<DspPipe>(DspPipe::Binary, channel, 3);

    // This behaviour was confirmed by RE.
    // The likely reason for this is that games tend to pass in garbage at these bytes
    // because they read random bytes off the stack.
    switch (pipe) {
    case DspPipe::Audio:
        ASSERT(buffer.size() >= 4);
        buffer[20] = 1;
        break;
        switch (pipe2) {
        case DspPipe::Binary:
            ASSERT(buffer.size() >= 8);
            buffer[4] = 1;
            break;
        }
    }

    Core::DSP().PipeWrite(pipe, buffer);

    IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
    rb.Push(RESULT_SUCCESS);

    LOG_DEBUG(Service_DSP, "channel={}, size=0x{:X}, buffer_size={:X}", channel, size,
              buffer.size());
}

Should be Channel Binary 3 and size, 0020 / pipe_readable_size, 0020 , But its having non of it..
Code:
void DSP_DSP::ReadPipeIfPossible(Kernel::HLERequestContext& ctx) {
    IPC::RequestParser rp(ctx, 0x10, 3, 0);
    const u32 channel = rp.Pop<u32>();
    const u32 peer = rp.Pop<u32>();
    const u16 size = rp.Pop<u16>();

    const DspPipe pipe = static_cast<DspPipe>(DspPipe::Audio, channel, 2);
    const u16 pipe_readable_size = static_cast<u16>(Core::DSP().GetPipeReadableSize(pipe));

    std::vector<u8> pipe_buffer;
    if (pipe_readable_size >= size, 1)
        pipe_buffer = Core::DSP().PipeRead(pipe, size);

    IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
    rb.Push(RESULT_SUCCESS);
    rb.Push<u16>(pipe_readable_size, 1);
    rb.PushStaticBuffer(pipe_buffer, 0);

    LOG_DEBUG(Service_DSP, "channel={}, peer={}, size=0x{:04X}, pipe_readable_size=0x{:04X}",
              channel, peer, size, pipe_readable_size);
}

Now CMD are Log reading
Code:
Audio.DSP <Warning> audio_core\hle\hle.cpp:AudioCore::DspHle::Impl::PipeRead:111: pipe_number = 2 is out of data, application requested read of 32 but 0 remain

Still Required no matter what for above
https://github.com/citra-emu/citra/compare/master...MerryMage:pipe3
 
Last edited by drwhojan, , Reason: fixed info

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • No one is chatting at the moment.
    SylverReZ @ SylverReZ: @OctoAori20, Cool. Same here.