summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRevo <projectrevotpp@hotmail.com>2020-11-26 12:15:18 -0500
committerGitHub <noreply@github.com>2020-11-26 12:15:18 -0500
commit6e80109ce68a37ba97c43cef6a0626a1ce470c4e (patch)
tree34c3b3f68968b6f18c1324d1364a398bbff4b653
parent277ad419e7fbc91baeb9298c3fd0017a066adc21 (diff)
parent2023adf209156d9c461197eefac93b5216fbc2f3 (diff)
Merge pull request #158 from mparisi20/code_801E07E8
decompile code_801E07E8 and code_801E0810.o
-rw-r--r--asm/GSvolume.s (renamed from asm/code_801DF040.s)0
-rw-r--r--asm/GSvolume_ctors.s5
-rw-r--r--asm/GSvolume_sbss.s10
-rw-r--r--asm/code_8004E9F0.s12
-rw-r--r--asm/code_801E07E8.s19
-rw-r--r--asm/code_801E0810.s176
-rw-r--r--asm/ctors_2.s1
-rw-r--r--asm/sbss_2.s13
-rw-r--r--include/GSfilterModule.h24
-rw-r--r--include/SDK/OS/OSCache.h1
-rw-r--r--include/gUnkClass20.h30
-rw-r--r--obj_files.mk8
-rw-r--r--src/code_801E07E8.cpp13
-rw-r--r--src/gUnkClass20.cpp84
14 files changed, 180 insertions, 216 deletions
diff --git a/asm/code_801DF040.s b/asm/GSvolume.s
index 7cfe0d3..7cfe0d3 100644
--- a/asm/code_801DF040.s
+++ b/asm/GSvolume.s
diff --git a/asm/GSvolume_ctors.s b/asm/GSvolume_ctors.s
new file mode 100644
index 0000000..326d8f9
--- /dev/null
+++ b/asm/GSvolume_ctors.s
@@ -0,0 +1,5 @@
+.include "macros.inc"
+
+.section .ctors, "wa" # 0x803E1E60 - 0x803E22A0
+
+.4byte func_801E07C8
diff --git a/asm/GSvolume_sbss.s b/asm/GSvolume_sbss.s
new file mode 100644
index 0000000..2889b60
--- /dev/null
+++ b/asm/GSvolume_sbss.s
@@ -0,0 +1,10 @@
+.section .sbss, "wa" # 0x80474F00 - 0x80643050
+
+# NOTE: This is a placeholder for GSvolume's ctorStruct instance
+
+.global lbl_8063F35E
+lbl_8063F35E:
+ .skip 0x2
+.global lbl_8063F360
+lbl_8063F360:
+ .skip 0x8
diff --git a/asm/code_8004E9F0.s b/asm/code_8004E9F0.s
index a6483b0..f61cc2a 100644
--- a/asm/code_8004E9F0.s
+++ b/asm/code_8004E9F0.s
@@ -61,7 +61,7 @@ func_8004EA94:
/* 8004EAAC 0004A70C 2C 00 00 00 */ cmpwi r0, 0
/* 8004EAB0 0004A710 41 82 00 14 */ beq lbl_8004EAC4
/* 8004EAB4 0004A714 7C 03 03 78 */ mr r3, r0
-/* 8004EAB8 0004A718 48 19 1E 4D */ bl func_801E0904
+/* 8004EAB8 0004A718 48 19 1E 4D */ bl func_801E0904__11gUnkClass20Fv
/* 8004EABC 0004A71C 38 00 00 00 */ li r0, 0
/* 8004EAC0 0004A720 90 1F 00 00 */ stw r0, 0(r31)
lbl_8004EAC4:
@@ -145,12 +145,12 @@ func_8004EBA0:
/* 8004EBD4 0004A834 38 80 00 00 */ li r4, 0
/* 8004EBD8 0004A838 38 A0 00 00 */ li r5, 0
/* 8004EBDC 0004A83C 38 C0 00 00 */ li r6, 0
-/* 8004EBE0 0004A840 48 19 1C 31 */ bl func_801E0810
+/* 8004EBE0 0004A840 48 19 1C 31 */ bl func_801E0810__11gUnkClass20FUlUcUc
/* 8004EBE4 0004A844 90 7E 00 00 */ stw r3, 0(r30)
/* 8004EBE8 0004A848 48 00 00 0C */ b lbl_8004EBF4
lbl_8004EBEC:
/* 8004EBEC 0004A84C 7F E4 FB 78 */ mr r4, r31
-/* 8004EBF0 0004A850 48 19 1D ED */ bl func_801E09DC
+/* 8004EBF0 0004A850 48 19 1D ED */ bl func_801E09DC__11gUnkClass20CFP11gUnkClass21
lbl_8004EBF4:
/* 8004EBF4 0004A854 80 01 00 14 */ lwz r0, 0x14(r1)
/* 8004EBF8 0004A858 83 E1 00 0C */ lwz r31, 0xc(r1)
@@ -184,12 +184,12 @@ func_8004EC0C:
/* 8004EC5C 0004A8BC 98 01 00 09 */ stb r0, 9(r1)
/* 8004EC60 0004A8C0 98 01 00 0A */ stb r0, 0xa(r1)
/* 8004EC64 0004A8C4 98 01 00 0B */ stb r0, 0xb(r1)
-/* 8004EC68 0004A8C8 48 19 1B A9 */ bl func_801E0810
+/* 8004EC68 0004A8C8 48 19 1B A9 */ bl func_801E0810__11gUnkClass20FUlUcUc
/* 8004EC6C 0004A8CC 90 7D 00 00 */ stw r3, 0(r29)
lbl_8004EC70:
/* 8004EC70 0004A8D0 80 7D 00 00 */ lwz r3, 0(r29)
/* 8004EC74 0004A8D4 38 81 00 08 */ addi r4, r1, 8
-/* 8004EC78 0004A8D8 48 19 1D 01 */ bl func_801E0978
+/* 8004EC78 0004A8D8 48 19 1D 01 */ bl func_801E0978__11gUnkClass20CFP11gUnkClass21
/* 8004EC7C 0004A8DC 7F A3 EB 78 */ mr r3, r29
/* 8004EC80 0004A8E0 7F C4 F3 78 */ mr r4, r30
/* 8004EC84 0004A8E4 38 A1 00 10 */ addi r5, r1, 0x10
@@ -242,7 +242,7 @@ func_8004ECE0:
/* 8004ED28 0004A988 4B FF FE 1D */ bl func_8004EB44
/* 8004ED2C 0004A98C 80 7F 00 00 */ lwz r3, 0(r31)
/* 8004ED30 0004A990 38 81 00 08 */ addi r4, r1, 8
-/* 8004ED34 0004A994 48 19 1C A9 */ bl func_801E09DC
+/* 8004ED34 0004A994 48 19 1C A9 */ bl func_801E09DC__11gUnkClass20CFP11gUnkClass21
lbl_8004ED38:
/* 8004ED38 0004A998 80 01 00 24 */ lwz r0, 0x24(r1)
/* 8004ED3C 0004A99C 83 E1 00 1C */ lwz r31, 0x1c(r1)
diff --git a/asm/code_801E07E8.s b/asm/code_801E07E8.s
deleted file mode 100644
index cfea9dd..0000000
--- a/asm/code_801E07E8.s
+++ /dev/null
@@ -1,19 +0,0 @@
-.include "macros.inc"
-
-.section .text, "ax" # 0x80006980 - 0x803E1E60
-
-.global func_801E07E8
-func_801E07E8:
-/* 801E07E8 001DC448 38 60 00 00 */ li r3, 0
-/* 801E07EC 001DC44C 4E 80 00 20 */ blr
-
-.global func_801E07F0
-func_801E07F0:
-/* 801E07F0 001DC450 38 A0 00 01 */ li r5, 1
-/* 801E07F4 001DC454 38 6D A0 A8 */ addi r3, r13, lbl_8063F368-_SDA_BASE_
-/* 801E07F8 001DC458 38 80 00 04 */ li r4, 4
-/* 801E07FC 001DC45C 38 00 00 00 */ li r0, 0
-/* 801E0800 001DC460 98 AD A0 A8 */ stb r5, lbl_8063F368-_SDA_BASE_(r13)
-/* 801E0804 001DC464 B0 83 00 02 */ sth r4, 2(r3)
-/* 801E0808 001DC468 98 03 00 04 */ stb r0, 4(r3)
-/* 801E080C 001DC46C 4E 80 00 20 */ blr
diff --git a/asm/code_801E0810.s b/asm/code_801E0810.s
deleted file mode 100644
index 82d275f..0000000
--- a/asm/code_801E0810.s
+++ /dev/null
@@ -1,176 +0,0 @@
-.include "macros.inc"
-
-.section .text, "ax" # 0x80006980 - 0x803E1E60
-
-.global func_801E0810
-func_801E0810:
-/* 801E0810 001DC470 94 21 FF E0 */ stwu r1, -0x20(r1)
-/* 801E0814 001DC474 7C 08 02 A6 */ mflr r0
-/* 801E0818 001DC478 90 01 00 24 */ stw r0, 0x24(r1)
-/* 801E081C 001DC47C 39 61 00 20 */ addi r11, r1, 0x20
-/* 801E0820 001DC480 4B FE 69 09 */ bl _savegpr_27
-/* 801E0824 001DC484 80 0D A1 50 */ lwz r0, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E0828 001DC488 7C 7F 1B 78 */ mr r31, r3
-/* 801E082C 001DC48C 7C 9B 23 78 */ mr r27, r4
-/* 801E0830 001DC490 7C BC 2B 78 */ mr r28, r5
-/* 801E0834 001DC494 2C 00 00 00 */ cmpwi r0, 0
-/* 801E0838 001DC498 7C DE 33 78 */ mr r30, r6
-/* 801E083C 001DC49C 40 82 00 0C */ bne lbl_801E0848
-/* 801E0840 001DC4A0 38 60 00 00 */ li r3, 0
-/* 801E0844 001DC4A4 48 00 00 A8 */ b lbl_801E08EC
-lbl_801E0848:
-/* 801E0848 001DC4A8 7C 03 03 78 */ mr r3, r0
-/* 801E084C 001DC4AC 48 01 AF C1 */ bl func_801FB80C
-/* 801E0850 001DC4B0 2C 03 00 00 */ cmpwi r3, 0
-/* 801E0854 001DC4B4 7C 7D 1B 78 */ mr r29, r3
-/* 801E0858 001DC4B8 40 82 00 0C */ bne lbl_801E0864
-/* 801E085C 001DC4BC 38 60 00 00 */ li r3, 0
-/* 801E0860 001DC4C0 48 00 00 8C */ b lbl_801E08EC
-lbl_801E0864:
-/* 801E0864 001DC4C4 38 00 00 01 */ li r0, 1
-/* 801E0868 001DC4C8 2C 1E 00 00 */ cmpwi r30, 0
-/* 801E086C 001DC4CC 98 03 00 01 */ stb r0, 1(r3)
-/* 801E0870 001DC4D0 9B 83 00 02 */ stb r28, 2(r3)
-/* 801E0874 001DC4D4 9B C3 00 03 */ stb r30, 3(r3)
-/* 801E0878 001DC4D8 93 63 00 04 */ stw r27, 4(r3)
-/* 801E087C 001DC4DC 41 82 00 24 */ beq lbl_801E08A0
-/* 801E0880 001DC4E0 80 6D A1 50 */ lwz r3, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E0884 001DC4E4 83 C3 00 10 */ lwz r30, 0x10(r3)
-/* 801E0888 001DC4E8 57 C3 86 3E */ rlwinm r3, r30, 0x10, 0x18, 0x1f
-/* 801E088C 001DC4EC 48 05 A7 CD */ bl func_8023B058
-/* 801E0890 001DC4F0 2C 03 00 00 */ cmpwi r3, 0
-/* 801E0894 001DC4F4 41 82 00 0C */ beq lbl_801E08A0
-/* 801E0898 001DC4F8 7F C4 F3 78 */ mr r4, r30
-/* 801E089C 001DC4FC 48 05 AB 1D */ bl func_8023B3B8
-lbl_801E08A0:
-/* 801E08A0 001DC500 88 1D 00 01 */ lbz r0, 1(r29)
-/* 801E08A4 001DC504 80 6D A1 50 */ lwz r3, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E08A8 001DC508 2C 00 00 00 */ cmpwi r0, 0
-/* 801E08AC 001DC50C 41 82 00 18 */ beq lbl_801E08C4
-/* 801E08B0 001DC510 88 1D 00 00 */ lbz r0, 0(r29)
-/* 801E08B4 001DC514 80 63 03 F0 */ lwz r3, 0x3f0(r3)
-/* 801E08B8 001DC518 54 00 10 3A */ slwi r0, r0, 2
-/* 801E08BC 001DC51C 7C 83 02 14 */ add r4, r3, r0
-/* 801E08C0 001DC520 48 00 00 08 */ b lbl_801E08C8
-lbl_801E08C4:
-/* 801E08C4 001DC524 38 80 00 00 */ li r4, 0
-lbl_801E08C8:
-/* 801E08C8 001DC528 88 1F 00 00 */ lbz r0, 0(r31)
-/* 801E08CC 001DC52C 7F A3 EB 78 */ mr r3, r29
-/* 801E08D0 001DC530 98 04 00 00 */ stb r0, 0(r4)
-/* 801E08D4 001DC534 88 1F 00 01 */ lbz r0, 1(r31)
-/* 801E08D8 001DC538 98 04 00 01 */ stb r0, 1(r4)
-/* 801E08DC 001DC53C 88 1F 00 02 */ lbz r0, 2(r31)
-/* 801E08E0 001DC540 98 04 00 02 */ stb r0, 2(r4)
-/* 801E08E4 001DC544 88 1F 00 03 */ lbz r0, 3(r31)
-/* 801E08E8 001DC548 98 04 00 03 */ stb r0, 3(r4)
-lbl_801E08EC:
-/* 801E08EC 001DC54C 39 61 00 20 */ addi r11, r1, 0x20
-/* 801E08F0 001DC550 4B FE 68 85 */ bl _restgpr_27
-/* 801E08F4 001DC554 80 01 00 24 */ lwz r0, 0x24(r1)
-/* 801E08F8 001DC558 7C 08 03 A6 */ mtlr r0
-/* 801E08FC 001DC55C 38 21 00 20 */ addi r1, r1, 0x20
-/* 801E0900 001DC560 4E 80 00 20 */ blr
-
-.global func_801E0904
-func_801E0904:
-/* 801E0904 001DC564 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801E0908 001DC568 7C 08 02 A6 */ mflr r0
-/* 801E090C 001DC56C 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801E0910 001DC570 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801E0914 001DC574 93 C1 00 08 */ stw r30, 8(r1)
-/* 801E0918 001DC578 7C 7E 1B 78 */ mr r30, r3
-/* 801E091C 001DC57C 88 03 00 01 */ lbz r0, 1(r3)
-/* 801E0920 001DC580 2C 00 00 00 */ cmpwi r0, 0
-/* 801E0924 001DC584 41 82 00 3C */ beq lbl_801E0960
-/* 801E0928 001DC588 88 03 00 03 */ lbz r0, 3(r3)
-/* 801E092C 001DC58C 2C 00 00 00 */ cmpwi r0, 0
-/* 801E0930 001DC590 41 82 00 24 */ beq lbl_801E0954
-/* 801E0934 001DC594 80 6D A1 50 */ lwz r3, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E0938 001DC598 83 E3 00 10 */ lwz r31, 0x10(r3)
-/* 801E093C 001DC59C 57 E3 86 3E */ rlwinm r3, r31, 0x10, 0x18, 0x1f
-/* 801E0940 001DC5A0 48 05 A7 19 */ bl func_8023B058
-/* 801E0944 001DC5A4 2C 03 00 00 */ cmpwi r3, 0
-/* 801E0948 001DC5A8 41 82 00 0C */ beq lbl_801E0954
-/* 801E094C 001DC5AC 7F E4 FB 78 */ mr r4, r31
-/* 801E0950 001DC5B0 48 05 AA D1 */ bl func_8023B420
-lbl_801E0954:
-/* 801E0954 001DC5B4 38 00 00 00 */ li r0, 0
-/* 801E0958 001DC5B8 98 1E 00 01 */ stb r0, 1(r30)
-/* 801E095C 001DC5BC 90 1E 00 04 */ stw r0, 4(r30)
-lbl_801E0960:
-/* 801E0960 001DC5C0 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801E0964 001DC5C4 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801E0968 001DC5C8 83 C1 00 08 */ lwz r30, 8(r1)
-/* 801E096C 001DC5CC 7C 08 03 A6 */ mtlr r0
-/* 801E0970 001DC5D0 38 21 00 10 */ addi r1, r1, 0x10
-/* 801E0974 001DC5D4 4E 80 00 20 */ blr
-
-.global func_801E0978
-func_801E0978:
-/* 801E0978 001DC5D8 88 03 00 01 */ lbz r0, 1(r3)
-/* 801E097C 001DC5DC 2C 00 00 00 */ cmpwi r0, 0
-/* 801E0980 001DC5E0 41 82 00 48 */ beq lbl_801E09C8
-/* 801E0984 001DC5E4 80 AD A1 50 */ lwz r5, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E0988 001DC5E8 41 82 00 18 */ beq lbl_801E09A0
-/* 801E098C 001DC5EC 88 03 00 00 */ lbz r0, 0(r3)
-/* 801E0990 001DC5F0 80 65 03 F0 */ lwz r3, 0x3f0(r5)
-/* 801E0994 001DC5F4 54 00 10 3A */ slwi r0, r0, 2
-/* 801E0998 001DC5F8 7C 63 02 14 */ add r3, r3, r0
-/* 801E099C 001DC5FC 48 00 00 08 */ b lbl_801E09A4
-lbl_801E09A0:
-/* 801E09A0 001DC600 38 60 00 00 */ li r3, 0
-lbl_801E09A4:
-/* 801E09A4 001DC604 88 03 00 00 */ lbz r0, 0(r3)
-/* 801E09A8 001DC608 98 04 00 00 */ stb r0, 0(r4)
-/* 801E09AC 001DC60C 88 03 00 01 */ lbz r0, 1(r3)
-/* 801E09B0 001DC610 98 04 00 01 */ stb r0, 1(r4)
-/* 801E09B4 001DC614 88 03 00 02 */ lbz r0, 2(r3)
-/* 801E09B8 001DC618 98 04 00 02 */ stb r0, 2(r4)
-/* 801E09BC 001DC61C 88 03 00 03 */ lbz r0, 3(r3)
-/* 801E09C0 001DC620 98 04 00 03 */ stb r0, 3(r4)
-/* 801E09C4 001DC624 4E 80 00 20 */ blr
-lbl_801E09C8:
-/* 801E09C8 001DC628 7C 83 23 78 */ mr r3, r4
-/* 801E09CC 001DC62C 38 80 00 00 */ li r4, 0
-/* 801E09D0 001DC630 38 A0 00 04 */ li r5, 4
-/* 801E09D4 001DC634 4B E2 37 30 */ b memset
-/* 801E09D8 001DC638 4E 80 00 20 */ blr
-
-.global func_801E09DC
-func_801E09DC:
-/* 801E09DC 001DC63C 88 03 00 01 */ lbz r0, 1(r3)
-/* 801E09E0 001DC640 2C 00 00 00 */ cmpwi r0, 0
-/* 801E09E4 001DC644 4D 82 00 20 */ beqlr
-/* 801E09E8 001DC648 80 AD A1 50 */ lwz r5, lbl_8063F410-_SDA_BASE_(r13)
-/* 801E09EC 001DC64C 41 82 00 18 */ beq lbl_801E0A04
-/* 801E09F0 001DC650 88 03 00 00 */ lbz r0, 0(r3)
-/* 801E09F4 001DC654 80 65 03 F0 */ lwz r3, 0x3f0(r5)
-/* 801E09F8 001DC658 54 00 10 3A */ slwi r0, r0, 2
-/* 801E09FC 001DC65C 7C 63 02 14 */ add r3, r3, r0
-/* 801E0A00 001DC660 48 00 00 08 */ b lbl_801E0A08
-lbl_801E0A04:
-/* 801E0A04 001DC664 38 60 00 00 */ li r3, 0
-lbl_801E0A08:
-/* 801E0A08 001DC668 88 04 00 00 */ lbz r0, 0(r4)
-/* 801E0A0C 001DC66C 98 03 00 00 */ stb r0, 0(r3)
-/* 801E0A10 001DC670 88 04 00 01 */ lbz r0, 1(r4)
-/* 801E0A14 001DC674 98 03 00 01 */ stb r0, 1(r3)
-/* 801E0A18 001DC678 88 04 00 02 */ lbz r0, 2(r4)
-/* 801E0A1C 001DC67C 98 03 00 02 */ stb r0, 2(r3)
-/* 801E0A20 001DC680 88 04 00 03 */ lbz r0, 3(r4)
-/* 801E0A24 001DC684 38 80 00 04 */ li r4, 4
-/* 801E0A28 001DC688 98 03 00 03 */ stb r0, 3(r3)
-/* 801E0A2C 001DC68C 48 08 9C 28 */ b DCFlushRange
-/* 801E0A30 001DC690 4E 80 00 20 */ blr
-
-.global func_801E0A34
-func_801E0A34:
-/* 801E0A34 001DC694 38 A0 00 01 */ li r5, 1
-/* 801E0A38 001DC698 38 6D A0 B0 */ addi r3, r13, lbl_8063F370-_SDA_BASE_
-/* 801E0A3C 001DC69C 38 80 00 04 */ li r4, 4
-/* 801E0A40 001DC6A0 38 00 00 00 */ li r0, 0
-/* 801E0A44 001DC6A4 98 AD A0 B0 */ stb r5, lbl_8063F370-_SDA_BASE_(r13)
-/* 801E0A48 001DC6A8 B0 83 00 02 */ sth r4, 2(r3)
-/* 801E0A4C 001DC6AC 98 03 00 04 */ stb r0, 4(r3)
-/* 801E0A50 001DC6B0 4E 80 00 20 */ blr
diff --git a/asm/ctors_2.s b/asm/ctors_2.s
index ce9d11a..b758228 100644
--- a/asm/ctors_2.s
+++ b/asm/ctors_2.s
@@ -2,7 +2,6 @@
.section .ctors, "wa" # 0x803E1E60 - 0x803E22A0
-.4byte func_801E07C8, func_801E07F0, func_801E0A34
.4byte func_801E4308, func_801E472C, func_801E5F5C, func_801E6BD8
.4byte func_801ED364, func_801EE024, func_801F1A68, func_801F40C0
.4byte func_801F98CC, func_801FA074, func_801FA36C, func_801FB40C
diff --git a/asm/sbss_2.s b/asm/sbss_2.s
index 0c96a06..ec7549b 100644
--- a/asm/sbss_2.s
+++ b/asm/sbss_2.s
@@ -1,17 +1,8 @@
.section .sbss, "wa" # 0x80474F00 - 0x80643050
-.global lbl_8063F35E
-lbl_8063F35E:
+.global lbl_8063F376
+lbl_8063F376:
.skip 0x2
-.global lbl_8063F360
-lbl_8063F360:
- .skip 0x8
-.global lbl_8063F368
-lbl_8063F368:
- .skip 0x8
-.global lbl_8063F370
-lbl_8063F370:
- .skip 0x8
.global lbl_8063F378
lbl_8063F378:
.skip 0x8
diff --git a/include/GSfilterModule.h b/include/GSfilterModule.h
new file mode 100644
index 0000000..6b9af03
--- /dev/null
+++ b/include/GSfilterModule.h
@@ -0,0 +1,24 @@
+#ifndef POKEREVO_GSFILTERMODULE_H
+#define POKEREVO_GSFILTERMODULE_H
+
+#include "gUnkClass20.h"
+
+struct GSfilterModule
+{
+ u8 unk0[0x10]; // pad
+ u32 unk10;
+ u8 unk14[0x3D8]; // pad
+ gUnkClass20* unk3EC; // pointer to array
+ gUnkClass21* unk3F0;
+ u8 unk3F4[0x18]; // pad
+ u8 unk40C; // counter
+};
+
+extern "C"
+{
+extern GSfilterModule* lbl_8063F410;
+// TODO: member function
+gUnkClass20* func_801FB80C(GSfilterModule*);
+}
+
+#endif //POKEREVO_GSFILTERMODULE_H
diff --git a/include/SDK/OS/OSCache.h b/include/SDK/OS/OSCache.h
index 75dd2ca..73dcc94 100644
--- a/include/SDK/OS/OSCache.h
+++ b/include/SDK/OS/OSCache.h
@@ -5,6 +5,7 @@
extern "C" {
#endif
+void DCFlushRange(void* startAddr, u32 nBytes);
void DCInvalidateRange(void* startAddr, u32 nBytes);
void LCEnable(void);
#define LC_BASE (0xE000 << 16)
diff --git a/include/gUnkClass20.h b/include/gUnkClass20.h
new file mode 100644
index 0000000..141aff8
--- /dev/null
+++ b/include/gUnkClass20.h
@@ -0,0 +1,30 @@
+#ifndef POKEREVO_GUNKCLASS20_H
+#define POKEREVO_GUNKCLASS20_H
+
+// size == 0x4
+struct gUnkClass21
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+};
+
+// size == 0x8
+struct gUnkClass20
+{
+ u8 unk0; // index into an array of gUnkClass21.
+ // id?
+ u8 unk1; // func_801FB80C returns first instance where this is 0.
+ // "allocated" flag?
+ u8 unk2;
+ u8 unk3;
+ u32 unk4;
+
+ gUnkClass20* func_801E0810(u32 p2, u8 p3, u8 p4);
+ void func_801E0904();
+ void func_801E0978(gUnkClass21* p2) const;
+ void func_801E09DC(gUnkClass21* p2) const;
+};
+
+#endif //POKEREVO_GUNKCLASS20_H
diff --git a/obj_files.mk b/obj_files.mk
index bffb85d..d8cb71a 100644
--- a/obj_files.mk
+++ b/obj_files.mk
@@ -230,9 +230,11 @@ SPLIT_O_FILES := \
$(BUILD_DIR)/src/code_801DD5C8.o \
$(BUILD_DIR)/src/code_801DD8C0.o \
$(BUILD_DIR)/src/GScamera.o \
- $(BUILD_DIR)/asm/code_801DF040.o \
- $(BUILD_DIR)/asm/code_801E07E8.o \
- $(BUILD_DIR)/asm/code_801E0810.o \
+ $(BUILD_DIR)/asm/GSvolume.o \
+ $(BUILD_DIR)/asm/GSvolume_ctors.o \
+ $(BUILD_DIR)/asm/GSvolume_sbss.o \
+ $(BUILD_DIR)/src/code_801E07E8.o \
+ $(BUILD_DIR)/src/gUnkClass20.o \
$(BUILD_DIR)/asm/code_801E0A54.o \
$(BUILD_DIR)/asm/code_801E4360.o \
$(BUILD_DIR)/asm/code_801E474C.o \
diff --git a/src/code_801E07E8.cpp b/src/code_801E07E8.cpp
new file mode 100644
index 0000000..d3ae54d
--- /dev/null
+++ b/src/code_801E07E8.cpp
@@ -0,0 +1,13 @@
+#include "ctorStruct.h"
+
+static ctorStruct gUnk8063F368(1, 4, 0);
+
+extern "C"
+{
+
+u32 func_801E07E8(void)
+{
+ return 0;
+}
+
+} //extern "C"
diff --git a/src/gUnkClass20.cpp b/src/gUnkClass20.cpp
new file mode 100644
index 0000000..960e593
--- /dev/null
+++ b/src/gUnkClass20.cpp
@@ -0,0 +1,84 @@
+#include "ctorStruct.h"
+#include <string.h>
+#include <SDK/os.h>
+#include "GSfilterModule.h"
+#include "gUnkClass20.h"
+
+static ctorStruct gUnk8063F370(1, 4, 0);
+
+extern "C"
+{
+// TODO: move to proper header
+void* func_8023B058(u8);
+void func_8023B3B8(void*, u32);
+void func_8023B420(void*, u32);
+}
+
+// "constructor" ?
+gUnkClass20* gUnkClass20::func_801E0810(u32 p2, u8 p3, u8 p4)
+{
+ u32 r30;
+
+ if (!lbl_8063F410)
+ return NULL;
+ gUnkClass20* r29 = func_801FB80C(lbl_8063F410);
+ if (!r29)
+ return NULL;
+ r29->unk1 = 1;
+ r29->unk2 = p3;
+ r29->unk3 = p4;
+ r29->unk4 = p2;
+ if (r29->unk3) {
+ r30 = lbl_8063F410->unk10;
+ void* r3 = func_8023B058(static_cast<u8>(r30 >> 16));
+ if (r3)
+ func_8023B3B8(r3, r30);
+ }
+
+ const GSfilterModule* r3 = lbl_8063F410;
+ gUnkClass21* r4 = (r29->unk1) ? &r3->unk3F0[r29->unk0] : NULL;
+
+ r4->unk0 = unk0;
+ r4->unk1 = unk1;
+ r4->unk2 = unk2;
+ r4->unk3 = unk3;
+ return r29;
+}
+
+// "destructor" ?
+void gUnkClass20::func_801E0904()
+{
+ if (unk1) {
+ if (unk3) {
+ u32 r31 = lbl_8063F410->unk10;
+ void* r3 = func_8023B058(static_cast<u8>(r31 >> 16));
+ if (r3)
+ func_8023B420(r3, r31);
+ }
+ unk1 = 0;
+ unk4 = NULL;
+ }
+}
+
+// read into p2
+void gUnkClass20::func_801E0978(gUnkClass21* p2) const
+{
+ if (unk1) {
+ const GSfilterModule* r5 = lbl_8063F410;
+ const gUnkClass21* r3 = (unk1) ? &r5->unk3F0[unk0] : NULL;
+ *p2 = *r3;
+ return;
+ }
+ memset(p2, 0, sizeof(gUnkClass21));
+}
+
+// write from p2
+void gUnkClass20::func_801E09DC(gUnkClass21* p2) const
+{
+ if (!unk1)
+ return;
+ const GSfilterModule* r5 = lbl_8063F410;
+ gUnkClass21* r3 = (unk1) ? &r5->unk3F0[unk0] : NULL;
+ *r3 = *p2;
+ DCFlushRange(r3, sizeof(gUnkClass21));
+}