Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2025
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.55 KB | None | 0 0
  1. You are decompiling an assembly in ARM7 of a Gameboy Advance game.
  2.  
  3. You know that this assembly:
  4. ```
  5. thumb_func_start sub_80583D4
  6. sub_80583D4: @ 0x080583D4
  7. push {r4, r5, r6, r7, lr}
  8. ldr r7, _080583FC @ =gCurTask
  9. ldr r0, [r7]
  10. ldrh r5, [r0, #6]
  11. movs r4, #0xc0
  12. lsls r4, r4, #0x12
  13. adds r4, r5, r4
  14. adds r0, r4, #0
  15. bl sub_80584A8
  16. adds r6, r0, #0
  17. adds r0, r4, #0
  18. bl sub_8058518
  19. cmp r0, #1
  20. bne _08058400
  21. ldr r0, [r7]
  22. bl TaskDestroy
  23. b _08058452
  24. .align 2, 0
  25. _080583FC: .4byte gCurTask
  26. _08058400:
  27. ldr r0, _08058430 @ =gUnknown_030008A0
  28. ldrb r1, [r0, #4]
  29. subs r0, r1, #1
  30. lsls r0, r0, #0x18
  31. lsrs r0, r0, #0x18
  32. cmp r0, #1
  33. bls _08058452
  34. cmp r1, #4
  35. beq _08058452
  36. cmp r6, #0
  37. bne _08058452
  38. ldr r0, _08058434 @ =0x03000024
  39. adds r4, r5, r0
  40. ldr r1, [r4, #8]
  41. movs r2, #0x80
  42. lsls r2, r2, #3
  43. adds r0, r1, #0
  44. ands r0, r2
  45. cmp r0, #0
  46. beq _0805843C
  47. ldr r0, _08058438 @ =0xFFFFFBFF
  48. ands r1, r0
  49. b _0805843E
  50. .align 2, 0
  51. _08058430: .4byte gUnknown_030008A0
  52. _08058434: .4byte 0x03000024
  53. _08058438: .4byte 0xFFFFFBFF
  54. _0805843C:
  55. orrs r1, r2
  56. _0805843E:
  57. str r1, [r4, #8]
  58. ldr r1, _08058458 @ =gUnknown_080D1E20
  59. ldrh r0, [r1]
  60. strh r0, [r4, #0xc]
  61. ldrb r0, [r1, #2]
  62. strb r0, [r4, #0x1a]
  63. ldr r0, _0805845C @ =gCurTask
  64. ldr r1, [r0]
  65. ldr r0, _08058460 @ =Task_Akatento
  66. str r0, [r1, #8]
  67. _08058452:
  68. pop {r4, r5, r6, r7}
  69. pop {r0}
  70. bx r0
  71. .align 2, 0
  72. _08058458: .4byte gUnknown_080D1E20
  73. _0805845C: .4byte gCurTask
  74. _08058460: .4byte Task_Akatento
  75. ```
  76.  
  77. Translates to this C code:
  78. ```
  79. void Task_80583D4(void)
  80. {
  81. Akatento *enemy = TASK_DATA(gCurTask);
  82. AnimCmdResult acmdRes = sub_80584A8(enemy);
  83.  
  84. if (sub_8058518(enemy) == TRUE) {
  85. TaskDestroy(gCurTask);
  86. return;
  87. }
  88.  
  89. if ((gStageData.unk4 != 1) && (gStageData.unk4 != 2) && (gStageData.unk4 != 4) && (acmdRes == ACMD_RESULT__ENDED)) {
  90. Sprite *s = &enemy->s;
  91.  
  92. if (s->frameFlags & SPRITE_FLAG_MASK_X_FLIP) {
  93. s->frameFlags &= ~SPRITE_FLAG_MASK_X_FLIP;
  94. } else {
  95. s->frameFlags |= SPRITE_FLAG_MASK_X_FLIP;
  96. }
  97.  
  98. s->anim = gUnknown_080D1E20[0].anim;
  99. s->variant = gUnknown_080D1E20[0].variant;
  100.  
  101. gCurTask->main = Task_Akatento;
  102. }
  103. }
  104. ```
  105.  
  106. Given the above context, translate this assembly to an equivalent C code:
  107. ```
  108. thumb_func_start sub_8063ADC
  109. sub_8063ADC: @ 0x08063ADC
  110. push {r4, r5, r6, r7, lr}
  111. mov r7, sb
  112. mov r6, r8
  113. push {r6, r7}
  114. sub sp, #4
  115. ldr r0, _08063B6C @ =gCurTask
  116. mov sb, r0
  117. ldr r0, [r0]
  118. ldrh r6, [r0, #6]
  119. movs r0, #0xc0
  120. lsls r0, r0, #0x12
  121. adds r7, r6, r0
  122. ldrb r0, [r7, #4]
  123. cmp r0, #0
  124. bne _08063B0E
  125. ldr r1, _08063B70 @ =0x03000024
  126. adds r0, r6, r1
  127. ldr r2, _08063B74 @ =0x0300001C
  128. adds r1, r6, r2
  129. ldr r3, _08063B78 @ =0x0300000C
  130. adds r2, r6, r3
  131. ldr r4, _08063B7C @ =0x03000009
  132. adds r3, r6, r4
  133. bl sub_805CD70
  134. _08063B0E:
  135. adds r0, r7, #0
  136. bl sub_8063E5C
  137. adds r5, r0, #0
  138. cmp r5, #0
  139. bne _08063B98
  140. ldr r0, _08063B80 @ =0x03000038
  141. adds r4, r6, r0
  142. ldr r1, _08063B84 @ =gUnknown_080D210C
  143. ldrh r0, [r1]
  144. strh r0, [r4, #0xc]
  145. ldrb r0, [r1, #2]
  146. strb r0, [r4, #0x1a]
  147. movs r0, #0xff
  148. strb r0, [r4, #0x1b]
  149. mov r0, sp
  150. strh r5, [r0]
  151. ldr r2, _08063B88 @ =0x03000064
  152. adds r1, r6, r2
  153. ldr r3, _08063B8C @ =0x01000002
  154. mov r8, r3
  155. mov r2, r8
  156. bl CpuSet
  157. mov r0, sp
  158. adds r0, #2
  159. strh r5, [r0]
  160. ldr r2, _08063B90 @ =0x0300005C
  161. adds r1, r6, r2
  162. mov r2, r8
  163. bl CpuSet
  164. adds r0, r4, #0
  165. bl UpdateSpriteAnimation
  166. strh r5, [r7, #0x10]
  167. strh r5, [r7, #0x12]
  168. movs r0, #0x80
  169. lsls r0, r0, #2
  170. str r0, [r7, #0x14]
  171. str r5, [r7, #0x18]
  172. mov r3, sb
  173. ldr r1, [r3]
  174. ldr r0, _08063B94 @ =Task_MarunInit
  175. str r0, [r1, #8]
  176. b _08063BAA
  177. .align 2, 0
  178. _08063B6C: .4byte gCurTask
  179. _08063B70: .4byte 0x03000024
  180. _08063B74: .4byte 0x0300001C
  181. _08063B78: .4byte 0x0300000C
  182. _08063B7C: .4byte 0x03000009
  183. _08063B80: .4byte 0x03000038
  184. _08063B84: .4byte gUnknown_080D210C
  185. _08063B88: .4byte 0x03000064
  186. _08063B8C: .4byte 0x01000002
  187. _08063B90: .4byte 0x0300005C
  188. _08063B94: .4byte Task_MarunInit
  189. _08063B98:
  190. adds r0, r7, #0
  191. bl sub_8063D38
  192. cmp r0, #1
  193. bne _08063BAA
  194. mov r4, sb
  195. ldr r0, [r4]
  196. bl TaskDestroy
  197. _08063BAA:
  198. add sp, #4
  199. pop {r3, r4}
  200. mov r8, r3
  201. mov sb, r4
  202. pop {r4, r5, r6, r7}
  203. pop {r0}
  204. bx r0
  205. ```
  206.  
  207. Use the following structure for the `enemy` variable in the new code:
  208. ```
  209. typedef struct {
  210. /* 0x00 */ MapEntity *me;
  211. /* 0x04 */ u8 unk4;
  212. /* 0x05 */ u8 unk5;
  213. /* 0x06 */ u8 id;
  214. /* 0x07 */ u8 spriteX;
  215. /* 0x08 */ u8 unk8;
  216. /* 0x09 */ u8 unk9;
  217. /* 0x0A */ s8 direction;
  218. /* 0x0C */ u16 region[2];
  219. /* 0x10 */ u16 rotation;
  220. /* 0x12 */ u16 unk12;
  221. /* 0x14 */ s32 unk14;
  222. /* 0x18 */ s32 unk18;
  223. /* 0x1C */ Vec2_32 qUnk1C;
  224. /* 0x24 */ Vec2_32 qPos;
  225. /* 0x2C */ SpriteTransform transform;
  226. /* 0x38 */ Sprite s;
  227. /* 0x60 */ Hitbox reserved;
  228. } Marun; /* size: 0x68 */
  229. ```
  230.  
  231. You know that the `Sprite` has the following structure:
  232. ```
  233. typedef struct {
  234. /* 0x00 */ u8 *tiles; // in VRAM
  235. /* 0x04 */ u32 frameNum;
  236.  
  237. // Bitfield description from KATAM decomp
  238. /* 0x08 */ u32 frameFlags; // bit 0-4: affine-index / rotscale param selection
  239. // bit 5: rotscale enable
  240. // bit 6: rotscale double-size
  241. // bit 7-8: obj mode -- different (1 bit) in SA3?
  242. // bit 9
  243. // bit 10 X-Flip
  244. // bit 11 Y-Flip
  245. // bit 12-13: priority
  246. // bit 14: Animation finished
  247. // bit 15-16: Background ID
  248. // bit 17
  249. // bit 18
  250. // bit 19-25(?)
  251. // bit 26
  252. // bit 27-29(?)
  253. // bit 30
  254. // bit 31
  255. /* 0x0C */ u16 anim;
  256. /* 0x0E */ u16 animCursor;
  257. /* 0x10 */ s16 x;
  258. /* 0x12 */ s16 y;
  259. /* 0x14 */ s16 oamFlags; // bit 6-10: OAM order index
  260. /* 0x16 */ s16 qAnimDelay; // Q_8_8, in frames
  261. /* 0x18 */ u16 prevAnim;
  262. /* 0x1A */ u8 variant;
  263. /* 0x1B */ u8 prevVariant;
  264.  
  265. // 0x08 = 0.5x, 0x10 = 1.0x, 0x20 = 2.0x ...
  266. /* 0x1C */ u8 animSpeed;
  267.  
  268. /* 0x1D */ u8 oamBaseIndex;
  269. /* 0x1E */ u8 numSubFrames;
  270. /* 0x1F */ u8 palId; // (0 - 15)
  271. /* 0x20 */ Hitbox hitboxes[1];
  272. } Sprite; /* size: 0x28 (more with multiple Hitboxes) */
  273. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement