sub.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include "sub.h"
  2. #include "log.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. extern const uint dword_2FED08[0xE];
  8. // 0016A88C ^_^
  9. //单元测试等级: 目测游戏表现
  10. //单元测试内容: 1-5
  11. //单元测试结果: 正常
  12. //已测试分支 1
  13. void sub_16A88C(fpointQ<PointType_18> &r0_pfpointQ,
  14. fpointQ<PointType_18> &r1_pfpointQ) {
  15. int r8_i = r1_pfpointQ.field_0;
  16. int r11_i = r1_pfpointQ.field_4;
  17. int r10_i = r1_pfpointQ.field_8;
  18. int r0_i = r1_pfpointQ.field_C;
  19. int i_sp8 = ((uint64)r8_i) * r8_i / 0x40000 +
  20. ((uint64)r11_i) * r11_i / 0x40000 +
  21. ((uint64)r10_i) * r10_i / 0x40000 + ((int64)r0_i) * r0_i / 0x40000;
  22. int r2_i = i_sp8 - 0x40000;
  23. if (i_sp8 < 0x40000) {
  24. // LOGE("sub_16A88C_1");
  25. r2_i = 0x40000 - i_sp8;
  26. }
  27. if (r2_i >= 0x80) {
  28. // LOGE("sub_16A88C_2");
  29. // 0016A8DA
  30. int i_sp4;
  31. sub_16A818(&i_sp4, &i_sp8);
  32. // r0 r6 r7 sp0 =r1_pfpointQ
  33. r8_i = ((int64)r1_pfpointQ.field_0) * 0x40000 / i_sp4;
  34. r11_i = ((int64)r1_pfpointQ.field_4) * 0x40000 / i_sp4;
  35. r10_i = ((int64)r1_pfpointQ.field_8) * 0x40000 / i_sp4;
  36. r0_i = ((int64)r1_pfpointQ.field_C) * 0x40000 / i_sp4;
  37. }
  38. //LOGE("sub_16A88C_3");
  39. // loc_16A93E
  40. r0_pfpointQ.field_0 = r8_i;
  41. r0_pfpointQ.field_4 = r11_i;
  42. r0_pfpointQ.field_8 = r10_i;
  43. r0_pfpointQ.field_C = r0_i;
  44. };
  45. // 0016C3E2 ^_-
  46. //单元测试等级: 目测游戏表现
  47. //单元测试内容: 1-5
  48. //单元测试结果: 正常
  49. //已测试分支 1
  50. void sub_16C3E2(fpointQ<PointType_18> &r0_pfpointQ,
  51. fpointQ<PointType_18> &r1_pfpointQ,
  52. fpointQ<PointType_18> &r2_pfpointQ) {
  53. // LOGE("sub_16C3E2");
  54. int r12_i = r2_pfpointQ.field_0;
  55. int r4_i = r2_pfpointQ.field_4;
  56. int r8_i = r2_pfpointQ.field_8;
  57. int lr_i = r2_pfpointQ.field_C;
  58. int r6_i = r1_pfpointQ.field_0;
  59. int r9_i = r1_pfpointQ.field_4;
  60. int r5_i = r1_pfpointQ.field_8;
  61. int r1_i = r1_pfpointQ.field_C;
  62. r0_pfpointQ.field_0 = ((uint64)r12_i) * r1_i / 0x40000 + ((uint64)r6_i) * lr_i / 0x40000 +
  63. ((uint64)r5_i) * r4_i / 0x40000 - ((uint64)r8_i) * r9_i / 0x40000;
  64. r0_pfpointQ.field_4 = ((uint64)r9_i) * lr_i / 0x40000 + ((uint64)r4_i) * r1_i / 0x40000 -
  65. ((uint64)r5_i) * r12_i / 0x40000 + ((uint64)r8_i) * r6_i / 0x40000;
  66. r0_pfpointQ.field_8 = ((uint64)r9_i) * r12_i / 0x40000 - ((uint64)r4_i) * r6_i / 0x40000 +
  67. ((uint64)r5_i) * lr_i / 0x40000 + ((uint64)r8_i) * r1_i / 0x40000;
  68. r0_pfpointQ.field_C = ((uint64)r1_i) * lr_i / 0x40000 - ((uint64)r12_i) * r6_i / 0x40000 -
  69. ((uint64)r4_i) * r9_i / 0x40000 - ((uint64)r8_i) * r5_i / 0x40000;
  70. };
  71. // 0016C672 ^_-
  72. //单元测试等级: 目测游戏表现
  73. //单元测试内容: 1-5
  74. //单元测试结果: 正常
  75. //已测试分支 1
  76. void sub_16C672(fpoint3<PointType_18> &r0_pfpoint3,
  77. fpoint3<PointType_18> &r1_pfpoint3,
  78. fpoint<PointType_18>* r2_pfpoint) {
  79. //LOGE("sub_16C672");
  80. r0_pfpoint3.x_0 = ((uint64)r1_pfpoint3.x_0) * r2_pfpoint->var_0 / 0x40000;
  81. r0_pfpoint3.y_4 = ((uint64)r1_pfpoint3.y_4) * r2_pfpoint->var_0 / 0x40000;
  82. r0_pfpoint3.z_8 = ((uint64)r1_pfpoint3.z_8) * r2_pfpoint->var_0 / 0x40000;
  83. }
  84. // 001699F4 ^_-
  85. //单元测试等级: 目测游戏表现
  86. //单元测试内容: 1-5
  87. //单元测试结果: 正常
  88. //已测试分支 未调用
  89. void sub_1699F4(int *r0_pi, int *r1_pi) {
  90. long long r2r1_ll = *r1_pi;
  91. long long r12lr_ll = r2r1_ll * 0x4000;
  92. long long r4r2_ll = 0x4000000000000000;
  93. long long r3r1_ll;
  94. do {
  95. // loc_16A82E
  96. r3r1_ll = r4r2_ll;
  97. r4r2_ll >>= 2;
  98. } while (r12lr_ll < r4r2_ll);
  99. r4r2_ll = 0;
  100. while (r3r1_ll) {
  101. // loc_16A84C
  102. long long r6r5_ll = r3r1_ll + r4r2_ll;
  103. if (r12lr_ll < r6r5_ll) { // 0016A85C
  104. // LOGE("sub_1699F4_branch1");
  105. r4r2_ll = r4r2_ll / 2;
  106. } else { // loc_16A866
  107. // LOGE("sub_1699F4_branch2");
  108. r4r2_ll = r4r2_ll / 2;
  109. r4r2_ll += r3r1_ll;
  110. r12lr_ll -= r6r5_ll;
  111. }
  112. // loc_16A87A
  113. r3r1_ll >>= 2;
  114. }
  115. *r0_pi = r4r2_ll;
  116. // LOGE(" my=%x",*r0_pi);
  117. // LOGE("old");
  118. // f=(void (*) (int* x,int*y))address;
  119. // f(r0_pi,r1_pi);
  120. // LOGE("old end");
  121. // LOGE(" old=%x",*r0_pi);
  122. }
  123. // 00166CB2 ^_^
  124. //单元测试等级: 目测游戏表现
  125. //单元测试内容: 1-4
  126. //单元测试结果: 正常
  127. //已测试分支 函数未调用
  128. void sub_166CB2(int *r0_pi, fpoint2<PointType_14> *r1_pfpoint) {
  129. //LOGE("sub_166CB2");
  130. int r2_i = r1_pfpoint->x_0;
  131. int r1_i = r1_pfpoint->y_4;
  132. unsigned long long r12r1_ull = ((unsigned long long)r1_i) * r1_i;
  133. unsigned long long r3r2_ull = ((unsigned long long)r2_i) * r2_i;
  134. r1_i = r12r1_ull / 0x4000;
  135. r2_i = r3r2_ull / 0x4000;
  136. r1_i += r2_i;
  137. sub_1699F4(r0_pi, &r1_i);
  138. }
  139. // 0016A818 ^_-
  140. //已测试分支1 2 正常 1-6关
  141. //单元测试等级: 目测游戏表现
  142. //单元测试内容: 1-6
  143. //单元测试结果: 正常
  144. //已测试分支 1 2
  145. void sub_16A818(int *r0_pi, int *r1_pi) {
  146. // LOGE("sub_16A818 address=%x",address);
  147. long long r2r1_ll = *r1_pi;
  148. long long r12lr_ll = r2r1_ll * 0x40000;
  149. long long r4r2_ll = 0x4000000000000000;
  150. long long r3r1_ll;
  151. do {
  152. // loc_16A82E
  153. r3r1_ll = r4r2_ll;
  154. r4r2_ll >>= 2;
  155. } while (r12lr_ll < r4r2_ll);
  156. r4r2_ll = 0;
  157. while (r3r1_ll) {
  158. // loc_16A84C
  159. long long r6r5_ll = r3r1_ll + r4r2_ll;
  160. if (r12lr_ll < r6r5_ll) { // 0016A85C
  161. // LOGE("sub_16A818_branch1");
  162. r4r2_ll = r4r2_ll / 2;
  163. } else { // loc_16A866
  164. // LOGE("sub_16A818_branc");
  165. r4r2_ll = r4r2_ll / 2;
  166. r4r2_ll += r3r1_ll;
  167. r12lr_ll -= r6r5_ll;
  168. }
  169. // loc_16A87A
  170. r3r1_ll >>= 2;
  171. }
  172. *r0_pi = r4r2_ll;
  173. // LOGE("out=%x in=%x", *r0_pi, *r1_pi);
  174. }
  175. // 0016D8B2 ^_^
  176. //已测试分支
  177. //单元测试等级: 目测游戏表现
  178. //单元测试内容: 前10关未调用
  179. //单元测试结果:
  180. //已测试分支
  181. void sub_16D8B2(int *r0_pi, fpoint3<PointType_18> &r1_pfpoint3) {
  182. // LOGE("sub_16D8B2");
  183. int i_sp4 = ((long long)r1_pfpoint3.x_0) * r1_pfpoint3.x_0 / 0x40000 +
  184. ((long long)r1_pfpoint3.y_4) * r1_pfpoint3.y_4 / 0x40000 +
  185. ((long long)r1_pfpoint3.z_8) * r1_pfpoint3.z_8 / 0x40000;
  186. sub_16A818(r0_pi, &i_sp4);
  187. }
  188. // 0016C7DC ^_-
  189. //已测试分支
  190. //单元测试等级: 目测游戏表现
  191. //单元测试内容: 前10关未调用
  192. //单元测试结果:
  193. void sub_16C7DC(fpoint3<PointType_18> &r0_pfpoint3,fpoint3<PointType_18> &r1_pfpoint3,fpoint3<PointType_18> &r2_pfpoint3) {
  194. //LOGE("sub_16C7DC");
  195. int r12_i = r2_pfpoint3.x_0;
  196. int r3_i = r2_pfpoint3.y_4;
  197. int lr_i = r2_pfpoint3.z_8;
  198. int r2_i = r1_pfpoint3.x_0;
  199. int r4_i = r1_pfpoint3.y_4;
  200. int r1_i = r1_pfpoint3.z_8;
  201. r0_pfpoint3.x_0 = ((unsigned long long)r4_i) * lr_i / 0x40000 -
  202. ((unsigned long long)r1_i) * r3_i / 0x40000;
  203. r0_pfpoint3.y_4 =
  204. ((unsigned long long)r1_i) * r12_i / 0x40000 -
  205. ((unsigned long long)r2_i) * lr_i / 0x40000; //乘法smull 寄存器顺序不同
  206. r0_pfpoint3.z_8 = ((unsigned long long)r3_i) * r2_i / 0x40000 -
  207. ((unsigned long long)r4_i) * r12_i / 0x40000;
  208. }
  209. // 0016C74C ^_^
  210. //已测试分支
  211. //单元测试等级: 目测游戏表现
  212. //单元测试内容: 前10关未调用
  213. //单元测试结果:
  214. //已测试分支
  215. void sub_16C74C(fpoint<PointType_18> &r0_pfpoint,fpoint3<PointType_18> &r1_pfpoint3,fpoint3<PointType_18> &r2_pfpoint3) {
  216. // LOGE("sub_16C74C");
  217. int r3_i = r1_pfpoint3.x_0;
  218. int r12_i = r1_pfpoint3.y_4;
  219. int lr_i = r1_pfpoint3.z_8;
  220. int r1_i = r2_pfpoint3.x_0;
  221. int r4_i = r2_pfpoint3.y_4;
  222. int r2_i = r2_pfpoint3.z_8;
  223. r0_pfpoint.var_0 = ((unsigned long long)r1_i * r3_i) / 0x40000 +
  224. ((unsigned long long)r4_i * r12_i) / 0x40000 +
  225. ((unsigned long long)r2_i * lr_i) / 0x40000;
  226. }
  227. // 0016A57C
  228. //已测试分支
  229. //单元测试内容: 1-10
  230. //单元测试结果:未调用
  231. //已测试分支
  232. void sub_16A57C(int&r0_pi,int&r1_pi){
  233. LOGE("sub_16A57C");
  234. uint64 ull_sp0;
  235. int r10_i=r1_pi;
  236. if(r1_pi<=-411776){
  237. //0016A592
  238. ull_sp0=0xffffffff00000000;
  239. r10_i+=823550;
  240. }else{//loc_16A5A2
  241. if(r1_pi<=411775){
  242. ull_sp0=0x100000000;
  243. }else{
  244. ull_sp0=0xffffffff00000000;
  245. r10_i-=823550;
  246. }
  247. //i_sp0=0;
  248. }
  249. //loc_16A5B6
  250. //loc_16A602
  251. int i_sp10;
  252. int i_spC;
  253. int r8_i=0x40000;
  254. uint64 r6r11_ull=0x40000;
  255. for(int r9_i=0xE;r9_i!=0;r9_i--){
  256. //loc_16A5CA
  257. i_sp10=r8_i+0x40000;
  258. sub_16A818(&i_sp10,&i_spC);
  259. r6r11_ull = (int)(r6r11_ull*i_sp10/0x40000);
  260. r8_i/=4;
  261. }
  262. //0016A60A
  263. int r3_i=0x40000;
  264. r8_i = 0x40000;
  265. //loc_16A686
  266. int lr_i=0x0;
  267. for(int r1_i=0;r1_i!=0xE;r1_i++){
  268. //loc_16A622
  269. int r5_i=((r10_i>>31) & 0xFFF80000) | 0x40000;
  270. int r0_i= ((int64)r8_i*r5_i)/0x40000;
  271. int r2_i=(((uint64)dword_2FED08[r1_i]*r5_i))/0x40000;
  272. r10_i-=r2_i;
  273. r0_i=(((uint64)r0_i*r3_i))/0x40000;
  274. r2_i=((int64)lr_i*r5_i)/0x40000;
  275. lr_i+=r0_i;
  276. r0_i=((int64)r2_i*r3_i)/0x40000;
  277. r8_i-=r0_i;
  278. r3_i/=2;
  279. }
  280. //0016A68A
  281. r0_pi=(int64)(ull_sp0*lr_i/0x4000)/((int64)r6r11_ull);
  282. }
  283. // 0016A6CC
  284. //已测试分支
  285. //单元测试内容: 1-10
  286. //单元测试结果:未调用
  287. //已测试分支
  288. void sub_16A6CC(int&r0_pi,int&r1_pi){
  289. uint64 ull_sp0;
  290. int r10_i=r1_pi;
  291. if(r1_pi<=-411776){
  292. //0016A6E2
  293. //check
  294. LOGE("sub_16A6CC_0");
  295. ull_sp0=0xffffffff00000000;
  296. r10_i+=823550;
  297. }else{//loc_16A6F2
  298. if(r1_pi<=411775){
  299. LOGE("sub_16A6CC_1");
  300. ull_sp0=0x100000000;
  301. }else{
  302. LOGE("sub_16A6CC_2");
  303. ull_sp0=0xffffffff00000000;
  304. r10_i-=823550;
  305. }
  306. //i_sp0=0;
  307. }
  308. //loc_16A706
  309. //loc_16A752
  310. int i_sp10;
  311. int i_spC;
  312. int r8_i=0x40000;
  313. uint64 r6r11_ull=0x40000;
  314. for(int r9_i=0;r9_i!=0xE;r9_i++){
  315. //loc_16A71A
  316. LOGE("sub_16A6CC_3");
  317. i_sp10=r8_i+0x40000;
  318. sub_16A818(&i_sp10,&i_spC);
  319. r6r11_ull = (int)(r6r11_ull*i_sp10/0x40000);//这里的乘法确定是uint64
  320. r8_i/=4;
  321. }
  322. //0016A758
  323. int r2_i=0x40000;
  324. int r4_i = 0x40000;
  325. int lr_i=0x0;
  326. //loc_16A7D4
  327. for(int r1_i=0;r1_i!=0xE;r1_i++){
  328. //loc_16A774
  329. LOGE("sub_16A6CC_4");
  330. int r5_i=((r10_i>>31) & 0xFFF80000) | 0x40000;
  331. int r0_i= ((uint64)r2_i*r5_i)/0x40000;
  332. int r3_i=((uint64)dword_2FED08[r1_i]*r5_i)/0x40000;
  333. r10_i-=r3_i;
  334. r0_i=((uint64)r0_i*r4_i)/0x40000;
  335. r3_i=((uint64)lr_i*r5_i)/0x40000;
  336. lr_i+=r0_i;
  337. r0_i=((uint64)r3_i*r4_i)/0x40000;
  338. r2_i-=r0_i;
  339. r4_i/=2;
  340. }
  341. //0016A7D8
  342. r0_pi=(int64)(ull_sp0*r2_i/0x4000)/(int64)(r6r11_ull);
  343. int64 base=0;
  344. LOGE("r0_pi=%x",r0_pi);
  345. // if(GetModuleBase(base,getpid(),"libHero.so")){
  346. // LOGE("geted base=%x",(uint)base);
  347. // p=(void (*)(int&,int&))(base+0x16A6CC);
  348. // }
  349. }