Claim set · data/claims/zelda-av.yaml

The 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 commit

The 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
 ]
}
Codezelda1-disassembly: A complete disassembly of The Legend of Zelda · 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/dmc

Addresses are $C000+64A and lengths 16L+1 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
}
Codezelda1-disassembly: A complete disassembly of The Legend of Zelda · 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 DriveSample

The 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
}
Codezelda1-disassembly: A complete disassembly of The Legend of Zelda · 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 LoadControlRegs

Shared 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