Mode 7
The Super NES background mode that rotates and scales one large layer through a 2 by 2 matrix, used for spinning bosses and for floors seen in perspective.
On this page
Mode 7 trades the Super NES’s layers for one transformable one: a 128 by 128 tile map, 1,024 pixels square, that the PPU maps to the screen through a matrix of four 8.8 fixed-point values about a center point1. A game that writes a rotation into the matrix turns the whole layer.
- Rotate and scaleSuper Mario World (1990). An angle and two scales turned into the matrix with a sine table; Reznor's wheel turns once in 512 frames.2,3
#Super Mario World
The game keeps an angle and two scales, with angle $200 = 360°, scale $20 = 1.02, and builds the matrix from a quarter-wave sine table; the second row is the first turned by 90 degrees. In the Reznor fight the angle steps once a frame, so the wheel turns once every 512 frames3.
The boss rooms still have a status bar. Each frame starts in Mode 1 for the bar, and an interrupt at the bar’s last line switches to Mode 7 for the room4.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Super Mario World | 1990 | Rotate and scale | an angle and two scales turned into the matrix with a sine table; Reznor's wheel turns once in 512 frames |
Every claim about this mechanic, by game (3)
References
- ^Mode 7 has a single background layer, a 128 by 128 tile map of 256 8 by 8 tiles (1,024 by 1,024 pixels) that the PPU transforms by a 2 by 2 matrix, M7A to M7D (
$211B-$211E, 8.8 fixed point), about a center set by M7X and M7Y.WikiSNESdev Wiki, “Backgrounds” · SNESdev Wiki, “PPU registers”How we know
Mode 7 ignores most of the layer configuration options, and instead always occupies the entire first half of VRAM with a 128x128 tilemap, and 256 available 8x8 tiles. … This provides a single background layer that has a unique transformation property.
Mode 7 · archived copy ↗ Mode 7 matrix A (8.8 fixed point)
M7A - Mode 7 matrix A and Multiplication factor 1 ($211B write twice) · archived copy ↗ Mode 7 matrix n (8.8 fixed point)
M7n - Mode 7 matrix C-D ($211D-211E write twice) · archived copy ↗ Mode 7 center X (signed)
M7X - Mode 7 center X ($211F write twice) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abThe game keeps a Mode 7 angle, 0 to
$1FFfor a full turn, and an X and a Y scale,$20for 1.0, and turns them into the matrix with a quarter-wave sine table of 129 entries; D copies A and C is −B, a rotation scaled per axis.CodeSMWDisXHow we know
1303CalculateMode7Values: ; Subroutine to convert mode 7 X/Y Scale and angle into A/B/C/D Matrix values. ⋮ 1311 LDA.B Mode7ParamA ;\ D <- A 1312 STA.B Mode7ParamD ;| C <- -B
bank_00.asm lines 1303–1318 at 30643c7 · upstream ↗ 1319 LDA.B Mode7Angle ; A value of $0200 here equals 360 degrees.bank_00.asm line 1319 at 30643c7 · upstream ↗ 1371 LSR #5 ; Scale of $20 = 1.0 ⋮ 1374M7SineWave: ; Sine LUT, from 0->pi/2 rad, 129 entries
bank_00.asm lines 1371–1374 at 30643c7 · upstream ↗ 379Mode7Lagging: ; Transfer various RAM mirrors to the registers ⋮ 396 LDA.B Mode7ParamA 397 STA.W HW_M7A ⋮ 399 STA.W HW_M7A ⋮ 408 LDA.B Mode7ParamD 409 STA.W HW_M7D 410 LDA.B Mode7ParamD+1 411 STA.W HW_M7D
bank_00.asm lines 379–412 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abIn the Reznor fight the Reznor in sprite slot 7 sets the Mode 7 center to
$80and adds 1 to the angle each frame, wrapping at$1FF, so the Mode 7 wheel the four Reznors ride (the "Reznor sign" in the comments) turns once every 512 frames.CodeSMWDisXHow we know
3194Reznor: 3195 INC.W ReznorOAMIndex 3196 LDA.B SpriteLock 3197 BEQ + 3198 JMP DrawReznor ⋮ 3200 + CPX.B #$07 3201 BNE CODE_039910 ⋮ 3204 LDA.B #$80 ; \ Set radius for Reznor sign rotation
bank_03.asm lines 3194–3206 at 30643c7 · upstream ↗ 3219 LDA.B Mode7Angle ; \ Rotate 1 frame around the circle (clockwise) 3220 CLC ; | $37,36 = 0 to 1FF, denotes circle position 3221 ADC.W #$0001 ; | 3222 AND.W #$01FF ; | 3223 STA.B Mode7Angle ; /
bank_03.asm lines 3219–3223 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^In the Mode 7 boss rooms other than Bowser's, the NMI sets Mode 1 for the status bar at the top of the frame, and an interrupt at the line where the bar ends switches to Mode 7 and writes the Mode 7 layer's scroll; the bar ends at line 36, or 45 in Morton's and Roy's rooms. Bowser's room skips the status bar interrupt and goes straight to Mode 7.CodeSMWDisXrevised
How we know
379Mode7Lagging: ; Transfer various RAM mirrors to the registers 380 LDA.B #!HW_BG_BG3Pri|!HW_BG_Mode1 381 STA.W HW_BGMODE
bank_00.asm lines 379–381 at 30643c7 · upstream ↗ 413 LDA.W IRQNMICommand ;\ 414 LSR A ;| Branch if not in Bowser's room. 415 BCC + ;/ ⋮ 420 LDA.B #!HW_TIMEN_NMI|!HW_TIMEN_JoyRead ;\ Skip the status bar IRQ and immediately prepare the registers after. 421 JMP CODE_0083F3 ;/
bank_00.asm lines 413–421 at 30643c7 · upstream ↗ 432 LDY.B #!StatusBarHeight+9 ;/ Scanline the status bar ends at in Morton/Roy's rooms. 433 + JMP CODE_008294 ; Prepare IRQ, and set up a couple more registers.
bank_00.asm lines 423–433 at 30643c7 · upstream ↗ 505CODE_0083F3: ; IRQ done; wait for H-blank, then update registers. ⋮ 510 LDA.B #!HW_BG_Mode7 511 STA.W HW_BGMODE 512 LDA.B Mode7XPos 513 STA.W HW_BG1HOFS ⋮ 515 STA.W HW_BG1HOFS ⋮ 517 STA.W HW_BG1VOFS ⋮ 519 STA.W HW_BG1VOFS
bank_00.asm lines 505–519 at 30643c7 · upstream ↗ 57!StatusBarHeight = 36constants.asm line 57 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
Sources
Code
- IsoFrieze, kaizoman666, mikeyk, and loveemu. 2026. “SMWDisX: Super Mario World disassembly (IsoFrieze/SMWDisX).” Commit 30643c7. IsoFrieze/SMWDisX @ 30643c7 · licence, all uses
Secondary
- SNESdev Wiki contributors. n.d. “Backgrounds.” SNESdev Wiki. Version oldid 1244. original · archived · licence, all uses
- SNESdev Wiki contributors. n.d. “PPU registers.” SNESdev Wiki. Version oldid 1507. original · archived · licence, all uses