From 9c8a79d13f324b88afc9eae52372349084a63537 Mon Sep 17 00:00:00 2001 From: Electro Date: Fri, 6 Feb 2026 17:13:31 +0000 Subject: [PATCH] Rename "Bank 20" section to "Load Gfx" --- src/engine/gfx/load_gfx.asm | 310 ++++++++++++++++++++++++++++++++ src/engine/gfx/load_tilemap.asm | 309 ------------------------------- src/layout.link | 2 +- src/main.asm | 3 +- 4 files changed, 312 insertions(+), 312 deletions(-) delete mode 100644 src/engine/gfx/load_tilemap.asm diff --git a/src/engine/gfx/load_gfx.asm b/src/engine/gfx/load_gfx.asm index 4f026a4..a67acae 100644 --- a/src/engine/gfx/load_gfx.asm +++ b/src/engine/gfx/load_gfx.asm @@ -1,3 +1,313 @@ +; loads the BG map corresponding to wCurTilemap to SRAM +; bc = starting coordinates +LoadTilemap_ToSRAM: + ld a, TRUE + ld [wWriteBGMapToSRAM], a + jr LoadTilemap + +; loads the BG map corresponding to wCurTilemap to VRAM +; bc = starting coordinates +LoadTilemap_ToVRAM: + xor a ; FALSE + ld [wWriteBGMapToSRAM], a +; fallthrough + +; loads the BG map corresponding to wCurTilemap +; either loads them in VRAM or SRAM, +; depending on wWriteBGMapToSRAM +; bc = starting coordinates +LoadTilemap: + push hl + push bc + push de + call BCCoordToBGMap0Address + ld hl, wVRAMPointer + ld [hl], e + inc hl + ld [hl], d + +; get pointer and bank for BG Map + call Func_803b9 + ld a, [wTempPointerBank] + ld [wBGMapBank], a + +; store header data + ld de, wDecompressionBuffer + ld bc, $6 ; header + 1st instruction + call CopyBankedDataToDE + ld l, e + ld h, d + ld a, [hli] + ld [wBGMapWidth], a + ld a, [hli] + ld [wBGMapHeight], a + ld a, [hli] + ld [wBGMapPermissionDataPtr], a + ld a, [hli] + ld [wBGMapPermissionDataPtr + 1], a + ld a, [hli] + ld [wBGMapCGBMode], a + call .InitAndDecompressBGMap + pop de + pop bc + pop hl + ret + +; prepares the pointers for decompressing BG Map +; and calls InitDataDecompression +; then decompresses the data +.InitAndDecompressBGMap + push hl + push bc + push de + ld a, [wTempPointer] + add $5 ; header + ld e, a + ld a, [wTempPointer + 1] + adc 0 + ld d, a + ld b, HIGH(wDecompressionSecondaryBuffer) + call InitDataDecompression + ld a, [wVRAMPointer] + ld e, a + ld a, [wVRAMPointer + 1] + ld d, a + call .Decompress + pop de + pop bc + pop hl + ret + +; wTempBank:wTempPointer = source of compressed data +; wVRAMPointer = destination of decompressed data +.Decompress +; if wBGMapCGBMode is true, then use double wBGMapWidth +; since one "width" length goes to VRAM0 +; and the other "width" length goes to VRAM1 + push hl + ld hl, wDecompressionRowWidth + ld a, [wBGMapWidth] + ld [hl], a + ld a, [wBGMapCGBMode] + or a + jr z, .skip_doubling_width + sla [hl] +.skip_doubling_width + +; clear wDecompressionBuffer + ld c, $40 + ld hl, wDecompressionBuffer + xor a +.loop_clear + ld [hli], a + dec c + jr nz, .loop_clear + +; loop each row, up to the number of tiles in height + ld a, [wBGMapHeight] + ld c, a +.loop + push bc + push de + ld b, $00 + ld a, [wDecompressionRowWidth] + ld c, a + ld de, wDecompressionBuffer + call DecompressDataFromBank + + ; copy to VRAM0 + ld a, [wBGMapWidth] + ld b, a + pop de + push de + ld hl, wDecompressionBuffer + call CopyBGDataToVRAMOrSRAM + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .next_row + + ; cgb only + ; copy the second "half" to VRAM1 + call BankswitchVRAM1 + ld a, [wBGMapWidth] + ld c, a + ld b, $0 + ld hl, wDecompressionBuffer + add hl, bc + pop de + push de + ld a, [wBGMapWidth] + ld b, a + call Func_80148 ; adds some wd291 offset to tiles + call CopyBGDataToVRAMOrSRAM + call BankswitchVRAM0 + +.next_row + pop de + ld hl, TILEMAP_WIDTH + add hl, de + ld e, l + ld d, h + pop bc + dec c + jr nz, .loop + + pop hl + ret + +Func_80148: + ld a, [wd291] + or a + ret z + ld a, [wBGMapCGBMode] + or a + jr z, .asm_80162 + +; add wd291 to b bytes in hl + push hl + push bc +.loop_1 + push bc + ld a, [wd291] + add [hl] + ld [hli], a + pop bc + dec b + jr nz, .loop_1 + pop bc + pop hl + ret + +; store wd291 to b bytes in hl +.asm_80162 + push hl + push bc + ld a, [wd291] +.loop_2 + ld [hli], a + dec b + jr nz, .loop_2 + pop bc + pop hl + ret + +; copies BG Map data pointed by hl +; to either VRAM or SRAM, depending on wWriteBGMapToSRAM +; de is the target address in VRAM, +; if SRAM is the target address to copy, +; copies data to sGfxBuffer0 or sGfxBuffer1 +; for VRAM0 or VRAM1 respectively +CopyBGDataToVRAMOrSRAM: + ld a, [wWriteBGMapToSRAM] + or a + jp z, SafeCopyDataHLtoDE + +; copies b bytes from hl to SRAM1 + push hl + push bc + push de + ldh a, [hBankSRAM] + push af + ld a, BANK("SRAM1") + call BankswitchSRAM + push hl + ld hl, sGfxBuffer0 - v0BGMap0 + ldh a, [hBankVRAM] + or a + jr z, .got_pointer + ld hl, sGfxBuffer1 - v1BGMap0 +.got_pointer + add hl, de + ld e, l + ld d, h + pop hl +.loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .loop + pop af + call BankswitchSRAM + call DisableSRAM + pop de + pop bc + pop hl + ret + +; safely copies $20 bytes at a time +; sGfxBuffer0 -> v0BGMap0 +; sGfxBuffer1 -> v0BGMap1 (if in CGB) +SafelyCopyBGMapFromSRAMToVRAM: + push hl + push bc + push de + ldh a, [hBankSRAM] + push af + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer0 + ld de, v0BGMap0 + ld c, $20 +.loop + push bc + push hl + push de + ld b, $20 + call SafeCopyDataHLtoDE + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .skip_vram1 + pop de + pop hl + push hl + push de + ld bc, sGfxBuffer1 - sGfxBuffer0 ; $400 + add hl, bc + call BankswitchVRAM1 + ld b, $20 + call SafeCopyDataHLtoDE + call BankswitchVRAM0 +.skip_vram1 + + pop hl + ld de, $20 + add hl, de + ld e, l + ld d, h + pop hl + ld bc, $20 + add hl, bc + pop bc + dec c + jr nz, .loop + pop af + call BankswitchSRAM + call DisableSRAM + pop de + pop bc + pop hl + ret + +; clears sGfxBuffer0 and sGfxBuffer1 +ClearSRAMBGMaps: + push hl + push bc + ldh a, [hBankSRAM] + push af + ld a, BANK(sGfxBuffer0) ; SRAM 1 + call BankswitchSRAM + ld hl, sGfxBuffer0 + ld bc, $800 ; sGfxBuffer0 + sGfxBuffer1 + xor a + call FillMemoryWithA + pop af + call BankswitchSRAM + call DisableSRAM + pop bc + pop hl + ret + ; l - GFXTABLE_* constant (banks 0,1,2,3,4) ; a - map index (inside of the given bank) GetMapDataPointer: diff --git a/src/engine/gfx/load_tilemap.asm b/src/engine/gfx/load_tilemap.asm deleted file mode 100644 index b96b8c5..0000000 --- a/src/engine/gfx/load_tilemap.asm +++ /dev/null @@ -1,309 +0,0 @@ -; loads the BG map corresponding to wCurTilemap to SRAM -; bc = starting coordinates -LoadTilemap_ToSRAM: - ld a, TRUE - ld [wWriteBGMapToSRAM], a - jr LoadTilemap - -; loads the BG map corresponding to wCurTilemap to VRAM -; bc = starting coordinates -LoadTilemap_ToVRAM: - xor a ; FALSE - ld [wWriteBGMapToSRAM], a -; fallthrough - -; loads the BG map corresponding to wCurTilemap -; either loads them in VRAM or SRAM, -; depending on wWriteBGMapToSRAM -; bc = starting coordinates -LoadTilemap: - push hl - push bc - push de - call BCCoordToBGMap0Address - ld hl, wVRAMPointer - ld [hl], e - inc hl - ld [hl], d - -; get pointer and bank for BG Map - call Func_803b9 - ld a, [wTempPointerBank] - ld [wBGMapBank], a - -; store header data - ld de, wDecompressionBuffer - ld bc, $6 ; header + 1st instruction - call CopyBankedDataToDE - ld l, e - ld h, d - ld a, [hli] - ld [wBGMapWidth], a - ld a, [hli] - ld [wBGMapHeight], a - ld a, [hli] - ld [wBGMapPermissionDataPtr], a - ld a, [hli] - ld [wBGMapPermissionDataPtr + 1], a - ld a, [hli] - ld [wBGMapCGBMode], a - call .InitAndDecompressBGMap - pop de - pop bc - pop hl - ret - -; prepares the pointers for decompressing BG Map -; and calls InitDataDecompression -; then decompresses the data -.InitAndDecompressBGMap - push hl - push bc - push de - ld a, [wTempPointer] - add $5 ; header - ld e, a - ld a, [wTempPointer + 1] - adc 0 - ld d, a - ld b, HIGH(wDecompressionSecondaryBuffer) - call InitDataDecompression - ld a, [wVRAMPointer] - ld e, a - ld a, [wVRAMPointer + 1] - ld d, a - call .Decompress - pop de - pop bc - pop hl - ret - -; wTempBank:wTempPointer = source of compressed data -; wVRAMPointer = destination of decompressed data -.Decompress -; if wBGMapCGBMode is true, then use double wBGMapWidth -; since one "width" length goes to VRAM0 -; and the other "width" length goes to VRAM1 - push hl - ld hl, wDecompressionRowWidth - ld a, [wBGMapWidth] - ld [hl], a - ld a, [wBGMapCGBMode] - or a - jr z, .skip_doubling_width - sla [hl] -.skip_doubling_width - -; clear wDecompressionBuffer - ld c, $40 - ld hl, wDecompressionBuffer - xor a -.loop_clear - ld [hli], a - dec c - jr nz, .loop_clear - -; loop each row, up to the number of tiles in height - ld a, [wBGMapHeight] - ld c, a -.loop - push bc - push de - ld b, $00 - ld a, [wDecompressionRowWidth] - ld c, a - ld de, wDecompressionBuffer - call DecompressDataFromBank - - ; copy to VRAM0 - ld a, [wBGMapWidth] - ld b, a - pop de - push de - ld hl, wDecompressionBuffer - call CopyBGDataToVRAMOrSRAM - ld a, [wConsole] - cp CONSOLE_CGB - jr nz, .next_row - - ; cgb only - ; copy the second "half" to VRAM1 - call BankswitchVRAM1 - ld a, [wBGMapWidth] - ld c, a - ld b, $0 - ld hl, wDecompressionBuffer - add hl, bc - pop de - push de - ld a, [wBGMapWidth] - ld b, a - call Func_80148 ; adds some wd291 offset to tiles - call CopyBGDataToVRAMOrSRAM - call BankswitchVRAM0 - -.next_row - pop de - ld hl, TILEMAP_WIDTH - add hl, de - ld e, l - ld d, h - pop bc - dec c - jr nz, .loop - - pop hl - ret - -Func_80148: - ld a, [wd291] - or a - ret z - ld a, [wBGMapCGBMode] - or a - jr z, .asm_80162 - -; add wd291 to b bytes in hl - push hl - push bc -.loop_1 - push bc - ld a, [wd291] - add [hl] - ld [hli], a - pop bc - dec b - jr nz, .loop_1 - pop bc - pop hl - ret - -; store wd291 to b bytes in hl -.asm_80162 - push hl - push bc - ld a, [wd291] -.loop_2 - ld [hli], a - dec b - jr nz, .loop_2 - pop bc - pop hl - ret - -; copies BG Map data pointed by hl -; to either VRAM or SRAM, depending on wWriteBGMapToSRAM -; de is the target address in VRAM, -; if SRAM is the target address to copy, -; copies data to sGfxBuffer0 or sGfxBuffer1 -; for VRAM0 or VRAM1 respectively -CopyBGDataToVRAMOrSRAM: - ld a, [wWriteBGMapToSRAM] - or a - jp z, SafeCopyDataHLtoDE - -; copies b bytes from hl to SRAM1 - push hl - push bc - push de - ldh a, [hBankSRAM] - push af - ld a, BANK("SRAM1") - call BankswitchSRAM - push hl - ld hl, sGfxBuffer0 - v0BGMap0 - ldh a, [hBankVRAM] - or a - jr z, .got_pointer - ld hl, sGfxBuffer1 - v1BGMap0 -.got_pointer - add hl, de - ld e, l - ld d, h - pop hl -.loop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop - pop af - call BankswitchSRAM - call DisableSRAM - pop de - pop bc - pop hl - ret - -; safely copies $20 bytes at a time -; sGfxBuffer0 -> v0BGMap0 -; sGfxBuffer1 -> v0BGMap1 (if in CGB) -SafelyCopyBGMapFromSRAMToVRAM: - push hl - push bc - push de - ldh a, [hBankSRAM] - push af - ld a, BANK("SRAM1") - call BankswitchSRAM - ld hl, sGfxBuffer0 - ld de, v0BGMap0 - ld c, $20 -.loop - push bc - push hl - push de - ld b, $20 - call SafeCopyDataHLtoDE - ld a, [wConsole] - cp CONSOLE_CGB - jr nz, .skip_vram1 - pop de - pop hl - push hl - push de - ld bc, sGfxBuffer1 - sGfxBuffer0 ; $400 - add hl, bc - call BankswitchVRAM1 - ld b, $20 - call SafeCopyDataHLtoDE - call BankswitchVRAM0 -.skip_vram1 - - pop hl - ld de, $20 - add hl, de - ld e, l - ld d, h - pop hl - ld bc, $20 - add hl, bc - pop bc - dec c - jr nz, .loop - pop af - call BankswitchSRAM - call DisableSRAM - pop de - pop bc - pop hl - ret - -; clears sGfxBuffer0 and sGfxBuffer1 -ClearSRAMBGMaps: - push hl - push bc - ldh a, [hBankSRAM] - push af - ld a, BANK(sGfxBuffer0) ; SRAM 1 - call BankswitchSRAM - ld hl, sGfxBuffer0 - ld bc, $800 ; sGfxBuffer0 + sGfxBuffer1 - xor a - call FillMemoryWithA - pop af - call BankswitchSRAM - call DisableSRAM - pop bc - pop hl - ret diff --git a/src/layout.link b/src/layout.link index 7f5e451..07c661d 100644 --- a/src/layout.link +++ b/src/layout.link @@ -114,7 +114,7 @@ ROMX $1d ROMX $1e "Gfx 2" ROMX $20 - "Bank 20" + "Load Gfx" "Gfx" ROMX $21 "Gfx 3" diff --git a/src/main.asm b/src/main.asm index 0199fa8..244814b 100644 --- a/src/main.asm +++ b/src/main.asm @@ -171,9 +171,8 @@ INCLUDE "data/cards.asm" SECTION "SGB", ROMX INCLUDE "engine/sgb.asm" -SECTION "Bank 20", ROMX +SECTION "Load Gfx", ROMX INCLUDE "engine/overworld/load_overworld.asm" -INCLUDE "engine/gfx/load_tilemap.asm" INCLUDE "engine/gfx/load_gfx.asm" INCLUDE "engine/overworld/animation.asm" INCLUDE "engine/overworld/map_events.asm"