File: ppu.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (158 lines) | stat: -rw-r--r-- 6,053 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
;
; Written by Groepaz/Hitmen <groepaz@gmx.net>
; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
;

        .export ppuinit
        .export paletteinit, paldata

        .include "nes.inc"

;+---------+----------------------------------------------------------+
;|  $2000  | PPU Control Register #1 (W)                              |
;|         |                                                          |
;|         |    D7: Execute NMI on VBlank                             |
;|         |           0 = Disabled                                   |
;|         |           1 = Enabled                                    |
;|         |    D6: PPU Master/Slave Selection --+                    |
;|         |           0 = Master                +-- UNUSED           |
;|         |           1 = Slave               --+                    |
;|         |    D5: Sprite Size                                       |
;|         |           0 = 8x8                                        |
;|         |           1 = 8x16                                       |
;|         |    D4: Background Pattern Table Address                  |
;|         |           0 = $0000 (VRAM)                               |
;|         |           1 = $1000 (VRAM)                               |
;|         |    D3: Sprite Pattern Table Address                      |
;|         |           0 = $0000 (VRAM)                               |
;|         |           1 = $1000 (VRAM)                               |
;|         |    D2: PPU Address Increment                             |
;|         |           0 = Increment by 1                             |
;|         |           1 = Increment by 32                            |
;|         | D1-D0: Name Table Address                                |
;|         |         00 = $2000 (VRAM)                                |
;|         |         01 = $2400 (VRAM)                                |
;|         |         10 = $2800 (VRAM)                                |
;|         |         11 = $2C00 (VRAM)                                |
;+---------+----------------------------------------------------------+
;+---------+----------------------------------------------------------+
;|  $2001  | PPU Control Register #2 (W)                              |
;|         |                                                          |
;|         | D7-D5: Full Background Colour (when D0 == 1)             |
;|         |         000 = None  +------------+                       |
;|         |         001 = Green              | NOTE: Do not use more |
;|         |         010 = Blue               |       than one type   |
;|         |         100 = Red   +------------+                       |
;|         | D7-D5: Colour Intensity (when D0 == 0)                   |
;|         |         000 = None            +--+                       |
;|         |         001 = Intensify green    | NOTE: Do not use more |
;|         |         010 = Intensify blue     |       than one type   |
;|         |         100 = Intensify red   +--+                       |
;|         |    D4: Sprite Visibility                                 |
;|         |           0 = Sprites not displayed                      |
;|         |           1 = Sprites visible                            |
;|         |    D3: Background Visibility                             |
;|         |           0 = Background not displayed                   |
;|         |           1 = Background visible                         |
;|         |    D2: Sprite Clipping                                   |
;|         |           0 = Sprites invisible in left 8-pixel column   |
;|         |           1 = No clipping                                |
;|         |    D1: Background Clipping                               |
;|         |           0 = BG invisible in left 8-pixel column        |
;|         |           1 = No clipping                                |
;|         |    D0: Display Type                                      |
;|         |           0 = Colour display                             |
;|         |           1 = Monochrome display                         |
;+---------+----------------------------------------------------------+


;-----------------------------------------------------------------------------

.segment        "ONCE"

.proc   ppuinit

        lda     #%10101000
        sta     PPU_CTRL1

        lda     #%00011110
        sta     PPU_CTRL2

; Wait for vblank

@wait:  lda     PPU_STATUS
        bpl     @wait

; reset scrolling

        lda     #0
        sta     PPU_VRAM_ADDR1
        sta     PPU_VRAM_ADDR1

; Make all sprites invisible

        lda     #$00
        ldy     #$f0
        sta     PPU_SPR_ADDR
        ldx     #$40
@loop:  sty     PPU_SPR_IO
        sta     PPU_SPR_IO
        sta     PPU_SPR_IO
        sty     PPU_SPR_IO
        dex
        bne     @loop

        rts

.endproc

;-----------------------------------------------------------------------------

.proc   paletteinit

; Wait for v-blank
@wait:  lda     PPU_STATUS
        bpl     @wait

        lda     #$3F
        sta     PPU_VRAM_ADDR2
        lda     #$00
        sta     PPU_VRAM_ADDR2

        ldx     #0
@loop:  lda     paldata,x
        sta     PPU_VRAM_IO
        inx
        cpx     #(16*2)
        bne     @loop

        rts

.endproc

;-----------------------------------------------------------------------------

.rodata

paldata:
        .repeat 2
        .byte   $0f     ; 0 black
        .byte   $14     ; 4 violett
        .byte   $3b     ; 3 cyan
        .byte   $3d     ; 1 white

        .byte   $38     ; 7 yellow
        .byte   $2d     ; b dark grey
        .byte   $22     ; e light blue
        .byte   $04     ; 2 red

        .byte   $18     ; 8 orange
        .byte   $08     ; 9 brown
        .byte   $35     ; a light red
        .byte   $01     ; 6 blue

        .byte   $10     ; c middle grey
        .byte   $2b     ; d light green
        .byte   $3d     ; f light gray
        .byte   $1a     ; 5 green
        .endrepeat