pmd-red/src/file_system.c
Seth Barberee f402e46cd3
Sese's April/May Dump (#37)
* splitting lots of pokemon square and labeling lots of other things

* actually commit this stuff

* more moving data and things

* more screen work

* split out some pokemon dungeon data

* lots of data work

* push more data work

* split kecleon, decomp another kanghaskhan func, and try to doc UpdateBGControl more

* lots of item work

* label more item things

* subtype -> category and doc types/category
2021-05-15 18:59:55 -05:00

1101 lines
32 KiB
C

#include "global.h"
#include "file_system.h"
extern struct OpenedFile gFileCache[64];
extern u32 gFileCacheCursorPosition;
extern u32 gUnknown_202D2A4;
extern const u32 gByteShiftLookup[4];
extern u32 *gDecompressBufferPtr;
extern u32 *gDecompressBufferStart;
extern u32 gDecompressBufferCurrent;
extern u32 gDecompressBufferByteInInt;
extern int sprintf(char *, const char *, ...);
void DecompressAT_Init(u32 *buffer);
void DecompressAT_AppendByte(char value);
void DecompressAT_Finish(void);
char DecompressAT_GetByte(int index);
u32 DecompressAT(char *result, s32 resultLength, const char *compressedData);
u32 DecompressATGlobal(u32 *result, s32 resultLength, const char *compressedData);
u8 *GetSiroPtr(struct OpenedFile *);
void NDS_DecompressRLE(void *);
struct UnkFileStruct
{
/* 0x0 */ u32 unk0;
/* 0x4 */ u32 unk4;
};
extern u32 gUnknown_80B96E4[];
void sub_800A894(struct UnkFileStruct *r0, s32 r1)
{
s32 temp;
temp = r1;
if(r1 <= 0)
temp = 1;
if(temp > 299)
temp = 299;
r0->unk4 = gUnknown_80B96E4[temp];
r0->unk0 = 0;
}
void InitFileSystem(void)
{
s32 i;
for (i = 0; i < 64; i++)
{
gFileCache[i].file = NULL;
gFileCache[i].data = NULL;
}
gFileCacheCursorPosition = 0;
gUnknown_202D2A4 = 1;
}
u32 sub_800A8F8(u32 value)
{
u32 oldValue = gUnknown_202D2A4;
gUnknown_202D2A4 = value;
return oldValue;
}
struct OpenedFile *OpenFile(const char *filename, const struct FileArchive *arc)
{
char buffer[0x12C];
s32 left, right;
s32 cursor;
s32 i;
u32 magic = 0;
bool32 magicFound;
struct File *entries;
struct File *file;
magic = strcmp(arc->magic, "pksdir0") != 0;
magicFound = 0;
if (!(bool8)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 = gFileCacheCursorPosition;
for (i = 0; i < 64; i++)
{
cursor++;
if (cursor > 63)
cursor = 0;
if (!gFileCache[cursor].file)
{
gFileCache[cursor].file = file;
gFileCache[cursor].data = NULL;
return &gFileCache[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(const char *filename, const struct FileArchive *arc)
{
struct OpenedFile *openedFile = OpenFile(filename, arc);
if (openedFile)
GetFileDataPtr(openedFile, 0);
return openedFile;
}
struct OpenedFile *Call_OpenFileAndGetFileDataPtr(const char *filename, const struct FileArchive *arc)
{
return OpenFileAndGetFileDataPtr(filename, arc);
}
void CloseFile(struct OpenedFile *openedFile)
{
s32 i;
for (i = 0; i < 64; i++)
{
if (&gFileCache[i] == openedFile)
{
gFileCache[i].file = NULL;
gFileCache[i].data = NULL;
gFileCacheCursorPosition = i;
return;
}
}
}
u8 *GetSiroPtr(struct OpenedFile *openedFile)
{
struct SiroArchive *siro = (struct SiroArchive *)openedFile->data;
if (siro->magic == 0x30524953)
{
NDS_DecompressRLE(openedFile->data);
}
else if (siro->magic != 0x4F524953)
{
return openedFile->data;
}
openedFile->data = siro->data;
return openedFile->data;
}
void *UnusedGetSir0Ptr(struct SiroArchive *siro)
{
if (siro->magic != 0x30524953)
return siro;
NDS_DecompressRLE(siro);
return siro->data;
}
void NDS_DecompressRLE(void *unused)
{
}
void nullsub_16(void)
{
}
void nullsub_175(void)
{
}
u32 DecompressATFile(char *result, s32 resultLength, struct OpenedFile *file)
{
return DecompressAT(result, resultLength, file->data);
}
// 800AAB4
u32 DecompressAT(char *result, s32 resultLength, const char *compressedData)
{
s32 compressedLength = compressedData[5] + (compressedData[6] << 8);
s32 bytesWritten = 0;
s32 currentByte = 0;
s32 cmdBit = 8;
s32 curIndex;
s32 flags[9];
s32 idxStart;
if (compressedData[0] == 'A'
&& compressedData[1] == 'T'
&& compressedData[2] == '4'
&& compressedData[3] == 'P') {
u32 tmp2 = compressedData[0x10] + (compressedData[0x11] << 8);
if (resultLength != 0 && resultLength != tmp2)
return 0;
idxStart = 0x12;
} else if (compressedData[0] == 'A'
&& compressedData[1] == 'T'
&& compressedData[2] == '3'
&& compressedData[3] == 'P') {
idxStart = 0x10;
} else {
return 0;
}
if (compressedData[4] == 'N') {
// uncompressed mode, unused
for (curIndex = 0; curIndex < compressedLength; curIndex++) {
result[curIndex] = compressedData[curIndex + 7];
}
return curIndex;
}
flags[0] = compressedData[0x7] + 3;
flags[1] = compressedData[0x8] + 3;
flags[2] = compressedData[0x9] + 3;
flags[3] = compressedData[0xa] + 3;
flags[4] = compressedData[0xb] + 3;
flags[5] = compressedData[0xc] + 3;
flags[6] = compressedData[0xd] + 3;
flags[7] = compressedData[0xe] + 3;
flags[8] = compressedData[0xf] + 3;
curIndex = idxStart;
if (curIndex < compressedLength) {
do {
if (resultLength != 0 && bytesWritten >= resultLength)
return 0;
if (cmdBit == 8) {
currentByte = compressedData[curIndex++];
cmdBit = 0;
}
if ((currentByte & 0x80) == 0) {
// if bit is unset, process command
u32 command = (compressedData[curIndex] >> 4) + 3;
u32 tmp = (compressedData[curIndex] & 0xf) << 8;
u32 c;
if (command == flags[0]) command = 0x1f;
if (command == flags[1]) command = 0x1e;
if (command == flags[2]) command = 0x1d;
if (command == flags[3]) command = 0x1c;
if (command == flags[4]) command = 0x1b;
if (command == flags[5]) command = 0x1a;
if (command == flags[6]) command = 0x19;
if (command == flags[7]) command = 0x18;
if (command == flags[8]) command = 0x17;
switch (command) {
case 0x1f: { // aaaa
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
break;
}
case 0x1e: { // abbb
u8 byte = compressedData[curIndex];
c = 0xF;
c = byte & c;
curIndex++;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf));
result[bytesWritten++] = ((((c + 1) & 0xf) << 4) | ((c + 1) & 0xf));
break;
}
case 0x1d: { // babb
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf));
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
break;
}
case 0x1c: { // bbab
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
result[bytesWritten++] = ((((c - 1) & 0xf) << 4) | ((c + 0) & 0xf));
break;
}
case 0x1b: { // bbba
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf));
break;
}
case 0x1a: { // baaa -- the horrible, hard-to-match case
u8 byte = compressedData[curIndex];
c = 0xF;
c = byte & c;
curIndex++;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf));
result[bytesWritten++] = ((((c - 1) & 0xf) << 4) | ((c - 1) & 0xf));
break;
}
case 0x19: { // abaa
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf));
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
break;
}
case 0x18: { // aaba
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
result[bytesWritten++] = ((((c + 1) & 0xf) << 4) | ((c + 0) & 0xf));
break;
}
case 0x17: { // aaab
c = compressedData[curIndex++] & 0xf;
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf));
result[bytesWritten++] = ((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf));
break;
}
default: {
tmp += (compressedData[curIndex++, curIndex++]);
tmp += bytesWritten - 0x1000;
for(;command;command--)
{
result[bytesWritten++] = result[tmp];
tmp++;
}
}
}
} else {
// if bit is set, just copy next byte
result[bytesWritten++] = (compressedData[curIndex]);
curIndex++;
}
cmdBit++;
currentByte <<= 1;
} while (curIndex < compressedLength);
}
return bytesWritten;
}
u32 DecompressATGlobalFile(u32 *result, s32 resultLength, struct OpenedFile *file)
{
return DecompressATGlobal(result, resultLength, file->data);
}
// 800AE34
#ifndef NONMATCHING
NAKED
#endif
u32 DecompressATGlobal(u32 *result, s32 resultLength, const char *compressedData)
{
#ifdef NONMATCHING
s32 compressedLength;
s32 curIndex;
s32 bytesWritten;
s32 cmdBit;
s32 currentByte;
s32 flags1;
s32 flags2;
s32 flags3;
s32 flags4;
s32 flags5;
s32 flags6;
s32 flags7;
s32 flags8;
s32 flags9;
u32 command;
u32 tmp;
u32 tmp2;
u32 c;
compressedLength = compressedData[5] + (compressedData[6] << 8);
bytesWritten = 0;
currentByte = 0;
cmdBit = 8;
DecompressAT_Init(result);
if (compressedData[0] == 'A'
&& compressedData[1] == 'T'
&& compressedData[2] == '4'
&& compressedData[3] == 'P') {
tmp2 = compressedData[0x10] + (compressedData[0x11] << 8);
if (resultLength != 0 && resultLength != tmp2)
return bytesWritten;
curIndex = 0x12;
} else if (compressedData[0] == 'A'
&& compressedData[1] == 'T'
&& compressedData[2] == '3'
&& compressedData[3] == 'P') {
curIndex = 0x10;
} else {
return 0;
}
if (compressedData[4] == 'N') {
// uncompressed mode, unused
for (bytesWritten = 0; bytesWritten < compressedLength; bytesWritten++) {
DecompressAT_AppendByte(compressedData[bytesWritten + 7]);
}
DecompressAT_Finish();
return bytesWritten;
}
flags1 = compressedData[0x7] + 3;
flags2 = compressedData[0x8] + 3;
flags3 = compressedData[0x9] + 3;
flags4 = compressedData[0xa] + 3;
flags5 = compressedData[0xb] + 3;
flags6 = compressedData[0xc] + 3;
flags7 = compressedData[0xd] + 3;
flags8 = compressedData[0xe] + 3;
flags9 = compressedData[0xf] + 3;
if (curIndex < compressedLength) {
do {
if (resultLength != 0 && bytesWritten >= resultLength)
return 0;
if (cmdBit == 8) {
currentByte = compressedData[curIndex++];
cmdBit = 0;
}
if ((currentByte & 0x80) == 0) {
// if bit is unset, process command
command = (compressedData[curIndex] >> 4) + 3;
tmp2 = (compressedData[curIndex] & 0xf) << 8;
if (command == flags1) command = 0x1f;
if (command == flags2) command = 0x1e;
if (command == flags3) command = 0x1d;
if (command == flags4) command = 0x1c;
if (command == flags5) command = 0x1b;
if (command == flags6) command = 0x1a;
if (command == flags7) command = 0x19;
if (command == flags8) command = 0x18;
if (command == flags9) command = 0x17;
switch (command) {
case 0x1f: { // aaaa
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x1e: { // abbb
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 1) & 0xf) << 4) | ((c + 1) & 0xf)); bytesWritten++;
break;
}
case 0x1d: { // babb
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x1c: { // bbab
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c - 1) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x1b: { // bbba
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf)); bytesWritten++;
break;
}
case 0x1a: { // baaa -- the horrible, unmatching case
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c - 1) & 0xf)); bytesWritten++;
c -= 1;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x19: { // abaa
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x18: { // aaba
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 1) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
break;
}
case 0x17: { // aaab
c = compressedData[curIndex++] & 0xf;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 0) & 0xf)); bytesWritten++;
DecompressAT_AppendByte((((c + 0) & 0xf) << 4) | ((c + 1) & 0xf)); bytesWritten++;
break;
}
default: {
tmp = compressedData[curIndex++, curIndex++] + tmp2 - 0x1000 + bytesWritten;
for (; command != 0; tmp++, command--) {
DecompressAT_AppendByte(DecompressAT_GetByte(tmp)); bytesWritten++;
}
}
}
} else {
// if bit is set, just copy next byte
DecompressAT_AppendByte(compressedData[curIndex]); bytesWritten++;
curIndex++;
}
cmdBit++;
currentByte <<= 1;
} while (curIndex < compressedLength);
DecompressAT_Finish();
}
return bytesWritten;
#else
asm_unified(
"DecompressATGlobal:\n"
" push {r4-r7,lr}\n"
" mov r7, r10\n"
" mov r6, r9\n"
" mov r5, r8\n"
" push {r5-r7}\n"
" sub sp, 0x34\n"
" str r1, [sp, 0x24]\n"
" mov r10, r2\n"
" ldrb r2, [r2, 0x5]\n"
" mov r3, r10\n"
" ldrb r1, [r3, 0x6]\n"
" lsls r1, 8\n"
" adds r2, r1\n"
" str r2, [sp, 0x28]\n"
" movs r1, 0\n"
" mov r9, r1\n"
" movs r2, 0\n"
" str r2, [sp, 0x2C]\n"
" movs r3, 0x8\n"
" str r3, [sp, 0x30]\n"
" bl DecompressAT_Init\n"
" mov r1, r10\n"
" ldrb r0, [r1]\n"
" cmp r0, 0x41\n"
" bne _0800AE90\n"
" ldrb r0, [r1, 0x1]\n"
" adds r1, r0, 0\n"
" cmp r1, 0x54\n"
" bne _0800AE98\n"
" mov r2, r10\n"
" ldrb r0, [r2, 0x2]\n"
" cmp r0, 0x34\n"
" bne _0800AE98\n"
" ldrb r0, [r2, 0x3]\n"
" cmp r0, 0x50\n"
" bne _0800AE98\n"
" ldrb r1, [r2, 0x10]\n"
" ldrb r0, [r2, 0x11]\n"
" lsls r0, 8\n"
" adds r1, r0\n"
" ldr r3, [sp, 0x24]\n"
" cmp r3, 0\n"
" beq _0800AE94\n"
" cmp r3, r1\n"
" beq _0800AE94\n"
"_0800AE90:\n"
" movs r0, 0\n"
" b _0800B1AA\n"
"_0800AE94:\n"
" movs r1, 0x12\n"
" b _0800AEB2\n"
"_0800AE98:\n"
" mov r2, r10\n"
" ldrb r0, [r2]\n"
" cmp r0, 0x41\n"
" bne _0800AE90\n"
" cmp r1, 0x54\n"
" bne _0800AE90\n"
" ldrb r0, [r2, 0x2]\n"
" cmp r0, 0x33\n"
" bne _0800AE90\n"
" ldrb r0, [r2, 0x3]\n"
" cmp r0, 0x50\n"
" bne _0800AE90\n"
" movs r1, 0x10\n"
"_0800AEB2:\n"
" mov r3, r10\n"
" ldrb r0, [r3, 0x4]\n"
" cmp r0, 0x4E\n"
" bne _0800AEE0\n"
" movs r0, 0\n"
" mov r8, r0\n"
" ldr r1, [sp, 0x28]\n"
" cmp r8, r1\n"
" bge _0800AED8\n"
"_0800AEC4:\n"
" mov r0, r8\n"
" add r0, r10\n"
" ldrb r0, [r0, 0x7]\n"
" bl DecompressAT_AppendByte\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" ldr r3, [sp, 0x28]\n"
" cmp r8, r3\n"
" blt _0800AEC4\n"
"_0800AED8:\n"
" bl DecompressAT_Finish\n"
" mov r0, r8\n"
" b _0800B1AA\n"
"_0800AEE0:\n"
" mov r2, r10\n"
" ldrb r0, [r2, 0x7]\n"
" adds r0, 0x3\n"
" str r0, [sp]\n"
" ldrb r0, [r2, 0x8]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x4]\n"
" ldrb r0, [r2, 0x9]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x8]\n"
" ldrb r0, [r2, 0xA]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0xC]\n"
" ldrb r0, [r2, 0xB]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x10]\n"
" ldrb r0, [r2, 0xC]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x14]\n"
" ldrb r0, [r2, 0xD]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x18]\n"
" ldrb r0, [r2, 0xE]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x1C]\n"
" ldrb r0, [r2, 0xF]\n"
" adds r0, 0x3\n"
" str r0, [sp, 0x20]\n"
" mov r8, r1\n"
" ldr r3, [sp, 0x28]\n"
" cmp r8, r3\n"
" blt _0800AF22\n"
" b _0800B1A4\n"
"_0800AF22:\n"
" ldr r0, [sp, 0x24]\n"
" cmp r0, 0\n"
" beq _0800AF2C\n"
" cmp r9, r0\n"
" bge _0800AE90\n"
"_0800AF2C:\n"
" ldr r1, [sp, 0x30]\n"
" cmp r1, 0x8\n"
" bne _0800AF42\n"
" mov r0, r10\n"
" add r0, r8\n"
" ldrb r0, [r0]\n"
" str r0, [sp, 0x2C]\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" movs r3, 0\n"
" str r3, [sp, 0x30]\n"
"_0800AF42:\n"
" movs r0, 0x80\n"
" ldr r1, [sp, 0x2C]\n"
" ands r0, r1\n"
" cmp r0, 0\n"
" beq _0800AF4E\n"
" b _0800B180\n"
"_0800AF4E:\n"
" mov r2, r10\n"
" add r2, r8\n"
" ldrb r1, [r2]\n"
" lsrs r0, r1, 4\n"
" adds r3, r0, 0x3\n"
" movs r0, 0xF\n"
" ands r0, r1\n"
" lsls r7, r0, 8\n"
" ldr r0, [sp]\n"
" cmp r3, r0\n"
" bne _0800AF66\n"
" movs r3, 0x1F\n"
"_0800AF66:\n"
" ldr r0, [sp, 0x4]\n"
" cmp r3, r0\n"
" bne _0800AF6E\n"
" movs r3, 0x1E\n"
"_0800AF6E:\n"
" ldr r0, [sp, 0x8]\n"
" cmp r3, r0\n"
" bne _0800AF76\n"
" movs r3, 0x1D\n"
"_0800AF76:\n"
" ldr r0, [sp, 0xC]\n"
" cmp r3, r0\n"
" bne _0800AF7E\n"
" movs r3, 0x1C\n"
"_0800AF7E:\n"
" ldr r0, [sp, 0x10]\n"
" cmp r3, r0\n"
" bne _0800AF86\n"
" movs r3, 0x1B\n"
"_0800AF86:\n"
" ldr r0, [sp, 0x14]\n"
" cmp r3, r0\n"
" bne _0800AF8E\n"
" movs r3, 0x1A\n"
"_0800AF8E:\n"
" ldr r0, [sp, 0x18]\n"
" cmp r3, r0\n"
" bne _0800AF96\n"
" movs r3, 0x19\n"
"_0800AF96:\n"
" ldr r0, [sp, 0x1C]\n"
" cmp r3, r0\n"
" bne _0800AF9E\n"
" movs r3, 0x18\n"
"_0800AF9E:\n"
" ldr r0, [sp, 0x20]\n"
" cmp r3, r0\n"
" bne _0800AFA6\n"
" movs r3, 0x17\n"
"_0800AFA6:\n"
" adds r0, r3, 0\n"
" subs r0, 0x17\n"
" cmp r0, 0x8\n"
" bls _0800AFB0\n"
" b _0800B13C\n"
"_0800AFB0:\n"
" lsls r0, 2\n"
" ldr r1, _0800AFBC\n"
" adds r0, r1\n"
" ldr r0, [r0]\n"
" mov pc, r0\n"
" .align 2, 0\n"
"_0800AFBC: .4byte _0800AFC0\n"
" .align 2, 0\n"
"_0800AFC0:\n"
" .4byte _0800B104\n"
" .4byte _0800B0DE\n"
" .4byte _0800B0BA\n"
" .4byte _0800B090\n"
" .4byte _0800B06E\n"
" .4byte _0800B048\n"
" .4byte _0800B024\n"
" .4byte _0800AFFE\n"
" .4byte _0800AFE4\n"
"_0800AFE4:\n"
" ldrb r0, [r2]\n"
" movs r1, 0xF\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" ands r1, r0\n"
" lsls r4, r1, 4\n"
" orrs r4, r1\n"
" adds r0, r4, 0\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" b _0800B128\n"
"_0800AFFE:\n"
" ldrb r0, [r2]\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" movs r1, 0xF\n"
" lsls r0, r6, 4\n"
" adds r4, r6, 0x1\n"
" ands r4, r1\n"
" orrs r0, r4\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" lsls r0, r4, 4\n"
" orrs r0, r4\n"
" lsls r0, 24\n"
" lsrs r0, 24\n"
" b _0800B12A\n"
"_0800B024:\n"
" ldrb r0, [r2]\n"
" movs r1, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r5, r6, 0\n"
" ands r5, r1\n"
" lsls r4, r5, 4\n"
" subs r0, r6, 0x1\n"
" ands r0, r1\n"
" orrs r0, r4\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" orrs r4, r5\n"
" b _0800B128\n"
"_0800B048:\n"
" ldrb r0, [r2]\n"
" movs r5, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r4, r6, 0\n"
" ands r4, r5\n"
" lsls r0, r4, 4\n"
" orrs r0, r4\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" subs r0, r6, 0x1\n"
" ands r0, r5\n"
" lsls r0, 4\n"
" orrs r0, r4\n"
" b _0800B12A\n"
"_0800B06E:\n"
" ldrb r0, [r2]\n"
" movs r5, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r1, r6, 0\n"
" ands r1, r5\n"
" lsls r4, r1, 4\n"
" adds r0, r4, 0\n"
" orrs r0, r1\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" subs r0, r6, 0x1\n"
" b _0800B124\n"
"_0800B090:\n"
" ldrb r0, [r2]\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" movs r1, 0xF\n"
" lsls r0, r6, 4\n"
" subs r4, r6, 0x1\n"
" ands r4, r1\n"
" orrs r0, r4\n"
" lsls r0, 24\n"
" lsrs r0, 24\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" lsls r0, r4, 4\n"
" orrs r0, r4\n"
" lsls r0, 24\n"
" lsrs r0, 24\n"
" b _0800B12A\n"
"_0800B0BA:\n"
" ldrb r0, [r2]\n"
" movs r1, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r5, r6, 0\n"
" ands r5, r1\n"
" lsls r4, r5, 4\n"
" adds r0, r6, 0x1\n"
" ands r0, r1\n"
" orrs r0, r4\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" orrs r4, r5\n"
" b _0800B128\n"
"_0800B0DE:\n"
" ldrb r0, [r2]\n"
" movs r5, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r4, r6, 0\n"
" ands r4, r5\n"
" lsls r0, r4, 4\n"
" orrs r0, r4\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" adds r0, r6, 0x1\n"
" ands r0, r5\n"
" lsls r0, 4\n"
" orrs r0, r4\n"
" b _0800B12A\n"
"_0800B104:\n"
" ldrb r0, [r2]\n"
" movs r5, 0xF\n"
" movs r6, 0xF\n"
" ands r6, r0\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" adds r1, r6, 0\n"
" ands r1, r5\n"
" lsls r4, r1, 4\n"
" adds r0, r4, 0\n"
" orrs r0, r1\n"
" bl DecompressAT_AppendByte\n"
" movs r3, 0x1\n"
" add r9, r3\n"
" adds r0, r6, 0x1\n"
"_0800B124:\n"
" ands r0, r5\n"
" orrs r4, r0\n"
"_0800B128:\n"
" adds r0, r4, 0\n"
"_0800B12A:\n"
" bl DecompressAT_AppendByte\n"
" movs r0, 0x1\n"
" add r9, r0\n"
" ldr r5, [sp, 0x30]\n"
" adds r5, 0x1\n"
" ldr r1, [sp, 0x2C]\n"
" lsls r4, r1, 1\n"
" b _0800B198\n"
"_0800B13C:\n"
" movs r2, 0x1\n"
" add r8, r2\n"
" mov r0, r10\n"
" add r0, r8\n"
" ldrb r0, [r0]\n"
" adds r7, r0\n"
" add r8, r2\n"
" ldr r1, _0800B17C\n"
" adds r0, r7, r1\n"
" mov r2, r9\n"
" adds r7, r0, r2\n"
" ldr r5, [sp, 0x30]\n"
" adds r5, 0x1\n"
" ldr r0, [sp, 0x2C]\n"
" lsls r4, r0, 1\n"
" cmp r3, 0\n"
" beq _0800B198\n"
" adds r6, r3, 0\n"
"_0800B160:\n"
" adds r0, r7, 0\n"
" bl DecompressAT_GetByte\n"
" lsls r0, 24\n"
" lsrs r0, 24\n"
" bl DecompressAT_AppendByte\n"
" movs r1, 0x1\n"
" add r9, r1\n"
" adds r7, 0x1\n"
" subs r6, 0x1\n"
" cmp r6, 0\n"
" bne _0800B160\n"
" b _0800B198\n"
" .align 2, 0\n"
"_0800B17C: .4byte 0xfffff000\n"
"_0800B180:\n"
" mov r0, r10\n"
" add r0, r8\n"
" ldrb r0, [r0]\n"
" bl DecompressAT_AppendByte\n"
" movs r2, 0x1\n"
" add r9, r2\n"
" add r8, r2\n"
" ldr r5, [sp, 0x30]\n"
" adds r5, 0x1\n"
" ldr r3, [sp, 0x2C]\n"
" lsls r4, r3, 1\n"
"_0800B198:\n"
" str r5, [sp, 0x30]\n"
" str r4, [sp, 0x2C]\n"
" ldr r0, [sp, 0x28]\n"
" cmp r8, r0\n"
" bge _0800B1A4\n"
" b _0800AF22\n"
"_0800B1A4:\n"
" bl DecompressAT_Finish\n"
" mov r0, r9\n"
"_0800B1AA:\n"
" add sp, 0x34\n"
" pop {r3-r5}\n"
" mov r8, r3\n"
" mov r9, r4\n"
" mov r10, r5\n"
" pop {r4-r7}\n"
" pop {r1}\n"
" bx r1");
#endif
}
// 800B1BC
void DecompressAT_Init(u32 *buffer) {
gDecompressBufferPtr = buffer;
gDecompressBufferStart = buffer;
gDecompressBufferCurrent = 0;
gDecompressBufferByteInInt = 0;
}
// 800B1E0
char DecompressAT_GetByte(int index) {
u32 data;
int offset;
offset = index < 0 ? index + 3 : index;
data = gDecompressBufferStart[offset >> 2];
switch (index & 3) {
case 0: return data;
case 1: return data >> 8;
case 2: return data >> 16;
case 3: return data >> 24;
}
return data;
}
// 800B220
void DecompressAT_AppendByte(char value) {
gDecompressBufferCurrent |= value << gByteShiftLookup[gDecompressBufferByteInInt];
*gDecompressBufferPtr = gDecompressBufferCurrent;
gDecompressBufferByteInInt++;
if (gDecompressBufferByteInInt == 4) {
gDecompressBufferPtr++;
gDecompressBufferCurrent = 0;
gDecompressBufferByteInInt = 0;
}
}
// 800B270
void DecompressAT_Finish(void) {
if (gDecompressBufferByteInInt)
*gDecompressBufferPtr = gDecompressBufferCurrent;
}
// 800B294
bool32 IsATxPCompressed_unused(char *data) {
if ((data[0] == 'A' && data[1] == 'T' && data[2] == '4' && data[3] == 'P')) return TRUE;
if ((data[0] == 'A' && data[1] == 'T' && data[2] == '3' && data[3] == 'P')) return TRUE;
return FALSE;
}
// 800B2D4
bool32 sub_800B2D4(char *arg0, char *arg1, int length) {
int i;
char a, b;
for (i = 0; i < length; i++) {
a = arg0[i];
b = arg1[i];
// convert to lowercase
if ('A' <= a && a <= 'Z') a += 0x20;
if ('A' <= b && b <= 'Z') b += 0x20;
if (a != b)
return TRUE;
if (a == '\0')
break;
}
return FALSE;
}
// Has to be down here to match (rodata ordering)
ALIGNED(4) const char file_filler[] = _("pksdir0");
const u32 gByteShiftLookup[4] = {0, 8, 16, 24};
ALIGNED(4) const char file_filler1[] = _("pksdir0");
ALIGNED(4) const char file_filler2[] = _("pksdir0");