01-16-2021, 07:11 PM
(01-16-2021, 02:46 AM)Vega Wrote: Due to my curiosity, I stepped by stepped your code to see how you were able to get this Draw Code to work w/o flickers on the console. I ended up with a better understanding of what you did, but was still left with some questions. I ended up removing some items and was still able to draw perfectly fine.
Source (PAL only):
Code:#Address (PAL) = 80009680
#Push Stack
stwu sp, -0x80 (sp)
stmw r3, 0x8 (sp)
#Set r31 for Direct Print Calling
lis r31, 0x8002
#Get current XFB (alternates between two FB's)
lwz r3, -0x6060 (r13)
#Get width and height for XFB
lis r5, 0x802A #Memory constant
lwz r5, 0x73FC (r5) #Load XFB Width Height Pointer
lhz r4, 0x4 (r5)
lhz r5, 0x8 (r5)
#Change XFB for Direct Print (r3 = FB, r4 = Width, r5 = Height)
ori r12, r31, 0x1E30
mtctr r12
bctrl
#Setup Args for Direct Print
li r3, 0
li r4, 0xDC
li r5, 1
bl our_text
.string "Hey"
our_text:
mflr r6
#Print to Screen
ori r12, r31, 0x1E90
mtctr r12
bctrl
#Store Cache
ori r12, r31, 0x1E70
mtctr r12
bctrl
#Pop Stack
lmw r3, 0x8 (sp)
addi sp, sp, 0x80
#Default Instruction
lwz r12, 0 (r3)
Some questions I have:
I notice you use a memory constant then load a pointer to get the width and height for the buffer, is this the only way to do it? Seems 'hacky'. Is there not a VI based function call to get those halfword values?
What was the purpose for calling the DirectPrintIsActive function? I removed it and didn't notice any changes.
What's the reasoning for checking if r0 equals 0 after the calling DirectPrintChangeXFB? Function calls only put return parameters in r3 or r3 & r4. And with multiple testing, I never once had a single time where r0 was 0 after calling DirectPrintChangeXFB.
Thank you in advance for any feedback.
I did it this way because that's how nw4r_db_Exception_Printf_ does it and basically copied everything from there, i was probably just careless and didn't optimize the source any further until i remade it in C++.
To answer your question: there is no point for these checks and i believe there's no function that returns these halfwords(even if they did, it wouldn't optimize the code).
also i saw you replaced the bl to VIGetNexFrameBuffer with lwz r3, -0x6060(r13), this instruction isn't region free(NTSC-K is slightly different: lwz r3, -0x6040) and because i was thinking in C++ and converting that back to assembly, i just used a bl to VIGetNextFrameBuffer.