Clean up armem.c

This commit is contained in:
gamemasterplc 2023-12-25 16:26:49 -06:00
parent 1afaccd0d2
commit 72c850b0fb
6 changed files with 232 additions and 238 deletions

View file

@ -3,19 +3,20 @@
#include "common.h" #include "common.h"
#include "game/memory.h" #include "game/memory.h"
#include "game/data.h"
void HuARInit(void); void HuARInit(void);
void *HuARMalloc(u32 arg0); u32 HuARMalloc(u32 size);
void HuARFree(void *arg0); void HuARFree(u32 amemptr);
void HuAMemDump(void); void HuAMemDump(void);
void *HuAR_DVDtoARAM(u32 arg0); u32 HuAR_DVDtoARAM(u32 dir);
void HuAR_MRAMtoARAM(s32 arg0); u32 HuAR_MRAMtoARAM(s32 dir);
void *HuAR_MRAMtoARAM2(void *arg0); u32 HuAR_MRAMtoARAM2(void *dir_ptr);
void HuAR_ARAMtoMRAM(void *dst); void HuAR_ARAMtoMRAM(u32 amemptr);
void *HuAR_ARAMtoMRAMNum(void *dst, s32 num); void *HuAR_ARAMtoMRAMNum(u32 amemptr, s32 num);
BOOL HuARDMACheck(void); s32 HuARDMACheck(void);
void *HuARDirCheck(u32 dir); u32 HuARDirCheck(u32 dir);
void HuARDirFree(u32 arg0); void HuARDirFree(u32 dir);
void *HuAR_ARAMtoMRAMFileRead(u32 arg0, u32 arg1, HeapID arg2); void *HuAR_ARAMtoMRAMFileRead(u32 dir, u32 num, HeapID heap);
#endif #endif

View file

@ -63,10 +63,5 @@ void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap);
void HuDecodeData(void *src, void *dst, u32 size, int decode_type); void HuDecodeData(void *src, void *dst, u32 size, int decode_type);
void *HuARDirCheck(u32 dir);
void HuAR_ARAMtoMRAM(void *dst);
void *HuAR_ARAMtoMRAMNum(void *dst, s32 num);
BOOL HuARDMACheck();
#endif #endif

View file

@ -1,7 +1,7 @@
#ifndef _GAME_PERF_H #ifndef _GAME_PERF_H
#define _GAME_PERF_H #define _GAME_PERF_H
#include "common.h" #include "dolphin.h"
void HuPerfInit(void); void HuPerfInit(void);
s32 HuPerfCreate(char *arg0, u8 arg1, u8 arg2, u8 arg3, u8 arg4); s32 HuPerfCreate(char *arg0, u8 arg1, u8 arg2, u8 arg3, u8 arg4);

View file

@ -1,36 +1,35 @@
#include "game/armem.h" #include "game/armem.h"
#include "game/data.h" #include "game/data.h"
typedef struct some_armem_struct0 { typedef struct armem_block {
/* 0x00 */ u8 unk00; /* 0x00 */ u8 flag;
/* 0x01 */ char unk01[1]; /* 0x02 */ u16 dir;
/* 0x02 */ u16 unk02; /* 0x04 */ u32 amemptr;
/* 0x04 */ void *unk04; /* 0x08 */ u32 size;
/* 0x08 */ u32 unk08; /* 0x0C */ struct armem_block *next;
/* 0x0C */ struct some_armem_struct0 *unk0C; } ARMemBlock; // Size 0x10
} SomeArmemStruct0; // Size 0x10
typedef struct { typedef struct ar_que_req {
/* 0x00 */ ARQRequest unk00; /* 0x00 */ ARQRequest req;
/* 0x20 */ s32 unk20; /* 0x20 */ s32 dir;
/* 0x24 */ void *unk24; /* 0x24 */ void *dst;
} SomeArmemStruct1; // Size 0x28 } ARQueReq; // Size 0x28
static void ArqCallBack(u32 pointerToARQRequest); static void ArqCallBack(u32 pointerToARQRequest);
static void ArqCallBackAM(u32 pointerToARQRequest); static void ArqCallBackAM(u32 pointerToARQRequest);
static void ArqCallBackAMFileRead(u32 pointerToARQRequest); static void ArqCallBackAMFileRead(u32 pointerToARQRequest);
static s32 ATTRIBUTE_ALIGN(32) preLoadBuf[16]; static s32 ATTRIBUTE_ALIGN(32) preLoadBuf[16];
static SomeArmemStruct1 ARQueBuf[16]; static ARQueReq ARQueBuf[16];
static ARQRequest arqReq; static ARQRequest arqReq;
static SomeArmemStruct0 ARInfo[64]; static ARMemBlock ARInfo[64];
static s32 ARBase; static s32 ARBase;
static s32 arqCnt; static s32 arqCnt;
static s16 arqIdx; static s16 arqIdx;
void HuARInit(void) { void HuARInit(void) {
s32 temp_r30; s32 size;
s16 i; s16 i;
if (!ARCheckInit()) { if (!ARCheckInit()) {
@ -38,185 +37,183 @@ void HuARInit(void) {
ARQInit(); ARQInit();
} }
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
ARInfo[i].unk04 = 0; ARInfo[i].amemptr = 0;
} }
temp_r30 = ARGetSize() - 0x808000; size = ARGetSize() - 0x808000;
ARBase = 0x808000; ARBase = 0x808000;
ARInfo[0].unk04 = (void*) ARBase; ARInfo[0].amemptr = ARBase;
ARInfo[0].unk08 = temp_r30; ARInfo[0].size = size;
ARInfo[0].unk00 = 0; ARInfo[0].flag = 0;
ARInfo[0].unk0C = &ARInfo[1]; ARInfo[0].next = &ARInfo[1];
ARInfo[0].unk02 = 0xFFFF; ARInfo[0].dir = 0xFFFF;
ARInfo[1].unk04 = (void*) -1; ARInfo[1].amemptr = -1;
ARInfo[1].unk08 = 0; ARInfo[1].size = 0;
ARInfo[1].unk00 = 1; ARInfo[1].flag = 1;
ARInfo[1].unk0C = 0; ARInfo[1].next = 0;
ARInfo[1].unk02 = 0xFFFF; ARInfo[1].dir = 0xFFFF;
arqCnt = 0; arqCnt = 0;
} }
void *HuARMalloc(u32 arg0) { u32 HuARMalloc(u32 size) {
SomeArmemStruct0 *var_r27; ARMemBlock *prev;
SomeArmemStruct0 *var_r30; ARMemBlock *next;
SomeArmemStruct0 *var_r31; ARMemBlock *curr;
s16 i; s16 i;
arg0 = (arg0 + 0x1F) & ~0x1F; size = OSRoundUp32B(size);
var_r31 = var_r27 = ARInfo; curr = prev = ARInfo;
while (var_r31->unk0C != 0) { while (curr->next != 0) {
if (var_r31->unk00 == 0 && var_r31->unk08 >= arg0) { if (curr->flag == 0 && curr->size >= size) {
break; break;
} }
var_r27 = var_r31; prev = curr;
var_r31 = var_r31->unk0C; curr = curr->next;
} }
if (var_r31->unk0C == 0) { if (curr->next == 0) {
OSReport("Can't ARAM Allocated %x\n", arg0); OSReport("Can't ARAM Allocated %x\n", size);
HuAMemDump(); HuAMemDump();
return 0; return 0;
} }
var_r31->unk00 = 1; curr->flag = 1;
if (var_r31->unk08 == arg0 && var_r27 != var_r31) { if (curr->size == size && prev != curr) {
var_r31->unk02 = 0xFFFF; curr->dir = 0xFFFF;
} else { } else {
var_r30 = &ARInfo[1]; next = &ARInfo[1];
for (i = 0; i < 63; i++, var_r30++) { for (i = 0; i < 63; i++, next++) {
if (var_r30->unk04 == 0) { if (!next->amemptr) {
break; break;
} }
} }
if (i == 63) { if (i == 63) {
OSReport("Can't ARAM Allocated %x\n", arg0); OSReport("Can't ARAM Allocated %x\n", size);
return 0; return 0;
} }
var_r30->unk0C = var_r31->unk0C; next->next = curr->next;
var_r31->unk0C = var_r30; curr->next = next;
var_r30->unk08 = var_r31->unk08 - arg0; next->size = curr->size - size;
var_r30->unk04 = (u8*) var_r31->unk04 + arg0; next->amemptr = curr->amemptr + size;
var_r31->unk08 = arg0; curr->size = size;
var_r31->unk02 = var_r30->unk02 = 0xFFFF; curr->dir = next->dir = 0xFFFF;
var_r30->unk00 = 0; next->flag = 0;
} }
return var_r31->unk04; return curr->amemptr;
} }
void HuARFree(void *arg0) { void HuARFree(u32 amemptr) {
SomeArmemStruct0 *var_r30; ARMemBlock *prev;
SomeArmemStruct0 *temp_r29; ARMemBlock *next;
SomeArmemStruct0 *var_r31; ARMemBlock *curr;
var_r31 = var_r30 = ARInfo; curr = prev = ARInfo;
while (var_r31->unk0C != 0) { while (curr->next) {
if (var_r31->unk04 == arg0) { if (curr->amemptr == amemptr) {
break; break;
} }
var_r30 = var_r31; prev = curr;
var_r31 = var_r31->unk0C; curr = curr->next;
} }
if (var_r31->unk00 != 0) { if (curr->flag != 0) {
if (var_r31->unk0C == 0 && var_r31->unk04 != arg0) { if (!curr->next && curr->amemptr != amemptr) {
OSReport("Can't ARAM Free %x\n", arg0); OSReport("Can't ARAM Free %x\n", amemptr);
return; return;
} }
temp_r29 = var_r31->unk0C; next = curr->next;
if (temp_r29->unk0C != 0 && temp_r29->unk00 == 0) { if (next->next && next->flag == 0) {
if (var_r31->unk04 > temp_r29->unk04) { if (curr->amemptr > next->amemptr) {
var_r31->unk04 = temp_r29->unk04; curr->amemptr = next->amemptr;
} }
var_r31->unk08 += temp_r29->unk08; curr->size += next->size;
var_r31->unk0C = temp_r29->unk0C; curr->next = next->next;
temp_r29->unk04 = 0; next->amemptr = 0;
} }
if (var_r30 != var_r31 && var_r30->unk0C != 0 && var_r30->unk00 == 0) { if (prev != curr && prev->next != 0 && prev->flag == 0) {
if (var_r30->unk04 > var_r31->unk04) { if (prev->amemptr > curr->amemptr) {
var_r30->unk04 = var_r31->unk04; prev->amemptr = curr->amemptr;
} }
var_r30->unk08 += var_r31->unk08; prev->size += curr->size;
var_r30->unk0C = var_r31->unk0C; prev->next = curr->next;
var_r31->unk04 = 0; curr->amemptr = 0;
} }
var_r31->unk00 = 0; curr->flag = 0;
var_r31->unk02 = 0xFFFF; curr->dir = 0xFFFF;
} }
} }
static char lbl_80130705[] = "Can't Find ARAM %x\n"; static u32 HuARSizeGet(u32 amemptr) {
ARMemBlock *curr;
ARMemBlock *prev;
static inline SomeArmemStruct0 *ArmemInlineFunc1(void *arg0) { curr = prev = ARInfo;
SomeArmemStruct0 *temp_var1; while (curr->next != 0) {
SomeArmemStruct0 *temp_var2; if (curr->amemptr == amemptr) {
temp_var1 = temp_var2 = ARInfo;
while (temp_var1->unk0C != 0) {
if (temp_var1->unk04 == arg0) {
break; break;
} }
temp_var2 = temp_var1; prev = curr;
temp_var1 = temp_var1->unk0C; curr = curr->next;
} }
if (temp_var1->unk0C == 0 && temp_var1->unk04 != arg0) { if (curr->next == 0 && curr->amemptr != amemptr) {
OSReport(lbl_80130705, arg0); OSReport("Can't Find ARAM %x\n", amemptr);
return NULL;
} else {
return temp_var1;
}
}
static inline u32 ArmemInlineFunc2(void *arg0) {
SomeArmemStruct0 *temp_var1;
SomeArmemStruct0 *temp_var2;
temp_var1 = temp_var2 = ARInfo;
while (temp_var1->unk0C != 0) {
if (temp_var1->unk04 == arg0) {
break;
}
temp_var2 = temp_var1;
temp_var1 = temp_var1->unk0C;
}
if (temp_var1->unk0C == 0 && temp_var1->unk04 != arg0) {
OSReport(lbl_80130705, arg0);
return 0; return 0;
} else { } else {
return temp_var1->unk08; return curr->size;
}
}
static ARMemBlock *HuARInfoGet(u32 amemptr) {
ARMemBlock *curr;
ARMemBlock *prev;
curr = prev = ARInfo;
while (curr->next != 0) {
if (curr->amemptr == amemptr) {
break;
}
prev = curr;
curr = curr->next;
}
if (curr->next == 0 && curr->amemptr != amemptr) {
OSReport("Can't Find ARAM %x\n", amemptr);
return NULL;
} else {
return curr;
} }
} }
void HuAMemDump(void) { void HuAMemDump(void) {
SomeArmemStruct0 *var_r31; ARMemBlock *curr;
OSReport("ARAM DUMP ======================\n"); OSReport("ARAM DUMP ======================\n");
OSReport("AMemPtr Stat Length\n"); OSReport("AMemPtr Stat Length\n");
for (var_r31 = ARInfo; var_r31->unk0C != 0; var_r31 = var_r31->unk0C) { for (curr = ARInfo; curr->next; curr = curr->next) {
OSReport("%08x:%04x,%08x,%08x\n", var_r31->unk04, var_r31->unk00, var_r31->unk08, var_r31->unk02); OSReport("%08x:%04x,%08x,%08x\n", curr->amemptr, curr->flag, curr->size, curr->dir);
} }
OSReport("%08x:%04x,%08x\n", var_r31->unk04, var_r31->unk00, var_r31->unk08); OSReport("%08x:%04x,%08x\n", curr->amemptr, curr->flag, curr->size);
OSReport("================================\n"); OSReport("================================\n");
} }
void *HuAR_DVDtoARAM(u32 arg0) { u32 HuAR_DVDtoARAM(u32 dir) {
DataReadStat *temp_r28; DataReadStat *stat;
SomeArmemStruct0 *var_r27; ARMemBlock *block;
void *temp_r3; u32 amemptr;
temp_r3 = HuARDirCheck(arg0); amemptr = HuARDirCheck(dir);
if (temp_r3 != 0) { if (amemptr) {
return temp_r3; return amemptr;
} }
temp_r28 = HuDataDirRead(arg0); stat = HuDataDirRead(dir);
DirDataSize = (DirDataSize + 0x1F) & ~0x1F; DirDataSize = OSRoundUp32B(DirDataSize);
temp_r3 = HuARMalloc(DirDataSize); amemptr = HuARMalloc(DirDataSize);
if (temp_r3 == 0) { if (!amemptr) {
return 0; return 0;
} }
var_r27 = ArmemInlineFunc1(temp_r3); block = HuARInfoGet(amemptr);
var_r27->unk02 = (arg0 >> 16); block->dir = (dir >> 16);
arqCnt++; arqCnt++;
ARQPostRequest(&arqReq, 0x1234, 0, 0, (u32) temp_r28->dir, (u32) temp_r3, DirDataSize, ArqCallBack); ARQPostRequest(&arqReq, 0x1234, 0, 0, (u32) stat->dir, amemptr, DirDataSize, ArqCallBack);
OSReport("ARAM Trans %x\n", temp_r3); OSReport("ARAM Trans %x\n", amemptr);
while (HuARDMACheck()); while (HuARDMACheck());
HuDataDirClose(arg0); HuDataDirClose(dir);
return temp_r3; return amemptr;
} }
static void ArqCallBack(u32 pointerToARQRequest) { static void ArqCallBack(u32 pointerToARQRequest) {
@ -224,151 +221,151 @@ static void ArqCallBack(u32 pointerToARQRequest) {
(void)pointerToARQRequest; // required to match (return?) (void)pointerToARQRequest; // required to match (return?)
} }
void HuAR_MRAMtoARAM(s32 arg0) { u32 HuAR_MRAMtoARAM(s32 dir) {
HuAR_MRAMtoARAM2(HuDataGetDirPtr(arg0)); return HuAR_MRAMtoARAM2(HuDataGetDirPtr(dir));
} }
void *HuAR_MRAMtoARAM2(void *arg0) { u32 HuAR_MRAMtoARAM2(void *dir_ptr) {
SomeArmemStruct0 *var_r27; ARMemBlock *block;
DataReadStat *temp_r3_3; DataReadStat *status;
u32 temp_r28; u32 size;
void *temp_r3; u32 amemptr;
temp_r3_3 = HuDataGetStatus(arg0); status = HuDataGetStatus(dir_ptr);
temp_r3 = HuARDirCheck(temp_r3_3->dir_id << 16); amemptr = HuARDirCheck(status->dir_id << 16);
if (temp_r3 != 0) { if (amemptr) {
return temp_r3; return amemptr;
} }
temp_r28 = HuMemMemorySizeGet(arg0); size = HuMemMemorySizeGet(dir_ptr);
temp_r28 = (temp_r28 + 0x1F) & ~0x1F; size = OSRoundUp32B(size);
temp_r3 = HuARMalloc(temp_r28); amemptr = HuARMalloc(size);
if (temp_r3 == 0) { if (!amemptr) {
return 0; return 0;
} }
var_r27 = ArmemInlineFunc1(temp_r3); block = HuARInfoGet(amemptr);
var_r27->unk02 = temp_r3_3->dir_id; block->dir = status->dir_id;
arqCnt++; arqCnt++;
ARQPostRequest(&arqReq, 0x1234, 0, 0, (u32) arg0, (u32) temp_r3, temp_r28, ArqCallBack); ARQPostRequest(&arqReq, 0x1234, 0, 0, (u32)dir_ptr, amemptr, size, ArqCallBack);
return temp_r3; return amemptr;
} }
void HuAR_ARAMtoMRAM(void *dst) { void HuAR_ARAMtoMRAM(u32 src) {
HuAR_ARAMtoMRAMNum(dst, 0); HuAR_ARAMtoMRAMNum(src, 0);
} }
void *HuAR_ARAMtoMRAMNum(void *dst, s32 num) { void *HuAR_ARAMtoMRAMNum(u32 src, s32 num) {
SomeArmemStruct0 *var_r25; ARMemBlock *block;
s32 var_r26; s32 size;
void *temp_r3; void *dst;
var_r25 = ArmemInlineFunc1(dst); block = HuARInfoGet(src);
if (HuDataReadChk(var_r25->unk02 << 16) >= 0) { if (HuDataReadChk(block->dir << 16) >= 0) {
return; return;
} }
var_r26 = ArmemInlineFunc2(dst); size = HuARSizeGet(src);
temp_r3 = HuMemDirectMallocNum(HEAP_DVD, var_r26, num); dst = HuMemDirectMallocNum(HEAP_DVD, size, num);
if (temp_r3 == 0) { if (!dst) {
return 0; return 0;
} }
DCFlushRangeNoSync(temp_r3, var_r26); DCFlushRangeNoSync(dst, size);
ARQueBuf[arqIdx].unk20 = (var_r25->unk02 << 16); ARQueBuf[arqIdx].dir = (block->dir << 16);
ARQueBuf[arqIdx].unk24 = temp_r3; ARQueBuf[arqIdx].dst = dst;
arqCnt++; arqCnt++;
PPCSync(); PPCSync();
ARQPostRequest(&ARQueBuf[arqIdx].unk00, 0x1234, 1, 0, (u32) dst, (u32) temp_r3, var_r26, ArqCallBackAM); ARQPostRequest(&ARQueBuf[arqIdx].req, 0x1234, 1, 0, src, (u32) dst, size, ArqCallBackAM);
arqIdx++; arqIdx++;
arqIdx &= 0xF; arqIdx &= 0xF;
return temp_r3; return dst;
} }
static void ArqCallBackAM(u32 pointerToARQRequest) { static void ArqCallBackAM(u32 pointerToARQRequest) {
SomeArmemStruct1 *sp8 = (SomeArmemStruct1*) pointerToARQRequest; ARQueReq *req_ptr = (ARQueReq*) pointerToARQRequest;
arqCnt--; arqCnt--;
HuDataDirSet(sp8->unk24, sp8->unk20); HuDataDirSet(req_ptr->dst, req_ptr->dir);
} }
BOOL HuARDMACheck(void) { s32 HuARDMACheck(void) {
return arqCnt; return arqCnt;
} }
void *HuARDirCheck(u32 dir) { u32 HuARDirCheck(u32 dir) {
SomeArmemStruct0 *var_r31; ARMemBlock *curr;
var_r31 = ARInfo; curr = ARInfo;
dir >>= 16; dir >>= 16;
while (var_r31->unk0C != 0) { while (curr->next != 0) {
if (var_r31->unk00 == 1 && var_r31->unk02 == dir) { if (curr->flag == 1 && curr->dir == dir) {
return var_r31->unk04; return curr->amemptr;
} }
var_r31 = var_r31->unk0C; curr = curr->next;
} }
return 0; return 0;
} }
void HuARDirFree(u32 arg0) { void HuARDirFree(u32 dir) {
SomeArmemStruct0 *var_r31; ARMemBlock *curr;
var_r31 = ARInfo; curr = ARInfo;
arg0 >>= 16; dir >>= 16;
while (var_r31->unk0C != 0) { while (curr->next != 0) {
if (var_r31->unk02 == arg0) { if (curr->dir == dir) {
HuARFree(var_r31->unk04); HuARFree(curr->amemptr);
break; break;
} }
var_r31 = var_r31->unk0C; curr = curr->next;
} }
} }
void *HuAR_ARAMtoMRAMFileRead(u32 arg0, u32 arg1, HeapID arg2) { void *HuAR_ARAMtoMRAMFileRead(u32 dir, u32 num, HeapID heap) {
s32 *temp_r29; s32 *dir_data;
void *temp_r3; void *dst;
void *temp_r3_2; void *dvd_data;
void *var_r20; u32 amem_src;
s32 temp_r24; s32 count;
s32 var_r22; s32 size;
u8 *var_r17; u32 amemptr;
if ((var_r17 = HuARDirCheck(arg0)) == 0) { if ((amemptr = HuARDirCheck(dir)) == 0) {
OSReport("Error: data none on ARAM %0x\n", arg0); OSReport("Error: data none on ARAM %0x\n", dir);
HuAMemDump(); HuAMemDump();
return 0; return 0;
} }
DCInvalidateRange(&preLoadBuf, sizeof(preLoadBuf)); DCInvalidateRange(&preLoadBuf, sizeof(preLoadBuf));
var_r20 = var_r17 + ((u32) (((u16) arg0 + 1) * 4) & 0xFFFFFFFE0); amem_src = amemptr + (u32)((u32)(((u16)dir + 1) * 4) & 0xFFFFFFFE0);
arqCnt++; arqCnt++;
ARQPostRequest(&ARQueBuf[arqIdx].unk00, 0x1234, 1, 0, (u32) var_r20, (u32) &preLoadBuf, sizeof(preLoadBuf), ArqCallBackAMFileRead); ARQPostRequest(&ARQueBuf[arqIdx].req, 0x1234, 1, 0, amem_src, (u32) &preLoadBuf, sizeof(preLoadBuf), ArqCallBackAMFileRead);
arqIdx++; arqIdx++;
arqIdx &= 0xF; arqIdx &= 0xF;
while (HuARDMACheck()); while (HuARDMACheck());
temp_r29 = &preLoadBuf[(arg0 + 1) & 7]; dir_data = &preLoadBuf[(dir + 1) & 7];
temp_r24 = temp_r29[0]; count = dir_data[0];
var_r20 = var_r17 + (temp_r24 & 0xFFFFFFFE0); amem_src = amemptr + (u32)(count & 0xFFFFFFFE0);
if (temp_r29[1] - temp_r24 < 0) { if (dir_data[1] - count < 0) {
var_r22 = (ArmemInlineFunc2(var_r17) - temp_r24 + 0x3F) & 0xFFFFFFFE0; size = (HuARSizeGet(amemptr) - count + 0x3F) & 0xFFFFFFFE0;
} else { } else {
var_r22 = (temp_r29[1] - temp_r24 + 0x3F) & 0xFFFFFFFE0; size = (dir_data[1] - count + 0x3F) & 0xFFFFFFFE0;
} }
temp_r3_2 = HuMemDirectMalloc(HEAP_DVD, var_r22); dvd_data = HuMemDirectMalloc(HEAP_DVD, size);
if (temp_r3_2 == 0) { if (!dvd_data) {
return 0; return 0;
} }
DCFlushRangeNoSync(temp_r3_2, var_r22); DCFlushRangeNoSync(dvd_data, size);
arqCnt++; arqCnt++;
PPCSync(); PPCSync();
ARQPostRequest(&ARQueBuf[arqIdx].unk00, 0x1234, 1, 0, (u32) var_r20, (u32) temp_r3_2, (u32) var_r22, ArqCallBackAMFileRead); ARQPostRequest(&ARQueBuf[arqIdx].req, 0x1234, 1, 0, amem_src, (u32) dvd_data, (u32) size, ArqCallBackAMFileRead);
arqIdx++; arqIdx++;
arqIdx &= 0xF; arqIdx &= 0xF;
while (HuARDMACheck()); while (HuARDMACheck());
temp_r29 = (s32*) ((u8*) temp_r3_2 + (temp_r24 & 0x1F)); dir_data = (s32*) ((u8*) dvd_data + (count & 0x1F));
temp_r3 = HuMemDirectMallocNum(arg2, (temp_r29[0] + 1) & ~1, arg1); dst = HuMemDirectMallocNum(heap, (dir_data[0] + 1) & ~1, num);
if (temp_r3 == 0) { if (!dst) {
return 0; return 0;
} }
HuDecodeData(&temp_r29[2], temp_r3, temp_r29[0], temp_r29[1]); HuDecodeData(&dir_data[2], dst, dir_data[0], dir_data[1]);
HuMemDirectFree(temp_r3_2); HuMemDirectFree(dvd_data);
return temp_r3; return dst;
} }
static void ArqCallBackAMFileRead(u32 pointerToARQRequest) { static void ArqCallBackAMFileRead(u32 pointerToARQRequest) {

View file

@ -1,5 +1,6 @@
#include "common.h" #include "common.h"
#include "game/data.h" #include "game/data.h"
#include "game/armem.h"
#include "dolphin/dvd.h" #include "dolphin/dvd.h"
#define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset))) #define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset)))
@ -108,7 +109,7 @@ DataReadStat *HuDataDirRead(s32 data_num)
} }
if((status = HuDataReadChk(data_num)) < 0) { if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram; u32 dir_aram;
if(dir_aram = HuARDirCheck(data_num)) { if(dir_aram = HuARDirCheck(data_num)) {
HuAR_ARAMtoMRAM(dir_aram); HuAR_ARAMtoMRAM(dir_aram);
while(HuARDMACheck()); while(HuARDMACheck());
@ -144,7 +145,7 @@ DataReadStat *HuDataDirReadNum(s32 data_num, s32 num)
} }
if((status = HuDataReadChk(data_num)) < 0) { if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram; u32 dir_aram;
if((dir_aram = HuARDirCheck(data_num))) { if((dir_aram = HuARDirCheck(data_num))) {
OSReport("ARAM data num %x\n", data_num); OSReport("ARAM data num %x\n", data_num);
HuAR_ARAMtoMRAMNum(dir_aram, num); HuAR_ARAMtoMRAMNum(dir_aram, num);
@ -220,7 +221,7 @@ s32 HuDataDirReadAsync(s32 data_num)
return -1; return -1;
} }
if((status = HuDataReadChk(data_num)) < 0) { if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram; u32 dir_aram;
if(dir_aram = HuARDirCheck(data_num)) { if(dir_aram = HuARDirCheck(data_num)) {
OSReport("ARAM data num %x\n", data_num); OSReport("ARAM data num %x\n", data_num);
HuAR_ARAMtoMRAM(dir_aram); HuAR_ARAMtoMRAM(dir_aram);

View file

@ -59,7 +59,7 @@ static s16 winMaxHeight;
static u8 mesWInsert[8]; static u8 mesWInsert[8];
static u8 winTabSize; static u8 winTabSize;
static u8 winInsertF; static u8 winInsertF;
static void *winAMemP; static u32 winAMemP;
static u8 *fontWidthP; static u8 *fontWidthP;
static s32 cancelCRF; static s32 cancelCRF;
static s16 mesCharCnt; static s16 mesCharCnt;