summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/code_80118A4.s87
-rw-r--r--src/code_80118A4.c99
2 files changed, 98 insertions, 88 deletions
diff --git a/asm/code_80118A4.s b/asm/code_80118A4.s
index 13edd86..309f837 100644
--- a/asm/code_80118A4.s
+++ b/asm/code_80118A4.s
@@ -5,93 +5,6 @@
.text
- thumb_func_start sub_8011940
-sub_8011940:
- push {r4,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- bl sub_800C068
- lsls r0, 16
- lsrs r1, r0, 16
- ldr r0, _08011960
- cmp r4, r0
- bne _08011964
- eors r1, r4
- negs r0, r1
- orrs r0, r1
- lsrs r0, 31
- b _0801196C
- .align 2, 0
-_08011960: .4byte 0x000003e7
-_08011964:
- movs r0, 0
- cmp r1, r4
- bne _0801196C
- movs r0, 0x1
-_0801196C:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8011940
-
- thumb_func_start sub_8011974
-sub_8011974:
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- lsrs r1, 16
- bl sub_800C074
- pop {r0}
- bx r0
- thumb_func_end sub_8011974
-
- thumb_func_start sub_8011988
-sub_8011988:
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x80
- lsls r1, 1
- bl sub_800C074
- pop {r0}
- bx r0
- thumb_func_end sub_8011988
-
- thumb_func_start sub_801199C
-sub_801199C:
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- bl sub_800C298
- pop {r0}
- bx r0
- thumb_func_end sub_801199C
-
- thumb_func_start sub_80119AC
-sub_80119AC:
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- lsrs r1, 16
- bl sub_800C3F8
- pop {r0}
- bx r0
- thumb_func_end sub_80119AC
-
- thumb_func_start sub_80119C0
-sub_80119C0:
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- bl sub_800C5D0
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end sub_80119C0
-
thumb_func_start sub_80119D4
sub_80119D4:
push {r4,lr}
diff --git a/src/code_80118A4.c b/src/code_80118A4.c
index 3881ba8..2ed0e9e 100644
--- a/src/code_80118A4.c
+++ b/src/code_80118A4.c
@@ -9,7 +9,19 @@ extern void sub_800BF80(void);
extern void sub_800BFD0(u16 r0);
extern void sub_800C3F8(u16 r0, u16 r1);
extern void sub_801199C(u16 r0);
-extern void sub_800C068(u16 r0);
+extern u16 sub_800C068();
+extern void sub_800C074(u16 r0, u16 r1);
+extern void sub_800C298(u16 r0);
+extern u8 sub_800C5D0(u16 r0);
+
+struct UnkStructType
+{
+ /* 0x0 */ s16 unk0;
+
+};
+
+extern u16 gUnknown_80D4144[];
+extern struct UnkStructType gUnknown_202DE20;
void sub_80118A4(void)
{
@@ -49,3 +61,88 @@ void sub_8011930(u16 r0)
{
sub_800BFD0(r0);
}
+
+// TODO fix this nonmatching
+#ifndef NONMATCHING
+NAKED
+#endif
+u32 sub_8011940(u16 r0)
+{
+#ifdef NONMATCHING
+ u32 temp;
+ temp = sub_800C068();
+
+ if(r0 == 0x3e7)
+ {
+ temp ^= r0;
+ // TODO this OR/NEG apparently is close
+ temp |= -temp;
+ return temp >> 31;
+ }
+
+ if(temp != r0)
+ return 0;
+ else
+ return 1;
+#else
+ asm_unified("\tpush {r4,lr}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tbl sub_800C068\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tldr r0, _08011960\n"
+ "\tcmp r4, r0\n"
+ "\tbne _08011964\n"
+ "\teors r1, r4\n"
+ "\tnegs r0, r1\n"
+ "\torrs r0, r1\n"
+ "\tlsrs r0, 31\n"
+ "\tb _0801196C\n"
+ "\t.align 2,0\n"
+ "_08011960: .4byte 0x000003e7\n"
+ "_08011964:\n"
+ "\tmovs r0, 0\n"
+ "\tcmp r1, r4\n"
+ "\tbne _0801196C\n"
+ "\tmovs r0, 0x1\n"
+ "_0801196C:\n"
+ "\tpop {r4}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+#endif
+}
+
+void sub_8011974(u16 r0, u16 r1)
+{
+ sub_800C074(r0, r1);
+}
+
+void sub_8011988(u16 r0)
+{
+ sub_800C074(r0, 0x80 << 1);
+}
+
+void sub_801199C(u16 r0)
+{
+ sub_800C298(r0);
+}
+
+void sub_80119AC(u16 r0, u16 r1)
+{
+ sub_800C3F8(r0, r1);
+}
+
+u8 sub_80119C0(u16 r0)
+{
+ return sub_800C5D0(r0);
+}
+
+// TODO pretty close except r4's where should be r2's
+//void sub_80119D4(u32 r0)
+//{
+// if(gUnknown_202DE20.unk0 > 0)
+// return;
+// sub_800C074(gUnknown_80D4144[r0], 0x80 << 1);
+// gUnknown_80D4144[r0] = 0x4;
+//}