-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmusic.asm
More file actions
249 lines (190 loc) · 3.76 KB
/
Copy pathmusic.asm
File metadata and controls
249 lines (190 loc) · 3.76 KB
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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
FPS_CONFIG = $FFFD
SCH1 = $3000
SCH2 = $3008
SCH3 = $3010
SCH4 = $3018
SFCTR = $3020
LAST_LO = $00
LAST_HI = $01
NOTE_PTRL = $02
NOTE_PTRH = $03
TEMP_LO = $04
TEMP_HI = $05
DURATION = $06
org $8000
init:
lda #<update
sta $FFFE
lda #>update
sta $FFFE+1
lda #10
sta FPS_CONFIG
lda #<NOTE_TABLE
sta NOTE_PTRL
lda #>NOTE_TABLE
sta NOTE_PTRH
lda SFCTR
sta LAST_LO
lda SFCTR+1
sta LAST_HI
;; attack+decay
lda #0
sta SCH1+3
;; sustain+release
lda #240
sta SCH1+4
;; channel master volume
lda #$FF
sta SCH1+6
;; control
lda #2
sta SCH1+7
jsr gate_off
jsr load_next_note
rts
update:
lda SFCTR
cmp LAST_LO
bne clock_changed
lda SFCTR+1
cmp LAST_HI
bne clock_changed
rts
clock_changed:
lda SFCTR+1
sta LAST_HI
lda SFCTR
sta LAST_LO
dec DURATION
bne update
jsr load_next_note
jmp update
load_next_note:
ldy #0
lda (NOTE_PTRL),Y
sta TEMP_LO
iny
lda (NOTE_PTRL),Y
sta TEMP_HI
iny
lda (NOTE_PTRL),Y
beq end_of_song
sta DURATION
lda TEMP_LO
ora TEMP_HI
beq is_rest
lda TEMP_LO
sta SCH1
lda TEMP_HI
sta SCH1+1
jsr gate_on
jmp advance_ptr
is_rest:
jsr gate_off
jmp advance_ptr
advance_ptr:
clc
lda NOTE_PTRL
adc #3
sta NOTE_PTRL
bcc .skip_hi
inc NOTE_PTRH
.skip_hi:
rts
end_of_song:
;; loop around
lda #<NOTE_TABLE
sta NOTE_PTRL
lda #>NOTE_TABLE
sta NOTE_PTRH
jsr load_next_note
jmp update
gate_on:
lda SCH1+7
ora #$80
sta SCH1+7
rts
gate_off:
lda SCH1+7
and #$7F
sta SCH1+7
rts
;; first value - lower byte of frequency
; second value - upper byte of frequency
;; third value - duration in ticks
;
;; for the frequency, take 293.66Hz for D,
; and round it up to nearest: 294.
; then, convert to hex: 0x0126.
; write the 0x26 in the first field
;; write the 0x01 in the second field
;
;; byte $06, $01, 01 ; C4
;; byte $15, $01, 01 ; C#4
;; byte $26, $01, 10 ; D4
;; byte $37, $01, 10 ; D#4
;; byte $4A, $01, 10 ; E4
;; byte $5D, $01, 10 ; F4
;; byte $72, $01, 10 ; F#4
;; byte $88, $01, 10 ; G4
;; byte $9F, $01, 10 ; G#4
;; byte $B8, $01, 10 ; A4
;; byte $D2, $01, 10 ; A#4
;; byte $EE, $01, 10 ; B4
NOTE_TABLE:
byte $0B, $02, 9 ; C5
byte $B8, $01, 9 ; A4
byte $5D, $01, 9 ; F4
byte $06, $01, 9 ; C4
byte $26, $01, 3 ; D4
byte $4A, $01, 3 ; E4
byte $5D, $01, 3 ; F4
byte $26, $01, 6 ; D4
byte $5D, $01, 3 ; F4
byte $06, $01, 15 ; C4
byte $00, $00, 1 ; pause
byte $88, $01, 9 ; G4
byte $0B, $02, 9 ; C5
byte $B8, $01, 9 ; A4
byte $5D, $01, 9 ; F4
byte $26, $01, 3 ; D4
byte $4A, $01, 3 ; E4
byte $5D, $01, 3 ; F4
byte $88, $01, 6 ; G4
byte $B8, $01, 3 ; A4
byte $88, $01, 15 ; G4
byte $00, $00, 1 ; pause
byte $B8, $01, 3 ; A4
byte $88, $01, 3 ; G4
byte $B8, $01, 3 ; A4
byte $88, $01, 3 ; G4
byte $0B, $02, 6 ; C5
byte $B8, $01, 3 ; A4
byte $88, $01, 3 ; G4
byte $5D, $01, 15 ; F4
byte $00, $00, 1 ; pause
byte $88, $01, 3 ; G4
byte $B8, $01, 6 ; A4
byte $5D, $01, 3 ; F4
byte $26, $01, 6 ; D4
byte $5D, $01, 3 ; F4
byte $26, $01, 3 ; D4
byte $06, $01, 15 ; C4
byte $00, $00, 1 ; pause
byte $06, $01, 3 ; C4
byte $5D, $01, 6 ; F4
byte $B8, $01, 3 ; A4
byte $88, $01, 6 ; G4
byte $06, $01, 3 ; C4
byte $5D, $01, 6 ; F4
byte $B8, $01, 3 ; A4
byte $88, $01, 3 ; G4
byte $B8, $01, 3 ; A4
byte $D2, $01, 3 ; A#4
byte $0B, $02, 3 ; C5
byte $B8, $01, 3 ; A4
byte $5D, $01, 3 ; F4
byte $88, $01, 6 ; G4
byte $06, $01, 3 ; C4
byte $5D, $01, 15 ; F4
byte $00, $00, 5 ; pause