data/claims/zelda-av.yamlThe Legend of Zelda graphics and sound (aldonunez/zelda1-disassembly)
Game: The Legend of Zelda.
When a mode needs the split, the NMI handler waits for the sprite 0 hit under the status bar and then sets the scroll for the room below; while the screen scrolls vertically between rooms it rewrites PPUADDR ($2006) mid-frame instead of PPUSCROLL. zelda-av/sprite-0-split
About: The Legend of Zelda Status bar split
Codezelda1-disassembly: A complete disassembly of The Legend of Zelda ·src/Z_07.asm#L447-L452; Wait for Sprite 0 hit, if needed.
LDA IsSprite0CheckActive
BEQ @CheckScroll
LDA #$05
JSR SwitchBank
JSR WaitAndScrollToSplitBottomzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_05.asm#L1263-L1266WaitAndScrollToSplitBottom:
LDA PpuStatus_2002 ; Wait for Sprite 0 Hit.
AND #$40
BEQ WaitAndScrollToSplitBottomzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_05.asm#L1299-L1320; Scrolling vertically, will set PPUADDR instead of PPUSCROLL.
; Wait about 666 cycles.
…
; Set PPUADDR mid-frame to
; achieve split-frame scrolling.
LDA VScrollAddrHi
LDY VScrollAddrLo
STA PpuAddr_2006
STY PpuAddr_2006Checked by claude, 2026-10-21 — read the NMI's sprite 0 branch and WaitAndScrollToSplitBottom at the pinned commitThe PPUADDR route is the vertical split the NESdev scrolling page describes (nes-hardware/scroll); a PPUSCROLL write mid-frame changes only the horizontal position.
Cited by: Raster effects, Status bar split
The game keeps 7 DMC samples in three tables of address, length, and rate bytes, and a request byte picks the entry by its lowest set bit. zelda-av/sample-table
About: The Legend of Zelda DPCM samples
Value
{
"addressBytes": [
0,
76,
128,
29,
32,
40,
76
],
"lengthBytes": [
117,
192,
64,
10,
176,
144,
208
],
"rateBytes": [
15,
15,
13,
15,
14,
15,
14
],
"addresses": [
"$C000",
"$D300",
"$E000",
"$C740",
"$C800",
"$CA00",
"$D300"
],
"lengths": [
1873,
3073,
1025,
161,
2817,
2305,
3329
]
}src/Z_00.asm#L553-L582TXA
LDY #$00
:
INY
LSR
BCC :-
LDA SampleRates-1, Y
STA DmcFreq_4010
LDA SampleAddrs-1, Y
STA DmcAddress_4012
LDA SampleLengths-1, Y
STA DmcLength_4013
…Checked by claude, 2026-10-21 — read DriveSample and its tables at the pinned commit; addresses and lengths decoded with the formulas in nes-hardware/dmcAddresses are and lengths bytes (nes-hardware/dmc). Entries 1 and 6 start at the same address with different lengths and rates.
Cited by: DPCM samples
The samples are sound effects; boss code requests $10 for the Aquamentus, Gleeok, and Ganon roar (entry 4, rate $0E), $20 for the Dodongo and Gohma roar (entry 5), and $02 for a boss hit (entry 1), and DeleteSlot requests $08, which the disassembly labels the "hurt" sound (entry 3). zelda-av/sample-effects
About: The Legend of Zelda DPCM samples
Value
{
"roar": 16,
"dodongoRoar": 32,
"bossHit": 2,
"hurt": 8
}src/Z_04.asm#L4846-L4847LDA #$10 ; Play Aquamentus/Gleeok/Ganon roar.
STA SampleRequestzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_04.asm#L4900-L4901LDA #$20 ; Play Dodongo/Gohma roar.
STA SampleRequestzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_04.asm#L8493-L8494LDA #$02 ; Boss hit sound effect
STA SampleRequestzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_02.asm#L1770-L1772DeleteSlot:
LDA #$08 ; "Hurt" sound effect
STA SampleRequestChecked by claude, 2026-10-21 — read the SampleRequest writes at the pinned commit; entry numbers from the lowest-set-bit search in DriveSampleThe effect names are Aldo Nuñez's labels. A request with bit 7 set repeats the sample, as rooms with a boss sound effect do (src/Z_05.asm, BossSoundEffects).
Cited by: DPCM samples
The music driver has Super Mario Bros.' layout; a song entry sets a base into a note-length table, a length code's low 3 bits index it, notes index a table of big-endian 16-bit timer periods, and a square note starts with duty byte $82 and sweep byte $7F, the same register values Super Mario Bros. uses. zelda-av/music-driver
About: The Legend of Zelda Music driver
Value
{
"dutyByte": 130,
"sweepByte": 127,
"lengthCodeBits": 3
}src/Z_00.asm#L786-L790PrepPhrase:
LDA SongTable-1, Y
TAY
LDA SongTable, Y
STA NoteLengthTableBasezelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_00.asm#L1087-L1092GetSongNoteLength:
AND #$07
CLC
ADC NoteLengthTableBase
TAY
LDA NoteLengthTable0, Yzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_00.asm#L1112-L1118; Big-endian 16-bit period values.
…
NotePeriodTable:
.BYTE $00, $23, $00, $6A, $03, $27, $00, $97
.BYTE $00, $00, $02, $F9, $02, $CF, $02, $A6
.BYTE $02, $80, $02, $5C, $02, $3A, $02, $1A
.BYTE $01, $FC, $01, $DF, $01, $C4, $01, $ABzelda1-disassembly: A complete disassembly of The Legend of Zelda · src/Z_00.asm#L1136-L1140PrepareCustomSongEnvelope:
LDA SongEnvelopeSelector
LDA #$20
LDX #$82
LDY #$7Fsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/music-engine.asm#L949-L950LDX #$82 ; load contents of other sound regs for square 2
LDY #$7fChecked by claude, 2026-10-21 — read PrepPhrase, GetSongNoteLength, NotePeriodTable, and PrepareCustomSongEnvelope, and compared them with SMB1's ProcessLengthData, FreqRegLookupTbl, and LoadControlRegsShared period values include $02A6, $0280, $025C, $023A, $021A, $01DF, $01C4, and $01AB, all in SMB1's FreqRegLookupTbl. Both games are Nintendo's (1985 and 1986); the code shows a shared design, and who wrote either driver is not sourced here.
Cited by: Music driver