ld sp,hl and ld sp,imm16 computed the native SP pointer using a fixed
base (dmg->main_ram), which always resolved to WRAM bank 1 for the
$D000-$DFFF range. On CGB, this range is switchable (banks 1-7 via
SVBK). Games like Pokemon Crystal that use the SP trick to bulk-copy
data from switchable WRAM to VRAM would read from the wrong bank,
causing VRAM tile corruption.
Use the read page table at runtime instead, which is kept in sync with
the current WRAM bank by cgb_update_wram_bank().