From f3a164076dad10428b852bf660e6ddddc5f58dc1 Mon Sep 17 00:00:00 2001 From: easyaspi314 <6258309+easyaspi314@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:20:19 -0400 Subject: [PATCH] Cut VRAM usage roughly in half Memory manufacturers and AAA game studios hate her! With some clever rearranging, PTGB now uses only 36 KiB of the 64 KiB BG VRAM. This means the remaining 28 KiB is free to use in the future. Caveats: The flex tileset must not use more that 6 KiB. There is a check for it added. VRAM Map 06000000 - 06000800 ( 2K): Eternal backdrop and textbox tileset 06000800 - 06002000 ( 6K): Flex BG tileset 06002000 - 06002400 ( 2K): BG0: Backdrop tilemap 06002800 - 06003000 ( 2K): BG1: Flex BG tilemap 06003000 - 06003800 ( 2K): BG2: Textbox tilemap 06003800 - 06004000 ( 2K): BG3: Text tilemap 06004000 -~06009000 (20K): Text rendering bitmap 06009000 - 06010000 (28K): Free work RAM 06010000 - 06018000 (32K): Sprite tileset Additionally: - Explicitly clear VRAM on boot - Dirty workaround to fix box drawing buffer overflow. - Flex backgrounds use a table instead of a huge switch statement - Textbox tile IDs are now const u16[] instead of int[] --- graphics/boxBG.grit | 2 +- graphics/fennelBG.grit | 2 +- graphics/languages/chineseSI/dexBG.grit | 2 +- graphics/languages/chineseSI/openingBG.grit | 2 +- graphics/languages/chineseTR/dexBG.grit | 2 +- graphics/languages/chineseTR/openingBG.grit | 2 +- graphics/languages/english/dexBG.grit | 2 +- graphics/languages/english/openingBG.grit | 2 +- graphics/languages/french/dexBG.grit | 2 +- graphics/languages/french/openingBG.grit | 2 +- graphics/languages/german/dexBG.grit | 2 +- graphics/languages/german/openingBG.grit | 2 +- graphics/languages/italian/dexBG.grit | 2 +- graphics/languages/italian/openingBG.grit | 2 +- graphics/languages/japanese/dexBG.grit | 2 +- graphics/languages/japanese/openingBG.grit | 2 +- graphics/languages/korean/dexBG.grit | 2 +- graphics/languages/korean/openingBG.grit | 2 +- graphics/languages/portugueseBR/dexBG.grit | 2 +- .../languages/portugueseBR/openingBG.grit | 2 +- graphics/languages/spanishEU/dexBG.grit | 2 +- graphics/languages/spanishEU/openingBG.grit | 2 +- graphics/languages/spanishLA/dexBG.grit | 2 +- graphics/languages/spanishLA/openingBG.grit | 2 +- graphics/menu_bars.grit | 2 +- graphics/textBoxBG.grit | 2 +- include/sprite_data.h | 28 ++ source/main.cpp | 2 + source/sprite_data.cpp | 261 +++++++++--------- source/text_engine.cpp | 27 +- 30 files changed, 192 insertions(+), 178 deletions(-) diff --git a/graphics/boxBG.grit b/graphics/boxBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/boxBG.grit +++ b/graphics/boxBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/fennelBG.grit b/graphics/fennelBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/fennelBG.grit +++ b/graphics/fennelBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/chineseSI/dexBG.grit b/graphics/languages/chineseSI/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/chineseSI/dexBG.grit +++ b/graphics/languages/chineseSI/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/chineseSI/openingBG.grit b/graphics/languages/chineseSI/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/chineseSI/openingBG.grit +++ b/graphics/languages/chineseSI/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/chineseTR/dexBG.grit b/graphics/languages/chineseTR/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/chineseTR/dexBG.grit +++ b/graphics/languages/chineseTR/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/chineseTR/openingBG.grit b/graphics/languages/chineseTR/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/chineseTR/openingBG.grit +++ b/graphics/languages/chineseTR/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/english/dexBG.grit b/graphics/languages/english/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/english/dexBG.grit +++ b/graphics/languages/english/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/english/openingBG.grit b/graphics/languages/english/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/english/openingBG.grit +++ b/graphics/languages/english/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/french/dexBG.grit b/graphics/languages/french/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/french/dexBG.grit +++ b/graphics/languages/french/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/french/openingBG.grit b/graphics/languages/french/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/french/openingBG.grit +++ b/graphics/languages/french/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/german/dexBG.grit b/graphics/languages/german/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/german/dexBG.grit +++ b/graphics/languages/german/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/german/openingBG.grit b/graphics/languages/german/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/german/openingBG.grit +++ b/graphics/languages/german/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/italian/dexBG.grit b/graphics/languages/italian/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/italian/dexBG.grit +++ b/graphics/languages/italian/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/italian/openingBG.grit b/graphics/languages/italian/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/italian/openingBG.grit +++ b/graphics/languages/italian/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/japanese/dexBG.grit b/graphics/languages/japanese/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/japanese/dexBG.grit +++ b/graphics/languages/japanese/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/japanese/openingBG.grit b/graphics/languages/japanese/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/japanese/openingBG.grit +++ b/graphics/languages/japanese/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/korean/dexBG.grit b/graphics/languages/korean/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/korean/dexBG.grit +++ b/graphics/languages/korean/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/korean/openingBG.grit b/graphics/languages/korean/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/korean/openingBG.grit +++ b/graphics/languages/korean/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/portugueseBR/dexBG.grit b/graphics/languages/portugueseBR/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/portugueseBR/dexBG.grit +++ b/graphics/languages/portugueseBR/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/portugueseBR/openingBG.grit b/graphics/languages/portugueseBR/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/portugueseBR/openingBG.grit +++ b/graphics/languages/portugueseBR/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/spanishEU/dexBG.grit b/graphics/languages/spanishEU/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/spanishEU/dexBG.grit +++ b/graphics/languages/spanishEU/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/spanishEU/openingBG.grit b/graphics/languages/spanishEU/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/spanishEU/openingBG.grit +++ b/graphics/languages/spanishEU/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/spanishLA/dexBG.grit b/graphics/languages/spanishLA/dexBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/spanishLA/dexBG.grit +++ b/graphics/languages/spanishLA/dexBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/languages/spanishLA/openingBG.grit b/graphics/languages/spanishLA/openingBG.grit index 75206cd..2a3d2d2 100644 --- a/graphics/languages/spanishLA/openingBG.grit +++ b/graphics/languages/spanishLA/openingBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/menu_bars.grit b/graphics/menu_bars.grit index 473b559..29e9196 100644 --- a/graphics/menu_bars.grit +++ b/graphics/menu_bars.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, not compressed. # Pallet bank 2, copy from 32 to 48. # --gt -gB4 -gzl -mR4 -mLs -mp2 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp2 -ma64 -mzl -ps0 -pe16 diff --git a/graphics/textBoxBG.grit b/graphics/textBoxBG.grit index 4465e6c..c58404b 100644 --- a/graphics/textBoxBG.grit +++ b/graphics/textBoxBG.grit @@ -2,5 +2,5 @@ # Text Box (Background) : 64x64t, 4bpp, SBB-layout, LZ77 compressed. # Pallet bank 1, copy from 16 to 32. # --gt -gB4 -gzl -mR4 -mLs -mp1 -mzl -ps0 -pe16 +-gt -gB4 -gzl -mR4 -mLs -mp1 -ma38 -mzl -ps0 -pe16 diff --git a/include/sprite_data.h b/include/sprite_data.h index 2f0bbc6..383de42 100644 --- a/include/sprite_data.h +++ b/include/sprite_data.h @@ -112,6 +112,34 @@ extern OBJ_ATTR *grabbed_front_sprite; #define FLEXBG_MAIN_MENU 3 #define FLEXBG_BOX 4 +// +// VRAM usage is heavily optimized so the rest of it can be used +// as additional work RAM in the future. +// +// VRAM Map +// 06000000 - 06000800 ( 2K): Eternal backdrop and textbox tileset +// 06000800 - 06002000 ( 6K): Flex BG tileset +// 06002000 - 06002400 ( 2K): BG0: Backdrop tilemap +// 06002800 - 06003000 ( 2K): BG1: Flex BG tilemap +// 06003000 - 06003800 ( 2K): BG2: Textbox tilemap +// 06003800 - 06004000 ( 2K): BG3: Text tilemap +// 06004000 -~06009000 (20K): Text rendering bitmap +// 06009000 - 06010000 (28K): Free work RAM (watch the 16-bit bus!) +// 06010000 - 06018000 (32K): Sprite tileset +// + +#define TILESET_PTGB 0 +#define TILESET_TEXT 1 + +#define TILESET_OFFSET_BACKDROP 0 +#define TILESET_OFFSET_TEXTBOX 38 +#define TILESET_OFFSET_FLEXBG 64 + +#define TILEMAP_BACKDROP 4 +#define TILEMAP_FLEXBG 5 +#define TILEMAP_TEXTBOX 6 +#define TILEMAP_TEXT 7 + extern rom_data curr_GBA_rom; void load_sprite(OBJ_ATTR *sprite, const unsigned int objTiles[], int objTilesLen, diff --git a/source/main.cpp b/source/main.cpp index 4fb483b..fbb918c 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -383,6 +383,8 @@ static void __attribute__((noinline)) show_intro() int main(void) { + // Clear VRAM. We use it as extra BSS. + RegisterRamReset(RESET_VRAM); malloc_init_default_pool(); initialization_script(); diff --git a/source/sprite_data.cpp b/source/sprite_data.cpp index d02965d..152c3b9 100644 --- a/source/sprite_data.cpp +++ b/source/sprite_data.cpp @@ -20,15 +20,13 @@ int y_offset_direction = 1; #include "background.h" void load_background() { - int CBB = 2; - int SBB = 12; // Load palette tonccpy(pal_bg_mem, backgroundPal, backgroundPalLen); // Load tiles into CBB 0 - LZ77UnCompVram(backgroundTiles, &tile_mem[CBB][0]); + LZ77UnCompVram(backgroundTiles, &tile_mem[TILESET_PTGB][TILESET_OFFSET_BACKDROP]); // Load map into SBB 0 - LZ77UnCompVram(backgroundMap, &se_mem[SBB][0]); - BG_BACKDROP = BG_CBB(CBB) | BG_SBB(SBB) | BG_4BPP | BG_REG_32x32 | BG_PRIO(3); + LZ77UnCompVram(backgroundMap, &se_mem[TILEMAP_BACKDROP][0]); + BG_BACKDROP = BG_CBB(TILESET_PTGB) | BG_SBB(TILEMAP_BACKDROP) | BG_4BPP | BG_REG_32x32 | BG_PRIO(3); } void set_background_pal(int curr_rom_id, bool dark, bool fade) @@ -124,108 +122,101 @@ void set_background_pal(int curr_rom_id, bool dark, bool fade) #include "menu_bars.h" #include "boxBG.h" +struct flex_background { + const unsigned short *palette; + u16 palette_len; + u16 voffset; + const unsigned int *tileset; + const unsigned short *tilemap; +}; + +static const flex_background FLEX_BACKGROUNDS[] = { + [FLEXBG_OPENING] = { + openingBGPal, + openingBGPalLen, + 96, + openingBGTiles, + openingBGMap, + }, + [FLEXBG_FENNEL] = { + fennelBGPal, + fennelBGPalLen, + FENNEL_SHIFT, + fennelBGTiles, + fennelBGMap, + }, + [FLEXBG_DEX] = { + dexBGPal, + dexBGPalLen, + 0, + dexBGTiles, + dexBGMap, + }, + [FLEXBG_MAIN_MENU] = { + pal_bg_mem, + backgroundPalLen, + 0, + menu_barsTiles, + menu_barsMap, + }, + [FLEXBG_BOX] = { + boxBGPal, + boxBGPalLen, + 0, + boxBGTiles, + boxBGMap, + } +}; + void load_flex_background(int background_id, int layer) { - int CBB = 3; // CBB is the tiles that make up the sprite - int SBB = 31; // SSB is the array of which tile goes where - if (curr_flex_background != background_id) // Only load the background if it isn't already loaded { // This prevents screen tearing on this frame global_next_frame(); BG_FLEX = (BG_FLEX && !BG_PRIO_MASK) | BG_PRIO(3); - - switch (background_id) - { - case (FLEXBG_OPENING): - // Load palette - tonccpy(pal_bg_mem + 32, openingBGPal, openingBGPalLen); - // Load tiles into CBB 0 - LZ77UnCompVram(openingBGTiles, &tile_mem[CBB][0]); - // Give it a frame to uncompress the data - global_next_frame(); - // Load map into SBB 0 - LZ77UnCompVram(openingBGMap, &se_mem[SBB][0]); - REG_BG1VOFS = 96; - break; - case (FLEXBG_FENNEL): - // Load palette - tonccpy(pal_bg_mem + 32, fennelBGPal, fennelBGPalLen); - // Load tiles into CBB 0 - LZ77UnCompVram(fennelBGTiles, &tile_mem[CBB][0]); - // Give it a frame to uncompress the data - global_next_frame(); - // Load map into SBB 0 - LZ77UnCompVram(fennelBGMap, &se_mem[SBB][0]); - REG_BG1VOFS = FENNEL_SHIFT; - break; - case (FLEXBG_DEX): - // Load palette - tonccpy(pal_bg_mem + 32, dexBGPal, dexBGPalLen); - // Load tiles into CBB 0 - LZ77UnCompVram(dexBGTiles, &tile_mem[CBB][0]); - // Give it a frame to uncompress the data - global_next_frame(); - // Load map into SBB 0 - LZ77UnCompVram(dexBGMap, &se_mem[SBB][0]); - REG_BG1VOFS = 0; - break; - case (FLEXBG_MAIN_MENU): - // Load palette - tonccpy(pal_bg_mem + 32, pal_bg_mem, backgroundPalLen); - // Load tiles into CBB 0 - LZ77UnCompVram(menu_barsTiles, &tile_mem[CBB][0]); - // Give it a frame to uncompress the data - global_next_frame(); - // Load map into SBB 0 - LZ77UnCompVram(menu_barsMap, &se_mem[SBB][0]); - REG_BG1VOFS = 0; - break; - case (FLEXBG_BOX): - // Load palette - tonccpy(pal_bg_mem + 32, boxBGPal, boxBGPalLen); - // Load tiles into CBB 0 - LZ77UnCompVram(boxBGTiles, &tile_mem[CBB][0]); - // Give it a frame to uncompress the data - global_next_frame(); - // Load map into SBB 0 - LZ77UnCompVram(boxBGMap, &se_mem[SBB][0]); - REG_BG1VOFS = 0; - break; + const flex_background *flex = &FLEX_BACKGROUNDS[background_id]; +#ifdef DEBUG + // Check to make sure we aren't overflowing tile memory + if ((flex->tileset[0] >> 8) > (6 * 1024)) { + for (;;) {} } +#endif + tonccpy(pal_bg_mem + 32, flex->palette, flex->palette_len); + // Load tiles + LZ77UnCompVram(flex->tileset, &tile_mem[TILESET_PTGB][TILESET_OFFSET_FLEXBG]); + // Give it a frame to uncompress the data + global_next_frame(); + // Load map into the tilemap + LZ77UnCompVram(flex->tilemap, &se_mem[TILEMAP_FLEXBG][0]); + // Set vertical offset + REG_BG1VOFS = flex->voffset; } - BG_FLEX = BG_CBB(CBB) | BG_SBB(SBB) | BG_4BPP | BG_REG_32x32 | BG_PRIO(layer); + BG_FLEX = BG_CBB(TILESET_PTGB) | BG_SBB(TILEMAP_FLEXBG) | BG_4BPP | BG_REG_32x32 | BG_PRIO(layer); curr_flex_background = background_id; } #include "textBoxBG.h" void load_textbox_background() { - int CBB = 2; - int SBB = 20; // Load palette tonccpy(pal_bg_mem + 16, textBoxBGPal, textBoxBGPalLen); // Load tiles into CBB 0 - LZ77UnCompVram(textBoxBGTiles, &tile_mem[CBB][38]); + LZ77UnCompVram(textBoxBGTiles, &tile_mem[TILESET_PTGB][TILESET_OFFSET_TEXTBOX]); // Load map into SBB 0 reload_textbox_background(); REG_BG2VOFS = 96; - BG_TEXTBOX = BG_CBB(CBB) | BG_SBB(SBB) | BG_4BPP | BG_REG_32x32 | BG_PRIO(3); + BG_TEXTBOX = BG_CBB(TILESET_PTGB) | BG_SBB(TILEMAP_TEXTBOX) | BG_4BPP | BG_REG_32x32 | BG_PRIO(3); } void reload_textbox_background() { - int SBB = 20; - LZ77UnCompVram(textBoxBGMap, &se_mem[SBB][0]); - for (int i = 0; i < 1024; i++) - { - se_mem[SBB][i] += 38; // This should be overflow protected, but if we're flipping back around we're already in trouble - } + LZ77UnCompVram(textBoxBGMap, &se_mem[TILEMAP_TEXTBOX][0]); } // tile ID, VH Flip, Palette Bank -#define TILE_OFFSET 38 +#define TILE_OFFSET TILESET_OFFSET_TEXTBOX #define TILE_CLEAR ((0 + TILE_OFFSET) | (0b00 << 0xA) | (1 << 0xC)) #define TILE_MID ((1 + TILE_OFFSET) | (0b00 << 0xA) | (1 << 0xC)) #define TILE_N ((2 + TILE_OFFSET) | (0b00 << 0xA) | (1 << 0xC)) @@ -258,52 +249,51 @@ void reload_textbox_background() #define MENU_WIDTH 11 - 1 // Currently static -static int TILE_SE_U_ARR[4] = {TILE_SE_0, TILE_SE_2, TILE_SE_4U, TILE_SE_6U}; -static int TILE_S_U_ARR[4] = {TILE_S_0, TILE_S_2, TILE_S_4U, TILE_S_6U}; -static int TILE_SW_U_ARR[4] = {TILE_SW_0, TILE_SW_2, TILE_SW_4U, TILE_SW_6U}; -static int TILE_SE_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_SE_4L, TILE_SE_6L}; -static int TILE_S_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_S_4L, TILE_S_6L}; -static int TILE_SW_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_SW_4L, TILE_SW_6L}; +static const u16 TILE_SE_U_ARR[4] = {TILE_SE_0, TILE_SE_2, TILE_SE_4U, TILE_SE_6U}; +static const u16 TILE_S_U_ARR[4] = {TILE_S_0, TILE_S_2, TILE_S_4U, TILE_S_6U}; +static const u16 TILE_SW_U_ARR[4] = {TILE_SW_0, TILE_SW_2, TILE_SW_4U, TILE_SW_6U}; +static const u16 TILE_SE_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_SE_4L, TILE_SE_6L}; +static const u16 TILE_S_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_S_4L, TILE_S_6L}; +static const u16 TILE_SW_L_ARR[4] = {TILE_CLEAR, TILE_CLEAR, TILE_SW_4L, TILE_SW_6L}; void add_menu_box(int options, int startTileX, int startTileY) { add_menu_box(startTileX, startTileY, (MENU_WIDTH) * 8, (options * 10) + 16); } +// TODO: clean this mess. manual masking used for now but there is a buffer overflow in how the bottom +// row is calculated. void add_menu_box(int startTileX, int startTileY, int full_width, int full_height) { - // We can't check the current offset very easily, so we'll just assume it's in the text box position. startTileY += 12; - int SBB = 20; - int start = (32 * startTileY) + startTileX; int tiles = (full_height / 8) - 1; // For the flex edge int vert_rem = full_height % 8; full_width = (full_width / 8) - 1; // For the right edge // Corners - se_mem[SBB][start] = TILE_NW; - se_mem[SBB][start + full_width] = TILE_NE; - se_mem[SBB][start + (32 * (tiles))] = TILE_SW_U_ARR[vert_rem / 2]; - se_mem[SBB][start + (32 * (tiles + 1))] = TILE_SW_L_ARR[vert_rem / 2]; - se_mem[SBB][start + (32 * (tiles)) + full_width] = TILE_SE_U_ARR[vert_rem / 2]; - se_mem[SBB][start + (32 * (tiles + 1)) + full_width] = TILE_SE_L_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][start] = TILE_NW; + se_mem[TILEMAP_TEXTBOX][start + full_width] = TILE_NE; + se_mem[TILEMAP_TEXTBOX][(start + (32 * (tiles))) & 0x3ff] = TILE_SW_U_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][(start + (32 * (tiles + 1))) & 0x3ff] = TILE_SW_L_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][(start + (32 * (tiles)) + full_width) & 0x3ff] = TILE_SE_U_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][(start + (32 * (tiles + 1)) + full_width) & 0x3ff] = TILE_SE_L_ARR[vert_rem / 2]; // Top and bottom edge for (int i = 1; i < full_width; i++) { - se_mem[SBB][start + i] = TILE_N; - se_mem[SBB][start + ((32 * (tiles))) + i] = TILE_S_U_ARR[vert_rem / 2]; - se_mem[SBB][start + ((32 * (tiles + 1))) + i] = TILE_S_L_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][start + i] = TILE_N; + se_mem[TILEMAP_TEXTBOX][(start + ((32 * (tiles))) + i) & 0x3ff] = TILE_S_U_ARR[vert_rem / 2]; + se_mem[TILEMAP_TEXTBOX][(start + ((32 * (tiles + 1))) + i) & 0x3ff] = TILE_S_L_ARR[vert_rem / 2]; } // Sides for (int i = 1; i < tiles; i++) { - se_mem[SBB][start + (32 * i) + full_width] = TILE_E; - se_mem[SBB][start + (32 * i)] = TILE_W; + se_mem[TILEMAP_TEXTBOX][(start + (32 * i) + full_width) & 0x3ff] = TILE_E; + se_mem[TILEMAP_TEXTBOX][(start + (32 * i)) & 0x3ff] = TILE_W; } // Middle @@ -311,7 +301,7 @@ void add_menu_box(int startTileX, int startTileY, int full_width, int full_heigh { for (int y = 1; y < tiles; y++) { - se_mem[SBB][start + (32 * y) + x] = TILE_MID; + se_mem[TILEMAP_TEXTBOX][(start + (32 * y) + x) & 0x3ff] = TILE_MID; } } } @@ -323,13 +313,12 @@ void erase_textbox_tiles() int startTileY = 12; int start = (32 * startTileY); - int SBB = 20; for (int x = 0; x < 30; x++) { for (int y = 0; y < 20; y++) { - se_mem[SBB][start + (32 * y) + x] = TILE_CLEAR; + se_mem[TILEMAP_TEXTBOX][start + (32 * y) + x] = TILE_CLEAR; } } } @@ -770,47 +759,46 @@ void load_select_sprites(u8 game_id, u8 lang) tonccpy(pal_obj_mem + (GBA_CART_PAL * 16), gba_cart_palette, 32); } // tile ID, VH Flip, Palette Bank -#define FEN_BLI_L00 (34 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_L01 (35 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_L10 (140 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_L11 (141 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_L20 (143 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_L21 (144 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_R0 (37 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_R1 (142 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_BLI_R2 (145 | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L00 ((TILESET_OFFSET_FLEXBG + 34) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L01 ((TILESET_OFFSET_FLEXBG + 35) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L10 ((TILESET_OFFSET_FLEXBG + 140) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L11 ((TILESET_OFFSET_FLEXBG + 141) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L20 ((TILESET_OFFSET_FLEXBG + 143) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_L21 ((TILESET_OFFSET_FLEXBG + 144) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_R0 ((TILESET_OFFSET_FLEXBG + 37) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_R1 ((TILESET_OFFSET_FLEXBG + 142) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_BLI_R2 ((TILESET_OFFSET_FLEXBG + 145) | (0b00 << 0xA) | (2 << 0xC)) // tile ID, VH Flip, Palette Bank -#define FEN_SPE_00 (46 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_01 (56 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_10 (146 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_11 (56 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_20 (147 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_21 (149 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_30 (148 | (0b00 << 0xA) | (2 << 0xC)) -#define FEN_SPE_31 (150 | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_00 ((TILESET_OFFSET_FLEXBG + 46) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_01 ((TILESET_OFFSET_FLEXBG + 56) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_10 ((TILESET_OFFSET_FLEXBG + 146) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_11 ((TILESET_OFFSET_FLEXBG + 56) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_20 ((TILESET_OFFSET_FLEXBG + 147) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_21 ((TILESET_OFFSET_FLEXBG + 149) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_30 ((TILESET_OFFSET_FLEXBG + 148) | (0b00 << 0xA) | (2 << 0xC)) +#define FEN_SPE_31 ((TILESET_OFFSET_FLEXBG + 150) | (0b00 << 0xA) | (2 << 0xC)) void fennel_blink(int frame) { bool missingno = get_missingno_enabled(); - int SBB = 31; // SSB is the array of which tile goes where switch (frame) { case 0: - se_mem[SBB][12 + (5 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_L20 : FEN_BLI_L20; - se_mem[SBB][13 + (5 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_BLI_L21; - se_mem[SBB][15 + (5 * 32)] = missingno ? FEN_SPE_10 | FEN_BLI_R2 : FEN_BLI_R2; + se_mem[TILEMAP_FLEXBG][12 + (5 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_L20 : FEN_BLI_L20; + se_mem[TILEMAP_FLEXBG][13 + (5 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_BLI_L21; + se_mem[TILEMAP_FLEXBG][15 + (5 * 32)] = missingno ? FEN_SPE_10 | FEN_BLI_R2 : FEN_BLI_R2; break; case 1: case 3: - se_mem[SBB][12 + (5 * 32)] = missingno ? FEN_SPE_11 | FEN_BLI_L10 : FEN_BLI_L10; - se_mem[SBB][13 + (5 * 32)] = missingno ? FEN_SPE_20 | FEN_BLI_L11 : FEN_BLI_L11; - se_mem[SBB][15 + (5 * 32)] = missingno ? FEN_SPE_21 | FEN_BLI_R1 : FEN_BLI_R1; + se_mem[TILEMAP_FLEXBG][12 + (5 * 32)] = missingno ? FEN_SPE_11 | FEN_BLI_L10 : FEN_BLI_L10; + se_mem[TILEMAP_FLEXBG][13 + (5 * 32)] = missingno ? FEN_SPE_20 | FEN_BLI_L11 : FEN_BLI_L11; + se_mem[TILEMAP_FLEXBG][15 + (5 * 32)] = missingno ? FEN_SPE_21 | FEN_BLI_R1 : FEN_BLI_R1; break; case 2: - se_mem[SBB][12 + (5 * 32)] = missingno ? FEN_SPE_30 | FEN_BLI_L00 : FEN_BLI_L00; - se_mem[SBB][13 + (5 * 32)] = missingno ? FEN_SPE_31 | FEN_BLI_L01 : FEN_BLI_L01; - se_mem[SBB][15 + (5 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_R0 : FEN_BLI_R0; + se_mem[TILEMAP_FLEXBG][12 + (5 * 32)] = missingno ? FEN_SPE_30 | FEN_BLI_L00 : FEN_BLI_L00; + se_mem[TILEMAP_FLEXBG][13 + (5 * 32)] = missingno ? FEN_SPE_31 | FEN_BLI_L01 : FEN_BLI_L01; + se_mem[TILEMAP_FLEXBG][15 + (5 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_R0 : FEN_BLI_R0; break; } } @@ -818,25 +806,24 @@ void fennel_blink(int frame) void fennel_speak(int frame) { bool missingno = get_missingno_enabled(); - int SBB = 31; // SSB is the array of which tile goes where switch (frame) { case 0: - se_mem[SBB][14 + (6 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_L20 : FEN_SPE_00; - se_mem[SBB][14 + (7 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_01; + se_mem[TILEMAP_FLEXBG][14 + (6 * 32)] = missingno ? FEN_SPE_00 | FEN_BLI_L20 : FEN_SPE_00; + se_mem[TILEMAP_FLEXBG][14 + (7 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_01; break; case 1: - se_mem[SBB][14 + (6 * 32)] = missingno ? FEN_SPE_10 | FEN_BLI_R2 : FEN_SPE_10; - se_mem[SBB][14 + (7 * 32)] = missingno ? FEN_SPE_11 | FEN_BLI_L10 : FEN_SPE_11; + se_mem[TILEMAP_FLEXBG][14 + (6 * 32)] = missingno ? FEN_SPE_10 | FEN_BLI_R2 : FEN_SPE_10; + se_mem[TILEMAP_FLEXBG][14 + (7 * 32)] = missingno ? FEN_SPE_11 | FEN_BLI_L10 : FEN_SPE_11; break; case 2: case 4: - se_mem[SBB][14 + (6 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_20; - se_mem[SBB][14 + (7 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_21; + se_mem[TILEMAP_FLEXBG][14 + (6 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_20; + se_mem[TILEMAP_FLEXBG][14 + (7 * 32)] = missingno ? FEN_SPE_01 | FEN_BLI_L21 : FEN_SPE_21; break; case 3: - se_mem[SBB][14 + (6 * 32)] = missingno ? FEN_SPE_30 | FEN_BLI_L00 : FEN_SPE_30; - se_mem[SBB][14 + (7 * 32)] = missingno ? FEN_SPE_31 | FEN_BLI_L01 : FEN_SPE_31; + se_mem[TILEMAP_FLEXBG][14 + (6 * 32)] = missingno ? FEN_SPE_30 | FEN_BLI_L00 : FEN_SPE_30; + se_mem[TILEMAP_FLEXBG][14 + (7 * 32)] = missingno ? FEN_SPE_31 | FEN_BLI_L01 : FEN_SPE_31; break; } } diff --git a/source/text_engine.cpp b/source/text_engine.cpp index d4c2af3..8fe9d77 100644 --- a/source/text_engine.cpp +++ b/source/text_engine.cpp @@ -13,9 +13,6 @@ #include "background_engine.h" #include "pokemon_data.h" -#define TEXT_CBB 0 -#define TEXT_SBB 10 - script_obj curr_line; uint char_index; uint line_char_index; @@ -73,17 +70,17 @@ void init_text_engine() // Load the TTE // tte_init_se(3, BG_CBB(TEXT_CBB) | BG_SBB(TEXT_SBB) | BG_PRIO(0), 0, CLR_WHITE, 14, &japanese_smallFont, NULL); - tte_init_chr4c(3, // BG 3 - BG_CBB(TEXT_CBB) | BG_SBB(TEXT_SBB), // Charblock 0; screenblock 10 - 0xF000, // Screen-entry offset - bytes2word( // Color attributes: - 13, // Text color - 15, // Shadow color - 0, // Paper - 0), // Special - CLR_WHITE, // White text - BUILD_FONT, // Custom font - NULL // Use default chr4 renderer + tte_init_chr4c(3, // BG 3 + BG_CBB(TILESET_TEXT) | BG_SBB(TILEMAP_TEXT), // Charblock 0; screenblock 10 + 0xF000, // Screen-entry offset + bytes2word( // Color attributes: + 13, // Text color + 15, // Shadow color + 0, // Paper + 0), // Special + CLR_WHITE, // White text + BUILD_FONT, // Custom font + NULL // Use default chr4 renderer ); tte_init_con(); @@ -500,7 +497,7 @@ void scroll_text(bool instant, TTC *tc, int left, int top, int right, int bottom // The map starts at tile 0 in the top left, increases by 1 as you go down, and then loops back at the top. for (int i = 0; i < 30; i++) { - tonccpy(&tile_mem[TEXT_CBB][0 + (i * 20)], &tile_mem[TEXT_CBB][2 + (i * 20)], 20 * 32); + tonccpy(&tile_mem[TILESET_TEXT][0 + (i * 20)], &tile_mem[TILESET_TEXT][2 + (i * 20)], 20 * 32); } // Remove text that went outside of the box and set the position