WiiRd forum

Wii & Gamecube Hacking => Wii Game hacking help => Topic started by: live2play on June 08, 2010, 02:05:22 AM

Title: Using 06 Codetype in ASM
Post by: live2play on June 08, 2010, 02:05:22 AM
I have an address saved to Gecko Register 0 and I need to use that address as the one used in a 06 code (e.g. 06<GR0_Address>).  How do I do this?

I guess that an alternative would be to write the 480 bytes (0x1E0) of data that I want the 06 code type to write starting at the address stored in Gecko Register 0 to an area of memory controlled by Gecko and then write the assembly to lwz/stw the data from the Gecko controlled memory to addresses starting with the one in Gecko Register 0.  I hope I don't have to do it this way.  :-\
Title: Re: Using 06 Codetype in ASM
Post by: paprika_killer on June 08, 2010, 11:56:18 AM
since an 06 writes at ba+adress, use this:

42001 : ba = grN+XXXXXXXX

so you get
42001000 00000000 (ba = gr0)
06000000 0000NNNN (write at ba)
....

Title: Re: Using 06 Codetype in ASM
Post by: wiiztec on June 08, 2010, 01:02:06 PM
since the base address isn't flexible enough for that purpose you'll probably want to do this

48001 : po = [grN+XXXXXXXX]

48001000 00000000
16000000 0000NNNN
Title: Re: Using 06 Codetype in ASM
Post by: paprika_killer on June 08, 2010, 01:03:24 PM
Why is the ba not flexible enough for that?
Title: Re: Using 06 Codetype in ASM
Post by: wiiztec on June 08, 2010, 01:41:24 PM
Because it can only be 80000000, 90000000, or 92000000
Title: Re: Using 06 Codetype in ASM
Post by: paprika_killer on June 08, 2010, 01:50:32 PM
where did you get that from?
as far as I know the ba can be everything, with increments of 0x4

EDIT:
why would we otherwise have all this:

CST0 : Load into Base Address

40TYZ00N XXXXXXXX :
40000 : ba = [XXXXXXXX
]40010 : ba = [ba+XXXXXXXX]
50010 : ba = [po+XXXXXXXX]
40001 : ba = [grN+XXXXXXXX]
40011 : ba = [ba+grN+XXXXXXXX]
50011 : ba = [po+grN+XXXXXXXX]
40100 : ba += [XXXXXXXX]
40110 : ba += [ba+XXXXXXXX]
50110 : ba += [po+XXXXXXXX]
40101 : ba += [grN+XXXXXXXX]
40111 : ba += [ba+grN+XXXXXXXX]
50111 : ba += [po+grN+XXXXXXXX]

CST1 : Set Base Address to

42TYZ00N XXXXXXXX
42000 : ba = XXXXXXXX
42010 : ba = ba+XXXXXXXX
52010 : ba = po+XXXXXXXX
42001 : ba = grN+XXXXXXXX
42011 : ba = ba+grN+XXXXXXXX
52011 : ba = po+grN+XXXXXXXX
42100 : ba += XXXXXXXX
42110 : ba += ba+XXXXXXXX
52110 : ba += po+XXXXXXXX
42101 : ba += grN+XXXXXXXX
42111 : ba += ba+grN+XXXXXXXX
52111 : ba += po+grN+XXXXXXXX

CST2 : Save Base Address to

440YZ00N XXXXXXXX
44000 : [XXXXXXXX]=ba
44010 : [XXXXXXXX+ba]=ba
54010 : [XXXXXXXX+po]=ba
44001 : [XXXXXXXX+grN]=ba
44011 : [XXXXXXXX+ba+grN]=ba
54011 : [XXXXXXXX+po+grN]=ba
Title: Re: Using 06 Codetype in ASM
Post by: wiiztec on June 08, 2010, 04:39:57 PM
No idea all of those except 42 are basically useless, but I know you can't set the base address to 81000000 even though it's an increment of 0x4
Title: Re: Using 06 Codetype in ASM
Post by: live2play on June 08, 2010, 05:38:37 PM
So, if the address in GR0 is 91xxxxxx, what would the code look like to use it in a 06/07 code type?
Title: Re: Using 06 Codetype in ASM
Post by: paprika_killer on June 08, 2010, 05:52:33 PM
The same.

and wiiztec, where did you get that from, that's what I was asking.
Title: Re: Using 06 Codetype in ASM
Post by: dcx2 on June 08, 2010, 06:03:59 PM
Quote from: paprika_killer on June 08, 2010, 05:52:33 PM
and wiiztec, where did you get that from, that's what I was asking.

From the Code Types doc:

Quoteba : Base Address. Set at 0x80000000 each time the code handler is executed. Each time the ba is added to a code address, the code handler do : address = address + (ba & 0xFE000000). You can modify it, however if you do, don't forget to reset it to its original value after.

What this means is that any time the ba is used, the code handler only looks at the most significant 7 bits.  The other 25 bits are masked off, or ignored.
Title: Re: Using 06 Codetype in ASM
Post by: dcx2 on June 08, 2010, 06:11:48 PM
Quote from: live2play on June 08, 2010, 02:05:22 AM
I have an address saved to Gecko Register 0 and I need to use that address as the one used in a 06 code (e.g. 06<GR0_Address>).  How do I do this?

I think you actually want the 4A code type.

4A00100N 00000000    # get value in grN and put it directly into the po
16000000 0000MMMM  # string write MMMM bytes using po
ZZZZZZZZ ZZZZZZZZ  # values to write...
ZZZZZZZZ ZZZZZZZZ
...

Be careful if you're using ASM with Gecko Registers.  In one of the versions of Gecko OS, the registers moved by 4 bytes.  When in doubt, you can use a C0 ASM code; I believe the Gecko Register pointer is stored in...r6?
Title: Re: Using 06 Codetype in ASM
Post by: paprika_killer on June 08, 2010, 06:51:12 PM
Quote from: dcx2 on June 08, 2010, 06:03:59 PM
Quote from: paprika_killer on June 08, 2010, 05:52:33 PM
and wiiztec, where did you get that from, that's what I was asking.

From the Code Types doc:

Quoteba : Base Address. Set at 0x80000000 each time the code handler is executed. Each time the ba is added to a code address, the code handler do : address = address + (ba & 0xFE000000). You can modify it, however if you do, don't forget to reset it to its original value after.

What this means is that any time the ba is used, the code handler only looks at the most significant 7 bits.  The other 25 bits are masked off, or ignored.

ah, like that.
what's the point in doing that though?
Title: Re: Using 06 Codetype in ASM
Post by: Deathwolf on February 27, 2011, 03:37:49 PM
Quote from: dcx2 on June 08, 2010, 06:11:48 PM
Quote from: live2play on June 08, 2010, 02:05:22 AM
I have an address saved to Gecko Register 0 and I need to use that address as the one used in a 06 code (e.g. 06<GR0_Address>).  How do I do this?

I think you actually want the 4A code type.

4A00100N 00000000    # get value in grN and put it directly into the po
16000000 0000MMMM  # string write MMMM bytes using po
ZZZZZZZZ ZZZZZZZZ  # values to write...
ZZZZZZZZ ZZZZZZZZ
...

Be careful if you're using ASM with Gecko Registers.  In one of the versions of Gecko OS, the registers moved by 4 bytes.  When in doubt, you can use a C0 ASM code; I believe the Gecko Register pointer is stored in...r6?

What do you mean with this? How should this work??
Example I want to write 3F800000 3F800000 3F800000 as string to an address with C2/C0.
Please give me an example.

thanks


EDIT: something like this?

C0000000 00000002
3D808012 618C8234
4A001000 00000000
16000000 00000010
12345678 12345678
12345678 12345678
4E800020 00000000

but no, I don't think so. 4A001000 <-- b 0x1000... what's wrong?