-
Notifications
You must be signed in to change notification settings - Fork 0
/
effects.asm
227 lines (192 loc) · 4.68 KB
/
effects.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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
!cpu w65c02
*=$400
; *****************************************************************************
; IRQ driven sound-effects library copied from the source explained here:
; https://www.8bitcoding.com/p/simplest-sound-effects-library-for.html
; converted to acme assembly from ca65 assembly
; *****************************************************************************
VERA_LOW = $9F20
VERA_MID = $9F21
VERA_HIGH = $9F22
VERA_DATA0 = $9F23
IRQ_VECTOR = $0314
PSG_CHANNEL = $1F9FC
PSG_VOLUME = PSG_CHANNEL+2
!macro VERA_SET .addr, .increment {
lda #((^.addr) | (.increment << 4))
sta VERA_HIGH
lda #>.addr
sta VERA_MID
lda #<.addr
sta VERA_LOW
}
; *****************************************************************************
; Entry Section
; *****************************************************************************
bra ping
bra shoot
bra zap
bra explode
ping:
ldx #0
bra common
shoot:
ldx #10
bra common
zap:
ldx #20
bra common
explode:
ldx #30
bra common
; *****************************************************************************
common:
ldy #0 ; move 10 bytes from definitions
- lda sounds,x
sta channel15,y
inx
iny
cpy #10
bne -
lda #255 ; Start playing
sta phase
lda running ; is IRQ player already running?
bne return
sei ; insert new IRQ player
lda IRQ_VECTOR
sta OLD_IRQ_HANDLER
lda #<Play
sta IRQ_VECTOR
lda IRQ_VECTOR+1
sta OLD_IRQ_HANDLER+1
lda #>Play
sta IRQ_VECTOR+1
cli
lda #1
sta running
return:
rts
; *****************************************************************************
; IRQ Play Section
; *****************************************************************************
Play:
; Save VERA registers
lda $9F20
sta data_store
lda $9F21
sta data_store+1
lda $9F22
sta data_store+2
lda $9F25
sta data_store+3
lda phase
bne + ; if phase = 0 - Exit
jmp exit
+ cmp #1 ; if phase = 1 - Release
bne +
jmp release
+ lda #1 ; else phase = 255 - Start
sta phase
+VERA_SET PSG_CHANNEL,1
lda frequency ; read and set frequency
sta VERA_DATA0
lda frequency+1
sta VERA_DATA0
lda volume+1
ora #%11000000
sta VERA_DATA0 ;starting Volume = volume
lda waveform
sta VERA_DATA0 ; set waveform
jmp exit
; *****************************************************************************
release:
; *****************************************************************************
lda release_count
bne release_loop ; not finished yet
+VERA_SET PSG_VOLUME,0
stz VERA_DATA0 ; set volume to 0 at the end of Release phase
stz phase ; release finished, exit
jmp exit
release_loop:
sec ; decrease 16 bit volume
lda volume
sbc vol_change
sta volume
lda volume+1
sbc vol_change+1
sta volume+1
sec ; decrease 16 bit frequency
lda frequency
sbc freq_change
sta frequency
lda frequency+1
sbc freq_change+1
sta frequency+1
+VERA_SET PSG_CHANNEL,1
lda frequency ; read and set frequency
sta VERA_DATA0
lda frequency+1
sta VERA_DATA0
lda volume+1
ora #%11000000
sta VERA_DATA0 ; read and set volume
dec release_count
exit:
; restore VERA registers
lda data_store
sta $9F20
lda data_store+1
sta $9F21
lda data_store+2
sta $9F22
lda data_store+3
sta $9F25
jmp (OLD_IRQ_HANDLER)
; *****************************************************************************
; Variables
; *****************************************************************************
running: !byte 0 ; 0 - not running, 1 - running
phase: !byte 0 ; 0 - not playing, 255 - start, 1 - Play Release
channel15: ; Structure of channel15 data
release_count: !byte 0
frequency: !word 0
waveform !byte 0
volume: !word 0
vol_change: !word 0
freq_change: !word 0
; Sound definitions - fits into the structure of channel15
sounds:
;.byte 100,199,9,160,0,63,161,0,0,0
ping_envelope: ;!byte $64,$C7,$09,$A0,$00,$3F,$A1,$00,$00,$00
!byte 100 ; release_count
!word 2503 ; frequency
!byte 160 ; waveform
!word 16128 ; volume
!word 161 ; vol_change
!word 0 ; freq_change
;.byte 20,107,17,224,0,63,0,3,0,0
shoot_envelope: ;!byte $14,$6B,$11,$E0,$00,$3F,$00,$03,$00,$00
!byte 20 ; release_count
!word 4459 ; frequency
!byte 224 ; waveform
!word 16128 ; volume
!word 768 ; vol_change
!word 0 ; freq_change
;.byte 37,232,10,96,0,63,179,1,100,0
zap_envelope: ;!byte $25,$E8,$0A,$60,$00,$3F,$B3,$01,$64,$00
!byte 37 ; release_count
!word 2792 ; frequency
!byte 96 ; waveform
!word 16128 ; volume
!word 435 ; vol_change
!word 100 ; freq_change
;.byte 200,125,5,224,0,63,80,0,0,0
explode_envelope ;!byte $C8,$7D,$05,$E0,$00,$3F,$50,$00,$00,$00
!byte 200 ; release_count
!word 1405 ; frequency
!byte 224 ; waveform
!word 16128 ; volume
!word 80 ; vol_change
!word 0 ; freq_change
data_store: !byte 0,0,0,0
OLD_IRQ_HANDLER !word 0