diff --git a/asm/code_8002774.s b/asm/code_8002774.s index 41bbd5344..9cd18cc4c 100644 --- a/asm/code_8002774.s +++ b/asm/code_8002774.s @@ -417,623 +417,4 @@ _08002A68: bx r1 thumb_func_end sub_8002984 -@ https://decomp.me/scratch/HXC9z -@ https://decomp.me/scratch/BWmWQ -@ https://decomp.me/scratch/QfX03 - thumb_func_start sub_8002A70 -sub_8002A70: - push {r4,lr} - lsls r0, 24 - asrs r3, r0, 24 - lsls r1, 24 - asrs r4, r1, 24 - lsls r2, 24 - lsrs r0, r2, 24 - cmp r3, r4 - beq _08002AFC - subs r0, 0x1 - cmp r0, 0xA - bhi _08002AFC - lsls r0, 2 - ldr r1, _08002A94 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08002A94: .4byte _08002A98 - .align 2, 0 -_08002A98: - .4byte _08002AC4 - .4byte _08002ACC - .4byte _08002AD4 - .4byte _08002ADC - .4byte _08002AFC - .4byte _08002AFC - .4byte _08002AFC - .4byte _08002AFC - .4byte _08002AFC - .4byte _08002AF2 - .4byte _08002AE8 -_08002AC4: - cmp r3, 0 - blt _08002AFC - adds r3, 0x7 - b _08002AE2 -_08002ACC: - cmp r3, 0 - blt _08002AFC - adds r3, 0x1 - b _08002AE2 -_08002AD4: - cmp r3, 0 - blt _08002AFC - adds r3, 0x6 - b _08002AE2 -_08002ADC: - cmp r3, 0 - blt _08002AFC - adds r3, 0x2 -_08002AE2: - movs r0, 0x7 - ands r3, r0 - b _08002AFC -_08002AE8: - adds r0, r3, 0 - adds r1, r4, 0 - bl sub_8002B04 - adds r3, r0, 0 -_08002AF2: - adds r0, r3, 0 - adds r1, r4, 0 - bl sub_8002B04 - adds r3, r0, 0 -_08002AFC: - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8002A70 - -@ https://decomp.me/scratch/oCt37 -@ https://decomp.me/scratch/ZTHtV [Probably the correct one] - thumb_func_start sub_8002B04 -sub_8002B04: - push {lr} - lsls r0, 24 - asrs r2, r0, 24 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _08002B56 - adds r0, r2, 0 - subs r0, 0x8 - subs r1, r0 - adds r0, r1, 0 - cmp r1, 0 - bge _08002B24 - adds r0, r1, 0x7 -_08002B24: - asrs r0, 3 - lsls r0, 3 - subs r0, r1, r0 - cmp r0, 0 - beq _08002B56 - cmp r0, 0x3 - bgt _08002B40 - adds r1, r2, 0x1 - adds r0, r1, 0 - cmp r1, 0 - bge _08002B4C - adds r0, r2, 0 - adds r0, 0x8 - b _08002B4C -_08002B40: - adds r1, r2, 0x7 - adds r0, r1, 0 - cmp r1, 0 - bge _08002B4C - adds r0, r2, 0 - adds r0, 0xE -_08002B4C: - asrs r0, 3 - lsls r0, 3 - subs r0, r1, r0 - lsls r0, 24 - asrs r2, r0, 24 -_08002B56: - adds r0, r2, 0 - pop {r1} - bx r1 - thumb_func_end sub_8002B04 - - thumb_func_start sub_8002B5C -sub_8002B5C: - push {lr} - lsls r0, 24 - asrs r2, r0, 24 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _08002BAE - adds r0, r2, 0 - subs r0, 0x8 - subs r1, r0 - adds r0, r1, 0 - cmp r1, 0 - bge _08002B7C - adds r0, r1, 0x7 -_08002B7C: - asrs r0, 3 - lsls r0, 3 - subs r0, r1, r0 - cmp r0, 0 - beq _08002BAE - cmp r0, 0x3 - bgt _08002B98 - adds r1, r2, 0x2 - adds r0, r1, 0 - cmp r1, 0 - bge _08002BA4 - adds r0, r2, 0 - adds r0, 0x9 - b _08002BA4 -_08002B98: - adds r1, r2, 0x6 - adds r0, r1, 0 - cmp r1, 0 - bge _08002BA4 - adds r0, r2, 0 - adds r0, 0xD -_08002BA4: - asrs r0, 3 - lsls r0, 3 - subs r0, r1, r0 - lsls r0, 24 - asrs r2, r0, 24 -_08002BAE: - movs r0, 0x6 - ands r2, r0 - adds r0, r2, 0 - pop {r1} - bx r1 - thumb_func_end sub_8002B5C - - thumb_func_start SetVecFromDirectionSpeed -SetVecFromDirectionSpeed: - push {r4,r5,lr} - lsls r1, 24 - asrs r1, 21 - ldr r3, _08002BD8 - adds r1, r3 - ldr r5, [r1] - adds r3, r5, 0 - muls r3, r2 - ldr r1, [r1, 0x4] - adds r4, r1, 0 - muls r4, r2 - str r3, [r0] - str r4, [r0, 0x4] - pop {r4,r5} - pop {r2} - bx r2 - .align 2, 0 -_08002BD8: .4byte gVectorDirections - thumb_func_end SetVecFromDirectionSpeed - - thumb_func_start VecDirection8Sign -VecDirection8Sign: - push {lr} - ldr r1, [r0] - cmp r1, 0 - bge _08002BFA - ldr r0, [r0, 0x4] - cmp r0, 0 - bge _08002BEE - movs r0, 0x5 - b _08002C2A -_08002BEE: - cmp r0, 0 - ble _08002BF6 - movs r0, 0x7 - b _08002C2A -_08002BF6: - movs r0, 0x6 - b _08002C2A -_08002BFA: - cmp r1, 0 - ble _08002C14 - ldr r0, [r0, 0x4] - cmp r0, 0 - bge _08002C08 - movs r0, 0x3 - b _08002C2A -_08002C08: - cmp r0, 0 - ble _08002C10 - movs r0, 0x1 - b _08002C2A -_08002C10: - movs r0, 0x2 - b _08002C2A -_08002C14: - ldr r0, [r0, 0x4] - cmp r0, 0 - bge _08002C1E - movs r0, 0x4 - b _08002C2A -_08002C1E: - cmp r0, 0 - bgt _08002C28 - movs r0, 0x1 - negs r0, r0 - b _08002C2A -_08002C28: - movs r0, 0 -_08002C2A: - pop {r1} - bx r1 - thumb_func_end VecDirection8Sign - - thumb_func_start VecDirection4SignYX -VecDirection4SignYX: - push {lr} - ldr r1, [r0, 0x4] - cmp r1, 0 - bge _08002C3C - movs r0, 0x4 - b _08002C5A -_08002C3C: - cmp r1, 0 - ble _08002C44 - movs r0, 0 - b _08002C5A -_08002C44: - ldr r0, [r0] - cmp r0, 0 - bge _08002C4E - movs r0, 0x6 - b _08002C5A -_08002C4E: - cmp r0, 0 - bgt _08002C58 - movs r0, 0x1 - negs r0, r0 - b _08002C5A -_08002C58: - movs r0, 0x2 -_08002C5A: - pop {r1} - bx r1 - thumb_func_end VecDirection4SignYX - - thumb_func_start VecDirection8Radial -VecDirection8Radial: - push {r4,r5,lr} - adds r4, r0, 0 - ldr r0, [r4] - cmp r0, 0 - bge _08002C6C - negs r0, r0 -_08002C6C: - adds r1, r0, 0 - ldr r3, [r4, 0x4] - adds r5, r3, 0 - cmp r3, 0 - bge _08002C78 - negs r5, r3 -_08002C78: - adds r2, r5, 0 - ldr r4, [r4] - cmp r4, 0 - bge _08002CA8 - cmp r3, 0 - bge _08002C94 - lsls r0, 1 - cmp r2, r0 - bgt _08002CD8 - lsls r0, r5, 1 - cmp r1, r0 - bgt _08002CA0 - movs r0, 0x5 - b _08002CE8 -_08002C94: - lsls r0, 1 - cmp r2, r0 - bgt _08002CE6 - lsls r0, r5, 1 - cmp r1, r0 - ble _08002CA4 -_08002CA0: - movs r0, 0x6 - b _08002CE8 -_08002CA4: - movs r0, 0x7 - b _08002CE8 -_08002CA8: - cmp r4, 0 - ble _08002CD4 - cmp r3, 0 - bge _08002CC0 - lsls r0, 1 - cmp r2, r0 - bgt _08002CD8 - lsls r0, r5, 1 - cmp r1, r0 - bgt _08002CCC - movs r0, 0x3 - b _08002CE8 -_08002CC0: - lsls r0, 1 - cmp r2, r0 - bgt _08002CE6 - lsls r0, r5, 1 - cmp r1, r0 - ble _08002CD0 -_08002CCC: - movs r0, 0x2 - b _08002CE8 -_08002CD0: - movs r0, 0x1 - b _08002CE8 -_08002CD4: - cmp r3, 0 - bge _08002CDC -_08002CD8: - movs r0, 0x4 - b _08002CE8 -_08002CDC: - cmp r3, 0 - bgt _08002CE6 - movs r0, 0x1 - negs r0, r0 - b _08002CE8 -_08002CE6: - movs r0, 0 -_08002CE8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end VecDirection8Radial - - thumb_func_start VecDirection4Radial -VecDirection4Radial: - push {r4,lr} - adds r4, r0, 0 - ldr r3, [r4] - cmp r3, 0 - bge _08002CFC - negs r3, r3 -_08002CFC: - adds r1, r3, 0 - ldr r3, [r4, 0x4] - adds r0, r3, 0 - cmp r3, 0 - bge _08002D08 - negs r0, r3 -_08002D08: - adds r2, r0, 0 - ldr r0, [r4] - cmp r0, 0 - bge _08002D22 - cmp r3, 0 - bge _08002D1A - cmp r2, r1 - bgt _08002D3C - b _08002D1E -_08002D1A: - cmp r2, r1 - bgt _08002D4A -_08002D1E: - movs r0, 0x6 - b _08002D4C -_08002D22: - cmp r0, 0 - ble _08002D38 - cmp r3, 0 - bge _08002D30 - cmp r2, r1 - bgt _08002D3C - b _08002D34 -_08002D30: - cmp r2, r1 - bgt _08002D4A -_08002D34: - movs r0, 0x2 - b _08002D4C -_08002D38: - cmp r3, 0 - bge _08002D40 -_08002D3C: - movs r0, 0x4 - b _08002D4C -_08002D40: - cmp r3, 0 - bgt _08002D4A - movs r0, 0x1 - negs r0, r0 - b _08002D4C -_08002D4A: - movs r0, 0 -_08002D4C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end VecDirection4Radial - - thumb_func_start SizedDeltaDirection4 -SizedDeltaDirection4: - push {r4,r5,lr} - sub sp, 0x8 - adds r4, r1, 0 - adds r5, r3, 0 - ldr r3, [r2] - ldr r1, [r0] - subs r3, r1 - str r3, [sp] - ldr r1, [r2, 0x4] - ldr r0, [r0, 0x4] - subs r1, r0 - str r1, [sp, 0x4] - adds r2, r3, 0 - cmp r2, 0 - blt _08002D8A - adds r2, 0x1 - ldr r0, [r4] - ldr r1, [r5] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - subs r2, r0 - str r2, [sp] - cmp r2, 0 - bge _08002DA4 - b _08002DA0 -_08002D8A: - subs r2, r3, 0x1 - ldr r0, [r4] - ldr r1, [r5] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - adds r2, r0 - str r2, [sp] - cmp r2, 0 - ble _08002DA4 -_08002DA0: - movs r0, 0 - str r0, [sp] -_08002DA4: - ldr r2, [sp, 0x4] - cmp r2, 0 - blt _08002DC2 - adds r2, 0x1 - ldr r0, [r4, 0x4] - ldr r1, [r5, 0x4] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - subs r2, r0 - str r2, [sp, 0x4] - cmp r2, 0 - bge _08002DDC - b _08002DD8 -_08002DC2: - subs r2, 0x1 - ldr r0, [r4, 0x4] - ldr r1, [r5, 0x4] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - adds r2, r0 - str r2, [sp, 0x4] - cmp r2, 0 - ble _08002DDC -_08002DD8: - movs r0, 0 - str r0, [sp, 0x4] -_08002DDC: - mov r0, sp - bl VecDirection4Radial - lsls r0, 24 - asrs r0, 24 - add sp, 0x8 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end SizedDeltaDirection4 - - thumb_func_start SizedDeltaDirection8 -SizedDeltaDirection8: - push {r4,r5,lr} - sub sp, 0x8 - adds r4, r1, 0 - adds r5, r3, 0 - ldr r3, [r2] - ldr r1, [r0] - subs r3, r1 - str r3, [sp] - ldr r1, [r2, 0x4] - ldr r0, [r0, 0x4] - subs r1, r0 - str r1, [sp, 0x4] - adds r2, r3, 0 - cmp r2, 0 - blt _08002E26 - adds r2, 0x1 - ldr r0, [r4] - ldr r1, [r5] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - subs r2, r0 - str r2, [sp] - cmp r2, 0 - bge _08002E40 - b _08002E3C -_08002E26: - subs r2, r3, 0x1 - ldr r0, [r4] - ldr r1, [r5] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - adds r2, r0 - str r2, [sp] - cmp r2, 0 - ble _08002E40 -_08002E3C: - movs r0, 0 - str r0, [sp] -_08002E40: - ldr r2, [sp, 0x4] - cmp r2, 0 - blt _08002E5E - adds r2, 0x1 - ldr r0, [r4, 0x4] - ldr r1, [r5, 0x4] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - subs r2, r0 - str r2, [sp, 0x4] - cmp r2, 0 - bge _08002E78 - b _08002E74 -_08002E5E: - subs r2, 0x1 - ldr r0, [r4, 0x4] - ldr r1, [r5, 0x4] - adds r0, r1 - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - adds r2, r0 - str r2, [sp, 0x4] - cmp r2, 0 - ble _08002E78 -_08002E74: - movs r0, 0 - str r0, [sp, 0x4] -_08002E78: - mov r0, sp - bl VecDirection8Radial - lsls r0, 24 - asrs r0, 24 - add sp, 0x8 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end SizedDeltaDirection8 - .align 2, 0 @ Don't pad with nop. diff --git a/asm/code_8002774_2.s b/asm/code_8002774_2.s new file mode 100644 index 000000000..f369a8534 --- /dev/null +++ b/asm/code_8002774_2.s @@ -0,0 +1,497 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + + thumb_func_start sub_8002B5C +sub_8002B5C: + push {lr} + lsls r0, 24 + asrs r2, r0, 24 + lsls r1, 24 + asrs r1, 24 + movs r0, 0x1 + negs r0, r0 + cmp r1, r0 + beq _08002BAE + adds r0, r2, 0 + subs r0, 0x8 + subs r1, r0 + adds r0, r1, 0 + cmp r1, 0 + bge _08002B7C + adds r0, r1, 0x7 +_08002B7C: + asrs r0, 3 + lsls r0, 3 + subs r0, r1, r0 + cmp r0, 0 + beq _08002BAE + cmp r0, 0x3 + bgt _08002B98 + adds r1, r2, 0x2 + adds r0, r1, 0 + cmp r1, 0 + bge _08002BA4 + adds r0, r2, 0 + adds r0, 0x9 + b _08002BA4 +_08002B98: + adds r1, r2, 0x6 + adds r0, r1, 0 + cmp r1, 0 + bge _08002BA4 + adds r0, r2, 0 + adds r0, 0xD +_08002BA4: + asrs r0, 3 + lsls r0, 3 + subs r0, r1, r0 + lsls r0, 24 + asrs r2, r0, 24 +_08002BAE: + movs r0, 0x6 + ands r2, r0 + adds r0, r2, 0 + pop {r1} + bx r1 + thumb_func_end sub_8002B5C + + thumb_func_start SetVecFromDirectionSpeed +SetVecFromDirectionSpeed: + push {r4,r5,lr} + lsls r1, 24 + asrs r1, 21 + ldr r3, _08002BD8 + adds r1, r3 + ldr r5, [r1] + adds r3, r5, 0 + muls r3, r2 + ldr r1, [r1, 0x4] + adds r4, r1, 0 + muls r4, r2 + str r3, [r0] + str r4, [r0, 0x4] + pop {r4,r5} + pop {r2} + bx r2 + .align 2, 0 +_08002BD8: .4byte gVectorDirections + thumb_func_end SetVecFromDirectionSpeed + + thumb_func_start VecDirection8Sign +VecDirection8Sign: + push {lr} + ldr r1, [r0] + cmp r1, 0 + bge _08002BFA + ldr r0, [r0, 0x4] + cmp r0, 0 + bge _08002BEE + movs r0, 0x5 + b _08002C2A +_08002BEE: + cmp r0, 0 + ble _08002BF6 + movs r0, 0x7 + b _08002C2A +_08002BF6: + movs r0, 0x6 + b _08002C2A +_08002BFA: + cmp r1, 0 + ble _08002C14 + ldr r0, [r0, 0x4] + cmp r0, 0 + bge _08002C08 + movs r0, 0x3 + b _08002C2A +_08002C08: + cmp r0, 0 + ble _08002C10 + movs r0, 0x1 + b _08002C2A +_08002C10: + movs r0, 0x2 + b _08002C2A +_08002C14: + ldr r0, [r0, 0x4] + cmp r0, 0 + bge _08002C1E + movs r0, 0x4 + b _08002C2A +_08002C1E: + cmp r0, 0 + bgt _08002C28 + movs r0, 0x1 + negs r0, r0 + b _08002C2A +_08002C28: + movs r0, 0 +_08002C2A: + pop {r1} + bx r1 + thumb_func_end VecDirection8Sign + + thumb_func_start VecDirection4SignYX +VecDirection4SignYX: + push {lr} + ldr r1, [r0, 0x4] + cmp r1, 0 + bge _08002C3C + movs r0, 0x4 + b _08002C5A +_08002C3C: + cmp r1, 0 + ble _08002C44 + movs r0, 0 + b _08002C5A +_08002C44: + ldr r0, [r0] + cmp r0, 0 + bge _08002C4E + movs r0, 0x6 + b _08002C5A +_08002C4E: + cmp r0, 0 + bgt _08002C58 + movs r0, 0x1 + negs r0, r0 + b _08002C5A +_08002C58: + movs r0, 0x2 +_08002C5A: + pop {r1} + bx r1 + thumb_func_end VecDirection4SignYX + + thumb_func_start VecDirection8Radial +VecDirection8Radial: + push {r4,r5,lr} + adds r4, r0, 0 + ldr r0, [r4] + cmp r0, 0 + bge _08002C6C + negs r0, r0 +_08002C6C: + adds r1, r0, 0 + ldr r3, [r4, 0x4] + adds r5, r3, 0 + cmp r3, 0 + bge _08002C78 + negs r5, r3 +_08002C78: + adds r2, r5, 0 + ldr r4, [r4] + cmp r4, 0 + bge _08002CA8 + cmp r3, 0 + bge _08002C94 + lsls r0, 1 + cmp r2, r0 + bgt _08002CD8 + lsls r0, r5, 1 + cmp r1, r0 + bgt _08002CA0 + movs r0, 0x5 + b _08002CE8 +_08002C94: + lsls r0, 1 + cmp r2, r0 + bgt _08002CE6 + lsls r0, r5, 1 + cmp r1, r0 + ble _08002CA4 +_08002CA0: + movs r0, 0x6 + b _08002CE8 +_08002CA4: + movs r0, 0x7 + b _08002CE8 +_08002CA8: + cmp r4, 0 + ble _08002CD4 + cmp r3, 0 + bge _08002CC0 + lsls r0, 1 + cmp r2, r0 + bgt _08002CD8 + lsls r0, r5, 1 + cmp r1, r0 + bgt _08002CCC + movs r0, 0x3 + b _08002CE8 +_08002CC0: + lsls r0, 1 + cmp r2, r0 + bgt _08002CE6 + lsls r0, r5, 1 + cmp r1, r0 + ble _08002CD0 +_08002CCC: + movs r0, 0x2 + b _08002CE8 +_08002CD0: + movs r0, 0x1 + b _08002CE8 +_08002CD4: + cmp r3, 0 + bge _08002CDC +_08002CD8: + movs r0, 0x4 + b _08002CE8 +_08002CDC: + cmp r3, 0 + bgt _08002CE6 + movs r0, 0x1 + negs r0, r0 + b _08002CE8 +_08002CE6: + movs r0, 0 +_08002CE8: + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end VecDirection8Radial + + thumb_func_start VecDirection4Radial +VecDirection4Radial: + push {r4,lr} + adds r4, r0, 0 + ldr r3, [r4] + cmp r3, 0 + bge _08002CFC + negs r3, r3 +_08002CFC: + adds r1, r3, 0 + ldr r3, [r4, 0x4] + adds r0, r3, 0 + cmp r3, 0 + bge _08002D08 + negs r0, r3 +_08002D08: + adds r2, r0, 0 + ldr r0, [r4] + cmp r0, 0 + bge _08002D22 + cmp r3, 0 + bge _08002D1A + cmp r2, r1 + bgt _08002D3C + b _08002D1E +_08002D1A: + cmp r2, r1 + bgt _08002D4A +_08002D1E: + movs r0, 0x6 + b _08002D4C +_08002D22: + cmp r0, 0 + ble _08002D38 + cmp r3, 0 + bge _08002D30 + cmp r2, r1 + bgt _08002D3C + b _08002D34 +_08002D30: + cmp r2, r1 + bgt _08002D4A +_08002D34: + movs r0, 0x2 + b _08002D4C +_08002D38: + cmp r3, 0 + bge _08002D40 +_08002D3C: + movs r0, 0x4 + b _08002D4C +_08002D40: + cmp r3, 0 + bgt _08002D4A + movs r0, 0x1 + negs r0, r0 + b _08002D4C +_08002D4A: + movs r0, 0 +_08002D4C: + pop {r4} + pop {r1} + bx r1 + thumb_func_end VecDirection4Radial + + thumb_func_start SizedDeltaDirection4 +SizedDeltaDirection4: + push {r4,r5,lr} + sub sp, 0x8 + adds r4, r1, 0 + adds r5, r3, 0 + ldr r3, [r2] + ldr r1, [r0] + subs r3, r1 + str r3, [sp] + ldr r1, [r2, 0x4] + ldr r0, [r0, 0x4] + subs r1, r0 + str r1, [sp, 0x4] + adds r2, r3, 0 + cmp r2, 0 + blt _08002D8A + adds r2, 0x1 + ldr r0, [r4] + ldr r1, [r5] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + subs r2, r0 + str r2, [sp] + cmp r2, 0 + bge _08002DA4 + b _08002DA0 +_08002D8A: + subs r2, r3, 0x1 + ldr r0, [r4] + ldr r1, [r5] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + adds r2, r0 + str r2, [sp] + cmp r2, 0 + ble _08002DA4 +_08002DA0: + movs r0, 0 + str r0, [sp] +_08002DA4: + ldr r2, [sp, 0x4] + cmp r2, 0 + blt _08002DC2 + adds r2, 0x1 + ldr r0, [r4, 0x4] + ldr r1, [r5, 0x4] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + subs r2, r0 + str r2, [sp, 0x4] + cmp r2, 0 + bge _08002DDC + b _08002DD8 +_08002DC2: + subs r2, 0x1 + ldr r0, [r4, 0x4] + ldr r1, [r5, 0x4] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + adds r2, r0 + str r2, [sp, 0x4] + cmp r2, 0 + ble _08002DDC +_08002DD8: + movs r0, 0 + str r0, [sp, 0x4] +_08002DDC: + mov r0, sp + bl VecDirection4Radial + lsls r0, 24 + asrs r0, 24 + add sp, 0x8 + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end SizedDeltaDirection4 + + thumb_func_start SizedDeltaDirection8 +SizedDeltaDirection8: + push {r4,r5,lr} + sub sp, 0x8 + adds r4, r1, 0 + adds r5, r3, 0 + ldr r3, [r2] + ldr r1, [r0] + subs r3, r1 + str r3, [sp] + ldr r1, [r2, 0x4] + ldr r0, [r0, 0x4] + subs r1, r0 + str r1, [sp, 0x4] + adds r2, r3, 0 + cmp r2, 0 + blt _08002E26 + adds r2, 0x1 + ldr r0, [r4] + ldr r1, [r5] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + subs r2, r0 + str r2, [sp] + cmp r2, 0 + bge _08002E40 + b _08002E3C +_08002E26: + subs r2, r3, 0x1 + ldr r0, [r4] + ldr r1, [r5] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + adds r2, r0 + str r2, [sp] + cmp r2, 0 + ble _08002E40 +_08002E3C: + movs r0, 0 + str r0, [sp] +_08002E40: + ldr r2, [sp, 0x4] + cmp r2, 0 + blt _08002E5E + adds r2, 0x1 + ldr r0, [r4, 0x4] + ldr r1, [r5, 0x4] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + subs r2, r0 + str r2, [sp, 0x4] + cmp r2, 0 + bge _08002E78 + b _08002E74 +_08002E5E: + subs r2, 0x1 + ldr r0, [r4, 0x4] + ldr r1, [r5, 0x4] + adds r0, r1 + lsrs r1, r0, 31 + adds r0, r1 + asrs r0, 1 + adds r2, r0 + str r2, [sp, 0x4] + cmp r2, 0 + ble _08002E78 +_08002E74: + movs r0, 0 + str r0, [sp, 0x4] +_08002E78: + mov r0, sp + bl VecDirection8Radial + lsls r0, 24 + asrs r0, 24 + add sp, 0x8 + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end SizedDeltaDirection8 + + .align 2, 0 @ Don't pad with nop. diff --git a/include/code_8002774.h b/include/code_8002774.h new file mode 100644 index 000000000..334ffef80 --- /dev/null +++ b/include/code_8002774.h @@ -0,0 +1,7 @@ +#ifndef GUARD_CODE_8002774_H +#define GUARD_CODE_8002774_H + +s32 sub_8002A70(s32 a0, s32 a1, s32 a2); +s32 sub_8002B04(s32, s32); + +#endif diff --git a/include/code_80869E4.h b/include/code_80869E4.h index 43e9bb5f9..a5d9ebce6 100644 --- a/include/code_80869E4.h +++ b/include/code_80869E4.h @@ -38,6 +38,6 @@ void sub_8086854(void); void sub_80868F4(Entity *entity); void sub_8086910(Entity *entity); void sub_808692C(void); -void sub_80869E4(Entity *, s32, u8, s8 direction); +void sub_80869E4(struct Entity *entity, s32 a1, u8 a2, s32 _someDirection); #endif // GUARD_CODE_80869E4_H diff --git a/ld_script.txt b/ld_script.txt index 9dcc39f80..af9e6421d 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -49,6 +49,8 @@ SECTIONS { asm/event_flag.o(.text); src/event_flag.o(.text); asm/code_8002774.o(.text); + src/code_8002774.o(.text); + asm/code_8002774_2.o(.text); src/memory.o(.text); asm/memory.o(.text); src/memory_mid.o(.text); diff --git a/src/code_8002774.c b/src/code_8002774.c new file mode 100644 index 000000000..b7e52b77e --- /dev/null +++ b/src/code_8002774.c @@ -0,0 +1,68 @@ +#include "global.h" +#include "code_8002774.h" +#include "constants/direction.h" + +s32 sub_8002A70(s32 _direction1, s32 _direction2, s32 _caseId) +{ + s32 direction1 = (s8)(_direction1); + s32 direction2 = (s8)(_direction2); + s32 caseId = (u8)(_caseId); + + if (direction1 == direction2) + return direction1; + + switch (caseId) { + case 1: + if (direction1 >= 0) { + direction1 += 7; + direction1 &= DIRECTION_MASK; + } + break; + case 2: + if (direction1 >= 0) { + direction1 += 1; + direction1 &= DIRECTION_MASK; + } + break; + case 3: + if (direction1 >= 0) { + direction1 += 6; + direction1 &= DIRECTION_MASK; + } + break; + case 4: + if (direction1 >= 0) { + direction1 += 2; + direction1 &= DIRECTION_MASK; + } + break; + case 11: + direction1 = sub_8002B04(direction1, direction2); + // Fallthrough + case 10: + direction1 = sub_8002B04(direction1, direction2); + break; + } + return direction1; +} + +s32 sub_8002B04(s32 _direction1, s32 _direction2) +{ + s32 direction1 = (s8)(_direction1); + s32 direction2 = (s8)(_direction2); + + if (direction2 != -1) + { + s32 newDirection = ((direction2 + NUM_DIRECTIONS) - direction1) % NUM_DIRECTIONS; + + if (newDirection != 0) { + if (newDirection < 4) + newDirection = (direction1 + 1) % NUM_DIRECTIONS; + else + newDirection = (direction1 + 7) % NUM_DIRECTIONS; + + direction1 = (s8)newDirection; + } + } + return direction1; +} diff --git a/src/code_80869E4.c b/src/code_80869E4.c index 710c0db20..33f398c27 100644 --- a/src/code_80869E4.c +++ b/src/code_80869E4.c @@ -1,4 +1,5 @@ #include "global.h" +#include "code_800E9E4.h" #include "code_803E46C.h" #include "code_803E668.h" #include "code_806CD90.h" @@ -474,71 +475,18 @@ void SpriteLookAroundEffect(Entity *entity) sub_803E708(15, 70); } -#ifdef NONMATCHING // 100% match, but params for sub_8002A70 are disputed... https://decomp.me/scratch/E3iF1 -void sub_80869E4(Entity *a0, s32 a1, u8 a2, s8 a3) +void sub_80869E4(struct Entity *entity, s32 a1, u8 a2, s32 _someDirection) { - u32 r4; - s32 tmp; - struct EntityInfo* info; + s32 someDirection = (s8) _someDirection; + struct EntityInfo *info = GetEntInfo(entity); + s32 direction = (s8) info->action.direction; - tmp = (s8)a3; - - info = GetEntInfo(a0); - r4 = (s8)info->action.direction; - while (r4 != tmp) { - r4 = sub_8002A70(r4, tmp, a2); - info->action.direction = r4 % 8; - sub_806CE68(a0, info->action.direction); + while (direction != someDirection) { + direction = (s8) sub_8002A70(direction, someDirection, a2); + info->action.direction = direction; + info->action.direction &= DIRECTION_MASK; + sub_806CE68(entity, info->action.direction); sub_803E708(a1, 70); } } -#else -NAKED -void sub_80869E4(Entity *a0, s32 a1, u8 a2, s8 a3) -{ - asm_unified( - "push {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tadds r7, r0, 0\n" - "\tmov r9, r1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tmov r8, r2\n" - "\tlsls r3, 24\n" - "\tasrs r6, r3, 24\n" - "\tldr r0, [r7, 0x70]\n" - "\tadds r0, 0x46\n" - "\tmovs r4, 0\n" - "\tldrsb r4, [r0, r4]\n" - "\tcmp r4, r6\n" - "\tbeq _08086A30\n" - "\tadds r5, r0, 0\n" -"_08086A08:\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r6, 0\n" - "\tmov r2, r8\n" - "\tbl sub_8002A70\n" - "\tlsls r0, 24\n" - "\tasrs r4, r0, 24\n" - "\tmovs r0, 0x7\n" - "\tands r0, r4\n" - "\tstrb r0, [r5]\n" - "\tldrb r1, [r5]\n" - "\tadds r0, r7, 0\n" - "\tbl sub_806CE68\n" - "\tmov r0, r9\n" - "\tmovs r1, 0x46\n" - "\tbl sub_803E708\n" - "\tcmp r4, r6\n" - "\tbne _08086A08\n" -"_08086A30:\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif // NONMATCHING + diff --git a/src/dungeon_move.c b/src/dungeon_move.c index d654f04e8..94a190198 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -39,6 +39,7 @@ #include "code_803E724.h" #include "code_803E46C.h" #include "code_8041AD0.h" +#include "code_800E9E4.h" extern void sub_80429C8(Entity *r0); extern bool8 sub_8045888(Entity *r0);