mirror of
https://github.com/pret/pmd-red.git
synced 2026-09-15 04:25:54 -05:00
decompile some of file_system
This commit is contained in:
@@ -5,198 +5,6 @@
|
||||
|
||||
.text
|
||||
|
||||
thumb_func_start InitFileSystem
|
||||
InitFileSystem:
|
||||
push {r4,lr}
|
||||
ldr r3, _0800A8EC
|
||||
ldr r4, _0800A8F0
|
||||
movs r2, 0
|
||||
ldr r0, _0800A8F4
|
||||
movs r1, 0x3F
|
||||
_0800A8D0:
|
||||
str r2, [r0]
|
||||
str r2, [r0, 0x4]
|
||||
adds r0, 0x8
|
||||
subs r1, 0x1
|
||||
cmp r1, 0
|
||||
bge _0800A8D0
|
||||
movs r0, 0
|
||||
str r0, [r3]
|
||||
movs r0, 0x1
|
||||
str r0, [r4]
|
||||
pop {r4}
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_0800A8EC: .4byte gUnknown_203B094
|
||||
_0800A8F0: .4byte gUnknown_202D2A4
|
||||
_0800A8F4: .4byte gUnknown_202D2A8
|
||||
thumb_func_end InitFileSystem
|
||||
|
||||
thumb_func_start sub_800A8F8
|
||||
sub_800A8F8:
|
||||
ldr r1, _0800A904
|
||||
ldr r2, [r1]
|
||||
str r0, [r1]
|
||||
adds r0, r2, 0
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_0800A904: .4byte gUnknown_202D2A4
|
||||
thumb_func_end sub_800A8F8
|
||||
|
||||
thumb_func_start OpenFile
|
||||
OpenFile:
|
||||
push {r4-r7,lr}
|
||||
mov r7, r8
|
||||
push {r7}
|
||||
sub sp, 0x12C
|
||||
mov r8, r0
|
||||
adds r4, r1, 0
|
||||
ldr r1, _0800A93C
|
||||
adds r0, r4, 0
|
||||
bl strcmp
|
||||
cmp r0, 0
|
||||
beq _0800A922
|
||||
movs r0, 0x1
|
||||
_0800A922:
|
||||
movs r1, 0
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _0800A92C
|
||||
movs r1, 0x1
|
||||
_0800A92C:
|
||||
cmp r1, 0
|
||||
beq _0800A9B6
|
||||
ldr r7, [r4, 0xC]
|
||||
movs r6, 0
|
||||
ldr r0, [r4, 0x8]
|
||||
subs r5, r0, 0x1
|
||||
b _0800A94A
|
||||
.align 2, 0
|
||||
_0800A93C: .4byte gUnknown_80B9B94
|
||||
_0800A940:
|
||||
cmp r0, 0
|
||||
bge _0800A948
|
||||
adds r6, r4, 0x1
|
||||
b _0800A94A
|
||||
_0800A948:
|
||||
adds r5, r4, 0
|
||||
_0800A94A:
|
||||
cmp r6, r5
|
||||
bge _0800A968
|
||||
adds r0, r6, r5
|
||||
lsrs r1, r0, 31
|
||||
adds r0, r1
|
||||
asrs r4, r0, 1
|
||||
lsls r0, r4, 3
|
||||
adds r0, r7
|
||||
ldr r0, [r0]
|
||||
mov r1, r8
|
||||
bl strcmp
|
||||
cmp r0, 0
|
||||
bne _0800A940
|
||||
adds r6, r4, 0
|
||||
_0800A968:
|
||||
lsls r0, r6, 3
|
||||
adds r6, r7, r0
|
||||
ldr r0, [r6]
|
||||
mov r1, r8
|
||||
bl strcmp
|
||||
cmp r0, 0
|
||||
beq _0800A994
|
||||
ldr r1, _0800A984
|
||||
mov r0, sp
|
||||
mov r2, r8
|
||||
bl sprintf
|
||||
b _0800A9B6
|
||||
.align 2, 0
|
||||
_0800A984: .4byte gUnknown_80B9B9C
|
||||
_0800A988:
|
||||
str r6, [r2]
|
||||
adds r0, r7, 0x4
|
||||
adds r0, r3, r0
|
||||
str r1, [r0]
|
||||
adds r0, r2, 0
|
||||
b _0800A9B8
|
||||
_0800A994:
|
||||
ldr r0, _0800A9C4
|
||||
ldr r0, [r0]
|
||||
movs r4, 0
|
||||
ldr r5, _0800A9C8
|
||||
adds r7, r5, 0
|
||||
_0800A99E:
|
||||
adds r0, 0x1
|
||||
cmp r0, 0x3F
|
||||
ble _0800A9A6
|
||||
movs r0, 0
|
||||
_0800A9A6:
|
||||
lsls r3, r0, 3
|
||||
adds r2, r3, r5
|
||||
ldr r1, [r2]
|
||||
cmp r1, 0
|
||||
beq _0800A988
|
||||
adds r4, 0x1
|
||||
cmp r4, 0x3F
|
||||
ble _0800A99E
|
||||
_0800A9B6:
|
||||
movs r0, 0
|
||||
_0800A9B8:
|
||||
add sp, 0x12C
|
||||
pop {r3}
|
||||
mov r8, r3
|
||||
pop {r4-r7}
|
||||
pop {r1}
|
||||
bx r1
|
||||
.align 2, 0
|
||||
_0800A9C4: .4byte gUnknown_203B094
|
||||
_0800A9C8: .4byte gUnknown_202D2A8
|
||||
thumb_func_end OpenFile
|
||||
|
||||
thumb_func_start GetFileDataPtrFromFileEntry
|
||||
GetFileDataPtrFromFileEntry:
|
||||
ldr r1, [r0]
|
||||
ldr r1, [r1, 0x4]
|
||||
str r1, [r0, 0x4]
|
||||
adds r0, r1, 0
|
||||
bx lr
|
||||
thumb_func_end GetFileDataPtrFromFileEntry
|
||||
|
||||
thumb_func_start GetFileDataPtr
|
||||
GetFileDataPtr:
|
||||
push {r4,lr}
|
||||
adds r4, r0, 0
|
||||
bl GetFileDataPtrFromFileEntry
|
||||
adds r0, r4, 0
|
||||
bl GetSiroPtr
|
||||
pop {r4}
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end GetFileDataPtr
|
||||
|
||||
thumb_func_start OpenFileAndGetFileDataPtr
|
||||
OpenFileAndGetFileDataPtr:
|
||||
push {r4,lr}
|
||||
bl OpenFile
|
||||
adds r4, r0, 0
|
||||
cmp r4, 0
|
||||
beq _0800A9FE
|
||||
movs r1, 0
|
||||
bl GetFileDataPtr
|
||||
_0800A9FE:
|
||||
adds r0, r4, 0
|
||||
pop {r4}
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end OpenFileAndGetFileDataPtr
|
||||
|
||||
thumb_func_start Call_OpenFileAndGetFileDataPtr
|
||||
Call_OpenFileAndGetFileDataPtr:
|
||||
push {lr}
|
||||
bl OpenFileAndGetFileDataPtr
|
||||
pop {r1}
|
||||
bx r1
|
||||
thumb_func_end Call_OpenFileAndGetFileDataPtr
|
||||
|
||||
thumb_func_start CloseFile
|
||||
CloseFile:
|
||||
push {r4,r5,lr}
|
||||
|
||||
12012
data/data.s
12012
data/data.s
File diff suppressed because it is too large
Load Diff
12007
data/data_80B9BB8.s
Normal file
12007
data/data_80B9BB8.s
Normal file
File diff suppressed because it is too large
Load Diff
@@ -49,6 +49,7 @@ SECTIONS {
|
||||
src/random.o(.text);
|
||||
asm/text.o(.text);
|
||||
asm/code_8009804.o(.text);
|
||||
src/file_system.o(.text);
|
||||
asm/file_system.o(.text);
|
||||
asm/code_800AAA0.o(.text);
|
||||
src/main.o(.text);
|
||||
@@ -81,6 +82,8 @@ SECTIONS {
|
||||
ALIGN(4)
|
||||
{
|
||||
data/data.o(.rodata);
|
||||
src/file_system.o(.rodata);
|
||||
data/data_80B9BB8.o(.rodata);
|
||||
src/agb_flash.o(.rodata);
|
||||
src/agb_flash_1m.o(.rodata);
|
||||
src/agb_flash_mx.o(.rodata);
|
||||
|
||||
145
src/file_system.c
Normal file
145
src/file_system.c
Normal file
@@ -0,0 +1,145 @@
|
||||
#include "global.h"
|
||||
|
||||
struct File
|
||||
{
|
||||
char *name;
|
||||
u8 *data;
|
||||
};
|
||||
|
||||
struct OpenedFile
|
||||
{
|
||||
struct File *file;
|
||||
u8 *data;
|
||||
};
|
||||
|
||||
struct FileArchive
|
||||
{
|
||||
char magic[8];
|
||||
s32 count;
|
||||
struct File *entries;
|
||||
};
|
||||
|
||||
extern struct OpenedFile gUnknown_202D2A8[];
|
||||
|
||||
extern u32 gUnknown_203B094;
|
||||
extern u32 gUnknown_202D2A4;
|
||||
|
||||
extern int sprintf(char *, const char *, ...);
|
||||
|
||||
u8 *GetSiroPtr(struct OpenedFile *);
|
||||
|
||||
void InitFileSystem(void)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
gUnknown_202D2A8[i].file = NULL;
|
||||
gUnknown_202D2A8[i].data = NULL;
|
||||
}
|
||||
|
||||
gUnknown_203B094 = 0;
|
||||
gUnknown_202D2A4 = 1;
|
||||
}
|
||||
|
||||
u32 sub_800A8F8(u32 value)
|
||||
{
|
||||
u32 oldValue = gUnknown_202D2A4;
|
||||
gUnknown_202D2A4 = value;
|
||||
return oldValue;
|
||||
}
|
||||
|
||||
struct OpenedFile *OpenFile(char *filename, struct FileArchive *arc)
|
||||
{
|
||||
char buffer[0x12C];
|
||||
s32 left, right;
|
||||
s32 cursor;
|
||||
s32 i;
|
||||
s32 magic = 0;
|
||||
s32 magicFound;
|
||||
struct File *entries;
|
||||
struct File *file;
|
||||
|
||||
magic = strcmp(arc->magic, "pksdir0") != 0;
|
||||
|
||||
magicFound = 0;
|
||||
|
||||
if (!(u8)magic)
|
||||
magicFound = 1;
|
||||
|
||||
if (!magicFound)
|
||||
return NULL;
|
||||
|
||||
entries = arc->entries;
|
||||
left = 0;
|
||||
right = arc->count - 1;
|
||||
|
||||
while (left < right)
|
||||
{
|
||||
s32 mid = (left + right) / 2;
|
||||
int result = strcmp(entries[mid].name, filename);
|
||||
if (result == 0)
|
||||
{
|
||||
left = mid;
|
||||
break;
|
||||
}
|
||||
else if (result < 0)
|
||||
{
|
||||
left = mid + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
right = mid;
|
||||
}
|
||||
}
|
||||
|
||||
file = &entries[left];
|
||||
|
||||
if (strcmp(file->name, filename))
|
||||
{
|
||||
sprintf(buffer, "not find file [%s]\n", filename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cursor = gUnknown_203B094;
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
cursor++;
|
||||
if (cursor > 63)
|
||||
cursor = 0;
|
||||
if (!gUnknown_202D2A8[cursor].file)
|
||||
{
|
||||
gUnknown_202D2A8[cursor].file = file;
|
||||
gUnknown_202D2A8[cursor].data = NULL;
|
||||
return &gUnknown_202D2A8[cursor];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static u8 *_GetFileDataPtr(struct OpenedFile *openedFile)
|
||||
{
|
||||
openedFile->data = openedFile->file->data;
|
||||
return openedFile->data;
|
||||
}
|
||||
|
||||
u8 *GetFileDataPtr(struct OpenedFile *openedFile, int unused)
|
||||
{
|
||||
_GetFileDataPtr(openedFile);
|
||||
return GetSiroPtr(openedFile);
|
||||
}
|
||||
|
||||
struct OpenedFile *OpenFileAndGetFileDataPtr(char *filename, struct FileArchive *arc)
|
||||
{
|
||||
struct OpenedFile *openedFile = OpenFile(filename, arc);
|
||||
if (openedFile)
|
||||
GetFileDataPtr(openedFile, 0);
|
||||
return openedFile;
|
||||
}
|
||||
|
||||
struct OpenedFile *Call_OpenFileAndGetFileDataPtr(char *filename, struct FileArchive *arc)
|
||||
{
|
||||
return OpenFileAndGetFileDataPtr(filename, arc);
|
||||
}
|
||||
Reference in New Issue
Block a user