diff --git a/src/ereader.c b/src/ereader.c index ba623c6e..a311d352 100644 --- a/src/ereader.c +++ b/src/ereader.c @@ -183,7 +183,6 @@ void Ereader_AnimateLinkCable(void) void Ereader_Communicating(void) { s32 index; - u16 temp; UpdateEReaderSpritesViaOam(); if (JOY_NEW(B_BUTTON)) { @@ -225,8 +224,7 @@ void Ereader_Communicating(void) } if (gEReaderStatusAnimSpriteGroup == SG_EREADER_TRANSMITTING) { gEReaderGeneralTimer++; - temp = gEReaderGeneralTimer; // TODO: FAKEMATCH - if ((gEReaderGeneralTimer & 7) == 0) { + if (gEReaderGeneralTimer % 8 == 0) { gEReaderHeaderAnimSpriteGroup = SG_21 - gEReaderHeaderAnimSpriteGroup; } if (((gLinkStatusResult & 0x7f0000) != 0) && diff --git a/src/high_scores.c b/src/high_scores.c index 798f8437..4f06306b 100644 --- a/src/high_scores.c +++ b/src/high_scores.c @@ -21,7 +21,7 @@ extern s16 gCompletionBannerY; extern s8 gCompletionBannerPhase; extern s8 gCompletionBannerSpriteGroup; extern s8 gHighScoreShowPopupFlag; -extern u8 gHighScorePopupType; +extern s8 gHighScorePopupType; extern u16 gLinkExchangeCommand; extern u16 gLinkPacketCounter; extern s8 gLinkExchangeSendPhase; @@ -235,7 +235,6 @@ void InitHighScoreData(void) void HighScore_ShowCompletionBanner(void) { - u16 temp; switch(gCompletionBannerPhase) { case 0: @@ -248,9 +247,7 @@ void HighScore_ShowCompletionBanner(void) case 1: gCompletionBannerY--; - // TODO: FAKEMATCH - Seth - temp = gHighScoreScreenState.flashDuration; - if((gHighScoreScreenState.flashDuration & 3) == 0) + if(gHighScoreScreenState.flashDuration % 4 == 0) { gCompletionBannerSpriteGroup++; if(gCompletionBannerSpriteGroup > SG_HIGH_SCORE_COMPLETION_BANNER_LOOP_END) @@ -973,154 +970,132 @@ void UpdateNameEntryCursor(void) spriteGroup->active = FALSE; } -// The target keeps two redundant pointer copies alive in the entry block -- -// spriteGroup1_ in r4 and spriteGroup2_ in r5 -- which agbcc otherwise deletes -// in cse1, again in loop and again in combine. Two constructs keep them: -// the r4 pin on spriteGroup1_, and the empty asm("") barriers below (they emit -// no instructions and the "r" constraint accepts any register; they only stop -// the alias pointers being coalesced with the pointers they duplicate, and stop -// the OAM pointers being re-folded into base+displacement addressing). -// spriteGroup2_ cannot also be pinned -- the target reuses r5 as a scratch -// register once the alias dies, and a pin would reserve it for the whole -// function. Three barriers is the floor; their exact placement is required for -// a byte-identical match, so do not move or remove them. void RenderHighScoreSprites(void) { - int i; - struct SpriteGroup *spriteGroup1; - register struct SpriteGroup *spriteGroup1_ asm("r4"); - struct SpriteGroup *spriteGroup2; - struct SpriteGroup *spriteGroup2_; - struct SpriteGroup *spriteGroup3; - struct SpriteGroup *spriteGroup4; + s32 i; + struct SpriteGroup *(highScorePageArrowSG[2]); + struct SpriteGroup *popupSG; + struct SpriteGroup *pressStartSG; struct OamDataSimple *oamData; const struct SpriteSet *spriteSet; - const struct SpriteSet * const *spriteSets = gHighScoreScreenSpriteSets; - spriteGroup1 = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_RIGHT_ARROW]; - spriteGroup1_ = spriteGroup1; - spriteGroup2 = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_LEFT_ARROW]; - spriteGroup2_ = spriteGroup2; - asm("" : "=r"(spriteGroup2_) : "0"(spriteGroup2_)); - spriteGroup3 = &gMain.spriteGroups[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE]; - spriteGroup4 = &gMain.spriteGroups[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0]; + + highScorePageArrowSG[0] = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_RIGHT_ARROW]; + highScorePageArrowSG[1] = &gMain.spriteGroups[SG_HIGH_SCORE_PAGE_LEFT_ARROW]; + + popupSG = &gMain.spriteGroups[gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE]; + pressStartSG = &gMain.spriteGroups[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0]; if (gScrollXOffset == 0) { - spriteGroup1->active = TRUE; - spriteGroup2_->active = FALSE; - spriteGroup3->active = gHighScoreShowPopupFlag; - spriteGroup4->active = gHighScoreScreenState.displayModeVisible; - asm("" : : "r"(spriteGroup1_), "r"(spriteGroup2_)); + highScorePageArrowSG[0]->active = TRUE; + highScorePageArrowSG[1]->active = FALSE; + popupSG->active = gHighScoreShowPopupFlag; + pressStartSG->active = gHighScoreScreenState.displayModeVisible; - LoadSpriteSets(spriteSets, 9, spriteGroup1); + LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups); + + highScorePageArrowSG[0]->baseX = 220; + highScorePageArrowSG[0]->baseY = 144; + oamData = &highScorePageArrowSG[0]->oam[0]; + gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2; + gOamBuffer[oamData->oamId].x = oamData->xOffset + highScorePageArrowSG[0]->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + highScorePageArrowSG[0]->baseY; + + if (pressStartSG->active == TRUE) { - spriteGroup1->baseX = 220; - spriteGroup1->baseY = 144; - oamData = &spriteGroup1_->oam[0]; - gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup1->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup1->baseY; - - } - - if (spriteGroup4->active == TRUE) - { - spriteGroup4->baseX = 84; - spriteGroup4->baseY = 150; + pressStartSG->baseX = 84; + pressStartSG->baseY = 150; spriteSet = gHighScoreScreenSpriteSets[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0]; for (i = 0; i < spriteSet->count; i++) { - oamData = &spriteGroup4->oam[i]; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup4->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup4->baseY; + oamData = &pressStartSG->oam[i]; + gOamBuffer[oamData->oamId].x = oamData->xOffset + pressStartSG->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + pressStartSG->baseY; } } - if (spriteGroup3->active == TRUE) + if (popupSG->active == TRUE) { - switch ((s8)gHighScorePopupType) + switch(gHighScorePopupType) { case HIGH_SCORE_POPUP_TRANSMISSION_CONNECT_PROMPT: case HIGH_SCORE_POPUP_DELETE_CONFIRMATION_PROMPT: - spriteGroup3->baseX = 120; - spriteGroup3->baseY = 100; + popupSG->baseX = 120; + popupSG->baseY = 100; break; default: - spriteGroup3->baseX = 120; - spriteGroup3->baseY = 80; - break; + popupSG->baseX = 120; + popupSG->baseY = 80; } - spriteSet = gHighScoreScreenSpriteSets[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE]; + + spriteSet = gHighScoreScreenSpriteSets[SG_HIGH_SCORE_POPUP_LIST_BASE + gHighScorePopupType]; for (i = 0; i < spriteSet->count; i++) { - oamData = &spriteGroup3->oam[i]; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup3->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup3->baseY; + oamData = &popupSG->oam[i]; + gOamBuffer[oamData->oamId].x = oamData->xOffset + popupSG->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + popupSG->baseY; } } } else if (gScrollXOffset == 240) { - spriteGroup1->active = FALSE; - spriteGroup2->active = TRUE; - spriteGroup3->active = gHighScoreShowPopupFlag; - spriteGroup4->active = gHighScoreScreenState.displayModeVisible; - LoadSpriteSets(spriteSets, 9, spriteGroup1); + highScorePageArrowSG[0]->active = FALSE; + highScorePageArrowSG[1]->active = TRUE; + popupSG->active = gHighScoreShowPopupFlag; + pressStartSG->active = gHighScoreScreenState.displayModeVisible; + LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups); + + highScorePageArrowSG[1]->baseX = 4; + highScorePageArrowSG[1]->baseY = 144; + oamData = &highScorePageArrowSG[1]->oam[0]; + + gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2; + gOamBuffer[oamData->oamId].x = oamData->xOffset + highScorePageArrowSG[1]->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + highScorePageArrowSG[1]->baseY; + + if (pressStartSG->active == TRUE) { - spriteGroup2->baseX = 4; - spriteGroup2->baseY = 144; - oamData = &spriteGroup2_->oam[0]; - asm("" : "=r"(spriteGroup2_) : "0"(spriteGroup2_)); - - gOamBuffer[oamData->oamId].tileNum = gHighScoreScreenState.flashElapsedFrames * 2 + 2; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup2->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup2->baseY; - - } - - if (spriteGroup4->active == TRUE) - { - spriteGroup4->baseX = 84; - spriteGroup4->baseY = 150; + pressStartSG->baseX = 84; + pressStartSG->baseY = 150; spriteSet = gHighScoreScreenSpriteSets[gHighScoreScreenState.pressStartBlinkToggle + SG_HIGH_SCORE_PRESS_START_0]; for (i = 0; i < spriteSet->count; i++) { - oamData = &spriteGroup4->oam[i]; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup4->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup4->baseY; + oamData = &pressStartSG->oam[i]; + gOamBuffer[oamData->oamId].x = oamData->xOffset + pressStartSG->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + pressStartSG->baseY; } } - if (spriteGroup3->active == TRUE) + if (popupSG->active == TRUE) { - switch ((s8)gHighScorePopupType) + switch (gHighScorePopupType) { case HIGH_SCORE_POPUP_TRANSMISSION_CONNECT_PROMPT: case HIGH_SCORE_POPUP_DELETE_CONFIRMATION_PROMPT: - spriteGroup3->baseX = 120; - spriteGroup3->baseY = 100; + popupSG->baseX = 120; + popupSG->baseY = 100; break; default: - spriteGroup3->baseX = 120; - spriteGroup3->baseY = 80; + popupSG->baseX = 120; + popupSG->baseY = 80; break; } - spriteSet = gHighScoreScreenSpriteSets[(s8)gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE]; + spriteSet = gHighScoreScreenSpriteSets[gHighScorePopupType + SG_HIGH_SCORE_POPUP_LIST_BASE]; for (i = 0; i < spriteSet->count; i++) { - oamData = &spriteGroup3->oam[i]; - gOamBuffer[oamData->oamId].x = oamData->xOffset + spriteGroup3->baseX; - gOamBuffer[oamData->oamId].y = oamData->yOffset + spriteGroup3->baseY; + oamData = &popupSG->oam[i]; + gOamBuffer[oamData->oamId].x = oamData->xOffset + popupSG->baseX; + gOamBuffer[oamData->oamId].y = oamData->yOffset + popupSG->baseY; } } } else { - spriteGroup1->active = FALSE; - spriteGroup2->active = FALSE; - LoadSpriteSets(spriteSets, 9, spriteGroup1); + highScorePageArrowSG[0]->active = FALSE; + highScorePageArrowSG[1]->active = FALSE; + LoadSpriteSets(gHighScoreScreenSpriteSets, 9, gMain.spriteGroups); } - spriteGroup3->active = FALSE; - spriteGroup4->active = FALSE; + popupSG->active = 0; + pressStartSG->active = 0; } diff --git a/src/intro.c b/src/intro.c index 9b8ed8bc..1b75c93e 100644 --- a/src/intro.c +++ b/src/intro.c @@ -595,7 +595,6 @@ void IntroScene1Torchic_RenderAllSprites(void) struct SpriteGroup *mainSg2; struct SpriteGroup *otherSg; int i; - const u16 *p; // TODO Fakematch gMain.blendControl = 0xF10; gMain.blendAlpha = gIntroBlendSrc | (gIntroBlendDst << 8); @@ -615,13 +614,13 @@ void IntroScene1Torchic_RenderAllSprites(void) if (puVar1->active == TRUE) { + const struct SpriteSet *introScene1; puVar1->baseX = gIntroSpriteEntities[1].posX; puVar1->baseY = gIntroSpriteEntities[1].posY; - p = &gIntroScene1Torchic_SpriteSets[gIntroSpriteEntities[1].animFrame]->count; - for (i = 0; - i < *p; - i++) + introScene1 = gIntroScene1Torchic_SpriteSets[gIntroSpriteEntities[1].animFrame]; + + for (i = 0; i < introScene1->count; i++) { puVar5 = &puVar1->oam[i]; gOamBuffer[puVar5->oamId].objMode = ST_OAM_OBJ_BLEND; diff --git a/src/m4a.c b/src/m4a.c index 2860103e..73b28f6f 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -669,28 +669,18 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { s32 i; struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); + u16 fadeOV; - if (fadeOI == 0) + if (mplayInfo->fadeOI == 0) + return; + if (--mplayInfo->fadeOC != 0) return; - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) - return; - - mplayInfo->fadeOC = fadeOI; + mplayInfo->fadeOC = mplayInfo->fadeOI; if (mplayInfo->fadeOV & FADE_IN) { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT)) { mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); mplayInfo->fadeOI = 0; @@ -698,16 +688,13 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) } else { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) + if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0) { i = mplayInfo->trackCount; track = mplayInfo->tracks; while (i > 0) { - register u32 fadeOV asm("r7"); u32 val; TrackStop(mplayInfo, track); @@ -740,7 +727,9 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) { if (track->flags & MPT_FLG_EXIST) { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); + fadeOV = mplayInfo->fadeOV; + + track->volX = (fadeOV >> FADE_VOL_SHIFT); track->flags |= MPT_FLG_VOLCHG; } @@ -894,16 +883,13 @@ void CgbModVol(struct CgbChannel *chan) if ((soundInfo->mode & 1) || !CgbPan(chan)) { chan->pan = 0xFF; - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + chan->eg = (u32)(chan->leftVolume + chan->rightVolume); + chan->eg /= 16; } 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; + chan->eg = (u32)(chan->leftVolume + chan->rightVolume); + chan->eg /= 16; if (chan->eg > 15) chan->eg = 15; }