-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsnowflakes.asm
172 lines (142 loc) · 2.94 KB
/
snowflakes.asm
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
_numSnowFlakes = 10 ; can drop to 8 to save cycles / mem - REMEMBER THIS IS ALSO IN MEMORY.ASM TOO
_effectNone = &00
_effectSnow = &10
_effectPaletteChange = &20 ; change to red for hell
_effectPaletteChange2 = &40 ; change to magenta for catacombs area
_effectGems = &80 ; read inv bits, plot red/green boxes for eyes on statues
_effectDark = &08 ; dark unless have torch
.snowFlakes
{
; Get number of snowflakes plotted last frame
LDX flakeActiveList
BEQ doneRemovingOldFlakes
LDY #0
LDA #LO(flakeActiveList+1)
STA t0
LDA #HI(flakeActiveList+1)
STA t1
.removeOldFlakesLoop
; Get mask - commented out on 26/05/2010 as it didn't do much?
; LDA (t0),Y
; STA t5
INY
; Get address lo
LDA (t0),Y
INY
STA t2
; Get address hi
LDA (t0),Y
INY
STA t3
; Store mask, eg remove flake : Y reg needs saving here, zeroing, and restoring
TYA
PHA
LDA #0
TAY
STA (t2),Y
PLA
TAY
DEX
BNE removeOldFlakesLoop
.doneRemovingOldFlakes
LDA #0
STA t8 ; t8 = active flake table
STA t9 ; t9 = x,y table offset (+2 bytes each pass)
STA flakeActiveList ; Re-initialise active list
TAY ; Zero index register
LDA #7
STA t2 ; t2 = colour
.flakeLoop
LDA (flakesLO),Y
STA ta ; Get x pos to ta
INY
LDA (flakesLO),Y
STA tb ; Get y pos to tb
STY tc ; tc = index
INC tb ; Increment Y
LDA #16
AND tc
BEQ noInc ; Used for a parallex
INC tb
.noInc
LDA tb
CMP #&d0 ; If at bottom, wrap
BCC ok
LDA #&20
.ok
STA (flakesLO),Y ; Store Y back
TAY
LDA (sinTableLO),Y ; Load sin for this Y position
CLC
ADC ta ; Add X pos to sin value
STA t0 ; t0 => X
STY t1 ; t1 = >Y
; New - windowed snowflake effect for caves
.checkFlakeX1
CMP snowWindow+0
BCC endOfFlake
.checkFlakeY1
CPY snowWindow+1
BCC endOfFlake
.checkFlakeX2
CMP snowWindow+2
BCS endOfFlake
.checkFlakeY2
CPY snowWindow+3
BCS endOfFlake
; Go through player tiles
LDX playerTileList
BEQ doneTileCheck
STY tf
.checkPlayerTile
LDA playerTileList,X
CMP tf
BEQ endOfFlake
DEX
BNE checkPlayerTile
.doneTileCheck
JSR plotPixelSet
BCC notPlotted
; Add y offset
CLC
TYA
ADC t3
STA t3
LDA #0
ADC t4
STA t4
; We have another snowflake!
INC flakeActiveList
; Store details
LDY t8
LDA #LO(flakeActiveList+1)
STA t0
LDA #HI(flakeActiveList+1)
STA t1
; Save mask : Either left or right pixel
TXA
STA (t0),Y
INY
; Save transformed pixel address
LDA t3
STA (t0),Y
INY
LDA t4
STA (t0),Y
INY
; Update offset
STY t8
.notPlotted
.endOfFlake
LDY t9
INY
INY
STY t9
.flakeCheckEnd
CPY #_numSnowFlakes * 2
BNE flakeLoop
; We need to a) set a flag to indicate just doing one snowflake OR store 1*2 at 'flakeCheckEnd'
; b) increment the offset of the flake number each time it reaches bottom
; c) init the flake to Y=12*6
RTS
}