aboutsummaryrefslogtreecommitdiffstats
path: root/src/term.asm
diff options
context:
space:
mode:
authoruser <user@clank>2026-07-18 21:56:21 +0200
committeruser <user@clank>2026-07-18 21:56:21 +0200
commitbea52bc8f99ee6dbcc8154a366560fc18e7b24c8 (patch)
tree0772b5d9e98de7f6c495198844c230537c7fb9d6 /src/term.asm
parentterm: SCY ring-scroll - scroll writes ONE map row; OSK toggle is 212 cycles (diff)
downloadgbos-bea52bc8f99ee6dbcc8154a366560fc18e7b24c8.tar.gz
gbos-bea52bc8f99ee6dbcc8154a366560fc18e7b24c8.tar.xz
gbos-bea52bc8f99ee6dbcc8154a366560fc18e7b24c8.zip
term: latch SCY in VBlank - fix ring-scroll shear on live displays
The ring-scroll wrote SCY mid-frame; SCY is sampled per scanline (on hardware and in sl0pboy's PPU), so a scroll landing mid-frame rendered the top of the frame at the old offset and the bottom at the new one - a one-frame shear, invisible in frame-sampled GIF captures but ugly on a live sixel view. term_view_update now writes hSCY (HRAM) and a transparent VBlank ISR (push af / apply / pop af / reti, same profile as TimerISR) copies it to rSCY, so the view only ever moves at frame boundaries. The scroll's tile+map writes stay immediate: the new map row is invisible at the old SCY by construction (it's the ring row one past the visible 18).
Diffstat (limited to 'src/term.asm')
-rw-r--r--src/term.asm5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/term.asm b/src/term.asm
index 6a94024..46cd23e 100644
--- a/src/term.asm
+++ b/src/term.asm
@@ -60,6 +60,7 @@ term_init::
ld [rLCDC], a ; LCD off
ld [rSCX], a
ld [rSCY], a
+ ldh [hSCY], a ; keep the VBlank latch in sync
; Load all 8 CGB BG palettes from PalData (see tools/gencolor.py). Palettes
; 0 and 2..7 are the 7 Fano-plane text palettes (each = bg + 3 of our 7
@@ -168,8 +169,8 @@ term_view_update::
add a
add a
add a ; *8 px
- ld [rSCY], a
- ret
+ ldh [hSCY], a ; latched: the VBlank ISR applies it, so the
+ ret ; view never moves mid-frame (no shear)
; -----------------------------------------------------------------------------
; map_row_one - write the BG-map row for logical row A (0..17): tile indices