8bitlenser/lenser/nes/viewer.s
2026-07-03 19:35:35 -07:00

77 lines
2 KiB
ArmAsm

; 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)