Graphical Speed/MTC/Air/Boost Meter [Vega] - Printable Version +- Mario Kart Wii Gecko Codes, Cheats, & Hacks (https://mariokartwii.com) +-- Forum: Cheat Codes (https://mariokartwii.com/forumdisplay.php?fid=51) +--- Forum: Time Trials & Battle (https://mariokartwii.com/forumdisplay.php?fid=54) +--- Thread: Graphical Speed/MTC/Air/Boost Meter [Vega] (/showthread.php?tid=1112) |
Graphical Speed/MTC/Air/Boost Meter [Vega] - Vega - 03-23-2019 Graphical Speed/MTC/Air/Boost Meter [Vega] NOTE: It's recommended to also include this code to eliminate frame flickers -> https://mkwii.com/showthread.php?tid=1530 Shout outs to Star & RiiDefi for Draw Text To Screen Code! This code will display your vehicle speed, air time, mini turbo charge, and shroom/zipper boost as its own graphical image at the bottom of your screen only during the race/battle. The image will not appear if you are not in a race/battle. Works everywhere. NOTE: This code makes use of the following memory addresses... 0x80001660 thru 0x80001663 0x815F0000 thru 0x815F0003 Make sure no other codes in your GCT/Cheat-Manager are using those addresses. NTSC-U C200A3F0 00000007 9421FF80 BC610008 806DA358 80630044 80630000 3D808002 618C23E0 7D8803A6 4E800021 B8610008 38210080 80010014 60000000 00000000 C2009640 00000017 3D80815F 818C0000 2C0C0000 418200A0 9421FF70 D8210008 BC610010 3D808000 816C1660 C02B0024 FC200A10 4CC63242 A10B021A A12B0110 A0EB0100 2C070000 40820008 A0EB00FE 4800002D 25332E30 66206B6D 2F682C20 25336420 4D54432C 20253364 20416972 2C202533 64204273 74000000 7CC802A6 38600009 388000DC 38A00001 3FE08002 63EC1DF0 7D8803A6 4E800021 63EC1DD0 7D8803A6 4E800021 B8610010 C8210008 38210090 81830000 60000000 00000000 C27E4C9C 00000007 3D80809C 818CD110 818C0020 540B103A 7D8C582E 818C0010 818C0010 3D608000 918B1660 3D80815F 93EC0000 807FEE20 60000000 00000000 PAL C200A430 00000007 9421FF80 BC610008 806DA360 80630044 80630000 3D808002 618C2480 7D8803A6 4E800021 B8610008 38210080 80010014 60000000 00000000 C2009680 00000017 3D80815F 818C0000 2C0C0000 418200A0 9421FF70 D8210008 BC610010 3D808000 816C1660 C02B0024 FC200A10 4CC63242 A10B021A A12B0110 A0EB0100 2C070000 40820008 A0EB00FE 4800002D 25332E30 66206B6D 2F682C20 25336420 4D54432C 20253364 20416972 2C202533 64204273 74000000 7CC802A6 38600009 388000DC 38A00001 3FE08002 63EC1E90 7D8803A6 4E800021 63EC1E70 7D8803A6 4E800021 B8610010 C8210008 38210090 81830000 60000000 00000000 C27EEFAC 00000007 3D80809C 818C18F8 818C0020 540B103A 7D8C582E 818C0010 818C0010 3D608000 918B1660 3D80815F 93EC0000 807F3618 60000000 00000000 NTSC-J C200A38C 00000007 9421FF80 BC610008 806DA360 80630044 80630000 3D808002 618C23A0 7D8803A6 4E800021 B8610008 38210080 80010014 60000000 00000000 C20095DC 00000017 3D80815F 818C0000 2C0C0000 418200A0 9421FF70 D8210008 BC610010 3D808000 816C1660 C02B0024 FC200A10 4CC63242 A10B021A A12B0110 A0EB0100 2C070000 40820008 A0EB00FE 4800002D 25332E30 66206B6D 2F682C20 25336420 4D54432C 20253364 20416972 2C202533 64204273 74000000 7CC802A6 38600009 388000DC 38A00001 3FE08002 63EC1DB0 7D8803A6 4E800021 63EC1D90 7D8803A6 4E800021 B8610010 C8210008 38210090 81830000 60000000 00000000 C27EE618 00000007 3D80809C 818C0958 818C0020 540B103A 7D8C582E 818C0010 818C0010 3D608000 918B1660 3D80815F 93EC0000 807F2678 60000000 00000000 NTSC-K C200A538 00000007 9421FF80 BC610008 806DA380 80630044 80630000 3D808002 618C24E0 7D8803A6 4E800021 B8610008 38210080 80010014 60000000 00000000 C2009788 00000017 3D80815F 818C0000 2C0C0000 418200A0 9421FF70 D8210008 BC610010 3D808000 816C1660 C02B0024 FC200A10 4CC63242 A10B021A A12B0110 A0EB0100 2C070000 40820008 A0EB00FE 4800002D 25332E30 66206B6D 2F682C20 25336420 4D54432C 20253364 20416972 2C202533 64204273 74000000 7CC802A6 38600009 388000DC 38A00001 3FE08002 63EC1EF0 7D8803A6 4E800021 63EC1ED0 7D8803A6 4E800021 B8610010 C8210008 38210090 81830000 60000000 00000000 C27DD36C 00000007 3D80809B 818CFF38 818C0020 540B103A 7D8C582E 818C0010 818C0010 3D608000 918B1660 3D80815F 93EC0000 807F1C58 60000000 00000000 List of Sources: 1st ASM (When Game loads StaticR.rel, Get Render Mode & Call Direct Print Setup Frame Buffer) #~~~~~~~~~~~~~~~~# # START ASSEMBLY # #~~~~~~~~~~~~~~~~# # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Register Notes: # # No need to backup r0 or LR # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #~~~~~~~~~~~~~~~~~~~~~# # Macros & Statements # #~~~~~~~~~~~~~~~~~~~~~# .macro push_stack stwu r1, -0x80 (r1) stmw r3, 0x8 (r1) .endm .macro pop_stack lmw r3, 0x8 (r1) addi r1, r1, 0x80 .endm .macro call_link address lis r12, \address@h ori r12, r12, \address@l mtlr r12 blrl .endm .macro default_instruction lwz r0, 0x0014 (r1) .endm .set region, '' #Must set region value, or else source will not compile .if (region == 'E' || region == 'e') # RMCE .set nw4r_db_DirectPrint_SetupFB, 0x800223E0 .elseif (region == 'P' || region == 'p') # RMCP .set nw4r_db_DirectPrint_SetupFB, 0x80022480 .elseif (region == 'J' || region == 'j') # RMCJ .set nw4r_db_DirectPrint_SetupFB, 0x800223A0 .elseif (region == 'K' || region == 'k') # RMCK .set nw4r_db_DirectPrint_SetupFB, 0x800224E0 .else # Invalid Region .abort .endif #~~~~~~~~~~~~~~~~~~~~~~~# # Start Register Safety # #~~~~~~~~~~~~~~~~~~~~~~~# push_stack #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Get Render Mode (RKSystem->mpVideo()->pRenderMode) # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# .if (region == 'E' || region == 'e') # RMCE lwz r3, -0x5CA8(r13) .elseif (region == 'P' || region == 'p') # RMCP lwz r3, -0x5CA0(r13) .elseif (region == 'J' || region == 'j') # RMCJ lwz r3, -0x5CA0(r13) .elseif (region == 'K' || region == 'k') # RMCK lwz r3, -0x5C80(r13) .endif lwz r3, 0x0044(r3) lwz r3, 0x0 (r3) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Call nw4r::db: DirectPrint_SetupFB # # r3 = Render Mode # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# call_link nw4r_db_DirectPrint_SetupFB #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # End Register Safety; Default Instruction # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# pop_stack default_instruction # #~~~~~~~~~~~~~~# # END ASSEMBLY # #~~~~~~~~~~~~~~# ========== 2nd ASM (Take Float Speed, Convert It, Draw it to Screen) #~~~~~~~~~~~~~~~~# # START ASSEMBLY # #~~~~~~~~~~~~~~~~# # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Register Notes: # # No need to backup r0 or LR # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Mem Address Notes: # # 0x80001660 Speed Float Word # # 0x815F0000 "Status Word" If not zero, Draw Code will execute, auto clears after every race # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #~~~~~~~~~~~~~~~~~~~~~# # Macros & Statements # #~~~~~~~~~~~~~~~~~~~~~# .macro push_stack stwu r1, -0x90 (r1) stfd f1, 0x8 (r1) stmw r3, 0x10 (r1) .endm .macro pop_stack lmw r3, 0x10 (r1) lfd f1, 0x8 (r1) addi r1, r1, 0x90 .endm .macro call_nw4r address ori r12, r31, \address@l mtlr r12 blrl .endm .macro default_instruction lwz r12, 0x0 (r3) .endm .set region, '' #Must set region value, or else source will not compile .if (region == 'E' || region == 'e') # RMCE .set nw4r_db_DirectPrint_Printf, 0x1DF0 .set nw4r_db_DirectPrint_StoreCache, 0x1DD0 .elseif (region == 'P' || region == 'p') # RMCP .set nw4r_db_DirectPrint_Printf, 0x1E90 .set nw4r_db_DirectPrint_StoreCache, 0x1E70 .elseif (region == 'J' || region == 'j') # RMCJ .set nw4r_db_DirectPrint_Printf, 0x1DB0 .set nw4r_db_DirectPrint_StoreCache, 0x1D90 .elseif (region == 'K' || region == 'k') # RMCK .set nw4r_db_DirectPrint_Printf, 0x1EF0 .set nw4r_db_DirectPrint_StoreCache, 0x1ED0 .else # Invalid Region .err .endif .set _speed, 0x24 #Speed Float .set _mtc, 0xFE #MT Charge .set _omtc, 0x100 #Kart Only Orange MT Charge .set _mushb, 0x110 #Mushroom Boost .set _air, 0x21A #Air Time #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Check to See if a Race is Active: # # Load Status Word from Mem 81 # # If not zero, we know to execute the Draw Code # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# lis r12, 0x815F lwz r12, 0x0 (r12) cmpwi r12, 0x0 beq- dont_execute #~~~~~~~~~~~~~~~~~~~~~~~# # Start Register Safety # #~~~~~~~~~~~~~~~~~~~~~~~# push_stack #~~~~~~~~~~~~~~~~~~~~~~~~~~# # Load Pointer, Load Float # #~~~~~~~~~~~~~~~~~~~~~~~~~~# lis r12, 0x8000 #Set 1st half address of Exception Vector Area lwz r11, 0x1660 (r12) #Load the Pointer lfs f1, _speed (r11) #Load the Single Float into FPR 1 for first float format arg of DirectPrint Printf fabs f1, f1 #Handle negative values crset 4*cr1+eq #Set the Condition Register before the Float Arg is used in DirectPrint Printf #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Load MTC, Air, MTB into appropriate DirectPrintf registers # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# lhz r8, _air (r11) #Set 2nd GPR format arg lhz r9, _mushb (r11) #Set 3rd GPR format arg #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Load MT, do Orange MT Check Calc # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# lhz r7, _omtc (r11) #First Load the Orange MT value cmpwi r7, 0x0 bne- skip_blue #If not zero, we don't need to read Blue MT, follow skip_blue branch lhz r7, _mtc (r11) #If zero, read Blue MT instead of Orange MT skip_blue: #1st GPR format arg is set #~~~~~~~~~~~~~~~~~~~~~# # Create ASCii String # #~~~~~~~~~~~~~~~~~~~~~# bl the_string #Create the C++ string .llong 0x25332E3066206B6D #Hex for "%3.0f km/h, %3d MTC, %3d Air, %3d Bst" .llong 0x2F682C2025336420 .llong 0x4D54432C20253364 .llong 0x204169722C202533 .llong 0x6420427374000000 the_string: mflr r6 #Move C++ string's address location to r4, r5 thru r8 arguments already set #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # DirectPrint Printf & Store Cache # # Purpose: Draw on Screen # # r3 = X coordinate (starts far left) # # r4 = Y coordinate (starts at very top) # # r5 = 0 No Wrap; 1 Wrap # # r6 = Address Pointer to String that will be Drawn on Screen # # r7 thru r10 printf format args # # f1 thru f13 printf float format args # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# li r3, 0x9 li r4, 0xDC li r5, 0x1 lis r31, 0x8002 #For nw4r macro call_nw4r nw4r_db_DirectPrint_Printf call_nw4r nw4r_db_DirectPrint_StoreCache #~~~~~~~~~~~~~~~~~~~~~# # End Register Safety # #~~~~~~~~~~~~~~~~~~~~~# pop_stack #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # dont_execute label; Default Instruction # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# dont_execute: default_instruction # #~~~~~~~~~~~~~~# # END ASSEMBLY # #~~~~~~~~~~~~~~# ========== 3rd ASM (Store Memory Pointer) #~~~~~~~~~~~~~~~~# # START ASSEMBLY # #~~~~~~~~~~~~~~~~# #~~~~~~~~~~~~~~~~~~~~~# # Macros & Statements # #~~~~~~~~~~~~~~~~~~~~~# .set region, '' #Must set region value, or else source will not compile .if (region == 'E' || region == 'e') # RMCE .macro default_instruction lwz r3, -0x11E0 (r31) .endm .macro set_playerbase lis r12, 0x809C lwz r12, 0xFFFFD110 (r12) .endm .elseif (region == 'P' || region == 'p') # RMCP .macro default_instruction lwz r3, 0x3618 (r31) .endm .macro set_playerbase lis r12, 0x809C lwz r12, 0x18F8 (r12) .endm .elseif (region == 'J' || region == 'j') # RMCJ .macro default_instruction lwz r3, 0x2678 (r31) .endm .macro set_playerbase lis r12, 0x809C lwz r12, 0x0958 (r12) .endm .elseif (region == 'K' || region == 'k') # RMCK .macro default_instruction lwz r3, 0x1C58 (r31) .endm .macro set_playerbase lis r12, 0x809B lwz r12, 0xFFFFFF38 (r12) .endm .else # Invalid Region .abort .endif #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Set Region-Specific Player-Base # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# set_playerbase #~~~~~~~~~~~~~~~~~~~~~~~# # Pointer Level Loading # #~~~~~~~~~~~~~~~~~~~~~~~# lwz r12, 0x0020 (r12) #Load Word from 1st Level Pointer slwi r11, r0, 2 #Shift the bits of r0 by 2 to the left, result in r11. This is the same as multiplying by 0x4. r0 is current player slot. lwzx r12, r12, r11 #Load into 2nd Level Pointer lwz r12, 0x0010(r12) #Load into 3rd Level Pointer lwz r12, 0x0010(r12) #Load into 4th Level Pointer #~~~~~~~~~~~~~~~~~~~~~# # Store Final Pointer # #~~~~~~~~~~~~~~~~~~~~~# lis r11, 0x8000 #Set up 1st Half Address of Exception Vector Area stw r12, 0x1660 (r11) #Store Pointer Address to 0x80001660 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Set Status Word in Mem81 for Draw Text ASM # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# lis r12, 0x815F #Set up 1st Half Address of dynmaic Mem81 stw r31, 0x0 (r12) #Store r31 to 0x815F0000, we simply need a value not zero to be stored here. This will make the Speed Bar ASM only trigger during races. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Default Instruction; Region-Specific # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# default_instruction # #~~~~~~~~~~~~~~# # END ASSEMBLY # #~~~~~~~~~~~~~~# Code creator: Vega Code credits: Star & RiiDefi (Draw Text To Screen Code); SwareJonge (Universal Meter code); Chadderz (source fixes to Mdmwii's OG Speed source); Mdmwii (original Speed-O-Meter) |