summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/util.s478
-rw-r--r--data/data2.s5
-rw-r--r--ld_script.txt2
-rw-r--r--src/util.c389
4 files changed, 392 insertions, 482 deletions
diff --git a/asm/util.s b/asm/util.s
deleted file mode 100644
index f204eac43..000000000
--- a/asm/util.s
+++ /dev/null
@@ -1,478 +0,0 @@
- .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.
diff --git a/data/data2.s b/data/data2.s
index fd1fcc0a4..873679c95 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -2030,12 +2030,11 @@ gBitTable:: @ 820872C
.4byte 0x80000000
.align 2
-gSpriteTemplate_82087AC:: @ 82087AC
+gInvisibleSpriteTemplate:: @ 82087AC
spr_template 0, 0, gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-@ sprite dimensions
.align 2
-gUnknown_082087C4:: @ 82087C4
+gSpriteDimensions:: @ 82087C4
@ square
.byte 1, 1
.byte 2, 2
diff --git a/ld_script.txt b/ld_script.txt
index 7628830cd..c5c665163 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -68,7 +68,7 @@ SECTIONS {
asm/pokemon_3.o(.text);
src/trig.o(.text);
src/rng.o(.text);
- asm/util.o(.text);
+ src/util.o(.text);
src/blend_palette.o(.text);
src/daycare.o(.text);
asm/daycare.o(.text);
diff --git a/src/util.c b/src/util.c
new file mode 100644
index 000000000..9929887d2
--- /dev/null
+++ b/src/util.c
@@ -0,0 +1,389 @@
+#include "global.h"
+#include "sprite.h"
+
+extern const struct SpriteTemplate gInvisibleSpriteTemplate;
+extern const u8 gSpriteDimensions[3][4][2];
+extern const u16 gCrc16Table[];
+
+u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) {
+ u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14);
+ gSprites[sprite].invisible = TRUE;
+ gSprites[sprite].callback = callback;
+ return sprite;
+}
+
+void StoreWordInTwoHalfwords(u16 *h, u32 w) {
+ h[0] = (u16)(w);
+ h[1] = (u16)(w >> 16);
+}
+
+void LoadWordFromTwoHalfwords(u16 *h, u32 *w) {
+ *w = h[0] | (s16)h[1] << 16;
+}
+
+void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) {
+ src->texX = texX;
+ src->texY = texY;
+ src->scrX = scrX;
+ src->scrY = scrY;
+ src->sx = sx;
+ src->sy = sy;
+ src->alpha = alpha;
+}
+
+void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) {
+ struct BgAffineSrcData src;
+ SetBgAffineStruct(
+ &src,
+ texX, texY,
+ scrX, scrY,
+ sx, sy,
+ alpha
+ );
+ BgAffineSet(&src, dest, 1);
+}
+
+#ifndef NONMATCHING
+
+// Functionally equivalent.
+// Only the two yflip loops don't match.
+void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) {
+ u8 x, y;
+ s8 i, j;
+ u8 xflip[32];
+ u8 h = gSpriteDimensions[shape][size][1];
+ u8 w = gSpriteDimensions[shape][size][0];
+ for (y = 0; y < h; y++) {
+ int filler = 32 - w;
+ for (x = 0; x < w; x++) {
+ int tile = (*tilemap & 0x3ff) * 32;
+ int attr = *tilemap & 0xc00;
+ if (attr == 0) {
+ void *src = tiles + tile;
+ void *dest = output;
+ int length = 32;
+ DmaCopy32(3, src, dest, length);
+ } else if (attr == 0x800) { // yflip
+ for (i = 0; i < 8; i++) {
+ void *src = tiles;
+ void *dest = output;
+ int length = 4;
+ // this is likely wrong, but makes it closer to matching
+ src += tile + (7 - i) * 4;
+ dest += i * 4;
+ DmaCopy32(3, src, dest, length);
+ }
+ } else { // xflip
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 4; j++) {
+ u8 i2 = i * 4;
+ xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4;
+ xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4;
+ }
+ }
+ if (*tilemap & 0x800) { // yflip
+ for (i = 0; i < 8; i++) {
+ void *src = xflip + (7-i) * 4;
+ void *dest = output + i*4;
+ int length = 4;
+ DmaCopy32(3, src, dest, length);
+ }
+ } else {
+ void *src = xflip;
+ void *dest = output;
+ int length = 32;
+ DmaCopy32(3, src, dest, length);
+ }
+ }
+ tilemap++;
+ output += 32;
+ }
+ tilemap += filler;
+ }
+}
+
+#else
+
+__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) {
+ asm("\n"
+ " .syntax unified\n"
+ " push {r4-r7,lr}\n"
+ " mov r7, r10\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5-r7}\n"
+ " sub sp, 0x3C\n"
+ " str r2, [sp, 0x20]\n"
+ " adds r4, r3, 0\n"
+ " ldr r7, [sp, 0x5C]\n"
+ " lsls r0, 24\n"
+ " lsls r1, 24\n"
+ " ldr r2, _08041008 @ =gSpriteDimensions\n"
+ " lsrs r1, 23\n"
+ " lsrs r0, 21\n"
+ " adds r1, r0\n"
+ " adds r0, r2, 0x1\n"
+ " adds r0, r1, r0\n"
+ " ldrb r0, [r0]\n"
+ " str r0, [sp, 0x24]\n"
+ " adds r1, r2\n"
+ " ldrb r1, [r1]\n"
+ " str r1, [sp, 0x28]\n"
+ " movs r1, 0\n"
+ " cmp r1, r0\n"
+ " bcc _08040FB4\n"
+ " b _08041136\n"
+ "_08040FB4:\n"
+ " movs r0, 0x20\n"
+ " ldr r2, [sp, 0x28]\n"
+ " subs r0, r2\n"
+ " lsls r0, 1\n"
+ " str r0, [sp, 0x2C]\n"
+ "_08040FBE:\n"
+ " movs r2, 0\n"
+ " adds r1, 0x1\n"
+ " str r1, [sp, 0x34]\n"
+ " ldr r3, [sp, 0x28]\n"
+ " cmp r2, r3\n"
+ " bcc _08040FCC\n"
+ " b _08041124\n"
+ "_08040FCC:\n"
+ " ldr r0, _0804100C @ =0x040000d4\n"
+ " mov r8, r0\n"
+ "_08040FD0:\n"
+ " ldrh r1, [r4]\n"
+ " ldr r0, _08041010 @ =0x000003ff\n"
+ " ands r0, r1\n"
+ " lsls r0, 5\n"
+ " mov r12, r0\n"
+ " movs r0, 0xC0\n"
+ " lsls r0, 4\n"
+ " ands r0, r1\n"
+ " mov r3, sp\n"
+ " strh r1, [r3, 0x38]\n"
+ " cmp r0, 0\n"
+ " bne _08041018\n"
+ " ldr r0, [sp, 0x20]\n"
+ " add r0, r12\n"
+ " mov r1, r8\n"
+ " str r0, [r1]\n"
+ " str r7, [r1, 0x4]\n"
+ " ldr r3, _08041014 @ =0x84000008\n"
+ " str r3, [r1, 0x8]\n"
+ " ldr r0, [r1, 0x8]\n"
+ " adds r4, 0x2\n"
+ " str r4, [sp, 0x30]\n"
+ " adds r7, 0x20\n"
+ " mov r10, r7\n"
+ " adds r2, 0x1\n"
+ " mov r9, r2\n"
+ " b _08041112\n"
+ " .align 2, 0\n"
+ "_08041008: .4byte gSpriteDimensions\n"
+ "_0804100C: .4byte 0x040000d4\n"
+ "_08041010: .4byte 0x000003ff\n"
+ "_08041014: .4byte 0x84000008\n"
+ "_08041018:\n"
+ " movs r1, 0x80\n"
+ " lsls r1, 4\n"
+ " cmp r0, r1\n"
+ " bne _08041068\n"
+ " movs r3, 0\n"
+ " adds r4, 0x2\n"
+ " str r4, [sp, 0x30]\n"
+ " movs r0, 0x20\n"
+ " adds r0, r7\n"
+ " mov r10, r0\n"
+ " adds r2, 0x1\n"
+ " mov r9, r2\n"
+ " ldr r4, _08041060 @ =0x040000d4\n"
+ " ldr r6, _08041064 @ =0x84000001\n"
+ " movs r5, 0x7\n"
+ "_08041036:\n"
+ " lsls r2, r3, 24\n"
+ " asrs r2, 24\n"
+ " subs r0, r5, r2\n"
+ " lsls r0, 2\n"
+ " add r0, r12\n"
+ " ldr r1, [sp, 0x20]\n"
+ " adds r0, r1, r0\n"
+ " lsls r1, r2, 2\n"
+ " adds r1, r7, r1\n"
+ " str r0, [r4]\n"
+ " str r1, [r4, 0x4]\n"
+ " str r6, [r4, 0x8]\n"
+ " ldr r0, [r4, 0x8]\n"
+ " adds r2, 0x1\n"
+ " lsls r2, 24\n"
+ " lsrs r3, r2, 24\n"
+ " asrs r2, 24\n"
+ " cmp r2, 0x7\n"
+ " ble _08041036\n"
+ " b _08041112\n"
+ " .align 2, 0\n"
+ "_08041060: .4byte 0x040000d4\n"
+ "_08041064: .4byte 0x84000001\n"
+ "_08041068:\n"
+ " movs r3, 0\n"
+ " adds r4, 0x2\n"
+ " str r4, [sp, 0x30]\n"
+ " movs r0, 0x20\n"
+ " adds r0, r7\n"
+ " mov r10, r0\n"
+ " adds r2, 0x1\n"
+ " mov r9, r2\n"
+ "_08041078:\n"
+ " movs r2, 0\n"
+ " lsls r4, r3, 24\n"
+ " lsls r0, r4, 2\n"
+ " lsrs r0, 24\n"
+ " adds r6, r0, 0x3\n"
+ " mov r1, r12\n"
+ " adds r5, r1, r0\n"
+ "_08041086:\n"
+ " lsls r1, r2, 24\n"
+ " asrs r1, 24\n"
+ " subs r0, r6, r1\n"
+ " mov r2, sp\n"
+ " adds r3, r2, r0\n"
+ " adds r0, r5, r1\n"
+ " ldr r2, [sp, 0x20]\n"
+ " adds r0, r2, r0\n"
+ " ldrb r2, [r0]\n"
+ " movs r0, 0xF\n"
+ " ands r0, r2\n"
+ " lsls r0, 4\n"
+ " lsrs r2, 4\n"
+ " orrs r0, r2\n"
+ " strb r0, [r3]\n"
+ " adds r1, 0x1\n"
+ " lsls r1, 24\n"
+ " lsrs r2, r1, 24\n"
+ " asrs r1, 24\n"
+ " cmp r1, 0x3\n"
+ " ble _08041086\n"
+ " movs r3, 0x80\n"
+ " lsls r3, 17\n"
+ " adds r0, r4, r3\n"
+ " lsrs r3, r0, 24\n"
+ " asrs r0, 24\n"
+ " cmp r0, 0x7\n"
+ " ble _08041078\n"
+ " movs r0, 0x80\n"
+ " lsls r0, 4\n"
+ " mov r1, sp\n"
+ " ldrh r1, [r1, 0x38]\n"
+ " ands r0, r1\n"
+ " cmp r0, 0\n"
+ " beq _08041104\n"
+ " movs r3, 0\n"
+ " ldr r4, _080410FC @ =0x040000d4\n"
+ " ldr r6, _08041100 @ =0x84000001\n"
+ " movs r5, 0x7\n"
+ "_080410D4:\n"
+ " lsls r1, r3, 24\n"
+ " asrs r1, 24\n"
+ " subs r0, r5, r1\n"
+ " lsls r0, 2\n"
+ " mov r3, sp\n"
+ " adds r2, r3, r0\n"
+ " lsls r0, r1, 2\n"
+ " adds r0, r7, r0\n"
+ " str r2, [r4]\n"
+ " str r0, [r4, 0x4]\n"
+ " str r6, [r4, 0x8]\n"
+ " ldr r0, [r4, 0x8]\n"
+ " adds r1, 0x1\n"
+ " lsls r1, 24\n"
+ " lsrs r3, r1, 24\n"
+ " asrs r1, 24\n"
+ " cmp r1, 0x7\n"
+ " ble _080410D4\n"
+ " b _08041112\n"
+ " .align 2, 0\n"
+ "_080410FC: .4byte 0x040000d4\n"
+ "_08041100: .4byte 0x84000001\n"
+ "_08041104:\n"
+ " mov r0, sp\n"
+ " mov r1, r8\n"
+ " str r0, [r1]\n"
+ " str r7, [r1, 0x4]\n"
+ " ldr r2, _08041148 @ =0x84000008\n"
+ " str r2, [r1, 0x8]\n"
+ " ldr r0, [r1, 0x8]\n"
+ "_08041112:\n"
+ " ldr r4, [sp, 0x30]\n"
+ " mov r7, r10\n"
+ " mov r3, r9\n"
+ " lsls r0, r3, 24\n"
+ " lsrs r2, r0, 24\n"
+ " ldr r0, [sp, 0x28]\n"
+ " cmp r2, r0\n"
+ " bcs _08041124\n"
+ " b _08040FD0\n"
+ "_08041124:\n"
+ " ldr r1, [sp, 0x2C]\n"
+ " adds r4, r1\n"
+ " ldr r2, [sp, 0x34]\n"
+ " lsls r0, r2, 24\n"
+ " lsrs r1, r0, 24\n"
+ " ldr r3, [sp, 0x24]\n"
+ " cmp r1, r3\n"
+ " bcs _08041136\n"
+ " b _08040FBE\n"
+ "_08041136:\n"
+ " add sp, 0x3C\n"
+ " pop {r3-r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov r10, r5\n"
+ " pop {r4-r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ " .align 2, 0\n"
+ "_08041148: .4byte 0x84000008\n"
+ " .syntax divided\n"
+ );
+}
+
+#endif
+
+int CountTrailingZeroBits(u32 value) {
+ u8 i;
+ for (i = 0; i < 32; i++) {
+ if ((value & 1) == 0) {
+ value >>= 1;
+ } else {
+ return i;
+ }
+ }
+ return 0;
+}
+
+u16 CalcCRC16(u8 *data, int length) {
+ u16 i, j;
+ u16 crc = 0x1121;
+ for (i = 0; i < length; i++) {
+ crc ^= data[i];
+ for (j = 0; j < 8; j++) {
+ if (crc & 1) {
+ crc = (crc >> 1) ^ 0x8408;
+ } else {
+ crc >>= 1;
+ }
+ }
+ }
+ return ~crc;
+}
+
+u16 CalcCRC16WithTable(u8 *data, int length) {
+ u16 i;
+ u16 crc = 0x1121;
+ u8 byte;
+ for (i = 0; i < length; i++) {
+ byte = crc >> 8;
+ crc ^= data[i];
+ crc = byte ^ gCrc16Table[(u8)crc];
+ }
+ return ~crc;
+}