chao_garden: more code, split input(?) code

This commit is contained in:
Oliver Bell committed 2025-12-23 19:28:20 +00:00
1 parent 293787148b
commit 0383c80539
11 files changed
+693 -1194

No files matched your search

+131 -1148
View File
File diff suppressed because it is too large. Load diff
+102
View File
@@ -0,0 +1,102 @@
.include "../asm/macros/function.inc"
.include "../constants/gba_constants.inc"
.syntax unified
.arm
thumb_func_start sub_02000bd0
sub_02000bd0: @ 0x02000bd0
push {r4, r5, r6, lr}
ldr r1, _02000C40 @ =gUnknown_030043F0
ldrh r5, [r1]
ldrh r6, [r1, #2]
ldr r0, _02000C44 @ =0x04000130
ldrh r2, [r0]
movs r3, #0xfc
lsls r3, r3, #8
adds r0, r3, #0
orrs r0, r2
strh r0, [r1, #2]
mvns r2, r0
strh r2, [r1]
ldr r0, _02000C48 @ =gUnknown_03003330
ldrb r1, [r0, #0xf]
movs r0, #0x40
ands r0, r1
lsls r0, r0, #0x18
lsrs r4, r0, #0x18
cmp r4, #0
bne _02000C20
movs r0, #0xf
ands r2, r0
cmp r2, #0xf
bne _02000C20
bl m4aMPlayAllStop
bl m4aSoundMain
bl VBlankIntrWait
bl m4aSoundVSyncOff
ldr r0, _02000C4C @ =0x04000208
strh r4, [r0]
subs r0, #8
strh r4, [r0]
movs r0, #0x20
bl SoftResetRom
_02000C20:
ldr r1, _02000C40 @ =gUnknown_030043F0
ldrh r2, [r1]
ands r6, r2
movs r3, #0
strh r6, [r1, #4]
lsls r0, r2, #0x10
lsrs r0, r0, #0x10
cmp r0, #0
beq _02000C5C
cmp r0, r5
bls _02000C50
eors r5, r2
strh r5, [r1, #6]
ldrb r0, [r1, #9]
b _02000C64
.align 2, 0
_02000C40: .4byte gUnknown_030043F0
_02000C44: .4byte 0x04000130
_02000C48: .4byte gUnknown_03003330
_02000C4C: .4byte 0x04000208
_02000C50:
ldrb r0, [r1, #8]
subs r0, #1
strb r0, [r1, #8]
lsls r0, r0, #0x18
cmp r0, #0
beq _02000C60
_02000C5C:
strh r3, [r1, #6]
b _02000C66
_02000C60:
strh r2, [r1, #6]
ldrb r0, [r1, #0xa]
_02000C64:
strb r0, [r1, #8]
_02000C66:
pop {r4, r5, r6}
pop {r0}
bx r0
thumb_func_start sub_02000c6c
sub_02000c6c: @ 0x02000c6c
ldr r1, _02000C88 @ =gUnknown_030043F0
movs r0, #0
strh r0, [r1, #6]
strh r0, [r1, #4]
strh r0, [r1]
ldr r0, _02000C8C @ =0x0000FFFF
strh r0, [r1, #2]
movs r0, #0xf
strb r0, [r1, #9]
strb r0, [r1, #8]
movs r0, #7
strb r0, [r1, #0xa]
bx lr
.align 2, 0
_02000C88: .4byte gUnknown_030043F0
_02000C8C: .4byte 0x0000FFFF
@@ -0,0 +1,39 @@
.syntax unified
.text
push {lr}
ldr r2, _02000474 @ =gUnknown_03003B88
movs r0, #0
movs r1, #0x50
cmp r0, r1
bhs _02000454
movs r3, #0
_0200044A:
strb r3, [r2]
adds r2, #1
adds r0, #1
cmp r0, r1
blo _0200044A
_02000454:
ldr r1, _02000478 @ =gUnknown_03003BD8
movs r2, #0xff
adds r0, r1, #0
adds r0, #0x11
_0200045C:
strb r2, [r0]
subs r0, #1
cmp r0, r1
bge _0200045C
bl sub_02008810
ldr r1, _0200047C @ =gGameState
str r0, [r1, #0x10]
movs r0, #0xff
strb r0, [r1, #0x1c]
pop {r0}
bx r0
.align 2, 0
_02000474: .4byte gUnknown_03003B88
_02000478: .4byte gUnknown_03003BD8
_0200047C: .4byte gGameState
.syntax divided
+4
View File
@@ -489,6 +489,10 @@
#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
#define REG_JOYCNT (*(vu16 *)REG_ADDR_JOYCNT)
#define REG_JOYSTAT (*(vu16 *)REG_ADDR_JOYSTAT)
#define REG_JOY_RECV (*(vu32 *)REG_ADDR_JOY_RECV)
#define REG_JOY_TRANS (*(vu32 *)REG_ADDR_JOY_TRANS)
#define REG_IME (*(vu16 *)REG_ADDR_IME)
#define REG_IE (*(vu16 *)REG_ADDR_IE)
+1 -1
View File
@@ -106,6 +106,7 @@ struct GameConfig {
extern struct GameConfig gUnknown_02000008;
struct UNK_03003330 {
// Main
void (*unk0)(void);
u32 filler4;
u32 unk8;
@@ -120,7 +121,6 @@ extern struct UNK_03003330 gUnknown_03003330;
extern u8 gSaveSectorNum;
extern u32 gSaveVersion;
extern u8 gUnknown_03003BD8[2];
extern u32 gUnknown_03005274;
// These should be moved once we know
+3 -2
View File
@@ -22,7 +22,8 @@ struct TCG_SaveSectorData {
u8 unk1E;
u8 unk1F;
u8 unk20;
u8 filler21[0x38];
u8 filler21[0x37];
u8 unk58;
u8 unk59;
u8 filler[0xA];
u32 unk64;
@@ -31,7 +32,7 @@ struct TCG_SaveSectorData {
u8 pad[0x7EE];
}; /* size:0x858 according to LoadGameState */
extern struct TCG_SaveSectorData gUnknown_03003B80;
extern struct TCG_SaveSectorData gGameState;
void LoadGameState(void);
+6 -1
View File
@@ -182,7 +182,9 @@ SECTIONS {
. = 0x00003B60; gIntrTable = .;
. = 0x00003B70; gUnknown_03003B70 = .;
. = 0x00003B80; gUnknown_03003B80 = .;
/* japan this is all game state */
. = 0x00003B80; gGameState = .;
. = 0x00003B88; gUnknown_03003B88 = .;
. = 0x00003BA1; gUnknown_03003BA1 = .;
. = 0x00003BB5; gUnknown_03003BB5 = .;
@@ -196,6 +198,7 @@ SECTIONS {
. = 0x00003C08; gUnknown_03003C08 = .;
. = 0x00003C10; gUnknown_03003C10 = .;
. = 0x00003C58; gUnknown_03003C58 = .;
. = 0x000043D8; gUnknown_030043D8 = .;
. = 0x000043DC; gUnknown_030043DC = .;
. = 0x000043E0; gUnknown_030043E0 = .;
@@ -238,6 +241,8 @@ SECTIONS {
build/mb_chao_garden/asm/crt0.o(.text);
build/mb_chao_garden/src/main.o(.text);
build/mb_chao_garden/src/save.o(.text);
build/mb_chao_garden/src/game.o(.text);
build/mb_chao_garden/asm/game.o(.text);
build/mb_chao_garden/asm/code.o(.text);
build/mb_chao_garden/asm/m4a0.o(.text);
build/mb_chao_garden/src/m4a.o(.text);
+359
View File
@@ -0,0 +1,359 @@
#include "global.h"
#include "m4a.h"
#include "save.h"
extern s32 gUnknown_030005A8;
extern s32 gUnknown_030005AC;
extern vu8 gUnknown_030005B0;
extern vu8 gUnknown_030005B1;
extern s32 gUnknown_030005BC;
extern vu8 gUnknown_030043D8;
extern vu8 gUnknown_030043DC;
extern vu8 gUnknown_030043E4;
extern vu8 gUnknown_030043E8;
extern vu8 gUnknown_030043EC;
extern u16 gUnknown_030043F0;
extern IntrFunc gUnknown_03000088;
extern u8 *gUnknown_030005B4;
extern u16 gUnknown_030005B8;
extern u16 gUnknown_030005BA;
// This could be gUnknown_03003330->unk20?
extern s8 gUnknown_03003350;
extern s32 gUnknown_030043E0;
s32 sub_02000988(s32);
s32 sub_02000a40(s32);
void sub_02000b0c(u32);
void sub_02000b64(u32);
void sub_02000bb0(void);
void sub_020006b8(void);
void sub_02000480(void)
{
REG_IME = 0;
REG_IE &= ~0x80;
REG_RCNT = 0xC000;
REG_JOYSTAT = 0;
// oops?
REG_JOY_RECV;
REG_JOY_TRANS = 0;
REG_JOYCNT = 0x47;
#if !PORTABLE
CpuCopy32(&sub_020006b8, &gUnknown_03000088, 0x520);
gIntrTable[0] = (void *)&gUnknown_03000088 + 1;
#else
gIntrTable[0] = sub_020006b8;
#endif
gUnknown_030043DC = 0;
gUnknown_030043EC = 0;
gUnknown_030005B1 = 0xA;
gUnknown_030043E8 = 0;
gUnknown_030043D8 = gUnknown_030043E4 = 0;
gUnknown_030005B0 = 0;
gUnknown_030005BC = 0;
gUnknown_030005A8 = (*(u8 *)0x080000AF << 0x18) | 0x4F5341;
gUnknown_030005AC = (*(u8 *)0x080000AF << 0x18) | 0x425347;
REG_IF = 0x80;
REG_IE |= 0x80;
REG_IME = 1;
}
void sub_02000590(void)
{
REG_IME = 0;
if (gUnknown_030005B1 < 10) {
gUnknown_030005B1++;
} else if (gUnknown_030043EC != 0) {
u32 before = REG_IME;
REG_IME = 0;
REG_RCNT = 0x8000;
REG_RCNT = 0xC000;
REG_JOYSTAT = 0;
REG_JOY_RECV;
REG_JOY_TRANS = 0;
REG_JOYCNT = 0x47;
gUnknown_030043DC = 0;
gUnknown_030043EC = 0;
gUnknown_030005B1 = 10;
gUnknown_030043E8 = 0;
gUnknown_030005B0 = 0;
gUnknown_030005BC = 0;
REG_IF = 0x80;
REG_IME = before;
} else if (gUnknown_030005B0 < 11) {
gUnknown_030005B0++;
} else {
u32 before = REG_IME;
REG_IME = 0;
REG_RCNT = 0x8000;
REG_RCNT = 0xC000;
REG_JOYSTAT = 0;
REG_JOY_RECV;
REG_JOY_TRANS = 0;
REG_JOYCNT = 0x47;
gUnknown_030043DC = 0;
gUnknown_030043EC = 0;
gUnknown_030005B1 = 10;
gUnknown_030043E8 = 0;
gUnknown_030005B0 = 0;
gUnknown_030005BC = 0;
REG_IF = 0x80;
REG_IME = before;
}
REG_IME = 1;
}
void sub_020006b8(void)
{
s32 r4;
u16 joyCnt;
joyCnt = REG_JOYCNT;
switch (gUnknown_030043DC) {
case 0:
default:
if ((joyCnt & 1)) {
sub_02000bb0();
gUnknown_030043DC += 1;
}
break;
case 1:
if (!(joyCnt & 4)) {
if ((joyCnt & 1)) {
sub_02000bb0();
} else {
gUnknown_030043DC = 0;
}
} else {
gUnknown_030043DC++;
}
break;
case 2:
if (joyCnt & 2) {
if (REG_JOY_RECV == gUnknown_030005AC) {
REG_JOYSTAT = 0x30;
gUnknown_030043DC++;
break;
}
gUnknown_030043DC = 0;
break;
}
if ((joyCnt & 1)) {
sub_02000bb0();
gUnknown_030043DC = 1;
} else {
gUnknown_030043DC = 0;
}
break;
case 3:
gUnknown_030043DC++;
break;
case 4:
if ((joyCnt & 4)) {
REG_JOY_TRANS = gUnknown_030005BC;
} else if ((2 & joyCnt)) {
r4 = REG_JOY_RECV;
if (r4 == 0x6F616843) {
gUnknown_030005B1 = 0;
gUnknown_030043EC = 1;
} else {
r4 = 0;
}
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
}
break;
case 5:;
if ((joyCnt & 4) != 0) {
REG_JOY_TRANS = gUnknown_030005BC;
break;
}
if ((2 & joyCnt)) {
r4 = REG_JOY_RECV;
if (r4 == 0x6F616843) {
u16 a;
gUnknown_030005B1 = 0;
gUnknown_030043E8 = 0;
a = gUnknown_030043F0;
r4 = ((0xFF00 & a) << 8) | 0x4B43 | ((a << 0x18));
} else if (r4 == 0x4F414843) {
u16 a;
gUnknown_030005B1 = 0;
gUnknown_030043E8 = 1;
a = gUnknown_030043F0;
r4 = ((0xFF00 & a) << 8) | 0x4B43 | ((a << 0x18));
} else {
if ((r4 & 0xFF) == 0x2A) {
sub_02000b0c(r4);
gUnknown_030043DC = 6;
} else if ((r4 & 0xFF) == 0x22) {
sub_02000b64(r4);
gUnknown_030043DC = 8;
} else {
r4 = 0;
}
}
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
}
break;
case 6:
if (!(joyCnt & 4)) {
if ((joyCnt & 2)) {
r4 = REG_JOY_RECV;
if (!(r4 & 0xFFFF)) {
r4 = sub_02000988(r4);
gUnknown_030043DC = 7;
} else if ((r4 & 0xFF) == 0x2A) {
sub_02000b0c(r4);
} else {
r4 = 0;
}
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
}
} else {
REG_JOY_TRANS = gUnknown_030005BC;
break;
}
break;
case 7:
if (!(joyCnt & 4)) {
if (joyCnt & 2) {
r4 = sub_02000988(REG_JOY_RECV);
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
}
} else {
REG_JOY_TRANS = gUnknown_030005BC;
break;
}
break;
case 8:
if (!(joyCnt & 4)) {
if (joyCnt & 2) {
r4 = REG_JOY_RECV;
if ((r4 & 0xFF) == 0x22) {
sub_02000b64(r4);
} else if ((r4 & 0xFF) == 0x26) {
r4 = sub_02000a40(r4);
gUnknown_030043DC = 9;
} else {
r4 = 0;
}
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
}
} else {
REG_JOY_TRANS = gUnknown_030005BC;
break;
}
break;
case 9:
if ((joyCnt & 4)) {
REG_JOY_TRANS = gUnknown_030005BC;
break;
}
if (joyCnt & 2) {
r4 = sub_02000a40(REG_JOY_RECV);
REG_JOY_TRANS = r4;
gUnknown_030005BC = r4;
break;
}
break;
}
gUnknown_030005B0 = 0;
REG_JOYCNT = joyCnt;
}
s32 sub_02000988(s32 in)
{
u32 ret = in;
if ((gUnknown_030005B8 == (gUnknown_030005BA + 1)) && (ret == 0x6F616843)) {
gUnknown_030005B1 = 0;
ret = ({
u16 a = gUnknown_030043F0;
((0xFF00 & a) << 8) | 0x4B43 | (a << 0x18);
});
gUnknown_030043DC = 5;
gUnknown_030043D8 = 2;
} else {
u16 r2 = ((ret & 0xff) << 8) | ((ret >> 8) & 0xff);
if ((r2 - gUnknown_030005BA) == 1) {
gUnknown_030005BA = r2;
gUnknown_030005B4 += 2;
}
if (r2 == gUnknown_030005BA) {
gUnknown_030005B1 = 0;
gUnknown_030005B4[0] = ret >> 0x10;
gUnknown_030005B4[1] = ret >> 0x18;
} else {
ret = 0;
}
}
return ret;
}
s32 sub_02000a40(s32 in)
{
s32 ret = in;
if (gUnknown_030005B8 == (gUnknown_030005BA + 1) && gUnknown_030005BC == ret) {
gUnknown_030005B1 = 0;
ret = ({
u16 a = gUnknown_030043F0;
((0xFF00 & a) << 8) | 0x4B43 | (a << 0x18);
});
gUnknown_030043DC = 5;
gUnknown_030043E4 = 2;
} else {
if (gUnknown_030005BC == ret) {
gUnknown_030005B1 = 0;
gUnknown_030005BA += 1;
gUnknown_030005B4 += 2;
}
ret = (gUnknown_030005B4[0] << 0x10) | (gUnknown_030005B4[1] << 0x18) | ((u16)gUnknown_030005BA >> 8)
| ((0xFF & gUnknown_030005BA) << 8);
}
return ret;
}
void sub_02000af0(u8 p)
{
REG_IME = 0;
gUnknown_030043DC = p;
REG_IME = 1;
}
void sub_02000b0c(u32 arg0)
{
gUnknown_030005B1 = 0;
// This could be gUnknown_03003330->unk20?
gUnknown_030005B4 = &gUnknown_03003350;
gUnknown_030005B8 = ((arg0 >> 8) & 0xFF00) | (arg0 >> 0x18);
gUnknown_030005BA = 0;
gUnknown_030043E0 = gUnknown_030005B8 * 2;
gUnknown_030043D8 = 1;
}
void sub_02000b64(u32 p1)
{
gUnknown_030005B1 = 0;
gUnknown_030005B4 = &gGameState.unk58;
gUnknown_030005B8 = ((p1 >> 8) & 0xFF00) | (p1 >> 0x18);
gUnknown_030005BA = 0;
gUnknown_030043E4 = 1;
}
void sub_02000bb0(void)
{
REG_JOY_RECV;
REG_JOY_TRANS = gUnknown_030005A8;
REG_JOYSTAT = 0x20;
}
+47 -42
View File
@@ -27,16 +27,16 @@ void LoadGameState(void)
sector = -1;
for (i = 0; i < 6; i++) {
ReadFlash(i + 10, 0, &gUnknown_03003B80, sizeof(struct TCG_SaveSectorData));
if (gUnknown_03003B80.header.unk2 == 0x1965) {
u16 checksum = sub_0200185c((void *)&gUnknown_03003B80.header.unk2, sizeof(struct TCG_SaveSectorData) - sizeof(u16));
if (checksum == gUnknown_03003B80.header.checksum) {
ReadFlash(i + 10, 0, &gGameState, sizeof(struct TCG_SaveSectorData));
if (gGameState.header.unk2 == 0x1965) {
u16 checksum = sub_0200185c((void *)&gGameState.header.unk2, sizeof(struct TCG_SaveSectorData) - sizeof(u16));
if (checksum == gGameState.header.checksum) {
if (sector < 0) {
sector = i;
p = gUnknown_03003B80.header.unk4;
} else if (gUnknown_03003B80.header.unk4 > p) {
p = gGameState.header.unk4;
} else if (gGameState.header.unk4 > p) {
sector = i;
p = gUnknown_03003B80.header.unk4;
p = gGameState.header.unk4;
}
}
}
@@ -46,40 +46,39 @@ void LoadGameState(void)
gSaveSectorNum = TCG_SAVE_SECTOR_COUNT;
gSaveVersion = 0;
InitGameState();
gUnknown_03003B80.unk59 = 0;
gUnknown_03003B80.unk1F = 0x58;
gUnknown_03003B80.unk20 = 0x68;
gGameState.unk59 = 0;
gGameState.unk1F = 0x58;
gGameState.unk20 = 0x68;
} else {
gSaveSectorNum = sector;
gSaveVersion = p;
ReadFlash(gSaveSectorNum + TCG_FIRST_SAVE_SECTOR, 0, &gUnknown_03003B80, sizeof(struct TCG_SaveSectorData));
sub_02001528(gUnknown_03003B80.unk18);
ReadFlash(gSaveSectorNum + TCG_FIRST_SAVE_SECTOR, 0, &gGameState, sizeof(struct TCG_SaveSectorData));
sub_02001528(gGameState.unk18);
}
if (gUnknown_03003B80.unk8 >= gUnknown_02000008.unk0) {
gUnknown_03005274 = gUnknown_03003B80.unkC;
if (gGameState.unk8 >= gUnknown_02000008.unk0) {
gUnknown_03005274 = gGameState.unkC;
} else {
p = gUnknown_03003B80.unkC + (gUnknown_02000008.unk0 - gUnknown_03003B80.unk8);
p = gGameState.unkC + (gUnknown_02000008.unk0 - gGameState.unk8);
if (p > 0x1869F) {
p = 0x1869F;
}
gUnknown_03005274 = p;
gUnknown_03003B80.unk8 = gUnknown_02000008.unk0;
gGameState.unk8 = gUnknown_02000008.unk0;
}
gUnknown_03003B80.unk64 = (gUnknown_03005274 & 0xFF) << 24 | ((gUnknown_03005274 & 0xFF00) << 8) | (gUnknown_03005274 & 0xFF0000) >> 8
gGameState.unk64 = (gUnknown_03005274 & 0xFF) << 24 | ((gUnknown_03005274 & 0xFF00) << 8) | (gUnknown_03005274 & 0xFF0000) >> 8
| gUnknown_03005274 >> 24;
gUnknown_03003B80.unk68 = 0;
gGameState.unk68 = 0;
}
void SaveGameState(void)
{
s32 i;
gUnknown_03003B80.header.unk2 = 0x1965;
gGameState.header.unk2 = 0x1965;
gSaveVersion++;
gUnknown_03003B80.header.unk4 = gSaveVersion;
gUnknown_03003B80.unkC = gUnknown_03005274;
gUnknown_03003B80.unk18 = sub_0200151c();
gUnknown_03003B80.header.checksum
= sub_0200185c((void *)&gUnknown_03003B80.header.unk2, sizeof(struct TCG_SaveSectorData) - sizeof(u16));
gGameState.header.unk4 = gSaveVersion;
gGameState.unkC = gUnknown_03005274;
gGameState.unk18 = sub_0200151c();
gGameState.header.checksum = sub_0200185c((void *)&gGameState.header.unk2, sizeof(struct TCG_SaveSectorData) - sizeof(u16));
m4aMPlayAllStop();
m4aSoundMain();
VBlankIntrWait();
@@ -92,8 +91,7 @@ void SaveGameState(void)
gSaveSectorNum = 0;
}
failure = ProgramFlashSectorAndVerifyNBytes(gSaveSectorNum + TCG_FIRST_SAVE_SECTOR, &gUnknown_03003B80,
sizeof(struct TCG_SaveSectorData));
failure = ProgramFlashSectorAndVerifyNBytes(gSaveSectorNum + TCG_FIRST_SAVE_SECTOR, &gGameState, sizeof(struct TCG_SaveSectorData));
if (!failure) {
break;
@@ -103,20 +101,27 @@ void SaveGameState(void)
VBlankIntrWait();
}
// void InitGameState(void)
// {
// u32 i = 0;
// u8 *p = (u8*)&gUnknown_03003B80.unk8;
// u8 *p2;
// for (i = 0; i < 0x50; i++) {
// *p = 0;
// p++;
// }
NONMATCH("asm/non_matching/InitGameState.inc", void InitGameState(void))
{
u8 *p, *p2;
u32 r1, i;
p = (u8 *)(&gGameState.unk8);
// p2 = &gUnknown_03003B80.unk68;
// while ((u32)p2 < (u32)&gUnknown_03003B80 + sizeof(gUnknown_03003B80)) {
// p2 = 0;
// }
// gUnknown_03003B80.unk10 = sub_02008810();
// gUnknown_03003B80.unk1C = -1;
// }
i = 0;
r1 = 0x50;
for (i = 0; i < r1; i++) {
*p = 0;
p++;
}
p = (u8 *)&gGameState.unk58;
r1 = 0xFF;
p2 = p + 0x11;
do {
*p2-- = r1;
} while ((s32)p2 >= (s32)p);
gGameState.unk10 = sub_02008810();
gGameState.unk1C = 0xFF;
}
END_NONMATCH
+1
View File
@@ -1,2 +1,3 @@
epos
*.csv
entity_positions
Binary file not shown.