more work on subgame_loader

This commit is contained in:
Oliver Bell committed 2023-05-13 01:22:16 +01:00
1 parent 1a25d59c82
commit f30b7356ce
10 files changed
+186 -201

No files matched your search

+2 -1
View File
@@ -199,7 +199,8 @@
"mystery_item_box.h": "c",
"stage_palette_loader.h": "c",
"093.h": "c",
"flying_handle.h": "c"
"flying_handle.h": "c",
"loader_tables.h": "c"
},
"asm-code-lens.donated": true,
"editor.formatOnSave": true,
@@ -5,76 +5,72 @@
.arm
_entry:
mov r0, #0x12
mov r0, #PSR_IRQ_MODE
msr cpsr_fc, r0
ldr sp, _0203B038 @ =gUnknown_03007FA0
mov r0, #0x1f
ldr sp, sp_irq
mov r0, #PSR_SYS_MODE
msr cpsr_fc, r0
ldr sp, _0203B034 @ =gUnknown_03007F00
ldr r1, _0203B100 @ =gUnknown_03007FFC
add r0, pc, #0x18 @ =IntrMain
ldr sp, sp_sys
ldr r1, =INTR_VECTOR
adr r0, IntrMain
str r0, [r1]
ldr r1, _0203B104 @ =AgbMain
ldr r1, =AgbMain
mov lr, pc
bx r1
b _entry
.align 2, 0
_0203B034: .4byte gUnknown_03007F00
_0203B038: .4byte gUnknown_03007FA0
sp_sys: .word IWRAM_END - 0x100
sp_irq: .word IWRAM_END - 0x60
arm_func_start IntrMain
IntrMain: @ 0x0203B03C
mov r3, #0x4000000
add r3, r3, #0x200
mov r3, REG_BASE
add r3, r3, #OFFSET_REG_IE
ldr r2, [r3]
and r1, r2, r2, lsr #16
mov r2, #0
ands r0, r1, #0x2000
_0203B054:
bne _0203B054
ands r0, r1, #0xc0
bne _0203B0EC
ands r0, r1, #INTR_FLAG_GAMEPAK
bne . @ spin
ands r0, r1, #INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #1
bne _0203B0EC
ands r0, r1, #INTR_FLAG_VBLANK
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #2
bne _0203B0EC
ands r0, r1, #INTR_FLAG_HBLANK
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #4
bne _0203B0EC
ands r0, r1, #INTR_FLAG_VCOUNT
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #8
bne _0203B0EC
ands r0, r1, #INTR_FLAG_TIMER0
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x10
bne _0203B0EC
ands r0, r1, #INTR_FLAG_TIMER1
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x20
bne _0203B0EC
ands r0, r1, #INTR_FLAG_TIMER2
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x100
bne _0203B0EC
ands r0, r1, #INTR_FLAG_DMA0
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x200
bne _0203B0EC
ands r0, r1, #INTR_FLAG_DMA1
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x400
bne _0203B0EC
ands r0, r1, #INTR_FLAG_DMA2
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x800
bne _0203B0EC
ands r0, r1, #INTR_FLAG_DMA3
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x1000
bne _0203B0EC
ands r0, r1, #INTR_FLAG_KEYPAD
bne IntrMain_FoundIntr
add r2, r2, #4
ands r0, r1, #0x2000
_0203B0EC:
ands r0, r1, #INTR_FLAG_GAMEPAK
IntrMain_FoundIntr:
strh r0, [r3, #2]
ldr r1, _0203B108 @ =gIntrTable
ldr r1, =gIntrTable
add r1, r1, r2
ldr r0, [r1]
bx r0
_0203B100: .4byte gUnknown_03007FFC
_0203B104: .4byte AgbMain
_0203B108: .4byte gIntrTable
@@ -1,16 +1,8 @@
.section .rodata
.global gIntrTableTemplate
gIntrTableTemplate:
.incbin "data/rom_data.bin", 0x00001208, 0x34
.global gUnknown_0203C23C
gUnknown_0203C23C:
.incbin "data/rom_data.bin", 0x0000123C, 0x44
.global gUnknown_0203C280
gUnknown_0203C280:
.incbin "data/rom_data.bin", 0x00001280, 0x224
.global gUnknown_0203c2a4
gUnknown_0203c2a4:
.incbin "data/rom_data.bin", 0x000012a4, 0x200
.global gUnknown_0203C4A4
gUnknown_0203C4A4:
@@ -86,9 +86,9 @@
// with for the calculation
#define GBA_FRAMES_PER_SECOND 60
// TODO: Find better place for this
typedef void (*HBlankFunc)(u8 vcount);
typedef void (*IntrFunc)(void);
typedef u32 (*SpriteUpdateFunc)(void);
#define PROGRAM_WORK_BUFFER ((void *)EWRAM_START + 0x20000)
#define RECV_BUFFER ((void *)EWRAM_START + 0x33000)
#endif // GUARD_GLOBAL_H
@@ -0,0 +1,23 @@
#ifndef GUARD_LOADER_TABLES_H
#define GUARD_LOADER_TABLES_H
#include "global.h"
extern void *const gUnknown_0203C280[];
extern const u8 gUnknown_0203EBC0[];
extern const u8 gUnknown_0203EDC0[];
struct UNK_203F260 {
u8 filler4[0x3C];
}; /* 0x3C */
struct UNK_203E844 {
u8 filler4[0x30];
}; /* 0x3C */
extern const struct UNK_203F260 gUnknown_0203F260[];
extern const u8 gUnknown_0203C4A4[];
extern const struct UNK_203E844 gUnknown_0203E844[];
#endif // GUARD_LOADER_TABLES_H
@@ -22,6 +22,10 @@ SECTIONS {
.rodata :
ALIGN(4) {
build/payload/src/main.o(.rodata);
build/payload/src/multi_sio.o(.rodata);
build/payload/src/sio32_multi_load.o(.rodata);
build/payload/src/loader_tables.o(.rodata);
build/payload/data/data.o(.rodata);
}
@@ -29,20 +33,9 @@ SECTIONS {
IWRAM (NOLOAD) :
ALIGN(4)
{
. = 0x00000000; gIntrTable = .;
. = 0x00000040; gMultiSioRecv = .;
. = 0x00000090; gMultiSioStatusFlags = .;
. = 0x000000A0; gIntrMainBuf = .;
. = 0x000004A0; gMultiSioSend = .;
. = 0x000004A2; gUnknown_030004A2 = .;
. = 0x000004C0; gMultiSioIntrFuncBuf = .;
. = 0x000005E0; gMultiSioArea = .;
. = 0x000007D0; gMultiSioRecvFuncBuf = .;
. = 0x00000810; gSio32MultiLoadArea = .;
. = 0x00007F00; gUnknown_03007F00 = .;
. = 0x00007FA0; gUnknown_03007FA0 = .;
. = 0x00007FFA; gUnknown_03007FFA = .;
. = 0x00007FFC; gUnknown_03007FFC = .;
build/payload/src/main.o(.data);
build/payload/src/multi_sio.o(.data);
build/payload/src/sio32_multi_load.o(COMMON);
}
/* DWARF debug sections.
@@ -0,0 +1,10 @@
#include "global.h"
#include "loader_tables.h"
#define UNKNOWN_BUF_1 ((void *)EWRAM_START + 0x28000)
#define UNKNOWN_BUF_2 ((void *)EWRAM_START + 0x30000)
void *const gUnknown_0203C280[] = {
PROGRAM_WORK_BUFFER, UNKNOWN_BUF_1, UNKNOWN_BUF_2, PROGRAM_WORK_BUFFER, RECV_BUFFER,
RECV_BUFFER, RECV_BUFFER, RECV_BUFFER, RECV_BUFFER,
};
@@ -1,27 +1,61 @@
#include "global.h"
#include "multi_sio.h"
#include "sio32_multi_load.h"
#include "loader_tables.h"
extern IntrFunc gIntrTable[];
typedef struct {
u32 unk0;
u32 unk4;
u16 unk8;
u16 state;
u8 *resp;
u16 segment;
u8 unk12;
u8 unk13;
u8 unk14;
u8 loadRequest;
u8 unk16;
} Loader; /* size 0x18 */
struct UNK_0203C280 {
void *unk0;
struct MultiSioData_0_0 {
// id
u16 unk0;
// value
u8 unk2;
u8 filler[17];
};
extern const struct UNK_0203C280 gUnknown_0203C280[];
union MultiSioData {
struct MultiSioData_0_0 pat0;
}; /* size = MULTI_SIO_BLOCK_SIZE */
#define PROGRAM_WORK_BUFFER ((void *)EWRAM_START + 0x20000)
#define RECV_BUFFER ((void *)EWRAM_START + 0x33000)
// .data
IntrFunc gIntrTable[16] = {};
union MultiSioData gMultiSioRecv[4] = {};
u32 gMultiSioStatusFlags = 0;
u8 gIntrMainBuf[0x400] ALIGNED(16) = {};
union MultiSioData gMultiSioSend = {};
void LoaderInit(Loader *);
static u16 sub_0203b2f0(u16, Loader *);
static u16 sub_0203b79c(u16, Loader *);
static u16 sub_0203b7d0(u16, Loader *);
static u16 sub_0203b3d8(u16, Loader *);
static u16 sub_0203b818(u16, Loader *);
static void sub_0203b898(Loader *);
static void sub_0203b610(Loader *);
static void sub_0203b86c(Loader *loader);
static void sub_0203b788(void);
static void sub_0203b798(void);
#define ROM_MAKER_CODE_ADDR ((vu8 *)(ROM_BASE + 0xB2))
#define ROM_GAME_CODE_ADDR ((vu32 *)(ROM_BASE + 0xAC))
#define ROM_TITLE_ADDR ((u8 *)(ROM_BASE + 0xA0))
// 8P
#define DIMPS_MAKER_CODE 0x96
#define ROM_GAME_CODE_ADDR ((vu32 *)(ROM_BASE + 0xAC))
#define ROM_TITLE_ADDR ((u8 *)(ROM_BASE + 0xA0))
#ifndef EUROPE
// "A2NE"
#define EXPECTED_GAME_CODE 0x454e3241
@@ -30,37 +64,22 @@ extern const struct UNK_0203C280 gUnknown_0203C280[];
#define EXPECTED_GAME_CODE 0x504e3241
#endif
u32 gMultiSioStatusFlags;
typedef struct {
u8 unk0;
u8 filler1[0x29];
} LoaderUnkC; /* size 0x30 */
extern LoaderUnkC gUnknown_030004A2;
typedef struct {
u32 unk0;
u32 unk4;
u16 unk8;
u16 unkA; // state
LoaderUnkC *unkC;
u16 unk10;
u8 unk12;
u8 unk13;
u8 unk14;
u8 unk15; // loadRequest
u8 unk16;
} Loader; /* size 0x18 */
void LoaderInit(Loader *);
u16 sub_0203b2f0(u16, Loader *);
u16 sub_0203b79c(u16, Loader *);
u16 sub_0203b7d0(u16, Loader *);
u16 sub_0203b3d8(u16, Loader *);
u16 sub_0203b818(u16, Loader *);
void sub_0203b898(Loader *);
void sub_0203b610(Loader *);
// .rodata
IntrFunc const gIntrTableTemplate[13] = {
(void *)gMultiSioIntrFuncBuf,
sub_0203b788,
sub_0203b798,
sub_0203b798,
sub_0203b798,
sub_0203b798,
sub_0203b798,
sub_0203b798,
sub_0203b798,
NULL,
NULL,
NULL,
NULL,
};
void AgbMain()
{
@@ -69,42 +88,42 @@ void AgbMain()
while (TRUE) {
VBlankIntrWait();
switch (loader.unkA) {
switch (loader.state) {
case 0:
case 1:
loader.unkA = sub_0203b2f0(loader.unkA, &loader);
loader.state = sub_0203b2f0(loader.state, &loader);
break;
case 2:
loader.unkA = sub_0203b79c(loader.unkA, &loader);
loader.state = sub_0203b79c(loader.state, &loader);
case 3:
loader.unkA = sub_0203b7d0(loader.unkA, &loader);
loader.state = sub_0203b7d0(loader.state, &loader);
break;
case 4:
loader.unkA = sub_0203b3d8(loader.unkA, &loader);
loader.state = sub_0203b3d8(loader.state, &loader);
break;
case 5:
loader.unkA = sub_0203b818(loader.unkA, &loader);
loader.state = sub_0203b818(loader.state, &loader);
}
sub_0203b898(&loader);
}
}
u16 sub_0203b2f0(u16 state, Loader *loader)
static u16 sub_0203b2f0(u16 state, Loader *loader)
{
REG_IME = 0;
REG_IE &= ~0xC0;
REG_IME = 1;
gIntrTable[0] = (void *)gMultiSioIntrFuncBuf;
MultiSioInit((gMultiSioStatusFlags & MULTI_SIO_ALL_CONNECTED) >> 8);
loader->unk15 = 0;
loader->loadRequest = 0;
gMultiSioStatusFlags = 0;
if (state == 0) {
state = 3;
} else {
state = 2;
switch (loader->unk10) {
switch (loader->segment) {
case 2:
// When rom has been received, copy into EWRAM
LZ77UnCompWram(PROGRAM_WORK_BUFFER, (void *)EWRAM_START);
@@ -117,7 +136,7 @@ u16 sub_0203b2f0(u16 state, Loader *loader)
case 5:
case 6:
// When this segment has been received, decompress into work buffer
if (loader->unk14 == loader->unk10 - 3) {
if (loader->unk14 == loader->segment - 3) {
LZ77UnCompWram(RECV_BUFFER, PROGRAM_WORK_BUFFER);
}
break;
@@ -131,21 +150,16 @@ u16 sub_0203b2f0(u16 state, Loader *loader)
return state;
}
extern const u8 gUnknown_0203C23C[];
u16 sub_0203b3d8(u16 state, Loader *loader)
static u16 sub_0203b3d8(u16 state, Loader *loader)
{
u8 *actualTitle = ROM_TITLE_ADDR;
// TODO: change to direct string (which moves it to rodata automatically)
// "SONICADVANC2"
u8 expectedTitle[13];
memcpy(expectedTitle, gUnknown_0203C23C, 13);
u8 expectedTitle[] = "SONICADVANC2";
loader->unk14 = SIO_MULTI_CNT->id;
loader->unk12 = 1;
MultiSioStop();
if (loader->unk10 == 9) {
if (loader->segment == 9) {
REG_DISPCNT = 0;
if (*ROM_MAKER_CODE_ADDR == DIMPS_MAKER_CODE
@@ -156,7 +170,7 @@ u16 sub_0203b3d8(u16 state, Loader *loader)
break;
}
}
// Shouldn't this be < 12
if (i == 12) {
SoftResetRom(0xC0);
}
@@ -179,47 +193,23 @@ u16 sub_0203b3d8(u16 state, Loader *loader)
REG_IE &= ~0xC0;
REG_IME = 1;
gIntrTable[0] = Sio32MultiLoadIntr;
Sio32MultiLoadInit(0, gUnknown_0203C280[loader->unk10].unk0);
Sio32MultiLoadInit(0, gUnknown_0203C280[loader->segment]);
sub_0203b610(loader);
return 5;
}
struct MultiSioData_0_0 {
// id
u16 unk0;
// value
u8 unk2;
u32 unk4;
u16 unk8[3];
u8 unkE;
u8 unkF;
u32 unk10;
};
union MultiSioData {
struct MultiSioData_0_0 pat0;
}; /* size = MULTI_SIO_BLOCK_SIZE */
union MultiSioData gMultiSioSend;
union MultiSioData gMultiSioRecv[4];
extern const IntrFunc gIntrTableTemplate[13];
extern u8 gIntrMainBuf[0x400];
void LoaderInit(Loader *loader)
{
loader->unk0 = 0;
loader->unk4 = 0;
loader->unk8 = 0;
loader->unkA = 0;
loader->unkC = &gUnknown_030004A2;
loader->unk10 = 0;
loader->state = 0;
loader->resp = &gMultiSioSend.pat0.unk2;
loader->segment = 0;
loader->unk12 = 0;
loader->unk13 = 0;
loader->unk14 = 0;
loader->unk15 = 0;
loader->loadRequest = 0;
loader->unk16 = 0;
RegisterRamReset(2);
@@ -240,23 +230,7 @@ void LoaderInit(Loader *loader)
gMultiSioSend.pat0.unk0 = 0xF001;
}
extern const u8 gUnknown_0203EBC0[];
extern const u8 gUnknown_0203EDC0[];
struct UNK_203F260 {
u8 filler4[0x3C];
}; /* 0x3C */
struct UNK_203E844 {
u8 filler4[0x30];
}; /* 0x3C */
extern const struct UNK_203F260 gUnknown_0203F260[];
extern const u8 gUnknown_0203C4A4[];
extern const struct UNK_203E844 gUnknown_0203E844[];
void sub_0203b610(Loader *loader)
static void sub_0203b610(Loader *loader)
{
u16 i;
if (loader->unk16 == 0) {
@@ -300,15 +274,15 @@ void sub_0203b610(Loader *loader)
}
}
void sub_0203b788(void) { INTR_CHECK |= 1; }
static void sub_0203b788(void) { INTR_CHECK |= 1; }
void sub_0203b798(void) { }
static void sub_0203b798(void) { }
u16 sub_0203b79c(u16 state, Loader *loader)
static u16 sub_0203b79c(u16 state, Loader *loader)
{
if (gMultiSioStatusFlags & MULTI_SIO_LD_ENABLE) {
if (gMultiSioStatusFlags & MULTI_SIO_LD_SUCCESS) {
loader->unkC->unk0++;
(*loader->resp)++;
}
state = 3;
}
@@ -318,26 +292,23 @@ u16 sub_0203b79c(u16 state, Loader *loader)
return state;
}
extern u16 gUnknown_03000040[];
u16 sub_0203b7d0(u16 state, Loader *loader)
static u16 sub_0203b7d0(u16 state, Loader *loader)
{
if (gMultiSioStatusFlags & MULTI_SIO_LD_REQUEST) {
state = 4;
}
gMultiSioStatusFlags = MultiSioMain(&gMultiSioSend, gMultiSioRecv, loader->unk15);
gMultiSioStatusFlags
= MultiSioMain(&gMultiSioSend, gMultiSioRecv, loader->loadRequest);
loader->unk13 = gMultiSioRecv[0].pat0.unk0;
if (loader->unk10 != gMultiSioRecv[0].pat0.unk2) {
loader->unk10 = gMultiSioRecv[0].pat0.unk2;
if (loader->segment != gMultiSioRecv[0].pat0.unk2) {
loader->segment = gMultiSioRecv[0].pat0.unk2;
}
return state;
}
void sub_0203b86c(Loader *loader);
u16 sub_0203b818(u16 state, Loader *loader)
static u16 sub_0203b818(u16 state, Loader *loader)
{
u32 progress = 0;
@@ -359,13 +330,13 @@ u16 sub_0203b818(u16 state, Loader *loader)
return state;
}
void sub_0203b86c(Loader *loader)
static void sub_0203b86c(Loader *loader)
{
u8 val = (loader->unk0 * 0xA0) / 0x12000;
REG_WIN1H = (val + 0x28) | 0x2800;
}
void sub_0203b898(Loader *loader)
static void sub_0203b898(Loader *loader)
{
if (loader->unk12 != 0) {
REG_DISPCNT = 0x6300;
@@ -5,16 +5,15 @@
static const char sMultiSioLibVer[] = "MultiSio4Sio32Load010528";
#ifdef MULTI_SIO_DI_FUNC_FAST
u32 gMultiSioIntrFuncBuf[0x120 / 4] = {}; // Interrupt Routine RAM Execution Buffer
u32 gMultiSioIntrFuncBuf[0x120 / 4] ALIGNED(16)
= {}; // Interrupt Routine RAM Execution Buffer
#endif
struct MultiSioArea gMultiSioArea = {};
UNUSED u32 gUnusedMultiSioSpace[2] = {};
#ifdef MULTI_SIO_DI_FUNC_FAST
u32 gMultiSioRecvFuncBuf[0x40 / 4]
= {}; // Receive Data/Check Buffer Change Routine RAM Execution Buffer
u32 gMultiSioRecvFuncBuf[0x40 / 4] ALIGNED(16) = {}; // Receive Data/Check Buffer Change
// Routine RAM Execution Buffer
#endif
/*------------------------------------------------------------------*/
@@ -2,7 +2,7 @@
#include "global.h"
// static const char sMultiSioLibVer[] = "Sio32MultiLoad010214";
static const char sMultiSioLibVer[] = "Sio32MultiLoad010214";
// COMMON
struct Sio32MultiLoadArea gSio32MultiLoadArea; // 32bit serial communication