diff options
author | huderlem <huderlem@gmail.com> | 2019-08-13 17:23:23 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-13 17:23:23 -0500 |
commit | 5cbb66a6e5dd18d133e692a04e116aa3909d22ed (patch) | |
tree | c1ca88b5138d19eb5106f171c8ae77d4516e8b22 /src | |
parent | 4c8669a3aad601f1381ca9c67c78040ce80157df (diff) | |
parent | 0648ededb9161e9f5fc4e0a38ae91c7bf14e6c0b (diff) |
Merge pull request #8 from camthesaxman/decompile-options
decompile field_select.s and start decompiling options.s
Diffstat (limited to 'src')
-rw-r--r-- | src/field_select.c | 374 | ||||
-rwxr-xr-x | src/gbplayer.c | 3 | ||||
-rwxr-xr-x | src/main.c | 50 | ||||
-rw-r--r-- | src/options.c | 500 | ||||
-rw-r--r-- | src/rom_1068C.c | 10 | ||||
-rw-r--r-- | src/rom_528AC.c | 137 | ||||
-rwxr-xr-x | src/rom_850.c | 52 | ||||
-rwxr-xr-x | src/titlescreen.c | 6 | ||||
-rwxr-xr-x | src/util.c | 14 |
9 files changed, 998 insertions, 148 deletions
diff --git a/src/field_select.c b/src/field_select.c new file mode 100644 index 0000000..ea6acba --- /dev/null +++ b/src/field_select.c @@ -0,0 +1,374 @@ +#include "global.h" +#include "main.h" +#include "m4a.h" +#include "titlescreen.h" + +enum +{ + FIELD_RUBY, + FIELD_SAPPHIRE, +}; + +static void sub_8F94(void); +static void sub_8C38(void); + +struct FieldSelectData +{ + u16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + u16 selectedField; + u16 state; + s16 unkC; + s16 unkE; + u8 ballSpeed; + s16 unk12; + s8 unk14; + u16 nextMainState; +}; + +extern struct FieldSelectData gFieldSelectData; + +void FieldSelectMain(void) +{ + gFieldSelectStateFuncs[gMain.subState](); +} + +void LoadFieldSelectGraphics(void) +{ + ResetSomeGraphicsRelatedStuff(); + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_FORCED_BLANK | DISPCNT_OBJ_ON; + + REG_BG0CNT = BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(0) | BGCNT_PRIORITY(0) | BGCNT_TXT256x256; + REG_DISPCNT |= DISPCNT_BG0_ON; + + REG_BG1CNT = BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(1) | BGCNT_PRIORITY(1) | BGCNT_TXT256x256; + REG_DISPCNT |= DISPCNT_BG1_ON; + + REG_BG2CNT = BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(2) | BGCNT_PRIORITY(2) | BGCNT_TXT256x256; + REG_DISPCNT |= DISPCNT_BG2_ON; + + gMain.unk16 = REG_DISPCNT; + + DmaCopy16(3, gFieldSelectBGPals, (void *)(PLTT), 0x200); + DmaCopy16(3, gFieldSelectWindow_Gfx, (void *)(VRAM + 0x4000), 0x1400); + DmaCopy16(3, gFieldSelectMiniFields_Gfx, (void *)(VRAM + 0x8000), 0x3800); + DmaCopy16(3, gUnknown_080A2400, (void *)(VRAM), 0x800); + DmaCopy16(3, gFieldSelectFrameShadowTilemap, (void *)(VRAM + 0x800), 0x800); + DmaCopy16(3, gFieldSelectWindowTilemap, (void *)(VRAM + 0x1000), 0x800); + DmaCopy16(3, gFieldSelectSpritePals, (void *)(PLTT + 0x200), 0x200); + DmaCopy16(3, gFieldSelectSpriteGfx, (void *)(VRAM + 0x10000), 0x4020); + + sub_CBC(); + sub_8C38(); + sub_FD5C(sub_8F94); + gMain.subState++; + m4aSongNumStart(3); +} + +static void sub_8C38(void) +{ + gFieldSelectData.unk0 = 2; + gFieldSelectData.unk2 = 3; + gFieldSelectData.unk4 = 0; + gFieldSelectData.unk6 = 1; + gFieldSelectData.selectedField = FIELD_RUBY; + gFieldSelectData.state = 0; + gFieldSelectData.unkC = 0; + gFieldSelectData.unkE = 0; + gFieldSelectData.nextMainState = STATE_INTRO; + gFieldSelectData.unk12 = 0; + gFieldSelectData.unk14 = 0; + + gFieldSelectData.ballSpeed = gMain_saveData.ballSpeed; + gMain.unk4 = 0; + gUnknown_02002850 = 0; +} + +void sub_8C7C(void) +{ + sub_8F94(); + if ((gMain.heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON)) == (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON)) + { + gUnknown_02002850 = 1; + gFieldSelectData.nextMainState = STATE_INTRO; + gMain.subState++; + } + if (gUnknown_02002850 == 0) + { + switch (gFieldSelectData.state) + { + case 0: + if (gMain.newKeys & DPAD_LEFT) + { + if (gFieldSelectData.selectedField == FIELD_SAPPHIRE) + { + m4aSongNumStart(0x6D); + gFieldSelectData.selectedField = FIELD_RUBY; + gFieldSelectData.unk4 = 0; + gFieldSelectData.unk6 = 1; + gFieldSelectData.state = 1; + } + } + else if (gMain.newKeys & DPAD_RIGHT) + { + if (gFieldSelectData.selectedField == FIELD_RUBY) + { + m4aSongNumStart(0x6D); + gFieldSelectData.selectedField = FIELD_SAPPHIRE; + gFieldSelectData.unk4 = 1; + gFieldSelectData.unk6 = 0; + gFieldSelectData.state = 1; + } + } + if (gMain.newKeys & A_BUTTON) + { + m4aSongNumStart(0x65); + gFieldSelectData.state = 2; + gFieldSelectData.unk14 = 1; + gFieldSelectData.unkE = 0; + if (gFieldSelectData.selectedField == FIELD_RUBY) + { + gFieldSelectData.unk4 = 0; + gFieldSelectData.unk6 = 1; + gFieldSelectData.unk0 = 2; + gFieldSelectData.unk2 = 3; + gFieldSelectData.unkC = 0; + } + else + { + gFieldSelectData.unk4 = 1; + gFieldSelectData.unk6 = 0; + gFieldSelectData.unk0 = 7; + gFieldSelectData.unk2 = 11; + gFieldSelectData.unkC = 0; + } + } + if (gMain.newKeys & B_BUTTON) + { + m4aSongNumStart(0x66); + gMain.subState++; + gFieldSelectData.nextMainState = STATE_TITLE; + if (gFieldSelectData.selectedField == FIELD_RUBY) + { + gFieldSelectData.unk4 = 0; + gFieldSelectData.unk6 = 1; + gFieldSelectData.unk0 = 2; + gFieldSelectData.unk2 = 3; + gFieldSelectData.unkC = 0; + } + else + { + gFieldSelectData.unk4 = 1; + gFieldSelectData.unk6 = 0; + gFieldSelectData.unk0 = 7; + gFieldSelectData.unk2 = 11; + gFieldSelectData.unkC = 0; + } + } + if (gMain.unk4 < 2) + gMain.unk6 = 0; + else + gMain.unk6 = 1; + break; + case 2: // Choose ball speed + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + { + m4aSongNumStart(0x67); + gFieldSelectData.ballSpeed = 1 - gFieldSelectData.ballSpeed; + } + if (gMain.newKeys & A_BUTTON) + { + m4aSongNumStart(0x65); + gFieldSelectData.unkE = 0; + gFieldSelectData.unkC = 0; + gMain_saveData.ballSpeed = gFieldSelectData.ballSpeed; + SaveFile_WriteToSram(); + gFieldSelectData.state = 3; + } + if (gMain.newKeys & B_BUTTON) + { + m4aSongNumStart(0x66); + gFieldSelectData.unk14 = 0; + gFieldSelectData.state = 0; + } + gFieldSelectData.unkE++; + if (gFieldSelectData.unkE > 4) + { + gFieldSelectData.unkE = 0; + gFieldSelectData.unk12 = 1 - gFieldSelectData.unk12; + } + break; + case 1: + if (gFieldSelectData.selectedField == FIELD_RUBY) + { + gFieldSelectData.unk0 = gUnknown_086A6B14.unk0[4 - gFieldSelectData.unkC]; + gFieldSelectData.unk2 = gUnknown_086A6B14.unkA[4 - gFieldSelectData.unkC]; + } + else + { + gFieldSelectData.unk0 = gUnknown_086A6B14.unk0[gFieldSelectData.unkC]; + gFieldSelectData.unk2 = gUnknown_086A6B14.unkA[gFieldSelectData.unkC]; + } + if (!(gMain.frameCount & 1)) + { + if (gFieldSelectData.unkC < 4) + { + gFieldSelectData.unkC++; + } + else + { + gFieldSelectData.unkC = 0; + gFieldSelectData.state = 0; + } + } + if (gMain.newKeys & DPAD_LEFT) + { + if (gFieldSelectData.selectedField == FIELD_SAPPHIRE) + { + m4aSongNumStart(0x6D); + gFieldSelectData.selectedField = FIELD_RUBY; + gFieldSelectData.unk4 = 0; + gFieldSelectData.unk6 = 1; + gFieldSelectData.unk0 = 2; + gFieldSelectData.unk2 = 3; + gFieldSelectData.unkC = 0; + gFieldSelectData.state = 0; + } + } + else if (gMain.newKeys & DPAD_RIGHT) + { + if (gFieldSelectData.selectedField == FIELD_RUBY) + { + m4aSongNumStart(0x6D); + gFieldSelectData.selectedField = FIELD_SAPPHIRE; + gFieldSelectData.unk4 = 1; + gFieldSelectData.unk6 = 0; + gFieldSelectData.unk0 = 7; + gFieldSelectData.unk2 = 11; + gFieldSelectData.unkC = 0; + gFieldSelectData.state = 0; + } + } + break; + case 3: + gFieldSelectData.unkE++; + if (gFieldSelectData.unkE > 3) + { + gFieldSelectData.unkE = 0; + if (gFieldSelectData.selectedField == FIELD_RUBY) + gFieldSelectData.unk4 = 1 - gFieldSelectData.unk4; + else + gFieldSelectData.unk6 = 1 - gFieldSelectData.unk6; + gFieldSelectData.unkC++; + if (gFieldSelectData.unkC > 5) + { + gFieldSelectData.nextMainState = STATE_GAME_MAIN; + gMain.subState++; + } + } + break; + } + gMain.unk4 = gFieldSelectData.selectedField; + gMain.unk5 = gFieldSelectData.selectedField; + } +} + +void sub_8F64(void) +{ + sub_FE04(sub_8F94); + m4aMPlayAllStop(); + sub_D10(); + gAutoDisplayTitlescreenMenu = TRUE; + SetMainGameState(gFieldSelectData.nextMainState); +} + +static void sub_8F94(void) +{ + struct SpriteGroup *r6; + struct SpriteGroup *r9; + struct SpriteGroup *sp0; + struct SpriteGroup *r10; + struct SpriteGroup *r8; + const struct SpriteSet *spriteSet; + int i; + + gMain.blendControl = BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2; + gMain.blendAlpha = BLDALPHA_BLEND(8, 8); + REG_BLDCNT = gMain.blendControl; + REG_BLDALPHA = gMain.blendAlpha; + + r6 = &gMain.spriteGroups[0]; + r9 = &gMain.spriteGroups[1]; + sp0 = &gMain.spriteGroups[gFieldSelectData.unk0]; + r10 = &gMain.spriteGroups[gFieldSelectData.unk2]; + r8 = &gMain.spriteGroups[12 + gFieldSelectData.ballSpeed * 2 + gFieldSelectData.unk12]; + + r6->available = gFieldSelectData.unk4; + r9->available = gFieldSelectData.unk6; + sp0->available = 1; + r10->available = 1; + r8->available = gFieldSelectData.unk14; + + LoadSpriteSets(gUnknown_086A6AD4, 16, r6); + + if (gFieldSelectData.unk4 == 1) + { + r6->baseX = 0x25; + r6->baseY = 0x18; + for (i = 0; i < 2; i++) + { + gOamBuffer[r6->oam[i].oamId].x = r6->oam[i].xOffset + r6->baseX; + gOamBuffer[r6->oam[i].oamId].y = r6->oam[i].yOffset + r6->baseY; + } + } + + if (gFieldSelectData.unk6 == 1) + { + r9->baseX = 0x8D; + r9->baseY = 0x18; + for (i = 0; i < 2; i++) + { + gOamBuffer[r9->oam[i].oamId].x = r9->oam[i].xOffset + r9->baseX; + gOamBuffer[r9->oam[i].oamId].y = r9->oam[i].yOffset + r9->baseY; + } + } + + sp0->baseX = 32; + sp0->baseY = 32; + spriteSet = gUnknown_086A6AD4[gFieldSelectData.unk0]; + for (i = 0; i < spriteSet->count; i++) + { + gOamBuffer[sp0->oam[i].oamId].objMode = 1; + gOamBuffer[sp0->oam[i].oamId].x = sp0->oam[i].xOffset + sp0->baseX; + gOamBuffer[sp0->oam[i].oamId].y = sp0->oam[i].yOffset + sp0->baseY; + } + + r10->baseX = 0x88; + r10->baseY = 32; + spriteSet = gUnknown_086A6AD4[gFieldSelectData.unk2]; + for (i = 0; i < spriteSet->count; i++) + { + gOamBuffer[r10->oam[i].oamId].objMode = 1; + gOamBuffer[r10->oam[i].oamId].x = r10->oam[i].xOffset + r10->baseX; + gOamBuffer[r10->oam[i].oamId].y = r10->oam[i].yOffset + r10->baseY; + } + + if (r8->available == 1) + { + r8->baseX = gUnknown_086A6B28[gFieldSelectData.selectedField].x; + r8->baseY = gUnknown_086A6B28[gFieldSelectData.selectedField].y; + for (i = 0; i < 5; i++) + { + gOamBuffer[r8->oam[i].oamId].objMode = 0; + gOamBuffer[r8->oam[i].oamId].x = r8->oam[i].xOffset + r8->baseX; + gOamBuffer[r8->oam[i].oamId].y = r8->oam[i].yOffset + r8->baseY; + } + } + + sp0->available = 0; + r10->available = 0; + r8->available = 0; +} diff --git a/src/gbplayer.c b/src/gbplayer.c index c0d9655..412be7d 100755 --- a/src/gbplayer.c +++ b/src/gbplayer.c @@ -291,8 +291,7 @@ void sub_1198(void) void sub_11B0(int arg0) { - if (gUnknown_0200B134[0xCD]) - //if (gMain.saveData.unk141) + if (gMain_saveData.unk141) { gUnknown_02019BF8 = arg0; gUnknown_02019BFC = 0; @@ -3,7 +3,7 @@ #include "gbplayer.h" #include "m4a.h" -static void sub_B54(void); +static void InitGame(void); static void sub_B8C(void); static void InitIntrHandlers(void); static void ReadKeys(void); @@ -14,13 +14,13 @@ void AgbMain(void) InitIntrHandlers(); DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); INTR_VECTOR = IntrMain_Buffer; - sub_B54(); + InitGame(); InitGameBoyPlayer(); while (1) { ReadKeys(); gMainFuncs[gMain.mainState](); - sub_D74(); + MainLoopIter(); } } @@ -40,12 +40,12 @@ void sub_9BC_Main(void) default: sub_2B4(); sub_D10(); - SetMainGameState(1); + SetMainGameState(STATE_TITLE); break; } } -void HBlankIntr(void) +void VBlankIntr(void) { m4aSoundVSync(); INTR_CHECK |= INTR_FLAG_VBLANK; @@ -55,7 +55,7 @@ void VCountIntr(void) { INTR_CHECK |= INTR_FLAG_VCOUNT; while (!(REG_DISPSTAT & DISPSTAT_HBLANK)); - if (gMain.mainState == 2) + if (gMain.mainState == STATE_GAME_MAIN) { REG_BG0HOFS = 0; if (gMain.unk28) @@ -122,7 +122,7 @@ void IntrDummy(void) { } -static void sub_B54(void) +static void InitGame(void) { REG_WAITCNT = WAITCNT_AGB | WAITCNT_PREFETCH_ENABLE @@ -139,24 +139,24 @@ static void sub_B54(void) sub_B8C(); m4aSoundInit(); m4aSoundVSyncOff(); - sub_52A18(); + SaveFile_LoadGameData(); } static void sub_B8C(void) { - gMain.mainState = 0; + gMain.mainState = STATE_INTRO; gMain.subState = 0; gMain.unk16 = 0; gMain.heldKeys = 0; gMain.newKeys = 0; gMain.unk20 = 0; gMain.rngValue = 0; - gMain.unk4C = 0; + gMain.frameCount = 0; gMain.unk30 = 0; gMain.vCount = 144; gMain.unk2C = 0; - sub_1090C(); - sub_438(); + ClearSomeArray(); + ResetSomeGraphicsRelatedStuff(); } static void InitIntrHandlers(void) @@ -166,11 +166,11 @@ static void InitIntrHandlers(void) for (i = 0; i < INTR_COUNT; i++) gIntrTable[i] = gIntrTableTemplate[i]; - gUnknown_0200FB98 = &gIntrTable[2]; - gUnknown_02019BE0 = &gIntrTable[4]; - sub_8BC(); - sub_8FC(); - sub_940(); + gVBlankIntrFuncPtr = &gIntrTable[2]; + gVCountIntrFuncPtr = &gIntrTable[4]; + ResetMainCallback(); + ResetVBlankIntrFunc(); + ResetVCountIntrFunc(); } // The number 1103515245 comes from the example implementation of rand and srand @@ -320,18 +320,18 @@ void sub_D10(void) m4aSoundVSyncOff(); } -void sub_D74(void) +void MainLoopIter(void) { - gUnknown_0200FB9C = gUnknown_02017BD4; - *gUnknown_0200FB98 = gUnknown_02017BD0; - *gUnknown_02019BE0 = gUnknown_0200FBA0; - if (gUnknown_0200FB9C) - gUnknown_0200FB9C(); + gMainCallback = gUnknown_02017BD4; + *gVBlankIntrFuncPtr = gUnknown_02017BD0; + *gVCountIntrFuncPtr = gUnknown_0200FBA0; + if (gMainCallback) + gMainCallback(); - gMain.unk4C++; + gMain.frameCount++; } -void sub_DC4(void) +void DefaultMainCallback(void) { if (REG_DISPSTAT & DISPSTAT_VBLANK_INTR) { diff --git a/src/options.c b/src/options.c new file mode 100644 index 0000000..cd02b94 --- /dev/null +++ b/src/options.c @@ -0,0 +1,500 @@ +#include "global.h" +#include "m4a.h" +#include "main.h" +#include "titlescreen.h" + +struct OptionsData +{ + s16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + s16 unk8; + s16 unkA; + u16 unkC; + s16 unkE; + s16 unk10; + u8 unk12; + u8 unk13; + u8 unk14; + u8 unk15; + u8 unk16; + u8 unk17; + s16 unk18; + u8 unk1A[6]; + s16 unk20; + u16 unk22; + s16 unk24[2]; + u16 unk28; + u8 unk2A; + s8 unk2B; + s8 unk2C; + u8 unk2D; + s8 unk2E; + u8 unk2F; + u8 unk30; +}; + +extern struct OptionsData gOptionsData; + +void OptionsMain(void) +{ + gUnknown_08527F08[gMain.subState](); +} + +extern const u16 gUnknown_0852B468[]; +extern const u8 gUnknown_08528828[]; +extern const u8 gUnknown_0852A848[]; +extern const u8 gUnknown_08528028[]; +extern const u8 gUnknown_0852A048[]; + +void sub_51240(void) +{ + ResetSomeGraphicsRelatedStuff(); + + REG_DISPCNT = 0x1080; + REG_BG0CNT = 4; + REG_DISPCNT |= 0x100; + REG_BG1CNT = 0x109; + REG_DISPCNT |= 0x200; + + gMain.unk16 = REG_DISPCNT; + + DmaCopy16(3, gUnknown_0852B468, (void *)PLTT, 0x200); + DmaCopy16(3, gUnknown_08528828, (void *)(VRAM + 0x4000), 0x1800); + DmaCopy16(3, gUnknown_0852A848, (void *)(VRAM + 0x8000), 0xC00); + DmaCopy16(3, gUnknown_08528028, gUnknown_03005C00, 0x800); + DmaCopy16(3, gUnknown_03005C00, (void *)VRAM, 0x800); + + if (gGameBoyPlayerEnabled != 1) + { + sub_1068C(0x12, 4, 2, 1, 2); + sub_1068C(0x12, 5, 3, 2, 2); + } + + DmaCopy16(3, gUnknown_03005C00, (void *)VRAM, 0x800); + DmaCopy16(3, gUnknown_0852A048, (void *)(VRAM + 0x800), 0x800); + DmaCopy16(3, gGBAButtonIcons_Pals, (void *)(PLTT + 0x200), 0x60); + DmaCopy16(3, gOptionsSprites_Gfx, (void *)(VRAM + 0x10000), 0x2020); + sub_513B8(); + sub_51C9C(); + m4aMPlayAllStop(); + sub_CBC(); + sub_24C(); + sub_10C0(); + + gMain.subState++; +} + +void sub_513B8(void) +{ + int i; + int j; + + gOptionsData.unk0 = 0; + gOptionsData.unk2 = 0; + gOptionsData.unk4 = 0; + gOptionsData.unk6 = 1; + gOptionsData.unk8 = 0; + gOptionsData.unkA = 0; + gOptionsData.unkC = gMain_saveData.unk143; + gOptionsData.unkE = 0; + gOptionsData.unk10 = 0; + gOptionsData.unk12 = 0; + gOptionsData.unk13 = 0; + gOptionsData.unk14 = 1; + gOptionsData.unk15 = 0; + gOptionsData.unk16 = 0; + gOptionsData.unk17 = 1; + gOptionsData.unk18 = 0; + for (i = 0; i < 6; i++) + gOptionsData.unk1A[i] = 0; + gOptionsData.unk20 = 0; + gOptionsData.unk22 = 0; + for (i = 0; i < 2; i++) + gOptionsData.unk24[i] = 10; + gOptionsData.unk28 = 0; + for (i = 0; i < 4; i++) + { + for (j = 0; j < 10; j++) + gUnknown_02031AF0[i][j] = gUnknown_08527ED6[i][j]; + } + sub_52528(); + if (gGameBoyPlayerEnabled == 1) + { + gOptionsData.unk2A = gMain_saveData.unk141; + gMain_saveData.unk141 = 1; + } + else + { + gOptionsData.unk2A = 0; + gMain_saveData.unk141 = 0; + } + gOptionsData.unk2E = 0; + gOptionsData.unk2B = 0; + gOptionsData.unk2C = 0; + gOptionsData.unk2D = 0; + gOptionsData.unk2F = 0; + gOptionsData.unk30 = 0; +} + +void sub_514B8(void) +{ + s16 r4; + + sub_51C9C(); + switch (gOptionsData.unk0) + { + case 0: + if (gMain.newKeys & 0x40) + { + if (gOptionsData.unkA != 0xD) + { + if (gOptionsData.unkA == 0xE) + { + m4aSongNumStart(0x67); + gOptionsData.unkA = 0xD; + } + else if (gOptionsData.unkA > 0) + { + m4aSongNumStart(0x67); + gOptionsData.unkA--; + } + } + } + else if (gMain.newKeys & 0x80) + { + if (gOptionsData.unkA < 6) + { + m4aSongNumStart(0x67); + gOptionsData.unkA++; + } + else if (gOptionsData.unkA == 0xD) + { + m4aSongNumStart(0x67); + gOptionsData.unkA = 0xE; + } + else if (gOptionsData.unkA == 0xE) + { + m4aSongNumStart(0x67); + gOptionsData.unkA = 2; + } + } + if ((gMain.newKeys & 0x10) && gGameBoyPlayerEnabled == 1 && (u16)gOptionsData.unkA < 2) + { + m4aSongNumStart(0x67); + gOptionsData.unkA += 0xD; + } + if ((gMain.newKeys & 0x20) && gGameBoyPlayerEnabled == 1 && (u16)(gOptionsData.unkA - 13) < 2) + { + m4aSongNumStart(0x67); + gOptionsData.unkA -= 0xD; + } + if (gMain.newKeys & 1) + { + switch (gOptionsData.unkA) + { + case 0: + m4aSongNumStart(0x65); + gOptionsData.unk0 = 1; + gOptionsData.unk18 = 0; + gOptionsData.unk30 = 1; + if (gOptionsData.unk2E == 1) + { + gOptionsData.unk2B = 0; + gOptionsData.unk2D = 0; + gOptionsData.unk2C = 0; + gOptionsData.unk2E = 0; + } + break; + case 1: + m4aSongNumStart(0x65); + gOptionsData.unk0 = 2; + gOptionsData.unk18 = 0; + gOptionsData.unk30 = 1; + if (gOptionsData.unk2E == 1) + { + gOptionsData.unk2B = 0; + gOptionsData.unk2D = 0; + gOptionsData.unk2C = 0; + gOptionsData.unk2E = 0; + } + break; + case 2: + case 3: + case 4: + case 5: + m4aSongNumStart(0x65); + gOptionsData.unkC = gOptionsData.unkA - 2; + gMain_saveData.unk143 = gOptionsData.unkC; + break; + case 6: + m4aSongNumStart(0x65); + gOptionsData.unkC = gOptionsData.unkA - 2; + gMain_saveData.unk143 = gOptionsData.unkC; + gOptionsData.unkA = 7; + gOptionsData.unk0 = 3; + break; + case 14: + if (gGameBoyPlayerEnabled == 1) + { + m4aSongNumStart(0x65); + gOptionsData.unk2D = 0; + if (gOptionsData.unk2E == 1) + gOptionsData.unk2E = 0; + gOptionsData.unk2B = 0; + gOptionsData.unk2C = 0; + gOptionsData.unk2A = 0; + } + break; + case 13: + if (gGameBoyPlayerEnabled == 1) + { + m4aSongNumStart(0x65); + sub_11B0(11); + if (gOptionsData.unk2E == 0) + gOptionsData.unk2E = 1; + + gOptionsData.unk2B = 0; + gOptionsData.unk2C = 0; + gOptionsData.unk2A = 1; + } + break; + } + } + else if (gMain.newKeys & 2) + { + m4aSongNumStart(0x66); + gMain.subState++; + sub_525CC(gMain_saveData.unk143); + + } + if (!(gMain.frameCount & 7)) + gOptionsData.unk2 = 1 - gOptionsData.unk2; + break; + case 1: + if (gMain.heldKeys & 0x20) + { + if (gOptionsData.unk18 == 0) + { + gOptionsData.unkE--; + gOptionsData.unk18 = 10; + } + } + else if (gMain.heldKeys & 0x10) + { + if (gOptionsData.unk18 == 0) + { + gOptionsData.unkE++; + gOptionsData.unk18 = 10; + } + } + if (gMain.newKeys & 0x40) + gOptionsData.unkE += 10; + else if (gMain.newKeys & 0x80) + gOptionsData.unkE -= 10; + if (gOptionsData.unkE < 0) + gOptionsData.unkE = 33; + if (gOptionsData.unkE > 33) + gOptionsData.unkE = 0; + + r4 = gOptionsData.unkE + 1; + gOptionsData.unk12 = r4 / 100; + r4 %= 100; + gOptionsData.unk13 = r4 / 10; + gOptionsData.unk14 = r4 % 10; + if (gMain.newKeys & 1) + { + m4aMPlayAllStop(); + m4aSongNumStart(gUnknown_08527D22[gOptionsData.unkE]); + } + else if (gMain.newKeys & 2) + { + m4aMPlayAllStop(); + m4aSongNumStart(0x66); + gOptionsData.unk4 = 0; + gOptionsData.unk30 = 0; + gOptionsData.unk0 = 0; + } + if (!(gMain.frameCount & 7)) + gOptionsData.unk4 = 1 - gOptionsData.unk4; + if (gOptionsData.unk18 > 0) + gOptionsData.unk18--; + break; + case 2: + if (gMain.heldKeys & 0x20) + { + if (gOptionsData.unk18 == 0) + { + gOptionsData.unk10--; + gOptionsData.unk18 = 10; + } + } + else if (gMain.heldKeys & 0x10) + { + if (gOptionsData.unk18 == 0) + { + gOptionsData.unk10++; + gOptionsData.unk18 = 10; + } + } + if (gMain.newKeys & 0x40) + gOptionsData.unk10 += 10; + else if (gMain.newKeys & 0x80) + gOptionsData.unk10 -= 10; + if (gOptionsData.unk10 < 0) + gOptionsData.unk10 = 0xB7; + if (gOptionsData.unk10 > 0xB7) + gOptionsData.unk10 = 0; + + r4 = gOptionsData.unk10 + 1; + gOptionsData.unk15 = r4 / 100; + r4 %= 100; + gOptionsData.unk16 = r4 / 10; + gOptionsData.unk17 = r4 % 10; + if (gMain.newKeys & 0x1) + { + m4aMPlayAllStop(); + m4aSongNumStart(gUnknown_08527D66[gOptionsData.unk10]); + } + else if (gMain.newKeys & 0x2) + { + m4aMPlayAllStop(); + m4aSongNumStart(0x66); + gOptionsData.unk4 = 0; + gOptionsData.unk30 = 0; + gOptionsData.unk0 = 0; + } + if (!(gMain.frameCount & 7)) + gOptionsData.unk4 = 1 - gOptionsData.unk4; + if (gOptionsData.unk18 > 0) + gOptionsData.unk18--; + break; + case 3: + if (gMain.newKeys & 0x40) + { + if (gOptionsData.unkA > 7) + { + m4aSongNumStart(0x67); + gOptionsData.unkA--; + } + } + else if (gMain.newKeys & 0x80) + { + if (gOptionsData.unkA <= 10) + { + m4aSongNumStart(0x67); + gOptionsData.unkA++; + } + } + if (gMain.newKeys & 1) + { + m4aSongNumStart(0x65); + gOptionsData.unk0 = 4; + gOptionsData.unk1A[gOptionsData.unkA - 7] = 1; + } + else if (gMain.newKeys & 2) + { + m4aSongNumStart(0x66); + gOptionsData.unkA = 6; + gOptionsData.unk0 = 0; + } + if (!(gMain.frameCount & 7)) + gOptionsData.unk2 = 1 - gOptionsData.unk2; + break; + case 4: + gOptionsData.unk8++; + if (gOptionsData.unk8 > 24) + { + gOptionsData.unk8 = 0; + gOptionsData.unk6 = 1 - gOptionsData.unk6; + } + if (gMain.newKeys & 0x3F7) + { + s16 i; + + m4aSongNumStart(0x65); + gOptionsData.unk20 = 10; + gOptionsData.unk22 = 0; + for (i = 0; i < 2; i++) + gOptionsData.unk24[i] = 10; + gOptionsData.unk28 = 0; + } + //_08051B0E + if (gOptionsData.unk20 > 0) + { + sub_524BC(); + gOptionsData.unk20--; + if (gOptionsData.unk20 == 0) + { + gUnknown_02031AF0[4][(gOptionsData.unkA - 7) * 2 + 0] = gOptionsData.unk24[0]; + gUnknown_02031AF0[4][(gOptionsData.unkA - 7) * 2 + 1] = gOptionsData.unk24[1]; + gMain_saveData.unk144[(gOptionsData.unkA - 7)][0] = gUnknown_086BB910[gOptionsData.unk24[0]][0]; + gMain_saveData.unk144[(gOptionsData.unkA - 7)][1] = gUnknown_086BB910[gOptionsData.unk24[1]][0]; + gOptionsData.unk0 = 3; + gOptionsData.unk1A[gOptionsData.unkA - 7] = 0; + gOptionsData.unk8 = 0; + gOptionsData.unk6 = 1; + } + } + break; + } + //_08051B98 + if (gOptionsData.unk2E == 1) + { + //gOptionsData.unk2B++; + if (++gOptionsData.unk2B > gUnknown_086BB9B4[gOptionsData.unk2C].unk2) + { + gOptionsData.unk2B = 0; + gOptionsData.unk2C++; + if (gOptionsData.unk2C > 12) + { + gOptionsData.unk2C = 0; + gOptionsData.unk2D = 0; + gOptionsData.unk2E = 0; + } + //_08051BE8 + gOptionsData.unk2D = gUnknown_086BB9B4[gOptionsData.unk2C].unk0; + } + // _08051C30 + } + else + //_08051C10 + { + gOptionsData.unk2B++; + if (gOptionsData.unk2B > 18) + { + gOptionsData.unk2B = 0; + gOptionsData.unk2D = 1 - gOptionsData.unk2D; + } + } + sub_11FC(); +} + +void sub_51C3C(void) +{ + sub_111C(); + if (sub_1170() != 0) + { + sub_1198(); + gMain.subState++; + } +} + +void sub_51C60(void) +{ + gMain_saveData.unk141 = gOptionsData.unk2A; + SaveFile_WriteToSram(); + sub_2B4(); + m4aMPlayAllStop(); + sub_D10(); + gAutoDisplayTitlescreenMenu = 1; + SetMainGameState(STATE_TITLE); +} + +/* +void sub_51C9C(void) +{ + +} +*/ diff --git a/src/rom_1068C.c b/src/rom_1068C.c index 4a5e619..297f982 100644 --- a/src/rom_1068C.c +++ b/src/rom_1068C.c @@ -56,7 +56,7 @@ void sub_10798(void *a, void *b, void (*func)(void)) if (func != NULL) func(); sub_1001C(i); - sub_D74(); + MainLoopIter(); if (i == 32) { DmaCopy16(3, gUnknown_0201A920, (void *)PLTT, 0x400); @@ -81,7 +81,7 @@ void sub_10860(void (*func)(void)) if (func != NULL) func(); sub_1001C(i); - sub_D74(); + MainLoopIter(); if (i == 32) { DmaCopy16(3, gUnknown_0201A920, (void *)PLTT, 0x400); @@ -91,12 +91,12 @@ void sub_10860(void (*func)(void)) DmaCopy16(3, gUnknown_0201AD20, (void *)PLTT, 0x400); } } - sub_D74(); + MainLoopIter(); } #ifdef NONMATCHING // Like sub_C24, it matches except for that damn 'push {lr}/pop {lr}' -void sub_1090C(void) +void ClearSomeArray(void) { int i; @@ -105,7 +105,7 @@ void sub_1090C(void) } #else NAKED -void sub_1090C(void) +void ClearSomeArray(void) { asm_unified("\n\ ldr r1, _08010920 @ =gUnknown_0201A500\n\ diff --git a/src/rom_528AC.c b/src/rom_528AC.c index f1c7d5f..7abf1d9 100644 --- a/src/rom_528AC.c +++ b/src/rom_528AC.c @@ -5,6 +5,9 @@ extern const u16 gUnknown_08527F18[]; +static void sub_52940(u16, s8, s8, u8, int); +static u16 LoadSaveDataFromSram(void); + #ifdef NONMATCHING // Like sub_C24, it matches except for that damn 'push {lr}/pop {lr}' int sub_528AC(u16 a) @@ -46,8 +49,6 @@ _080528DA:\n\ } #endif -void sub_52940(u16, s8, s8, u8, int); - void sub_528DC(u16 a, s8 b) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x99); @@ -59,12 +60,7 @@ void sub_5291C(u16 a, s8 b, s8 c, u8 d) sub_52940(a, b, c, d, 0); } -extern struct ToneData gUnknown_08532D6C[]; -extern struct ToneData gUnknown_08533360[]; -extern struct ToneData gUnknown_08533960[]; -extern struct ToneData gUnknown_08533F60[]; - -void sub_52940(u16 a, s8 b, s8 c, u8 d, int unused) +static void sub_52940(u16 a, s8 b, s8 c, u8 d, int unused) { u16 r5 = a - 1; u32 pitch = 0x3C00; @@ -100,18 +96,15 @@ void sub_52940(u16 a, s8 b, s8 c, u8 d, int unused) } } -extern u16 sub_52A68(void); -extern void sub_525CC(s8); - -void sub_52A18(void) +void SaveFile_LoadGameData(void) { SetSramFastFunc(); gMain.unkC = 0; - if (sub_52A68() == 0) + if (LoadSaveDataFromSram() == 0) { sub_52C64(); - sub_52B30(); - if (sub_52A68() == 0) + SaveFile_WriteToSram(); + if (LoadSaveDataFromSram() == 0) { gMain.unkC = 1; sub_52C64(); @@ -119,16 +112,15 @@ void sub_52A18(void) } else { - sub_525CC(gMain.saveData.unk143); + sub_525CC(gMain_saveData.unk143); } } -extern struct Main2 gMain_; extern u8 gSaveFileSignature[]; -u16 sub_52A68(void) +static u16 LoadSaveDataFromSram(void) { - u16 r8 = 0; + u16 isOk = FALSE; u16 fileNum; u16 i; u32 checksum; @@ -136,15 +128,15 @@ u16 sub_52A68(void) // Looks like there are two copies of the save data, one used as a backup? for (fileNum = 0; fileNum < 2; fileNum++) { - u16 *saveData = (u16 *)&gMain.saveData; - u32 size = 0x274; + u16 *saveData = (u16 *)&gMain_saveData; + size_t size = sizeof(gMain_saveData); - ReadSramFast((u8 *)0x0E000004 + fileNum * 672, (u8 *)saveData, size); + ReadSramFast((void *)(SRAM + 0x4 + fileNum * 672), (u8 *)saveData, size); // Verify signature for (i = 0; i < 10; i++) { - if (gMain.saveData.signature[i] != gSaveFileSignature[i]) + if (gMain_saveData.signature[i] != gSaveFileSignature[i]) break; } if (i != 10) @@ -162,93 +154,82 @@ u16 sub_52A68(void) checksum = (checksum & 0xFFFF) + (checksum >> 16); if (checksum == 0xFFFF) { - r8 = 1; + isOk = TRUE; break; } } - return r8; + return isOk; } -// I really think gUnknown_0200B134_ is part of gMain, but the code doesn't -// match if I do that. -#ifdef NONMATCHING -#define gUnknown_0200B134_ gMain.saveData -#else -extern struct SaveData gUnknown_0200B134_; // gMain.saveData -asm(".set gUnknown_0200B134_, gMain+0x74"); -#endif - -void sub_52B30(void) +void SaveFile_WriteToSram(void) { u32 checksum; - u16 *saveData = (u16 *)&gUnknown_0200B134_; - u32 size = 0x274; + u16 *saveData = (u16 *)&gMain_saveData; + size_t size = sizeof(gMain_saveData); - gUnknown_0200B134_.unk2E4++; - gUnknown_0200B134_.unk2E2 = 0; + gMain_saveData.unk2E4++; + gMain_saveData.checksum = 0; checksum = 0; while (size > 1) { - checksum += *saveData++; - size -= 2; + checksum += *saveData++; + size -= 2; } if (size != 0) // never happens (size is even) - checksum += *saveData & 0xFF00; + checksum += *saveData & 0xFF00; checksum = (checksum & 0xFFFF) + (checksum >> 16); - gUnknown_0200B134_.unk2E2 = ~((checksum >> 16) + checksum); + gMain_saveData.checksum = ~((checksum >> 16) + checksum); - WriteAndVerifySramFast((u8 *)&gUnknown_0200B134_, (u8 *)0x0E000004, 0x274); - WriteAndVerifySramFast((u8 *)&gUnknown_0200B134_, (u8 *)0x0E0002A4, 0x274); + WriteAndVerifySramFast((u8 *)&gMain_saveData, (void *)(SRAM + 0x4), sizeof(gMain_saveData)); + WriteAndVerifySramFast((u8 *)&gMain_saveData, (void *)(SRAM + 0x2A4), sizeof(gMain_saveData)); } -void sub_52BB0(s16 a, u8 b) +void SaveFile_SetPokedexFlags(s16 a, u8 b) { - u16 *saveData = (u16 *)&gUnknown_0200B134_; - u32 size = 0x274; + u16 *saveData = (u16 *)&gMain_saveData; + size_t size = sizeof(gMain_saveData); u32 checksum; - if (gUnknown_0200B134_.pokedexFlags[a] < b) + if (gMain_saveData.pokedexFlags[a] < b) { - u16 r1; - - gUnknown_0200B134_.unk2E4++; - r1 = 0; - gUnknown_0200B134_.pokedexFlags[a] = b; - gUnknown_0200B134_.unk2E2 = r1; - - checksum = 0; - while (size > 1) - { - checksum += *saveData++; - size -= 2; - } - if (size != 0) // never happens (size is even) - checksum += *saveData & 0xFF00; - checksum = (checksum & 0xFFFF) + (checksum >> 16); - gUnknown_0200B134_.unk2E2 = ~((checksum >> 16) + checksum); - - WriteAndVerifySramFast((u8 *)&gUnknown_0200B134_, (u8 *)0x0E000004, 0x274); - WriteAndVerifySramFast((u8 *)&gUnknown_0200B134_, (u8 *)0x0E0002A4, 0x274); + gMain_saveData.unk2E4++; + gMain_saveData.pokedexFlags[a] = b; + gMain_saveData.checksum = 0; + + checksum = 0; + while (size > 1) + { + checksum += *saveData++; + size -= 2; + } + if (size != 0) // never happens (size is even) + checksum += *saveData & 0xFF00; + checksum = (checksum & 0xFFFF) + (checksum >> 16); + gMain_saveData.checksum = ~((checksum >> 16) + checksum); + + WriteAndVerifySramFast((u8 *)&gMain_saveData, (void *)(SRAM + 0x4), sizeof(gMain_saveData)); + WriteAndVerifySramFast((u8 *)&gMain_saveData, (void *)(SRAM + 0x2A4), sizeof(gMain_saveData)); } } -void sub_52C44(void) +void SaveFile_ReadSavedGamePresent(void) { - ReadSramFast((u8 *)0x0E000544, (u8 *)&gMain.hasSavedGame, sizeof(gMain.hasSavedGame)); + ReadSramFast((void *)(SRAM + 0x544), (u8 *)&gMain.hasSavedGame, sizeof(gMain.hasSavedGame)); } void sub_52C64(void) { - s16 r1; + s16 i; + + for (i = 0; i < 10; i++) + gMain_saveData.signature[i] = gSaveFileSignature[i]; - for (r1 = 0; r1 < 10; r1++) - gUnknown_0200B134_.signature[r1] = gSaveFileSignature[r1]; - gUnknown_0200B134_.unk2E4 = 0; - gUnknown_0200B134_.unk141 = 0; - gUnknown_0200B134_.unk142 = 0; + gMain_saveData.unk2E4 = 0; + gMain_saveData.unk141 = 0; + gMain_saveData.ballSpeed = 0; sub_525CC(-1); sub_F6E0(); sub_8ABC(); - gUnknown_0200B134_.unk143 = 0; + gMain_saveData.unk143 = 0; } diff --git a/src/rom_850.c b/src/rom_850.c index 56a4914..cd820e9 100755 --- a/src/rom_850.c +++ b/src/rom_850.c @@ -1,57 +1,53 @@ #include "global.h" #include "main.h" -u16 sub_850(void) +u16 IsInVblank(void) { - if (REG_IME & INTR_FLAG_VBLANK - && REG_DISPSTAT & DISPSTAT_VBLANK_INTR - && REG_IE & INTR_FLAG_VBLANK - && !(REG_DISPCNT & DISPCNT_FORCED_BLANK)) - { - return 1; - } + if ((REG_IME & 1) // Interrupts enabled + && (REG_DISPSTAT & DISPSTAT_VBLANK_INTR) // In VBLANK + && (REG_IE & INTR_FLAG_VBLANK) // VBlank interrupt enabled + && !(REG_DISPCNT & DISPCNT_FORCED_BLANK)) // Ignore VBlank interrupts during forced blank + return TRUE; else - { - return 0; - } + return FALSE; } -void sub_898(void (*func)(void)) +void SetMainCallback(void (*func)(void)) { gUnknown_02017BD4 = func; - if (!sub_850()) - gUnknown_0200FB9C = func; + if (!IsInVblank()) + gMainCallback = func; } -void sub_8BC(void) +void ResetMainCallback(void) { - gUnknown_0200FB9C = sub_DC4; - gUnknown_02017BD4 = sub_DC4; + gMainCallback = DefaultMainCallback; + gUnknown_02017BD4 = DefaultMainCallback; } -void sub_8D4(void (*func)(void)) +void SetVBlankIntrFunc(void (*func)(void)) { gUnknown_02017BD0 = func; - if (!sub_850()) - *gUnknown_0200FB98 = func; + if (!IsInVblank()) + *gVBlankIntrFuncPtr = func; } -void sub_8FC(void) +void ResetVBlankIntrFunc(void) { - *gUnknown_0200FB98 = HBlankIntr; - gUnknown_02017BD0 = HBlankIntr; + *gVBlankIntrFuncPtr = VBlankIntr; + gUnknown_02017BD0 = VBlankIntr; } -void sub_918(void (*func)(void)) +void SetVCountIntrFunc(void (*func)(void)) { gUnknown_0200FBA0 = func; - if (!sub_850()) - *gUnknown_02019BE0 = func; + if (!IsInVblank()) + *gVCountIntrFuncPtr = func; } -void sub_940(void) +void ResetVCountIntrFunc(void) { - *gUnknown_02019BE0 = VCountIntr; + *gVCountIntrFuncPtr = VCountIntr; gUnknown_0200FBA0 = VCountIntr; } diff --git a/src/titlescreen.c b/src/titlescreen.c index 22bc699..583ca5f 100755 --- a/src/titlescreen.c +++ b/src/titlescreen.c @@ -31,7 +31,7 @@ void LoadTitlescreenGraphics(void) { int autoDisplayMenu; - sub_438(); + ResetSomeGraphicsRelatedStuff(); REG_DISPCNT = DISPCNT_OBJ_ON| DISPCNT_FORCED_BLANK; REG_BG1CNT = BGCNT_256COLOR | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(0); REG_DISPCNT |= DISPCNT_BG1_ON; @@ -41,7 +41,7 @@ void LoadTitlescreenGraphics(void) DmaCopy16(3, gTitlescreenBg_Pals, (void *)BG_PLTT, BG_PLTT_SIZE); DmaCopy16(3, gTitlescreenBgTilemap, (void *)BG_SCREEN_ADDR(0), BG_SCREEN_SIZE); - sub_52C44(); + SaveFile_ReadSavedGamePresent(); if (gMain.hasSavedGame == TRUE) { DmaCopy16(3, gTitlescreenSprites_Pals, (void *)OBJ_PLTT, 0xA0); @@ -862,7 +862,7 @@ void sub_11968(void) void sub_11B74(void) { sub_52C64(); - sub_52B30(); + SaveFile_WriteToSram(); gMain.hasSavedGame = FALSE; WriteAndVerifySramFast((const u8 *)&gMain.hasSavedGame, (void *)0x0E000544, sizeof(gMain.hasSavedGame)); } @@ -25,7 +25,7 @@ void sub_24C(void) for (i = 0; i < 32; i++) { REG_BLDY = 15 - i / 2; - sub_D74(); + MainLoopIter(); } REG_BLDCNT = 0; @@ -44,7 +44,7 @@ void sub_2B4(void) for (i = 0; i < 16; i++) { REG_BLDY = i + 1; - sub_D74(); + MainLoopIter(); } gMain.unk16 |= DISPCNT_FORCED_BLANK; @@ -92,13 +92,13 @@ s16 LoadSpriteSets(const struct SpriteSet *const *spriteSets, u16 numSpriteSets, return loadedCount; } -void sub_438(void) +void ResetSomeGraphicsRelatedStuff(void) { gMain.unk16 |= DISPCNT_FORCED_BLANK; REG_DISPCNT |= DISPCNT_FORCED_BLANK; - sub_490(); + ClearGraphicsMemory(); sub_518(); - sub_578(); + ClearSprites(); gMain.unkF = 0; gMain.unk10 = 0; gMain.unk50 = 0; @@ -115,7 +115,7 @@ void sub_438(void) gMain.unk2C = 0; } -void sub_490(void) +void ClearGraphicsMemory(void) { DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)OAM, OAM_SIZE); @@ -146,7 +146,7 @@ void sub_518(void) } } -void sub_578(void) +void ClearSprites(void) { u16 i, j; |