View difference between Paste ID: kkyGMZpw and iyPnNR1C
SHOW: | | - or go back to the newest paste.
1
; sound generation:
2
; two output channels buffers
3
; four software channels
4
; first two hard-panned to left, second two hard-panned to right
5
; each channel switchable between either pulse, triangle, saw, and noise
6
; 16-bit oscilators and frequencies for each channel
7
; 4-bit fine tuners for each channel
8
; 8-bit volumes for each channel
9
; 8-bit duty cycle settings for each channel
10
; enable bits for each channel
11
;
12
; music generation:
13
; tempo
14
; ticks per frame
15
; repeat section
16
; each channel has three notes that are arpeggiated to modulate the target frequency
17
; each channel has its own target frequency
18
; each channel has its own frequency sweep speed which is the amount added or substracted from the channel frequency per tick until the target frequency is reached
19
; each channel has its own target volume
20
; each channel has its own volume sweep speed which is the amount added or substracted from the channel volume per tick until the target volume is reached
21
; each channel has its own vibrato settings split between depth and rate which control the effective target frequency
22
; each channel has its own tremolo settings split between depth and rate which control the effective target volume
23
; each channel has its own effect that is to be applied per tick
24
;
25
; song format:
26
; 0x00 - tempo
27
; 0x01 - ticks per frame
28
; 0x02 - repeat low
29
; 0x03 - repeat high
30
; [0x10 - end] - frames
31
;
32
; frame format:
33
; first byte - note
34
; second byte - volume
35
; third byte - effect
36
; fourth byte - arppegio
37
;
38
; effect format:
39
; first nybble - effect
40
; second nybble - argument
41
;
42
; note format:
43
; first nybble - note
44
; second nybble - octave
45
;
46
; notes:
47
; 0x0 - null
48
; 0x1 - same as root (for arppegio notes)
49
; 0x2 - stop
50
; 0x3 - revive
51
; 0x4 - C
52
; 0x5 - C#
53
; 0x6 - D
54
; 0x7 - D#
55
; 0x8 - E
56
; 0x9 - F
57
; 0xA - F#
58
; 0xB - G
59
; 0xC - G#
60
; 0xD - A
61
; 0xE - A#
62
; 0xF - B
63
;
64
; arppegio format:
65
; first nybble - note 2 (above octave of note 1)
66
; second nybble - note 3 (above octave of note 1)
67
;
68
; effects:
69
; 0 - null
70
; 1 - stop effect
71
; 2 - set vibrato rate
72
; 3 - set vibrato depth
73
; 4 - set tremolo rate
74
; 5 - set tremolo depth
75
; 6 - portamento to note
76
; 7 - volume slide
77
; 8 - increment duty cycle
78
; 9 - set duty cycle
79
; A - set waveform
80
; B - increment volume
81
; C - decrement volume
82
; D - set finetune
83
84
.define NOTE_C 262
85
.define NOTE_Cs 277
86
.define NOTE_D 294
87
.define NOTE_Ds 311
88
.define NOTE_E 330
89
.define NOTE_F 349
90
.define NOTE_Fs 370
91
.define NOTE_G 392
92
.define NOTE_Gs 415
93
.define NOTE_A 440
94
.define NOTE_As 466
95
.define NOTE_B 494
96
97
.def LEFT_BUF = r2
98
.def RIGHT_BUF = r3
99
100
.def CHAN1_OSCL = r4
101
.def CHAN1_OSCH = r5
102
.def CHAN2_OSCL = r6
103
.def CHAN2_OSCH = r7
104
.def CHAN3_OSCL = r8
105
.def CHAN3_OSCH = r9
106
.def CHAN4_OSCL = r10
107
.def CHAN4_OSCH = r11
108
109
.def CHAN1_FRQL = r12
110
.def CHAN1_FRQH = r13
111
.def CHAN2_FRQL = r14
112
.def CHAN2_FRQH = r15
113
.def CHAN3_FRQL = r24
114
.def CHAN3_FRQH = r25
115
.def CHAN4_FRQL = r26
116
.def CHAN4_FRQH = r27
117
118
.def NOISEL = r0
119
.def NOISEH = r1
120
121
.def EFF_DIR = r18
122
123
.NOLIST
124
.include "m48def.inc"
125
.LIST
126
127
.cseg
128
.org 0x00
129
	rjmp start
130
131
.org 0x09
132
	rjmp timer
133
	
134
.org 0x40
135
start:
136
	ldi r16, LOW(RAMEND)
137
	out spl, r16
138
	ldi r16, HIGH(RAMEND)
139
	out sph, r16
140
	
141
	ldi r16, 1
142
	sts TIMSK2, r16
143
	ldi r16, 0b001
144
	sts TCCR2B, r16
145
	
146
	ldi r16, 0xFF
147
	out ddrd, r16
148
	out ddrc, r16
149
	
150
	ldi r16, 0xFF
151
	mov LEFT_BUF, r16
152
	mov RIGHT_BUF, r16
153
	
154
	ldi r16, 0x01
155
	mov NOISEL, r16
156
	ldi r16, 0x00
157
	mov NOISEH, r16
158
	
159
	ldi r16, 0b0000
160
	sts enable, r16
161
	
162
	ldi r16, 0x08
163
	sts tempo, r16
164
	ldi r16, 0x04
165
	sts speed, r16
166
	
167
	ldi r16, 0x00
168
	sts chan1_eff, r16
169
	sts chan2_eff, r16
170
	sts chan3_eff, r16
171
	sts chan4_eff, r16
172
	
173
	ldi r16, 0x0F
174
	sts chan1_vib, r16
175
	sts chan2_vib, r16
176
	sts chan3_vib, r16
177
	sts chan4_vib, r16
178
	
179
	ldi r16, 0x0F
180
	sts chan1_trm, r16
181
	sts chan2_trm, r16
182
	sts chan3_trm, r16
183
	sts chan4_trm, r16
184
	
185
	ldi r16, 0x80
186
	sts chan1_tvol, r16
187
	sts chan2_tvol, r16
188
	sts chan3_tvol, r16
189
	sts chan4_tvol, r16
190
	
191
	ldi r16, 0x80
192
	sts chan1_dut, r16
193
	sts chan2_dut, r16
194
	sts chan3_dut, r16
195
	sts chan4_dut, r16
196
	
197
	ldi r16, 0x44
198
	sts chan1_notes, r16
199
	sts chan2_notes, r16
200
	sts chan3_notes, r16
201
	sts chan4_notes, r16
202
	
203
	ldi r16, 0x00
204
	sts chan1_notes + 1, r16
205
	sts chan2_notes + 1, r16
206
	sts chan3_notes + 1, r16
207
	sts chan4_notes + 1, r16
208
	
209
	ldi r16, 0b00000000
210
	sts waveform, r16
211
	
212
	ldi r16, 0x01
213
	sts repeat, r16
214
	
215
	ldi ZL, LOW(song_data << 1)
216
	ldi ZH, HIGH(song_data << 1)
217
	
218
	sei
219
220
loop:
221
	rjmp loop
222
223
note_freq:
224
	mov r16, r19
225
	lsr r16
226
	lsr r16
227
	lsr r16
228
	lsr r16
229
	cpi r16, 0x04
230
	breq setc
231
	cpi r16, 0x05
232
	breq setcs
233
	cpi r16, 0x06
234
	breq setd
235
	cpi r16, 0x07
236
	breq setds
237
	cpi r16, 0x08
238
	breq sete
239
	cpi r16, 0x09
240
	breq setf
241
	cpi r16, 0x0A
242
	breq setfs
243
	cpi r16, 0x0B
244
	breq setg
245
	cpi r16, 0x0C
246
	breq setgs
247
	cpi r16, 0x0D
248
	breq seta
249
	cpi r16, 0x0E
250
	breq setas
251
	cpi r16, 0x0F
252
	breq setb
253
	ret
254
setc:
255
	ldi r16, LOW(NOTE_C)
256
	ldi r17, HIGH(NOTE_C)
257
	rjmp skip4
258
setcs:
259
	ldi r16, LOW(NOTE_Cs)
260
	ldi r17, HIGH(NOTE_Cs)
261
	rjmp skip4
262
setd:
263
	ldi r16, LOW(NOTE_D)
264
	ldi r17, HIGH(NOTE_D)
265
	rjmp skip4
266
setds:
267
	ldi r16, LOW(NOTE_Ds)
268
	ldi r17, HIGH(NOTE_Ds)
269
	rjmp skip4
270
sete:
271
	ldi r16, LOW(NOTE_E)
272
	ldi r17, HIGH(NOTE_E)
273
	rjmp skip4
274
setf:
275
	ldi r16, LOW(NOTE_F)
276
	ldi r17, HIGH(NOTE_F)
277
	rjmp skip4
278
setfs:
279
	ldi r16, LOW(NOTE_Fs)
280
	ldi r17, HIGH(NOTE_Fs)
281
	rjmp skip4
282
setg:
283
	ldi r16, LOW(NOTE_G)
284
	ldi r17, HIGH(NOTE_G)
285
	rjmp skip4
286
setgs:
287
	ldi r16, LOW(NOTE_Gs)
288
	ldi r17, HIGH(NOTE_Gs)
289
	rjmp skip4
290
seta:
291
	ldi r16, LOW(NOTE_A)
292
	ldi r17, HIGH(NOTE_A)
293
	rjmp skip4
294
setas:
295
	ldi r16, LOW(NOTE_As)
296
	ldi r17, HIGH(NOTE_As)
297
	rjmp skip4
298
setb:
299
	ldi r16, LOW(NOTE_B)
300
	ldi r17, HIGH(NOTE_B)
301
	rjmp skip4
302
skip4:
303
	andi r19, 0x0F
304
	cpi r19, 0x01
305
	breq seto1
306
	cpi r19, 0x02
307
	breq seto2
308
	cpi r19, 0x03
309
	breq seto3
310
	cpi r19, 0x04
311
	breq seto4
312
	cpi r19, 0x05
313
	breq seto5
314
	cpi r19, 0x06
315
	breq seto6
316
	cpi r19, 0x07
317
	breq seto7
318
	cpi r19, 0x08
319
	breq seto8
320
	ret
321
seto1:
322
	lsr r17
323
	ror r16
324
	lsr r17
325
	ror r16
326
	lsr r17
327
	ror r16
328
	ret
329
seto2:
330
	lsr r17
331
	ror r16
332
	lsr r17
333
	ror r16
334
	ret
335
seto3:
336
	lsr r17
337
	ror r16
338
	ret
339
seto4:
340
	ret
341
seto5:
342
	lsl r16
343
	rol r17
344
	ret
345
seto6:
346
	lsl r16
347
	rol r17
348
	lsl r16
349
	rol r17
350
	ret
351
seto7:
352
	lsl r16
353
	rol r17
354
	lsl r16
355
	rol r17
356
	lsl r16
357
	rol r17
358
	ret
359
seto8:
360
	lsl r16
361
	rol r17
362
	lsl r16
363
	rol r17
364
	lsl r16
365
	rol r17
366
	lsl r16
367
	rol r17
368
	ret
369
	
370
track:
371
	cpi ZH, HIGH(song_end << 1)
372
	brlo continue
373
	brne loopback
374
	cpi ZL, LOW(song_end << 1)
375
	brlo continue
376
loopback:
377
	ldi ZL, LOW(song_data << 1)
378
	ldi ZH, HIGH(song_data << 1)
379
	lds r20, repeat
380
	ldi r21, 0x00
381
	lsl r20
382
	rol r21
383
	lsl r20
384
	rol r21
385
	lsl r20
386
	rol r21
387
	lsl r20
388
	rol r21
389
	add ZL, r20
390
	adc ZH, r21
391
continue:
392
	ldi r20, 0b0001
393
	rcall load_command
394
	ldi r20, 0b0010
395
	rcall load_command
396
	ldi r20, 0b0100
397
	rcall load_command
398
	ldi r20, 0b1000
399
	rcall load_command
400
	ret
401
	
402
load_command:
403
	lpm r19, Z+
404
	rcall handle_note
405
	lpm r19, Z+
406
	rcall handle_volume
407
	lpm r19, Z+
408
	rcall handle_effect
409
	lpm r19, Z+
410
	rcall handle_arps
411
	ret
412
413
handle_note:
414
	mov r16, r19
415
	lsr r16
416
	lsr r16
417
	lsr r16
418
	lsr r16
419
	cpi r16, 0x00
420
	breq end_note
421
	cpi r16, 0x01
422
	breq end_note
423
	cpi r16, 0x02
424
	breq stop_note
425
	cpi r16, 0x03
426
	breq start_note
427
	sbrc r20, 0
428
	sts chan1_notes, r19
429
	sbrc r20, 1
430
	sts chan2_notes, r19
431
	sbrc r20, 2
432
	sts chan3_notes, r19
433
	sbrc r20, 3
434
	sts chan4_notes, r19
435
	rjmp start_note
436
stop_note:
437
	lds r21, enable
438
	sbrc r20, 0
439
	andi r21, 0b1110
440
	sbrc r20, 1
441
	andi r21, 0b1101
442
	sbrc r20, 2
443
	andi r21, 0b1011
444
	sbrc r20, 3
445
	andi r21, 0b0111
446
	sts enable, r21
447
	ret
448
start_note:
449
	lds r21, enable
450
	sbrc r20, 0
451
	ori r21, 0b0001
452
	sbrc r20, 1
453
	ori r21, 0b0010
454
	sbrc r20, 2
455
	ori r21, 0b0100
456
	sbrc r20, 3
457
	ori r21, 0b1000
458
	sts enable, r21
459
	ret
460
end_note:
461
	ret
462
	
463
handle_volume:
464
	cpi r19, 0x00
465
	breq end_vol
466
	sbrc r20, 0
467
	sts chan1_tvol, r19
468
	sbrc r20, 1
469
	sts chan2_tvol, r19
470
	sbrc r20, 2
471
	sts chan3_tvol, r19
472
	sbrc r20, 3
473
	sts chan4_tvol, r19
474
end_vol:
475
	ret
476
477
handle_effect:
478
	cpi r19, 0x00
479
	breq end_eff
480
	sbrc r20, 0
481
	sts chan1_eff, r19
482
	sbrc r20, 1
483
	sts chan2_eff, r19
484
	sbrc r20, 2
485
	sts chan3_eff, r19
486
	sbrc r20, 3
487
	sts chan4_eff, r19
488
end_eff:
489
	ret
490
491
handle_arps:
492
	sbrc r20, 0
493
	sts chan1_notes + 1, r19
494
	sbrc r20, 1
495
	sts chan2_notes + 1, r19
496
	sbrc r20, 2
497
	sts chan3_notes + 1, r19
498
	sbrc r20, 3
499
	sts chan4_notes + 1, r19
500
	ret
501
	
502
arpeggio:
503
	mov r21, r19
504
	andi r21, 0xF0
505
	cpi r16, 1
506
	breq first
507
	cpi r16, 2
508
	breq second
509
	ret
510
first:
511
	andi r20, 0xF0
512
	andi r19, 0x0F
513
	cpi r20, 4
514
	brlo nope2
515
	cp r21, r20
516
	brlo nope
517
	inc r19
518
nope:
519
	or r19, r20
520
	ret
521
second:
522
	lsl r20
523
	lsl r20
524
	lsl r20
525
	lsl r20
526
	andi r19, 0x0F
527
	cpi r20, 4
528
	brlo nope2
529
	cp r21, r20
530
	brlo nope
531
	inc r19
532
nope2:
533
	or r19, r21
534
	ret
535
536
music:
537
	clr r18
538
	sts music_timer, r18
539
	sts music_timer + 1, r18
540
	
541
	lds r16, tick_timer
542
	mov r17, r16
543
	lsr r17
544
	lsr r17
545
	lsr r17
546
	lsr r17
547
	andi r16, 0x0F
548
	inc r17
549
	lds r18, speed
550
	cp r17, r18
551
	brlo no_track
552
	rcall track
553
	clr r17
554
	rjmp okay
555
no_track:
556
	lsl r17
557
	lsl r17
558
	lsl r17
559
	lsl r17
560
okay:
561
	push r16
562
	push r17
563
564
	lds r22, waveform
565
	
566
	lds r16, chan1_eff
567
	lds r17, chan1_trm
568
	lds r18, chan1_vib
569
	lds r19, chan1_dut
570
	lds r23, chan1_tvol
571
	rcall apply_effect
572
	sts chan1_trm, r17
573
	sts chan1_vib, r18
574
	sts chan1_dut, r19
575
	sts chan1_tvol, r23
576
	sbrs r21, 3
577
	rjmp skipwav1
578
	andi r21, 0b0011
579
	andi r22, 0b11111100
580
	or r22, r21
581
skipwav1:
582
	
583
	lds r16, chan2_eff
584
	lds r17, chan2_trm
585
	lds r18, chan2_vib
586
	lds r19, chan2_dut
587
	lds r23, chan2_tvol
588
	lsr r21
589
	lsr r21
590
	rcall apply_effect
591
	sts chan2_trm, r17
592
	sts chan2_vib, r18
593
	sts chan2_dut, r19
594
	sts chan2_tvol, r23
595
	sbrs r21, 3
596
	rjmp skipwav2
597
	andi r21, 0b0011
598
	andi r22, 0b11110011
599
	lsl r21
600
	lsl r21
601
	or r22, r21
602
skipwav2:
603
	
604
	lds r16, chan3_eff
605
	lds r17, chan3_trm
606
	lds r18, chan3_vib
607
	lds r19, chan3_dut
608
	lds r23, chan3_tvol
609
	rcall apply_effect
610
	sts chan3_trm, r17
611
	sts chan3_vib, r18
612
	sts chan3_dut, r19
613
	sts chan3_tvol, r23
614
	sbrs r21, 3
615
	rjmp skipwav3
616
	andi r21, 0b0011
617
	andi r22, 0b11001111
618
	lsl r21
619
	lsl r21
620
	lsl r21
621
	lsl r21
622
	or r22, r21
623
skipwav3:
624
	
625
	lds r16, chan4_eff
626
	lds r17, chan4_trm
627
	lds r18, chan4_vib
628
	lds r19, chan4_dut
629
	lds r23, chan4_tvol
630
	rcall apply_effect
631
	sts chan4_trm, r17
632
	sts chan4_vib, r18
633
	sts chan4_dut, r19
634
	sts chan4_tvol, r23
635
	sbrs r21, 3
636
	rjmp skipwav4
637
	andi r21, 0b0011
638
	andi r22, 0b00111111
639
	lsl r21
640
	lsl r21
641
	lsl r21
642
	lsl r21
643
	lsl r21
644
	lsl r21
645
	or r22, r21
646
skipwav4:
647
	sts waveform, r22
648
	
649
	pop r17
650
	pop r16
651
	
652
	lds r18, fine_tune
653
654
	push r17
655
	push r16
656
	
657
	lds r19, chan1_notes
658
	lds r20, chan1_notes + 1
659
	rcall arpeggio
660
	rcall note_freq
661
	
662
	lds r21, chan1_vib
663
	mov r22, CHAN1_FRQL
664
	mov r23, CHAN1_FRQH
665
	
666
	rcall sweep
667
	
668
	mov CHAN1_FRQL, r22
669
	mov CHAN1_FRQH, r23
670
	
671
	mov r19, r18
672
	andi r19, 0x0F
673
	add CHAN1_FRQL, r19
674
	
675
	pop r16
676
	push r16
677
	
678
	lds r19, chan2_notes
679
	lds r20, chan2_notes + 1
680
	rcall arpeggio
681
	rcall note_freq
682
	
683
	lds r21, chan2_vib
684
	mov r22, CHAN2_FRQL
685
	mov r23, CHAN2_FRQH
686
	
687
	rcall sweep
688
	
689
	mov CHAN2_FRQL, r22
690
	mov CHAN2_FRQH, r23
691
	
692
	lsr r18
693
	lsr r18
694
	lsr r18
695
	lsr r18
696
	add CHAN2_FRQL, r18
697
	
698
	lds r18, fine_tune + 1
699
	
700
	pop r16
701
	push r16
702
	
703
	lds r19, chan3_notes
704
	lds r20, chan3_notes + 1
705
	rcall arpeggio
706
	rcall note_freq
707
	
708
	lds r21, chan3_vib
709
	mov r22, CHAN3_FRQL
710
	mov r23, CHAN3_FRQH
711
	
712
	rcall sweep
713
	
714
	mov CHAN3_FRQL, r22
715
	mov CHAN3_FRQH, r23
716
	
717
	mov r19, r18
718
	andi r19, 0x0F
719
	add CHAN3_FRQL, r19
720
	
721
	pop r16
722
	push r16
723
	
724
	lds r19, chan4_notes
725
	lds r20, chan4_notes + 1
726
	rcall arpeggio
727
	rcall note_freq
728
	
729
	lds r21, chan4_vib
730
	mov r22, CHAN4_FRQL
731
	mov r23, CHAN4_FRQH
732
	
733
	rcall sweep
734
	
735
	mov CHAN4_FRQL, r22
736
	mov CHAN4_FRQH, r23
737
	
738
	lsr r18
739
	lsr r18
740
	lsr r18
741
	lsr r18
742
	add CHAN4_FRQL, r18
743
	
744
	pop r16
745
	pop r17
746
	
747
	inc r16
748
	cpi r16, 3
749
	brlo lower
750
	clr r16
751
lower:
752
	or r17, r16
753
	sts tick_timer, r17
754
	
755
	lds r16, chan1_trm
756
	lds r17, chan1_vol
757
	lds r18, chan1_tvol
758
	rcall vol_sweep
759
	sts chan1_vol, r17
760
	
761
	lds r16, chan2_trm
762
	lds r17, chan2_vol
763
	lds r18, chan2_tvol
764
	rcall vol_sweep
765
	sts chan2_vol, r17
766
	
767
	lds r16, chan3_trm
768
	lds r17, chan3_vol
769
	lds r18, chan3_tvol
770
	rcall vol_sweep
771
	sts chan3_vol, r17
772
	
773
	lds r16, chan4_trm
774
	lds r17, chan4_vol
775
	lds r18, chan4_tvol
776
	rcall vol_sweep
777
	sts chan4_vol, r17
778
	
779
	ret
780
781
apply_effect:
782
	clr r21
783
	mov r20, r16
784
	lsr r16
785
	lsr r16
786
	lsr r16
787
	lsr r16
788
	andi r20, 0x0F
789
	
790
	cpi r16, 0x2
791
	breq set_vib_rate
792
	cpi r16, 0x3
793
	breq set_vib_depth
794
	cpi r16, 0x4
795
	breq set_trm_rate
796
	cpi r16, 0x5
797
	breq set_trm_depth
798
	cpi r16, 0x6
799
	breq set_portamento
800
	cpi r16, 0x7
801
	breq set_vol_slide
802
	cpi r16, 0x8
803
	breq inc_dut
804
	cpi r16, 0x9
805
	breq set_dut
806
	cpi r16, 0xA
807
	breq set_wav
808
	cpi r16, 0xB
809
	breq inc_vol
810
	cpi r16, 0xC
811
	breq dec_vol
812
	ret
813
set_vib_rate:
814
	lsl r20
815
	lsl r20
816
	lsl r20
817
	lsl r20
818
	andi r18, 0x0F
819
	or r18, r20
820
	ret
821
set_vib_depth:
822
	andi r18, 0xF0
823
	or r18, r20
824
	ret
825
set_trm_rate:
826
	lsl r20
827
	lsl r20
828
	lsl r20
829
	lsl r20
830
	andi r17, 0x0F
831
	or r17, r20
832
	ret
833
set_trm_depth:
834
	andi r17, 0xF0
835
	or r17, r20
836
	ret
837
set_portamento:
838
	lsl r20
839
	lsl r20
840
	lsl r20
841
	lsl r20
842
	mov r18, r20
843
	ret
844
set_vol_slide:
845
	lsl r20
846
	lsl r20
847
	lsl r20
848
	lsl r20
849
	mov r17, r20
850
	ret
851
inc_dut:
852
	add r19, r20
853
	ret
854
set_dut:
855
	lsl r20
856
	lsl r20
857
	lsl r20
858
	lsl r20
859
	mov r19, r20
860
	ret
861
set_wav:
862
	ldi r21, 0b1000
863
	or r21, r20
864
	ret
865
inc_vol:
866
	add r23, r20
867
	brcs inc_vol1
868
	ret
869
inc_vol1:
870
	ldi r23, 0xFF
871
	ret
872
dec_vol:
873
	sub r23, r20
874
	brcs dec_vol1
875
	ret
876
dec_vol1:
877
	ldi r23, 0x00
878
	ret
879
880
vol_sweep:
881
	lsr r16
882
	lsr r16
883
	lsr r16
884
	lsr r16
885
	cpi r16, 0
886
	breq vol_equal
887
	cp r17, r18
888
	brlo vol_smaller
889
	cp r18, r17
890
	brlo vol_bigger
891
	rjmp vol_equal
892
vol_smaller:
893
	add r17, r16
894
	cp r18, r17
895
	brlo vol_equal
896
	ret
897
vol_bigger:
898
	sub r17, r16
899
	cp r17, r18
900
	brlo vol_equal
901
	ret
902
vol_equal:
903
	mov r17, r18
904
	ret
905
906
sweep:
907
	lsr r21
908
	lsr r21
909
	lsr r21
910
	lsr r21
911
	lsl r21
912
	cpi r21, 0
913
	breq equal
914
	cp r23, r17
915
	brlo smaller
916
	cp r17, r23
917
	brlo bigger
918
	cp r22, r16
919
	brlo smaller
920
	cp r16, r22
921
	brlo bigger
922
	rjmp equal
923
bigger:
924
	sub r22, r21
925
	brcc yeah
926
	dec r23
927
yeah:
928
	rjmp done_big
929
done_big:
930
	cp r23, r17
931
	brlo equal
932
	cp r17, r23
933
	brlo return2
934
	cp r22, r16
935
	brlo equal
936
	rjmp return2
937
smaller:
938
	clr r19
939
	add r22, r21
940
	adc r23, r19
941
	rjmp done_small
942
done_small:
943
	cp r23, r17
944
	brlo return2
945
	cp r17, r23
946
	brlo equal
947
	cp r22, r16
948
	brlo return2
949
	cp r16, r22
950
	brlo equal
951
	rjmp return2
952
equal:
953
	mov r22, r16
954
	mov r23, r17
955
return2:
956
	ret
957
958
timer:
959
	mov r16, LEFT_BUF
960
	lsr r16
961
	lsr r16
962
	mov r17, RIGHT_BUF
963
	lsr r17
964
	lsr r17
965
	out portd, r16
966
	out portc, r17
967
	
968
	lds r16, music_timer
969
	lds r17, music_timer + 1
970
	ldi r18, 0
971
	ldi r19, 1
972
	add r16, r19
973
	adc r17, r18
974
	sts music_timer, r16
975
	sts music_timer + 1, r17
976
	lds r18, tempo
977
	cp r17, r18
978
	brlo no_music
979
	rcall music
980
	
981
no_music:
982
	clr LEFT_BUF
983
	clr RIGHT_BUF
984
	
985
	add CHAN1_OSCL, CHAN1_FRQL
986
	adc CHAN1_OSCH, CHAN1_FRQH
987
	add CHAN2_OSCL, CHAN2_FRQL
988
	adc CHAN2_OSCH, CHAN2_FRQH
989
	add CHAN3_OSCL, CHAN3_FRQL
990
	adc CHAN3_OSCH, CHAN3_FRQH
991
	add CHAN4_OSCL, CHAN4_FRQL
992
	adc CHAN4_OSCH, CHAN4_FRQH
993
	
994
	lds r16, waveform
995
	lds r22, enable
996
	
997
	mov r18, r16
998
	andi r18, 0b00000011
999
	mov r19, CHAN1_OSCH
1000
	lds r20, chan1_vol
1001
	lds r21, chan1_dut
1002
	rcall generate
1003
	sbrc r22, 0
1004
	add LEFT_BUF, r17
1005
	
1006
	lsr r16
1007
	lsr r16
1008
	mov r18, r16
1009
	andi r18, 0b00000011
1010
	mov r19, CHAN2_OSCH
1011
	lds r20, chan2_vol
1012
	lds r21, chan2_dut
1013
	rcall generate
1014
	sbrc r22, 1
1015
	add LEFT_BUF, r17
1016
	
1017
	lsr r16
1018
	lsr r16
1019
	mov r18, r16
1020
	andi r18, 0b00000011
1021
	mov r19, CHAN3_OSCH
1022
	lds r20, chan3_vol
1023
	lds r21, chan3_dut
1024
	rcall generate
1025
	sbrc r22, 2
1026
	add RIGHT_BUF, r17
1027
	
1028
	lsr r16
1029
	lsr r16
1030
	mov r18, r16
1031
	andi r18, 0b00000011
1032
	mov r19, CHAN4_OSCH
1033
	lds r20, chan4_vol
1034
	lds r21, chan4_dut
1035
	rcall generate
1036
	sbrc r22, 3
1037
	add RIGHT_BUF, r17
1038
	
1039
	reti
1040
1041
generate:
1042
	clr r17
1043
	cpi r18, 0b00
1044
	breq gen_pulse
1045
	cpi r18, 0b01
1046
	breq gen_triangle
1047
	cpi r18, 0b10
1048
	breq gen_saw
1049
	cpi r18, 0b11
1050
	breq gen_noise
1051
	ret
1052
	
1053
gen_pulse:
1054
	cp r19, r21
1055
	brlo return
1056
	mov r17, r20
1057
	lsr r17
1058
	lsr r17
1059
	ret
1060
	
1061
gen_triangle:
1062
	mov r17, r19
1063
	sbrc r19, 7
1064
	com r17
1065
	rjmp apply_volume
1066
	ret
1067
	
1068
gen_saw:
1069
	mov r17, r19
1070
	lsr r17
1071
	lsr r17
1072
	rjmp apply_volume
1073
	ret
1074
	
1075
gen_noise:
1076
	clr r21
1077
	clr r19
1078
	sbrc NOISEH, 6
1079
	ser r21
1080
	sbrc NOISEL, 3
1081
	ser r19
1082
	eor r19, r21
1083
	clr r21
1084
	lsl NOISEH
1085
	lsl NOISEL
1086
	adc NOISEH, r21
1087
	sbrc r19, 0
1088
	inc NOISEL
1089
	mov r17, NOISEL
1090
	lsr r17
1091
	rjmp apply_volume
1092
	ret
1093
	
1094
apply_volume:
1095
	sbrc r20, 7
1096
	rjmp return
1097
	lsr r17
1098
	sbrc r20, 6
1099
	rjmp return
1100
	lsr r17
1101
	sbrc r20, 5
1102
	rjmp return
1103
	lsr r17
1104
	sbrc r20, 4
1105
	rjmp return
1106
	lsr r17
1107
	sbrc r20, 3
1108
	rjmp return
1109
	lsr r17
1110
	sbrc r20, 2
1111
	rjmp return
1112
	lsr r17
1113-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1113+
1114
	rjmp return
1115
	lsr r17
1116
return:
1117
	ret
1118-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1118+
1119
song_data:
1120
	.db 0x00, 0x00, 0xA0, 0x00 ; pulse 1
1121
	.db 0x00, 0x00, 0xA0, 0x00 ; pulse 2
1122
	.db 0x00, 0x00, 0xA1, 0x00 ; triangle
1123-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1123+
1124
	
1125
	
1126
	
1127
1128-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1128+
1129
	.db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
1130
	.db 0xB4, 0x70, 0x00, 0x00 ; triangle
1131
	.db 0x40, 0x30, 0xCf, 0x00 ; noise
1132
	
1133-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1133+
1134
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1135
	.db 0x00, 0x00, 0x00, 0x00 ; triangle
1136
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1137
	
1138-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1138+
1139
	.db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
1140
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1141
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1142
	
1143-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1143+
1144
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1145
	.db 0x00, 0x00, 0x00, 0x00 ; triangle
1146
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1147
	
1148-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1148+
1149
	.db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
1150
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1151
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1152
	
1153
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1154-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1154+
1155
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1156
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1157
	
1158
	.db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
1159-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1159+
1160
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1161
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1162
	
1163
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1164-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1164+
1165
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1166
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1167
	
1168
	
1169-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1169+
1170
	.db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
1171
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1172
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1173
	
1174-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1174+
1175
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1176
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1177
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1178
	
1179-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1179+
1180
	.db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
1181
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1182
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1183
	
1184-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1184+
1185
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1186
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1187
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1188
	
1189-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1189+
1190
	.db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
1191
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1192
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1193
	
1194
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1195-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1195+
1196
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1197
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1198
	
1199
	.db 0x00, 0x80, 0x00, 0x00 ; pulse 1
1200-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1200+
1201
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1202
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1203
	
1204
	.db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
1205-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1205+
1206
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1207
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1208
	
1209
	
1210-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1210+
1211
	.db 0xE1, 0xFF, 0x00, 0x00 ; pulse 2
1212
	.db 0x94, 0x00, 0x00, 0x00 ; triangle
1213
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1214
	
1215-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1215+
1216
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1217
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1218
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1219
	
1220-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1220+
1221
	.db 0xE2, 0xFF, 0x00, 0x00 ; pulse 2
1222
	.db 0x65, 0x00, 0x00, 0x00 ; triangle
1223
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1224
	
1225-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1225+
1226
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1227
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1228
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1229
	
1230-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1230+
1231
	.db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
1232
	.db 0x94, 0x00, 0x00, 0x00 ; triangle
1233
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1234
	
1235
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1236-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1236+
1237
	.db 0xE4, 0x00, 0x00, 0x00 ; triangle
1238
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1239
	
1240
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1241-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1241+
1242
	.db 0x65, 0x00, 0x00, 0x00 ; triangle
1243
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1244
	
1245
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1246-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1246+
1247
	.db 0xE4, 0x00, 0x00, 0x00 ; triangle
1248
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1249
	
1250
	
1251-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1251+
1252
	.db 0xF1, 0xFF, 0x00, 0x00 ; pulse 2
1253
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1254
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1255
	
1256-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1256+
1257
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1258
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1259
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1260
	
1261-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1261+
1262
	.db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
1263
	.db 0x65, 0x00, 0x00, 0x00 ; triangle
1264
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1265
	
1266-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1266+
1267
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1268
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1269
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1270
	
1271-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1271+
1272
	.db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
1273
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1274
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1275
	
1276
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1277
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1278-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1278+
1279
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1280
	
1281
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1282
	.db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
1283-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1283+
1284
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1285
	
1286
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1287
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1288-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1288+
1289
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1290
	
1291
	
1292
	
1293-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1293+
1294
	.db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
1295
	.db 0xB4, 0x70, 0x00, 0x00 ; triangle
1296
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1297
	
1298-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1298+
1299
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1300
	.db 0x00, 0x00, 0x00, 0x00 ; triangle
1301
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1302
	
1303-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1303+
1304
	.db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
1305
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1306
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1307
	
1308-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1308+
1309
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1310
	.db 0x00, 0x00, 0x00, 0x00 ; triangle
1311
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1312
	
1313-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1313+
1314
	.db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
1315
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1316
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1317
	
1318
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1319-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1319+
1320
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1321
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1322
	
1323
	.db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
1324-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1324+
1325
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1326
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1327
	
1328
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1329-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1329+
1330
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1331
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1332
	
1333
	
1334-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1334+
1335
	.db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
1336
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1337
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1338
	
1339-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1339+
1340
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1341
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1342
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1343
	
1344-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1344+
1345
	.db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
1346
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1347
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1348
	
1349-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1349+
1350
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1351
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1352
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1353
	
1354-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1354+
1355
	.db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
1356
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1357
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1358
	
1359
	.db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
1360-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1360+
1361
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1362
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1363
	
1364
	.db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
1365-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1365+
1366
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1367
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1368
	
1369
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1370-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1370+
1371
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1372
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1373
	
1374
	
1375-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1375+
1376
	.db 0x92, 0xFF, 0x00, 0x00 ; pulse 2
1377
	.db 0xC4, 0x00, 0x00, 0x00 ; triangle
1378
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1379
	
1380-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1380+
1381
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1382
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1383
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1384
	
1385-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1385+
1386
	.db 0x93, 0xFF, 0x00, 0x00 ; pulse 2
1387
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1388
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1389
	
1390-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1390+
1391
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1392
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1393
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1394
	
1395-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1395+
1396
	.db 0xC3, 0xFF, 0x00, 0x00 ; pulse 2
1397
	.db 0xC4, 0x00, 0x00, 0x00 ; triangle
1398
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1399
	
1400
	.db 0x00, 0x00, 0x00, 0x00 ; pulse 1
1401-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1401+
1402
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1403
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1404
	
1405
	.db 0xB4, 0xFF, 0x00, 0x00 ; pulse 1
1406-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1406+
1407
	.db 0x75, 0x00, 0x00, 0x00 ; triangle
1408
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1409
	
1410
	.db 0xC4, 0xFF, 0x00, 0x00 ; pulse 1
1411-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1411+
1412
	.db 0x45, 0x00, 0x00, 0x00 ; triangle
1413
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1414
	
1415
	
1416-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1416+
1417
	.db 0xB2, 0xFF, 0x00, 0x00 ; pulse 2
1418
	.db 0xB4, 0x00, 0x00, 0x00 ; triangle
1419
	.db 0x40, 0x30, 0x00, 0x00 ; noise
1420
	
1421-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1421+
1422
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1423
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1424
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1425
	
1426-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1426+
1427
	.db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
1428
	.db 0xB5, 0x00, 0x00, 0x00 ; triangle
1429
	.db 0x40, 0x20, 0x00, 0x00 ; noise
1430
	
1431-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1431+
1432
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1433
	.db 0x20, 0x00, 0x00, 0x00 ; triangle
1434
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1435
	
1436-
	.db 0x00, 0x00, 0x00, 0x00 ; noise
1436+
1437
	.db 0xF3, 0xFF, 0x00, 0x00 ; pulse 2
1438
	.db 0xF4, 0x00, 0x00, 0x00 ; triangle
1439
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1440
	
1441
	.db 0x75, 0xFF, 0x00, 0x00 ; pulse 1
1442
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1443
	.db 0x65, 0x00, 0x00, 0x00 ; triangle
1444
	.db 0x20, 0x00, 0x00, 0x00 ; noise
1445
	
1446
	.db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
1447
	.db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
1448
	.db 0x95, 0x00, 0x00, 0x00 ; triangle
1449
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1450
	
1451
	.db 0x65, 0xFF, 0x00, 0x00 ; pulse 1
1452
	.db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
1453
	.db 0x65, 0x00, 0x00, 0x00 ; triangle
1454
	.db 0x40, 0x50, 0x00, 0x00 ; noise
1455
song_end:
1456
1457
.dseg
1458
chan1_vol: .byte 1
1459
chan2_vol: .byte 1
1460
chan3_vol: .byte 1
1461
chan4_vol: .byte 1
1462
1463
chan1_dut: .byte 1
1464
chan2_dut: .byte 1
1465
chan3_dut: .byte 1
1466
chan4_dut: .byte 1
1467
1468
fine_tune: .byte 2
1469
waveform: .byte 1
1470
enable: .byte 1
1471
music_timer: .byte 2
1472
tick_timer: .byte 1
1473
1474
tempo: .byte 1
1475
speed: .byte 1
1476
repeat: .byte 1
1477
1478
chan1_tvol: .byte 1
1479
chan2_tvol: .byte 1
1480
chan3_tvol: .byte 1
1481
chan4_tvol: .byte 1
1482
1483
chan1_notes: .byte 2
1484
chan2_notes: .byte 2
1485
chan3_notes: .byte 2
1486
chan4_notes: .byte 2
1487
1488
chan1_vib: .byte 1
1489
chan2_vib: .byte 1
1490
chan3_vib: .byte 1
1491
chan4_vib: .byte 1
1492
1493
chan1_trm: .byte 1
1494
chan2_trm: .byte 1
1495
chan3_trm: .byte 1
1496
chan4_trm: .byte 1
1497
1498
chan1_eff: .byte 1
1499
chan2_eff: .byte 1
1500
chan3_eff: .byte 1
1501
chan4_eff: .byte 1