]> git.sur5r.net Git - cc65/blob - libsrc/nes/ppu.s
Protect random counter against ProDOS.
[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 .segment        "ONCE"
72
73 .proc   ppuinit
74
75         lda     #%10101000
76         sta     PPU_CTRL1
77
78         lda     #%00011110
79         sta     PPU_CTRL2
80
81 ; Wait for vblank
82
83 @wait:  lda     PPU_STATUS
84         bpl     @wait
85
86 ; reset scrolling
87
88         lda     #0
89         sta     PPU_VRAM_ADDR1
90         sta     PPU_VRAM_ADDR1
91
92 ; Make all sprites invisible
93
94         lda     #$00
95         ldy     #$f0
96         sta     PPU_SPR_ADDR
97         ldx     #$40
98 @loop:  sty     PPU_SPR_IO
99         sta     PPU_SPR_IO
100         sta     PPU_SPR_IO
101         sty     PPU_SPR_IO
102         dex
103         bne     @loop
104
105         rts
106
107 .endproc
108
109 ;-----------------------------------------------------------------------------
110
111 .proc   paletteinit
112
113 ; Wait for v-blank
114 @wait:  lda     PPU_STATUS
115         bpl     @wait
116
117         lda     #$3F
118         sta     PPU_VRAM_ADDR2
119         lda     #$00
120         sta     PPU_VRAM_ADDR2
121
122         ldx     #0
123 @loop:  lda     paldata,x
124         sta     PPU_VRAM_IO
125         inx
126         cpx     #(16*2)
127         bne     @loop
128
129         rts
130
131 .endproc
132
133 ;-----------------------------------------------------------------------------
134
135 .rodata
136
137 paldata:
138         .repeat 2
139         .byte   $0f     ; 0 black
140         .byte   $14     ; 4 violett
141         .byte   $3b     ; 3 cyan
142         .byte   $3d     ; 1 white
143
144         .byte   $38     ; 7 yellow
145         .byte   $2d     ; b dark grey
146         .byte   $22     ; e light blue
147         .byte   $04     ; 2 red
148
149         .byte   $18     ; 8 orange
150         .byte   $08     ; 9 brown
151         .byte   $35     ; a light red
152         .byte   $01     ; 6 blue
153
154         .byte   $10     ; c middle grey
155         .byte   $2b     ; d light green
156         .byte   $3d     ; f light gray
157         .byte   $1a     ; 5 green
158         .endrepeat