data/claims/super-metroid-av.yamlSuper Metroid graphics (InsaneFirebat/sm_disassembly)
Game: Super Metroid.
In rooms whose water is set to wave, an indirect HDMA channel writes BG2's X scroll on every line. Above the water each line points at the plain scroll; below it the lines walk through a ring of 16 values, the scroll plus a displacement of 0, 1, 1, 0, 0, −1, −1, 0 repeating, so the background ripples a pixel either way in an 8-line pattern that shifts one line every 6 frames. super-metroid-av/water-wave
About: Super Metroid HDMA
Value
{
"displacement": [
0,
1,
1,
0,
0,
-1,
-1,
0
],
"ring": 16,
"framesPerStep": 6,
"amplitude": 1
}src/bank_88.asm#L7229-L7234LDA.W FX_LiquidOptions … AND.W #$0002 … BEQ .notWavy … JSL.L Spawn_HDMAObject … db $42,$0F … dw InstList_Water_BG2_Xscrollsm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L980-L982;; $0F: BG2 X scroll (16-bit, write-twice)sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L7303-L7306;;; $C46E: Wave displacement table - water ;;; WaveDisplacementTable_Water:sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L7523-L7570Setup_Water_BG2_Xscroll_DataTable_Wavy: … DEC.W HDMAObject_Var1,X … LDA.W #$0006 … STA.W HDMAObject_Var1,X … LDA.W HDMAObject_Var0,X … INC … INC … AND.W #$001E … .loop: … LDA.B DP_BG2XScroll … CLC … ADC.W WaveDisplacementTable_Water,Y … STA.L WaterBG2XScrollHDMADataTable,Xsm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L7465-L7472; the calculation 1FFh - [A] at $C5CE is equivalent to FFh + (Y position of screen on FX) … LDA.B DP_BG2XScroll … STA.L WaterBG2XScrollHDMADataTable-4sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L8365-L8368;;; $CF46: Indirect HDMA table - water BG2 X scroll ;;; IndirectHDMATable_WaterBG2XScroll: … db $81 : dw WaterBG2XScrollHDMADataTable-4sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L8623-L8638db $81 : dw WaterBG2XScrollHDMADataTable … db $81 : dw WaterBG2XScrollHDMADataTable+$1EChecked by claude-agent, 2026-10-21 — read the water FX setup (the BG2 channel spawns only with liquid option bit 1), Spawn_HDMAObject's parameter notes, the displacement table, the wavy table setup (phase in Var0 steps 2 bytes every 6 frames; both indices walk the 16-word ring), the pre-instruction that picks the table start from the water's screen position, and the indirect table: 256 one-line entries at the plain scroll, then one-line entries cycling through the ring$81 is one line in repeat mode (snes-hardware/hdma). The displacement table stores the 8-value pattern twice (L7305-L7306), as words where $FFFF is −1. A BG3 channel for the water surface is set up the same way.
Cited by: HDMA
The Ceres haze is an indirect HDMA table on the sub-screen backdrop color, used for color math. Its first entry covers 64 lines and 15 more cover 8 lines each; while the room fades in, the routine raises the bands' intensities over 16 frames, ending with 0 at the top and 1 to 15 in the bands below, a gradient down the screen. super-metroid-av/ceres-haze
About: Super Metroid HDMA
Value
{
"firstBandLines": 64,
"bands": 15,
"bandLines": 8,
"intensities": [
0,
15
],
"fadeFrames": 16
}src/bank_88.asm#L10011-L10018 JSL.L Spawn_HDMAObject ;88DDD0;
db $40,$32 ;88DDD4;
dw InstList_CeresHaze_ColorMathSubScnBackColor_RidleyAlive_0 ;88DDD6;sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L979-L990 — the disassembly's note on the spawn's target byte; $32 is the B-bus address of COLDATA ($2132);; $32: Colour math subscreen backdrop colour (8-bit, sometimes used with write-twice)sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L10097-L10134PreInstruction_CeresHaze_ColorMathSubScnBackColor_FadingIn:
…
LDA.W HDMAObject_Var0,X ;88DE3F;
CMP.W #$0010 ;88DE42;
BEQ .done ;88DE45;
…
LDA.W HDMAObject_Var1,X ;88DE4B;
STA.B DP_Temp14 ;88DE4E;
LDA.W HDMAObject_Var0,X ;88DE50;
LDX.B #$0F ;88DE53;
.loop:
…sm_disassembly: a relocatable disassembly of Super Metroid · src/bank_88.asm#L10246-L10264IndirectHDMATable_CeresHaze_ColorMathSubScnBackdropColor:
db $40 : dw HazeColorMathSubscreenBackdropColorHDMADataTable ;88DF03;
db $08 : dw HazeColorMathSubscreenBackdropColorHDMADataTable+1
…
db $08 : dw HazeColorMathSubscreenBackdropColorHDMADataTable+$F
db $00Checked by claude, 2026-10-25 — read FXType_2C_CeresHaze's spawn (control $40, the indirect bit; target $32), the fade-in pre-instruction at 88DE2D (Var0 from 0 until it reaches $10; entries 15 down to 0 get Var0, Var0 - 1, … floored at 0, each ORed with Var1), and the 17-line indirect table at 88DF03The color-select byte is $80 or $20 depending on a boss bit for Ceres, which picks the color component the intensity applies to; which component shows when wasn't traced. The table's first entry is a $40 (64-line) wait.
Cited by: HDMA