Credits: Hawkeye2777 (Player Health & Energy Structure) Megazig (generic Wii system related functions; they were ported by Vega from MKWii) Vega (everything else) Symbol Map NTSC-U 80004338 memcpy; Requires 3 args. r3 = Destination Address, r4 = Source Address, r5 = Amount of Bytes to Copy 80004388 memset; Requires 3 args. r3 = Write Address, r4 = What to Write, r5 = How many times to Write it 8000443C memsetParent; Literally a function that just calls memset as a child function 80009138; Store4SingleFloats. Simply stores single precision f1, f2, f3, f4 adjacent to each other at r3 address 8000914C; Store3SingleFloats. Simply stores single precision f1, f2, f3 adjacent to each other at r3 address 80009348; QuaternionTransfer. Simply copy and pastes a Quaternion from one location to another via two Paired Singles. r3 = Destination Address. r4 = Source Address. r3 returns Destination Address 8000935C; VectorTransfer. Simply copy and pastes a vector from one location to another via one Paired Single then a Single Precision float. r3 = Destination Address. r4 = Source Address. r3 returns Destination Address 80030F10 PlanetDestructionParent; Requires no args. Calls 2 child functions. Calls 0x800324BC; then calls 0x8008F3CC 800324BC MapTransformValueReturn; Requires no args. Contains unknown 1 child function. This function will do some operations to determine what Map value to return in r3. This is the map that you will be changed to on a planet destruction. Thus, the function will return 3 (Dying Namek); 0xF (Ruined Earth), or -1 (Error) 80041728 OneShotOneFrameWasButtonAtLeastUsed; r3 arg = Master Pointer, r4 arg = button mask to check. r3 returns 1 if mask was found. r3 returns 0 if mask not found. r3 + 0x84C is the location of the buttons-used Word in Memory. The game uses this func for C stick left/right on Teammate Rotation. 80041740 WasButtonAtLeastUsed; Diff than above. It loads from 0x844 which is a regular non-oneshot all-frames button-combo word value. NOTE: For funcs OneShotOneFrameWasButtonAtLeastUsed and WasButtonAtLeastUsed, they load a button word combo. (two diff spots). These are the values that will appear for GCN. Remember that for OneShotOneFrameWasButtonAtLeastUsed, they only appear for one frame even if held. 02044100 = C stick left; 0x0200 upper is for team rotation. lower 0x0100 is for camera 04084400 = C stick right; 0x0400 upper is for team rotation. lower 0x0400 is for camera 00018000 = C stick up 00022000 = C stick down 41100004 = Y 08100008 = A 10100002 = B 20100001 = X 00000200 = Z 00000040 = Analog left 00000080 = Analog right 00000010 = Analog Up 00000020 = Analog down 00000040 = Dpad left 00000080 = Dpad right 00000010 = Dpad up 00000020 = dpad down 00401000 = L 00200800 = R NOTE that mask 00800000 is for changing the Camera View Option (A vs B vs C) but this flag doesn't exist legitimately for GCN because the controller doesn't have enough buttons. The game still calls the necessary functions to check this flag even with the GCN being used. 80041758 WasButtonAtLeastUsed2???; same as above func but it loads at r3 +0x854. HOWEVER, I didn't see a button-used word value here when checking. Could be my error though, who knows. 800427CC SubCameraSomethingIdk; r3 = Destination Addr, r4 = Source addr. Void func. Could be used for XYZ Char coords, too lazy to check. Looks to be a generic type func. But it is used for Camera values. Gets called a handful of times by MainCameraUpdate. 80042A14 & 80042A68 GetMasterPointer; YES there are two exact copies of this function in the game (lol). This function will return the r3 pointer arg (which is called Master Pointer) based on the Slot value given to use for GetRealHealthPointer. r3 will return 0 if an error occurred. Requires 1 arg (slot of player). r3 = 0 for 1P. r3 = 1 for 2P/COM. The Master Pointer is a goofy name for this pointer which is used in many instances as a reference to lookup other elements such as the Player's Real Health Pointer. Final NOTE about Master Pointer: Under limited testing it appears that 1P&2P/COM's Master Pointers can only be one of the following sets (1P listed first in both sets btw). However do not rely on using these, call the function instead. 92331860 92333900 923367C0 92338860 80042ABC GetGeometryPointer; function returns GeometryPointer. r3 (only arg) is Master Pointer. Note to Devs: Use this function to get Geometry Pointer. Then simply add 0x970 (2416) to it (which is how the game does it) to get XYZ Memory Pointer (the set of XYZs that you can freely modify live in Dolphin-memory-engine) 80042AC4 GetXYZNonModMemPointer; function returns the XYZNonModMemPointer. r3 (only arg) is Master Pointer. All this function does is add 0x10 to the Master Poiner (lmao, why is this a function at all?). 8004487C CameraUpdateOppInOutScreen; r3 = Destination Address (ptr to write newly genned Cam values to), r4 = Source Address (ptr to newly genned Cam values), r5 = ptr to keep a buffer (temp scratch space) at. This is a Void func. This gets called by MainCameraUpdate whenever Opponent enters/leaves your TV/Camera Screen. 800449BC CStickCameraAdj; r3 = Master Pointer, f1 = unk. f1 returns unk. This func includes the call of WasButtonAtLeastUsed 2 separate times. One for C stick left, and one for C stick right. This is checking if the C stick was activated in regards to switching Camera left vs right view. Note there are other funcs called by this func. 80044CCC DoCameraABCAdjustment; r3 = Master Pointer. Void func. This func executes every frame for 1P and 2P/COM. It check if custom controller flag 0x00800000 is high using the OneShotOneFrameWasButtonAtLeastUsed func. If said flag is high, it does a an adjustment to the next Camera Option setting (A to B, B to C, C to A). It's impossible for GCN to legitimately do these adjustments during a match due to not enough buttons. NOTE TO SELF: Addr 80044CEC does the check whether or not to branch. If not branching then flag was met and do the Camera Option. HOWEVER, if you disable all other Camera writes (cutscene writes irrelevant), then you actually don't need to edit this branch at all! Ofc doing so won't change anything to the Freeze Camera code but its extra unnecessary code. MP + 0x49C = word value for camera adjustment ABC. 0 = A. 1 = B. 2 = C. 80044E64 MainCameraUpdate; r3 = master pointer. Void func. This func is responsible for all the Real Camera XYZ, & Long-Lat-Drill values. Didn't check but I'm sure this func executes every frame for 1P and 2P/COM. Fyi, Real means writing to spot in memory were the semi-mod (xyz) and full-mod (longlatdrill) values reside at. This calls many funcs ofc, but to note it calls CameraUpdateOppInOutScreen once and SubCameraSomethingIdk a handful of times. 80045374 UpdateTrueCharXYZCoords; r3 = Master Pointer. Void func. This func execute every frame for 1P and 2P/COM. The fully modifiable XYZ coords in mem (fully mod = able to mod live at anytime by hand) are updated. 80047234; DumpKiCharXYZCoords. r3 = Slot (game loads it as a signed halfword even though slots can only be unsigned bytes, huh??), r4 = 15 or 17. 15 = Dump Ki Start XYZ. 17 = Dump Char XYZ (this isn't exact to real/modifiable Char XYZ, but it's really close). Fyi needless to say Ki Start XYZ is a close value to Char XYZ. r5 = Dump Address, dumped as two paired singles. 80049770 __SwitchNewTeammate; r3 = master pointer. Doesn't include everything for switching teammates, just it includes some stuff. This func updates the word memory spot for Current Fighter's Slot Value Within Team, updates Char ID of current Fighter, and updates some other integer-type values. This func Calls ReturnSlotValueofCurrentSelectedTeammate (this is slot within Team), then calls GetTeammateCharacterIDPtr, then calls GetTeammateRealHealthPtr. This is a void func, no return value. 80057074 CharTransSanityCheck; Requires 4 args. Will return 0 if any error occurs and 1 if all good. Appears to be used for some sanity checks of calling certain child functions (that the REAL ExecuteCharTransformation function). Includes the GetCharTransValue child function. 800571C8 CharsTransParent; Requires 1 arg. Occurs every frame in match, calls some child functions and a portion of this function goes thru a series of critial checks to determine whether or not to execute a character transformation. Contains the CharTransSanityCheck (0x80057074) and ExecuteCharTransformation (0x80057304) child functions along with other unknown child functions. 80057304 ExecuteCharTransformation; Requires 2 args. This is the function responsible for actually doing the Character Transformation. Ofc has many child functions and it calls the GetCharTransValue child function. 8005E85C ???; No idea how to name. Occurs every frame in match, does many checks to see if it will call the PlanetDestructionParent function (0x80030F10) 800615F0; CalcKiDirectionAngle. 6 args, 3 integer args and 3 single precision float args. r3 = sp + 0x20, r4 = KIXYZStructurePointer + 0x10, r5 = KIXYZStructurePointer + 0x30. Responsible for all the raw calculations of where the Ki Blast is going based on where the opponent is currently at. Calls many child functions. It involves calling DumpKiCharXYZCoords but using opponent's slot value, with r4 as 0x17, and r5 (dump address) is sp + 0xA0. Also calls QuaternionTransfer. 800748FC UpdateZPoints; Updates your Z points with amount given in r3. One arg. r3 = ZPoints to add/subtract. Value is treated as sign ofc. r3 returns the Data Save pointer. 8007ABA4; __GetGeometryPointer. Sometimes is called directly (you will need slot value for r3 unlike GetGeometryPointer func which just uses MP as only arg) or is used as a branch landing spot for GetGeometryPointer. r3 = Slot. r3 returns GeometryPointer, that is used to later calculate the pointer to the KIXYZStructurePointer. 80081AEC; GetKIXYZStructPointer. r3 = GeometryPointer, r4 = 0x15/17 (same r4 arg as 'DumpXYZKICoords' function. r3 returns the pointer to KIXYZStructurePointer. 8008E3E4 ???; No idea how to name. Requires no args. All this does is set r3 to 0x803D8448. Gets called by DuelTimeStartAmount function & InfiniteCheck function. May be called by other functions. 8008F3CC ExecuteOrAbortDestruction; Requires no args. Goes thru a series of checks to determine if the game will actually commit and do the Planet Destruction. Has 5 checks. First 3 are unknown. 4th check makes sure you didn't get error return from the MapTransformValueReturn function. 5th and final check compares your current Map against new Map to end up as. They cannot be a match for the Destruction will be aborted. All 5 checks are good, then some memcpy's are done and then two game-specific child functions are done for the actual Planet Destruction to occur in the game. 800914BC DuelTimeStartAmount; Requires no args. Returns the starting value of the Timer for the Duel/Match. Contains 1 child function that literally just sets r3 to 0x803D8448, that function is located at 0x8008E3E4. 800914F0 InfiniteCheck; Requires no args. Returns 1 for infinite match, 0 for not infinite. Contains 1 child function that literally just sets r3 to 0x803D8448, that function is located at 0x8008E3E4. 800C6328 GetTimeLeftMainPointer; function returns TimeLeftMainPointer. Once you have pointer you can load 0xC from it to you get the most updated in-game timer. There are no args needed. 800C94A8 DataSaveChecksum; Requires 3 args. r3 = pointer to contents. r4 = byte size of contents. r5 is 0 to verify an existing checksum, or r5 is 1 to write a new checksum. Function returns r3 as 0 for success, or 1 for failure. The checksum is a two-byte checksum. The first byte is is read/written to/from the 4th byte location of the data save contents (offset 0x3). The second byte is read/written to/from the 8th byte location of the data save contents (offset 0x7). If r5 was provided as 0, once the new checksum has been generated, the first byte of it to verified against what's in the data save. If they match, function will skip check of byte #2 and return r3 as 0 (success). If byte #1's check failed, then check for byte #2 is done. If that also fails, then function will return r3 as 1 (failure). For writing a new checksum (r5 provided as 1), the new checksum is simply written, and r3 is set to 0 for the return (success). 800D7094 ??? (no idea how to name); r3 = master pointer, calls GetGeometryPointer. Then it does lwz r3, 0x91C (r3) then lwz r3 0x0010 (r3). This final r3 is what gets returns, it is an Integer and not a pointer. Gets called by CheckPilafMachineFusionAndSomeOtherCrap. 800D718C GetCharTransValue; Requires 2 args. Will return the Character value that you will transform to. Contains 1 unknown small child function. This function only gets called by CharTransSanityCheck and ExecuteCharTransformation. 800D794C GetKiBlastCycleLimit; Returns the Ki Blast Single Cycle limit in r3. It appears that r3 will be returned as 1 if an error occurred. From limited tested, it appears r3 will always return as 5. However the function does have instructions to make it possible for other values. 1st arg and only arg of this function is the Player's Master Pointer. 800D7BB4 GetStartHealth??? r3 = Master pointer. Calls GetGeometryPointer. After the call it does. lwz r3, 0x91C (r3); then lwz r3, 0x2C (r3). This r3 return value is either Health, StartHealth, Ki, or Start Ki. Too lazy to investigate. More likely its StartHealth. 800DEA58 ContinueOrEndMatch; Calls HandleTimerAndInfinite (along with many other child functions). After it calls HandleTimerAndInfinite, it will check if the match needs to end due to the Timer. If not it goes thru a series of calling the same child function over and over, and checks if the match will end by KO or Ringout. If match is going to end it will return r3 as 1 to its parent function. If match still needs to continue, it will return r3 as 0 to its parent function. 800F2C14 GetCharacterIDPtrSlotBased; r3 = master pointer, r4 = slot of teammate. Based on slot, this returns the respective fighter's character ID pointer. 0 = Player 1 of Team aka main character. 1 = Player 2 of Team. 2 = Player 3 of Team etc etc 800F2C24 GetCharacterIDPtrCurrent; r3 = master pointer. Returns pointer to character ID value of current fighting/active character 800F2C80 GetRealHealthPtrSlotBased; r3 = master pointer, r4 = slot of teammate. Based on slot, this returns the respective fighter's real Health pointer. 0 = Player 1 of Team aka main character. 1 = Player 2 of Team. 2 = Player 3 of Team etc etc 800F2C90 GetRealHealthPointer; r3 = master pointer. Returns pointer to current fighting/active character's Real Health 800F2EC4 ReturnSlotValueofCurrentSelectedTeammate; r3 = Master Pointer, r3 returns slot value of teammate that you're switching to. It's Slot within Team. Not the Slot of 1P vs 2P/COM. 800F3088 ChangeTeamMateClockwise; r3 = master pointer, no return value. technically r3 returns master pointer. This function is one of many that is needed to change the teammate in the rotation during the match 800F30E8 ChangeTeamMateCounterClockwise; r3 = master pointer, no return value. technically r3 returns master pointer. This function is one of many that is needed to change the teammate in the rotation during the match 800F36F4 IncreaseRealHealth; r3 = master pointer, r4 = amount to increase real health by. Returns Real Health Pointer 800F3728 IsRealHealthAtLeastR4Value; r3 = Master pointer, r4 = value to check for, r3 turns 1 for true, 0 for false 800F374C IncrementKi&DiditOverfill; Increments Ki up to its Limit and returns True (1) if the increase made Ki go over limit. If increase equalled or was less then Limit then r3 returns False (0). r3 = master pointer. r3 returns difference. 800F3794 IsKiAtLeastR4Value; r3 = Master pointer, r4 = value to check for, r3 turns 1 for true, 0 for false 800F37B8 SomethingWithKiandMaxPower; 3 args. 800F3848 SubtractKiAndSomethingwithMaxPower; r3 = master poointer. r4 = amount to subtract from Ki. Subtracts from Ki. Also will set max power to 0 and then returns Ki - Max Power. 800F3890 IncrementBlastStocks; This increments the blast stocks by the amount in the 2nd arg. r3 = master pointer, r4 = amount to increment by. r3 returns the Blast Stock ptr. Fyi to code writers, slot of player seems to always be in r29. 800F38BC AreBlastStocksAtLeastAtR4Value; Checks if Blast Stocks are at least at the r4 value. Requires 2 args. r3 = master pointer, r4 = value to check for (usually this is 100,000). r3 will return 0 (no) or 1 (yes). Fyi to code writers, slot of player seems to always be in r29. 800F38E0 DecrementBlastStocks; This decrements the blast stocks by the amount in the 2nd arg. r3 = master pointer, r4 = amount to decrement by. r3 returns Blast Stocks ptr. Fyi to code writers, slot of player seems to always be in r29. 800F3908 IncrementMaxPower; This increments the max power by the amount in the 2nd arg. 2 args. r3 = master pointer, r4 = amount to decrement by. r3 returns Max Power ptr. Fyi to code writers, slot of player seems to always be in r29. 800F3934 DecrementMaxPower. This decrements the max power by the amount in the 2nd arg. 2 args. r3 = master pointer, r4 = amount to decrement by. r3 returns Max Power ptr. Please NOTE to code writers that for this function r29 does NOT contain player slot. 800F395C ConvertRealHealth; This converts the Real Health amount from a signed integer to a float. 1 arg. r3 = master pointer. f1 returns the Health float value as Single Precision. f1 will be negative if an error occurred. 800F3B34 IsKiAtLeastKiLimit; Checks if your current Ki is equal or greater than your Ki Limit. Requires 1 arg. r3 = master pointer. r3 returns 0 (no) or 1 (yes). Fyi to code writers, slot of player seems to always be in r29. Only gets called when you proactively charge Ki. 800F3B5C IsMaxPowerChargeAtLeast30000; Checks if Max Power Charge is equal or greater then 30,000 (full). Requires 1 arg. r3 = master pointer. r3 will return 0 (no) or 1 (yes). Fyi to code writers, slot of player seems to always be in r29. 800F3B84 SomethingWithKicntlzw; r3 = Master pointer, returns a bool 800F3BA4 SomethingWithMaxPowercntlzw; r3 = Master pointer, returns a bool 801024AC StoreRealHealthSomewhere; r3 = slot, r4 = current real health. Most likely this func stores the Real Health to the mem location of the Display Health value. Void func 801024C0 StoreKiSomewhere; r3 = slot, r4 = ki. Most likely this func stores Ki to the memlocatio of the Display Ki value. Void func. 801204E8 GetCurrentPlayerRealHealth; returns the current player's real health. Requires 1 arg. r3 = slot. 0 for P1. 1 for P2/COM. The function knows to grab the exact team player within P1 or P2/COM's team when said player is the current one in the fight. Function will return 0 for failure. Calls two child functions (0x80042A68 aka GetMasterPointer and 0x800F2C90 aka GetRealHealthPointer). Fyi to code writers, slot of player is in r18, r22, & r27. 80120520 GetKiAmountCurrentPlayerBasedOnSlot; r3 = slot. This func returns the Ki amount of the current fighting player based on 1P vs 2P/COM slot value (0 v 1). Calls GetMasterPointer. If that is success, then calls GetRealHealthPointer (using r3 return value from GetMasterPointer for r3 arg ofc). After getting RealHeatlhPointer, it does lwz r3, 0xC (r3) to grab the Ki. 801207C4 GetStartHealthSlotBased??? r3 = slot. Calls GetMasterPointer, if success then calls 800D7BB4 (???) using MP as r3 arg. 80120830 ??? r3 = slot. Calls GetMasterPointer, if success then calls 80034ED8. Using r3 as MP and r4 as 190. r3 return value (carried from 80034ED8) is a bool. 8012B40C IncrementTimer; increments the frame counter and Game Timer 8012B574 HandleTimerAndInfinite; Involves calling IncrementTimer twice (not back to back ofc), and calls InfiniteCheck immediately after calling IncrementTimer the 2nd time. If match is NOT Infinite (0 returned from InfiniteCheck), it will execute various instructions to call the DuelTimeStartAmount function to see if the current game timer thats being incremented has hit the value returned from DuelTimeStartAmount. If not, then the function will return r3 as 0 to its parent function, match (timer wise) continues. However, if the DuelTimeStartAmount has been been reached/hit, the function will set r3 to return 1 to tell parent function to end the match. Regarding infinite matches, the various instructions for calling DuelTimeStartAmount are skipped since the call to InfiniteCheck will return 1. Thus the function will set r3 to 0 to tell parent function to never end the match based on anything timer related. 8012B640 GetTimeLeftInMatch; function returns amount of time left in the match. If it's an infinite match, -1 is returned. No args are required. This function calls 2 child functions (InfiniteCheck, and GetTimeLeftMainPointer). 8016414C; StartKiBlastPath. Two args. r3 = unkpointer, r4 = sp + 0x40, NOTE: r3 + 0x38 contains the current player's KiXYZStructurePointer. Function only gets called once at the very start of every Ki Blast. Main task is that is nulls out the current player's KiXYZ Structure, then does initial writes to it. Calls various child functions that include (but not limited to) memset, memcpy, DumpKiCharXYZCoords, & QuaternionTransfer. DumpKiCharXYZCoords is called multiple times with different args. 80164310; KiBlastPathUpdate. One arg. r3 = same unkpointer that was use in StartKiBlastPath. Gets called every frame a Ki Blast is still traveling. Main task is to constantly get opponents char XYZ coords and update the Ki Blast XYZs accordingly. Calls various child functions that include (but not limited to) CalcKiDirectionAngle & QuaternionTransfer. 801FAA2C CheckPilafMachineFusionAndSomeOtherCrap; r3 = master pointer, void func. This func calls 800D7094 func. If r3 from that fun has bit 26 low, then it calls GetCharacterIDPtrCurrent. If character is Pilaf Fusion Machine, it will call func 801FA59C (r3 = MP). If character is *NOT* Pilaf Fusion Machine, then call is done to func 801F9F4C instead. 801C7708 SummonShenronMain?; Maybe first/parent function that's specific for handling Shenron Menu. 80207DD8 DCInvalidateRange; Does a Data Cache Invalidation on a block of memory. Requires 2 args. r3 = Pointer to Range, r4 = Byte size of Range 80207E04 DCFlushRange; Does an Data Cache Flush on a block of memory. Requires 2 args. r3 = Pointer to Range, r4 = Byte size of Range 8020AAD0 OSFatal; Halts the game and displays text on screen with solid background. r3 = Pointer Foreground (text color), r4 = Pointer to Background color, r5 = Pointer to ascii text. Color = RRGGBBAA. RR = Red, GG = Green, BB = Blue, AA = Alpha. 80210D78 _OSInitSTM; Initializes (opens) the STM Resource Manager (/dev/stm) 80210E90 _OSShutdownToSBY; Requires no args, shuts down the console to standby mode (forced red light) 8021FAB8 PADRead, r3 = Where to Dump GCN Controller Contents (its a buffer size of 0x30). r3 MUST be 32-byte aligned. 802311BC _savefpr_14; Backups f14 thru f31 80231208 _restfpr_14; Restores f14 thru f31 80231254 _savegpr_14; Backups r14 thru r31 802312A0 _restgpr_14; Restores r14 thru r31 802392B8 sprintf; Formats a C/C++ string using standard 8-bit ascii. r3 = Pointer where Formatted String will be dumped to, r4 = Pointer to where non-Formatted String is at, r5 thru r10 = Variables that need Formatting, f1 thru f8 are same thing as r5 thru r10 but for floats. r3 returns (if successful) as the length (in bytes) of the formatted string (does NOT include the auto appended null byte). r3 will be negative if sprintf failed. NOTE about the following functions: These were simply ported over from Megazig's function list for MKWii PAL. They have not been tested. Also some functions (i.e. ISFS_Rename, ISFS_Seek, & IOS_Seek) were not found during the porting. - Vega 8024E764 ISFS_OpenLib; initializes the ISFS system by using IOS_Open to open /dev/fs using an r4/permissions arg value of 0. Once this has been called, you can now use the other ISFS functions. 8024E88C _isfsFuncCb 8024E9F4 ISFS_CreateDir; creates new Directory in NAND. 5 args. r3 = Pointer to name of new Directory that will be made. r4 = 0, r5 = 3, r6 = 3, r7 = 3. Will return r3 as 0 if success. Negative value is an error. However -105 means the Directory already exists. But... Dolphin will return 0 instead of -105. 8024EAE8 ISFS_CreateDirAsync 8024EBDC ISFS_ReadDir 8024ED30 ISFS_ReadDirAsync 8024EE78 ISFS_GetAttr 8024EFD0 ISFS_GetAttrAsync 8024F104 ISFS_Delete; Deletes a NAND file or directory (recursively). r3 = Pointer to file/directory path. r3 returns as 0 for success. Negative number = failure. 8024F1DC ISFS_DeleteAsync 8024F2AC ISFS_RenameAsync 8024F3D0 ISFS_CreateFile; Creates new file on NAND. Directory location must already exist. Same exact args and return values as ISFS_CreateDirectory. Dolphin Bug for -105 does NOT exist for ISFS_CreateFile! 8024F4C4 ISFS_CreateFileAsync 8024F5B8 ISFS_Open; Open a NAND file for read/write. 2 args. r3 = pointer to ascii file name. r4 = permissions (1 = read, 2 = write). r3 will return the File Descriptor (fd) value. If failure, r3 is negative. 8024F680 ISFS_OpenAsync 8024F738 ISFS_GetFileStatsAsync 8024F7F4 ISFS_SeekAsync 8024F880 ISFS_Read; Dumps a NAND file's contents to memory. 3 args. r3 = fd. r4 = Pointer to Dump contents to. r5 = Amount of bytes to dump. r3 will return the amount of bytes that were sucessfully dumped. Negative number = failure. r4 arg MUST be 32-byte aligned. 8024F8A0 ISFS_ReadAsync 8024F944 ISFS_Write; Writes over a NAND files contents with what's in memory. r3 = fd. r4 = Pointer to new Contents. r5 = Amount of bytes to write. r3 will return the amount of bytes that were successfully written. Negative number = failure. r4 arg MUST be 32-byte aligned. 8024F964 ISFS_WriteAsync 8024FA08 ISFS_Close; simply branches over to IOS_Close. Closes an open NAND file. r3 = fd. Will return 0 in r3 if success. Negative number = failure. 8024FA0C ISFS_CloseAsync 8024FBA4 strnlen 802502E0 IOS_OpenAsync 802503F8 IOS_Open 80250518 IOS_CloseAsync 802505D8 IOS_Close Closes an open file. r3 = fd. Will return 0 in r3 if success. Negative number = failure. 80250680 IOS_ReadAsync 80250780 IOS_Read 80250888 IOS_WriteAsync 80250988 IOS_Write 80250A90 IOS_SeekAsync 80250B70 IOS_IoctlAsync 80250CA8 IOS_Ioctl 80250DD8 _ios_ioctlv 80250F14 IOS_IoctlvAsync 80250FF8 IOS_Ioctlv 802514F0 iosAllocAligned 802514F4 iosFree ----- Memory Map NTSC-U (from observation of a handful of tests, it appears the data at these addreeses never move. It's very possible that the data listed below is dynamic and may not be at these addresses!) 90E51760 (0x13B00 size) = Data Save (view the data save map for much more detail) 90F920A4 = Distance between 1P & COM. Does not work on 1P vs 2P mode. Only Duel of 1P vs COM. Character and Camera Stuff~~ Long, Lat, and Drill stuff uses -0,0 as starting point, with -Pi,Pi as 180 degrees 'rotated'. Non-mod = no effect when manually overwritting on Dolphin-memory-engine Semi-mod = temp effect when manually overwriting on Dolphin-memory-engine Fully-mod = manual overwrites via Dolphin-memory-engine take effect in game Non-True (for Char XYZ) the Y is different output value, sort of like a value that doesn't factor in constantly adjusting mid-air movements. There's more to it than that it appears, but I don't know tbh. P1 Character Long Rotation, Lat Rotation, 'Drill' Spin (long/lat semi mod while drill spin is full mod) 90F91F70, 90F91F74, 90F91F78 P1 Character XYZ Coord (fully mod) 90F91F80, 90F91F84, 90F91F88 P1 Camera XYZ Coord (semi-mod) 92331C80, 92331C84, 92331C88 P1 Camera Long Rotation, Lat Rotation, 'Drill' Spin (semi-mod) 92331CA0, 92331CA4, 92331CA8 P1 Character Non-True XYZ Coord (non-mod) 92331CB0, 92331CB4, 92331CB8 P2 Character Long Rotation, Lat Rotation, 'Drill' Spin (long/lat semi mod while drill spin is full mod) 90F93600, 90F93604, 90F93608 P2 Character XYZ Coord (fully mod) 90F93610, 90F93614, 90F93618 P2 Camera XYZ Coord (semi-mod) 92333D20, 92333D24, 92333D28 P2 Camera Long Rotation, Lat Rotation, 'Drill' Spin (semi-mod) 92333D40, 92333D44, 92333D48 P2 Character Non-True XYZ Coord (non-mod) 92333D50, 92333D54, 92333D58 Note for Character XYZ: There are a bunch of other places where the players' XYZs are listed. Also there is 90FF2100 (P1) that is updated before 90F91F80, but you cannot freely modify it on Dolphin-memory-engine. 90F91F80 is the most important when it comes to making codes for XYZ type stuff. Next group of addresses only when World Tour is being played 90F93038 (Word) = Always 1? 90F9303C (Word) = While loading bracket, goes from 0x34 to 0x38 to 0x66 to 0x00 90F93048 (Word) = P1 starting bracket pair (0x00 and up; thus highest can be 0x07) 90F93054 (Single Float) = Y Coordinate of bracket viewing screen. Anything from 0 to -512. 0 = far left, -512 = far right. 90F93058 (Word) = Some frame counter? Never appears for basic World Martial Arts Tournament level. 90F9305C (Word) = Some frame counter? Not in sync w/ above one. Only appears for Yamcha games? 90F93060 (Word) = Some frame counter? Not in sync w/ abobe two. Doesn't appear in Yamcha games. 90F93064 (Word) = Some unknown bit flags. Only appears in Yamcha games. 90F93068 = Start of Bracket Player 1's structure (increment by 0x28 to move onto next Player). Max is 17. Final Opponent always listed last. Structure Breakdown on Player in World Tour~ 0x0 (Word) Bit 13 = Final Opponent (only one player can have this bit high) Bit 15 = Human (1P/2P/3P, etc etc) 0x4 (Word) = Character Hex Value 0x8 (Word) = Always Null? 0xC (Word) = 0x1 = 2P, 2 = 3P, 3 = 4P, 4 = 5P, 5 = 6P, 6 = 7P, 7 = 8P 0x10 (Word) = Slot in bracket (starts as 0x0; final opponent's value is always 0x1E) 0x14 thru 0x27 = Always Null? 90F932E8 = Start of Bracket Player 17's/Final Opponent's structure. Following is for Menu selection~ 912B4380 = Map+Music+Character Writeup Table for Ultimate Training 912BDB80 = Map+Music+Character Writeup Table for Single Battle 912BDFD0 = Map+Music+Character Writeup Table for Team & DP 916931D0 = Map+Music+Character Lookup Table for Ultimate Training 9169C9D0 = Map+Music+Character Lookup Table for Single Battle 9169CE30 = Map+Music+Character Lookup Table for Team & DP Ki stuff~ 923330E0 (word) = P1 Current Ki Amount within blast cycle (limit is 5) 923330E4 (word) = P1 Ki Cooldown Timer (starts at 0x1E) 92335180 (word) = P2 Current Ki Amount within cycle (limit is 5) 92335184 (word) = P2 Ki Cooldown Timer (starts at 0x1E) 9233D3C0 (word) = Stretch/Squeeze Screen Vertically KIXYZStructure Map (get the GeometryPointer from GetGeometryPointer or __GetGeometryPointer and then use the r3 return value as the r3 arg to call GetKIXYZStructPointer. r3 will return the pointer to this structure~ 0x0 (single float) = Ki Blast Start Position X 0x4 (single float) = KI Blast Start Position Y 0x8 (single float) = Ki Blast Start Position Z 0xC (single float) = 1 0x10 (single float) = Current Ki Blast Location X 0x14 (single float) = Current Ki Blast Location Y 0x18 (single float) = Current Ki Blast Location Z 0x1C (single float) = 1 0x20 (single float) = Copy of 0x10 but lags? 0x24 (single float) = Copy of 0x14 but lags? 0x28 (single float) = Copy of 0x18 but lags? 0x2C (single float) = 1 (copy of 0x1C?) 0x30 (single float) = Current Longitude Direction/Angle?? Something with the direction/angle of trajectory 0x34 (single float) = Current Latitude Direction/Angle?? Something with the direction/angle of trajectory 0x38 (single float) = Current 'Drill-type' Direction/Angle?? Something with the direction/angle of trajectory 0x3C = Null 0x40 (single float) = Something with the direction/angle of trajectory 0x44 (single float) = Something with the direction/angle of trajectory 0x48 (single float) = Something with the direction/angle of trajectory 0x4C = Null 0x50 (signed halfword) = Slot; game always loads it as a signed halfword, huh? 0x52 (signed halfword) = Slot; game always loads it as a signed halfword, huh? Rest (and size) of structure is unknown Screen stuff~ 9233D3D4 (word) = Stretch/Squeeze Screen Horizontally Timer stuff~ 923421EE (Halfword) = In-Game Timer (modding this doesn't effect Real Timer, only what appears in the Game) 923421F2 (Halfword) = In-Game Timer (modding this doesn't effect Real Timer, only what appears in the Game) 92344B48 (Word) = Frame Count of Match 92344B4E (Halfword) = Real Timer Minutes 92344B50 (Halfword) = Real Timer Seconds 92344B52 (Halfword) = Real Timer Milliseconds 92344B54 (Halfword) = In-Game Timer (modding this doesn't effect Real Timer, only what appears in the Game) 92344B58 (Word) = Frame Count of Match 92344B5E (Halfword) = Real Timer Minutes 92344B60 (Halfword) = Real Timer Seconds 92344B62 (Halfword) = Real Timer Milliseconds Other memory stuff: MasterPointer + 0xC = Slot of Player MasterPointer + 0x10 (quadword) = X coordinate, Y coordinate, Z coordinate, float value 1.0. These XYZ coordinates cannot be modified. MasterPointer + 0xA8 = XY speed (seems to be but the max speed appears to be far too low) MasterPointer + 0xAC = Z speed? (seems to be but the max speed appears to be far too low) ----- Various Structures -Map+Music+Character Selection Lookup Table Scructure- NOTE: This structure is for character, map, and music selection in the game. The game uses this structure as a lookup table before modifying the writeup table. How to get Pointer~ Single Battle or Ultimate Training: lwz rX, -0x6C48 (r13) lwz rX, 0x3804 (rX) #Note: Do a load offset of 0x0560 to get exact pointer to the Character portion of Lookup Table Team or DP: lwz rX, -0x6B50 (r13) lwz rX, 0x3C5C (rX) #Note: Do a load offset of 0x09B0 to get exact pointer to the Character portion of Lookup Table Lookup Table Layout: 0x0 = Map 1 of Row 1 0x4 = Map 2 of Row 1 0x8 = Map 3 .. .. 0x14 = Map 6 of Row 1 0x18 = Map 1 of Row 2 .. .. 0x2C = Map 6 of Row 2 .. .. 0x8C = Map 6 of Row 6 (final row) 0x90 thru 0xAF = Always null? (space?) 0xB0 = Music 1 (0x00 aka Meteor) 0xB4 = Music 2 .. .. 0xFC = Music 19 (0x13) NOTE The Music Hex Value for Random (0x14) is not present in the Lookup Table??? 0x100 thru 0x3E3 = Unknown, some null and some byte values 0x3C0 = Character 1 of Row 1 0x3C4 = Amount of Sub Characters of Character 1 (aka transformations minus 1) 0x3C8 = Sub Character 1 of Character 1 0x3CC = Sub Character 2 of Character 1 0x3D0 = Sub 3 of 1 0x3D4 = Sub 4 of 1 0x3D8 = Sub 5 of 1 0x3DC = Sub 6 (max) of 1 0x3E0 = Character 2 of Row 1 .. .. 0x1164 = Always 0xA1 (Random) 0x1168 = Always Null (zero sub characters for Random character ofc) 0x116C = Always 0xA1 (sub character 1 of Random ofc) 0x1170 thru 0x1187 = Always Null ofc because no extra sub chars for Random ofc 0x1188 = Always 0xA3 (Password character) 0x118C = Always Null (zero sub characters for pw char ofc) 0x1190 = Always 0xA3 (sub char 1 of pw char) 0x1194 thru 0x11AF = Always Null ofc because no extra sub chars for pw char -Map+Music+Character Writeup Table- NOTE: This structure is for character, map, and music selection in the game. Values here are directly outputted to the game. How to get Pointer~ Single or Ultimate Training: lwz rX, -0x6C48 (r13) lwz rX, 0x0554 (rX) #Note: The Writeup pointer is not available til once you get to the Character Selection! Team or DP: lwz rX, -0x6B50 (r13) lwz rX, 0x09A4 (rX) #Note: The Writeup pointer is not available til once you get to the Character Selection! 0x0 = Column of Map Selection Menu 0x4 = Row of Map Selection Menu 0x8 = Map 1 of current Row (what you're viewing live in the game) 0xC = Map 2 .. .. 0x1C = Map 6 0x20 = Map 1 of most recent row that you were previously on 0x24 = Map 2 .. .. 0x34 = Map 6 0x38 = Always null? 0x3C = Map currently selected 0x40 = ??? 0x44 = ??? 0x48 = Always null? 0x4C = Music currently selected 0x50 = Always null? 0x54 = unk pointer 0x58 = unk byte 0x5C = unk byte 0x60 = unk pointer 0x64 = unk pointer 0x68 = unk byte 0x6C = unk byte Following values are for 1P only 0x70 = Character 1 of Row 1 0x74 = Amount of sub characters for Character 1 (aka transformations minus 1) 0x78 = Sub Char 1 for Char 1 .. .. 0x90 = Sub Char 6 of Char 1 0x94 = Character 2 of Row 1 .. .. Following values are for 2P/COM only 0x17A4 = Character 1 of Row 1 .. .. -Player Health & Energy struct (aka RealHealthPointer)- Note: to get pointer for this structure, call GetMasterPointer, then call GetRealHealthPointer. Be sure to add in a r3 check after GetMasterPointer against the value of 0. If 0 is returned, then an error occurred. However you may just have to call the function again the next time your Code's Hook Address gets executed. Offsets (all signed word values). 0x0 = Real Health; the actual health of the player. There is a different memory spot for in-game display health amount. Upper bound is 0x7FFFFFFF. 0x4 = Real Health Limit; the health the player started the match with. Upper bound is 0x7FFFFFFF. 0x8 = ???; seems to always be null. 0xC = Ki; The 5 bar element directly underneath Health bar. Upper bound is 0x7FFFFFFF. 0x10 = Ki Limit; The highest value you can charge your Ki to. Upper bound is 0x7FFFFFFF. 0x14 = Blast Stocks; (The bar that increments the Number count; sits directly underneath player avatar). Upper bound is 0x000AAE60. 0x18 = Blast Stocks Limit; The highest value your Blast Stocks can be at. Upper bound is 0x000AAE60. 0x1C = Max Power Charge; The blue bar that fills up in Ki's location once Ki limit has been reached & Blast Stocks are at least 100,000. Upper bound is 0x7FFFFFFF. 0x20 = ???; is used and read by Game, idk what this is. Appears to be always be null??? 0x60 = Amount of Past Taunts; when a player has done a taunt (from being idle too long) the value here is loaded then incremented by 1 and restored. Load and stores done as a word value. Checks on this value are signed like everything else in the Structure above. Upper bound 0x7FFFFFFF. Note: If needed, you can always manually calculate the RealHealthPointer of 1P or 2P/COM in Duel Mode by just doing the simple equation of Master Pointer + 0x1480. This won't work for Team/DP though. If you use this on Team/DP, it will only point to 1st Team Member's Real Health. You can use the following to quickly nav to Char stuff when said Char is Slot 0 within Team. MP + 0x1480 = Real Health MP + 0x1484 = Real Health Limit MP + 0x1488 = Always null? MP + 0x148C = Ki MP + 0x1490 = Ki Limit MP + 0x1494 = Blast Stocks MP + 0x1498 = Black Stocks Limit MP + 0x149C = Max Power Other stuff. MP + 0x143C = Current Fighter's Slot Within Team MP + 0x1774 = Same as above MP + 0x1778 = Current Fighter's Character ID MP + 0x177C = unk word MP + 0x1780 = unk word (this gets copied from what is at Current Fighter's Health Ptr + 0x20.