; NES background image viewer (6502 / 2C02 PPU). NROM, 16K PRG at $C000. ; Waits for PPU warm-up, loads the palette ($3F00, 32 bytes), nametable + ; attribute table ($2000, 1024 bytes), enables background, then idles. The ; image-specific data lives at fixed PRG addresses written by the builder- ; $F000 32-byte palette $F020 1024-byte nametable + attributes ; Tiles come from CHR-ROM pattern table 0. * = $C000 PPUCTRL = $2000 PPUMASK = $2001 PPUSTATUS = $2002 PPUSCROLL = $2005 PPUADDR = $2006 PPUDATA = $2007 start: sei cld ldx #$ff txs lda #$00 sta PPUCTRL ; NMI off sta PPUMASK ; rendering off during setup bit PPUSTATUS ; clear latch w1: bit PPUSTATUS bpl w1 ; wait for first vblank w2: bit PPUSTATUS bpl w2 ; wait for second vblank (PPU warmed up) ; ---- palette- $3F00..$3F1F from $F000 ---- lda #$3f sta PPUADDR lda #$00 sta PPUADDR ldx #$00 pal: lda $f000,x sta PPUDATA inx cpx #$20 bne pal ; ---- nametable + attributes- $2000..$23FF (1024) from $F020 ---- lda #$20 sta PPUADDR lda #$00 sta PPUADDR ldx #$00 nt0: lda $f020,x sta PPUDATA inx bne nt0 nt1: lda $f120,x sta PPUDATA inx bne nt1 nt2: lda $f220,x sta PPUDATA inx bne nt2 nt3: lda $f320,x sta PPUDATA inx bne nt3 ; ---- enable background ---- lda #$00 sta PPUSCROLL sta PPUSCROLL lda #$00 sta PPUCTRL ; nametable $2000, bg pattern table $0000, NMI off lda #$0a sta PPUMASK ; show background, no left-column clip loop: jmp loop ; the builder writes the $FFFA-$FFFF vectors (all -> start = $C000)