This commit is contained in:
MokhaLeee 2024-07-08 13:47:00 +00:00
parent e2c7128dbd
commit 0976df0b2f
8 changed files with 101 additions and 194 deletions

View File

@ -270,26 +270,26 @@ void MemCpy(const void * src, void * dst, int size);
void PutDrawTextCentered(struct Text * text, int x, int y, char const * str, int width);
int sub_8014CA4(int, int, int, int);
struct Unknown03004990 {
struct BgVerticalScrollSt {
/* 000 */ u16 buf[3 * 320];
/* 780 */ u16 * src[3];
/* 78C */ u16 * dst[3];
/* 798 */ u8 unk_798[3];
/* 79B */ u8 unk_79B;
/* 79C */ u8 unk_79C;
/* 79D */ bool unk_79D;
/* 79E */ bool unk_79E;
/* 79B */ u8 frame_flip;
/* 79C */ u8 frame;
/* 79D */ bool updating;
/* 79E */ bool scroll_en;
};
extern struct Unknown03004990 * gUnknown_03004990;
extern struct BgVerticalScrollSt * gpBgVerticalScrollSt;
void HBlank_8014CC4(void);
void sub_8014DA8(struct Unknown03004990 * buf);
void sub_8014E3C(void);
u16 * sub_8014E74(int, int);
void sub_8014EA8(void);
void sub_8014EC4(int index,void * pr_offset);
// ??? sub_8014EDC(???);
void HBlank_BgVerticalScroll(void);
void StartBgVerticalScroll(struct BgVerticalScrollSt * buf);
void EndBgVerticalScroll(void);
u16 * GetBgVerticalScrollBuffer(int, int);
void FlipBgVerticalScroll(void);
void SetBgVerticalScrollPosition(int index,void * pr_offset);
// ??? ResetBgVerticalScrollPosition(???);
void sub_8014EF4(int);
// ??? sub_8014F10(???);
// ??? sub_8014F30(???);

View File

@ -108,8 +108,8 @@ struct SaveDrawProc {
/* 3B */ u8 unk_3b;
/* 3C */ u8 unk_3c;
// 3D - unused?
/* 3E */ u16 unk_3e;
/* 40 */ u16 unk_40;
/* 3E */ u16 bg_x;
/* 40 */ u16 bg_y;
};
struct SaveMenuProc {
@ -274,7 +274,7 @@ const char * GetWMNodeNameForSaveMenu(void);
void SaveMenuCopyPalette(u16 *, u16 *, int);
void sub_80AA7AC(int a, int b);
// ??? sub_80AA7EC(???);
void sub_80AA9D8(struct SaveDrawProc *);
void SaveDraw_ScrollFogBG(struct SaveDrawProc *);
// ??? SaveDraw_OnEnd(???);
// ??? SaveDraw_Init(???);
// ??? sub_80AAB78(???);

View File

@ -157,7 +157,7 @@ extern void (* sHBlankHandler2)(void);
extern u16 * gOamAffinePutIt;
// extern ??? gUnknown_03004160
// extern ??? gUnknown_03004960
// extern ??? gUnknown_03004990
// extern ??? gpBgVerticalScrollSt
// extern ??? gStatGainSimUnit
extern struct Unit * gActiveUnit;
// extern ??? gUnknown_03004E70

View File

@ -3,14 +3,9 @@
#include "spline.h"
#include "hardware.h"
int sub_8014CA4(int timer, int speed, int a, int b)
void HBlank_BgVerticalScroll(void)
{
return sub_800A42C(DivArm(speed, timer * 0x1000), a, b);
}
void HBlank_8014CC4(void)
{
int bg;
int i;
u16 vcount = REG_VCOUNT + 1;
if (vcount == 228)
@ -18,183 +13,92 @@ void HBlank_8014CC4(void)
if (vcount < DISPLAY_HEIGHT)
{
if (gUnknown_03004990->unk_79D)
if (gpBgVerticalScrollSt->updating)
{
u16 * src = gUnknown_03004990->buf + gUnknown_03004990->unk_79C * 480;
for (bg = 0; bg < 3; bg++)
{
if (gUnknown_03004990->dst[bg])
{
*gUnknown_03004990->dst[bg] = vcount[src + 160 * bg]; // ¿
}
}
u16 * src = gpBgVerticalScrollSt->buf + gpBgVerticalScrollSt->frame * 480;
for (i = 0; i < 3; i++)
if (gpBgVerticalScrollSt->dst[i])
*gpBgVerticalScrollSt->dst[i] = vcount[src + DISPLAY_HEIGHT * i]; // ¿
}
return;
}
else if (vcount == DISPLAY_HEIGHT)
{
if (gUnknown_03004990->unk_79E)
{
gUnknown_03004990->unk_79D = true;
gUnknown_03004990->unk_79C = gUnknown_03004990->unk_79B;
for (bg = 0; bg < 3; bg++)
{
gUnknown_03004990->dst[bg] = gUnknown_03004990->src[bg];
}
if (vcount == DISPLAY_HEIGHT)
{
if (gpBgVerticalScrollSt->scroll_en)
{
gpBgVerticalScrollSt->updating = true;
gpBgVerticalScrollSt->frame = gpBgVerticalScrollSt->frame_flip;
for (i = 0; i < 3; i++)
gpBgVerticalScrollSt->dst[i] = gpBgVerticalScrollSt->src[i];
}
else
{
gUnknown_03004990->unk_79D = false;
}
gpBgVerticalScrollSt->updating = false;
}
}
#if NONMATCHING
void sub_8014DA8(struct Unknown03004990 * buf)
void StartBgVerticalScroll(struct BgVerticalScrollSt * buf)
{
int bg;
gUnknown_03004990 = buf;
int i;
gpBgVerticalScrollSt = buf;
for (bg = 0; bg < 3; bg++)
for (i = 0; i < 3; i++)
{
gUnknown_03004990->unk_798[bg] = 0;
gpBgVerticalScrollSt->unk_798[i] = 0;
gUnknown_03004990->dst[bg] = NULL;
gUnknown_03004990->src[bg] = NULL;
gpBgVerticalScrollSt->dst[i] = gpBgVerticalScrollSt->src[i] = NULL;
}
gUnknown_03004990->unk_79B = 0;
gUnknown_03004990->unk_79C = 0;
gUnknown_03004990->unk_79D = false;
gUnknown_03004990->unk_79E = false;
gpBgVerticalScrollSt->frame = gpBgVerticalScrollSt->frame_flip = 0;
gpBgVerticalScrollSt->updating = false;
gpBgVerticalScrollSt->scroll_en = false;
SetPrimaryHBlankHandler(NULL);
SetPrimaryHBlankHandler(HBlank_8014CC4);
SetPrimaryHBlankHandler(HBlank_BgVerticalScroll);
}
#else
/* https://decomp.me/scratch/isCOG */
NAKEDFUNC
void sub_8014DA8(struct Unknown03004990 * buf)
{
asm("\
.syntax unified\n\
push {r4, r5, r6, r7, lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6, r7}\n\
ldr r1, _08014E24 @ gUnknown_03004990\n\
str r0, [r1]\n\
movs r3, #0\n\
adds r6, r1, #0\n\
adds r5, r6, #0\n\
movs r0, #0xf3\n\
lsls r0, r0, #3\n\
mov r8, r0\n\
movs r4, #0\n\
ldr r1, _08014E28 @ 0x0000078C\n\
mov ip, r1\n\
movs r2, #0xf0\n\
lsls r2, r2, #3\n\
mov r9, r2\n\
_08014DCC:\n\
ldr r0, [r5]\n\
add r0, r8\n\
adds r0, r0, r3\n\
strb r4, [r0]\n\
ldr r0, [r5]\n\
lsls r2, r3, #2\n\
mov r7, ip\n\
adds r1, r0, r7\n\
adds r1, r1, r2\n\
add r0, r9\n\
adds r0, r0, r2\n\
str r4, [r0]\n\
str r4, [r1]\n\
adds r3, #1\n\
cmp r3, #2\n\
ble _08014DCC\n\
ldr r0, [r6]\n\
ldr r1, _08014E2C @ 0x0000079B\n\
adds r2, r0, r1\n\
movs r1, #0\n\
strb r1, [r2]\n\
ldr r2, _08014E30 @ 0x0000079C\n\
adds r0, r0, r2\n\
strb r1, [r0]\n\
ldr r0, [r6]\n\
ldr r7, _08014E34 @ 0x0000079D\n\
adds r0, r0, r7\n\
strb r1, [r0]\n\
ldr r0, [r6]\n\
adds r2, #2\n\
adds r0, r0, r2\n\
strb r1, [r0]\n\
movs r0, #0\n\
bl SetPrimaryHBlankHandler\n\
ldr r0, _08014E38 @ HBlank_8014CC4\n\
bl SetPrimaryHBlankHandler\n\
pop {r3, r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4, r5, r6, r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_08014E24: .4byte gUnknown_03004990\n\
_08014E28: .4byte 0x0000078C\n\
_08014E2C: .4byte 0x0000079B\n\
_08014E30: .4byte 0x0000079C\n\
_08014E34: .4byte 0x0000079D\n\
_08014E38: .4byte HBlank_8014CC4\n\
.syntax divided\n\
");
}
#endif
void sub_8014E3C(void)
void EndBgVerticalScroll(void)
{
SetPrimaryHBlankHandler(NULL);
CpuFill16(0, gUnknown_03004990->buf, sizeof(gUnknown_03004990->buf));
gUnknown_03004990->unk_79E = 0;
CpuFill16(0, gpBgVerticalScrollSt->buf, sizeof(gpBgVerticalScrollSt->buf));
gpBgVerticalScrollSt->scroll_en = false;
}
u16 * sub_8014E74(int bg, int flip)
u16 * GetBgVerticalScrollBuffer(int i, int flip)
{
int frame = (gUnknown_03004990->unk_79B + flip) & 1;
u16 * tm = gUnknown_03004990->buf + frame * 480;
return tm + bg * 160;
int frame = (gpBgVerticalScrollSt->frame_flip + flip) & 1;
u16 * tm = gpBgVerticalScrollSt->buf + frame * 480;
return tm + i * DISPLAY_HEIGHT;
}
void sub_8014EA8(void)
void FlipBgVerticalScroll(void)
{
gUnknown_03004990->unk_79B ^= 1;
gpBgVerticalScrollSt->frame_flip ^= 1;
}
void sub_8014EC4(int index, void * pr_offset)
void SetBgVerticalScrollPosition(int index, void * pr_offset)
{
gUnknown_03004990->src[index] = pr_offset;
gpBgVerticalScrollSt->src[index] = pr_offset;
}
void sub_8014EDC(int index)
void ResetBgVerticalScrollPosition(int index)
{
gUnknown_03004990->src[index] = NULL;
gpBgVerticalScrollSt->src[index] = NULL;
}
void sub_8014EF4(int index)
{
gUnknown_03004990->unk_798[index] &= 3;
gpBgVerticalScrollSt->unk_798[index] &= 3;
}
void sub_8014F10(int index)
{
gUnknown_03004990->unk_798[index] = (gUnknown_03004990->unk_798[index] & 3) | 1;
gpBgVerticalScrollSt->unk_798[index] = (gpBgVerticalScrollSt->unk_798[index] & 3) | 1;
}
void sub_8014F30(int index)
{
gUnknown_03004990->unk_798[index] = (gUnknown_03004990->unk_798[index] & 3) | 2;
gpBgVerticalScrollSt->unk_798[index] = (gpBgVerticalScrollSt->unk_798[index] & 3) | 2;
}

View File

@ -2010,3 +2010,8 @@ void PutDrawTextCentered(struct Text * text, int x, int y, char const * str, int
PutText(text, gBG0TilemapBuffer + TILEMAP_INDEX(x, y));
}
int sub_8014CA4(int timer, int speed, int a, int b)
{
return sub_800A42C(DivArm(speed, timer * 0x1000), a, b);
}

View File

@ -1289,7 +1289,7 @@ void HandleShopBuyAction(struct ProcShop * proc)
DisplayGoldBoxText(TILEMAP_LOCATED(gBG0TilemapBuffer, 27, 6));
}
int ShopTryMoveHand(int pos, int pre, bool scroll_en)
int ShopTryMoveHand(int pos, int pre, bool hscroll_en)
{
int previous;
@ -1305,7 +1305,7 @@ int ShopTryMoveHand(int pos, int pre, bool scroll_en)
{
if (pos == 0)
{
if (scroll_en && (gKeyStatusPtr->newKeys & DPAD_UP))
if (hscroll_en && (gKeyStatusPtr->newKeys & DPAD_UP))
pos = pre - 1;
}
else
@ -1317,7 +1317,7 @@ int ShopTryMoveHand(int pos, int pre, bool scroll_en)
{
if (pos == (pre - 1))
{
if (scroll_en && (gKeyStatusPtr->newKeys & DPAD_DOWN))
if (hscroll_en && (gKeyStatusPtr->newKeys & DPAD_DOWN))
pos = 0;
}
else

View File

@ -290,41 +290,39 @@ void sub_80AA7EC(struct SaveDrawProc * proc)
}
//! FE8U = 0x080AA9D8
void sub_80AA9D8(struct SaveDrawProc * proc)
void SaveDraw_ScrollFogBG(struct SaveDrawProc * proc)
{
u16 * ptr;
int i;
s16 x;
u32 unk_40;
u32 r6;
u32 bg_y;
u32 angle;
proc->unk_3e++;
proc->unk_40 += 2;
proc->bg_x++;
proc->bg_y += 2;
x = (proc->unk_3e & 0xfff) >> 3;
unk_40 = (proc->unk_40 / 8) & 0xff;
x = (proc->bg_x & 0xfff) >> 3;
bg_y = (proc->bg_y / 8) & 0xff;
ptr = sub_8014E74(0, 1);
r6 = unk_40;
ptr = GetBgVerticalScrollBuffer(0, true);
angle = bg_y;
for (i = 0; i < 0xA0; i++)
for (i = 0; i < DISPLAY_HEIGHT; i++)
{
int v = SIN(r6) / 0x300;
int v = SIN(angle) / 0x300;
ptr[i] = (v + x) & 0x1ff;
r6 += 0xC;
angle += 12;
}
BG_SetPosition(2, x, unk_40);
BG_SetPosition(BG_2, x, bg_y);
sub_8014EA8();
return;
FlipBgVerticalScroll();
}
//! FE8U = 0x080AAA6C
void SaveDraw_OnEnd(void)
{
sub_8014E3C();
EndBgVerticalScroll();
return;
}
@ -359,15 +357,15 @@ void SaveDraw_Init(struct SaveDrawProc * proc)
}
proc->unk_3c = SAVE_MENU_PARENT(proc)->sus_slot;
proc->unk_40 = 0;
proc->unk_3e = 0;
proc->bg_y = 0;
proc->bg_x = 0;
sub_8014DA8(EWRAM_ENTRY);
sub_8014EC4(0, (void *)REG_ADDR_BG2HOFS);
StartBgVerticalScroll(EWRAM_ENTRY);
SetBgVerticalScrollPosition(0, (void *)REG_ADDR_BG2HOFS);
sub_8014EF4(0);
sub_80AA9D8(proc);
gUnknown_03004990->unk_79E = true;
SaveDraw_ScrollFogBG(proc);
gpBgVerticalScrollSt->scroll_en = true;
sub_80AB548();
@ -668,7 +666,7 @@ void SaveDraw_Loop_Main(struct SaveDrawProc * proc)
sub_80AACBC(proc);
}
sub_80AA9D8(proc);
SaveDraw_ScrollFogBG(proc);
sub_80AB56C(proc->unk_2a);
}
@ -929,24 +927,24 @@ void sub_80AB56C(u32 a) {
//! FE8U = 0x080AB720
void sub_80AB720(struct SaveDrawProc * proc)
{
proc->unk_40 = 0;
proc->unk_3e = 0;
proc->bg_y = 0;
proc->bg_x = 0;
sub_8014EC4(0, (void *)REG_ADDR_BG2HOFS);
SetBgVerticalScrollPosition(0, (void *)REG_ADDR_BG2HOFS);
sub_8014EF4(0);
sub_80AA9D8(proc);
SaveDraw_ScrollFogBG(proc);
gUnknown_03004990->unk_79E = true;
gpBgVerticalScrollSt->scroll_en = true;
return;
}
struct ProcCmd CONST_DATA gProcScr_08A206F8[] = {
PROC_SET_END_CB(sub_8014E3C),
PROC_SET_END_CB(EndBgVerticalScroll),
PROC_SLEEP(0),
PROC_CALL(sub_80AB720),
PROC_REPEAT(sub_80AA9D8),
PROC_REPEAT(SaveDraw_ScrollFogBG),
PROC_END,
};
@ -954,7 +952,7 @@ struct ProcCmd CONST_DATA gProcScr_08A206F8[] = {
//! FE8U = 0x080AB760
void sub_80AB760(void* unused) {
Proc_Start(gProcScr_08A206F8, PROC_TREE_3);
sub_8014DA8(EWRAM_ENTRY);
StartBgVerticalScroll(EWRAM_ENTRY);
return;
}

View File

@ -112,7 +112,7 @@
. = 0x004960; gUnknown_03004960 = .;
. = 0x004970; gSpriteAllocIt = .;
. = 0x004980; gFaces = .;
. = 0x004990; gUnknown_03004990 = .;
. = 0x004990; gpBgVerticalScrollSt = .;
. = 0x0049A0; gWorkingBmMap = .;
. = 0x0049B0; gMovMapFillStPool1 = .;
. = 0x004BB0; gWorkingTerrainMoveCosts = .;