77 lines
2 KiB
ArmAsm
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)
|