From 90de6f0edb1c34dbf5eff4ff59679feef47be2c1 Mon Sep 17 00:00:00 2001 From: Matteias Collet Date: Sat, 24 Jul 2021 08:55:18 +0200 Subject: [PATCH] add cheat tables and memory map --- .gitattributes | 3 + Readme.md | 6 + docs/Reserved_Memory.xlsx | Bin 0 -> 11142 bytes docs/reserved_memory.png | Bin 0 -> 20711 bytes utils/2_Byte_Big_Endian.CEA | 82 +++++++ utils/4_Byte_Big_Endian.CEA | 82 +++++++ utils/Sunshine.CT | 462 ++++++++++++++++++++++++++++++++++++ 7 files changed, 635 insertions(+) create mode 100644 docs/Reserved_Memory.xlsx create mode 100644 docs/reserved_memory.png create mode 100644 utils/2_Byte_Big_Endian.CEA create mode 100644 utils/4_Byte_Big_Endian.CEA create mode 100644 utils/Sunshine.CT diff --git a/.gitattributes b/.gitattributes index 937de2b..c4403ff 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,6 +10,8 @@ *.vue text eol=crlf *.xml text eol=crlf linguist-detectable *.yml text eol=crlf +*.ct text eol=crlf +*.CEA text eol=crlf # Special files .dockerignore text eol=crlf @@ -20,3 +22,4 @@ LICENSE text eol=crlf *.jpg binary *.png binary *.zip binary +*.xslx binary diff --git a/Readme.md b/Readme.md index 5802818..f903bfd 100644 --- a/Readme.md +++ b/Readme.md @@ -23,6 +23,12 @@ The codes are stored in the `Codes.xml` file. If you want to add or change codes When adding new codes keep in mind that the English title/description are mandatory. +#### Reserved Memory + +Some codes store some states in the games memory starting from address 0x81F70000. To avoid collisions use a memory range in the unallocated ranges: + +![](./docs/reserved_memory.png) + ### Adding translations 1. Create a new file `.json` in `site/.vuepress/i18n`, where `` is the language code you want to add. Copy the contents of `en-US.json` into your file and translate each entry in the JSON file. diff --git a/docs/Reserved_Memory.xlsx b/docs/Reserved_Memory.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4134ba28bfbd6e634c64a225575145c9368db965 GIT binary patch literal 11142 zcmeHtgR;S3_nm2Yb>&CslneX*fC`}OG$5yxi zg&t+!N(H|w*N&}Ch~~=2MLs=+nW~3XY+5v9wk3Zir^4o{L*Ur$I#=EoFN+Y7plYYz z`3P}0e<(EAtp}k%=ZlLETgfG9U)7GZO&Y?~DDchAui#g>cmJYL8wYlz|MDAc{ z5;Nbh+8U2vf<)A&9K6(lodk&^3?8+b4fCAT>NN}t#Y)Ri6FWlBqL-h^p$u+I?q+3! zyYY8{;E9A7t$dZ48qa3it$4(XOxKGe&Vk~JNTwluz>)F|{F4_h!0*b5@!bVZ(D)u{ z9$Ny?yZsHEYZ$7{3fOAPG1?`eYX!s}Jn&MR2j>juAq6FFnwK{|XAvyj(-bGMlK%<` zDhTOF!o_<2I)?DBYzbv0w@{2^Jq?IL@C3ry^D`uv>OWvwufCAe|z=vBqfy|R-~{~+3(>4H!~{>j`5sW<;AiLh+ERROV6rgDEtO!fLf8`EKPwkQ>{i^(1FPg{9 z)y#FKjJ!9kM|(VdSyO3&!r&T(^b}CC8g-mm2Ol1zm@o`mC^JaEUrBG(?6wkoMqJ~# zBCM*BC;uRMJUehMtz;irB!W-zXfhLPz}3uZq0(=_p6u!lUrWQ9&!);O&xN1d+t|Xs z^FlJa1LM(;NjYagotzW>mVI323swGApne@Ea5&eymj}M5Y~XA#IGUt%6=bpg6C`w` z{CGByU|?n-)Aj;1GhX&Ao=z@yW=>9aKkQh!mV;BaAm-zf?8A$QQ_K+quvBHL*Lm{C zn)P}Q#p>I^blPAXOPn7*KHeB6Co~Lm0#?Y)HgQmPmwhYwp4uDC zvC7}An3o3{Zb|3ciEmW)A|J|@i(nK43g2C>0i%H1kmd@=VEkx@^(p=qS%sx?(S2x# zaYfPG3{@`yh(;p$Y-%# zjE1jZLJ6{CGe&7wt7?FafL&C*6AV7kH;}Z7C)&I%0AH}%vav%+e-UUQX0GBCT->fx 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 b8Tr=uI#qpsTo4?P6K-)txY(B3V1M`v!k`Nd literal 0 HcmV?d00001 diff --git a/utils/2_Byte_Big_Endian.CEA b/utils/2_Byte_Big_Endian.CEA new file mode 100644 index 0000000..1e633fe --- /dev/null +++ b/utils/2_Byte_Big_Endian.CEA @@ -0,0 +1,82 @@ +alloc(TypeName,256) +alloc(ByteSize,4) +alloc(ConvertRoutine,1024) +alloc(ConvertBackRoutine,1024) + +TypeName: +db '2 Byte Big Endian',0 + +ByteSize: +dd 2 + +//The convert routine should hold a routine that converts the data to an integer (in eax) +//function declared as: stdcall int ConvertRoutine(unsigned char *input); +//Note: Keep in mind that this routine can be called by multiple threads at the same time. +ConvertRoutine: +//jmp dllname.functionname +[64-bit] +//or manual: +//parameters: (64-bit) +//rcx=address of input +xor eax,eax +mov ax,[rcx] //eax now contains the bytes 'input' pointed to +xchg ah,al //convert to big endian + +ret +[/64-bit] + +[32-bit] +//jmp dllname.functionname +//or manual: +//parameters: (32-bit) +push ebp +mov ebp,esp +//[ebp+8]=input +//example: +mov eax,[ebp+8] //place the address that contains the bytes into eax +mov ax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value +and eax,ffff //cleanup +xchg ah,al //convert to big endian + +pop ebp +ret 4 +[/32-bit] + +//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value) +//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output); +ConvertBackRoutine: +//jmp dllname.functionname +//or manual: +[64-bit] +//parameters: (64-bit) +//ecx=input +//rdx=address of output +//example: +xchg ch,cl //convert the little endian input into a big endian input +mov [rdx],cx //place the integer the 4 bytes pointed to by rdx + +ret +[/64-bit] + +[32-bit] +//parameters: (32-bit) +push ebp +mov ebp,esp +//[ebp+8]=input +//[ebp+c]=address of output +//example: +push eax +push ebx +mov eax,[ebp+8] //load the value into eax +mov ebx,[ebp+c] //load the address into ebx + +//convert the value to big endian +xchg ah,al + +mov [ebx],ax //write the value into the address +pop ebx +pop eax + +pop ebp +ret 8 +[/32-bit] diff --git a/utils/4_Byte_Big_Endian.CEA b/utils/4_Byte_Big_Endian.CEA new file mode 100644 index 0000000..dc8f294 --- /dev/null +++ b/utils/4_Byte_Big_Endian.CEA @@ -0,0 +1,82 @@ +alloc(TypeName,256) +alloc(ByteSize,4) +alloc(ConvertRoutine,1024) +alloc(ConvertBackRoutine,1024) + +TypeName: +db '4 Byte Big Endian',0 + +ByteSize: +dd 4 + +//The convert routine should hold a routine that converts the data to an integer (in eax) +//function declared as: stdcall int ConvertRoutine(unsigned char *input); +//Note: Keep in mind that this routine can be called by multiple threads at the same time. +ConvertRoutine: +//jmp dllname.functionname +[64-bit] +//or manual: +//parameters: (64-bit) +//rcx=address of input +xor eax,eax +mov eax,[rcx] //eax now contains the bytes 'input' pointed to +bswap eax //convert to big endian + +ret +[/64-bit] + +[32-bit] +//jmp dllname.functionname +//or manual: +//parameters: (32-bit) +push ebp +mov ebp,esp +//[ebp+8]=input +//example: +mov eax,[ebp+8] //place the address that contains the bytes into eax +mov eax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value + +bswap eax + +pop ebp +ret 4 +[/32-bit] + +//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value) +//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output); +ConvertBackRoutine: +//jmp dllname.functionname +//or manual: +[64-bit] +//parameters: (64-bit) +//ecx=input +//rdx=address of output +//example: +bswap ecx //convert the little endian input into a big endian input +mov [rdx],ecx //place the integer the 4 bytes pointed to by rdx + +ret +[/64-bit] + +[32-bit] +//parameters: (32-bit) +push ebp +mov ebp,esp +//[ebp+8]=input +//[ebp+c]=address of output +//example: +push eax +push ebx +mov eax,[ebp+8] //load the value into eax +mov ebx,[ebp+c] //load the address into ebx + +//convert the value to big endian +bswap eax + +mov [ebx],eax //write the value into the address +pop ebx +pop eax + +pop ebp +ret 8 +[/32-bit] diff --git a/utils/Sunshine.CT b/utils/Sunshine.CT new file mode 100644 index 0000000..8507cf0 --- /dev/null +++ b/utils/Sunshine.CT @@ -0,0 +1,462 @@ + + + + + 24 + "Base Address Lookup" + + + Auto Assembler Script + // Uncomment the version you're targeting + +// GMSE01 (NTSC-U) +// define(INPUT_OFFSET,404454) +// define(COIN_COUNT_OFFSET,578A60) +// define(LIFE_COUNT_OFFSET,578A04) +// define(POS_PTR_OFFSET, 40E10C) + + +// GMSJ01 (NTSC-J 1.0) +// define(INPUT_OFFSET, 400D50) +// define(LIFE_COUNT_OFFSET, 575224) +// define(COIN_COUNT_OFFSET, 575280) +// define(POS_PTR_OFFSET, 40A39C) + +// GMSJ01 (NTSC-J 1.1) +// define(INPUT_OFFSET, 3F5428) +// define(LIFE_COUNT_OFFSET, 569724) +// define(COIN_COUNT_OFFSET, 569780) +// define(POS_PTR_OFFSET, 3FEFAC) + +// GMSP01 (PAL) +define(INPUT_OFFSET, 3FBBF4) +define(LIFE_COUNT_OFFSET, 570964) +define(COIN_COUNT_OFFSET, 5709C0) +define(POS_PTR_OFFSET, 4057D4) + +registerSymbol(INPUT_OFFSET) +registerSymbol(COIN_COUNT_OFFSET) +registerSymbol(LIFE_COUNT_OFFSET) +registerSymbol(POS_PTR_OFFSET) + + +[ENABLE] +define(PRACTICE_CODE_MEMORY_OFFSET, 17F0000) +registerSymbol(PRACTICE_CODE_MEMORY_OFFSET) + +label(BASE_ADDRESS) +registerSymbol(BASE_ADDRESS) + +aobScan(aob1,47 4D 53 ?? 30 31 00 ?? 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C2 33 9F 3D) +aob1: +BASE_ADDRESS: + +[DISABLE] +unregisterSymbol(BASE_ADDRESS) +unregisterSymbol(PRACTICE_CODE_MEMORY_OFFSET) +unregisterSymbol(POS_PTR_OFFSET) +unregisterSymbol(LIFE_COUNT_OFFSET) +unregisterSymbol(COIN_COUNT_OFFSET) +unregisterSymbol(INPUT_OFFSET) + + + + + Toggle Activation + + 97 + + 0 + + + + + 50 + "Practice Code Values (Start at PRACTICE_CODE_MEMORY_OFFSET / 0x817F0000)" + + + FF0000 + 1 + + + 57 + "0x000 Level Select Stage Data" + + 1 + Array of byte + 8 +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET
+
+ + 53 + "0x008 Stored Position (Mario)" + + 1 + Array of byte + 12 +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+8
+
+ + 54 + "0x014 Stored Angle (Mario)" + + 1 + Array of byte + 2 +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+14
+
+ + 56 + "0x016 Stored Position (Camera)" + + 1 + Array of byte + 6 +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+16
+
+ + 63 + "0x020 Stored Coins" + + 1 + Custom + 4 Byte Big Endian +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+20
+
+ + 58 + "0x100 Reset Stopwatch In Demo Screen Flag" + + 1 + Byte +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+100
+
+ + 59 + "0x101 Disable Custom IG Timer Flag" + + 1 + Byte +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+101
+
+ + 62 + "0x102 Stopwatch Save State" + + 1 + Array of byte + 8 +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+102
+
+ + 60 + "0x10C Stop Timer Flag" + + 1 + Byte +
BASE_ADDRESS+PRACTICE_CODE_MEMORY_OFFSET+10C
+
+
+
+ + 0 + "Current Base Address" + + 1 + C0C0C0 + 4 Bytes +
BASE_ADDRESS
+
+ + 27 + "Coin Count" + + 008000 + Custom + 4 Byte Big Endian +
BASE_ADDRESS+COIN_COUNT_OFFSET
+
+ + 25 + "Life Count" + + 008000 + Custom + 4 Byte Big Endian +
BASE_ADDRESS+LIFE_COUNT_OFFSET
+
+ + 29 + "Mario's Position" + + + C08000 + Auto Assembler Script + // Get marios position +[ENABLE] + +// Allocate 4 bytes for the position +registerSymbol(INT_POS_ADDRESS) +alloc(INT_POS_ADDRESS, 4) + +// Read the address of the controller input +// into INT_CONTROLLER_INPUT_ADDRESS +// Since GC uses big endian we have to reverse +// the 4 bytes of the pointer +INT_POS_ADDRESS: +readMem(BASE_ADDRESS + POS_PTR_OFFSET + 3, 1) +readMem(BASE_ADDRESS + POS_PTR_OFFSET + 2, 1) +readMem(BASE_ADDRESS + POS_PTR_OFFSET + 1, 1) +readMem(BASE_ADDRESS + POS_PTR_OFFSET, 1) + +// Calculate the final address for use with Dolphin +define(POS_ADDRESS, BASE_ADDRESS + [INT_POS_ADDRESS] - 80000000) +registerSymbol(POS_ADDRESS) + +[DISABLE] +dealloc(INT_POS_ADDRESS) +unregisterSymbol(INT_POS_ADDRESS) +unregisterSymbol(POS_ADDRESS) + + + + Toggle Activation + + 97 + + 0 + + + + + 30 + "Marios Position" + + 1 + Array of byte + 12 +
POS_ADDRESS
+
+
+
+ + 34 + "Controller Inputs" + + + C08000 + 1 + + + 40 + "A" + 0:- +1:Pressed + + + Binary + 0 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET
+
+ + 41 + "B" + 0:- +1:Pressed + + + Binary + 1 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET
+
+ + 38 + "X" + 0:- +1:Pressed + + + Binary + 2 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET
+
+ + 39 + "Y" + 0:- +1:Pressed + + + Binary + 3 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET
+
+ + 49 + "Start" + 0:- +1:Pressed + + + Binary + 4 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET
+
+ + 48 + "Z" + 0:- +1:Pressed + + + Binary + 4 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET+1
+
+ + 32 + "DPAD UP" + 0:- +1:Pressed + + + 1 + Binary + 3 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 35 + "DPAD DOWN" + 0:- +1:Pressed + + + Binary + 2 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 36 + "DPAD LEFT" + 0:- +1:Pressed + + + Binary + 0 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 37 + "DPAD RIGHT" + 0:- +1:Pressed + + + Binary + 1 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 42 + "L" + 0:- +1:Pressed + + + Binary + 6 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 44 + "L (Analog)" + + Byte +
BASE_ADDRESS+INPUT_OFFSET + 6
+
+ + 43 + "R" + 0:- +1:Pressed + + + Binary + 5 + 1 + 0 +
BASE_ADDRESS+INPUT_OFFSET + 1
+
+ + 45 + "R (Analog)" + + Byte +
BASE_ADDRESS+INPUT_OFFSET + 7
+
+ + 46 + "L Stick" + + Custom + 2 Byte Big Endian +
BASE_ADDRESS+INPUT_OFFSET + 2
+
+ + 47 + "R-Stick" + + Custom + 2 Byte Big Endian +
BASE_ADDRESS+INPUT_OFFSET+4
+
+
+
+
+
+
+ + + Group 0 + + + + + label5 +
004E3739
+
+ + label1 +
01733513
+
+ + xlivekiller +
59151605
+
+
+ Grey -> Informational +