diff --git a/asm/macros/battle_anim.inc b/asm/macros/battle_anim.inc deleted file mode 100644 index 4ff845032..000000000 --- a/asm/macros/battle_anim.inc +++ /dev/null @@ -1,266 +0,0 @@ - .macro loadsprite id - .byte 0x00 - .2byte \id - .endm - - .macro unloadsprite id - .byte 0x01 - .2byte \id - .endm - - .macro sprite template, priority, argv:vararg - .byte 0x02 - .4byte \template - .byte \priority - .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2 -.Lsprite_\@_1: - .2byte \argv -.Lsprite_\@_2: - .endm - - .macro createtask addr, priority, argv:vararg - .byte 0x03 - .4byte \addr - .byte \priority - .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2 -.Lcreatetask_\@_1: - .2byte \argv -.Lcreatetask_\@_2: - .endm - - .macro pause delay - .byte 0x04 - .byte \delay - .endm - - .macro wait - .byte 0x05 - .endm - - .macro hang1 - .byte 0x06 - .endm - - .macro hang2 - .byte 0x07 - .endm - - .macro end - .byte 0x08 - .endm - - .macro playse id - .byte 0x09 - .2byte \id - .endm - - .macro monbg which - .byte 0x0A - .byte \which - .endm - - .macro clearmonbg which - .byte 0x0B - .byte \which - .endm - - .macro setalpha eva, evb - .byte 0x0C - .2byte ((\evb) << 8) | (\eva) - .endm - - .macro blendoff - .byte 0x0D - .endm - - .macro call addr - .byte 0x0E - .4byte \addr - .endm - - .macro ret - .byte 0x0F - .endm - - .macro setvar var_num, value - .byte 0x10 - .byte \var_num - .2byte \value - .endm - - .macro ifelse addr1, addr2 - .byte 0x11 - .4byte \addr1 - .4byte \addr2 - .endm - - .macro jumpif cond, addr - .byte 0x12 - .byte \cond - .4byte \addr - .endm - - .macro jump addr - .byte 0x13 - .4byte \addr - .endm - - .macro fadetobg id - .byte 0x14 - .byte \id - .endm - - .macro restorebg - .byte 0x15 - .endm - - .macro waitbgfadeout - .byte 0x16 - .endm - - .macro waitbgfadein - .byte 0x17 - .endm - - .macro changebg id - .byte 0x18 - .byte \id - .endm - - .macro panse_19 id, pan - .byte 0x19 - .2byte \id - .byte \pan - .endm - - .macro setpan pan - .byte 0x1A - .byte \pan - .endm - - .macro panse_1B id, pan_start, pan_end, step, delay - .byte 0x1B - .2byte \id - .byte \pan_start - .byte \pan_end - .byte \step - .byte \delay - .endm - - .macro panse_1C id, pan, delay, count - .byte 0x1C - .2byte \id - .byte \pan - .byte \delay - .byte \count - .endm - - .macro panse_1D id, pan, count - .byte 0x1D - .2byte \id - .byte \pan - .byte \count - .endm - - .macro setbldcnt bldcnt - .byte 0x1E - .2byte \bldcnt - .endm - - .macro createtask_1F addr, argv:vararg - .byte 0x1F - .4byte \addr - .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2 -.Lcreatetask_1F_\@_1: - .2byte \argv -.Lcreatetask_1F_\@_2: - .endm - - .macro waitsound - .byte 0x20 - .endm - - .macro jumpvareq var_num, value, addr - .byte 0x21 - .byte \var_num - .2byte \value - .4byte \addr - .endm - - .macro monbg_22 unk - .byte 0x22 - .byte \unk - .endm - - .macro clearmonbg_23 unk - .byte 0x23 - .byte \unk - .endm - - .macro jumpunkcond addr - .byte 0x24 - .4byte \addr - .endm - - .macro fadetobg_25 a, b, c - .byte 0x25 - .byte \a - .byte \b - .byte \c - .endm - - .macro panse_26 id, pan_start, pan_end, step, delay - .byte 0x26 - .2byte \id - .byte \pan_start - .byte \pan_end - .byte \step - .byte \delay - .endm - - .macro panse_27 id, pan_start, pan_end, step, delay - .byte 0x27 - .2byte \id - .byte \pan_start - .byte \pan_end - .byte \step - .byte \delay - .endm - - .macro monbgprio_28 unk - .byte 0x28 - .byte \unk - .endm - - .macro monbgprio_29 - .byte 0x29 - .endm - - .macro monbgprio_2A unk - .byte 0x2A - .byte \unk - .endm - - .macro invisible side - .byte 0x2B - .byte \side - .endm - - .macro visible side - .byte 0x2C - .byte \side - .endm - - .macro doublebattle_2D unk - .byte 0x2D - .byte \unk - .endm - - .macro doublebattle_2E unk - .byte 0x2E - .byte \unk - .endm - - .macro stopsound - .byte 0x2F - .endm diff --git a/include/bg.h b/include/bg.h index f5daf57cd..1eb69e547 100644 --- a/include/bg.h +++ b/include/bg.h @@ -11,18 +11,6 @@ struct BGCntrlBitfield // for the I/O registers volatile u16 screenSize:2; }; -enum -{ - BG_CTRL_ATTR_VISIBLE = 1, - BG_CTRL_ATTR_CHARBASEINDEX = 2, - BG_CTRL_ATTR_MAPBASEINDEX = 3, - BG_CTRL_ATTR_SCREENSIZE = 4, - BG_CTRL_ATTR_PALETTEMODE = 5, - BG_CTRL_ATTR_PRIORITY = 6, - BG_CTRL_ATTR_MOSAIC = 7, - BG_CTRL_ATTR_WRAPAROUND = 8, -}; - enum { BG_ATTR_CHARBASEINDEX = 1, @@ -73,52 +61,48 @@ struct BgTemplate }; void ResetBgs(void); -u8 GetBgMode(void); +u32 GetBgMode(void); void ResetBgControlStructs(void); -void Unused_ResetBgControlStruct(u8 bg); -void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound); -u16 GetBgControlAttribute(u8 bg, u8 attributeId); -u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode); +u8 LoadBgVram(u32 bg, const void *src, u16 size, u16 destOffset, u32 mode); void SetTextModeAndHideBgs(void); -bool8 IsInvalidBg(u8 bg); +bool32 IsInvalidBg(u32 bg); int BgTileAllocOp(int bg, int offset, int count, int mode); void ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc); -void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates); +void InitBgsFromTemplates(u32 bgMode, const struct BgTemplate *templates, u8 numTemplates); void InitBgFromTemplate(const struct BgTemplate *template); -void SetBgMode(u8 bgMode); -u16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset); -u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset); -u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset); -bool8 IsDma3ManagerBusyWithBgCopy(void); -void ShowBg(u8 bg); -void HideBg(u8 bg); -void SetBgAttribute(u8 bg, u8 attributeId, u8 value); -u16 GetBgAttribute(u8 bg, u8 attributeId); -u32 ChangeBgX(u8 bg, u32 value, u8 op); -u32 GetBgX(u8 bg); -u32 ChangeBgY(u8 bg, u32 value, u8 op); +void SetBgMode(u32); +u16 LoadBgTiles(u32 bg, const void *src, u16 size, u16 destOffset); +u16 LoadBgTilemap(u32 bg, const void *src, u16 size, u16 destOffset); +u16 Unused_LoadBgPalette(u32 bg, const void *src, u16 size, u16 destOffset); +bool32 IsDma3ManagerBusyWithBgCopy(void); +void ShowBg(u32 bg); +void HideBg(u32 bg); +void SetBgAttribute(u32 bg, u32 attributeId, u8 value); +u16 GetBgAttribute(u32 bg, u32 attributeId); +s32 ChangeBgX(u32 bg, s32 value, u8 op); +s32 GetBgX(u32 bg); +s32 ChangeBgY(u32 bg, s32 value, u8 op); s32 ChangeBgY_ScreenOff(u32 bg, s32 value, u8 op); -u32 GetBgY(u8 bg); -void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle); +s32 GetBgY(u32 bg); +void SetBgAffine(u32 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle); u8 AdjustBgMosaic(u8 value, u8 mode); -void SetBgTilemapBuffer(u8 bg, void *tilemap); -void UnsetBgTilemapBuffer(u8 bg); -void *GetBgTilemapBuffer(u8 bg); -void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset); +void SetBgTilemapBuffer(u32 bg, void *tilemap); +void UnsetBgTilemapBuffer(u32 bg); +void *GetBgTilemapBuffer(u32 bg); +void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset); void DecompressAndCopyToBgTilemapBuffer(u32 bg, const u32 *src, u32 mode, u32 destOffset); -void CopyBgTilemapBufferToVram(u8 bg); -void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height); -void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette); -void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2); -void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height); -void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette); -void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta); -u16 GetBgMetricTextMode(u8 bg, u8 whichMetric); -u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric); +void CopyBgTilemapBufferToVram(u32 bg); +void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height); +void CopyToBgTilemapBufferRect_ChangePalette(u32 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette); +void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2); +void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height); +void FillBgTilemapBufferRect(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette); +void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta); +u16 GetBgMetricTextMode(u32 bg, u32 whichMetric); +u32 GetBgMetricAffineMode(u32 bg, u32 whichMetric); u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight); void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2); -u32 GetBgType(u8 bg); -bool32 IsInvalidBg32(u8 bg); -bool32 IsTileMapOutsideWram(u8 bg); +bool32 IsInvalidBg32(u32 bg); +bool32 IsTileMapOutsideWram(u32 bg); #endif // GUARD_BG_H diff --git a/src/battle_anim.c b/src/battle_anim.c index 546063bdc..9a7f7543f 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1092,12 +1092,12 @@ void MoveBattlerSpriteToBG(enum BattlerId battler, bool8 toBG_2, bool8 setSprite else { RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(8)), 0x2000, DMA3_32BIT); - RequestDma3Fill(0, (void *)(BG_SCREEN_ADDR(28)), 0x1000, DMA3_32BIT); + RequestDma3Fill(0xFF, (void *)(BG_SCREEN_ADDR(28)), 0x1000, DMA3_16BIT); } GetBattleAnimBg1Data(&animBg); - CpuFill16(toBG_2, animBg.bgTiles, 0x1000); - CpuFill16(toBG_2, animBg.bgTilemap, 0x800); + CpuFill16(0, animBg.bgTiles, 0x1000); + CpuFill16(0, animBg.bgTilemap, 0x800); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); diff --git a/src/bg.c b/src/bg.c index e34e4dc79..7ec4dc1bb 100644 --- a/src/bg.c +++ b/src/bg.c @@ -12,20 +12,17 @@ struct BgControl { struct BgConfig { - u16 visible:1; - u16 unknown_1:1; - u16 screenSize:2; - u16 priority:2; - u16 mosaic:1; - u16 wraparound:1; + u8 visible:1; + u8 unknown_1:1; + u8 screenSize:2; + u8 priority:2; + u8 mosaic:1; + u8 wraparound:1; - u16 charBaseIndex:2; - u16 mapBaseIndex:5; - u16 paletteMode:1; - - u8 unknown_2; - u8 unknown_3; - } configs[4]; + u8 charBaseIndex:2; + u8 mapBaseIndex:5; + u8 paletteMode:1; + } configs[NUM_BACKGROUNDS]; u16 bgVisibilityAndMode; }; @@ -34,22 +31,23 @@ struct BgConfig2 { u32 baseTile:10; u32 basePalette:4; - u32 unk_3:18; void *tilemap; - u32 bg_x; - u32 bg_y; + s32 bg_x; + s32 bg_y; }; static struct BgControl sGpuBgConfigs; -static struct BgConfig2 sGpuBgConfigs2[4]; -static u32 sDmaBusyBitfield[4]; +static struct BgConfig2 sGpuBgConfigs2[NUM_BACKGROUNDS]; +static u32 sDmaBusyBitfield[NUM_BACKGROUNDS]; static u8 gpu_tile_allocation_map_bg[0x100]; COMMON_DATA bool32 gWindowTileAutoAllocEnabled = 0; static const struct BgConfig sZeroedBgControlStruct = { 0 }; +static u32 GetBgType(u32 bg); + void ResetBgs(void) { ResetBgControlStructs(); @@ -57,54 +55,64 @@ void ResetBgs(void) SetTextModeAndHideBgs(); } -void SetBgModeInternal(u8 bgMode) +static void SetBgModeInternal(u32 bgMode) { - sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8; + sGpuBgConfigs.bgVisibilityAndMode &= ~0x7; sGpuBgConfigs.bgVisibilityAndMode |= bgMode; } -u8 GetBgMode(void) +u32 GetBgMode(void) { return sGpuBgConfigs.bgVisibilityAndMode & 0x7; } void ResetBgControlStructs(void) { - struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0]; - struct BgConfig zeroedConfig = sZeroedBgControlStruct; int i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_BACKGROUNDS; i++) { - bgConfigs[i] = zeroedConfig; + sGpuBgConfigs.configs[i] = sZeroedBgControlStruct; } } -void Unused_ResetBgControlStruct(u8 bg) +void Unused_ResetBgControlStruct(u32 bg) { - if (IsInvalidBg(bg) == FALSE) + if (!IsInvalidBg(bg)) { sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct; } } -void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +enum { - if (IsInvalidBg(bg) == FALSE) + BG_CTRL_ATTR_VISIBLE = 1, + BG_CTRL_ATTR_CHARBASEINDEX = 2, + BG_CTRL_ATTR_MAPBASEINDEX = 3, + BG_CTRL_ATTR_SCREENSIZE = 4, + BG_CTRL_ATTR_PALETTEMODE = 5, + BG_CTRL_ATTR_PRIORITY = 6, + BG_CTRL_ATTR_MOSAIC = 7, + BG_CTRL_ATTR_WRAPAROUND = 8, +}; + +static void SetBgControlAttributes(u32 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +{ + if (!IsInvalidBg(bg)) { if (charBaseIndex != 0xFF) { - sGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex & 0x3; + sGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex; } if (mapBaseIndex != 0xFF) { - sGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex & 0x1F; + sGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex; } if (screenSize != 0xFF) { - sGpuBgConfigs.configs[bg].screenSize = screenSize & 0x3; + sGpuBgConfigs.configs[bg].screenSize = screenSize; } if (paletteMode != 0xFF) @@ -114,12 +122,12 @@ void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenS if (priority != 0xFF) { - sGpuBgConfigs.configs[bg].priority = priority & 0x3; + sGpuBgConfigs.configs[bg].priority = priority; } if (mosaic != 0xFF) { - sGpuBgConfigs.configs[bg].mosaic = mosaic & 0x1; + sGpuBgConfigs.configs[bg].mosaic = mosaic; } if (wraparound != 0xFF) @@ -127,83 +135,64 @@ void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenS sGpuBgConfigs.configs[bg].wraparound = wraparound; } - sGpuBgConfigs.configs[bg].unknown_2 = 0; - sGpuBgConfigs.configs[bg].unknown_3 = 0; - sGpuBgConfigs.configs[bg].visible = 1; } } -u16 GetBgControlAttribute(u8 bg, u8 attributeId) +static u16 GetBgControlAttribute(u32 bg, u32 attributeId) { - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible) { switch (attributeId) { - case BG_CTRL_ATTR_VISIBLE: - return sGpuBgConfigs.configs[bg].visible; - case BG_CTRL_ATTR_CHARBASEINDEX: - return sGpuBgConfigs.configs[bg].charBaseIndex; - case BG_CTRL_ATTR_MAPBASEINDEX: - return sGpuBgConfigs.configs[bg].mapBaseIndex; - case BG_CTRL_ATTR_SCREENSIZE: - return sGpuBgConfigs.configs[bg].screenSize; - case BG_CTRL_ATTR_PALETTEMODE: - return sGpuBgConfigs.configs[bg].paletteMode; - case BG_CTRL_ATTR_PRIORITY: - return sGpuBgConfigs.configs[bg].priority; - case BG_CTRL_ATTR_MOSAIC: - return sGpuBgConfigs.configs[bg].mosaic; - case BG_CTRL_ATTR_WRAPAROUND: - return sGpuBgConfigs.configs[bg].wraparound; + case BG_CTRL_ATTR_VISIBLE: + return sGpuBgConfigs.configs[bg].visible; + case BG_CTRL_ATTR_CHARBASEINDEX: + return sGpuBgConfigs.configs[bg].charBaseIndex; + case BG_CTRL_ATTR_MAPBASEINDEX: + return sGpuBgConfigs.configs[bg].mapBaseIndex; + case BG_CTRL_ATTR_SCREENSIZE: + return sGpuBgConfigs.configs[bg].screenSize; + case BG_CTRL_ATTR_PALETTEMODE: + return sGpuBgConfigs.configs[bg].paletteMode; + case BG_CTRL_ATTR_PRIORITY: + return sGpuBgConfigs.configs[bg].priority; + case BG_CTRL_ATTR_MOSAIC: + return sGpuBgConfigs.configs[bg].mosaic; + case BG_CTRL_ATTR_WRAPAROUND: + return sGpuBgConfigs.configs[bg].wraparound; } } return 0xFF; } -u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode) +u8 LoadBgVram(u32 bg, const void *src, u16 size, u16 destOffset, u32 mode) { u16 offset; - s8 cursor; - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (IsInvalidBg(bg) || !sGpuBgConfigs.configs[bg].visible) + return -1; + + switch (mode) { - switch (mode) - { - case 0x1: - offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE; - break; - case 0x2: - offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE; - break; - default: - cursor = -1; - goto end; - } - + case 0x1: + offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE; offset = destOffset + offset; - - cursor = RequestDma3Copy(src, (void *)(offset + BG_VRAM), size, DMA3_16BIT); - - if (cursor == -1) - { - return -1; - } + return RequestDma3Copy(src, (void *)(offset + BG_VRAM), size, 0); + case 0x2: + offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE; + offset = destOffset + offset; + return RequestDma3Copy(src, (void *)(offset + BG_VRAM), size, 0); + default: + return -1; } - else - { - return -1; - } - -end: - return cursor; } -void ShowBgInternal(u8 bg) +static void ShowBgInternal(u32 bg) { u16 value; - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible) { value = sGpuBgConfigs.configs[bg].priority | (sGpuBgConfigs.configs[bg].charBaseIndex << 2) | @@ -213,16 +202,16 @@ void ShowBgInternal(u8 bg) (sGpuBgConfigs.configs[bg].wraparound << 13) | (sGpuBgConfigs.configs[bg].screenSize << 14); - SetGpuReg((bg << 1) + 0x8, value); + SetGpuReg((bg << 1) + REG_OFFSET_BG0CNT, value); sGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8); sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; } } -static void HideBgInternal(u8 bg) +static void HideBgInternal(u32 bg) { - if (IsInvalidBg(bg) == FALSE) + if (!IsInvalidBg(bg)) { sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8)); sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; @@ -231,32 +220,32 @@ static void HideBgInternal(u8 bg) static void SyncBgVisibilityAndMode(void) { - SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode); + SetGpuReg(REG_OFFSET_DISPCNT, (GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode); } void SetTextModeAndHideBgs(void) { - SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS); + SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS); } -static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) +static void SetBgAffineInternal(u32 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { struct BgAffineSrcData src; struct BgAffineDstData dest; switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7) { - case 1: - if (bg != 2) - return; - break; - case 2: - if (bg < 2 || bg > 3) - return; - break; - case 0: - default: + default: + case 0: + return; + case 1: + if (bg != 2) return; + break; + case 2: + if (bg != 2 && bg != 3) + return; + break; } src.texX = srcCenterX; @@ -280,11 +269,12 @@ static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispC SetGpuReg(REG_OFFSET_BG2Y_H, (s16)(dest.dy >> 16)); } -bool8 IsInvalidBg(u8 bg) +bool32 IsInvalidBg(u32 bg) { - if (bg > 3) + if (bg >= NUM_BACKGROUNDS) return TRUE; - return FALSE; + else + return FALSE; } int BgTileAllocOp(int bg, int offset, int count, int mode) @@ -360,10 +350,10 @@ void ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc) } } -void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates) +void InitBgsFromTemplates(u32 bgMode, const struct BgTemplate *templates, u8 numTemplates) { int i; - u8 bg; + u32 bg; SetBgModeInternal(bgMode); ResetBgControlStructs(); @@ -371,7 +361,8 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT for (i = 0; i < numTemplates; i++) { bg = templates[i].bg; - if (bg < 4) { + if (bg < NUM_BACKGROUNDS) + { SetBgControlAttributes(bg, templates[i].charBaseIndex, templates[i].mapBaseIndex, @@ -383,7 +374,6 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT sGpuBgConfigs2[bg].baseTile = templates[i].baseTile; sGpuBgConfigs2[bg].basePalette = 0; - sGpuBgConfigs2[bg].unk_3 = 0; sGpuBgConfigs2[bg].tilemap = NULL; sGpuBgConfigs2[bg].bg_x = 0; @@ -396,9 +386,9 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT void InitBgFromTemplate(const struct BgTemplate *template) { - u8 bg = template->bg; + u32 bg = template->bg; - if (bg < 4) + if (bg < NUM_BACKGROUNDS) { SetBgControlAttributes(bg, template->charBaseIndex, @@ -411,21 +401,29 @@ void InitBgFromTemplate(const struct BgTemplate *template) sGpuBgConfigs2[bg].baseTile = template->baseTile; sGpuBgConfigs2[bg].basePalette = 0; - sGpuBgConfigs2[bg].unk_3 = 0; sGpuBgConfigs2[bg].tilemap = NULL; sGpuBgConfigs2[bg].bg_x = 0; sGpuBgConfigs2[bg].bg_y = 0; gpu_tile_allocation_map_bg[(template->charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1; + } } -u16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset) +void SetBgMode(u32 bgMode) +{ + SetBgModeInternal(bgMode); +} + +u16 LoadBgTiles(u32 bg, const void *src, u16 size, u16 destOffset) { u16 tileOffset; u8 cursor; + if (bg > 3) + return -1; + if (GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE) == 0) { tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x20; @@ -445,18 +443,14 @@ u16 LoadBgTiles(u8 bg, const void *src, u16 size, u16 destOffset) sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); if (gWindowTileAutoAllocEnabled == TRUE) - { BgTileAllocOp(bg, tileOffset / 0x20, size / 0x20, 1); - } return cursor; } -u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset) +u16 LoadBgTilemap(u32 bg, const void *src, u16 size, u16 destOffset) { - u8 cursor; - - cursor = LoadBgVram(bg, src, size, destOffset * 32, DISPCNT_MODE_2); + u8 cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2); if (cursor == 0xFF) { @@ -468,20 +462,17 @@ u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset) return cursor; } -u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) +u16 Unused_LoadBgPalette(u32 bg, const void *src, u16 size, u16 destOffset) { - u16 paletteOffset; s8 cursor; - if (IsInvalidBg32(bg) == FALSE) + if (!IsInvalidBg(bg)) { - paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); - cursor = RequestDma3Copy(src, (void *)(paletteOffset + BG_PLTT), size, DMA3_16BIT); + u16 paletteOffset = PLTT_OFFSET_4BPP(sGpuBgConfigs2[bg].basePalette) + (destOffset * 2); + cursor = RequestDma3Copy(src, (void *)(paletteOffset + BG_PLTT), size, 0); if (cursor == -1) - { return -1; - } } else { @@ -493,7 +484,7 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) return (u8)cursor; } -bool8 IsDma3ManagerBusyWithBgCopy(void) +bool32 IsDma3ManagerBusyWithBgCopy(void) { int i; @@ -506,97 +497,101 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) { s8 reqSpace = WaitDma3Request(i); if (reqSpace == -1) + { return TRUE; + } + sDmaBusyBitfield[div] &= ~(1 << mod); } } + return FALSE; } -void ShowBg(u8 bg) +void ShowBg(u32 bg) { ShowBgInternal(bg); SyncBgVisibilityAndMode(); } -void HideBg(u8 bg) +void HideBg(u32 bg) { HideBgInternal(bg); SyncBgVisibilityAndMode(); } -void SetBgAttribute(u8 bg, u8 attributeId, u8 value) +void SetBgAttribute(u32 bg, u32 attributeId, u8 value) { switch (attributeId) { - case 1: - SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); - break; - case 2: - SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); - break; - case 3: - SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF); - break; - case 4: - SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF); - break; - case 7: - SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF); - break; - case 5: - SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF); - break; - case 6: - SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value); - break; + case BG_ATTR_CHARBASEINDEX: + SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case BG_ATTR_MAPBASEINDEX: + SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case BG_ATTR_SCREENSIZE: + SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case BG_ATTR_PALETTEMODE: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF); + break; + case BG_ATTR_PRIORITY: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF); + break; + case BG_ATTR_MOSAIC: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF); + break; + case BG_ATTR_WRAPAROUND: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value); + break; } } -u16 GetBgAttribute(u8 bg, u8 attributeId) +u16 GetBgAttribute(u32 bg, u32 attributeId) { switch (attributeId) { - case BG_ATTR_CHARBASEINDEX: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX); - case BG_ATTR_MAPBASEINDEX: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX); - case BG_ATTR_SCREENSIZE: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); - case BG_ATTR_PALETTEMODE: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE); - case BG_ATTR_PRIORITY: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY); - case BG_ATTR_MOSAIC: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC); - case BG_ATTR_WRAPAROUND: - return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND); - case BG_ATTR_METRIC: - switch (GetBgType(bg)) - { - case BG_TYPE_NORMAL: - return GetBgMetricTextMode(bg, 0) * 0x800; - case BG_TYPE_AFFINE: - return GetBgMetricAffineMode(bg, 0) * 0x100; - default: - return 0; - } - case BG_ATTR_TYPE: - return GetBgType(bg); - case BG_ATTR_BASETILE: - return sGpuBgConfigs2[bg].baseTile; + case BG_ATTR_CHARBASEINDEX: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX); + case BG_ATTR_MAPBASEINDEX: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX); + case BG_ATTR_SCREENSIZE: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); + case BG_ATTR_PALETTEMODE: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE); + case BG_ATTR_PRIORITY: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY); + case BG_ATTR_MOSAIC: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC); + case BG_ATTR_WRAPAROUND: + return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND); + case BG_ATTR_METRIC: + switch (GetBgType(bg)) + { + case BG_TYPE_NORMAL: + return GetBgMetricTextMode(bg, 0) * 0x800; + case BG_TYPE_AFFINE: + return GetBgMetricAffineMode(bg, 0) * 0x100; default: - return -1; + return 0; + } + case BG_ATTR_TYPE: + return GetBgType(bg); + case BG_ATTR_BASETILE: + return sGpuBgConfigs2[bg].baseTile; + default: + return -1; } } -u32 ChangeBgX(u8 bg, u32 value, u8 op) +s32 ChangeBgX(u32 bg, s32 value, u8 op) { - u8 mode; + u32 mode; u16 temp1; u16 temp2; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (IsInvalidBg(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { return -1; } @@ -660,22 +655,23 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) return sGpuBgConfigs2[bg].bg_x; } -u32 GetBgX(u8 bg) +s32 GetBgX(u32 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg(bg)) return -1; - if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; + return sGpuBgConfigs2[bg].bg_x; } -u32 ChangeBgY(u8 bg, u32 value, u8 op) +s32 ChangeBgY(u32 bg, s32 value, u8 op) { - u8 mode; + u32 mode; u16 temp1; u16 temp2; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (IsInvalidBg(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { return -1; } @@ -810,16 +806,17 @@ s32 ChangeBgY_ScreenOff(u32 bg, s32 value, u8 op) return sGpuBgConfigs2[bg].bg_y; } -u32 GetBgY(u8 bg) +s32 GetBgY(u32 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg(bg)) return -1; - if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; + return sGpuBgConfigs2[bg].bg_y; } -void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) +void SetBgAffine(u32 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle); } @@ -878,43 +875,40 @@ u8 AdjustBgMosaic(u8 value, u8 mode) return mosaicSize; } -void SetBgTilemapBuffer(u8 bg, void *tilemap) +void SetBgTilemapBuffer(u32 bg, void *tilemap) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) + if (!IsInvalidBg(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { sGpuBgConfigs2[bg].tilemap = tilemap; } } -void UnsetBgTilemapBuffer(u8 bg) +void UnsetBgTilemapBuffer(u32 bg) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) + if (!IsInvalidBg(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { sGpuBgConfigs2[bg].tilemap = NULL; } } -void *GetBgTilemapBuffer(u8 bg) +void *GetBgTilemapBuffer(u32 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg(bg)) return NULL; - if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return NULL; + return sGpuBgConfigs2[bg].tilemap; } -void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset) +void CopyToBgTilemapBuffer(u32 bg, const void *src, u32 mode, u32 destOffset) { - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { if (mode != 0) - { - CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)), mode); - } + CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); else - { - DecompressDataWithHeaderWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32))); - } + DecompressDataWithHeaderWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); } } @@ -926,107 +920,104 @@ void DecompressAndCopyToBgTilemapBuffer(u32 bg, const u32 *src, u32 mode, u32 de Free(buffer); } -void CopyBgTilemapBufferToVram(u8 bg) +void CopyBgTilemapBufferToVram(u32 bg) { u16 sizeToLoad; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { - case 0: - sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; - break; - case 1: - sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; - break; - default: - sizeToLoad = 0; - break; + case BG_TYPE_NORMAL: + sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; + break; + case BG_TYPE_AFFINE: + sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; + break; + default: + sizeToLoad = 0; + break; } LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2); } } -void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) +void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) { - u16 destX16; - u16 destY16; u16 mode; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { - case 0: + case BG_TYPE_NORMAL: + { + const u16 *srcCopy = src; + for (u32 j = destY; j < (destY + height); j++) { - const u16 * srcCopy = src; - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 i = destX; i < (destX + width); i++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) - { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *(srcCopy)++; - } + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = *srcCopy++; } - break; } - case 1: + break; + } + case BG_TYPE_AFFINE: + { + const u8 *srcCopy = src; + mode = GetBgMetricAffineMode(bg, 0x1); + for (u32 j = destY; j < (destY + height); j++) { - const u8 * srcCopy = src; - mode = GetBgMetricAffineMode(bg, 0x1); - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 i = destX; i < (destX + width); i++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) - { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *(srcCopy)++; - } + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = *srcCopy++; } - break; } + break; + } } } } -void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette) +void CopyToBgTilemapBufferRect_ChangePalette(u32 bg, const void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette) { CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0); } -void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2) +void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, s16 tileOffset, s16 palette2) { u16 screenWidth, screenHeight, screenSize; u16 var; const void *srcPtr; - u16 i, j; - if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); screenWidth = GetBgMetricTextMode(bg, 0x1) * 0x20; screenHeight = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) { - case 0: + case BG_TYPE_NORMAL: srcPtr = src + ((srcY * srcWidth) + srcX) * 2; - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight); + u16 index = GetTileMapIndexFromCoords(i, j, screenSize, screenWidth, screenHeight); CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), palette1, tileOffset, palette2); srcPtr += 2; } srcPtr += (srcWidth - rectWidth) * 2; } break; - case 1: + case BG_TYPE_AFFINE: srcPtr = src + ((srcY * srcWidth) + srcX); var = GetBgMetricAffineMode(bg, 0x1); - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8 *)(srcPtr) + tileOffset; + *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * j) + i)) = *(u8 *)(srcPtr) + tileOffset; srcPtr++; } srcPtr += (srcWidth - rectWidth); @@ -1036,158 +1027,149 @@ void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 } } -void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height) +void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height) { - u16 x16; - u16 y16; u16 mode; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { - case 0: - for (y16 = y; y16 < (y + height); y16++) + case BG_TYPE_NORMAL: + for (u32 j = y; j < (y + height); j++) + { + for (u32 i = x; i < (x + width); i++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; - } + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = tileNum; } - break; - case 1: - mode = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + } + break; + case BG_TYPE_AFFINE: + mode = GetBgMetricAffineMode(bg, 0x1); + for (u32 j = y; j < (y + height); j++) + { + for (u32 i = x; i < (x + width); i++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; - } + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = tileNum; } - break; + } + break; } } } -void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette) +void FillBgTilemapBufferRect(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette) { WriteSequenceToBgTilemapBuffer(bg, tileNum, x, y, width, height, palette, 0); } -void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta) +void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta) { u16 mode; u16 mode2; u16 attribute; u16 mode3; - u16 x16; - u16 y16; - - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) { - case 0: - for (y16 = y; y16 < (y + height); y16++) + case BG_TYPE_NORMAL: + for (u32 j = y; j < (y + height); j++) + { + for (u32 i = x; i < (x + width); i++) { - for (x16 = x; x16 < (x + width); x16++) - { - CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); - firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); - } + CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(i, j, attribute, mode, mode2)], paletteSlot, 0, 0); + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } - break; - case 1: - mode3 = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + } + break; + case BG_TYPE_AFFINE: + mode3 = GetBgMetricAffineMode(bg, 0x1); + for (u32 j = y; j < (y + height); j++) + { + for (u32 i = x; i < (x + width); i++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; - firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); - } + ((u8 *)sGpuBgConfigs2[bg].tilemap)[(j * mode3) + i] = firstTileNum; + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } - break; + } + break; } } } -u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) +u16 GetBgMetricTextMode(u32 bg, u32 whichMetric) { - u8 attribute; - - attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); + u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { + case 0: + switch (screenSize) + { case 0: - switch (attribute) - { - case 0: - return 1; - case 1: - case 2: - return 2; - case 3: - return 4; - } - break; + return 1; case 1: - switch (attribute) - { - case 0: - return 1; - case 1: - return 2; - case 2: - return 1; - case 3: - return 2; - } - break; case 2: - switch (attribute) - { - case 0: - case 1: - return 1; - case 2: - case 3: - return 2; - } - break; + return 2; + case 3: + return 4; + } + break; + case 1: + switch (screenSize) + { + case 0: + return 1; + case 1: + return 2; + case 2: + return 1; + case 3: + return 2; + } + break; + case 2: + switch (screenSize) + { + case 0: + case 1: + return 1; + case 2: + case 3: + return 2; + } + break; } return 0; } -u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) +u32 GetBgMetricAffineMode(u32 bg, u32 whichMetric) { - u8 attribute; - - attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); + u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { + case 0: + switch (screenSize) + { case 0: - switch (attribute) - { - case 0: - return 0x1; - case 1: - return 0x4; - case 2: - return 0x10; - case 3: - return 0x40; - } - break; + return 0x1; case 1: + return 0x4; case 2: - return 0x10 << attribute; + return 0x10; + case 3: + return 0x40; + } + break; + case 1: + case 2: + return 0x10 << screenSize; } return 0; } @@ -1199,18 +1181,19 @@ u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 switch (screenSize) { - case 0: - case 2: - break; - case 3: - if (y >= 0x20) - y += 0x20; - case 1: - if (x >= 0x20) - { - x -= 0x20; - y += 0x20; - } + case 0: + case 2: + break; + case 3: + if (y >= 0x20) + y += 0x20; + case 1: + if (x >= 0x20) + { + x -= 0x20; + y += 0x20; + } + break; } return (y * 0x20) + x; } @@ -1238,60 +1221,51 @@ void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s *dest = var; } -u32 GetBgType(u8 bg) +static u32 GetBgType(u32 bg) { - u8 mode; - - mode = GetBgMode(); - + u32 mode = GetBgMode(); switch (bg) { + case 0: + case 1: + switch (mode) + { case 0: case 1: - switch (mode) - { - case 0: - case 1: - return 0; - } - break; + return BG_TYPE_NORMAL; + } + break; + case 2: + switch (mode) + { + case 0: + return BG_TYPE_NORMAL; + case 1: case 2: - switch (mode) - { - case 0: - return 0; - case 1: - case 2: - return 1; - } - break; - case 3: - switch (mode) - { - case 0: - return 0; - case 2: - return 1; - } - break; + return BG_TYPE_AFFINE; + } + break; + case 3: + switch (mode) + { + case 0: + return BG_TYPE_NORMAL; + case 2: + return BG_TYPE_AFFINE; + } + break; } - return 0xFFFF; + return BG_TYPE_NONE; } -bool32 IsInvalidBg32(u8 bg) -{ - if (bg > 3) - return TRUE; - return FALSE; -} - -bool32 IsTileMapOutsideWram(u8 bg) +bool32 IsTileMapOutsideWram(u32 bg) { if (sGpuBgConfigs2[bg].tilemap > (void *)IWRAM_END) return TRUE; - if (sGpuBgConfigs2[bg].tilemap == 0x0) + if (sGpuBgConfigs2[bg].tilemap == NULL) return TRUE; + return FALSE; } diff --git a/src/window.c b/src/window.c index 51b473e89..f2f2736ba 100644 --- a/src/window.c +++ b/src/window.c @@ -6,7 +6,7 @@ #include "decompress.h" COMMON_DATA void *gWindowBgTilemapBuffers[NUM_BACKGROUNDS] = {0}; -extern u32 gWindowTileAutoAllocEnabled; +extern bool32 gWindowTileAutoAllocEnabled; EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};