"Finish" decompiling bg_palette_buffer.s and m4a_2.s, and rename text variables

We all have our breaking points :matchlikethis:
This commit is contained in:
nullableVoidPtr 2018-11-21 18:48:01 +08:00
parent 48d3cbf8b7
commit a611b9673e
9 changed files with 281 additions and 244 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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)
{
}

View File

@ -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
}

View 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
}

View File

@ -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 */