Functions are normally called using JAL instructions. Input registers typically are $a0, $a1, $a2, and $a3 and then the stack. Output registers are typically $v0 and $v1.
Player spawning/initialization (called by spawning functions below) (credit: triclon)
ROM: 0x39FC0
RAM: 0x800393C0
Inputs:
$A0 - Pointer to player structure, usually loaded from a table at 0x800DC4E0, structures start at 0x800F990 and are seperated by 0xD88 each. There are 8 total, 1 for each player.
$A1 - Player ID (0-7)
$A2 - coordinate x?
$A3 - coordinate z?
$SP 0x0024 - Character ID (0-7)
$SP 0x0028 - Not sure, looks like rotation angle?
This function looks quite large. One of the main inputs is the game mode (GP, time trial, VS, or battle stored at 0x800DC53C) which then branches to various parts of this function. DeadHamster confirmed this function can be called independently to spawn players but the number of players are limited to the current mode (no more than 4 players will not display in VS or Battle mode).
2P battle mode player spawning (credit: triclon)
ROM: 0x3BC90
RAM: 0x8003B098
Inputs:
$s0 = x coordinate pointer?
$s1 = z coordinate pointer?
Looks like a gaint case/if ladder which calls the player spawning function above.
3P battle mode player spawning (credit: triclon)
ROM: 0x3C19C
RAM: 0x8003B59C
Inputs:
$s0 = x coordinate pointer?
$s1 = z coordinate pointer?
Looks like a gaint case/if ladder which calls the player spawning function above.
4P battle mode player spawning (credit: triclon)
ROM: 0x3C724
RAM: 0x8003BB24
Inputs:
$s0 = x coordinate pointer?
$s1 = z coordinate pointer?
Looks like a gaint case/if ladder which calls the player spawning function above.
Get a random item (credit: abitalive)
ROM: 0x7B9A8
RAM: 0x8007ADA8
Inputs:
$a0 = Place
$a1 = PlayerType (00 = Human, 01 = CPU
Outputs:
v0 = RandomItemRtn
Runs when you hit an item box. See abitalive’s notes (https://github.com/abitalive/MarioKart64/blob/master/Notes/item_rng.txt).
Call RNG to return a 16 bit random int (credit: ???)
ROM: ???
RAM: 0x802B7D94
Outputs:
v0 = 16 bit random int
Call RNG to return a 16 bit random int between 0 and N-1 (credit: ???)
ROM: ???
RAM: 0x802B7E34
Inputs:
$a0 = N
Outputs:
$v0 = random int between 0 to N-1