sub.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  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. //已测试分支
  194. void sub_16C7DC(fpoint3<PointType_18> &r0_pfpoint3,fpoint3<PointType_18> &r1_pfpoint3,fpoint3<PointType_18> &r2_pfpoint3) {
  195. //LOGE("sub_16C7DC");
  196. int r12_i = r2_pfpoint3.x_0;
  197. int r3_i = r2_pfpoint3.y_4;
  198. int lr_i = r2_pfpoint3.z_8;
  199. int r2_i = r1_pfpoint3.x_0;
  200. int r4_i = r1_pfpoint3.y_4;
  201. int r1_i = r1_pfpoint3.z_8;
  202. r0_pfpoint3.x_0 = ((unsigned long long)r4_i) * lr_i / 0x40000 -
  203. ((unsigned long long)r1_i) * r3_i / 0x40000;
  204. r0_pfpoint3.y_4 =
  205. ((unsigned long long)r1_i) * r12_i / 0x40000 -
  206. ((unsigned long long)r2_i) * lr_i / 0x40000; //乘法smull 寄存器顺序不同
  207. r0_pfpoint3.z_8 = ((unsigned long long)r3_i) * r2_i / 0x40000 -
  208. ((unsigned long long)r4_i) * r12_i / 0x40000;
  209. }
  210. // 0016C74C ^_^
  211. //已测试分支
  212. //单元测试等级: 目测游戏表现
  213. //单元测试内容: 前10关未调用
  214. //单元测试结果:
  215. //已测试分支
  216. void sub_16C74C(fpoint<PointType_18> &r0_pfpoint,fpoint3<PointType_18> &r1_pfpoint3,fpoint3<PointType_18> &r2_pfpoint3) {
  217. // LOGE("sub_16C74C");
  218. int r3_i = r1_pfpoint3.x_0;
  219. int r12_i = r1_pfpoint3.y_4;
  220. int lr_i = r1_pfpoint3.z_8;
  221. int r1_i = r2_pfpoint3.x_0;
  222. int r4_i = r2_pfpoint3.y_4;
  223. int r2_i = r2_pfpoint3.z_8;
  224. r0_pfpoint.var_0 = ((unsigned long long)r1_i * r3_i) / 0x40000 +
  225. ((unsigned long long)r4_i * r12_i) / 0x40000 +
  226. ((unsigned long long)r2_i * lr_i) / 0x40000;
  227. }
  228. // 0016A57C
  229. //已测试分支
  230. //单元测试内容: 1-10
  231. //单元测试结果:未调用
  232. //已测试分支
  233. void sub_16A57C(int&r0_pi,int&r1_pi){
  234. LOGE("sub_16A57C");
  235. uint64 ull_sp0;
  236. int r10_i=r1_pi;
  237. if(r1_pi<=-411776){
  238. //0016A592
  239. ull_sp0=0xffffffff00000000;
  240. r10_i+=823550;
  241. }else{//loc_16A5A2
  242. if(r1_pi<=411775){
  243. ull_sp0=0x100000000;
  244. }else{
  245. ull_sp0=0xffffffff00000000;
  246. r10_i-=823550;
  247. }
  248. //i_sp0=0;
  249. }
  250. //loc_16A5B6
  251. //loc_16A602
  252. int i_sp10;
  253. int i_spC;
  254. int r8_i=0x40000;
  255. uint64 r6r11_ull=0x40000;
  256. for(int r9_i=0xE;r9_i!=0;r9_i--){
  257. //loc_16A5CA
  258. i_sp10=r8_i+0x40000;
  259. sub_16A818(&i_sp10,&i_spC);
  260. r6r11_ull = (int)(r6r11_ull*i_sp10/0x40000);
  261. r8_i/=4;
  262. }
  263. //0016A60A
  264. int r3_i=0x40000;
  265. r8_i = 0x40000;
  266. //loc_16A686
  267. int lr_i=0x0;
  268. for(int r1_i=0;r1_i!=0xE;r1_i++){
  269. //loc_16A622
  270. int r5_i=((r10_i>>31) & 0xFFF80000) | 0x40000;
  271. int r0_i= ((int64)r8_i*r5_i)/0x40000;
  272. int r2_i=(((uint64)dword_2FED08[r1_i]*r5_i))/0x40000;
  273. r10_i-=r2_i;
  274. r0_i=(((uint64)r0_i*r3_i))/0x40000;
  275. r2_i=((int64)lr_i*r5_i)/0x40000;
  276. lr_i+=r0_i;
  277. r0_i=((int64)r2_i*r3_i)/0x40000;
  278. r8_i-=r0_i;
  279. r3_i/=2;
  280. }
  281. //0016A68A
  282. r0_pi=(int64)(ull_sp0*lr_i/0x4000)/((int64)r6r11_ull);
  283. }
  284. // 0016A6CC
  285. //已测试分支
  286. //单元测试内容: 1-10
  287. //单元测试结果:未调用
  288. //已测试分支
  289. void sub_16A6CC(int&r0_pi,int&r1_pi){
  290. uint64 ull_sp0;
  291. int r10_i=r1_pi;
  292. if(r1_pi<=-411776){
  293. //0016A6E2
  294. //check
  295. LOGE("sub_16A6CC_0");
  296. ull_sp0=0xffffffff00000000;
  297. r10_i+=823550;
  298. }else{//loc_16A6F2
  299. if(r1_pi<=411775){
  300. LOGE("sub_16A6CC_1");
  301. ull_sp0=0x100000000;
  302. }else{
  303. LOGE("sub_16A6CC_2");
  304. ull_sp0=0xffffffff00000000;
  305. r10_i-=823550;
  306. }
  307. //i_sp0=0;
  308. }
  309. //loc_16A706
  310. //loc_16A752
  311. int i_sp10;
  312. int i_spC;
  313. int r8_i=0x40000;
  314. uint64 r6r11_ull=0x40000;
  315. for(int r9_i=0;r9_i!=0xE;r9_i++){
  316. //loc_16A71A
  317. LOGE("sub_16A6CC_3");
  318. i_sp10=r8_i+0x40000;
  319. sub_16A818(&i_sp10,&i_spC);
  320. r6r11_ull = (int)(r6r11_ull*i_sp10/0x40000);//这里的乘法确定是uint64
  321. r8_i/=4;
  322. }
  323. //0016A758
  324. int r2_i=0x40000;
  325. int r4_i = 0x40000;
  326. int lr_i=0x0;
  327. //loc_16A7D4
  328. for(int r1_i=0;r1_i!=0xE;r1_i++){
  329. //loc_16A774
  330. LOGE("sub_16A6CC_4");
  331. int r5_i=((r10_i>>31) & 0xFFF80000) | 0x40000;
  332. int r0_i= ((uint64)r2_i*r5_i)/0x40000;
  333. int r3_i=((uint64)dword_2FED08[r1_i]*r5_i)/0x40000;
  334. r10_i-=r3_i;
  335. r0_i=((uint64)r0_i*r4_i)/0x40000;
  336. r3_i=((uint64)lr_i*r5_i)/0x40000;
  337. lr_i+=r0_i;
  338. r0_i=((uint64)r3_i*r4_i)/0x40000;
  339. r2_i-=r0_i;
  340. r4_i/=2;
  341. }
  342. //0016A7D8
  343. r0_pi=(int64)(ull_sp0*r2_i/0x4000)/(int64)(r6r11_ull);
  344. int64 base=0;
  345. LOGE("r0_pi=%x",r0_pi);
  346. // if(GetModuleBase(base,getpid(),"libHero.so")){
  347. // LOGE("geted base=%x",(uint)base);
  348. // p=(void (*)(int&,int&))(base+0x16A6CC);
  349. // }
  350. }