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