summaryrefslogtreecommitdiff
path: root/asm/util.s
diff options
context:
space:
mode:
Diffstat (limited to 'asm/util.s')
-rw-r--r--asm/util.s478
1 files changed, 478 insertions, 0 deletions
diff --git a/asm/util.s b/asm/util.s
new file mode 100644
index 000000000..f204eac43
--- /dev/null
+++ b/asm/util.s
@@ -0,0 +1,478 @@
+ .include "constants/gba_constants.inc"
+ .include "asm/macros.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start CreateInvisibleSpriteWithCallback
+CreateInvisibleSpriteWithCallback: @ 8040EB4
+ push {r4-r6,lr}
+ adds r6, r0, 0
+ ldr r0, _08040EE8 @ =gSpriteTemplate_82087AC
+ movs r1, 0xF8
+ movs r2, 0xA8
+ movs r3, 0xE
+ bl CreateSprite
+ lsls r0, 24
+ lsrs r0, 24
+ ldr r5, _08040EEC @ =gSprites
+ lsls r2, r0, 4
+ adds r2, r0
+ lsls r2, 2
+ adds r3, r2, r5
+ adds r3, 0x3E
+ ldrb r1, [r3]
+ movs r4, 0x4
+ orrs r1, r4
+ strb r1, [r3]
+ adds r5, 0x1C
+ adds r2, r5
+ str r6, [r2]
+ pop {r4-r6}
+ pop {r1}
+ bx r1
+ .align 2, 0
+_08040EE8: .4byte gSpriteTemplate_82087AC
+_08040EEC: .4byte gSprites
+ thumb_func_end CreateInvisibleSpriteWithCallback
+
+ thumb_func_start StoreWordInTwoHalfwords
+StoreWordInTwoHalfwords: @ 8040EF0
+ strh r1, [r0]
+ lsrs r1, 16
+ strh r1, [r0, 0x2]
+ bx lr
+ thumb_func_end StoreWordInTwoHalfwords
+
+ thumb_func_start LoadWordFromTwoHalfwords
+LoadWordFromTwoHalfwords: @ 8040EF8
+ ldrh r2, [r0]
+ movs r3, 0x2
+ ldrsh r0, [r0, r3]
+ lsls r0, 16
+ orrs r2, r0
+ str r2, [r1]
+ bx lr
+ thumb_func_end LoadWordFromTwoHalfwords
+
+ thumb_func_start SetBgAffineStruct
+SetBgAffineStruct: @ 8040F08
+ push {r4-r7,lr}
+ mov r7, r8
+ push {r7}
+ ldr r4, [sp, 0x18]
+ ldr r5, [sp, 0x1C]
+ ldr r6, [sp, 0x20]
+ ldr r7, [sp, 0x24]
+ mov r8, r7
+ str r1, [r0]
+ str r2, [r0, 0x4]
+ strh r3, [r0, 0x8]
+ strh r4, [r0, 0xA]
+ strh r5, [r0, 0xC]
+ strh r6, [r0, 0xE]
+ mov r1, r8
+ strh r1, [r0, 0x10]
+ pop {r3}
+ mov r8, r3
+ pop {r4-r7}
+ pop {r0}
+ bx r0
+ thumb_func_end SetBgAffineStruct
+
+ thumb_func_start DoBgAffineSet
+DoBgAffineSet: @ 8040F34
+ push {r4-r6,lr}
+ mov r6, r8
+ push {r6}
+ sub sp, 0x24
+ mov r8, r0
+ ldr r0, [sp, 0x38]
+ ldr r4, [sp, 0x3C]
+ ldr r5, [sp, 0x40]
+ ldr r6, [sp, 0x44]
+ lsls r6, 16
+ lsrs r6, 16
+ lsls r3, 16
+ asrs r3, 16
+ lsls r0, 16
+ asrs r0, 16
+ str r0, [sp]
+ lsls r4, 16
+ asrs r4, 16
+ str r4, [sp, 0x4]
+ lsls r5, 16
+ asrs r5, 16
+ str r5, [sp, 0x8]
+ str r6, [sp, 0xC]
+ add r0, sp, 0x10
+ bl SetBgAffineStruct
+ add r0, sp, 0x10
+ mov r1, r8
+ movs r2, 0x1
+ bl BgAffineSet
+ add sp, 0x24
+ pop {r3}
+ mov r8, r3
+ pop {r4-r6}
+ pop {r0}
+ bx r0
+ thumb_func_end DoBgAffineSet
+
+ thumb_func_start CopySpriteTiles
+CopySpriteTiles: @ 8040F80
+ push {r4-r7,lr}
+ mov r7, r10
+ mov r6, r9
+ mov r5, r8
+ push {r5-r7}
+ sub sp, 0x3C
+ str r2, [sp, 0x20]
+ adds r4, r3, 0
+ ldr r7, [sp, 0x5C]
+ lsls r0, 24
+ lsls r1, 24
+ ldr r2, _08041008 @ =gUnknown_082087C4
+ lsrs r1, 23
+ lsrs r0, 21
+ adds r1, r0
+ adds r0, r2, 0x1
+ adds r0, r1, r0
+ ldrb r0, [r0]
+ str r0, [sp, 0x24]
+ adds r1, r2
+ ldrb r1, [r1]
+ str r1, [sp, 0x28]
+ movs r1, 0
+ cmp r1, r0
+ bcc _08040FB4
+ b _08041136
+_08040FB4:
+ movs r0, 0x20
+ ldr r2, [sp, 0x28]
+ subs r0, r2
+ lsls r0, 1
+ str r0, [sp, 0x2C]
+_08040FBE:
+ movs r2, 0
+ adds r1, 0x1
+ str r1, [sp, 0x34]
+ ldr r3, [sp, 0x28]
+ cmp r2, r3
+ bcc _08040FCC
+ b _08041124
+_08040FCC:
+ ldr r0, _0804100C @ =0x040000d4
+ mov r8, r0
+_08040FD0:
+ ldrh r1, [r4]
+ ldr r0, _08041010 @ =0x000003ff
+ ands r0, r1
+ lsls r0, 5
+ mov r12, r0
+ movs r0, 0xC0
+ lsls r0, 4
+ ands r0, r1
+ mov r3, sp
+ strh r1, [r3, 0x38]
+ cmp r0, 0
+ bne _08041018
+ ldr r0, [sp, 0x20]
+ add r0, r12
+ mov r1, r8
+ str r0, [r1]
+ str r7, [r1, 0x4]
+ ldr r3, _08041014 @ =0x84000008
+ str r3, [r1, 0x8]
+ ldr r0, [r1, 0x8]
+ adds r4, 0x2
+ str r4, [sp, 0x30]
+ adds r7, 0x20
+ mov r10, r7
+ adds r2, 0x1
+ mov r9, r2
+ b _08041112
+ .align 2, 0
+_08041008: .4byte gUnknown_082087C4
+_0804100C: .4byte 0x040000d4
+_08041010: .4byte 0x000003ff
+_08041014: .4byte 0x84000008
+_08041018:
+ movs r1, 0x80
+ lsls r1, 4
+ cmp r0, r1
+ bne _08041068
+ movs r3, 0
+ adds r4, 0x2
+ str r4, [sp, 0x30]
+ movs r0, 0x20
+ adds r0, r7
+ mov r10, r0
+ adds r2, 0x1
+ mov r9, r2
+ ldr r4, _08041060 @ =0x040000d4
+ ldr r6, _08041064 @ =0x84000001
+ movs r5, 0x7
+_08041036:
+ lsls r2, r3, 24
+ asrs r2, 24
+ subs r0, r5, r2
+ lsls r0, 2
+ add r0, r12
+ ldr r1, [sp, 0x20]
+ adds r0, r1, r0
+ lsls r1, r2, 2
+ adds r1, r7, r1
+ str r0, [r4]
+ str r1, [r4, 0x4]
+ str r6, [r4, 0x8]
+ ldr r0, [r4, 0x8]
+ adds r2, 0x1
+ lsls r2, 24
+ lsrs r3, r2, 24
+ asrs r2, 24
+ cmp r2, 0x7
+ ble _08041036
+ b _08041112
+ .align 2, 0
+_08041060: .4byte 0x040000d4
+_08041064: .4byte 0x84000001
+_08041068:
+ movs r3, 0
+ adds r4, 0x2
+ str r4, [sp, 0x30]
+ movs r0, 0x20
+ adds r0, r7
+ mov r10, r0
+ adds r2, 0x1
+ mov r9, r2
+_08041078:
+ movs r2, 0
+ lsls r4, r3, 24
+ lsls r0, r4, 2
+ lsrs r0, 24
+ adds r6, r0, 0x3
+ mov r1, r12
+ adds r5, r1, r0
+_08041086:
+ lsls r1, r2, 24
+ asrs r1, 24
+ subs r0, r6, r1
+ mov r2, sp
+ adds r3, r2, r0
+ adds r0, r5, r1
+ ldr r2, [sp, 0x20]
+ adds r0, r2, r0
+ ldrb r2, [r0]
+ movs r0, 0xF
+ ands r0, r2
+ lsls r0, 4
+ lsrs r2, 4
+ orrs r0, r2
+ strb r0, [r3]
+ adds r1, 0x1
+ lsls r1, 24
+ lsrs r2, r1, 24
+ asrs r1, 24
+ cmp r1, 0x3
+ ble _08041086
+ movs r3, 0x80
+ lsls r3, 17
+ adds r0, r4, r3
+ lsrs r3, r0, 24
+ asrs r0, 24
+ cmp r0, 0x7
+ ble _08041078
+ movs r0, 0x80
+ lsls r0, 4
+ mov r1, sp
+ ldrh r1, [r1, 0x38]
+ ands r0, r1
+ cmp r0, 0
+ beq _08041104
+ movs r3, 0
+ ldr r4, _080410FC @ =0x040000d4
+ ldr r6, _08041100 @ =0x84000001
+ movs r5, 0x7
+_080410D4:
+ lsls r1, r3, 24
+ asrs r1, 24
+ subs r0, r5, r1
+ lsls r0, 2
+ mov r3, sp
+ adds r2, r3, r0
+ lsls r0, r1, 2
+ adds r0, r7, r0
+ str r2, [r4]
+ str r0, [r4, 0x4]
+ str r6, [r4, 0x8]
+ ldr r0, [r4, 0x8]
+ adds r1, 0x1
+ lsls r1, 24
+ lsrs r3, r1, 24
+ asrs r1, 24
+ cmp r1, 0x7
+ ble _080410D4
+ b _08041112
+ .align 2, 0
+_080410FC: .4byte 0x040000d4
+_08041100: .4byte 0x84000001
+_08041104:
+ mov r0, sp
+ mov r1, r8
+ str r0, [r1]
+ str r7, [r1, 0x4]
+ ldr r2, _08041148 @ =0x84000008
+ str r2, [r1, 0x8]
+ ldr r0, [r1, 0x8]
+_08041112:
+ ldr r4, [sp, 0x30]
+ mov r7, r10
+ mov r3, r9
+ lsls r0, r3, 24
+ lsrs r2, r0, 24
+ ldr r0, [sp, 0x28]
+ cmp r2, r0
+ bcs _08041124
+ b _08040FD0
+_08041124:
+ ldr r1, [sp, 0x2C]
+ adds r4, r1
+ ldr r2, [sp, 0x34]
+ lsls r0, r2, 24
+ lsrs r1, r0, 24
+ ldr r3, [sp, 0x24]
+ cmp r1, r3
+ bcs _08041136
+ b _08040FBE
+_08041136:
+ add sp, 0x3C
+ pop {r3-r5}
+ mov r8, r3
+ mov r9, r4
+ mov r10, r5
+ pop {r4-r7}
+ pop {r0}
+ bx r0
+ .align 2, 0
+_08041148: .4byte 0x84000008
+ thumb_func_end CopySpriteTiles
+
+ thumb_func_start CountTrailingZeroBits
+CountTrailingZeroBits: @ 804114C
+ push {lr}
+ adds r2, r0, 0
+ movs r1, 0
+ movs r3, 0x1
+_08041154:
+ adds r0, r2, 0
+ ands r0, r3
+ cmp r0, 0
+ beq _08041160
+ adds r0, r1, 0
+ b _0804116E
+_08041160:
+ lsrs r2, 1
+ adds r0, r1, 0x1
+ lsls r0, 24
+ lsrs r1, r0, 24
+ cmp r1, 0x1F
+ bls _08041154
+ movs r0, 0
+_0804116E:
+ pop {r1}
+ bx r1
+ thumb_func_end CountTrailingZeroBits
+
+ thumb_func_start CalcCRC16
+CalcCRC16: @ 8041174
+ push {r4-r7,lr}
+ adds r7, r0, 0
+ adds r4, r1, 0
+ ldr r2, _080411A4 @ =0x00001121
+ movs r3, 0
+ cmp r3, r4
+ bge _080411C0
+ movs r6, 0x1
+ ldr r0, _080411A8 @ =0x00008408
+ adds r5, r0, 0
+_08041188:
+ adds r0, r7, r3
+ ldrb r0, [r0]
+ eors r2, r0
+ movs r1, 0
+ adds r3, 0x1
+_08041192:
+ adds r0, r2, 0
+ ands r0, r6
+ cmp r0, 0
+ beq _080411AC
+ lsrs r0, r2, 1
+ eors r0, r5
+ lsls r0, 16
+ lsrs r2, r0, 16
+ b _080411AE
+ .align 2, 0
+_080411A4: .4byte 0x00001121
+_080411A8: .4byte 0x00008408
+_080411AC:
+ lsrs r2, 1
+_080411AE:
+ adds r0, r1, 0x1
+ lsls r0, 16
+ lsrs r1, r0, 16
+ cmp r1, 0x7
+ bls _08041192
+ lsls r0, r3, 16
+ lsrs r3, r0, 16
+ cmp r3, r4
+ blt _08041188
+_080411C0:
+ mvns r0, r2
+ lsls r0, 16
+ lsrs r0, 16
+ pop {r4-r7}
+ pop {r1}
+ bx r1
+ thumb_func_end CalcCRC16
+
+ thumb_func_start CalcCRC16WithTable
+CalcCRC16WithTable: @ 80411CC
+ push {r4-r6,lr}
+ adds r5, r0, 0
+ adds r4, r1, 0
+ ldr r2, _08041208 @ =0x00001121
+ movs r3, 0
+ cmp r3, r4
+ bge _080411FA
+ ldr r6, _0804120C @ =gCrc16Table
+_080411DC:
+ lsrs r1, r2, 8
+ adds r0, r5, r3
+ ldrb r0, [r0]
+ eors r2, r0
+ lsls r0, r2, 24
+ lsrs r0, 23
+ adds r0, r6
+ ldrh r0, [r0]
+ adds r2, r0, 0
+ eors r2, r1
+ adds r0, r3, 0x1
+ lsls r0, 16
+ lsrs r3, r0, 16
+ cmp r3, r4
+ blt _080411DC
+_080411FA:
+ mvns r0, r2
+ lsls r0, 16
+ lsrs r0, 16
+ pop {r4-r6}
+ pop {r1}
+ bx r1
+ .align 2, 0
+_08041208: .4byte 0x00001121
+_0804120C: .4byte gCrc16Table
+ thumb_func_end CalcCRC16WithTable
+
+ .align 2, 0 @ Don't pad with nop.