diff options
author | nullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com> | 2018-11-21 18:48:01 +0800 |
---|---|---|
committer | nullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com> | 2018-11-21 18:48:44 +0800 |
commit | a611b9673e73eeb74af802250d9fee5157f76a20 (patch) | |
tree | 681fc11f70eebf10cc2c8b9966904ec6b9766aee | |
parent | 48d3cbf8b7026e5ad3f6ff2792dbfd3db6e53e2e (diff) |
"Finish" decompiling bg_palette_buffer.s and m4a_2.s, and rename text variables
We all have our breaking points :matchlikethis:
-rw-r--r-- | asm/bg_palette_buffer.s | 148 | ||||
-rw-r--r-- | asm/m4a_2.s | 70 | ||||
-rw-r--r-- | asm/text.s | 2 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rwxr-xr-x | ld_script.txt | 3 | ||||
-rw-r--r-- | src/bg_palette_buffer.c | 165 | ||||
-rw-r--r-- | src/m4a_2.c | 113 | ||||
-rw-r--r-- | src/text.c | 18 | ||||
-rw-r--r-- | sym_ewram.txt | 4 |
9 files changed, 281 insertions, 244 deletions
diff --git a/asm/bg_palette_buffer.s b/asm/bg_palette_buffer.s deleted file mode 100644 index 9cafb43..0000000 --- a/asm/bg_palette_buffer.s +++ /dev/null @@ -1,148 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start InitBGPaletteBuffer -InitBGPaletteBuffer: - push {lr} - movs r2, 0 - ldr r1, =gBGPaletteBuffer - movs r0, 0x80 - lsls r0, 2 -_0800463E: - strh r2, [r1] - adds r1, 0x2 - subs r0, 0x1 - cmp r0, 0 - bne _0800463E - ldr r1, =gBGPaletteUsed - movs r2, 0x1 - adds r0, r1, 0 - adds r0, 0x1F -_08004650: - strb r2, [r0] - subs r0, 0x1 - cmp r0, r1 - bge _08004650 - pop {r0} - bx r0 - .align 2, 0 - .pool - thumb_func_end InitBGPaletteBuffer - - thumb_func_start SetBGPaletteBufferColorRGB -SetBGPaletteBufferColorRGB: - push {r4-r7,lr} - adds r4, r0, 0 - adds r5, r1, 0 - cmp r2, 0 - bge _08004670 - movs r2, 0 -_08004670: - cmp r2, 0x1F - ble _08004676 - movs r2, 0x1F -_08004676: - ldr r1, =gBGPaletteUsed - adds r0, r4, 0 - cmp r4, 0 - bge _08004680 - adds r0, 0xF -_08004680: - asrs r0, 4 - adds r0, r1 - movs r1, 0x1 - strb r1, [r0] - cmp r3, 0 - bne _080046D4 - ldr r0, =gBGPaletteBuffer - lsls r1, r4, 1 - adds r6, r1, r0 - ldrb r0, [r5, 0x2] - muls r0, r2 - cmp r0, 0 - bge _0800469C - adds r0, 0xFF -_0800469C: - asrs r0, 8 - movs r3, 0x1F - ands r0, r3 - lsls r4, r0, 10 - ldrb r0, [r5, 0x1] - muls r0, r2 - cmp r0, 0 - bge _080046AE - adds r0, 0xFF -_080046AE: - asrs r0, 8 - ands r0, r3 - lsls r1, r0, 5 - orrs r1, r4 - ldrb r0, [r5] - muls r0, r2 - cmp r0, 0 - bge _080046C0 - adds r0, 0xFF -_080046C0: - asrs r0, 8 - ands r0, r3 - orrs r1, r0 - strh r1, [r6] - b _08004722 - .align 2, 0 - .pool -_080046D4: - ldr r1, =gBGPaletteBuffer - lsls r0, r4, 1 - adds r7, r0, r1 - ldrb r0, [r5, 0x2] - lsls r0, 2 - adds r0, r3 - ldrb r0, [r0, 0x2] - muls r0, r2 - cmp r0, 0 - bge _080046EA - adds r0, 0xFF -_080046EA: - asrs r0, 8 - movs r4, 0x1F - ands r0, r4 - lsls r6, r0, 10 - ldrb r0, [r5, 0x1] - lsls r0, 2 - adds r0, r3 - ldrb r0, [r0, 0x1] - muls r0, r2 - cmp r0, 0 - bge _08004702 - adds r0, 0xFF -_08004702: - asrs r0, 8 - ands r0, r4 - lsls r1, r0, 5 - orrs r1, r6 - ldrb r0, [r5] - lsls r0, 2 - adds r0, r3 - ldrb r0, [r0] - muls r0, r2 - cmp r0, 0 - bge _0800471A - adds r0, 0xFF -_0800471A: - asrs r0, 8 - ands r0, r4 - orrs r1, r0 - strh r1, [r7] -_08004722: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 - .pool - thumb_func_end SetBGPaletteBufferColorRGB - -.align 2, 0 @ Don't pad with nop.
\ No newline at end of file diff --git a/asm/m4a_2.s b/asm/m4a_2.s deleted file mode 100644 index eb525ce..0000000 --- a/asm/m4a_2.s +++ /dev/null @@ -1,70 +0,0 @@ - .include "asm/macros.inc" - .include "constants/gba_constants.inc" - .include "constants/m4a_constants.inc" - - .syntax unified - - .text - - thumb_func_start CgbModVol -CgbModVol: - push {r4,lr} - adds r1, r0, 0 - ldrb r0, [r1, 0x2] - lsls r2, r0, 24 - lsrs r4, r2, 24 - ldrb r3, [r1, 0x3] - lsls r0, r3, 24 - lsrs r3, r0, 24 - cmp r4, r3 - bcc _080AFA94 - lsrs r0, r2, 25 - cmp r0, r3 - bcc _080AFAA0 - movs r0, 0xF - strb r0, [r1, 0x1B] - b _080AFAAE -_080AFA94: - lsrs r0, 25 - cmp r0, r4 - bcc _080AFAA0 - movs r0, 0xF0 - strb r0, [r1, 0x1B] - b _080AFAAE -_080AFAA0: - movs r0, 0xFF - strb r0, [r1, 0x1B] - ldrb r2, [r1, 0x3] - ldrb r3, [r1, 0x2] - adds r0, r2, r3 - lsrs r0, 4 - b _080AFABE -_080AFAAE: - ldrb r2, [r1, 0x3] - ldrb r3, [r1, 0x2] - adds r0, r2, r3 - lsrs r0, 4 - strb r0, [r1, 0xA] - cmp r0, 0xF - bls _080AFAC0 - movs r0, 0xF -_080AFABE: - strb r0, [r1, 0xA] -_080AFAC0: - ldrb r2, [r1, 0x6] - ldrb r3, [r1, 0xA] - adds r0, r2, 0 - muls r0, r3 - adds r0, 0xF - asrs r0, 4 - strb r0, [r1, 0x19] - ldrb r0, [r1, 0x1C] - ldrb r2, [r1, 0x1B] - ands r0, r2 - strb r0, [r1, 0x1B] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CgbModVol - - .align 2, 0 @ Don't pad with nop. @@ -4468,7 +4468,7 @@ sub_8008584: adds r1, r5, r1 b _08008624 .align 2, 0 -_080085C4: .4byte gUnknown_2027490 +_080085C4: .4byte gKanji _080085C8: .4byte gUnknown_20274AC _080085CC: .4byte 0xffff0800 _080085D0: .4byte 0x000007fe diff --git a/include/global.h b/include/global.h index 66c1b6d..b5a4593 100644 --- a/include/global.h +++ b/include/global.h @@ -24,6 +24,8 @@ #define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided\n") +#define NAKED __attribute__((naked)) + #define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0])) #endif // GUARD_GLOBAL_H diff --git a/ld_script.txt b/ld_script.txt index 4fbe903..de750b1 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -48,7 +48,6 @@ SECTIONS { asm/code_80035F0.o(.text); src/other_random.o(.text); src/util.o(.text); - asm/bg_palette_buffer.o(.text); src/bg_palette_buffer.o(.text); asm/input.o(.text); asm/code_8004AA0.o(.text); @@ -57,6 +56,7 @@ SECTIONS { asm/code_800558C.o(.text); src/random.o(.text); src/text.o(.text); + . = ALIGN(4); asm/text.o(.text); asm/code_8009804.o(.text); src/file_system.o(.text); @@ -71,7 +71,6 @@ SECTIONS { asm/code_8012A18.o(.text); asm/m4a_1.o(.text); src/m4a_2.o(.text); - asm/m4a_2.o(.text); asm/m4a_3.o(.text); src/m4a_4.o(.text); asm/syscall.o(.text); diff --git a/src/bg_palette_buffer.c b/src/bg_palette_buffer.c index e36176d..9917adf 100644 --- a/src/bg_palette_buffer.c +++ b/src/bg_palette_buffer.c @@ -8,9 +8,12 @@ extern bool8 gBGPaletteUsed[BG_PALETTE_BUFFER_SIZE / BG_PALETTE_BUFFER_CHUNK_SIZ extern void CpuCopy(void* src, void* dest, u32 size); -/* +#ifndef NONMATCHING +NAKED +#endif void InitBGPaletteBuffer(void) { +#ifdef NONMATCHING u16 color = 0; u16* ptr; u32 i; @@ -36,25 +39,165 @@ void InitBGPaletteBuffer(void) do *p-- = paletteUsed; while ((s32) p >= (s32) &gBGPaletteUsed); +#else + asm_unified("\tpush {lr}\n" + "\tmovs r2, 0\n" + "\tldr r1, =gBGPaletteBuffer\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "_0800463E:\n" + "\tstrh r2, [r1]\n" + "\tadds r1, 0x2\n" + "\tsubs r0, 0x1\n" + "\tcmp r0, 0\n" + "\tbne _0800463E\n" + "\tldr r1, =gBGPaletteUsed\n" + "\tmovs r2, 0x1\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x1F\n" + "_08004650:\n" + "\tstrb r2, [r0]\n" + "\tsubs r0, 0x1\n" + "\tcmp r0, r1\n" + "\tbge _08004650\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "\t.pool"); +#endif } -void SetBGPaletteBufferColorRGB(s32 index, u8 *RGBArray, s32 a3, u8 *a4) + +#ifndef NONMATCHING +NAKED +#endif +void SetBGPaletteBufferColorRGB(s32 index, u8 *RGBArray, s32 a1, u8 *a2) { - if (a3 < 0) { - a3 = 0; +#ifdef NONMATCHING + if (a1 < 0) { + a1 = 0; } - if (a3 > 31) { - a3 = 31; + if (a1 > 31) { + a1 = 31; } gBGPaletteUsed[index / 16] = 1; - if (!a4) { - gBGPaletteBuffer[index] = ((RGBArray[2] * a3 / 256 & 0x1F) << 10) | ((RGBArray[1] * a3 / 256 & 0x1F) << 5) | (RGBArray[0] * a3 / 256 & 0x1F); + if (!a2) { + gBGPaletteBuffer[index] = ((RGBArray[2] * a1 / 256 & 0x1F) << 10) | ((RGBArray[1] * a1 / 256 & 0x1F) << 5) | (RGBArray[0] * a1 / 256 & 0x1F); } else { - gBGPaletteBuffer[index] = ((a4[4 * RGBArray[2] + 2] * a3 / 256 & 0x1F) << 10) | ((a4[4 * RGBArray[1] + 1] * a3 / 256 & 0x1F) << 5) | (a4[4 * RGBArray[0]] * a3 / 256 & 0x1F); + gBGPaletteBuffer[index] = ((a2[4 * RGBArray[2] + 2] * a1 / 256 & 0x1F) << 10) | ((a2[4 * RGBArray[1] + 1] * a1 / 256 & 0x1F) << 5) | (a2[4 * RGBArray[0]] * a1 / 256 & 0x1F); } +#else + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r4, r0, 0\n" + "\tadds r5, r1, 0\n" + "\tcmp r2, 0\n" + "\tbge _08004670\n" + "\tmovs r2, 0\n" + "_08004670:\n" + "\tcmp r2, 0x1F\n" + "\tble _08004676\n" + "\tmovs r2, 0x1F\n" + "_08004676:\n" + "\tldr r1, =gBGPaletteUsed\n" + "\tadds r0, r4, 0\n" + "\tcmp r4, 0\n" + "\tbge _08004680\n" + "\tadds r0, 0xF\n" + "_08004680:\n" + "\tasrs r0, 4\n" + "\tadds r0, r1\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tcmp r3, 0\n" + "\tbne _080046D4\n" + "\tldr r0, =gBGPaletteBuffer\n" + "\tlsls r1, r4, 1\n" + "\tadds r6, r1, r0\n" + "\tldrb r0, [r5, 0x2]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _0800469C\n" + "\tadds r0, 0xFF\n" + "_0800469C:\n" + "\tasrs r0, 8\n" + "\tmovs r3, 0x1F\n" + "\tands r0, r3\n" + "\tlsls r4, r0, 10\n" + "\tldrb r0, [r5, 0x1]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _080046AE\n" + "\tadds r0, 0xFF\n" + "_080046AE:\n" + "\tasrs r0, 8\n" + "\tands r0, r3\n" + "\tlsls r1, r0, 5\n" + "\torrs r1, r4\n" + "\tldrb r0, [r5]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _080046C0\n" + "\tadds r0, 0xFF\n" + "_080046C0:\n" + "\tasrs r0, 8\n" + "\tands r0, r3\n" + "\torrs r1, r0\n" + "\tstrh r1, [r6]\n" + "\tb _08004722\n" + "\t.align 2, 0\n" + "\t.pool\n" + "_080046D4:\n" + "\tldr r1, =gBGPaletteBuffer\n" + "\tlsls r0, r4, 1\n" + "\tadds r7, r0, r1\n" + "\tldrb r0, [r5, 0x2]\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrb r0, [r0, 0x2]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _080046EA\n" + "\tadds r0, 0xFF\n" + "_080046EA:\n" + "\tasrs r0, 8\n" + "\tmovs r4, 0x1F\n" + "\tands r0, r4\n" + "\tlsls r6, r0, 10\n" + "\tldrb r0, [r5, 0x1]\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrb r0, [r0, 0x1]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _08004702\n" + "\tadds r0, 0xFF\n" + "_08004702:\n" + "\tasrs r0, 8\n" + "\tands r0, r4\n" + "\tlsls r1, r0, 5\n" + "\torrs r1, r6\n" + "\tldrb r0, [r5]\n" + "\tlsls r0, 2\n" + "\tadds r0, r3\n" + "\tldrb r0, [r0]\n" + "\tmuls r0, r2\n" + "\tcmp r0, 0\n" + "\tbge _0800471A\n" + "\tadds r0, 0xFF\n" + "_0800471A:\n" + "\tasrs r0, 8\n" + "\tands r0, r4\n" + "\torrs r1, r0\n" + "\tstrh r1, [r7]\n" + "_08004722:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "\t.pool"); +#endif } -*/ void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray) { @@ -68,7 +211,7 @@ void SetBGPaletteBufferColor(s32 index, u16 *color) gBGPaletteBuffer[index] = *color; } -void nullsub_4() +void nullsub_4(void) { } diff --git a/src/m4a_2.c b/src/m4a_2.c index 176910e..ce9ac19 100644 --- a/src/m4a_2.c +++ b/src/m4a_2.c @@ -1,4 +1,5 @@ #include "gba/m4a_internal.h" +#include "global.h" extern char SoundMainRAM_Buffer[0x400]; @@ -832,3 +833,115 @@ void CgbOscOff(u8 chanNum) REG_NR44 = 0x80; } } + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} +#ifndef NONMATCHING +NAKED +#endif +void CgbModVol(struct CgbChannel *chan) +{ +#ifdef NONMATCHING + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +#else + asm_unified("\tpush {r4,lr}\n" + "\tadds r1, r0, 0\n" + "\tldrb r0, [r1, 0x2]\n" + "\tlsls r2, r0, 24\n" + "\tlsrs r4, r2, 24\n" + "\tldrb r3, [r1, 0x3]\n" + "\tlsls r0, r3, 24\n" + "\tlsrs r3, r0, 24\n" + "\tcmp r4, r3\n" + "\tbcc _080AFA94\n" + "\tlsrs r0, r2, 25\n" + "\tcmp r0, r3\n" + "\tbcc _080AFAA0\n" + "\tmovs r0, 0xF\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tb _080AFAAE\n" + "_080AFA94:\n" + "\tlsrs r0, 25\n" + "\tcmp r0, r4\n" + "\tbcc _080AFAA0\n" + "\tmovs r0, 0xF0\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tb _080AFAAE\n" + "_080AFAA0:\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tldrb r2, [r1, 0x3]\n" + "\tldrb r3, [r1, 0x2]\n" + "\tadds r0, r2, r3\n" + "\tlsrs r0, 4\n" + "\tb _080AFABE\n" + "_080AFAAE:\n" + "\tldrb r2, [r1, 0x3]\n" + "\tldrb r3, [r1, 0x2]\n" + "\tadds r0, r2, r3\n" + "\tlsrs r0, 4\n" + "\tstrb r0, [r1, 0xA]\n" + "\tcmp r0, 0xF\n" + "\tbls _080AFAC0\n" + "\tmovs r0, 0xF\n" + "_080AFABE:\n" + "\tstrb r0, [r1, 0xA]\n" + "_080AFAC0:\n" + "\tldrb r2, [r1, 0x6]\n" + "\tldrb r3, [r1, 0xA]\n" + "\tadds r0, r2, 0\n" + "\tmuls r0, r3\n" + "\tadds r0, 0xF\n" + "\tasrs r0, 4\n" + "\tstrb r0, [r1, 0x19]\n" + "\tldrb r0, [r1, 0x1C]\n" + "\tldrb r2, [r1, 0x1B]\n" + "\tands r0, r2\n" + "\tstrb r0, [r1, 0x1B]\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n"); +#endif +}
\ No newline at end of file @@ -23,13 +23,13 @@ struct UnkTextStruct2 { extern char gUnknown_3000E94[]; EWRAM_DATA struct UnkTextStruct1 gUnknown_2027370[4]; -EWRAM_DATA u8 *gUnknown_2027490[2]; +EWRAM_DATA u8 *gKanji[2]; EWRAM_DATA u16 gUnknown_2027498; EWRAM_DATA u8 gUnknown_20274A5; EWRAM_DATA u32 gUnknown_20274AC; EWRAM_DATA vu32 gUnknown_20274B0; EWRAM_DATA u8 gUnknown_20274B4[0x3b00]; -EWRAM_DATA struct OpenedFile *gKanji[2]; +EWRAM_DATA struct OpenedFile *gKanjiFiles[2]; EWRAM_DATA struct UnkTextStruct2 gUnknown_202AFC0[4]; EWRAM_DATA u32 gUnknown_202B020; EWRAM_DATA u32 gUnknown_202B024; @@ -60,10 +60,10 @@ void sub_8006218(void) int k; gUnknown_20274AC = 0; - gKanji[0] = OpenFileAndGetFileDataPtr(gUnknown_80B87B4, &gUnknown_8300500); - gKanji[1] = OpenFileAndGetFileDataPtr(gUnknown_80B87BC, &gUnknown_8300500); - gUnknown_2027490[0] = gKanji[0]->data; - gUnknown_2027490[1] = gKanji[1]->data; + gKanjiFiles[0] = OpenFileAndGetFileDataPtr(gUnknown_80B87B4, &gUnknown_8300500); + gKanjiFiles[1] = OpenFileAndGetFileDataPtr(gUnknown_80B87BC, &gUnknown_8300500); + gKanji[0] = gKanjiFiles[0]->data; + gKanji[1] = gKanjiFiles[1]->data; gUnknown_202B028[0] = 11; gUnknown_202B028[1] = 12; for (k = 0; k < 4; k++) @@ -188,13 +188,11 @@ void sub_8006438(const struct UnkTextStruct2 *a0, u8 a1, u8 a2, u32 *a3) gUnknown_203B078 = gUnknown_3000E94; gUnknown_20274A5 = 1; #else - asm(".syntax unified\n" - "\tldr r2, =gUnknown_203B078\n" + asm_unified("\tldr r2, =gUnknown_203B078\n" "\tldr r0, =gUnknown_3000E94\n" "\tldr r1, =gUnknown_20274A5\n" "\tstr r0, [r2]\n" "\tmovs r0, 0x1\n" - "\tstrb r0, [r1]\n" - ".syntax divided"); + "\tstrb r0, [r1]"); #endif } diff --git a/sym_ewram.txt b/sym_ewram.txt index a627dcf..1d287ee 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -133,7 +133,7 @@ gUnknown_2027370 = .; /* 2027370 */ gUnknown_20273B8 = .; /* 20273B8 */ . += 0xD8; -gUnknown_2027490 = .; /* 2027490 */ +gKanji = .; /* 2027490 */ . += 0x8; gUnknown_2027498 = .; /* 2027498 */ @@ -157,7 +157,7 @@ gUnknown_20274B0 = .; /* 20274B0 */ gUnknown_20274B4 = .; /* 20274B4 */ . += 0x3B00; -gKanji = .; /* 202AFB4 */ +gKanjiFiles = .; /* 202AFB4 */ . += 0x8; gUnknown_202AFBC = .; /* 202AFBC */ |