View difference between Paste ID: NLKCa01J and 6tj3bK3U
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 instrumnt which is a list of four effects to be applied per tick
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 - 0x4F] - instruments
30+
; [0x10 - end] - frames
31-
; [0x50 - end] - frames
31+
32
; frame format:
33-
; instrument format:
33+
34-
; 0x00 - effect 1
34+
35-
; 0x01 - effect 2
35+
; third byte - effect
36-
; 0x02 - effect 3
36+
37-
; 0x03 - effect 4
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-
; third byte - instrument
46+
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
80
.define NOTE_C 262
81
.define NOTE_Cs 277
82
.define NOTE_D 294
83
.define NOTE_Ds 311
84
.define NOTE_E 330
85
.define NOTE_F 349
86
.define NOTE_Fs 370
87
.define NOTE_G 392
88
.define NOTE_Gs 415
89
.define NOTE_A 440
90
.define NOTE_As 466
91
.define NOTE_B 494
92
93
.def LEFT_BUF = r2
94
.def RIGHT_BUF = r3
95
96
.def CHAN1_OSCL = r4
97
.def CHAN1_OSCH = r5
98
.def CHAN2_OSCL = r6
99
.def CHAN2_OSCH = r7
100
.def CHAN3_OSCL = r8
101
.def CHAN3_OSCH = r9
102
.def CHAN4_OSCL = r10
103
.def CHAN4_OSCH = r11
104
105
.def CHAN1_FRQL = r12
106
.def CHAN1_FRQH = r13
107
.def CHAN2_FRQL = r14
108
.def CHAN2_FRQH = r15
109
.def CHAN3_FRQL = r24
110
.def CHAN3_FRQH = r25
111
.def CHAN4_FRQL = r26
112
.def CHAN4_FRQH = r27
113
114
.def NOISEL = r0
115
.def NOISEH = r1
116
117
.def EFF_DIR = r18
118
119
.NOLIST
120
.include "m48def.inc"
121
.LIST
122
123
.cseg
124
.org 0x00
125
	rjmp start
126
127
.org 0x09
128
	rjmp timer
129
	
130
.org 0x40
131
start:
132
	ldi r16, LOW(RAMEND)
133
	out spl, r16
134
	ldi r16, HIGH(RAMEND)
135
	out sph, r16
136
	
137
	ldi r16, 1
138
	sts TIMSK2, r16
139
	ldi r16, 0b001
140
	sts TCCR2B, r16
141
	
142
	ldi r16, 0xFF
143
	out ddrd, r16
144
	out ddrc, r16
145
	
146
	ldi r16, 0xFF
147
	mov LEFT_BUF, r16
148
	mov RIGHT_BUF, r16
149
	
150-
	ldi r16, 0b0000
150+
151
	mov NOISEL, r16
152
	ldi r16, 0x00
153
	mov NOISEH, r16
154
	
155
	ldi r16, 0b1111
156
	sts enable, r16
157
	
158
	ldi r16, 0x08
159
	sts tempo, r16
160
	ldi r16, 0x06
161
	sts speed, r16
162
	
163
	ldi r16, 0x2F
164
	sts chan1_eff, r16
165
	sts chan2_eff, r16
166
	sts chan3_eff, r16
167
	sts chan4_eff, r16
168
	
169
	ldi r16, 0x1F
170
	sts chan1_vib, r16
171-
	sts chan1_vol, r16
171+
172-
	sts chan2_vol, r16
172+
173-
	sts chan3_vol, r16
173+
174-
	sts chan4_vol, r16
174+
175
	ldi r16, 0x0F
176
	sts chan1_trm, r16
177
	sts chan2_trm, r16
178
	sts chan3_trm, r16
179
	sts chan4_trm, r16
180
	
181
	ldi r16, 0x40
182
	sts chan1_tvol, r16
183
	sts chan2_tvol, r16
184
	sts chan3_tvol, r16
185
	sts chan4_tvol, r16
186
	
187
	ldi r16, 0x80
188-
	ldi r16, 0x44
188+
189
	sts chan2_dut, r16
190
	sts chan3_dut, r16
191
	sts chan4_dut, r16
192
	
193
	ldi r16, 0x64
194
	sts chan1_notes, r16
195
	sts chan2_notes, r16
196
	sts chan3_notes, r16
197
	sts chan4_notes, r16
198
	ldi r16, 0x00
199
	sts chan1_notes + 1, r16
200
	sts chan2_notes + 1, r16
201
	sts chan3_notes + 1, r16
202
	sts chan4_notes + 1, r16
203
	
204
	ldi r16, 0b00000000
205
	sts waveform, r16
206
	
207
	sei
208
209
loop:
210
	rjmp loop
211
212
note_freq:
213
	mov r16, r19
214
	lsr r16
215
	lsr r16
216
	lsr r16
217
	lsr r16
218
	cpi r16, 0x04
219
	breq setc
220
	cpi r16, 0x05
221
	breq setcs
222
	cpi r16, 0x06
223
	breq setd
224
	cpi r16, 0x07
225
	breq setds
226
	cpi r16, 0x08
227
	breq sete
228
	cpi r16, 0x09
229
	breq setf
230
	cpi r16, 0x0A
231
	breq setfs
232
	cpi r16, 0x0B
233
	breq setg
234
	cpi r16, 0x0C
235
	breq setgs
236
	cpi r16, 0x0D
237
	breq seta
238
	cpi r16, 0x0E
239
	breq setas
240
	cpi r16, 0x0F
241
	breq setb
242
	ret
243
setc:
244
	ldi r16, LOW(NOTE_C)
245
	ldi r17, HIGH(NOTE_C)
246
	rjmp skip4
247
setcs:
248
	ldi r16, LOW(NOTE_Cs)
249
	ldi r17, HIGH(NOTE_Cs)
250
	rjmp skip4
251
setd:
252
	ldi r16, LOW(NOTE_D)
253
	ldi r17, HIGH(NOTE_D)
254
	rjmp skip4
255
setds:
256
	ldi r16, LOW(NOTE_Ds)
257
	ldi r17, HIGH(NOTE_Ds)
258
	rjmp skip4
259
sete:
260
	ldi r16, LOW(NOTE_E)
261
	ldi r17, HIGH(NOTE_E)
262
	rjmp skip4
263
setf:
264
	ldi r16, LOW(NOTE_F)
265
	ldi r17, HIGH(NOTE_F)
266
	rjmp skip4
267
setfs:
268
	ldi r16, LOW(NOTE_Fs)
269
	ldi r17, HIGH(NOTE_Fs)
270
	rjmp skip4
271
setg:
272
	ldi r16, LOW(NOTE_G)
273
	ldi r17, HIGH(NOTE_G)
274
	rjmp skip4
275
setgs:
276
	ldi r16, LOW(NOTE_Gs)
277
	ldi r17, HIGH(NOTE_Gs)
278
	rjmp skip4
279
seta:
280
	ldi r16, LOW(NOTE_A)
281
	ldi r17, HIGH(NOTE_A)
282
	rjmp skip4
283
setas:
284
	ldi r16, LOW(NOTE_As)
285
	ldi r17, HIGH(NOTE_As)
286
	rjmp skip4
287
setb:
288
	ldi r16, LOW(NOTE_B)
289
	ldi r17, HIGH(NOTE_B)
290
	rjmp skip4
291
skip4:
292
	andi r19, 0x0F
293
	cpi r19, 0x01
294
	breq seto1
295
	cpi r19, 0x02
296
	breq seto2
297
	cpi r19, 0x03
298
	breq seto3
299
	cpi r19, 0x04
300
	breq seto4
301
	cpi r19, 0x05
302
	breq seto5
303
	cpi r19, 0x06
304
	breq seto6
305
	cpi r19, 0x07
306
	breq seto7
307
	cpi r19, 0x08
308
	breq seto8
309
	ret
310
seto1:
311
	lsr r17
312
	ror r16
313
	lsr r17
314
	ror r16
315
	lsr r17
316
	ror r16
317
	ret
318
seto2:
319
	lsr r17
320
	ror r16
321
	lsr r17
322
	ror r16
323
	ret
324
seto3:
325
	lsr r17
326
	ror r16
327
	ret
328
seto4:
329
	ret
330
seto5:
331
	lsl r16
332
	rol r17
333
	ret
334
seto6:
335
	lsl r16
336
	rol r17
337
	lsl r16
338
	rol r17
339
	ret
340
seto7:
341
	lsl r16
342
	rol r17
343
	lsl r16
344
	rol r17
345
	lsl r16
346
	rol r17
347
	ret
348
seto8:
349
	lsl r16
350
	rol r17
351
	lsl r16
352
	rol r17
353
	lsl r16
354
	rol r17
355
	lsl r16
356
	rol r17
357
	ret
358
	
359
track:
360
	ret
361
	
362
arpeggio:
363
	mov r21, r19
364
	andi r21, 0xF0
365
	cpi r16, 1
366
	breq first
367
	cpi r16, 2
368
	breq second
369
	ret
370
first:
371
	andi r20, 0xF0
372
	andi r19, 0x0F
373
	cpi r20, 4
374
	brlo nope2
375
	cp r21, r20
376
	brlo nope
377
	inc r19
378
nope:
379
	or r19, r20
380
	ret
381
second:
382
	lsl r20
383
	lsl r20
384
	lsl r20
385
	lsl r20
386
	andi r19, 0x0F
387
	cpi r20, 4
388
	brlo nope2
389
	cp r21, r20
390
	brlo nope
391
	inc r19
392
nope2:
393
	or r19, r21
394
	ret
395
396
music:
397
	clr r18
398
	sts music_timer, r18
399
	sts music_timer + 1, r18
400
	
401
	lds r16, tick_timer
402
	mov r17, r16
403
	lsr r17
404
	lsr r17
405
	lsr r17
406
	lsr r17
407
	andi r16, 0x0F
408
	inc r17
409
	lds r18, speed
410
	cp r17, r18
411
	brlo no_track
412
	rcall track
413
	clr r17
414
	rjmp okay
415
no_track:
416
	lsl r17
417
	lsl r17
418
	lsl r17
419
	lsl r17
420
okay:
421
	lds r18, fine_tune
422
423
	push r17
424
	push r16
425
	
426
	lds r19, chan1_notes
427
	lds r20, chan1_notes + 1
428
	rcall arpeggio
429
	rcall note_freq
430
	
431
	lds r21, chan1_vib
432
	mov r22, CHAN1_FRQL
433
	mov r23, CHAN1_FRQH
434
	
435
	rcall sweep
436
	
437
	mov CHAN1_FRQL, r22
438
	mov CHAN1_FRQH, r23
439
	
440
	mov r19, r18
441
	andi r19, 0x0F
442
	add CHAN1_FRQL, r19
443
	
444
	pop r16
445
	push r16
446
	
447
	lds r19, chan2_notes
448
	lds r20, chan2_notes + 1
449
	rcall arpeggio
450
	rcall note_freq
451
	
452
	lds r21, chan2_vib
453
	mov r22, CHAN2_FRQL
454
	mov r23, CHAN2_FRQH
455
	
456
	rcall sweep
457
	
458
	mov CHAN2_FRQL, r22
459
	mov CHAN2_FRQH, r23
460
	
461
	lsr r18
462
	lsr r18
463
	lsr r18
464
	lsr r18
465
	add CHAN2_FRQL, r18
466
	
467
	lds r18, fine_tune + 1
468
	
469
	pop r16
470
	push r16
471
	
472
	lds r19, chan3_notes
473
	lds r20, chan3_notes + 1
474
	rcall arpeggio
475
	rcall note_freq
476
	
477
	lds r21, chan3_vib
478
	mov r22, CHAN3_FRQL
479
	mov r23, CHAN3_FRQH
480
	
481
	rcall sweep
482
	
483
	mov CHAN3_FRQL, r22
484
	mov CHAN3_FRQH, r23
485
	
486
	mov r19, r18
487
	andi r19, 0x0F
488
	add CHAN3_FRQL, r19
489
	
490
	pop r16
491
	push r16
492
	
493
	lds r19, chan4_notes
494
	lds r20, chan4_notes + 1
495
	rcall arpeggio
496
	rcall note_freq
497
	
498
	lds r21, chan4_vib
499
	mov r22, CHAN4_FRQL
500
	mov r23, CHAN4_FRQH
501
	
502
	rcall sweep
503
	
504
	mov CHAN4_FRQL, r22
505
	mov CHAN4_FRQH, r23
506
	
507
	lsr r18
508
	lsr r18
509
	lsr r18
510
	lsr r18
511
	add CHAN4_FRQL, r18
512
	
513
	pop r16
514
	pop r17
515
	
516
	inc r16
517
	cpi r16, 3
518
	brlo lower
519
	clr r16
520
lower:
521
	or r17, r16
522
	sts tick_timer, r17
523
	
524
	lds r16, chan1_trm
525
	lds r17, chan1_vol
526
	lds r18, chan1_tvol
527
	rcall vol_sweep
528
	sts chan1_vol, r17
529
	
530
	lds r16, chan2_trm
531
	lds r17, chan2_vol
532
	lds r18, chan2_tvol
533
	rcall vol_sweep
534
	sts chan2_vol, r17
535
	
536
	lds r16, chan3_trm
537
	lds r17, chan3_vol
538
	lds r18, chan3_tvol
539
	rcall vol_sweep
540
	sts chan3_vol, r17
541
	
542
	lds r16, chan4_trm
543
	lds r17, chan4_vol
544
	lds r18, chan4_tvol
545
	rcall vol_sweep
546
	sts chan4_vol, r17
547
	
548
	lds r16, chan1_eff
549
	lds r17, chan1_trm
550
	lds r18, chan1_vib
551
	lds r19, chan1_dut
552
	rcall apply_effect
553
	sts chan1_trm, r17
554
	sts chan1_vib, r18
555
	sts chan1_dut, r19
556
	
557
	lds r16, chan2_eff
558
	lds r17, chan2_trm
559
	lds r18, chan2_vib
560
	lds r19, chan2_dut
561
	rcall apply_effect
562
	sts chan2_trm, r17
563
	sts chan2_vib, r18
564
	sts chan2_dut, r19
565
	
566
	lds r16, chan3_eff
567
	lds r17, chan3_trm
568
	lds r18, chan3_vib
569
	lds r19, chan3_dut
570
	rcall apply_effect
571
	sts chan3_trm, r17
572
	sts chan3_vib, r18
573
	sts chan3_dut, r19
574
	
575
	lds r16, chan4_eff
576
	lds r17, chan4_trm
577
	lds r18, chan4_vib
578
	lds r19, chan4_dut
579
	rcall apply_effect
580
	sts chan4_trm, r17
581
	sts chan4_vib, r18
582
	sts chan4_dut, r19
583
	
584
	ret
585
586
apply_effect:
587
	mov r20, r16
588
	lsr r16
589
	lsr r16
590
	lsr r16
591
	lsr r16
592
	andi r20, 0x0F
593
	
594
	cpi r16, 0x2
595
	breq set_vib_rate
596
	cpi r16, 0x3
597
	breq set_vib_depth
598
	cpi r16, 0x4
599
	breq set_trm_rate
600
	cpi r16, 0x5
601
	breq set_trm_depth
602
	cpi r16, 0x6
603
	breq set_portamento
604
	cpi r16, 0x7
605
	breq set_vol_slide
606
	cpi r16, 0x8
607
	breq inc_dut
608
	cpi r16, 0x9
609
	breq set_dut
610
	ret
611
set_vib_rate:
612
	lsl r20
613
	lsl r20
614
	lsl r20
615
	lsl r20
616
	andi r18, 0x0F
617
	or r18, r20
618
	ret
619
set_vib_depth:
620
	andi r18, 0xF0
621
	or r18, r20
622
	ret
623
set_trm_rate:
624
	lsl r20
625
	lsl r20
626
	lsl r20
627
	lsl r20
628
	andi r17, 0x0F
629
	or r17, r20
630
	ret
631
set_trm_depth:
632
	andi r17, 0xF0
633
	or r17, r20
634
	ret
635
set_portamento:
636
	lsl r20
637
	lsl r20
638
	lsl r20
639
	lsl r20
640
	mov r18, r20
641
	ret
642
set_vol_slide:
643
	lsl r20
644
	lsl r20
645
	lsl r20
646
	lsl r20
647
	mov r17, r20
648
	ret
649
inc_dut:
650
	add r19, r20
651
	ret
652
set_dut:
653
	lsl r20
654
	lsl r20
655
	lsl r20
656
	lsl r20
657
	mov r19, r20
658
	ret
659
660
vol_sweep:
661
	lsr r16
662
	lsr r16
663
	lsr r16
664
	lsr r16
665
	cpi r16, 0
666
	breq vol_equal
667
	cp r17, r18
668
	brlo vol_smaller
669
	cp r18, r17
670
	brlo vol_bigger
671
	rjmp vol_equal
672
vol_smaller:
673
	add r17, r16
674
	cp r18, r17
675
	brlo vol_equal
676
	ret
677
vol_bigger:
678
	sub r17, r16
679
	cp r17, r18
680
	brlo vol_equal
681
	ret
682
vol_equal:
683
	mov r17, r18
684
	ret
685
686
sweep:
687
	lsr r21
688
	lsr r21
689
	lsr r21
690
	lsr r21
691
	cpi r21, 0
692
	breq equal
693
	cp r23, r17
694
	brlo smaller
695
	cp r17, r23
696
	brlo bigger
697
	cp r22, r16
698
	brlo smaller
699
	cp r16, r22
700
	brlo bigger
701
	rjmp equal
702
bigger:
703
	sub r22, r21
704
	brcc yeah
705
	dec r23
706
yeah:
707
	rjmp done_big
708
done_big:
709
	cp r23, r17
710
	brlo equal
711
	cp r17, r23
712
	brlo return2
713
	cp r22, r16
714
	brlo equal
715
	rjmp return2
716
smaller:
717
	clr r19
718
	add r22, r21
719
	adc r23, r19
720
	rjmp done_small
721
done_small:
722
	cp r23, r17
723
	brlo return2
724
	cp r17, r23
725
	brlo equal
726
	cp r22, r16
727
	brlo return2
728
	cp r16, r22
729
	brlo equal
730
	rjmp return2
731
equal:
732
	mov r22, r16
733
	mov r23, r17
734
return2:
735
	ret
736
737
timer:
738
	mov r16, LEFT_BUF
739
	lsr r16
740
	lsr r16
741
	mov r17, RIGHT_BUF
742
	lsr r17
743
	lsr r17
744
	out portd, r16
745
	out portc, r17
746
	
747
	lds r16, music_timer
748
	lds r17, music_timer + 1
749
	ldi r18, 0
750
	ldi r19, 1
751
	add r16, r19
752
	adc r17, r18
753
	sts music_timer, r16
754
	sts music_timer + 1, r17
755
	lds r18, tempo
756
	cp r17, r18
757
	brlo no_music
758
	rcall music
759
	
760
no_music:
761
	clr LEFT_BUF
762
	clr RIGHT_BUF
763
	
764
	add CHAN1_OSCL, CHAN1_FRQL
765
	adc CHAN1_OSCH, CHAN1_FRQH
766
	add CHAN2_OSCL, CHAN2_FRQL
767
	adc CHAN2_OSCH, CHAN2_FRQH
768
	add CHAN3_OSCL, CHAN3_FRQL
769
	adc CHAN3_OSCH, CHAN3_FRQH
770
	add CHAN4_OSCL, CHAN4_FRQL
771
	adc CHAN4_OSCH, CHAN4_FRQH
772
	
773
	lds r16, waveform
774
	lds r22, enable
775
	
776
	mov r18, r16
777
	andi r18, 0b00000011
778
	mov r19, CHAN1_OSCH
779
	lds r20, chan1_vol
780
	lds r21, chan1_dut
781
	rcall generate
782
	sbrc r22, 0
783
	add LEFT_BUF, r17
784
	
785
	lsr r16
786
	lsr r16
787
	mov r18, r16
788
	andi r18, 0b00000011
789
	mov r19, CHAN2_OSCH
790
	lds r20, chan2_vol
791
	lds r21, chan2_dut
792
	rcall generate
793
	sbrc r22, 1
794
	add LEFT_BUF, r17
795
	
796
	lsr r16
797
	lsr r16
798
	mov r18, r16
799
	andi r18, 0b00000011
800
	mov r19, CHAN3_OSCH
801
	lds r20, chan3_vol
802
	lds r21, chan3_dut
803
	rcall generate
804
	sbrc r22, 2
805
	add RIGHT_BUF, r17
806
	
807
	lsr r16
808
	lsr r16
809
	mov r18, r16
810
	andi r18, 0b00000011
811
	mov r19, CHAN4_OSCH
812
	lds r20, chan4_vol
813
	lds r21, chan4_dut
814
	rcall generate
815-
chan4_trm: .byte 1
815+
816
	add RIGHT_BUF, r17
817
	
818
	reti
819
820
generate:
821
	clr r17
822
	cpi r18, 0b00
823
	breq gen_pulse
824
	cpi r18, 0b01
825
	breq gen_triangle
826
	cpi r18, 0b10
827
	breq gen_saw
828
	cpi r18, 0b11
829
	breq gen_noise
830
	ret
831
	
832
gen_pulse:
833
	cp r19, r21
834
	brlo return
835
	mov r17, r20
836
	lsr r17
837
	lsr r17
838
	ret
839
	
840
gen_triangle:
841
	mov r17, r19
842
	sbrc r19, 7
843
	com r17
844
	rjmp apply_volume
845
	ret
846
	
847
gen_saw:
848
	mov r17, r19
849
	lsr r17
850
	lsr r17
851
	rjmp apply_volume
852
	ret
853
	
854
gen_noise:
855
	clr r21
856
	clr r19
857
	sbrc NOISEH, 6
858
	ser r21
859
	sbrc NOISEL, 3
860
	ser r19
861
	eor r19, r21
862
	clr r21
863
	lsl NOISEH
864
	lsl NOISEL
865
	adc NOISEH, r21
866
	sbrc r19, 0
867
	inc NOISEL
868
	mov r17, NOISEL
869
	lsr r17
870
	rjmp apply_volume
871
	ret
872
	
873
apply_volume:
874
	sbrc r20, 7
875
	rjmp return
876
	lsr r17
877
	sbrc r20, 6
878
	rjmp return
879
	lsr r17
880
	sbrc r20, 5
881
	rjmp return
882
	lsr r17
883
	sbrc r20, 4
884
	rjmp return
885
	lsr r17
886
	sbrc r20, 3
887
	rjmp return
888
	lsr r17
889
	sbrc r20, 2
890
	rjmp return
891
	lsr r17
892
	sbrc r20, 1
893
	rjmp return
894
	lsr r17
895
return:
896
	ret
897
898
.dseg
899
chan1_vol: .byte 1
900
chan2_vol: .byte 1
901
chan3_vol: .byte 1
902
chan4_vol: .byte 1
903
904
chan1_dut: .byte 1
905
chan2_dut: .byte 1
906
chan3_dut: .byte 1
907
chan4_dut: .byte 1
908
909
fine_tune: .byte 2
910
waveform: .byte 1
911
enable: .byte 1
912
music_timer: .byte 2
913
tick_timer: .byte 1
914
915
tempo: .byte 1
916
speed: .byte 1
917
918
chan1_tvol: .byte 1
919
chan2_tvol: .byte 1
920
chan3_tvol: .byte 1
921
chan4_tvol: .byte 1
922
923
chan1_notes: .byte 2
924
chan2_notes: .byte 2
925
chan3_notes: .byte 2
926
chan4_notes: .byte 2
927
928
chan1_vib: .byte 1
929
chan2_vib: .byte 1
930
chan3_vib: .byte 1
931
chan4_vib: .byte 1
932
933
chan1_trm: .byte 1
934
chan2_trm: .byte 1
935
chan3_trm: .byte 1
936
chan4_trm: .byte 1
937
938
chan1_eff: .byte 1
939
chan2_eff: .byte 1
940
chan3_eff: .byte 1
941
chan4_eff: .byte 1