summaryrefslogtreecommitdiff
path: root/arm9/src/filesystem.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-05-28 17:01:20 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-05-28 17:01:20 -0400
commit38350db4c7086a54c9f7f66a9adf1f79d09b1475 (patch)
treea4db9bfaa1c8b85b9c2a73df36415e88dc14aa84 /arm9/src/filesystem.c
parent8838a4a9ffdc3cbb42993300e436131281780cb8 (diff)
Decompile filesystem.s
Diffstat (limited to 'arm9/src/filesystem.c')
-rw-r--r--arm9/src/filesystem.c415
1 files changed, 415 insertions, 0 deletions
diff --git a/arm9/src/filesystem.c b/arm9/src/filesystem.c
new file mode 100644
index 00000000..c67b689d
--- /dev/null
+++ b/arm9/src/filesystem.c
@@ -0,0 +1,415 @@
+#include "global.h"
+#include "FS_file.h"
+
+void * FUN_02016998(u32 heap_id, u32 size);
+void * FUN_020169D8(u32 heap_id, u32 size);
+void FUN_02016A18(void * ptr);
+
+static char * UNK_021058A0[] = {
+ "battle/skill/waza_seq.narc",
+ "battle/skill/sub_seq.narc",
+ "poketool/personal/personal.narc",
+ "poketool/personal/growtbl.narc",
+ "poketool/pokegra/pokegra.narc",
+ "poketool/pokegra/height.narc",
+ "poketool/trgra/trbgra.narc",
+ "battle/graphic/batt_bg.narc",
+ "wazaeffect/we.arc",
+ "poketool/waza/waza_tbl.narc",
+ "fielddata/script/scr_seq_release.narc",
+ "msgdata/scenario/scr_msg.narc",
+ "graphic/poketch.narc",
+ "graphic/bag_gra.narc",
+ "graphic/font.narc",
+ "itemtool/itemdata/item_data.narc",
+ "itemtool/itemdata/item_icon.narc",
+ "graphic/tmap_gra.narc",
+ "graphic/box.narc",
+ "poketool/icongra/poke_icon.narc",
+ "graphic/plist_gra.narc",
+ "wazaeffect/effectclact/wechar.narc",
+ "wazaeffect/effectclact/wepltt.narc",
+ "wazaeffect/effectclact/wecell.narc",
+ "wazaeffect/effectclact/wecellanm.narc",
+ "graphic/imageclip.narc",
+ "msgdata/msg.narc",
+ "battle/graphic/batt_obj.narc",
+ "data/underg_radar.narc",
+ "wazaeffect/effectdata/waza_particle.narc",
+ "battle/skill/be_seq.narc",
+ "data/namein.narc",
+ "fielddata/eventdata/zone_event_release.narc",
+ "poketool/personal/wotbl.narc",
+ "poketool/personal/evo.narc",
+ "graphic/fontoam.narc",
+ "graphic/field_board.narc",
+ "fielddata/encountdata/d_enc_data.narc",
+ "graphic/winframe.narc",
+ "graphic/pst_gra.narc",
+ "fielddata/build_model/build_model.narc",
+ "fielddata/mapmatrix/map_matrix.narc",
+ "fielddata/areadata/area_data.narc",
+ "fielddata/areadata/area_build_model/area_build.narc",
+ "fielddata/areadata/area_map_tex/map_tex_set.narc",
+ "contest/graphic/contest_bg.narc",
+ "contest/graphic/contest_obj.narc",
+ "data/ugeffect_obj_graphic.narc",
+ "demo/title/titledemo.narc",
+ "fielddata/areadata/area_move_model/move_model_list.narc",
+ "data/ug_trap.narc",
+ "graphic/trainer_case.narc",
+ "data/ug_fossil.narc",
+ "graphic/ntag_gra.narc",
+ "data/tradelist.narc",
+ "data/ug_parts.narc",
+ "graphic/opening.narc",
+ "poketool/trainer/trdata.narc",
+ "poketool/trainer/trpoke.narc",
+ "poketool/trmsg/trtbl.narc",
+ "poketool/trgra/trfgra.narc",
+ "particledata/particledata.narc",
+ "graphic/shop_gra.narc",
+ "wazaeffect/we_sub.narc",
+ "data/ug_anim.narc",
+ "data/weather_sys.narc",
+ "graphic/menu_gra.narc",
+ "fielddata/land_data/land_data_release.narc",
+ "itemtool/itemdata/nuts_data.narc",
+ "resource/eng/zukan/zukan.narc",
+ "poketool/pokefoot/pokefoot.narc",
+ "fielddata/areadata/area_build_model/areabm_texset.narc",
+ "battle/graphic/b_plist_gra.narc",
+ "graphic/config_gra.narc",
+ "graphic/unionroom.narc",
+ "application/zukanlist/zkn_data/zukan_data.narc",
+ "graphic/pmsi.narc",
+ "battle/graphic/b_bag_gra.narc",
+ "graphic/oekaki.narc",
+ "graphic/mail_gra.narc",
+ "graphic/f_note_gra.narc",
+ "data/mmodel/mmodel.narc",
+ "graphic/ev_pokeselect.narc",
+ "graphic/poru_gra.narc",
+ "graphic/touch_subwindow.narc",
+ "graphic/fld_comact.narc",
+ "graphic/record.narc",
+ "graphic/porudemo.narc",
+ "graphic/poruact.narc",
+ "data/wifinote.narc",
+ "contest/data/contest_data.narc",
+ "application/custom_ball/data/cb_data.narc",
+ "data/wifip2pmatch.narc",
+ "graphic/demo_trade.narc",
+ "pokeanime/poke_anm.narc",
+ "graphic/mysign.narc",
+ "fielddata/mm_list/move_model_list.narc",
+ "data/field_cutin.narc",
+ "data/demo_climax.narc",
+ "wazaeffect/effectdata/ball_particle.narc",
+ "wazaeffect/pt_debug/debug_particle.narc",
+ "graphic/dendou_pc.narc",
+ "application/wifi_earth/wifi_earth_place.narc",
+ "battle/tr_ai/tr_ai_seq.narc",
+ "graphic/worldtrade.narc",
+ "graphic/dendou_demo.narc",
+ "arc/encdata_ex.narc",
+ "data/mmodel/fldeff.narc",
+ "battle/graphic/vs_demo_gra.narc",
+ "poketool/pokezukan.narc",
+ "arc/bm_anime.narc",
+ "arc/bm_anime_list.narc",
+ "graphic/field_encounteffect.narc",
+ "graphic/waza_oshie_gra.narc",
+ "poketool/pokeanm/pokeanm.narc",
+ "fielddata/pokemon_trade/fld_trade.narc",
+ "graphic/mystery.narc",
+ "poketool/pokegra/otherpoke.narc",
+ "demo/egg/data/egg_data.narc",
+ "demo/egg/data/particle/egg_demo_particle.narc",
+ "arc/ship_demo.narc",
+ "poketool/pokegra/height_o.narc",
+ "graphic/nutmixer.narc",
+ "graphic/btower.narc",
+ "demo/shinka/data/particle/shinka_demo_particle.narc",
+ "demo/intro/intro.narc",
+ "arc/tv.narc",
+ "graphic/ending.narc",
+ "demo/title/op_demo.narc",
+ "application/wifi_earth/wifi_earth.narc",
+ "graphic/ranking.narc",
+ "arc/ppark.narc",
+ "demo/syoujyou/syoujyou.narc",
+ "data/slot.narc",
+ "battle/b_tower/btdtr.narc",
+ "battle/b_tower/btdpm.narc",
+ "demo/intro/intro_tv.narc",
+ "poketool/trmsg/trtblofs.narc",
+ "poketool/pokegra/poke_yofs.narc",
+ "application/zukanlist/zkn_data/zukan_enc_diamond.narc",
+ "application/zukanlist/zkn_data/zukan_enc_pearl.narc",
+ "graphic/hiden_effect.narc",
+ "poketool/pokegra/poke_shadow.narc",
+ "fielddata/encountdata/p_enc_data.narc",
+ "poketool/pokegra/poke_shadow_ofx.narc",
+ "poketool/shinzukan.narc",
+};
+
+THUMB_FUNC void ReadNARCFile(void * dest, const char * path, s32 file_idx, u32 offset, u32 size)
+{
+ FSFile file;
+ register u32 chunk_starts[3];
+ u32 btnf_size = 0;
+ u32 chunk_size = 0;
+ u32 file_start = 0;
+ u32 file_end = 0;
+ u16 num_files = 0;
+
+ FS_InitFile(&file);
+ FS_OpenFile(&file, path);
+
+ FS_SeekFile(&file, 12, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 2);
+ chunk_starts[0] = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ FS_ReadFile(&file, &num_files, 2);
+ if (num_files <= file_idx)
+ ErrorHandling();
+ chunk_starts[1] = chunk_starts[0] + chunk_size;
+ FS_SeekFile(&file, chunk_starts[1] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ btnf_size = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 12 + 8 * file_idx, FS_SEEK_SET);
+ FS_ReadFile(&file, &file_start, 4);
+ FS_ReadFile(&file, &file_end, 4);
+ chunk_starts[2] = chunk_starts[1] + btnf_size;
+ FS_SeekFile(&file, chunk_starts[2] + 8 + file_start + offset, FS_SEEK_SET);
+ if (size == 0)
+ chunk_size = file_end - file_start;
+ else
+ chunk_size = size;
+ if (chunk_size == 0)
+ ErrorHandling();
+ FS_ReadFile(&file, dest, chunk_size);
+ FS_CloseFile(&file);
+}
+
+THUMB_FUNC void * LoadFileIntoMemory(const char * path, s32 file_idx, u32 heap_id, u32 offset, u32 size, BOOL r4)
+{
+ FSFile file;
+ register u32 chunk_starts[3];
+ u32 btnf_size = 0;
+ u32 chunk_size = 0;
+ u32 file_start = 0;
+ u32 file_end = 0;
+ u16 num_files = 0;
+ void * dest = NULL;
+
+ FS_InitFile(&file);
+ FS_OpenFile(&file, path);
+
+ FS_SeekFile(&file, 12, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 2);
+ chunk_starts[0] = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ FS_ReadFile(&file, &num_files, 2);
+ if (num_files <= file_idx)
+ ErrorHandling();
+ chunk_starts[1] = chunk_starts[0] + chunk_size;
+ FS_SeekFile(&file, chunk_starts[1] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ btnf_size = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 12 + 8 * file_idx, FS_SEEK_SET);
+ FS_ReadFile(&file, &file_start, 4);
+ FS_ReadFile(&file, &file_end, 4);
+ chunk_starts[2] = chunk_starts[1] + btnf_size;
+ FS_SeekFile(&file, chunk_starts[2] + 8 + file_start + offset, FS_SEEK_SET);
+ if (size == 0)
+ chunk_size = file_end - file_start;
+ else
+ chunk_size = size;
+ if (chunk_size == 0)
+ ErrorHandling();
+ switch (r4)
+ {
+ case 0:
+ dest = FUN_02016998(heap_id, chunk_size);
+ break;
+ default:
+ dest = FUN_020169D8(heap_id, chunk_size);
+ break;
+ }
+ FS_ReadFile(&file, dest, chunk_size);
+ FS_CloseFile(&file);
+ return dest;
+}
+
+THUMB_FUNC void LoadFromNARC(void * dest, s32 narc_id, s32 file_id)
+{
+ ReadNARCFile(dest, UNK_021058A0[narc_id], file_id, 0, 0);
+}
+
+THUMB_FUNC void * LoadFromNarc_2(s32 narc_id, s32 file_id, u32 heap_id)
+{
+ return LoadFileIntoMemory(UNK_021058A0[narc_id], file_id, heap_id, 0, 0, FALSE);
+}
+
+THUMB_FUNC void * FUN_02006528(s32 narc_id, s32 file_id, u32 heap_id)
+{
+ return LoadFileIntoMemory(UNK_021058A0[narc_id], file_id, heap_id, 0, 0, TRUE);
+}
+
+THUMB_FUNC void FUN_02006548(void * dest, s32 narc_id, s32 file_id, u32 offset, u32 size)
+{
+ ReadNARCFile(dest, UNK_021058A0[narc_id], file_id, offset, size);
+}
+
+THUMB_FUNC void * FUN_02006564(s32 narc_id, s32 file_id, u32 heap_id, u32 offset, u32 size)
+{
+ return LoadFileIntoMemory(UNK_021058A0[narc_id], file_id, heap_id, offset, size, FALSE);
+}
+
+THUMB_FUNC void * FUN_02006584(s32 narc_id, s32 file_id, u32 heap_id, u32 offset, u32 size)
+{
+ return LoadFileIntoMemory(UNK_021058A0[narc_id], file_id, heap_id, offset, size, TRUE);
+}
+
+THUMB_FUNC u32 LoadFromNARC_7(s32 narc_id, s32 file_idx)
+{
+ FSFile file;
+ register u32 chunk_starts[3];
+ u32 btnf_size = 0;
+ u32 chunk_size = 0;
+ u32 file_start = 0;
+ u32 file_end = 0;
+ u16 num_files = 0;
+
+ FS_InitFile(&file);
+ FS_OpenFile(&file, UNK_021058A0[narc_id]);
+
+ FS_SeekFile(&file, 12, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 2);
+ chunk_starts[0] = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ FS_ReadFile(&file, &num_files, 2);
+ if (num_files <= file_idx)
+ ErrorHandling();
+ chunk_starts[1] = chunk_starts[0] + chunk_size;
+ FS_SeekFile(&file, chunk_starts[1] + 4, FS_SEEK_SET);
+ FS_ReadFile(&file, &chunk_size, 4);
+ btnf_size = chunk_size;
+ FS_SeekFile(&file, chunk_starts[0] + 12 + 8 * file_idx, FS_SEEK_SET);
+ FS_ReadFile(&file, &file_start, 4);
+ FS_ReadFile(&file, &file_end, 4);
+ chunk_starts[2] = chunk_starts[1] + btnf_size;
+ FS_SeekFile(&file, chunk_starts[2] + 8 + file_start + 0, FS_SEEK_SET);
+ chunk_size = file_end - file_start;
+ if (chunk_size == 0)
+ ErrorHandling();
+ // Bug: File is never closed
+ return chunk_size;
+}
+
+struct NARC
+{
+ FSFile file;
+ u32 btaf_start;
+ u32 gmif_start;
+ u16 num_files;
+};
+
+THUMB_FUNC struct NARC * FUN_02006670(s32 narc_id, u32 heap_id)
+{
+ struct NARC * narc = (struct NARC *)FUN_02016998(heap_id, sizeof(struct NARC));
+ u32 btnf_start;
+ u32 chunk_size;
+ if (narc != NULL)
+ {
+ narc->btaf_start = 0;
+ FS_InitFile(&narc->file);
+ FS_OpenFile(&narc->file, UNK_021058A0[narc_id]);
+ FS_SeekFile(&narc->file, 12, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &narc->btaf_start, 2);
+ FS_SeekFile(&narc->file, narc->btaf_start + 4, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &chunk_size, 4);
+ FS_ReadFile(&narc->file, &narc->num_files, 2);
+ btnf_start = narc->btaf_start + chunk_size;
+ FS_SeekFile(&narc->file, btnf_start + 4, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &chunk_size, 4);
+ narc->gmif_start = btnf_start + chunk_size;
+ }
+ return narc;
+}
+
+THUMB_FUNC void FUN_020066F4(struct NARC * narc)
+{
+ FS_CloseFile(&narc->file);
+ FUN_02016A18(narc); // free to heap
+}
+
+THUMB_FUNC void * FUN_02006704(struct NARC * narc, u32 file_id, u32 heap_id)
+{
+ u32 file_start;
+ u32 file_end;
+ void * dest;
+ if (narc->num_files <= file_id)
+ ErrorHandling();
+ FS_SeekFile(&narc->file, narc->btaf_start + 12 + 8 * file_id, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &file_start, 4);
+ FS_ReadFile(&narc->file, &file_end, 4);
+ FS_SeekFile(&narc->file, narc->gmif_start + 8 + file_start, FS_SEEK_SET);
+ dest = FUN_02016998(heap_id, file_end - file_start);
+ if (dest != NULL)
+ {
+ FS_ReadFile(&narc->file, dest, file_end - file_start);
+ }
+ return dest;
+}
+
+THUMB_FUNC void FUN_02006774(struct NARC * narc, u32 file_id, void * dest)
+{
+ u32 file_start;
+ u32 file_end;
+ if (narc->num_files <= file_id)
+ ErrorHandling();
+ FS_SeekFile(&narc->file, narc->btaf_start + 12 + 8 * file_id, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &file_start, 4);
+ FS_ReadFile(&narc->file, &file_end, 4);
+ FS_SeekFile(&narc->file, narc->gmif_start + 8 + file_start, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, dest, file_end - file_start);
+}
+
+THUMB_FUNC u32 FUN_020067D0(struct NARC * narc, u32 file_id)
+{
+ u32 file_start;
+ u32 file_end;
+ if (narc->num_files <= file_id)
+ ErrorHandling();
+ FS_SeekFile(&narc->file, narc->btaf_start + 12 + 8 * file_id, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &file_start, 4);
+ FS_ReadFile(&narc->file, &file_end, 4);
+ return file_end - file_start;
+}
+
+THUMB_FUNC void FUN_02006814(struct NARC * narc, u32 file_id, u32 pos, u32 size, void * dest)
+{
+ u32 file_start;
+ if (narc->num_files <= file_id)
+ ErrorHandling();
+ FS_SeekFile(&narc->file, narc->btaf_start + 12 + 8 * file_id, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, &file_start, 4);
+ FS_SeekFile(&narc->file, narc->gmif_start + 8 + file_start + pos, FS_SEEK_SET);
+ FS_ReadFile(&narc->file, dest, size);
+}
+
+THUMB_FUNC void FUN_02006864(struct NARC * narc, u32 size, void * dest)
+{
+ FS_ReadFile(&narc->file, dest, size);
+}
+
+THUMB_FUNC u16 FUN_02006874(struct NARC * narc)
+{
+ return narc->num_files;
+}