1; PPU utilities
2
3bss_res ppu_not_present
4
5; Sets PPUADDR to w
6; Preserved: X, Y
7.macro set_ppuaddr w
8	bit PPUSTATUS
9	setb PPUADDR,>w
10	setb PPUADDR,<w
11.endmacro
12
13
14; Delays by no more than n scanlines
15.macro delay_scanlines n
16	.if CLOCK_RATE <> 1789773
17		.error "Currently only supports NTSC"
18	.endif
19	delay ((n)*341)/3
20.endmacro
21
22
23; Waits for VBL then disables PPU rendering.
24; Preserved: A, X, Y
25disable_rendering:
26	pha
27	jsr wait_vbl_optional
28	setb PPUMASK,0
29	pla
30	rts
31
32
33; Fills first nametable with $00
34; Preserved: Y
35clear_nametable:
36	lda #0
37	jsr fill_screen
38
39	; Clear pattern table
40	ldx #64
41:       sta PPUDATA
42	dex
43	bne :-
44	rts
45
46
47; Fills screen with tile A
48; Preserved: A, Y
49fill_screen:
50	ldx #$20
51	stx PPUADDR
52	ldx #$00
53	stx PPUADDR
54	ldx #240
55:       sta PPUDATA
56	sta PPUDATA
57	sta PPUDATA
58	sta PPUDATA
59	dex
60	bne :-
61	rts
62
63
64; Fills palette with $0F
65; Preserved: Y
66clear_palette:
67	set_ppuaddr $3F00
68	ldx #$20
69	lda #$0F
70:       sta PPUDATA
71	dex
72	bne :-
73
74
75; Fills OAM with $FF
76; Preserved: Y
77clear_oam:
78	lda #$FF
79
80; Fills OAM with A
81; Preserved: A, Y
82fill_oam:
83	ldx #0
84:       sta SPRDATA
85	dex
86	bne :-
87	rts
88
89
90; Initializes wait_vbl_optional. Must be called before
91; using it.
92.align 32
93init_wait_vbl:
94	; Wait for VBL flag to be set, or ~60000
95	; clocks (2 frames) to pass
96	ldy #24
97	ldx #1
98	bit PPUSTATUS
99:       bit PPUSTATUS
100	bmi @set
101	dex
102	bne :-
103	dey
104	bpl :-
105@set:
106	; Be sure flag didn't stay set (in case
107	; PPUSTATUS always has high bit set)
108	tya
109	ora PPUSTATUS
110	sta ppu_not_present
111	rts
112
113
114; Same as wait_vbl, but returns immediately if PPU
115; isn't working or doesn't support VBL flag
116; Preserved: A, X, Y
117.align 16
118wait_vbl_optional:
119	bit ppu_not_present
120	bmi :++
121	; FALL THROUGH
122
123; Clears VBL flag then waits for it to be set.
124; Preserved: A, X, Y
125wait_vbl:
126	bit PPUSTATUS
127:       bit PPUSTATUS
128	bpl :-
129:       rts
130