Greatly improve automatic symbol finding in the disassembler. Code still needs to be cleaned up a bit

This commit is contained in:
rozlette
2020-01-16 13:06:32 -06:00
parent 30daa16255
commit 50019e85ad
11 changed files with 23994 additions and 15437 deletions
+31
View File
@@ -270,6 +270,15 @@ void __ll_mod(void); // func_80088A38
void __ll_rshift(void); // func_80088AD4
void __osExceptionPreamble(void); // func_80088B00
void __osException(void); // func_80088B10
void func_80088D48(void); // func_80088D48
void func_80088D54(void); // func_80088D54
void func_80088D60(void); // func_80088D60
void func_80088D80(void); // func_80088D80
void func_80088DC4(void); // func_80088DC4
void func_80088F2C(void); // func_80088F2C
void func_80088F88(void); // func_80088F88
void func_80088FA8(void); // func_80088FA8
void func_80088FE0(void); // func_80088FE0
void send_mesg(void); // func_8008905C
void handle_CpU(void); // func_80089110
void __osEnqueueAndYield(OSThread** param_1); // func_80089144
@@ -6169,6 +6178,7 @@ void func_808CCBE4(void); // func_808CCBE4
void func_808CCCF0(void); // func_808CCCF0
void func_808CCDE4(void); // func_808CCDE4
void func_808CCEE4(void); // func_808CCEE4
UNK_TYPE4 func_808CD020(UNK_TYPE4 param_1, int param_2, UNK_PTR param_3, UNK_TYPE4 param_4, short* param_5, int param_6); // func_808CD020
void func_808CD08C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // func_808CD08C
void func_808CD238(void); // func_808CD238
void func_808CD740(void); // func_808CD740
@@ -6307,6 +6317,26 @@ void func_808D75F0(void); // func_808D75F0
void func_808D7714(void); // func_808D7714
void func_808D77B8(void); // func_808D77B8
void func_808D77DC(void); // func_808D77DC
UNK_TYPE4 func_808D78D0(Actor* param_1); // func_808D78D0
unsigned int func_808D7928(Actor* param_1); // func_808D7928
void func_808D7954(Actor* param_1); // func_808D7954
void func_808D7A04(void); // func_808D7A04
int func_808D7A14(int param_1); // func_808D7A14
void func_808D7A40(UNK_PTR param_1, UNK_PTR param_2); // func_808D7A40
void func_808D7A68(int param_1, GlobalContext* param_2); // func_808D7A68
void func_808D7C64(int param_1, GlobalContext* param_2); // func_808D7C64
void func_808D7DC4(int param_1, GlobalContext* param_2); // func_808D7DC4
void func_808D7E14(unsigned int param_1, GlobalContext* param_2); // func_808D7E14
void func_808D7F0C(unsigned int param_1, GlobalContext* param_2); // func_808D7F0C
void func_808D7F2C(int param_1); // func_808D7F2C
void func_808D7FFC(int param_1); // func_808D7FFC
void func_808D8014(int param_1, GlobalContext* param_2); // func_808D8014
void func_808D8074(int param_1, unsigned int param_2); // func_808D8074
void func_808D814C(int param_1, int param_2); // func_808D814C
void func_808D82CC(int param_1); // func_808D82CC
void func_808D84F4(unsigned int param_1); // func_808D84F4
void func_808D8678(unsigned int param_1, GlobalContext* param_2); // func_808D8678
void func_808D8720(int param_1); // func_808D8720
void func_808D8940(void); // func_808D8940
void func_808D8B58(void); // func_808D8B58
void func_808D8D60(void); // func_808D8D60
@@ -6455,6 +6485,7 @@ void func_808E45A0(void); // func_808E45A0
void func_808E4654(void); // func_808E4654
void func_808E4740(void); // func_808E4740
void func_808E47E8(void); // func_808E47E8
void func_808E491C(int param_1); // func_808E491C
void func_808E4984(void); // func_808E4984
void func_808E4AC8(void); // func_808E4AC8
void func_808E4C18(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // func_808E4C18
+4239 -563
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -826,6 +826,7 @@ SECTIONS
}
. += 0x1070; /* TODO we are skipping a file that we don't currently disassemble */
func_808D78D0 = 0x808D78D0;
ovl_En_Sw :
{
-1
View File
@@ -620,5 +620,4 @@
('decomp/', 'ovl_En_Invisible_Ruppe', 0x80C258A0, ((0x80C25B30, 0x80C25BBF),),()),
('decomp/', 'ovl_Obj_Ending', 0x80C25BC0, ((0x80C25CC0, 0x80C25D3F),),()),
('decomp/', 'ovl_En_Rsn', 0x80C25D40, ((0x80C25FF0, 0x80C2609F),),()),
}
+31
View File
@@ -267,6 +267,15 @@
0x80088AD4:("__ll_rshift","void","void"),
0x80088B00:("__osExceptionPreamble","void","void"),
0x80088B10:("__osException","void","void"),
0x80088D48:("func_80088D48","void","void"),
0x80088D54:("func_80088D54","void","void"),
0x80088D60:("func_80088D60","void","void"),
0x80088D80:("func_80088D80","void","void"),
0x80088DC4:("func_80088DC4","void","void"),
0x80088F2C:("func_80088F2C","void","void"),
0x80088F88:("func_80088F88","void","void"),
0x80088FA8:("func_80088FA8","void","void"),
0x80088FE0:("func_80088FE0","void","void"),
0x8008905C:("send_mesg","void","void"),
0x80089110:("handle_CpU","void","void"),
0x80089144:("__osEnqueueAndYield","void","OSThread** param_1"),
@@ -6163,6 +6172,7 @@
0x808CCCF0:("func_808CCCF0","void","void"),
0x808CCDE4:("func_808CCDE4","void","void"),
0x808CCEE4:("func_808CCEE4","void","void"),
0x808CD020:("func_808CD020","UNK_TYPE4","UNK_TYPE4 param_1, int param_2, UNK_PTR param_3, UNK_TYPE4 param_4, short* param_5, int param_6"),
0x808CD08C:("func_808CD08C","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5"),
0x808CD238:("func_808CD238","void","void"),
0x808CD740:("func_808CD740","void","void"),
@@ -6301,6 +6311,26 @@
0x808D7714:("func_808D7714","void","void"),
0x808D77B8:("func_808D77B8","void","void"),
0x808D77DC:("func_808D77DC","void","void"),
0x808D78D0:("func_808D78D0","UNK_TYPE4","Actor* param_1"),
0x808D7928:("func_808D7928","unsigned int","Actor* param_1"),
0x808D7954:("func_808D7954","void","Actor* param_1"),
0x808D7A04:("func_808D7A04","void","void"),
0x808D7A14:("func_808D7A14","int","int param_1"),
0x808D7A40:("func_808D7A40","void","UNK_PTR param_1, UNK_PTR param_2"),
0x808D7A68:("func_808D7A68","void","int param_1, GlobalContext* param_2"),
0x808D7C64:("func_808D7C64","void","int param_1, GlobalContext* param_2"),
0x808D7DC4:("func_808D7DC4","void","int param_1, GlobalContext* param_2"),
0x808D7E14:("func_808D7E14","void","unsigned int param_1, GlobalContext* param_2"),
0x808D7F0C:("func_808D7F0C","void","unsigned int param_1, GlobalContext* param_2"),
0x808D7F2C:("func_808D7F2C","void","int param_1"),
0x808D7FFC:("func_808D7FFC","void","int param_1"),
0x808D8014:("func_808D8014","void","int param_1, GlobalContext* param_2"),
0x808D8074:("func_808D8074","void","int param_1, unsigned int param_2"),
0x808D814C:("func_808D814C","void","int param_1, int param_2"),
0x808D82CC:("func_808D82CC","void","int param_1"),
0x808D84F4:("func_808D84F4","void","unsigned int param_1"),
0x808D8678:("func_808D8678","void","unsigned int param_1, GlobalContext* param_2"),
0x808D8720:("func_808D8720","void","int param_1"),
0x808D8940:("func_808D8940","void","void"),
0x808D8B58:("func_808D8B58","void","void"),
0x808D8D60:("func_808D8D60","void","void"),
@@ -6449,6 +6479,7 @@
0x808E4654:("func_808E4654","void","void"),
0x808E4740:("func_808E4740","void","void"),
0x808E47E8:("func_808E47E8","void","void"),
0x808E491C:("func_808E491C","void","int param_1"),
0x808E4984:("func_808E4984","void","void"),
0x808E4AC8:("func_808E4AC8","void","void"),
0x808E4C18:("func_808E4C18","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5"),
+11 -11
View File
@@ -1,13 +1,13 @@
# Follows the format of Address:(Name, Type, Array Info)
# Follows the format of Address:(Name, Type, Array Info, Size)
{
0x80000300:("osTvType","UNK_TYPE",""),
0x80000304:("osRomType","UNK_TYPE",""),
0x80000308:("osRomBase","UNK_TYPE",""),
0x8000030C:("osResetType","UNK_TYPE",""),
0x80000310:("osCicId","UNK_TYPE",""),
0x80000314:("osVersion","UNK_TYPE",""),
0x80000318:("osMemSize","UNK_TYPE",""),
0x8000031C:("D_8000031C","UNK_TYPE",""),
0x80000500:("D_80000500","UNK_TYPE",""),
0x80025D00:("D_80025D00","UNK_TYPE",""),
0x80000300:("osTvType","UNK_TYPE","",0x4),
0x80000304:("osRomType","UNK_TYPE","",0x4),
0x80000308:("osRomBase","UNK_TYPE","",0x4),
0x8000030C:("osResetType","UNK_TYPE","",0x4),
0x80000310:("osCicId","UNK_TYPE","",0x4),
0x80000314:("osVersion","UNK_TYPE","",0x4),
0x80000318:("osMemSize","UNK_TYPE","",0x4),
0x8000031C:("D_8000031C","UNK_TYPE","",0x4), # TODO size
0x80000500:("D_80000500","UNK_TYPE","",0x1), # TODO size
0x80025D00:("D_80025D00","UNK_TYPE","",0x1), # TODO size
}
+19006 -14736
View File
File diff suppressed because it is too large Load Diff
+64 -64
View File
@@ -1,68 +1,68 @@
# Follows the format of Address:(Name, Type, Array Info)
# Follows the format of Address:(Name, Type, Array Info, Size)
{
# NOTE These symbols could be one of two symbols: the start of a file or the end of a file before it.
# The choice for disassembly is arbitrary but in code it should be the one that makes sense.
0x0001A500:("dmadata_vrom_start","u32",""), # Start of dmadata
0x00020700:("dmadata_vrom_end","u32",""), # Byte immediately after end of dmadata
0x00046AF0:("Audioseq_vrom_start","UNK_TYPE",""),
0x00097F70:("Audioseq_vrom_end","UNK_TYPE",""),
0x0065D000:("link_animetion_vrom_start","UNK_TYPE",""),
0x00957000:("","UNK_TYPE",""), # ovl_kaleido_scope uses this. It is the start of vrom for a null entry in dmadata???
0x009ECEC0:("","UNK_TYPE",""), # ovl_kaleido_scope uses this. It is the end of vrom for a null entry in dmadata???
0x009ED000:("","UNK_TYPE",""), # ovl_kaleido_scope uses this. It is the start of vrom for a null entry in dmadata???
0x009F4700:("","UNK_TYPE",""), # ovl_kaleido_scope uses this. It is the end of vrom for a null entry in dmadata???
0x009F5000:("icon_item_field_static_vrom_start","UNK_TYPE",""),
0x00A09AF0:("icon_item_field_static_vrom_end","UNK_TYPE",""),
0x00A0A000:("icon_item_dungeon_static_vrom_start","UNK_TYPE",""),
0x00A0EB80:("icon_item_dungeon_static_vrom_end","UNK_TYPE",""),
0x00A0F000:("icon_item_gameover_static_vrom_start","UNK_TYPE",""),
0x00A12300:("icon_item_gameover_static_vrom_end","UNK_TYPE",""),
0x00A13000:("_013_0x00963540_vrom_start","UNK_TYPE",""),
0x00A1BA00:("_013_0x00963540_vrom_end","UNK_TYPE",""),
0x00A1C000:("_014_0x00967260_vrom_start","UNK_TYPE",""),
0x00A1C2E0:("_014_0x00967260_vrom_end","UNK_TYPE",""),
0x00A1D000:("map_i_static_vrom_start","UNK_TYPE",""),
0x00A1E310:("map_grand_static_vrom_start","UNK_TYPE",""),
0x00A27660:("item_name_static_vrom_start","UNK_TYPE",""),
0x00A352F0:("map_name_static_vrom_start","UNK_TYPE",""),
0x00A36C10:("_019_0x00980f60_vrom_start","UNK_TYPE",""),
0x00A7BEE0:("_020_0x009c6230_vrom_start","UNK_TYPE",""),
0x00A807A0:("_020_0x009c6230_vrom_end","UNK_TYPE",""),
0x00A8C000:("_022_0x009caaf0_vrom_start","UNK_TYPE",""),
0x00A92A10:("_023_0x009d1500_vrom_start","UNK_TYPE",""),
0x00A990E0:("_023_0x009d1500_vrom_end","UNK_TYPE",""),
0x00A9A000:("_024_0x009d3760_vrom_start","UNK_TYPE",""),
0x00ABFC00:("_024_0x009d3760_vrom_end","UNK_TYPE",""),
0x00AC0000:("do_action_static_vrom_start","UNK_TYPE",""),
0x00AC4000:("message_static_vrom_start","UNK_TYPE",""),
0x00ACA000:("message_texture_static_vrom_start","UNK_TYPE",""),
0x00ACC000:("nes_font_static_vrom_start","UNK_TYPE",""),
0x00AD1000:("en_message_data_static_vrom_start","UNK_TYPE",""),
0x00B3B000:("staff_message_data_static_vrom_start","UNK_TYPE",""),
0x00B3C000:("code_vrom_start","UNK_TYPE",""),
0x00C7A4E0:("code_vrom_end","UNK_TYPE",""),
0x01E85000:("nintendo_rogo_static_vrom_start","UNK_TYPE",""),
0x01E87DC0:("nintendo_rogo_static_vrom_end","UNK_TYPE",""),
0x01E88000:("title_static_vrom_start","UNK_TYPE",""),
0x01EB9730:("title_static_vrom_end","UNK_TYPE",""),
0x01EBA000:("_1124_0x0163f490_vrom_start","UNK_TYPE",""),
0x01EBB280:("_1124_0x0163f490_vrom_end","UNK_TYPE",""),
0x01EBC000:("_1125_0x0163fc10_vrom_start","UNK_TYPE",""),
0x01EBC680:("_1125_0x0163fc10_vrom_end","UNK_TYPE",""),
0x01EBD000:("_1126_0x0163ffc0_vrom_start","UNK_TYPE",""),
0x01EC8B20:("_1126_0x0163ffc0_vrom_end","UNK_TYPE",""),
0x01EC9000:("_1127_0x01643d50_vrom_start","UNK_TYPE",""),
0x01EC9F30:("_1127_0x01643d50_vrom_end","UNK_TYPE",""),
0x01ECA000:("_1128_0x01644c80_vrom_start","UNK_TYPE",""),
0x01ED3B00:("_1128_0x01644c80_vrom_end","UNK_TYPE",""),
0x01ED4000:("_1129_0x01646b60_vrom_start","UNK_TYPE",""),
0x01EDDB00:("_1129_0x01646b60_vrom_end","UNK_TYPE",""),
0x01EDE000:("_1130_0x01649020_vrom_start","UNK_TYPE",""),
0x01EE7B00:("_1130_0x01649020_vrom_end","UNK_TYPE",""),
0x01EE8000:("_1131_0x0164ad90_vrom_start","UNK_TYPE",""),
0x01EF1B00:("_1131_0x0164ad90_vrom_end","UNK_TYPE",""),
0x01EF2000:("vr_fine_static_vrom_start","UNK_TYPE",""),
0x01EFE000:("vr_cloud_static_vrom_start","UNK_TYPE",""),
0x01F0A000:("vr_pal_static_vrom_start","UNK_TYPE",""),
0x01F0A200:("vr_pal_static_vrom_end","UNK_TYPE",""),
0x0001A500:("dmadata_vrom_start","u32","",0x4), # Start of dmadata
0x00020700:("dmadata_vrom_end","u32","",0x4), # Byte immediately after end of dmadata
0x00046AF0:("Audioseq_vrom_start","UNK_TYPE","",0x4),
0x00097F70:("Audioseq_vrom_end","UNK_TYPE","",0x4),
0x0065D000:("link_animetion_vrom_start","UNK_TYPE","",0x4),
0x00957000:("","UNK_TYPE","",0x4), # ovl_kaleido_scope uses this. It is the start of vrom for a null entry in dmadata???
0x009ECEC0:("","UNK_TYPE","",0x4), # ovl_kaleido_scope uses this. It is the end of vrom for a null entry in dmadata???
0x009ED000:("","UNK_TYPE","",0x4), # ovl_kaleido_scope uses this. It is the start of vrom for a null entry in dmadata???
0x009F4700:("","UNK_TYPE","",0x4), # ovl_kaleido_scope uses this. It is the end of vrom for a null entry in dmadata???
0x009F5000:("icon_item_field_static_vrom_start","UNK_TYPE","",0x4),
0x00A09AF0:("icon_item_field_static_vrom_end","UNK_TYPE","",0x4),
0x00A0A000:("icon_item_dungeon_static_vrom_start","UNK_TYPE","",0x4),
0x00A0EB80:("icon_item_dungeon_static_vrom_end","UNK_TYPE","",0x4),
0x00A0F000:("icon_item_gameover_static_vrom_start","UNK_TYPE","",0x4),
0x00A12300:("icon_item_gameover_static_vrom_end","UNK_TYPE","",0x4),
0x00A13000:("_013_0x00963540_vrom_start","UNK_TYPE","",0x4),
0x00A1BA00:("_013_0x00963540_vrom_end","UNK_TYPE","",0x4),
0x00A1C000:("_014_0x00967260_vrom_start","UNK_TYPE","",0x4),
0x00A1C2E0:("_014_0x00967260_vrom_end","UNK_TYPE","",0x4),
0x00A1D000:("map_i_static_vrom_start","UNK_TYPE","",0x4),
0x00A1E310:("map_grand_static_vrom_start","UNK_TYPE","",0x4),
0x00A27660:("item_name_static_vrom_start","UNK_TYPE","",0x4),
0x00A352F0:("map_name_static_vrom_start","UNK_TYPE","",0x4),
0x00A36C10:("_019_0x00980f60_vrom_start","UNK_TYPE","",0x4),
0x00A7BEE0:("_020_0x009c6230_vrom_start","UNK_TYPE","",0x4),
0x00A807A0:("_020_0x009c6230_vrom_end","UNK_TYPE","",0x4),
0x00A8C000:("_022_0x009caaf0_vrom_start","UNK_TYPE","",0x4),
0x00A92A10:("_023_0x009d1500_vrom_start","UNK_TYPE","",0x4),
0x00A990E0:("_023_0x009d1500_vrom_end","UNK_TYPE","",0x4),
0x00A9A000:("_024_0x009d3760_vrom_start","UNK_TYPE","",0x4),
0x00ABFC00:("_024_0x009d3760_vrom_end","UNK_TYPE","",0x4),
0x00AC0000:("do_action_static_vrom_start","UNK_TYPE","",0x4),
0x00AC4000:("message_static_vrom_start","UNK_TYPE","",0x4),
0x00ACA000:("message_texture_static_vrom_start","UNK_TYPE","",0x4),
0x00ACC000:("nes_font_static_vrom_start","UNK_TYPE","",0x4),
0x00AD1000:("en_message_data_static_vrom_start","UNK_TYPE","",0x4),
0x00B3B000:("staff_message_data_static_vrom_start","UNK_TYPE","",0x4),
0x00B3C000:("code_vrom_start","UNK_TYPE","",0x4),
0x00C7A4E0:("code_vrom_end","UNK_TYPE","",0x4),
0x01E85000:("nintendo_rogo_static_vrom_start","UNK_TYPE","",0x4),
0x01E87DC0:("nintendo_rogo_static_vrom_end","UNK_TYPE","",0x4),
0x01E88000:("title_static_vrom_start","UNK_TYPE","",0x4),
0x01EB9730:("title_static_vrom_end","UNK_TYPE","",0x4),
0x01EBA000:("_1124_0x0163f490_vrom_start","UNK_TYPE","",0x4),
0x01EBB280:("_1124_0x0163f490_vrom_end","UNK_TYPE","",0x4),
0x01EBC000:("_1125_0x0163fc10_vrom_start","UNK_TYPE","",0x4),
0x01EBC680:("_1125_0x0163fc10_vrom_end","UNK_TYPE","",0x4),
0x01EBD000:("_1126_0x0163ffc0_vrom_start","UNK_TYPE","",0x4),
0x01EC8B20:("_1126_0x0163ffc0_vrom_end","UNK_TYPE","",0x4),
0x01EC9000:("_1127_0x01643d50_vrom_start","UNK_TYPE","",0x4),
0x01EC9F30:("_1127_0x01643d50_vrom_end","UNK_TYPE","",0x4),
0x01ECA000:("_1128_0x01644c80_vrom_start","UNK_TYPE","",0x4),
0x01ED3B00:("_1128_0x01644c80_vrom_end","UNK_TYPE","",0x4),
0x01ED4000:("_1129_0x01646b60_vrom_start","UNK_TYPE","",0x4),
0x01EDDB00:("_1129_0x01646b60_vrom_end","UNK_TYPE","",0x4),
0x01EDE000:("_1130_0x01649020_vrom_start","UNK_TYPE","",0x4),
0x01EE7B00:("_1130_0x01649020_vrom_end","UNK_TYPE","",0x4),
0x01EE8000:("_1131_0x0164ad90_vrom_start","UNK_TYPE","",0x4),
0x01EF1B00:("_1131_0x0164ad90_vrom_end","UNK_TYPE","",0x4),
0x01EF2000:("vr_fine_static_vrom_start","UNK_TYPE","",0x4),
0x01EFE000:("vr_cloud_static_vrom_start","UNK_TYPE","",0x4),
0x01F0A000:("vr_pal_static_vrom_start","UNK_TYPE","",0x4),
0x01F0A200:("vr_pal_static_vrom_end","UNK_TYPE","",0x4),
}
+285 -61
View File
@@ -1,16 +1,11 @@
#!/usr/bin/env python3
import argparse, os, struct, ast
import argparse, os, struct, ast, bisect
SPLIT_FILES = True # TODO this should be a flag somewhere
loadHighRefs = {}
loadLowRefs = {}
#from tables.objects import *
#from tables.functions import *
#from tables.variables import *
#from tables.files import *
known_files = {}
known_funcs = dict()
known_objects = dict()
@@ -77,6 +72,12 @@ def float_reg(num):
return "$f%d" % num
def format_ref(name, offset):
if offset == 0:
return "{}".format(name)
else:
return "{} + 0x{:X}".format(name, offset)
def get_op(inst):
return (inst & 0b11111100000000000000000000000000) >> 26
@@ -173,6 +174,8 @@ class Disassembler:
self.functions = set()
self.labels = set()
self.vars = set()
self.vars_sorted = list()
self.vars_length = dict()
self.data_regions = list()
self.bss_regions = list()
@@ -203,7 +206,7 @@ class Disassembler:
self.add_function(addr) # assume every object starts with a function
for addr in known_vars:
self.add_variable(addr)
self.add_variable(addr, known_vars[addr][3])
def reset_cache(self):
self.is_data_cache = {}
@@ -221,11 +224,13 @@ class Disassembler:
def add_function(self, addr):
self.functions.add(addr)
def add_variable(self, addr):
def add_variable(self, addr, size):
# TODO special case this value that is mis-identified as an address and causes problems by being in the middle of a pointer
if addr == 0x80AAB3AE:
return
self.vars.add(addr)
bisect.insort(self.vars_sorted, addr)
self.vars_length[addr] = size
def add_label(self, addr):
self.labels.add(addr)
@@ -315,6 +320,20 @@ class Disassembler:
# otherwise it is undefined (return true)
return True
def is_start_of_variable(self, addr):
return addr in self.vars
def get_variable_offset(self, addr):
if len(self.vars_sorted) == 0:
return None
if self.is_start_of_variable(addr):
return (addr, 0)
nearest = self.vars_sorted[bisect.bisect_left(self.vars_sorted, addr)-1]
offset = addr - nearest
if offset < self.vars_length[nearest]:
return (nearest, offset)
return None
def make_label(self, imm, cur):
addr = (imm*4) + cur + 4
self.add_label(addr)
@@ -362,7 +381,7 @@ class Disassembler:
# TODO functions are disabled for now due to behaving poorly with switches. This should be a flag.
#self.add_function(word)
elif self.is_in_data(word):
self.add_variable(word)
self.add_variable(word, 1)
def disassemble(self, path):
@@ -392,6 +411,17 @@ class Disassembler:
# don't split if it's the start of a data section, it's probably the same object
if not self.is_in_data_or_undef(new_object_start):
self.add_object(new_object_start)
if addr in self.vars:
name = self.make_load(addr)
if name.startswith("__switch"):
addr_i = i
case_addr = file.get_inst(addr_i)
while self.is_in_code(case_addr):
self.add_label(case_addr)
addr_i += 1
if addr_i >= (file.size // 4):
break
case_addr = file.get_inst(addr_i)
if self.auto_analysis:
self.guess_functions_and_variables_from_data()
self.has_done_first_pass = True
@@ -414,7 +444,7 @@ class Disassembler:
write_header(f)
if addr in self.labels:
f.write(".L_%08X:\n" % addr)
f.write("glabel .L_%08X\n" % addr)
if addr in self.functions:
name = get_func_name(addr)
f.write("\nglabel %s\n" % name)
@@ -422,28 +452,41 @@ class Disassembler:
if not self.is_in_data_or_undef(addr):
f.write("/* %06d 0x%08X %08X */ %s\n" % (i, addr, inst, self.disassemble_inst(inst, addr, i, file)))
elif inst in self.functions:
if addr in self.vars:
if self.is_start_of_variable(addr):
name = self.make_load(addr)
f.write("glabel %s\n" % name)
f.write("/* %06d 0x%08X */ .word\t%s\n" % (i, addr, get_func_name(inst)))
elif inst in self.vars:
if addr in self.vars:
elif inst in self.labels:
if self.is_start_of_variable(addr):
name = self.make_load(addr)
f.write("glabel %s\n" % name)
f.write("/* %06d 0x%08X */ .word\t.L_%08X\n" % (i, addr, inst))
elif self.is_start_of_variable(inst):
if self.is_start_of_variable(addr):
name = self.make_load(addr)
f.write("glabel %s\n" % name)
f.write("/* %06d 0x%08X */ .word\t%s\n" % (i, addr, self.make_load(inst)))
elif inst >= 0x801F0568 and inst < 0x801F0684:
# XXX special case gSaveContext.weekEventReg because there are pointers to fields of it in other parts of dara
# TODO think of a better way to do this
if self.is_start_of_variable(addr):
name = self.make_load(addr)
f.write("glabel %s\n" % name)
var = self.get_variable_offset(inst)
f.write("/* %06d 0x%08X */ .word\t(%s + 0x%08X)\n" % (i, addr, self.make_load(var[0]), var[1]))
else:
# TODO this should be moved into a print_data_range function or something
print_head = addr
data_stream = inst
while print_head < addr + 4:
if print_head in self.vars:
if self.is_start_of_variable(print_head):
name = self.make_load(print_head)
f.write("glabel %s\n" % name)
if print_head + 1 in self.vars or print_head % 2 != 0:
if self.is_start_of_variable(print_head+1) or print_head % 2 != 0:
f.write("/* %06d 0x%08X */ .byte\t0x%02X\n" % (i, addr, (data_stream >> 24) & 0xFF))
data_stream <<= 8
print_head += 1
elif print_head + 2 in self.vars or print_head + 3 in self.vars or print_head % 4 != 0:
elif self.is_start_of_variable(print_head+2) or self.is_start_of_variable(print_head+3) or print_head % 4 != 0:
f.write("/* %06d 0x%08X */ .short\t0x%04X\n" % (i, addr, (data_stream >> 16) & 0xFFFF))
data_stream <<= 16
print_head += 2
@@ -452,68 +495,239 @@ class Disassembler:
data_stream <<= 32
print_head += 4
def determine_load_ref(self, file, inst_i):
def determine_load_ref_impl(self, file, inst_i, start_i, depth, from_branch=False, visited=set()):
candidates = []
if not from_branch:
visited.clear()
# debug_i = 5217
debug_i = 0xFFFFFFFF
if inst_i == debug_i:
print("{} {} {}".format(inst_i, start_i, from_branch))
if depth <= 0:
return candidates
# TODO better detect when the register gets dirty
pc = file.vaddr + inst_i*4
cur_inst = file.get_inst(inst_i)
addr_high = get_imm(cur_inst)
if (addr_high > 0x80C2) or (addr_high < 0x8000):
return candidates
if get_op(cur_inst) != 15:
return
return candidates
# set state based on previous instruction
# TODO cleanup
if start_i == 0 or from_branch:
prev_was_jump = False
prev_was_ret = False
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_f_likely = False
prev_was_branch_likely = False
prev_was_branch_always = False
prev_target = 0
else:
prev_inst = file.get_inst(start_i - 1)
prev_op = get_op(prev_inst)
prev_was_jump = (prev_op == 2 or prev_op == 3)
prev_was_ret = (prev_op == 0 and get_func(prev_inst) == 8)
prev_was_branch = (prev_op == 4 or prev_op == 5 or prev_op == 6 or prev_op == 7) or \
(prev_op == 1 and (get_rt(prev_inst) == 0 or get_rt(prev_inst) == 1))
prev_was_branch_f = ((prev_op == 16) or (prev_op == 17) or (prev_op == 18)) and (get_rs(prev_inst) == 8) and ((prev_inst & (1 << 17)) == 0)
prev_was_branch_f_likely = ((prev_op == 16) or (prev_op == 17) or (prev_op == 18)) and (get_rs(prev_inst) == 8) and ((prev_inst & (1 << 17)) != 0)
prev_was_branch_always = prev_op == 4 and get_rs(prev_inst) == get_rt(prev_inst) == 0
prev_was_branch_likely = (prev_op == 20 or prev_op == 21 or prev_op == 22 or prev_op == 23) or \
(prev_op == 1 and (get_rt(prev_inst) == 2 or get_rt(prev_inst) == 3))
prev_target = get_signed_imm(prev_inst) * 4 + (file.vaddr + (start_i-1)*4) + 4
if prev_was_branch or prev_was_branch_f or prev_was_branch_likely or prev_was_branch_f_likely:
if inst_i == debug_i:
print("branch start")
branch_candidates = self.determine_load_ref_impl(file, inst_i, (prev_target - file.vaddr) // 4, depth, True, visited)
candidates += branch_candidates
if inst_i == debug_i:
print("branch end, found {}".format(branch_candidates))
continue_branch = not (prev_was_branch_likely or prev_was_branch_f_likely)
prev_was_jump = False
prev_was_ret = False
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_f_likely = False
prev_was_branch_likely = False
prev_was_branch_always = False
prev_target = 0
for i in range(1, 7): # TODO find a good limit
next_inst = file.get_inst(inst_i + i)
inst_read_addr = start_i if from_branch else start_i + 1
if get_op(next_inst) == 15 and get_rt(cur_inst) == get_rt(next_inst):
return # return if another lui overwrites reg
for i in range(1, depth + 1):
if not continue_branch:
break
if (get_op(next_inst) == 9) and (get_rt(cur_inst) == get_rt(next_inst) == get_rs(next_inst)): # lui + addiu (move pointer)
if inst_read_addr in visited:
break
if inst_i == debug_i:
print(" {}".format(inst_read_addr))
if self.is_in_data(file.vaddr + inst_read_addr*4):
break
next_inst = file.get_inst(inst_read_addr)
next_op = get_op(next_inst)
next_func = get_func(next_inst)
# TODO consolidate
if (next_op == 9) and (get_rt(cur_inst) == get_rs(next_inst)): # lui + addiu (move pointer)
addr = (get_imm(cur_inst) << 16) + get_signed_imm(next_inst)
# TODO workaround to avoid classifying loading constants as loading pointers
# This unfortunately causes it to not detect object addresses
if addr <= 0x80000000:
return
if addr > 0x80000000:
var = self.get_variable_offset(addr)
if self.auto_analysis:
if self.is_in_data_or_undef(addr):
self.add_variable(addr)
if var == None:
if self.auto_analysis:
if self.is_in_data_or_undef(addr):
self.add_variable(addr, 1)
var = (addr, 0)
else:
self.add_function(addr)
var = (addr, 0)
elif addr in self.functions:
var = (addr, 0)
if var != None:
candidates.append((file.vaddr + inst_read_addr*4, var[0], var[1]))
if get_rt(cur_inst) == get_rt(next_inst):
if prev_was_branch_likely or prev_was_branch_f_likely:
prev_was_branch_likely = False
prev_was_branch_f_likely = False
else:
self.add_function(addr)
elif addr not in self.functions and addr not in self.vars:
return
loadHighRefs[pc] = addr
loadLowRefs[pc + 4*i] = addr
return
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_always = False
continue_branch = False
elif is_load(next_inst) and (get_rt(cur_inst) == get_rs(next_inst)): # lui + load (load pointer)
addr = (get_imm(cur_inst) << 16) + get_signed_imm(next_inst)
# TODO workaround to avoid classifying loading constants as loading pointers
# This unfortunately causes it to not detect object addresses
if addr <= 0x80000000:
return
if addr > 0x80000000:
var = self.get_variable_offset(addr)
if self.auto_analysis:
if self.is_in_data_or_undef(addr):
self.add_variable(addr)
if var == None:
if self.auto_analysis:
if self.is_in_data_or_undef(addr):
self.add_variable(addr, 1)
var = (addr, 0)
else:
print("Warning: Pointer load location is in code 0x%08X @ 0x%08X, base=0x%08X" % (addr, file.vaddr + inst_read_addr*4, file.vaddr + inst_i*4))
self.add_function(addr)
var = (addr, 0)
elif addr in self.functions:
var = (addr, 0)
if var != None:
candidates.append((file.vaddr + inst_read_addr*4, var[0], var[1]))
if get_rt(cur_inst) == get_rt(next_inst):
if prev_was_branch_likely or prev_was_branch_f_likely:
prev_was_branch_likely = False
prev_was_branch_f_likely = False
else:
print("Warning: Pointer load location is in code 0x%08X" % addr)
self.add_variable(addr)
elif addr not in self.functions and addr not in self.vars:
return
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_always = False
continue_branch = False
loadHighRefs[pc] = addr
loadLowRefs[pc + 4*i] = addr
return
elif ((next_op >= 32) and (next_op < 48)) and (get_rt(cur_inst) == get_rt(next_inst)): # load that overwrites the reg () exclude fp loads
if prev_was_branch_likely or prev_was_branch_f_likely:
prev_was_branch_likely = False
prev_was_branch_f_likely = False
else:
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_always = False
continue_branch = False
elif ((next_op == 8) or (next_op == 9) or (next_op == 15)) and \
(get_rt(cur_inst) == get_rt(next_inst)):
if prev_was_branch_likely or prev_was_branch_f_likely:
prev_was_branch_likely = False
prev_was_branch_f_likely = False
else:
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_always = False
continue_branch = False
# TODO more funcs?
elif next_op == 0 and \
((next_func == 0) or (next_func == 2) or (next_func == 3) or \
(next_func == 24) or (next_func == 25) or (next_func == 26) or (next_func == 27) or \
(next_func == 32) or (next_func == 33) or (next_func == 34) or (next_func == 35) or \
(next_func == 36) or (next_func == 37) or (next_func == 38) or (next_func == 39) or \
(next_func == 42) or (next_func == 43)) and \
(get_rt(cur_inst) == get_rd(next_inst) and \
(get_rt(cur_inst) != get_rt(next_inst)) and (get_rt(cur_inst) != get_rs(next_inst))):
if prev_was_branch_likely or prev_was_branch_f_likely:
prev_was_branch_likely = False
prev_was_branch_f_likely = False
else:
prev_was_branch = False
prev_was_branch_f = False
prev_was_branch_always = False
continue_branch = False
visited.add(inst_read_addr)
if prev_was_branch or prev_was_branch_f or prev_was_branch_likely or prev_was_branch_f_likely:
if inst_i == debug_i:
print("branch start")
branch_candidates = self.determine_load_ref_impl(file, inst_i, (prev_target - file.vaddr) // 4, depth-i, True, visited)
candidates += branch_candidates
if inst_i == debug_i:
print("branch end, found {}".format(branch_candidates))
# if this is a jump, mark to return after we evaluate the following instruction
if prev_was_jump:
return
if get_op(next_inst) == 2 or get_op(next_inst) == 3:
prev_was_jump = True
if prev_was_jump or prev_was_ret:
continue_branch = False
if prev_was_branch_always:
continue_branch = False
prev_was_jump = (next_op == 2 or next_op == 3)
prev_was_ret = (next_op == 0 and get_func(next_inst) == 8)
prev_was_branch = (next_op == 4 or next_op == 5 or next_op == 6 or next_op == 7) or \
(next_op == 1 and (get_rt(next_inst) == 0 or get_rt(next_inst) == 1))
prev_was_branch_f = ((next_op == 16) or (next_op == 17) or (next_op == 18)) and (get_rs(next_inst) == 8) and ((next_inst & (1 << 17)) == 0)
prev_was_branch_f_likely = ((next_op == 16) or (next_op == 17) or (next_op == 18)) and (get_rs(next_inst) == 8) and ((next_inst & (1 << 17)) != 0)
prev_was_branch_always = next_op == 4 and get_rs(next_inst) == get_rt(next_inst) == 0
prev_was_branch_likely = (next_op == 20 or next_op == 21 or next_op == 22 or next_op == 23) or \
(next_op == 1 and (get_rt(next_inst) == 2 or get_rt(next_inst) == 3))
prev_target = get_signed_imm(next_inst)*4 + (file.vaddr + inst_read_addr*4) + 4
inst_read_addr += 1
return candidates
def determine_load_ref(self, file, inst_i):
candidates = self.determine_load_ref_impl(file, inst_i, inst_i, 200)
if len(candidates) > 0:
first = candidates[0] # TODO multiple candidates
loadHighRefs[file.vaddr + inst_i*4] = (first[1], first[2])
loadLowRefs[first[0]] = (first[1], first[2])
for condidate in candidates[1:]:
loadLowRefs[condidate[0]] = (condidate[1], condidate[2])
def disassemble_inst(self, inst, addr, i, file):
if inst == 0:
@@ -652,37 +866,44 @@ class Disassembler:
if op_num == 9 and get_rs(inst) == 0: # addiu with reg 0 is load immediate (li)
dis = "li\t%s, %d" % (regs[get_rt(inst)], get_signed_imm(inst))
elif op_num == 9 and addr in loadLowRefs: # addiu loading the lower half of a pointer
dis += "%s, %%lo(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]))
ref = loadLowRefs[addr]
dis += "%s, %s, %%lo(%s)" % (regs[get_rt(inst)], regs[get_rs(inst)], format_ref(self.make_load(ref[0]), ref[1]))
else:
dis += "%s, %s, %d" % (regs[get_rt(inst)], regs[get_rs(inst)], get_signed_imm(inst))
elif op_num == 12 or op_num == 13 or op_num == 14: # andi, ori, xori
dis += "%s, %s, %#X" % (regs[get_rt(inst)], regs[get_rs(inst)], get_imm(inst))
elif op_num == 15: # lui
self.determine_load_ref(file, i)
if not self.has_done_first_pass:
self.determine_load_ref(file, i)
if addr in loadHighRefs: # lui loading the higher half of a pointer
dis += "%s, %%hi(%s)" % (regs[get_rt(inst)], self.make_load(loadHighRefs[addr]))
ref = loadHighRefs[addr]
dis += "%s, %%hi(%s)" % (regs[get_rt(inst)], format_ref(self.make_load(ref[0]), ref[1]))
else:
dis += "%s, 0x%04X" % (regs[get_rt(inst)], get_imm(inst))
elif (op_num == 32 or op_num == 33 or op_num == 34 or op_num == 35 or op_num == 38 or op_num == 40 or op_num == 41 or
op_num == 42 or op_num == 42 or op_num == 43 or op_num == 46 or op_num == 55 or op_num == 63): # load/stores
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
ref = loadLowRefs[addr]
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], format_ref(self.make_load(ref[0]), ref[1]), regs[get_rs(inst)])
else:
dis += "%s, %#X(%s)" % (regs[get_rt(inst)], get_signed_imm(inst), regs[get_rs(inst)])
elif op_num == 36 or op_num == 37: # lbu, lhu
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
ref = loadLowRefs[addr]
dis += "%s, %%lo(%s)(%s)" % (regs[get_rt(inst)], format_ref(self.make_load(ref[0]), ref[1]), regs[get_rs(inst)])
else:
dis += "%s, %#X(%s)" % (regs[get_rt(inst)], get_signed_imm(inst), regs[get_rs(inst)])
elif (op_num == 49 or op_num == 50 or op_num == 53 or op_num == 54 or op_num == 57 or op_num == 58 or
op_num == 61 or op_num == 62): # load/store between co-processors
if addr in loadLowRefs: # loading with immediate forming lower half of pointer
dis += "%s, %%lo(%s)(%s)" % (float_reg(get_rt(inst)), self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
ref = loadLowRefs[addr]
dis += "%s, %%lo(%s)(%s)" % (float_reg(get_rt(inst)), format_ref(self.make_load(ref[0]), ref[1]), regs[get_rs(inst)])
else:
dis += "%s, %#X(%s)" % (float_reg(get_rt(inst)), get_signed_imm(inst), regs[get_rs(inst)])
elif op_num == 47: # cache
if addr in loadLowRefs: # cache op with immediate forming lower half of pointer
dis += "0x%02X, %%lo(%s)(%s)" % (get_rt(inst), self.make_load(loadLowRefs[addr]), regs[get_rs(inst)])
ref = loadLowRefs[addr]
dis += "0x%02X, %%lo(%s)(%s)" % (get_rt(inst), format_ref(self.make_load(ref[0]), ref[1]), regs[get_rs(inst)])
else:
dis += "0x%02X, %#X(%s)" % (get_rt(inst), get_signed_imm(inst), regs[get_rs(inst)])
@@ -725,10 +946,13 @@ class Disassembler:
if addr < 0x800969C0:
continue # Don't print out symbols before the start of boot. These will be defined in other files.
name = self.make_load(addr)
if name.startswith("__switch"):
continue
if addr in known_vars:
f.write("extern %s %s%s; // D_%08X\n" % (known_vars[addr][1], self.make_load(addr), known_vars[addr][2], addr))
f.write("extern %s %s%s; // D_%08X\n" % (known_vars[addr][1], name, known_vars[addr][2], addr))
else:
f.write("//extern UNK_TYPE %s;\n" % self.make_load(addr))
f.write("//extern UNK_TYPE %s;\n" % name)
f.write("\n#endif\n")
+1 -1
View File
@@ -18,7 +18,7 @@ if __name__ == '__main__':
writing = False
lines = f.readlines()
for line in lines:
if line.startswith('glabel'):
if line.startswith('glabel') and not line.startswith('glabel .L'):
if current_file != None:
current_file.close()
func_name = line.split()[1]
+325
View File
@@ -60,11 +60,13 @@ D_8009CF50 = boot_bss_start + 0x00003A50;
D_8009CF60 = boot_bss_start + 0x00003A60;
D_8009CF70 = boot_bss_start + 0x00003A70;
__osThreadSave = boot_bss_start + 0x00003A80;
D_8009D130 = boot_bss_start + 0x00003C30;
D_8009D134 = boot_bss_start + 0x00003C34;
D_8009D135 = boot_bss_start + 0x00003C35;
D_8009D136 = boot_bss_start + 0x00003C36;
D_8009D137 = boot_bss_start + 0x00003C37;
D_8009D138 = boot_bss_start + 0x00003C38;
D_8009D1A8 = boot_bss_start + 0x00003CA8;
D_8009D1AC = boot_bss_start + 0x00003CAC;
D_8009D1AD = boot_bss_start + 0x00003CAD;
D_8009D1AE = boot_bss_start + 0x00003CAE;
@@ -78,6 +80,7 @@ D_8009E3F0 = boot_bss_start + 0x00004EF0;
__osPiAccessQueue = boot_bss_start + 0x00004EF8;
D_8009E410 = boot_bss_start + 0x00004F10;
__osEventStateTab = boot_bss_start + 0x00005010;
D_8009E590 = boot_bss_start + 0x00005090;
__osCurrentTime = boot_bss_start + 0x000050B0;
__osBaseCounter = boot_bss_start + 0x000050B8;
__osViIntrCount = boot_bss_start + 0x000050BC;
@@ -107,6 +110,7 @@ D_801E7840 = code_bss_start + 0x000038A0;
D_801E7DA0 = code_bss_start + 0x00003E00;
D_801E7DA4 = code_bss_start + 0x00003E04;
D_801E9AA0 = code_bss_start + 0x00005B00;
D_801ED4C0 = code_bss_start + 0x00009520;
D_801ED890 = code_bss_start + 0x000098F0;
D_801ED894 = code_bss_start + 0x000098F4;
D_801ED8A0 = code_bss_start + 0x00009900;
@@ -118,6 +122,7 @@ D_801ED8C0 = code_bss_start + 0x00009920;
D_801ED8C4 = code_bss_start + 0x00009924;
D_801ED8C8 = code_bss_start + 0x00009928;
D_801ED8CC = code_bss_start + 0x0000992C;
D_801ED8D0 = code_bss_start + 0x00009930;
D_801ED8D4 = code_bss_start + 0x00009934;
D_801ED8D8 = code_bss_start + 0x00009938;
D_801ED8DC = code_bss_start + 0x0000993C;
@@ -148,6 +153,7 @@ D_801EDBB0 = code_bss_start + 0x00009C10;
D_801EDBD4 = code_bss_start + 0x00009C34;
D_801EDBD8 = code_bss_start + 0x00009C38;
D_801EDBDC = code_bss_start + 0x00009C3C;
D_801EDBE0 = code_bss_start + 0x00009C40;
D_801EDBF0 = code_bss_start + 0x00009C50;
D_801EDBF4 = code_bss_start + 0x00009C54;
D_801EDBF8 = code_bss_start + 0x00009C58;
@@ -159,8 +165,14 @@ D_801EDC10 = code_bss_start + 0x00009C70;
D_801EDC14 = code_bss_start + 0x00009C74;
D_801EDC28 = code_bss_start + 0x00009C88;
D_801EDC30 = code_bss_start + 0x00009C90;
D_801EDC8C = code_bss_start + 0x00009CEC;
D_801EDC90 = code_bss_start + 0x00009CF0;
D_801EDC92 = code_bss_start + 0x00009CF2;
D_801EDC94 = code_bss_start + 0x00009CF4;
D_801EDC96 = code_bss_start + 0x00009CF6;
D_801EDDD0 = code_bss_start + 0x00009E30;
D_801EDDD4 = code_bss_start + 0x00009E34;
D_801EDDD8 = code_bss_start + 0x00009E38;
D_801EDDE0 = code_bss_start + 0x00009E40;
D_801EDDF0 = code_bss_start + 0x00009E50;
D_801EDE00 = code_bss_start + 0x00009E60;
@@ -191,13 +203,20 @@ D_801EE11C = code_bss_start + 0x0000A17C;
D_801EE150 = code_bss_start + 0x0000A1B0;
D_801EE188 = code_bss_start + 0x0000A1E8;
D_801EE1C0 = code_bss_start + 0x0000A220;
D_801EE1C4 = code_bss_start + 0x0000A224;
D_801EE1C8 = code_bss_start + 0x0000A228;
D_801EE1D0 = code_bss_start + 0x0000A230;
D_801EE1D4 = code_bss_start + 0x0000A234;
D_801EE1D8 = code_bss_start + 0x0000A238;
D_801EE1E0 = code_bss_start + 0x0000A240;
D_801EE1E4 = code_bss_start + 0x0000A244;
D_801EE1E8 = code_bss_start + 0x0000A248;
D_801EE1F0 = code_bss_start + 0x0000A250;
D_801EE1F4 = code_bss_start + 0x0000A254;
D_801EE1F8 = code_bss_start + 0x0000A258;
D_801EE200 = code_bss_start + 0x0000A260;
D_801EE202 = code_bss_start + 0x0000A262;
D_801EE204 = code_bss_start + 0x0000A264;
D_801EE68C = code_bss_start + 0x0000A6EC;
D_801EE690 = code_bss_start + 0x0000A6F0;
D_801EE694 = code_bss_start + 0x0000A6F4;
@@ -207,6 +226,8 @@ D_801EE6C0 = code_bss_start + 0x0000A720;
D_801EE6C8 = code_bss_start + 0x0000A728;
D_801EE700 = code_bss_start + 0x0000A760;
D_801EE738 = code_bss_start + 0x0000A798;
D_801EE73A = code_bss_start + 0x0000A79A;
D_801EE73C = code_bss_start + 0x0000A79C;
D_801EEBC4 = code_bss_start + 0x0000AC24;
D_801EEBC8 = code_bss_start + 0x0000AC28;
D_801EEBCC = code_bss_start + 0x0000AC2C;
@@ -214,6 +235,8 @@ D_801EEBD0 = code_bss_start + 0x0000AC30;
D_801EEBF4 = code_bss_start + 0x0000AC54;
D_801EEBF8 = code_bss_start + 0x0000AC58;
D_801EEC00 = code_bss_start + 0x0000AC60;
D_801EEC02 = code_bss_start + 0x0000AC62;
D_801EEC04 = code_bss_start + 0x0000AC64;
D_801EF08C = code_bss_start + 0x0000B0EC;
D_801EF090 = code_bss_start + 0x0000B0F0;
D_801EF094 = code_bss_start + 0x0000B0F4;
@@ -221,6 +244,8 @@ D_801EF098 = code_bss_start + 0x0000B0F8;
D_801EF0BC = code_bss_start + 0x0000B11C;
D_801EF0C0 = code_bss_start + 0x0000B120;
D_801EF0C8 = code_bss_start + 0x0000B128;
D_801EF0CA = code_bss_start + 0x0000B12A;
D_801EF0CC = code_bss_start + 0x0000B12C;
D_801EF51D = code_bss_start + 0x0000B57D;
D_801EF554 = code_bss_start + 0x0000B5B4;
D_801EF558 = code_bss_start + 0x0000B5B8;
@@ -238,10 +263,14 @@ D_801F3F38 = code_bss_start + 0x0000FF98;
D_801F3F3A = code_bss_start + 0x0000FF9A;
D_801F3F3B = code_bss_start + 0x0000FF9B;
D_801F3F3C = code_bss_start + 0x0000FF9C;
D_801F3F42 = code_bss_start + 0x0000FFA2;
D_801F3F4A = code_bss_start + 0x0000FFAA;
D_801F3F5A = code_bss_start + 0x0000FFBA;
gStaticContext = code_bss_start + 0x0000FFC0;
D_801F3F70 = code_bss_start + 0x0000FFD0;
D_801F3F80 = code_bss_start + 0x0000FFE0;
D_801F3F83 = code_bss_start + 0x0000FFE3;
D_801F48C8 = code_bss_start + 0x00010928;
D_801F4D40 = code_bss_start + 0x00010DA0;
D_801F4D42 = code_bss_start + 0x00010DA2;
D_801F4D48 = code_bss_start + 0x00010DA8;
@@ -301,9 +330,12 @@ D_801F4F38 = code_bss_start + 0x00010F98;
D_801F4F40 = code_bss_start + 0x00010FA0;
D_801F4F48 = code_bss_start + 0x00010FA8;
D_801F4F50 = code_bss_start + 0x00010FB0;
D_801F4F56 = code_bss_start + 0x00010FB6;
D_801F4F58 = code_bss_start + 0x00010FB8;
D_801F4F5A = code_bss_start + 0x00010FBA;
D_801F4F60 = code_bss_start + 0x00010FC0;
D_801F4F66 = code_bss_start + 0x00010FC6;
D_801F4F68 = code_bss_start + 0x00010FC8;
D_801F4F6A = code_bss_start + 0x00010FCA;
lightsList = code_bss_start + 0x00010FD0;
mainHeap = code_bss_start + 0x00011160;
@@ -313,6 +345,7 @@ D_801F528E = code_bss_start + 0x000112EE;
D_801F53B0 = code_bss_start + 0x00011410;
D_801F56B0 = code_bss_start + 0x00011710;
D_801F5730 = code_bss_start + 0x00011790;
D_801F57B4 = code_bss_start + 0x00011814;
D_801F5834 = code_bss_start + 0x00011894;
gNMIBuffer = code_bss_start + 0x000118A0;
D_801F5850 = code_bss_start + 0x000118B0;
@@ -325,6 +358,7 @@ D_801F59DC = code_bss_start + 0x00011A3C;
D_801F59E0 = code_bss_start + 0x00011A40;
D_801F59E4 = code_bss_start + 0x00011A44;
D_801F59E8 = code_bss_start + 0x00011A48;
D_801F59EC = code_bss_start + 0x00011A4C;
D_801F59F0 = code_bss_start + 0x00011A50;
D_801F59F4 = code_bss_start + 0x00011A54;
D_801F59F8 = code_bss_start + 0x00011A58;
@@ -332,6 +366,8 @@ D_801F5A00 = code_bss_start + 0x00011A60;
D_801F5A08 = code_bss_start + 0x00011A68;
D_801F5A1E = code_bss_start + 0x00011A7E;
D_801F5A2C = code_bss_start + 0x00011A8C;
D_801F5A50 = code_bss_start + 0x00011AB0;
D_801F5A74 = code_bss_start + 0x00011AD4;
D_801F5A90 = code_bss_start + 0x00011AF0;
D_801F5A96 = code_bss_start + 0x00011AF6;
D_801F5A98 = code_bss_start + 0x00011AF8;
@@ -383,6 +419,7 @@ D_801F6D10 = code_bss_start + 0x00012D70;
D_801F6D18 = code_bss_start + 0x00012D78;
D_801F6D30 = code_bss_start + 0x00012D90;
D_801F6D33 = code_bss_start + 0x00012D93;
D_801F6D38 = code_bss_start + 0x00012D98;
D_801F6D4C = code_bss_start + 0x00012DAC;
D_801F6D50 = code_bss_start + 0x00012DB0;
D_801F6DFC = code_bss_start + 0x00012E5C;
@@ -419,6 +456,7 @@ schedStackEntry = code_bss_start + 0x00017338;
audioStackEntry = code_bss_start + 0x00017358;
padmgrStackEntry = code_bss_start + 0x00017378;
audioContext = code_bss_start + 0x00017398;
D_801FB620 = code_bss_start + 0x00017680;
D_801FBAA0 = code_bss_start + 0x00017B00;
D_801FBAB0 = code_bss_start + 0x00017B10;
D_801FBAB4 = code_bss_start + 0x00017B14;
@@ -474,6 +512,7 @@ D_801FBC28 = code_bss_start + 0x00017C88;
D_801FBC2C = code_bss_start + 0x00017C8C;
D_801FBC30 = code_bss_start + 0x00017C90;
D_801FBC38 = code_bss_start + 0x00017C98;
D_801FBC3A = code_bss_start + 0x00017C9A;
D_801FBC3C = code_bss_start + 0x00017C9C;
D_801FBC3E = code_bss_start + 0x00017C9E;
D_801FBC40 = code_bss_start + 0x00017CA0;
@@ -489,37 +528,53 @@ D_801FBC90 = code_bss_start + 0x00017CF0;
D_801FBC98 = code_bss_start + 0x00017CF8;
D_801FBCA4 = code_bss_start + 0x00017D04;
D_801FBCAC = code_bss_start + 0x00017D0C;
D_801FBCB0 = code_bss_start + 0x00017D10;
D_801FBCB4 = code_bss_start + 0x00017D14;
D_801FBCB8 = code_bss_start + 0x00017D18;
D_801FBCBC = code_bss_start + 0x00017D1C;
D_801FBCC0 = code_bss_start + 0x00017D20;
D_801FBCC4 = code_bss_start + 0x00017D24;
D_801FBCC8 = code_bss_start + 0x00017D28;
D_801FBCCC = code_bss_start + 0x00017D2C;
D_801FBCD0 = code_bss_start + 0x00017D30;
D_801FBCD4 = code_bss_start + 0x00017D34;
D_801FBCD8 = code_bss_start + 0x00017D38;
D_801FBCDC = code_bss_start + 0x00017D3C;
D_801FBCE0 = code_bss_start + 0x00017D40;
D_801FBCE4 = code_bss_start + 0x00017D44;
D_801FBCE8 = code_bss_start + 0x00017D48;
D_801FBCF0 = code_bss_start + 0x00017D50;
D_801FBCF4 = code_bss_start + 0x00017D54;
D_801FBCF8 = code_bss_start + 0x00017D58;
D_801FBD00 = code_bss_start + 0x00017D60;
D_801FBD04 = code_bss_start + 0x00017D64;
D_801FBD08 = code_bss_start + 0x00017D68;
D_801FBD10 = code_bss_start + 0x00017D70;
D_801FBD20 = code_bss_start + 0x00017D80;
D_801FBD24 = code_bss_start + 0x00017D84;
D_801FBD28 = code_bss_start + 0x00017D88;
D_801FBD30 = code_bss_start + 0x00017D90;
D_801FBD34 = code_bss_start + 0x00017D94;
D_801FBD38 = code_bss_start + 0x00017D98;
D_801FBD40 = code_bss_start + 0x00017DA0;
D_801FBD44 = code_bss_start + 0x00017DA4;
D_801FBD48 = code_bss_start + 0x00017DA8;
D_801FBD50 = code_bss_start + 0x00017DB0;
D_801FBD54 = code_bss_start + 0x00017DB4;
D_801FBD58 = code_bss_start + 0x00017DB8;
Math3D_UnitNormalVector_temp = code_bss_start + 0x00017DC0;
D_801FBD70 = code_bss_start + 0x00017DD0;
D_801FBD74 = code_bss_start + 0x00017DD4;
D_801FBD78 = code_bss_start + 0x00017DD8;
D_801FBD80 = code_bss_start + 0x00017DE0;
D_801FBD98 = code_bss_start + 0x00017DF8;
D_801FBDA4 = code_bss_start + 0x00017E04;
D_801FBDB0 = code_bss_start + 0x00017E10;
D_801FBDB4 = code_bss_start + 0x00017E14;
D_801FBDB8 = code_bss_start + 0x00017E18;
D_801FBDC0 = code_bss_start + 0x00017E20;
D_801FBDD8 = code_bss_start + 0x00017E38;
D_801FBDDC = code_bss_start + 0x00017E3C;
D_801FBDE0 = code_bss_start + 0x00017E40;
D_801FBDE8 = code_bss_start + 0x00017E48;
matrixState = code_bss_start + 0x00017E60;
@@ -617,6 +672,7 @@ D_801FD464 = code_bss_start + 0x000194C4;
D_801FD468 = code_bss_start + 0x000194C8;
D_801FD46C = code_bss_start + 0x000194CC;
D_801FD470 = code_bss_start + 0x000194D0;
D_801FD4A0 = code_bss_start + 0x00019500;
D_801FD4D0 = code_bss_start + 0x00019530;
D_801FD500 = code_bss_start + 0x00019560;
D_801FD518 = code_bss_start + 0x00019578;
@@ -632,6 +688,13 @@ D_801FD5C8 = code_bss_start + 0x00019628;
D_801FD5E8 = code_bss_start + 0x00019648;
D_801FD608 = code_bss_start + 0x00019668;
D_801FD610 = code_bss_start + 0x00019670;
D_801FD710 = code_bss_start + 0x00019770;
D_801FD8C0 = code_bss_start + 0x00019920;
D_801FDB00 = code_bss_start + 0x00019B60;
D_801FE100 = code_bss_start + 0x0001A160;
D_801FE4C0 = code_bss_start + 0x0001A520;
D_801FE640 = code_bss_start + 0x0001A6A0;
D_801FE6D0 = code_bss_start + 0x0001A730;
D_801FE7C0 = code_bss_start + 0x0001A820;
D_801FFBC0 = code_bss_start + 0x0001BC20;
D_801FFBC8 = code_bss_start + 0x0001BC28;
@@ -643,8 +706,16 @@ D_801FFC90 = code_bss_start + 0x0001BCF0;
D_801FFD00 = code_bss_start + 0x0001BD60;
D_801FFD34 = code_bss_start + 0x0001BD94;
D_801FFD40 = code_bss_start + 0x0001BDA0;
D_80200000 = code_bss_start + 0x0001C060;
D_80200002 = code_bss_start + 0x0001C062;
D_80200004 = code_bss_start + 0x0001C064;
D_80200008 = code_bss_start + 0x0001C068;
D_8020001E = code_bss_start + 0x0001C07E;
D_802000C9 = code_bss_start + 0x0001C129;
D_802000D4 = code_bss_start + 0x0001C134;
D_80200140 = code_bss_start + 0x0001C1A0;
D_8020034A = code_bss_start + 0x0001C3AA;
D_80200B88 = code_bss_start + 0x0001CBE8;
D_80200BBA = code_bss_start + 0x0001CC1A;
D_80200BCC = code_bss_start + 0x0001CC2C;
D_80200BCE = code_bss_start + 0x0001CC2E;
@@ -655,13 +726,24 @@ D_80200C76 = code_bss_start + 0x0001CCD6;
D_80200C78 = code_bss_start + 0x0001CCD8;
D_80200C7C = code_bss_start + 0x0001CCDC;
D_80200C80 = code_bss_start + 0x0001CCE0;
D_80200C92 = code_bss_start + 0x0001CCF2;
D_80200C94 = code_bss_start + 0x0001CCF4;
D_80200C98 = code_bss_start + 0x0001CCF8;
D_80200C9A = code_bss_start + 0x0001CCFA;
D_80200C9E = code_bss_start + 0x0001CCFE;
D_80200CA0 = code_bss_start + 0x0001CD00;
D_80200CF0 = code_bss_start + 0x0001CD50;
D_80200D38 = code_bss_start + 0x0001CD98;
D_80200D70 = code_bss_start + 0x0001CDD0;
D_802011F0 = code_bss_start + 0x0001D250;
D_8020178C = code_bss_start + 0x0001D7EC;
D_802017B0 = code_bss_start + 0x0001D810;
D_80201D68 = code_bss_start + 0x0001DDC8;
D_80201D6C = code_bss_start + 0x0001DDCC;
D_802023FC = code_bss_start + 0x0001E45C;
D_80202878 = code_bss_start + 0x0001E8D8;
D_80202880 = code_bss_start + 0x0001E8E0;
D_802028BC = code_bss_start + 0x0001E91C;
D_80202980 = code_bss_start + 0x0001E9E0;
D_802029D8 = code_bss_start + 0x0001EA38;
D_80202AB0 = code_bss_start + 0x0001EB10;
@@ -671,8 +753,10 @@ D_80202B20 = code_bss_start + 0x0001EB80;
D_80202B60 = code_bss_start + 0x0001EBC0;
D_80202B78 = code_bss_start + 0x0001EBD8;
D_80203278 = code_bss_start + 0x0001F2D8;
D_80203290 = code_bss_start + 0x0001F2F0;
D_80203294 = code_bss_start + 0x0001F2F4;
D_802034C0 = code_bss_start + 0x0001F520;
D_802034C4 = code_bss_start + 0x0001F524;
D_802034C8 = code_bss_start + 0x0001F528;
D_802034D0 = code_bss_start + 0x0001F530;
D_802034D4 = code_bss_start + 0x0001F534;
@@ -692,6 +776,7 @@ D_80203618 = code_bss_start + 0x0001F678;
D_8020361C = code_bss_start + 0x0001F67C;
D_80203620 = code_bss_start + 0x0001F680;
D_80203624 = code_bss_start + 0x0001F684;
D_80203628 = code_bss_start + 0x0001F688;
D_80203630 = code_bss_start + 0x0001F690;
D_80203640 = code_bss_start + 0x0001F6A0;
D_80203650 = code_bss_start + 0x0001F6B0;
@@ -727,6 +812,7 @@ D_80204598 = code_bss_start + 0x000205F8;
D_802045A4 = code_bss_start + 0x00020604;
D_80204FA4 = code_bss_start + 0x00021004;
D_80204FA8 = code_bss_start + 0x00021008;
D_80204FB4 = code_bss_start + 0x00021014;
D_80204FB8 = code_bss_start + 0x00021018;
D_80204FC0 = code_bss_start + 0x00021020;
D_80204FCC = code_bss_start + 0x0002102C;
@@ -743,6 +829,7 @@ D_8020522B = code_bss_start + 0x0002128B;
D_80205390 = code_bss_start + 0x000213F0;
D_802053C8 = code_bss_start + 0x00021428;
D_802057B0 = code_bss_start + 0x00021810;
D_80205830 = code_bss_start + 0x00021890;
D_802084B0 = code_bss_start + 0x00024510;
D_80208530 = code_bss_start + 0x00024590;
D_80208598 = code_bss_start + 0x000245F8;
@@ -752,8 +839,10 @@ D_802085C8 = code_bss_start + 0x00024628;
D_802085D8 = code_bss_start + 0x00024638;
D_802085F8 = code_bss_start + 0x00024658;
D_802085FC = code_bss_start + 0x0002465C;
D_80208604 = code_bss_start + 0x00024664;
D_8020861C = code_bss_start + 0x0002467C;
D_80208634 = code_bss_start + 0x00024694;
D_8020864C = code_bss_start + 0x000246AC;
D_80208650 = code_bss_start + 0x000246B0;
D_80208654 = code_bss_start + 0x000246B4;
D_80208E68 = code_bss_start + 0x00024EC8;
@@ -765,11 +854,173 @@ D_80208E94 = code_bss_start + 0x00024EF4;
D_80208E98 = code_bss_start + 0x00024EF8;
D_80208E99 = code_bss_start + 0x00024EF9;
D_80208E9C = code_bss_start + 0x00024EFC;
D_80208EA0 = code_bss_start + 0x00024F00;
D_80209AA0 = code_bss_start + 0x00025B00;
D_80209EA0 = code_bss_start + 0x00025F00;
D_8024A4C0 = code_bss_start + 0x00066520;
heap = code_bss_start + 0x0019E520;
D_80780000 = code_bss_start + 0x0059C060;
D_80784600 = code_bss_start + 0x005A0660;
D_807DA800 = code_bss_start + 0x005F6860;
D_80814E80 = ovl_file_choose_bss_start + 0x00000000;
D_80814E90 = ovl_file_choose_bss_start + 0x00000010;
D_8082DA50 = ovl_kaleido_scope_bss_start + 0x00000000;
D_8082DA52 = ovl_kaleido_scope_bss_start + 0x00000002;
D_8082DA54 = ovl_kaleido_scope_bss_start + 0x00000004;
D_8082DA56 = ovl_kaleido_scope_bss_start + 0x00000006;
D_8082DA58 = ovl_kaleido_scope_bss_start + 0x00000008;
D_8082DA60 = ovl_kaleido_scope_bss_start + 0x00000010;
D_8082DA64 = ovl_kaleido_scope_bss_start + 0x00000014;
D_8082DA68 = ovl_kaleido_scope_bss_start + 0x00000018;
D_8082DA6C = ovl_kaleido_scope_bss_start + 0x0000001C;
D_8082DA70 = ovl_kaleido_scope_bss_start + 0x00000020;
D_8082DA74 = ovl_kaleido_scope_bss_start + 0x00000024;
D_8082DA78 = ovl_kaleido_scope_bss_start + 0x00000028;
D_8082DA7C = ovl_kaleido_scope_bss_start + 0x0000002C;
D_8082DA80 = ovl_kaleido_scope_bss_start + 0x00000030;
D_8082DA82 = ovl_kaleido_scope_bss_start + 0x00000032;
D_8082DA84 = ovl_kaleido_scope_bss_start + 0x00000034;
D_8082DA86 = ovl_kaleido_scope_bss_start + 0x00000036;
D_80862AF0 = ovl_Player_Actor_bss_start + 0x00000000;
D_80862AF4 = ovl_Player_Actor_bss_start + 0x00000004;
D_80862AF8 = ovl_Player_Actor_bss_start + 0x00000008;
D_80862AFC = ovl_Player_Actor_bss_start + 0x0000000C;
D_80862B00 = ovl_Player_Actor_bss_start + 0x00000010;
D_80862B02 = ovl_Player_Actor_bss_start + 0x00000012;
D_80862B04 = ovl_Player_Actor_bss_start + 0x00000014;
D_80862B08 = ovl_Player_Actor_bss_start + 0x00000018;
D_80862B0C = ovl_Player_Actor_bss_start + 0x0000001C;
D_80862B10 = ovl_Player_Actor_bss_start + 0x00000020;
D_80862B14 = ovl_Player_Actor_bss_start + 0x00000024;
D_80862B16 = ovl_Player_Actor_bss_start + 0x00000026;
D_80862B18 = ovl_Player_Actor_bss_start + 0x00000028;
D_80862B1C = ovl_Player_Actor_bss_start + 0x0000002C;
D_80862B20 = ovl_Player_Actor_bss_start + 0x00000030;
D_80862B24 = ovl_Player_Actor_bss_start + 0x00000034;
D_80862B28 = ovl_Player_Actor_bss_start + 0x00000038;
D_80862B2C = ovl_Player_Actor_bss_start + 0x0000003C;
D_80862B30 = ovl_Player_Actor_bss_start + 0x00000040;
D_80862B3C = ovl_Player_Actor_bss_start + 0x0000004C;
D_80862B40 = ovl_Player_Actor_bss_start + 0x00000050;
D_80862B44 = ovl_Player_Actor_bss_start + 0x00000054;
D_80862B48 = ovl_Player_Actor_bss_start + 0x00000058;
D_80862B4C = ovl_Player_Actor_bss_start + 0x0000005C;
D_80862B50 = ovl_Player_Actor_bss_start + 0x00000060;
D_80862B6C = ovl_Player_Actor_bss_start + 0x0000007C;
D_80867BC0 = ovl_En_Door_bss_start + 0x00000000;
D_80874650 = ovl_En_Bom_bss_start + 0x00000000;
D_80874668 = ovl_En_Bom_bss_start + 0x00000018;
D_8087466A = ovl_En_Bom_bss_start + 0x0000001A;
D_8087466C = ovl_En_Bom_bss_start + 0x0000001C;
D_8089F4D0 = ovl_En_Viewer_bss_start + 0x00000000;
D_808BC000 = ovl_Door_Warp1_bss_start + 0x00000000;
D_808BC004 = ovl_Door_Warp1_bss_start + 0x00000004;
D_808BCDE0 = ovl_Obj_Syokudai_bss_start + 0x00000000;
D_808C4F70 = ovl_En_Wood02_bss_start + 0x00000000;
D_808C4F74 = ovl_En_Wood02_bss_start + 0x00000004;
D_808CC250 = ovl_En_Minideath_bss_start + 0x00000000;
D_808CC254 = ovl_En_Minideath_bss_start + 0x00000004;
D_808CC258 = ovl_En_Minideath_bss_start + 0x00000008;
D_808CC25C = ovl_En_Minideath_bss_start + 0x0000000C;
D_808D8760 = 0x808D8760;
D_808D8780 = 0x808D8780;
D_808DE5B0 = ovl_Object_Kankyo_bss_start + 0x00000000;
D_809101B0 = ovl_En_Fishing_bss_start + 0x00000000;
D_809101B4 = ovl_En_Fishing_bss_start + 0x00000004;
D_809101B8 = ovl_En_Fishing_bss_start + 0x00000008;
D_809101BC = ovl_En_Fishing_bss_start + 0x0000000C;
D_809101C0 = ovl_En_Fishing_bss_start + 0x00000010;
D_809101C4 = ovl_En_Fishing_bss_start + 0x00000014;
D_809101C8 = ovl_En_Fishing_bss_start + 0x00000018;
D_809101CC = ovl_En_Fishing_bss_start + 0x0000001C;
D_809101D0 = ovl_En_Fishing_bss_start + 0x00000020;
D_809101D8 = ovl_En_Fishing_bss_start + 0x00000028;
D_809101E8 = ovl_En_Fishing_bss_start + 0x00000038;
D_80910B3C = ovl_En_Fishing_bss_start + 0x0000098C;
D_80910B40 = ovl_En_Fishing_bss_start + 0x00000990;
D_80910B44 = ovl_En_Fishing_bss_start + 0x00000994;
D_80910B48 = ovl_En_Fishing_bss_start + 0x00000998;
D_809114A8 = ovl_En_Fishing_bss_start + 0x000012F8;
D_80911E08 = ovl_En_Fishing_bss_start + 0x00001C58;
D_80911E14 = ovl_En_Fishing_bss_start + 0x00001C64;
D_80911E20 = ovl_En_Fishing_bss_start + 0x00001C70;
D_80911E28 = ovl_En_Fishing_bss_start + 0x00001C78;
D_80911E30 = ovl_En_Fishing_bss_start + 0x00001C80;
D_80911E3C = ovl_En_Fishing_bss_start + 0x00001C8C;
D_80911F20 = ovl_En_Fishing_bss_start + 0x00001D70;
D_80911F24 = ovl_En_Fishing_bss_start + 0x00001D74;
D_80911F28 = ovl_En_Fishing_bss_start + 0x00001D78;
D_80911F2C = ovl_En_Fishing_bss_start + 0x00001D7C;
D_80911F30 = ovl_En_Fishing_bss_start + 0x00001D80;
D_80911F38 = ovl_En_Fishing_bss_start + 0x00001D88;
D_80911F3C = ovl_En_Fishing_bss_start + 0x00001D8C;
D_80911F40 = ovl_En_Fishing_bss_start + 0x00001D90;
D_80911F44 = ovl_En_Fishing_bss_start + 0x00001D94;
D_80911F48 = ovl_En_Fishing_bss_start + 0x00001D98;
D_80911F4C = ovl_En_Fishing_bss_start + 0x00001D9C;
D_80911F50 = ovl_En_Fishing_bss_start + 0x00001DA0;
D_80911F58 = ovl_En_Fishing_bss_start + 0x00001DA8;
D_80911F64 = ovl_En_Fishing_bss_start + 0x00001DB4;
D_80911F68 = ovl_En_Fishing_bss_start + 0x00001DB8;
D_80911F6C = ovl_En_Fishing_bss_start + 0x00001DBC;
D_80911F70 = ovl_En_Fishing_bss_start + 0x00001DC0;
D_80911F78 = ovl_En_Fishing_bss_start + 0x00001DC8;
D_80914048 = ovl_En_Fishing_bss_start + 0x00003E98;
D_80915128 = ovl_En_Fishing_bss_start + 0x00004F78;
D_8091512C = ovl_En_Fishing_bss_start + 0x00004F7C;
D_80915130 = ovl_En_Fishing_bss_start + 0x00004F80;
D_80915138 = ovl_En_Fishing_bss_start + 0x00004F88;
D_809171B8 = ovl_En_Fishing_bss_start + 0x00007008;
D_809171C4 = ovl_En_Fishing_bss_start + 0x00007014;
D_809171C8 = ovl_En_Fishing_bss_start + 0x00007018;
D_809171C9 = ovl_En_Fishing_bss_start + 0x00007019;
D_809171CA = ovl_En_Fishing_bss_start + 0x0000701A;
D_809171CB = ovl_En_Fishing_bss_start + 0x0000701B;
D_809171CC = ovl_En_Fishing_bss_start + 0x0000701C;
D_809171D0 = ovl_En_Fishing_bss_start + 0x00007020;
D_809171D1 = ovl_En_Fishing_bss_start + 0x00007021;
D_809171D2 = ovl_En_Fishing_bss_start + 0x00007022;
D_809171D4 = ovl_En_Fishing_bss_start + 0x00007024;
D_809171D6 = ovl_En_Fishing_bss_start + 0x00007026;
D_809171D8 = ovl_En_Fishing_bss_start + 0x00007028;
D_809171DA = ovl_En_Fishing_bss_start + 0x0000702A;
D_809171DC = ovl_En_Fishing_bss_start + 0x0000702C;
D_809171E0 = ovl_En_Fishing_bss_start + 0x00007030;
D_809171EC = ovl_En_Fishing_bss_start + 0x0000703C;
D_809171EE = ovl_En_Fishing_bss_start + 0x0000703E;
D_809171F0 = ovl_En_Fishing_bss_start + 0x00007040;
D_809171F2 = ovl_En_Fishing_bss_start + 0x00007042;
D_809171F4 = ovl_En_Fishing_bss_start + 0x00007044;
D_809171F6 = ovl_En_Fishing_bss_start + 0x00007046;
D_809171F8 = ovl_En_Fishing_bss_start + 0x00007048;
D_809171FC = ovl_En_Fishing_bss_start + 0x0000704C;
D_809171FE = ovl_En_Fishing_bss_start + 0x0000704E;
D_80917200 = ovl_En_Fishing_bss_start + 0x00007050;
D_80917202 = ovl_En_Fishing_bss_start + 0x00007052;
D_80917204 = ovl_En_Fishing_bss_start + 0x00007054;
D_80917206 = ovl_En_Fishing_bss_start + 0x00007056;
D_80917208 = ovl_En_Fishing_bss_start + 0x00007058;
D_8091720C = ovl_En_Fishing_bss_start + 0x0000705C;
D_80917210 = ovl_En_Fishing_bss_start + 0x00007060;
D_80917218 = ovl_En_Fishing_bss_start + 0x00007068;
D_80917228 = ovl_En_Fishing_bss_start + 0x00007078;
D_8091722C = ovl_En_Fishing_bss_start + 0x0000707C;
D_80917238 = ovl_En_Fishing_bss_start + 0x00007088;
D_8091723C = ovl_En_Fishing_bss_start + 0x0000708C;
D_80917248 = ovl_En_Fishing_bss_start + 0x00007098;
D_80917254 = ovl_En_Fishing_bss_start + 0x000070A4;
D_80917258 = ovl_En_Fishing_bss_start + 0x000070A8;
D_8091725C = ovl_En_Fishing_bss_start + 0x000070AC;
D_80917260 = ovl_En_Fishing_bss_start + 0x000070B0;
D_80917264 = ovl_En_Fishing_bss_start + 0x000070B4;
D_80917266 = ovl_En_Fishing_bss_start + 0x000070B6;
D_80917268 = ovl_En_Fishing_bss_start + 0x000070B8;
D_8091726C = ovl_En_Fishing_bss_start + 0x000070BC;
D_80917270 = ovl_En_Fishing_bss_start + 0x000070C0;
D_80917272 = ovl_En_Fishing_bss_start + 0x000070C2;
D_80917274 = ovl_En_Fishing_bss_start + 0x000070C4;
D_80917278 = ovl_En_Fishing_bss_start + 0x000070C8;
D_8091727C = ovl_En_Fishing_bss_start + 0x000070CC;
D_80936AD0 = ovl_En_Kusa_bss_start + 0x00000000;
D_80936AD8 = ovl_En_Kusa_bss_start + 0x00000008;
D_80936CD8 = ovl_En_Kusa_bss_start + 0x00000208;
@@ -777,6 +1028,13 @@ D_80936CDA = ovl_En_Kusa_bss_start + 0x0000020A;
D_80936CDC = ovl_En_Kusa_bss_start + 0x0000020C;
D_80936CDE = ovl_En_Kusa_bss_start + 0x0000020E;
D_80936CE0 = ovl_En_Kusa_bss_start + 0x00000210;
D_8093D3B0 = ovl_Obj_Switch_bss_start + 0x00000000;
D_80947EA0 = ovl_En_Sda_bss_start + 0x00000000;
D_8096F5D0 = ovl_Bg_F40_Swlift_bss_start + 0x00000000;
D_809AADA0 = ovl_Obj_Grass_bss_start + 0x00000000;
D_809AADB0 = ovl_Obj_Grass_bss_start + 0x00000010;
D_809AADC0 = ovl_Obj_Grass_bss_start + 0x00000020;
D_809AAE10 = ovl_Obj_Grass_bss_start + 0x00000070;
D_809BEFD0 = ovl_En_Knight_bss_start + 0x00000000;
D_809BEFD4 = ovl_En_Knight_bss_start + 0x00000004;
D_809BEFD8 = ovl_En_Knight_bss_start + 0x00000008;
@@ -801,6 +1059,7 @@ D_809D8A40 = ovl_Boss_01_bss_start + 0x00000030;
D_809D8A4C = ovl_Boss_01_bss_start + 0x0000003C;
D_809D8A50 = ovl_Boss_01_bss_start + 0x00000040;
D_809D8A54 = ovl_Boss_01_bss_start + 0x00000044;
D_809D8A58 = ovl_Boss_01_bss_start + 0x00000048;
D_809E0420 = ovl_Boss_02_bss_start + 0x00000000;
D_809E0421 = ovl_Boss_02_bss_start + 0x00000001;
D_809E0422 = ovl_Boss_02_bss_start + 0x00000002;
@@ -821,6 +1080,8 @@ D_809EC030 = ovl_Boss_03_bss_start + 0x000027F0;
D_809EC034 = ovl_Boss_03_bss_start + 0x000027F4;
D_809EC038 = ovl_Boss_03_bss_start + 0x000027F8;
D_809EC03C = ovl_Boss_03_bss_start + 0x000027FC;
D_809EE4D0 = ovl_Boss_04_bss_start + 0x00000000;
D_809F2110 = ovl_Boss_05_bss_start + 0x00000000;
D_809F4370 = ovl_Boss_06_bss_start + 0x00000000;
D_809F4970 = ovl_Boss_06_bss_start + 0x00000600;
D_809F4974 = ovl_Boss_06_bss_start + 0x00000604;
@@ -849,8 +1110,26 @@ D_80A1DA3A = ovl_Obj_Flowerpot_bss_start + 0x0000020A;
D_80A1DA3C = ovl_Obj_Flowerpot_bss_start + 0x0000020C;
D_80A1DA3E = ovl_Obj_Flowerpot_bss_start + 0x0000020E;
D_80A1DA40 = ovl_Obj_Flowerpot_bss_start + 0x00000210;
D_80A2BBF0 = ovl_Bg_Dblue_Movebg_bss_start + 0x00000000;
D_80A2BBF4 = ovl_Bg_Dblue_Movebg_bss_start + 0x00000004;
D_80A2BBF5 = ovl_Bg_Dblue_Movebg_bss_start + 0x00000005;
D_80A32200 = ovl_En_Slime_bss_start + 0x00000000;
D_80A41D20 = ovl_En_Test3_bss_start + 0x00000000;
D_80A41D24 = ovl_En_Test3_bss_start + 0x00000004;
D_80A41D28 = ovl_En_Test3_bss_start + 0x00000008;
D_80A41D40 = ovl_En_Test3_bss_start + 0x00000020;
D_80A41D44 = ovl_En_Test3_bss_start + 0x00000024;
D_80A41D48 = ovl_En_Test3_bss_start + 0x00000028;
D_80A41D50 = ovl_En_Test3_bss_start + 0x00000030;
D_80A41D5C = ovl_En_Test3_bss_start + 0x0000003C;
D_80A41D60 = ovl_En_Test3_bss_start + 0x00000040;
D_80A41D64 = ovl_En_Test3_bss_start + 0x00000044;
D_80A41D68 = ovl_En_Test3_bss_start + 0x00000048;
D_80A41D6C = ovl_En_Test3_bss_start + 0x0000004C;
D_80A434D0 = ovl_En_Test4_bss_start + 0x00000000;
D_80A434D4 = ovl_En_Test4_bss_start + 0x00000004;
D_80A44C70 = ovl_En_Bat_bss_start + 0x00000000;
D_80A44C74 = ovl_En_Bat_bss_start + 0x00000004;
D_80A5F1C0 = ovl_En_Kusa2_bss_start + 0x00000000;
D_80A60900 = ovl_En_Kusa2_bss_start + 0x00001740;
D_80A60908 = ovl_En_Kusa2_bss_start + 0x00001748;
@@ -863,14 +1142,26 @@ D_80A6E990 = ovl_En_Fall_bss_start + 0x00000000;
D_80A6E9B4 = ovl_En_Fall_bss_start + 0x00000024;
D_80A6E9D8 = ovl_En_Fall_bss_start + 0x00000048;
D_80A6F098 = ovl_En_Fall_bss_start + 0x00000708;
D_80A711B0 = ovl_Bg_Crace_Movebg_bss_start + 0x00000000;
D_80A849D0 = ovl_Obj_Mine_bss_start + 0x00000000;
D_80A94910 = ovl_En_Test6_bss_start + 0x00000000;
D_80A99E80 = ovl_En_Az_bss_start + 0x00000000;
D_80A99E8C = ovl_En_Az_bss_start + 0x0000000C;
D_80A99E90 = ovl_En_Az_bss_start + 0x00000010;
D_80A9DDC0 = ovl_Bg_Hakugin_Post_bss_start + 0x00000000;
D_80A9E028 = ovl_Bg_Hakugin_Post_bss_start + 0x00000268;
D_80A9E030 = ovl_Bg_Hakugin_Post_bss_start + 0x00000270;
D_80A9E2C8 = ovl_Bg_Hakugin_Post_bss_start + 0x00000508;
D_80A9F6A8 = ovl_Bg_Hakugin_Post_bss_start + 0x000018E8;
D_80A9F94C = ovl_Bg_Hakugin_Post_bss_start + 0x00001B8C;
D_80AAAE20 = ovl_Dm_Char01_bss_start + 0x00000000;
D_80AAAE22 = ovl_Dm_Char01_bss_start + 0x00000002;
D_80AAAE24 = ovl_Dm_Char01_bss_start + 0x00000004;
D_80AAAE26 = ovl_Dm_Char01_bss_start + 0x00000006;
D_80AC1230 = ovl_En_Twig_bss_start + 0x00000000;
D_80AC1234 = ovl_En_Twig_bss_start + 0x00000004;
D_80AC1238 = ovl_En_Twig_bss_start + 0x00000008;
D_80AC5060 = ovl_Bg_Icefloe_bss_start + 0x00000000;
D_80ADA450 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000000;
D_80ADA458 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000008;
D_80ADA508 = ovl_Obj_Takaraya_Wall_bss_start + 0x000000B8;
@@ -882,7 +1173,15 @@ D_80ADA98C = ovl_Obj_Takaraya_Wall_bss_start + 0x0000053C;
D_80ADA9A4 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000554;
D_80ADAAC8 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000678;
D_80ADAACC = ovl_Obj_Takaraya_Wall_bss_start + 0x0000067C;
D_80ADAAE0 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000690;
D_80ADAAE8 = ovl_Obj_Takaraya_Wall_bss_start + 0x00000698;
D_80AF0050 = ovl_En_Tk_bss_start + 0x00000000;
D_80AF38B0 = ovl_En_Test7_bss_start + 0x00000000;
D_80AF38F0 = ovl_En_Test7_bss_start + 0x00000040;
D_80AF38F4 = ovl_En_Test7_bss_start + 0x00000044;
D_80AF38F8 = ovl_En_Test7_bss_start + 0x00000048;
D_80AF3900 = ovl_En_Test7_bss_start + 0x00000050;
D_80B16AF0 = ovl_Bg_Hakugin_Switch_bss_start + 0x00000000;
D_80B502A0 = ovl_En_Invadepoh_bss_start + 0x00000000;
D_80B502E0 = ovl_En_Invadepoh_bss_start + 0x00000040;
D_80B50320 = ovl_En_Invadepoh_bss_start + 0x00000080;
@@ -901,8 +1200,34 @@ D_80B50404 = ovl_En_Invadepoh_bss_start + 0x00000164;
D_80B50406 = ovl_En_Invadepoh_bss_start + 0x00000166;
D_80B5040A = ovl_En_Invadepoh_bss_start + 0x0000016A;
D_80B5040C = ovl_En_Invadepoh_bss_start + 0x0000016C;
D_80B5E880 = ovl_En_Ot_bss_start + 0x00000000;
D_80B5E884 = ovl_En_Ot_bss_start + 0x00000004;
D_80B5E888 = ovl_En_Ot_bss_start + 0x00000008;
D_80B83C70 = ovl_Bg_Dblue_Balance_bss_start + 0x00000000;
D_80B83C74 = ovl_Bg_Dblue_Balance_bss_start + 0x00000004;
D_80B95E10 = ovl_En_Zog_bss_start + 0x00000000;
D_80B9DED0 = ovl_Obj_Hunsui_bss_start + 0x00000000;
D_80B9DED4 = ovl_Obj_Hunsui_bss_start + 0x00000004;
D_80B9DED8 = ovl_Obj_Hunsui_bss_start + 0x00000008;
D_80B9DED9 = ovl_Obj_Hunsui_bss_start + 0x00000009;
D_80B9DEDA = ovl_Obj_Hunsui_bss_start + 0x0000000A;
D_80BA36B0 = ovl_Obj_Nozoki_bss_start + 0x00000000;
D_80BA36B4 = ovl_Obj_Nozoki_bss_start + 0x00000004;
D_80BA36B8 = ovl_Obj_Nozoki_bss_start + 0x00000008;
D_80BB8450 = ovl_En_Tanron2_bss_start + 0x00000000;
D_80BB8454 = ovl_En_Tanron2_bss_start + 0x00000004;
D_80BB8458 = ovl_En_Tanron2_bss_start + 0x00000008;
D_80BB845C = ovl_En_Tanron2_bss_start + 0x0000000C;
D_80BB8460 = ovl_En_Tanron2_bss_start + 0x00000010;
D_80BBAC90 = ovl_Obj_Chan_bss_start + 0x00000000;
D_80BC4F20 = ovl_Bg_F40_Switch_bss_start + 0x00000000;
D_80BCF1C0 = ovl_Eff_Kamejima_Wave_bss_start + 0x00000000;
D_80BCF1C1 = ovl_Eff_Kamejima_Wave_bss_start + 0x00000001;
D_80BCF1C4 = ovl_Eff_Kamejima_Wave_bss_start + 0x00000004;
D_80BECBD0 = ovl_Bg_Ikana_Dharma_bss_start + 0x00000000;
D_80BF5C10 = ovl_En_Rg_bss_start + 0x00000000;
D_80C13920 = ovl_En_Thiefbird_bss_start + 0x00000000;
D_80C1392C = ovl_En_Thiefbird_bss_start + 0x0000000C;
D_80C16470 = ovl_Obj_Yado_bss_start + 0x00000000;
D_80C1AD40 = ovl_En_Invadepoh_Demo_bss_start + 0x00000000;
D_80C1AD80 = ovl_En_Invadepoh_Demo_bss_start + 0x00000040;