Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. /*
  2. GTA Analog Stick Patch
  3. Copyright (C) 2016, TheFloW
  4.  
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18.  
  19. #include <pspsdk.h>
  20. #include <pspkernel.h>
  21. #include <pspctrl.h>
  22.  
  23. #include <stdio.h>
  24. #include <stdarg.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include <systemctrl.h>
  29.  
  30. PSP_MODULE_INFO("gta_patch", 0x0007, 1, 0);
  31.  
  32. #define MAKE_JUMP(a, f) _sw(0x08000000 | (((u32)(f) & 0x0FFFFFFC) >> 2), a);
  33. #define MAKE_CALL(a, f) _sw(0x0C000000 | (((u32)(f) >> 2) & 0x03FFFFFF), a);
  34.  
  35. #define REDIRECT_FUNCTION(a, f) \
  36. { \
  37. u32 func = a; \
  38. _sw(0x08000000 | (((u32)(f) >> 2) & 0x03FFFFFF), func); \
  39. _sw(0, func + 4); \
  40. }
  41.  
  42. #define MAKE_DUMMY_FUNCTION(a, r) \
  43. { \
  44. u32 func = a; \
  45. if (r == 0) \
  46. { \
  47. _sw(0x03E00008, func); \
  48. _sw(0x00001021, func + 4); \
  49. } \
  50. else \
  51. { \
  52. _sw(0x03E00008, func); \
  53. _sw(0x24020000 | r, func + 4); \
  54. } \
  55. }
  56.  
  57. #define HIJACK_FUNCTION(a, f, ptr) \
  58. { \
  59. u32 func = a; \
  60. static u32 patch_buffer[3]; \
  61. _sw(_lw(func), (u32)patch_buffer); \
  62. _sw(_lw(func + 4), (u32)patch_buffer + 8);\
  63. MAKE_JUMP((u32)patch_buffer + 4, func + 8); \
  64. _sw(0x08000000 | (((u32)(f) >> 2) & 0x03FFFFFF), func); \
  65. _sw(0, func + 4); \
  66. ptr = (void *)patch_buffer; \
  67. }
  68.  
  69. #define MAX_VALUE 0xFF
  70. #define CENTER 0x80
  71. #define DEADZONE 0x20
  72. #define FACTOR 1.2f
  73.  
  74. STMOD_HANDLER previous;
  75.  
  76. int getRx() {
  77. char rx = *(char *)(0x08803000 + 0);
  78. rx -= CENTER;
  79.  
  80. if (rx < -DEADZONE || rx > DEADZONE)
  81. return (int)((float)rx * FACTOR);
  82.  
  83. return 0;
  84. }
  85.  
  86. int getRy() {
  87. char ry = *(char *)(0x08803000 + 1);
  88. ry = MAX_VALUE - ry;
  89.  
  90. ry -= CENTER;
  91.  
  92. if (ry < -DEADZONE || ry > DEADZONE)
  93. return (int)((float)ry * FACTOR);
  94.  
  95. return 0;
  96. }
  97.  
  98. int cameraLeft() {
  99. char rx = *(char *)(0x08803000 + 0);
  100. rx -= CENTER;
  101.  
  102. if (rx < -DEADZONE)
  103. return 1;
  104.  
  105. return 0;
  106. }
  107.  
  108. int cameraRight() {
  109. char rx = *(char *)(0x08803000 + 0);
  110. rx -= CENTER;
  111.  
  112. if (rx > DEADZONE)
  113. return 1;
  114.  
  115. return 0;
  116. }
  117.  
  118. int cameraUp() {
  119. char ry = *(char *)(0x08803000 + 1);
  120. ry -= CENTER;
  121.  
  122. if (ry < -DEADZONE)
  123. return 1;
  124.  
  125. return 0;
  126. }
  127.  
  128. int cameraDown() {
  129. char ry = *(char *)(0x08803000 + 1);
  130. ry -= 0x80;
  131.  
  132. if (ry > DEADZONE)
  133. return 1;
  134.  
  135. return 0;
  136. }
  137.  
  138. // combat
  139. // limit up: "lwc1 $fpr12, -29048($gp);"
  140. // limit down "lwc1 $fpr12, -29052($gp);"
  141.  
  142. // speed up: "lwc1 $fpr14, -29064($gp);"
  143. // speed down: "lwc1 $fpr14, -29064($gp);"
  144.  
  145. // free run
  146.  
  147. /*
  148. // l trigger
  149. if (a0 == 4)
  150.  
  151. // circle
  152. if (a0 == 0)
  153.  
  154. // square
  155. if (a0 == 1)
  156.  
  157. // up
  158. if (a0 == 2)
  159.  
  160. // down
  161. if (a0 == 3)
  162. */
  163.  
  164. int OnModuleStart(SceModule2 *mod) {
  165. char *modname = mod->modname;
  166. u32 text_addr = mod->text_addr;
  167.  
  168. if (strcmp(modname, "GTA3") == 0) {
  169. // Redirect camera movement
  170. REDIRECT_FUNCTION(text_addr + 0x00294C88, getRx);
  171. REDIRECT_FUNCTION(text_addr + 0x00294D88, getRy);
  172.  
  173. // Redirect gun aim movement
  174. REDIRECT_FUNCTION(text_addr + 0x00294A54, getRx);
  175. REDIRECT_FUNCTION(text_addr + 0x00294B58, getRy);
  176.  
  177. // Allow using L trigger when walking
  178. _sw(0, text_addr + 0x00293550);
  179. _sw(0, text_addr + 0x002935B4);
  180.  
  181. // Force L trigger value
  182. _sw(0x240AFFFF, text_addr + 0x000EDC38);
  183.  
  184. sceKernelDcacheWritebackAll();
  185. } else if (strcmp(modname, "main") == 0) {
  186. // Patch camera in combat mode
  187. MAKE_CALL(text_addr + 0x0005203C, cameraLeft);
  188. MAKE_CALL(text_addr + 0x00052074, cameraRight);
  189. MAKE_CALL(text_addr + 0x000520AC, cameraDown);
  190. MAKE_CALL(text_addr + 0x000520E4, cameraUp);
  191.  
  192. // Patch camera in climbing mode
  193. MAKE_CALL(text_addr + 0x00066104, cameraLeft);
  194. MAKE_CALL(text_addr + 0x00066128, cameraRight);
  195. MAKE_CALL(text_addr + 0x00066170, cameraDown);
  196. MAKE_CALL(text_addr + 0x0006614C, cameraUp);
  197.  
  198. // Patch camera in running mode
  199. MAKE_CALL(text_addr + 0x00071294, cameraLeft);
  200. MAKE_CALL(text_addr + 0x0007133C, cameraRight);
  201. MAKE_CALL(text_addr + 0x000713EC, cameraDown);
  202. MAKE_CALL(text_addr + 0x00071478, cameraUp);
  203.  
  204. // Allow left camera movement
  205. _sw(0, text_addr + 0x000712AC);
  206. _sw(0x50000007, text_addr + 0x000712F4);
  207.  
  208. // Allow right camera movement
  209. _sw(0, text_addr + 0x00071354);
  210. _sw(0x50000007, text_addr + 0x0007139C);
  211.  
  212. // Force L trigger value
  213. _sw(0, text_addr + 0x00052030);
  214. _sw(0x10000005, text_addr + 0x000660E4);
  215. _sw(0, text_addr + 0x00071E98);
  216. _sw(0x10000021, text_addr + 0x0007158C);
  217.  
  218. sceKernelDcacheWritebackAll();
  219. }
  220.  
  221. if (!previous)
  222. return 0;
  223.  
  224. return previous(mod);
  225. }
  226.  
  227. int module_start(SceSize args, void *argp) {
  228. previous = sctrlHENSetStartModuleHandler(OnModuleStart);
  229. return 0;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement