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