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
|