]> git.sur5r.net Git - cc65/blob - libsrc/nes/ppu.s
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / libsrc / nes / ppu.s
1 ;
2 ; Written by Groepaz/Hitmen <groepaz@gmx.net>
3 ; Cleanup by Ullrich von Bassewitz <uz@cc65.org>
4 ;
5
6         .export ppuinit
7         .export paletteinit, paldata
8
9         .include "nes.inc"
10
11 ;+---------+----------------------------------------------------------+
12 ;|  $2000  | PPU Control Register #1 (W)                              |
13 ;|         |                                                          |
14 ;|         |    D7: Execute NMI on VBlank                             |
15 ;|         |           0 = Disabled                                   |
16 ;|         |           1 = Enabled                                    |
17 ;|         |    D6: PPU Master/Slave Selection --+                    |
18 ;|         |           0 = Master                +-- UNUSED           |
19 ;|         |           1 = Slave               --+                    |
20 ;|         |    D5: Sprite Size                                       |
21 ;|         |           0 = 8x8                                        |
22 ;|         |           1 = 8x16                                       |
23 ;|         |    D4: Background Pattern Table Address                  |
24 ;|         |           0 = $0000 (VRAM)                               |
25 ;|         |           1 = $1000 (VRAM)                               |
26 ;|         |    D3: Sprite Pattern Table Address                      |
27 ;|         |           0 = $0000 (VRAM)                               |
28 ;|         |           1 = $1000 (VRAM)                               |
29 ;|         |    D2: PPU Address Increment                             |
30 ;|         |           0 = Increment by 1                             |
31 ;|         |           1 = Increment by 32                            |
32 ;|         | D1-D0: Name Table Address                                |
33 ;|         |         00 = $2000 (VRAM)                                |
34 ;|         |         01 = $2400 (VRAM)                                |
35 ;|         |         10 = $2800 (VRAM)                                |
36 ;|         |         11 = $2C00 (VRAM)                                |
37 ;+---------+----------------------------------------------------------+
38 ;+---------+----------------------------------------------------------+
39 ;|  $2001  | PPU Control Register #2 (W)                              |
40 ;|         |                                                          |
41 ;|         | D7-D5: Full Background Colour (when D0 == 1)             |
42 ;|         |         000 = None  +------------+                       |
43 ;|         |         001 = Green              | NOTE: Do not use more |
44 ;|         |         010 = Blue               |       than one type   |
45 ;|         |         100 = Red   +------------+                       |
46 ;|         | D7-D5: Colour Intensity (when D0 == 0)                   |
47 ;|         |         000 = None            +--+                       |
48 ;|         |         001 = Intensify green    | NOTE: Do not use more |
49 ;|         |         010 = Intensify blue     |       than one type   |
50 ;|         |         100 = Intensify red   +--+                       |
51 ;|         |    D4: Sprite Visibility                                 |
52 ;|         |           0 = Sprites not displayed                      |
53 ;|         |           1 = Sprites visible                            |
54 ;|         |    D3: Background Visibility                             |
55 ;|         |           0 = Background not displayed                   |
56 ;|         |           1 = Background visible                         |
57 ;|         |    D2: Sprite Clipping                                   |
58 ;|         |           0 = Sprites invisible in left 8-pixel column   |
59 ;|         |           1 = No clipping                                |
60 ;|         |    D1: Background Clipping                               |
61 ;|         |           0 = BG invisible in left 8-pixel column        |
62 ;|         |           1 = No clipping                                |
63 ;|         |    D0: Display Type                                      |
64 ;|         |           0 = Colour display                             |
65 ;|         |           1 = Monochrome display                         |
66 ;+---------+----------------------------------------------------------+
67
68
69 ;-----------------------------------------------------------------------------
70
71 .proc   ppuinit
72
73         lda     #%10101000
74         sta     PPU_CTRL1
75
76         lda     #%00011110
77         sta     PPU_CTRL2
78
79 ; Wait for vblank
80
81 @wait:  lda     PPU_STATUS
82         bpl     @wait
83
84 ; reset scrolling
85
86         lda     #0
87         sta     PPU_VRAM_ADDR1
88         sta     PPU_VRAM_ADDR1
89
90 ; Make all sprites invisible
91
92         lda     #$00
93         ldy     #$f0
94         sta     PPU_SPR_ADDR
95         ldx     #$40
96 @loop:  sty     PPU_SPR_IO
97         sta     PPU_SPR_IO
98         sta     PPU_SPR_IO
99         sty     PPU_SPR_IO
100         dex
101         bne     @loop
102
103         rts
104
105 .endproc
106
107
108 ;-----------------------------------------------------------------------------
109
110 .proc   paletteinit
111
112 ; Wait for v-blank
113 @wait:  lda     PPU_STATUS
114         bpl     @wait
115
116         lda     #$3F
117         sta     PPU_VRAM_ADDR2
118         lda     #$00
119         sta     PPU_VRAM_ADDR2
120
121         ldx     #0
122 @loop:  lda     paldata,x
123         sta     PPU_VRAM_IO
124         inx
125         cpx     #(16*2)
126         bne     @loop
127
128         rts
129                      
130 .endproc
131
132 ;-----------------------------------------------------------------------------
133
134 .rodata
135
136 paldata:
137         .repeat 2
138         .byte   $0f     ; 0 black
139         .byte   $14     ; 4 violett
140         .byte   $3b     ; 3 cyan
141         .byte   $3d     ; 1 white
142
143         .byte   $38     ; 7 yellow
144         .byte   $2d     ; b dark grey
145         .byte   $22     ; e light blue
146         .byte   $04     ; 2 red
147
148         .byte   $18     ; 8 orange
149         .byte   $08     ; 9 brown
150         .byte   $35     ; a light red
151         .byte   $01     ; 6 blue
152
153         .byte   $10     ; c middle grey
154         .byte   $2b     ; d light green
155         .byte   $3d     ; f light gray
156         .byte   $1a     ; 5 green
157         .endrepeat