diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 09b967f2..9f0a0910 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -831,11 +831,11 @@ fn_80048F4C = .text:0x80048F4C; // type:function size:0x160 fn_800490AC = .text:0x800490AC; // type:function size:0x10 fn_800490BC = .text:0x800490BC; // type:function size:0x2C fn_800490E8 = .text:0x800490E8; // type:function size:0x140 -fn_80049228 = .text:0x80049228; // type:function size:0x2C -fn_80049254 = .text:0x80049254; // type:function size:0x1F0 +HuAR_ARAMtoMRAM = .text:0x80049228; // type:function size:0x2C +HuAR_ARAMtoMRAMNum = .text:0x80049254; // type:function size:0x1F0 fn_80049444 = .text:0x80049444; // type:function size:0x44 -fn_80049488 = .text:0x80049488; // type:function size:0x8 -fn_80049490 = .text:0x80049490; // type:function size:0x58 +HuARDMACheck = .text:0x80049488; // type:function size:0x8 +HuARDirCheck = .text:0x80049490; // type:function size:0x58 fn_800494E8 = .text:0x800494E8; // type:function size:0x68 fn_80049550 = .text:0x80049550; // type:function size:0x390 fn_800498E0 = .text:0x800498E0; // type:function size:0x10 @@ -2259,7 +2259,7 @@ fn_800BD7CC = .text:0x800BD7CC; // type:function size:0x14 fn_800BD7E0 = .text:0x800BD7E0; // type:function size:0x18 __DVDLowSetWAType = .text:0x800BD7F8; // type:function size:0x44 scope:global __DVDFSInit = .text:0x800BD83C; // type:function size:0x38 scope:global -fn_800BD874 = .text:0x800BD874; // type:function size:0x2F4 +DVDConvertPathToEntrynum = .text:0x800BD874; // type:function size:0x2F4 DVDFastOpen = .text:0x800BDB68; // type:function size:0x74 DVDOpen = .text:0x800BDBDC; // type:function size:0xC8 DVDClose = .text:0x800BDCA4; // type:function size:0x24 @@ -2301,7 +2301,7 @@ fn_800BFC94 = .text:0x800BFC94; // type:function size:0xD0 DVDReadDiskID = .text:0x800BFD64; // type:function size:0xD4 scope:global DVDInquiryAsync = .text:0x800BFE38; // type:function size:0xD0 scope:global DVDReset = .text:0x800BFF08; // type:function size:0x44 scope:global -fn_800BFF4C = .text:0x800BFF4C; // type:function size:0x4C +DVDGetCommandBlockStatus = .text:0x800BFF4C; // type:function size:0x4C DVDGetDriveStatus = .text:0x800BFF98; // type:function size:0xAC scope:global fn_800C0044 = .text:0x800C0044; // type:function size:0x10 fn_800C0054 = .text:0x800C0054; // type:function size:0x270 @@ -4834,7 +4834,8 @@ lbl_8011F7B4 = .data:0x8011F7B4; // type:object size:0x10 DataDirStat = .data:0x8011F7C4; // type:object size:0x468 scope:local data:4byte lbl_8011FC2C = .data:0x8011FC2C; // type:object size:0x1D data:string lbl_8011FC49 = .data:0x8011FC49; // type:object size:0x1F data:string -lbl_8011FC68 = .data:0x8011FC68; // type:object size:0x3C +lbl_8011FC68 = .data:0x8011FC68; // type:object size:0x1D data:string +lbl_8011FC85 = .data:0x8011FC85; // type:object size:0x1F data:string lbl_8011FCA4 = .data:0x8011FCA4; // type:object size:0x1A data:string lbl_8011FCBE = .data:0x8011FCBE; // type:object size:0x122 lbl_8011FDE0 = .data:0x8011FDE0; // type:object size:0x20 @@ -5353,7 +5354,7 @@ lbl_80141FD0 = .data:0x80141FD0; // type:object size:0x20 lbl_80141FF0 = .data:0x80141FF0; // type:object size:0x800 padStatErrOld = .bss:0x80142800; // type:object size:0x10 rumbleData = .bss:0x80142810; // type:object size:0x30 -ReadDataStat = .bss:0x80142840; // type:object size:0x2E00 align:32 data:4byte +ReadDataStat = .bss:0x80142840; // type:object size:0x2E00 scope:local align:32 data:4byte TextBuffer = .bss:0x80145640; // type:object size:0x400 lbl_80145A40 = .bss:0x80145A40; // type:object size:0x40 HeapTbl = .bss:0x80145A80; // type:object size:0x14 scope:local diff --git a/configure.py b/configure.py index 7d18c190..6dae886c 100755 --- a/configure.py +++ b/configure.py @@ -232,7 +232,7 @@ config.libs = [ Object(NonMatching, "game/main.c"), Object(NonMatching, "game/pad.c"), Object(Matching, "game/dvd.c"), - Object(NonMatching, "game/data.c"), + Object(Matching, "game/data.c"), Object(Matching, "game/decode.c"), Object(NonMatching, "game/font.c"), Object(NonMatching, "game/jmp.c"), diff --git a/include/common_enums.h b/include/common_enums.h index 27a2129a..59090526 100644 --- a/include/common_enums.h +++ b/include/common_enums.h @@ -12,4 +12,23 @@ typedef enum { #undef OVL_DEFINE -#endif +#define DATADIR_DEFINE(name, path) name, + +typedef enum { + #include "datadir_table.h" + DATADIR_COUNT +} DataDirID; + +#undef DATADIR_DEFINE + + +typedef enum { + HEAP_SYSTEM, + HEAP_MUSIC, + HEAP_DATA, + HEAP_DVD, + HEAP_MISC, + HEAP_MAX +} HeapID; + +#endif \ No newline at end of file diff --git a/include/common_structs.h b/include/common_structs.h index 81bf2467..93a8bd42 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -66,7 +66,7 @@ typedef struct file_list_entry { typedef struct data_stat { s32 dir_id; void *dir; - void *data; + void *file; u32 raw_len; u32 comp_type; BOOL used; diff --git a/include/datadir_table.h b/include/datadir_table.h new file mode 100644 index 00000000..b2cb103a --- /dev/null +++ b/include/datadir_table.h @@ -0,0 +1,140 @@ +DATADIR_DEFINE(DATADIR_E3SETUP, "data/E3setup.bin") +DATADIR_DEFINE(DATADIR_BBATTLE, "data/bbattle.bin") +DATADIR_DEFINE(DATADIR_BGUEST, "data/bguest.bin") +DATADIR_DEFINE(DATADIR_BKOOPA, "data/bkoopa.bin") +DATADIR_DEFINE(DATADIR_BKOOPASUIT, "data/bkoopasuit.bin") +DATADIR_DEFINE(DATADIR_BKUJIYA, "data/bkujiya.bin") +DATADIR_DEFINE(DATADIR_BLAST5, "data/blast5.bin") +DATADIR_DEFINE(DATADIR_BOARD, "data/board.bin") +DATADIR_DEFINE(DATADIR_BPAUSE, "data/bpause.bin") +DATADIR_DEFINE(DATADIR_BYOKODORI, "data/byokodori.bin") +DATADIR_DEFINE(DATADIR_DAISY, "data/daisy.bin") +DATADIR_DEFINE(DATADIR_DAISYMDL0, "data/daisymdl0.bin") +DATADIR_DEFINE(DATADIR_DAISYMDL1, "data/daisymdl1.bin") +DATADIR_DEFINE(DATADIR_DAISYMOT, "data/daisymot.bin") +DATADIR_DEFINE(DATADIR_DONKEY, "data/donkey.bin") +DATADIR_DEFINE(DATADIR_DONKEYMDL0, "data/donkeymdl0.bin") +DATADIR_DEFINE(DATADIR_DONKEYMDL1, "data/donkeymdl1.bin") +DATADIR_DEFINE(DATADIR_DONKEYMOT, "data/donkeymot.bin") +DATADIR_DEFINE(DATADIR_EFFECT, "data/effect.bin") +DATADIR_DEFINE(DATADIR_GAMEMES, "data/gamemes.bin") +DATADIR_DEFINE(DATADIR_INST, "data/inst.bin") +DATADIR_DEFINE(DATADIR_INSTFONT, "data/instfont.bin") +DATADIR_DEFINE(DATADIR_INSTPIC, "data/instpic.bin") +DATADIR_DEFINE(DATADIR_LUIGI, "data/luigi.bin") +DATADIR_DEFINE(DATADIR_LUIGIMDL0, "data/luigimdl0.bin") +DATADIR_DEFINE(DATADIR_LUIGIMDL1, "data/luigimdl1.bin") +DATADIR_DEFINE(DATADIR_LUIGIMOT, "data/luigimot.bin") +DATADIR_DEFINE(DATADIR_M300, "data/m300.bin") +DATADIR_DEFINE(DATADIR_M302, "data/m302.bin") +DATADIR_DEFINE(DATADIR_M303, "data/m303.bin") +DATADIR_DEFINE(DATADIR_M330, "data/m330.bin") +DATADIR_DEFINE(DATADIR_M333, "data/m333.bin") +DATADIR_DEFINE(DATADIR_M401, "data/m401.bin") +DATADIR_DEFINE(DATADIR_M402, "data/m402.bin") +DATADIR_DEFINE(DATADIR_M403, "data/m403.bin") +DATADIR_DEFINE(DATADIR_M404, "data/m404.bin") +DATADIR_DEFINE(DATADIR_M405, "data/m405.bin") +DATADIR_DEFINE(DATADIR_M406, "data/m406.bin") +DATADIR_DEFINE(DATADIR_M407, "data/m407.bin") +DATADIR_DEFINE(DATADIR_M408, "data/m408.bin") +DATADIR_DEFINE(DATADIR_M409, "data/m409.bin") +DATADIR_DEFINE(DATADIR_M410, "data/m410.bin") +DATADIR_DEFINE(DATADIR_M411, "data/m411.bin") +DATADIR_DEFINE(DATADIR_M412, "data/m412.bin") +DATADIR_DEFINE(DATADIR_M413, "data/m413.bin") +DATADIR_DEFINE(DATADIR_M414, "data/m414.bin") +DATADIR_DEFINE(DATADIR_M415, "data/m415.bin") +DATADIR_DEFINE(DATADIR_M416, "data/m416.bin") +DATADIR_DEFINE(DATADIR_M417, "data/m417.bin") +DATADIR_DEFINE(DATADIR_M418, "data/m418.bin") +DATADIR_DEFINE(DATADIR_M419, "data/m419.bin") +DATADIR_DEFINE(DATADIR_M420, "data/m420.bin") +DATADIR_DEFINE(DATADIR_M421, "data/m421.bin") +DATADIR_DEFINE(DATADIR_M422, "data/m422.bin") +DATADIR_DEFINE(DATADIR_M423, "data/m423.bin") +DATADIR_DEFINE(DATADIR_M424, "data/m424.bin") +DATADIR_DEFINE(DATADIR_M425, "data/m425.bin") +DATADIR_DEFINE(DATADIR_M426, "data/m426.bin") +DATADIR_DEFINE(DATADIR_M427, "data/m427.bin") +DATADIR_DEFINE(DATADIR_M428, "data/m428.bin") +DATADIR_DEFINE(DATADIR_M429, "data/m429.bin") +DATADIR_DEFINE(DATADIR_M430, "data/m430.bin") +DATADIR_DEFINE(DATADIR_M431, "data/m431.bin") +DATADIR_DEFINE(DATADIR_M432, "data/m432.bin") +DATADIR_DEFINE(DATADIR_M433, "data/m433.bin") +DATADIR_DEFINE(DATADIR_M434, "data/m434.bin") +DATADIR_DEFINE(DATADIR_M435, "data/m435.bin") +DATADIR_DEFINE(DATADIR_M436, "data/m436.bin") +DATADIR_DEFINE(DATADIR_M437, "data/m437.bin") +DATADIR_DEFINE(DATADIR_M438, "data/m438.bin") +DATADIR_DEFINE(DATADIR_M439, "data/m439.bin") +DATADIR_DEFINE(DATADIR_M440, "data/m440.bin") +DATADIR_DEFINE(DATADIR_M441, "data/m441.bin") +DATADIR_DEFINE(DATADIR_M442, "data/m442.bin") +DATADIR_DEFINE(DATADIR_M443, "data/m443.bin") +DATADIR_DEFINE(DATADIR_M444, "data/m444.bin") +DATADIR_DEFINE(DATADIR_M445, "data/m445.bin") +DATADIR_DEFINE(DATADIR_M446, "data/m446.bin") +DATADIR_DEFINE(DATADIR_M447, "data/m447.bin") +DATADIR_DEFINE(DATADIR_M448, "data/m448.bin") +DATADIR_DEFINE(DATADIR_M449, "data/m449.bin") +DATADIR_DEFINE(DATADIR_M450, "data/m450.bin") +DATADIR_DEFINE(DATADIR_M451, "data/m451.bin") +DATADIR_DEFINE(DATADIR_M453, "data/m453.bin") +DATADIR_DEFINE(DATADIR_M455, "data/m455.bin") +DATADIR_DEFINE(DATADIR_M456, "data/m456.bin") +DATADIR_DEFINE(DATADIR_M457, "data/m457.bin") +DATADIR_DEFINE(DATADIR_M458, "data/m458.bin") +DATADIR_DEFINE(DATADIR_M459, "data/m459.bin") +DATADIR_DEFINE(DATADIR_M460, "data/m460.bin") +DATADIR_DEFINE(DATADIR_M461, "data/m461.bin") +DATADIR_DEFINE(DATADIR_M462, "data/m462.bin") +DATADIR_DEFINE(DATADIR_MARIO, "data/mario.bin") +DATADIR_DEFINE(DATADIR_MARIOMDL0, "data/mariomdl0.bin") +DATADIR_DEFINE(DATADIR_MARIOMDL1, "data/mariomdl1.bin") +DATADIR_DEFINE(DATADIR_MARIOMOT, "data/mariomot.bin") +DATADIR_DEFINE(DATADIR_MENT, "data/ment.bin") +DATADIR_DEFINE(DATADIR_MGCONST, "data/mgconst.bin") +DATADIR_DEFINE(DATADIR_MGMODE, "data/mgmode.bin") +DATADIR_DEFINE(DATADIR_MODESEL, "data/modesel.bin") +DATADIR_DEFINE(DATADIR_MPEX, "data/mpex.bin") +DATADIR_DEFINE(DATADIR_MSTORY, "data/mstory.bin") +DATADIR_DEFINE(DATADIR_MSTORY2, "data/mstory2.bin") +DATADIR_DEFINE(DATADIR_MSTORY3, "data/mstory3.bin") +DATADIR_DEFINE(DATADIR_MSTORY4, "data/mstory4.bin") +DATADIR_DEFINE(DATADIR_OPTION, "data/option.bin") +DATADIR_DEFINE(DATADIR_PEACH, "data/peach.bin") +DATADIR_DEFINE(DATADIR_PEACHMDL0, "data/peachmdl0.bin") +DATADIR_DEFINE(DATADIR_PEACHMDL1, "data/peachmdl1.bin") +DATADIR_DEFINE(DATADIR_PEACHMOT, "data/peachmot.bin") +DATADIR_DEFINE(DATADIR_PRESENT, "data/present.bin") +DATADIR_DEFINE(DATADIR_RESULT, "data/result.bin") +DATADIR_DEFINE(DATADIR_SAF, "data/saf.bin") +DATADIR_DEFINE(DATADIR_SELMENU, "data/selmenu.bin") +DATADIR_DEFINE(DATADIR_SETUP, "data/setup.bin") +DATADIR_DEFINE(DATADIR_STAFF, "data/staff.bin") +DATADIR_DEFINE(DATADIR_TITLE, "data/title.bin") +DATADIR_DEFINE(DATADIR_W01, "data/w01.bin") +DATADIR_DEFINE(DATADIR_W02, "data/w02.bin") +DATADIR_DEFINE(DATADIR_W03, "data/w03.bin") +DATADIR_DEFINE(DATADIR_W04, "data/w04.bin") +DATADIR_DEFINE(DATADIR_W05, "data/w05.bin") +DATADIR_DEFINE(DATADIR_W06, "data/w06.bin") +DATADIR_DEFINE(DATADIR_W10, "data/w10.bin") +DATADIR_DEFINE(DATADIR_W20, "data/w20.bin") +DATADIR_DEFINE(DATADIR_W21, "data/w21.bin") +DATADIR_DEFINE(DATADIR_WALUIGI, "data/waluigi.bin") +DATADIR_DEFINE(DATADIR_WALUIGIMDL0, "data/waluigimdl0.bin") +DATADIR_DEFINE(DATADIR_WALUIGIMDL1, "data/waluigimdl1.bin") +DATADIR_DEFINE(DATADIR_WALUIGIMOT, "data/waluigimot.bin") +DATADIR_DEFINE(DATADIR_WARIO, "data/wario.bin") +DATADIR_DEFINE(DATADIR_WARIOMDL0, "data/wariomdl0.bin") +DATADIR_DEFINE(DATADIR_WARIOMDL1, "data/wariomdl1.bin") +DATADIR_DEFINE(DATADIR_WARIOMOT, "data/wariomot.bin") +DATADIR_DEFINE(DATADIR_WIN, "data/win.bin") +DATADIR_DEFINE(DATADIR_YOSHI, "data/yoshi.bin") +DATADIR_DEFINE(DATADIR_YOSHIMDL0, "data/yoshimdl0.bin") +DATADIR_DEFINE(DATADIR_YOSHIMDL1, "data/yoshimdl1.bin") +DATADIR_DEFINE(DATADIR_YOSHIMOT, "data/yoshimot.bin") +DATADIR_DEFINE(DATADIR_ZTAR, "data/ztar.bin") \ No newline at end of file diff --git a/include/functions.h b/include/functions.h index 08e015b3..d6345d97 100644 --- a/include/functions.h +++ b/include/functions.h @@ -21,18 +21,19 @@ void fn_80032A58(int arg0); void fn_80035A0C(void); void HuDecodeData(void *src, void *dst, u32 size, int decode_type); + void HuMemInitAll(void); void *HuMemInit(void *ptr, s32 size); void HuMemDCFlushAll(); -void HuMemDCFlush(int heap); -void *HuMemDirectMalloc(int heap, s32 size); -void *HuMemDirectMallocNum(int heap, s32 size, u32 num); +void HuMemDCFlush(HeapID heap); +void *HuMemDirectMalloc(HeapID heap, s32 size); +void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num); void HuMemDirectFree(void *ptr); -void HuMemDirectFreeNum(int heap, u32 num); -s32 HuMemUsedMallocSizeGet(int heap); -s32 HuMemUsedMallocBlockGet(int heap); -u32 HuMemHeapSizeGet(int heap); -void *HuMemHeapPtrGet(int heap); +void HuMemDirectFreeNum(HeapID heap, u32 num); +s32 HuMemUsedMallocSizeGet(HeapID heap); +s32 HuMemUsedMallocBlockGet(HeapID heap); +u32 HuMemHeapSizeGet(HeapID heap); +void *HuMemHeapPtrGet(HeapID heap); void *HuMemHeapInit(void *ptr, s32 size); void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr); @@ -76,4 +77,15 @@ s16 print8(s16 x, s16 y, float scale, char *str, ...); s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color); void pfDrawFonts(void); +void *HuDvdDataRead(char *path); +void **HuDvdDataReadMulti(char **paths); +void *HuDvdDataReadDirect(char *path, HeapID heap); +void *HuDvdDataFastRead(s32 entrynum); +void *HuDvdDataFastReadNum(s32 entrynum, s32 num); +void *HuDvdDataFastReadAsync(s32 entrynum, DataStat *stat); +void HuDvdDataClose(void *ptr); +void HuDvdErrorWatch(); + +void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo); + #endif diff --git a/src/game/data.c b/src/game/data.c new file mode 100644 index 00000000..3a27f95a --- /dev/null +++ b/src/game/data.c @@ -0,0 +1,552 @@ +#include "common.h" +#include "dolphin/dvd.h" + +#define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset))) +#define DATA_EFF_SIZE(size) (((size)+1) & ~0x1) + +extern void *HuARDirCheck(s32 dir); +extern void HuAR_ARAMtoMRAM(void *dst); +extern void HuAR_ARAMtoMRAMNum(void *dst, s32 num); +extern BOOL HuARDMACheck(); + +void HuDataDirClose(s32 data_num); +void **HuDataReadMultiSub(s32 *data_ids, BOOL use_num, s32 num); + +#define DATA_MAX_READSTAT 128 + +#define DATADIR_DEFINE(name, path) { path, -1 }, + +static FileListEntry DataDirStat[DATADIR_COUNT+1] = { + #include "datadir_table.h" + { NULL, -1 } +}; + +#undef DATADIR_DEFINE + +static u32 DataDirMax; +static DataStat ReadDataStat[DATA_MAX_READSTAT]; + +void HuDataInit() +{ + int i = 0; + FileListEntry *dir_stat = DataDirStat; + DataStat *read_stat; + while(dir_stat->name) { + if((dir_stat->file_id = DVDConvertPathToEntrynum(dir_stat->name)) == -1) { + OSReport("data.c: Data File Error(%s)\n", dir_stat->name); + OSPanic("data.c", 65, "\n"); + } + i++; + dir_stat++; + } + DataDirMax = i; + for(i=0, read_stat = ReadDataStat; idir_id = -1; + read_stat->used = FALSE; + read_stat->status = 0; + } +} + +static int HuDataStatusGet() +{ + int i; + for(i=0; i= DATA_MAX_READSTAT) { + i = -1; + } + return i; +} + +int HuDataReadChk(s32 data_num) +{ + int i; + data_num >>= 16; + for(i=0; i= DATA_MAX_READSTAT) { + i = -1; + } + return i; +} + +DataStat *HuDataGetStatus(void *dir_ptr) +{ + int i; + for(i=0; i DATA_MAX_READSTAT) { + return NULL; + } + return &ReadDataStat[i]; +} + +void *HuDataGetDirPtr(s32 data_num) +{ + int status = HuDataReadChk(data_num); + if(status < 0) { + return NULL; + } + return ReadDataStat[status].dir; +} + +DataStat *HuDataDirRead(s32 data_num) +{ + DataStat *status; + int status_id; + s32 dir_id; + dir_id = data_num >> 16; + if(DataDirMax <= dir_id) { + OSReport("data.c: Data Number Error(%d)\n", data_num); + return NULL; + } + + if((status_id = HuDataReadChk(data_num)) < 0) { + void *dir_aram; + if((dir_aram = HuARDirCheck(data_num))) { + HuAR_ARAMtoMRAM(dir_aram); + while(HuARDMACheck()); + status_id = HuDataReadChk(data_num); + status = &ReadDataStat[status_id]; + } else { + status_id = HuDataStatusGet(); + if(status_id == -1) { + OSReport("data.c: Data Work Max Error\n"); + return NULL; + } + status = &ReadDataStat[status_id]; + status->dir = HuDvdDataFastRead(DataDirStat[dir_id].file_id); + if(status->dir) { + status->dir_id = dir_id; + } + } + } else { + status = &ReadDataStat[status_id]; + } + return status; +} + +DataStat *HuDataDirReadNum(s32 data_num, s32 num) +{ + DataStat *status; + int status_id; + s32 dir_id; + dir_id = data_num >> 16; + if(DataDirMax <= dir_id) { + OSReport("data.c: Data Number Error(%d)\n", data_num); + return NULL; + } + + if((status_id = HuDataReadChk(data_num)) < 0) { + void *dir_aram; + if((dir_aram = HuARDirCheck(data_num))) { + OSReport("ARAM data num %x\n", data_num); + HuAR_ARAMtoMRAMNum(dir_aram, num); + while(HuARDMACheck()); + status_id = HuDataReadChk(data_num); + status = &ReadDataStat[status_id]; + status->used = TRUE; + status->num = num; + } else { + OSReport("data num %x\n", data_num); + status_id = HuDataStatusGet(); + if(status_id == -1) { + OSReport("data.c: Data Work Max Error\n"); + return NULL; + } + status = &ReadDataStat[status_id]; + status->dir = HuDvdDataFastReadNum(DataDirStat[dir_id].file_id, num); + if(status->dir) { + status->dir_id = dir_id; + status->used = TRUE; + status->num = num; + } + } + } else { + status = &ReadDataStat[status_id]; + } + return status; +} + +DataStat *HuDataDirSet(void *dir_ptr, s32 data_num) +{ + DataStat *status = HuDataGetStatus(dir_ptr); + int status_id; + if((status_id = HuDataReadChk(status->dir_id << 16)) >= 0) { + HuDataDirClose(data_num); + } + if((status_id = HuDataStatusGet()) == -1) { + OSReport("data.c: Data Work Max Error\n"); + return NULL; + } else { + status = &ReadDataStat[status_id]; + status->dir = dir_ptr; + status->dir_id = data_num >>16; + return status; + } +} + +void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo) +{ + DataStat *status; + int i; + for(i=0; istartAddr) { + break; + } + } + if(i >= DATA_MAX_READSTAT) { + OSPanic("data.c", 358, "dvd.c AsyncCallBack Error"); + } + status = &ReadDataStat[i]; + status->status = 0; + DVDClose(&status->file_info); +} + +s32 HuDataDirReadAsync(s32 data_num) +{ + DataStat *status; + int status_id; + s32 dir_id; + dir_id = data_num >> 16; + if(DataDirMax <= dir_id) { + OSReport("data.c: Data Number Error(%d)\n", data_num); + return -1; + } + if((status_id = HuDataReadChk(data_num)) < 0) { + void *dir_aram; + dir_aram = HuARDirCheck(data_num); + if(dir_aram) { + OSReport("ARAM data num %x\n", data_num); + HuAR_ARAMtoMRAM(dir_aram); + status_id = 0x10000; + } else { + status_id = HuDataStatusGet(); + if(status_id == -1) { + OSReport("data.c: Data Work Max Error\n"); + return -1; + } + status = &ReadDataStat[status_id]; + status->status = 1; + status->dir_id = dir_id; + status->dir = HuDvdDataFastReadAsync(DataDirStat[dir_id].file_id, status); + } + } else { + status_id = -1; + } + return status_id; +} + +s32 HuDataDirReadNumAsync(s32 data_num, s32 num) +{ + DataStat *status; + int status_id; + s32 dir_id; + dir_id = data_num >> 16; + if(DataDirMax <= dir_id) { + OSReport("data.c: Data Number Error(%d)\n", data_num); + return -1; + } + if((status_id = HuDataReadChk(data_num)) < 0) { + if((status_id = HuDataStatusGet()) == -1) { + OSReport("data.c: Data Work Max Error\n"); + return -1; + } + ReadDataStat[status_id].status = TRUE; + ReadDataStat[status_id].dir_id = dir_id; + status = &ReadDataStat[status_id]; + status->used = TRUE; + status->num = num; + status->dir = HuDvdDataFastReadAsync(DataDirStat[dir_id].file_id, status); + } else { + status_id = -1; + } + return status_id; +} + +BOOL HuDataGetAsyncStat(s32 status) +{ + if(status == 0x10000) { + return HuARDMACheck() == 0; + } else { + return ReadDataStat[status].status == 0; + } +} + +static void GetFileInfo(DataStat *status, s32 file_num) +{ + u32 *temp_ptr; + temp_ptr = (u32 *)PTR_OFFSET(status->dir, (file_num * 4))+1; + status->file = PTR_OFFSET(status->dir, *temp_ptr); + temp_ptr = status->file; + status->raw_len = *temp_ptr++; + status->comp_type = *temp_ptr++; + status->file = temp_ptr; +} + +void *HuDataRead(s32 data_num) +{ + DataStat *status; + int status_id; + void *buf; + if(!HuDataDirRead(data_num)) { + (void)data_num; + return NULL; + } + if((status_id = HuDataReadChk(data_num)) == -1) { + return NULL; + } + status = &ReadDataStat[status_id]; + GetFileInfo(status, data_num & 0xFFFF); + buf = HuMemDirectMalloc(0, DATA_EFF_SIZE(status->raw_len)); + if(buf) { + HuDecodeData(status->file, buf, status->raw_len, status->comp_type); + } + return buf; +} + +void *HuDataReadNum(s32 data_num, s32 num) +{ + DataStat *status; + int status_id; + void *buf; + if(!HuDataDirReadNum(data_num, num)) { + return NULL; + } + if((status_id = HuDataReadChk(data_num)) == -1) { + return NULL; + } + status = &ReadDataStat[status_id]; + GetFileInfo(status, data_num & 0xFFFF); + buf = HuMemDirectMallocNum(0, DATA_EFF_SIZE(status->raw_len), num); + if(buf) { + HuDecodeData(status->file, buf, status->raw_len, status->comp_type); + } + return buf; +} + +void *HuDataSelHeapRead(s32 data_num, HeapID heap) +{ + DataStat *status; + int status_id; + void *buf; + if(!HuDataDirRead(data_num)) { + return NULL; + } + if((status_id = HuDataReadChk(data_num)) == -1) { + return NULL; + } + status = &ReadDataStat[status_id]; + GetFileInfo(status, data_num & 0xFFFF); + switch(heap) { + case HEAP_MUSIC: + buf = HuMemDirectMalloc(HEAP_MUSIC, DATA_EFF_SIZE(status->raw_len)); + break; + + case HEAP_DATA: + buf = HuMemDirectMalloc(HEAP_DATA, DATA_EFF_SIZE(status->raw_len)); + break; + + case HEAP_DVD: + buf = HuMemDirectMalloc(HEAP_DVD, DATA_EFF_SIZE(status->raw_len)); + break; + + default: + buf = HuMemDirectMalloc(HEAP_SYSTEM, DATA_EFF_SIZE(status->raw_len)); + break; + } + if(buf) { + HuDecodeData(status->file, buf, status->raw_len, status->comp_type); + } + return buf; +} + +void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap) +{ + DataStat *status; + int status_id; + void *buf; + if(!HuDataDirReadNum(data_num, num)) { + return NULL; + } + if((status_id = HuDataReadChk(data_num)) == -1) { + return NULL; + } + status = &ReadDataStat[status_id]; + GetFileInfo(status, data_num & 0xFFFF); + switch(heap) { + case HEAP_MUSIC: + buf = HuMemDirectMalloc(HEAP_MUSIC, DATA_EFF_SIZE(status->raw_len)); + break; + + case HEAP_DATA: + buf = HuMemDirectMallocNum(HEAP_DATA, DATA_EFF_SIZE(status->raw_len), num); + break; + + case HEAP_DVD: + buf = HuMemDirectMallocNum(HEAP_DVD, DATA_EFF_SIZE(status->raw_len), num); + break; + + default: + buf = HuMemDirectMallocNum(HEAP_SYSTEM, DATA_EFF_SIZE(status->raw_len), num); + break; + } + if(buf) { + HuDecodeData(status->file, buf, status->raw_len, status->comp_type); + } + return buf; +} + +void **HuDataReadMulti(s32 *data_ids) +{ + return HuDataReadMultiSub(data_ids, FALSE, 0); +} + +void **HuDataReadMultiSub(s32 *data_ids, BOOL use_num, s32 num) +{ + s32 *dir_ids; + char **paths; + void **dir_ptrs; + void **out_ptrs; + int i, count, total_files; + u32 dir_id; + for(i=0, count=0; data_ids[i] != -1; i++) { + dir_id = data_ids[i] >> 16; + if(DataDirMax <= dir_id) { + OSReport("data.c: Data Number Error(%d)\n", data_ids[i]); + return NULL; + } + if(HuDataReadChk(data_ids[i]) < 0) { + count++; + } + } + total_files = i; + dir_ids = HuMemDirectMalloc(HEAP_SYSTEM, (count+1)*sizeof(s32)); + for(i=0; i> 16; + if(HuDataReadChk(data_ids[i]) < 0) { + int j; + for(j=0; dir_ids[j] != -1; j++) { + if(dir_ids[j] == dir_id){ + break; + } + } + if(dir_ids[j] == -1) { + dir_ids[j] = dir_id; + paths[count++] = DataDirStat[dir_id].name; + } + } + } + dir_ptrs = HuDvdDataReadMulti(paths); + for(i=0; dir_ids[i] != -1; i++) { + s32 status; + if((status = HuDataStatusGet()) == -1) { + OSReport("data.c: Data Work Max Error\n"); + (void)count; + HuMemDirectFree(paths); + HuMemDirectFree(dir_ids); + return NULL; + } else { + ReadDataStat[status].dir = dir_ptrs[i]; + ReadDataStat[status].dir_id = dir_ids[i]; + } + } + HuMemDirectFree(dir_ids); + HuMemDirectFree(paths); + HuMemDirectFree(dir_ptrs); + if(use_num) { + out_ptrs = HuMemDirectMallocNum(HEAP_SYSTEM, (total_files+1)*sizeof(void *), num); + } else { + out_ptrs = HuMemDirectMalloc(HEAP_SYSTEM, (total_files+1)*sizeof(void *)); + } + for(i=0; data_ids[i] != -1; i++) { + if(use_num) { + out_ptrs[i] = HuDataReadNum(data_ids[i], num); + } else { + out_ptrs[i] = HuDataRead(data_ids[i]); + } + } + out_ptrs[i] = NULL; + return out_ptrs; +} + +s32 HuDataGetSize(s32 data_num) +{ + DataStat *status; + int status_id; + if((status_id = HuDataReadChk(data_num)) == -1) { + return -1; + } + status = &ReadDataStat[status_id]; + GetFileInfo(status, data_num & 0xFFFF); + return DATA_EFF_SIZE(status->raw_len); +} + +void HuDataClose(void *ptr) +{ + if(ptr) { + HuMemDirectFree(ptr); + } +} + +void HuDataCloseMulti(void **ptrs) +{ + int i; + for(i=0; ptrs[i]; i++) { + void *ptr = ptrs[i]; + if(ptr) { + HuMemDirectFree(ptr); + } + } + if(ptrs) { + HuMemDirectFree(ptrs); + } +} + +void HuDataDirClose(s32 data_id) +{ + DataStat *status; + int i; + s32 dir_id = data_id >> 16; + for(i=0; i= DATA_MAX_READSTAT) { + return; + } + status = &ReadDataStat[i]; + if(status->status == 1) { + OSPanic("data.c", 812, "data.c: Async Close Error\n"); + } + status->dir_id = -1; + HuDvdDataClose(status->dir); + status->dir = NULL; + status->used = FALSE; + status->status = 0; +} + +void HuDataDirCloseNum(s32 num) +{ + DataStat *status; + int i; + for(i=0; ifile_info)) { OSPanic("dvd.c", 274, "dvd.c: File Open Error"); } else { - data = HuDvdDataReadWait(&stat->file_info, 3, 0, 0, HuDataDirReadAsyncCallBack, TRUE); + data = HuDvdDataReadWait(&stat->file_info, HEAP_DVD, 0, 0, HuDataDirReadAsyncCallBack, TRUE); } return data; } diff --git a/src/game/malloc.c b/src/game/malloc.c index 4dab78e4..d83df49d 100644 --- a/src/game/malloc.c +++ b/src/game/malloc.c @@ -1,8 +1,8 @@ #include "common.h" #include "dolphin/os.h" -static u32 HeapSizeTbl[5] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0 }; -static void *HeapTbl[5]; +static u32 HeapSizeTbl[HEAP_MAX] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0 }; +static void *HeapTbl[HEAP_MAX]; void HuMemInitAll(void) { @@ -39,12 +39,12 @@ void HuMemDCFlushAll() HuMemDCFlush(0); } -void HuMemDCFlush(int heap) +void HuMemDCFlush(HeapID heap) { DCFlushRangeNoSync(HeapTbl[heap], HeapSizeTbl[heap]); } -void *HuMemDirectMalloc(int heap, s32 size) +void *HuMemDirectMalloc(HeapID heap, s32 size) { register u32 retaddr; asm { @@ -54,7 +54,7 @@ void *HuMemDirectMalloc(int heap, s32 size) return HuMemMemoryAlloc(HeapTbl[heap], size, retaddr); } -void *HuMemDirectMallocNum(int heap, s32 size, u32 num) +void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num) { register u32 retaddr; asm { @@ -73,7 +73,7 @@ void HuMemDirectFree(void *ptr) HuMemMemoryFree(ptr, retaddr); } -void HuMemDirectFreeNum(int heap, u32 num) +void HuMemDirectFreeNum(HeapID heap, u32 num) { register u32 retaddr; asm { @@ -82,22 +82,22 @@ void HuMemDirectFreeNum(int heap, u32 num) HuMemMemoryFreeNum(HeapTbl[heap], num, retaddr); } -s32 HuMemUsedMallocSizeGet(int heap) +s32 HuMemUsedMallocSizeGet(HeapID heap) { return HuMemUsedMemorySizeGet(HeapTbl[heap]); } -s32 HuMemUsedMallocBlockGet(int heap) +s32 HuMemUsedMallocBlockGet(HeapID heap) { return HuMemUsedMemoryBlockGet(HeapTbl[heap]); } -u32 HuMemHeapSizeGet(int heap) +u32 HuMemHeapSizeGet(HeapID heap) { return HeapSizeTbl[heap]; } -void *HuMemHeapPtrGet(int heap) +void *HuMemHeapPtrGet(HeapID heap) { return HeapTbl[heap]; } \ No newline at end of file diff --git a/src/game/process.c b/src/game/process.c index ae05bf07..e765c3d9 100644 --- a/src/game/process.c +++ b/src/game/process.c @@ -71,7 +71,7 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process)) +HuMemMemoryAllocSizeGet(stack_size) +HuMemMemoryAllocSizeGet(extra_size); - if(!(heap = HuMemDirectMalloc(0, alloc_size))) { + if(!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) { OSReport("process> malloc error size %d\n", alloc_size); return NULL; }