Defined SM64 functions for CajeASM
Users browsing this thread: 1 Guest(s)

So if you have ever done your own custom ASM code, then you are very familiar with the JAL command that allows you to call functions. You would have to go searching for the specific address every time you forgot about it, unless you just write everything yourself.

As a small side project I'm creating a file that you can include into your ASM source code, so you only have to remember the names of each function. So instead of remembering that 0x802D66C0 is the function that prints text, you can just put down @PrintXY instead.

.include "SM64Functions.txt"
// Later in the code...
LUI A2, 0x802C
ORI A2, A2, 0xB23C // Pointer to ASCII string
ORI A0, R0, 0x0028 // X position
JAL @PrintXY
ORI A1, R0, 0x0050 // Y position

Inside the file itself includes documentation on every function along with the define; so if you don't know how many arguments a function needs, or what the function returns, then you can just look it up in the file.

Spoiler :
[Image: fYR5SN4.png]

I am hosting the file over on github, so you can add to the project if you want to. There is not a lot of functions at the moment, but I will continuously add more over time. There are hundreds of functions in SM64, so I want to only add the ones that ASM coders will find useful in multiple situations.

​Github page

This will be really useful
Gone for a while.

I added 2 more functions: @ConfigureTimer and @PlayTransition. In this post there are 2 example projects that show how to use both of these functions in-game.

The @ConfigureTimer function allows you to enable, disable, start, or stop the HUD timer.

[Image: qpEviG5.png]

Spoiler: Definition
/*
ConfigureTimer (0x802495E0 / 0x45E0)

Enables, disables, starts, or stops the HUD timer

Arguments:
A0 = option
- 0 = Shows timer and resets time value to zero
- 1 = Starts timer
- 2 = Stops timer
- 3 = Stops showing timer and resets time value to zero
Returns:
V0 = time value (value / 30 = time in seconds)
*/

[ConfigureTimer]​: 0x002495E0
Spoiler: TimerExample.asm
.include "SM64Functions.txt"

// Re-organize Mario's behavior
​.org 0x21CCC0 
​hex

00 00 00 00 
10 05 00 00 
11 01 01 00 
11 03 00 01 
23 00 00 00 00 25 00 A0 
08 00 00 00 
0C 00 00 00 80 29 CA 58 
0C 00 00 00 80 2C B2 64 
0C 00 00 00 80 7F 00 00 
09 00 00 00 
}


​// Overwriting part of the top levelscript.
​.org 0x108A18
​hex
{
11 08 00 00 80 2C B1 C0 
}


​// Function that will copy data from the ROM to the RAM
​.org 0x861C0
​ADDIU SP, SP, $FFE8
​SW RA, $0014 (SP)
​SW A0, $0010 (SP)
// lvl cmd 0x11 safeguard

​// Do not remove these following 4 instructions
​JAL @osViBlack
​MOV A0, R0
​LUI T0, 0x8039
​SW R0, 0xBE24(T0)
// Set level accumulator to 0

​LUI T0, 0x807F
​ORI A0, T0, 0x0000
​LUI T1, 0x03D0
​ORI A1, T1, 0x0000
​JAL @DmaCopy
​ORI A2, T1, 0x4000

​LW V0, $0010 (SP)
// lvl cmd 0x11 safeguard
​LW RA, $0014 (SP)
​JR RA
​ADDIU SP, SP, $0018 

/*
Custom loop function 0x807F0000

Use the D-Pad to configure the timer
D-pad Up = Enables Timer
D-pad Down = Disables Timer
D-pad Left = Starts Timer
D-pad Right = Stops Timer
*/

​.org 0x3D00000
​ADDIU SP, SP, $FFE8
​SW RA, $0014 (SP)

​LUI T0, 0x8034
​LH T0, 0xAFA0(T0)

​ANDI AT, T0, 0x0800
​BNEZ AT, 807F0000_ENABLETIMER
// Check D-Pad Up
​NOP
​ANDI AT, T0, 0x0400
​BNEZ AT, 807F0000_DISABLETIMER
// Check D-Pad Down
​NOP
​ANDI AT, T0, 0x0200
​BNEZ AT, 807F0000_STARTTIMER
// Check D-Pad Left
​NOP
​ANDI AT, T0, 0x0100
​BNEZ AT, 807F0000_STOPTIMER
// Check D-Pad Right
​NOP
​BEQZ R0, 807F0000_END
​NOP

807F0000_ENABLETIMER:
​JAL @ConfigureTimer
​ADDIU A0, R0, 0x00
​BEQZ R0, 807F0000_END
​NOP
807F0000_STARTTIMER:
​JAL @ConfigureTimer
​ADDIU A0, R0, 0x01
​BEQZ R0, 807F0000_END
​NOP
807F0000_STOPTIMER:
​JAL @ConfigureTimer
​ADDIU A0, R0, 0x02
​BEQZ R0, 807F0000_END
​NOP
807F0000_DISABLETIMER:
​JAL @ConfigureTimer
​ADDIU A0, R0, 0x03

807F0000_END:
​LW RA, $0014 (SP)
​JR RA
​ADDIU SP, SP, $0018 
The @PlayTransition function is used by the game's warp system to play a transition animation when mario goes to another level/area. The arguments of this function change which image is used and what RGB color to use for the background. Now this function has nothing to do with warps, but instead the transition animation that goes with warping. After the transition animation is completed, you will need to set the byte at 0x8033BAB3 to 0 to clear the screen.

[Image: 12f3we0.png]

Spoiler: Definition

/*
PlayTransition (0x8027B1A0 / 0x0361A0)

Plays a transition on the screen.

Arguments:
A0 = Image
- 0x01 = No image (fade to color)
- 0x09 = Star image
- 0x0B = Circle image
- 0x11 = Mario face image
- 0x13 = Bowser image
A1 = amount of time for transition to complete
A2 = red color amount (0x00 to 0xFF)
A3 = green color amount (0x00 to 0xFF)
SP + 0x10 = blue color amount (0x00 to 0xFF)

Note:
After the transition has been played, the screen will be filled up
with whatever color you chose. To fix this, detect if the byte at
0x8033BAB3 is equal to 1. If it is 1, then set that value to zero.
*/

[PlayTransition]​: 0x0027B1A0
Spoiler: TransitionExample.asm
.include "SM64Functions.txt"

// Re-organize Mario's behavior
​.org 0x21CCC0 
​hex

00 00 00 00 
10 05 00 00 
11 01 01 00 
11 03 00 01 
23 00 00 00 00 25 00 A0 
08 00 00 00 
0C 00 00 00 80 29 CA 58 
0C 00 00 00 80 2C B2 64 
0C 00 00 00 80 7F 00 00 
09 00 00 00 
}


​// Overwriting part of the top levelscript.
​.org 0x108A18
​hex
{
11 08 00 00 80 2C B1 C0 
}


​// Function that will copy data from the ROM to the RAM
​.org 0x861C0
​ADDIU SP, SP, $FFE8
​SW RA, $0014 (SP)
​SW A0, $0010 (SP)
// lvl cmd 0x11 safeguard

​// Do not remove these following 4 instructions
​JAL @osViBlack
​MOV A0, R0
​LUI T0, 0x8039
​SW R0, 0xBE24(T0)
// Set level accumulator to 0

​LUI T0, 0x807F
​ORI A0, T0, 0x0000
​LUI T1, 0x03D0
​ORI A1, T1, 0x0000
​JAL @DmaCopy
​ORI A2, T1, 0x4000

​LW V0, $0010 (SP)
// lvl cmd 0x11 safeguard
​LW RA, $0014 (SP)
​JR RA
​ADDIU SP, SP, $0018 

/*
Custom loop function 0x807F0000

Press L to play a mario-face transition with a purple background.
*/

​.org 0x3D00000
​ADDIU SP, SP, $FFE8
​SW RA, $0014 (SP)

​LUI AT, 0x8034
​LB AT, 0xBAB3(AT)
​BNEZ AT, 807F0000_PATH2
​NOP

807F0000_PATH1:
​LUI T0, 0x8034
​LH T0, 0xAFA0(T0)
​ANDI AT, T0, 0x20
​BEQZ AT, 807F0000_END
// Check for L-button input
​NOP

​ADDIU T9, R0, 0xFF
// Blue color amount
​SW T9, 0x10(SP)
​ADDIU A0, R0, 0x11
// Fade image type
/*
  0x01 = No image (fade to color)
  0x09 = Star image
  0x0B = Circle image
  0x11 = Mario face image
  0x13 = Bowser image
*/

​ADDIU A1, R0, 0x40
// Timer (How long the effect will last)
​ADDIU A2, R0, 0x7F
// Red color amount
​JAL @PlayTransition
​ADDIU A3, R0, 0x00
// Green color amount

807F0000_PATH2:
​LUI T1, 0x8034
​SB R0, 0xBAB3(T1)
// When the effect is done, clear the screen.

807F0000_END:
​LW RA, $0014 (SP)
​JR RA
​ADDIU SP, SP, $0018 
(This post was last modified: 23-04-2016, 09:38 PM by David.)

Defined SM64 functions for CajeASM
Users browsing this thread: 1 Guest(s)