View difference between Paste ID: LU4TY8cY and pHw97DkU
SHOW: | | - or go back to the newest paste.
1
.define NOTE_C 262
2
.define NOTE_Cs 277
3
.define NOTE_D 294
4
.define NOTE_Ds 311
5
.define NOTE_E 330
6
.define NOTE_F 349
7
.define NOTE_Fs 370
8
.define NOTE_G 392
9
.define NOTE_Gs 415
10
.define NOTE_A 440
11
.define NOTE_As 466
12
.define NOTE_B 494
13
14
.def LEFT_BUF = r2
15
.def RIGHT_BUF = r3
16
17
.def CHAN1_OSCL = r4
18
.def CHAN1_OSCH = r5
19
.def CHAN2_OSCL = r6
20
.def CHAN2_OSCH = r7
21
.def CHAN3_OSCL = r8
22
.def CHAN3_OSCH = r9
23
.def CHAN4_OSCL = r10
24
.def CHAN4_OSCH = r11
25
26
.def CHAN1_FRQL = r12
27
.def CHAN1_FRQH = r13
28
.def CHAN2_FRQL = r14
29
.def CHAN2_FRQH = r15
30
.def CHAN3_FRQL = r24
31
.def CHAN3_FRQH = r25
32
.def CHAN4_FRQL = r26
33
.def CHAN4_FRQH = r27
34
35
.def NOISEL = r0
36
.def NOISEH = r1
37
38
.NOLIST
39
.include "m48def.inc"
40
.LIST
41
42
.cseg
43
.org 0x00
44
	rjmp start
45
46
.org 0x09
47
	rjmp timer
48
	
49
start:
50
	ldi r16, LOW(RAMEND)
51
	out spl, r16
52
	ldi r16, HIGH(RAMEND)
53
	out sph, r16
54
	
55
	ldi r16, 1
56
	sts TIMSK2, r16
57
	ldi r16, 0b001
58
	sts TCCR2B, r16
59
	
60
	ldi r16, 0xFF
61
	out ddrd, r16
62
	out ddrc, r16
63
	
64
	ldi r16, 0xFF
65
	mov LEFT_BUF, r16
66
	mov RIGHT_BUF, r16
67
	
68
	ldi r16, 0b0011
69
	sts enable, r16
70
	
71
	ldi r16, 0b00000000
72
	sts waveform, r16
73
	
74
	ldi r16, 0x80
75
	sts chan1_tdut, r16
76
	sts chan2_tdut, r16
77
	sts chan3_tdut, r16
78
	sts chan4_tdut, r16
79
	
80
	ldi r16, 0xFF
81
	sts chan1_tvol, r16
82
	sts chan2_tvol, r16
83
	sts chan3_tvol, r16
84
	sts chan4_tvol, r16
85
	
86
	ldi r16, 0x01
87
	ldi r17, 0x00
88
	mov NOISEL, r16
89
	mov NOISEH, r17
90
	
91
	ldi r16, 0x00
92
	sts tick_timer, r16
93
	sts tick_timer + 1, r16
94
	
95
	ldi r16, 0xF0
96
	sts chan1_env + 1, r16
97
	sts chan2_env + 1, r16
98
	sts chan3_env + 1, r16
99
	sts chan4_env + 1, r16
100
	
101
	ldi r16, 0x44
102
	sts chan1_notes, r16
103
	ldi r16, 0x00
104
	sts chan2_notes, r16
105
	ldi r16, 0x00
106
	sts chan3_notes, r16
107
	ldi r16, 0x00
108
	sts chan4_notes, r16
109
	
110
	ldi r16, 0x00
111
	sts chan1_notes + 1, r16
112
	ldi r16, 0x00
113
	sts chan2_notes + 1, r16
114
	ldi r16, 0x00
115
	sts chan3_notes + 1, r16
116
	ldi r16, 0x00
117
	sts chan4_notes + 1, r16
118
	
119
	ldi r16, 0b0000
120
	sts note_on, r16
121
	
122
	ldi r16, 0b00100000
123
	ldi r17, 0b10000010
124
	rcall command
125
	ldi r16, 0b00100010
126
	ldi r17, 0b11111110
127
	rcall command
128
	ldi r16, 0b01011100
129
	ldi r17, 0b11111110
130
	;rcall command
131
	ldi r16, 0b01110110
132
	ldi r17, 0b11111110
133
	;rcall command
134
	ldi r16, 0b01111001
135
	ldi r17, 0b10000001
136
	rcall command
137
	
138
	sei
139
	
140
loop:
141
	rjmp loop
142
	
143
command:
144
	sbrs r17, 7
145
	ret
146
	mov r18, r16
147
	lsr r18
148
	andi r18, 0b00000011 ;channel
149
	sbrs r16, 0
150
	rjmp note_command
151
effect_command:
152
	mov r19, r16
153
	lsl r19
154
	andi r19, 0xF0 ;effect
155
	mov r20, r17
156
	lsl r20
157
	sbrc r16, 7
158
	ori r20, 0b00000001 ;argument
159
	
160
	cpi r19, 0x00
161
	breq apply_arp
162
	cpi r19, 0x10
163
	breq apply_pitch_slide_up
164
	cpi r19, 0x20
165
	breq apply_pitch_slide_down_a
166
	cpi r19, 0x30
167
	breq apply_portamento_a
168
	cpi r19, 0x40
169
	breq apply_vibrato_a
170
	cpi r19, 0x50
171
	breq apply_waveform_a
172
	cpi r19, 0x60
173
	breq apply_duty_cycle_a
174
	cpi r19, 0x70
175
	breq apply_tremolo_a
176
	cpi r19, 0x80
177
	breq apply_pwm_a
178
	cpi r19, 0xA0
179
	breq apply_volume_slide_up_a
180
	cpi r19, 0xB0
181
	breq apply_volume_slide_down_a
182
	cpi r19, 0xC0
183
	breq apply_volume_a
184
	cpi r19, 0xF0
185
	breq apply_fine_a
186
	rjmp done
187
188
apply_arp:
189
	cpi r18, 0b00
190
	breq apply_arp1
191
	cpi r18, 0b01
192
	breq apply_arp2
193
	cpi r18, 0b10
194
	breq apply_arp3
195
	cpi r18, 0b11
196
	breq apply_arp4
197
	rjmp done
198
apply_arp1:
199
	sts chan1_notes + 1, r20
200
	rjmp done
201
apply_arp2:
202
	sts chan2_notes + 1, r20
203
	rjmp done
204
apply_arp3:
205
	sts chan3_notes + 1, r20
206
	rjmp done
207
apply_arp4:
208
	sts chan4_notes + 1, r20
209
	rjmp done
210
	
211
apply_pitch_slide_down_a:
212
	rjmp apply_pitch_slide_down
213
	
214
apply_portamento_a:
215
	rjmp apply_portamento
216
	
217
apply_vibrato_a:
218
	rjmp apply_vibrato
219
	
220
apply_waveform_a:
221
	rjmp apply_waveform
222
	
223
apply_duty_cycle_a:
224
	rjmp apply_duty_cycle
225
	
226
apply_tremolo_a:
227
	rjmp apply_tremolo
228
	
229
apply_pwm_a:
230
	rjmp apply_pwm
231
	
232
apply_volume_slide_up_a:
233
	rjmp apply_volume_slide_up
234
	
235
apply_volume_slide_down_a:
236
	rjmp apply_volume_slide_down
237
	
238
apply_volume_a:
239
	rjmp apply_volume_eff
240
	
241
apply_fine_a:
242
	rjmp apply_fine
243
244
apply_pitch_slide_up:
245
	cpi r18, 0b00
246
	breq apply_pitch_slide_up1
247
	cpi r18, 0b01
248
	breq apply_pitch_slide_up2
249
	cpi r18, 0b10
250
	breq apply_pitch_slide_up3
251
	cpi r18, 0b11
252
	breq apply_pitch_slide_up4
253
	rjmp done
254
apply_pitch_slide_up1:
255
	sts chan1_pit_slide, r20
256
	lds r16, pit_slide_dir
257
	ori r16, 0b0001
258
	sts pit_slide_dir, r16
259
	rjmp done
260
apply_pitch_slide_up2:
261
	sts chan2_pit_slide, r20
262
	lds r16, pit_slide_dir
263
	ori r16, 0b0010
264
	sts pit_slide_dir, r16
265
	rjmp done
266
apply_pitch_slide_up3:
267
	sts chan3_pit_slide, r20
268
	lds r16, pit_slide_dir
269
	ori r16, 0b0100
270
	sts pit_slide_dir, r16
271
	rjmp done
272
apply_pitch_slide_up4:
273
	sts chan4_pit_slide, r20
274
	lds r16, pit_slide_dir
275
	ori r16, 0b1000
276
	sts pit_slide_dir, r16
277
	rjmp done
278
279
apply_pitch_slide_down:
280
	cpi r18, 0b00
281
	breq apply_pitch_slide_down1
282
	cpi r18, 0b01
283
	breq apply_pitch_slide_down2
284
	cpi r18, 0b10
285
	breq apply_pitch_slide_down3
286
	cpi r18, 0b11
287
	breq apply_pitch_slide_down4
288
	rjmp done
289
apply_pitch_slide_down1:
290
	sts chan1_pit_slide, r20
291
	lds r16, pit_slide_dir
292
	andi r16, 0b1110
293
	sts pit_slide_dir, r16
294
	rjmp done
295
apply_pitch_slide_down2:
296
	sts chan2_pit_slide, r20
297
	lds r16, pit_slide_dir
298
	andi r16, 0b1101
299
	sts pit_slide_dir, r16
300
	rjmp done
301
apply_pitch_slide_down3:
302
	sts chan3_pit_slide, r20
303
	lds r16, pit_slide_dir
304
	andi r16, 0b1011
305
	sts pit_slide_dir, r16
306
	rjmp done
307
apply_pitch_slide_down4:
308
	sts chan4_pit_slide, r20
309
	lds r16, pit_slide_dir
310
	andi r16, 0b0111
311
	sts pit_slide_dir, r16
312
	rjmp done
313
314
apply_portamento:
315
	cpi r18, 0b00
316
	breq apply_portamento1
317
	cpi r18, 0b01
318
	breq apply_portamento2
319
	cpi r18, 0b10
320
	breq apply_portamento3
321
	cpi r18, 0b11
322
	breq apply_portamento4
323
	rjmp done
324
apply_portamento1:
325
	sts chan1_port, r20
326
	rjmp done
327
apply_portamento2:
328
	sts chan2_port, r20
329
	rjmp done
330
apply_portamento3:
331
	sts chan3_port, r20
332
	rjmp done
333
apply_portamento4:
334
	sts chan4_port, r20
335
	rjmp done
336
337
apply_vibrato:
338
	cpi r18, 0b00
339
	breq apply_vibrato1
340
	cpi r18, 0b01
341
	breq apply_vibrato2
342
	cpi r18, 0b10
343
	breq apply_vibrato3
344
	cpi r18, 0b11
345
	breq apply_vibrato4
346
	rjmp done
347
apply_vibrato1:
348
	sts chan1_vib, r20
349
	rjmp done
350
apply_vibrato2:
351
	sts chan2_vib, r20
352
	rjmp done
353
apply_vibrato3:
354
	sts chan3_vib, r20
355
	rjmp done
356
apply_vibrato4:
357
	sts chan4_vib, r20
358
	rjmp done
359
360
apply_waveform:
361
	lds r16, waveform
362
	cpi r18, 0b00
363
	breq apply_waveform1
364
	cpi r18, 0b01
365
	breq apply_waveform2
366
	cpi r18, 0b10
367
	breq apply_waveform3
368
	cpi r18, 0b11
369
	breq apply_waveform4
370
	rjmp done_waveform
371
apply_waveform1:
372
	andi r16, 0b11111100
373
	or r16, r20
374
	rjmp done_waveform
375
apply_waveform2:
376
	andi r16, 0b11110011
377
	lsl r20
378
	lsl r20
379
	or r16, r20
380
	rjmp done_waveform
381
apply_waveform3:
382
	andi r16, 0b11001111
383
	lsl r20
384
	lsl r20
385
	lsl r20
386
	lsl r20
387
	or r16, r20
388
	rjmp done_waveform
389
apply_waveform4:
390
	andi r16, 0b00111111
391
	lsl r20
392
	lsl r20
393
	lsl r20
394
	lsl r20
395
	lsl r20
396
	lsl r20
397
	or r16, r20
398
done_waveform:
399
	sts waveform, r16
400
	rjmp done
401
402
apply_duty_cycle:
403
	cpi r18, 0b00
404
	breq apply_duty_cycle1
405
	cpi r18, 0b01
406
	breq apply_duty_cycle2
407
	cpi r18, 0b10
408
	breq apply_duty_cycle3
409
	cpi r18, 0b11
410
	breq apply_duty_cycle4
411
	rjmp done
412
apply_duty_cycle1:
413
	sts chan1_tdut, r20
414
	rjmp done
415
apply_duty_cycle2:
416
	sts chan2_tdut, r20
417
	rjmp done
418
apply_duty_cycle3:
419
	sts chan3_tdut, r20
420
	rjmp done
421
apply_duty_cycle4:
422
	sts chan4_tdut, r20
423
	rjmp done
424
425
apply_tremolo:
426
	cpi r18, 0b00
427
	breq apply_tremolo1
428
	cpi r18, 0b01
429
	breq apply_tremolo2
430
	cpi r18, 0b10
431
	breq apply_tremolo3
432
	cpi r18, 0b11
433
	breq apply_tremolo4
434
	rjmp done
435
apply_tremolo1:
436
	sts chan1_trm, r20
437
	rjmp done
438
apply_tremolo2:
439
	sts chan2_trm, r20
440
	rjmp done
441
apply_tremolo3:
442
	sts chan3_trm, r20
443
	rjmp done
444
apply_tremolo4:
445
	sts chan4_trm, r20
446
	rjmp done
447
448
apply_pwm:
449
	cpi r18, 0b00
450
	breq apply_pwm1
451
	cpi r18, 0b01
452
	breq apply_pwm2
453
	cpi r18, 0b10
454
	breq apply_pwm3
455
	cpi r18, 0b11
456
	breq apply_pwm4
457
	rjmp done
458
apply_pwm1:
459
	sts chan1_pwm, r20
460
	rjmp done
461
apply_pwm2:
462
	sts chan2_pwm, r20
463
	rjmp done
464
apply_pwm3:
465
	sts chan3_pwm, r20
466
	rjmp done
467
apply_pwm4:
468
	sts chan4_pwm, r20
469
	rjmp done
470
471
apply_volume_slide_up:
472
	cpi r18, 0b00
473
	breq apply_volume_slide_up1
474
	cpi r18, 0b01
475
	breq apply_volume_slide_up2
476
	cpi r18, 0b10
477
	breq apply_volume_slide_up3
478
	cpi r18, 0b11
479
	breq apply_volume_slide_up4
480
	rjmp done
481
apply_volume_slide_up1:
482
	sts chan1_vol_slide, r20
483
	lds r16, vol_slide_dir
484
	ori r16, 0b0001
485
	sts vol_slide_dir, r16
486
	rjmp done
487
apply_volume_slide_up2:
488
	sts chan2_vol_slide, r20
489
	lds r16, vol_slide_dir
490
	ori r16, 0b0010
491
	sts vol_slide_dir, r16
492
	rjmp done
493
apply_volume_slide_up3:
494
	sts chan3_vol_slide, r20
495
	lds r16, vol_slide_dir
496
	ori r16, 0b0100
497
	sts vol_slide_dir, r16
498
	rjmp done
499
apply_volume_slide_up4:
500
	sts chan4_vol_slide, r20
501
	lds r16, vol_slide_dir
502
	ori r16, 0b1000
503
	sts vol_slide_dir, r16
504
	rjmp done
505
506
apply_volume_slide_down:
507
	cpi r18, 0b00
508
	breq apply_volume_slide_down1
509
	cpi r18, 0b01
510
	breq apply_volume_slide_down2
511
	cpi r18, 0b10
512
	breq apply_volume_slide_down3
513
	cpi r18, 0b11
514
	breq apply_volume_slide_down4
515
	rjmp done
516
apply_volume_slide_down1:
517
	sts chan1_vol_slide, r20
518
	lds r16, vol_slide_dir
519
	andi r16, 0b1110
520
	sts vol_slide_dir, r16
521
	rjmp done
522
apply_volume_slide_down2:
523
	sts chan2_vol_slide, r20
524
	lds r16, vol_slide_dir
525
	andi r16, 0b1101
526
	sts vol_slide_dir, r16
527
	rjmp done
528
apply_volume_slide_down3:
529
	sts chan3_vol_slide, r20
530
	lds r16, vol_slide_dir
531
	andi r16, 0b1011
532
	sts vol_slide_dir, r16
533
	rjmp done
534
apply_volume_slide_down4:
535
	sts chan4_vol_slide, r20
536
	lds r16, vol_slide_dir
537
	andi r16, 0b0111
538
	sts vol_slide_dir, r16
539
	rjmp done
540
541
apply_volume_eff:
542
	cpi r18, 0b00
543
	breq apply_volume1_eff
544
	cpi r18, 0b01
545
	breq apply_volume2_eff
546
	cpi r18, 0b10
547
	breq apply_volume3_eff
548
	cpi r18, 0b11
549
	breq apply_volume4_eff
550
	rjmp done
551
apply_volume1_eff:
552
	sts chan1_tvol, r20
553
	rjmp done
554
apply_volume2_eff:
555
	sts chan1_tvol, r20
556
	rjmp done
557
apply_volume3_eff:
558
	sts chan1_tvol, r20
559
	rjmp done
560
apply_volume4_eff:
561
	sts chan1_tvol, r20
562
	rjmp done
563
564
apply_fine:
565
	cpi r18, 0b00
566
	breq apply_fine1
567
	cpi r18, 0b01
568
	breq apply_fine2
569
	cpi r18, 0b10
570
	breq apply_fine3
571
	cpi r18, 0b11
572
	breq apply_fine4
573
	rjmp done
574
apply_fine1:
575
	sts chan1_fine, r20
576
	rjmp done
577
apply_fine2:
578
	sts chan2_fine, r20
579
	rjmp done
580
apply_fine3:
581
	sts chan3_fine, r20
582
	rjmp done
583
apply_fine4:
584
	sts chan4_fine, r20
585
	rjmp done
586
	
587
note_command:
588
	mov r19, r16
589
	lsl r19
590
	andi r19, 0xF0 ;note
591
	mov r20, r17
592
	lsl r20
593
	sbrc r16, 7
594
	ori r20, 0b00000001
595
	lsl r17
596
	andi r17, 0b11111000 ;volume
597
	andi r20, 0x0F
598
	or r20, r19 ;note/octave
599
	
600
	cpi r18, 0b00
601
	breq set_chan1
602
	cpi r18, 0b01
603
	breq set_chan2
604
	cpi r18, 0b10
605
	breq set_chan3a
606
	cpi r18, 0b11
607
	breq set_chan4a
608
	rjmp done
609
	
610
set_chan1:
611
	cpi r19, 0x00
612
	breq skip_note1
613
	cpi r19, 0x10
614
	breq reset_note1
615
	cpi r19, 0x20
616
	breq enable_note1
617
	cpi r19, 0x30
618
	breq disable_note1
619
	lds r16, enable
620
	ori r16, 0b0001
621
	sts enable, r16
622
	lds r16, note_on
623
	ori r16, 0b0001
624
	sts note_on, r16
625
	sts chan1_notes, r20
626
	rjmp skip_note1
627
reset_note1:
628
	clr CHAN1_OSCL
629
	clr CHAN1_OSCH
630
	rjmp skip_note1
631
enable_note1:
632
	lds r16, enable
633
	ori r16, 0b0001
634
	sts enable, r16
635
	rjmp skip_note1
636
disable_note1:
637
	lds r16, enable
638
	andi r16, 0b1110
639
	sts enable, r16
640
	rjmp skip_note1
641
skip_note1:
642
	cpi r17, 0x00
643
	breq done_a
644
	sts chan1_tvol, r17
645
	rjmp done
646
647
set_chan3a:
648
	rjmp set_chan3
649
650
set_chan4a:
651
	rjmp set_chan4b
652
	
653
set_chan2:
654
	cpi r19, 0x00
655
	breq skip_note2
656
	cpi r19, 0x10
657
	breq reset_note2
658
	cpi r19, 0x20
659
	breq enable_note2
660
	cpi r19, 0x30
661
	breq disable_note2
662
	lds r16, enable
663
	ori r16, 0b0010
664
	sts enable, r16
665
	lds r16, note_on
666
	ori r16, 0b0010
667
	sts note_on, r16
668
	sts chan2_notes, r20
669
	rjmp skip_note2
670
reset_note2:
671
	clr CHAN2_OSCL
672
	clr CHAN2_OSCH
673
	rjmp skip_note2
674
enable_note2:
675
	lds r16, enable
676
	ori r16, 0b0010
677
	sts enable, r16
678
	rjmp skip_note2
679
disable_note2:
680
	lds r16, enable
681
	andi r16, 0b1101
682
	sts enable, r16
683
	rjmp skip_note2
684
skip_note2:
685
	cpi r17, 0x00
686
	breq done_a
687
	sts chan2_tvol, r17
688
	rjmp done
689
690
set_chan4b:
691
	rjmp set_chan4
692
693
done_a:
694
	rjmp done
695
	
696
set_chan3:
697
	cpi r19, 0x00
698
	breq skip_note3
699
	cpi r19, 0x10
700
	breq reset_note3
701
	cpi r19, 0x20
702
	breq enable_note3
703
	cpi r19, 0x30
704
	breq disable_note3
705
	lds r16, enable
706
	ori r16, 0b0100
707
	sts enable, r16
708
	lds r16, note_on
709
	ori r16, 0b0100
710
	sts note_on, r16
711
	sts chan3_notes, r20
712
	rjmp skip_note3
713
reset_note3:
714
	clr CHAN3_OSCL
715
	clr CHAN3_OSCH
716
	rjmp skip_note3
717
enable_note3:
718
	lds r16, enable
719
	ori r16, 0b0100
720
	sts enable, r16
721
	rjmp skip_note3
722
disable_note3:
723
	lds r16, enable
724
	andi r16, 0b1011
725
	sts enable, r16
726
	rjmp skip_note3
727
skip_note3:
728
	cpi r17, 0x00
729
	breq done
730
	sts chan3_tvol, r17
731
	rjmp done
732
	
733
set_chan4:
734
	cpi r19, 0x00
735
	breq skip_note4
736
	cpi r19, 0x10
737
	breq reset_note4
738
	cpi r19, 0x20
739
	breq enable_note4
740
	cpi r19, 0x30
741
	breq disable_note4
742
	lds r16, enable
743
	ori r16, 0b1000
744
	sts enable, r16
745
	lds r16, note_on
746
	ori r16, 0b1000
747
	sts note_on, r16
748
	sts chan4_notes, r20
749
	rjmp skip_note4
750
reset_note4:
751
	clr CHAN3_OSCL
752
	clr CHAN3_OSCH
753
	rjmp skip_note4
754
enable_note4:
755
	lds r16, enable
756
	ori r16, 0b1000
757
	sts enable, r16
758
	rjmp skip_note4
759
disable_note4:
760
	lds r16, enable
761
	andi r16, 0b0111
762
	sts enable, r16
763
	rjmp skip_note4
764
skip_note4:
765
	cpi r17, 0x00
766
	breq done
767
	sts chan4_tvol, r17
768
	rjmp done
769
	
770
done:
771
	ret
772
773
timer:
774
	mov r16, LEFT_BUF
775
	lsr r16
776
	lsr r16
777
	
778
	mov r17, RIGHT_BUF
779
	lsr r17
780
	lsr r17
781
	
782
	out portd, r16
783
	out portc, r17
784
	
785
	clr LEFT_BUF
786
	clr RIGHT_BUF
787
	
788
	add CHAN1_OSCL, CHAN1_FRQL
789
	adc CHAN1_OSCH, CHAN1_FRQH
790
	add CHAN2_OSCL, CHAN2_FRQL
791
	adc CHAN2_OSCH, CHAN2_FRQH
792
	add CHAN3_OSCL, CHAN3_FRQL
793
	adc CHAN3_OSCH, CHAN3_FRQH
794
	add CHAN4_OSCL, CHAN4_FRQL
795
	adc CHAN4_OSCH, CHAN4_FRQH
796
	
797
	lds r16, waveform
798
	lds r22, enable
799
	
800
	mov r18, r16
801
	andi r18, 0b00000011
802
	mov r19, CHAN1_OSCH
803
	lds r20, chan1_vol
804
	lds r21, chan1_dut
805
	rcall generate
806
	sbrc r22, 0
807
	add LEFT_BUF, r17
808
	
809
	lsr r16
810
	lsr r16
811
	mov r18, r16
812
	andi r18, 0b00000011
813
	mov r19, CHAN2_OSCH
814
	lds r20, chan2_vol
815
	lds r21, chan2_dut
816
	rcall generate
817
	sbrc r22, 1
818
	add LEFT_BUF, r17
819
	
820
	lsr r16
821
	lsr r16
822
	mov r18, r16
823
	andi r18, 0b00000011
824
	mov r19, CHAN3_OSCH
825
	lds r20, chan3_vol
826
	lds r21, chan3_dut
827
	rcall generate
828
	sbrc r22, 2
829
	add RIGHT_BUF, r17
830
	
831
	lsr r16
832
	lsr r16
833
	mov r18, r16
834
	andi r18, 0b00000011
835
	mov r19, CHAN4_OSCH
836
	lds r20, chan4_vol
837
	lds r21, chan4_dut
838
	rcall generate
839
	sbrc r22, 3
840
	add RIGHT_BUF, r17
841
	
842
	lds r16, tick_timer
843
	cpi r16, 0x00
844
	brne skip22
845
	
846
	lds r20, vol_slide_dir
847
	
848
	lds r16, chan1_tvol
849
	lds r17, chan1_vol_slide
850
	sbrc r20, 0
851
	rjmp up1b
852
	sbc r16, r17
853
	brcc down1b
854
	clr r16
855
up1b:
856
	add r16, r17
857
	brcc down1b
858
	ser r16
859
down1b:
860
	sts chan1_tvol, r16
861
	sts chan1_ptrm, r16
862
	
863
	lds r16, chan2_tvol
864
	lds r17, chan2_vol_slide
865
	sbrc r20, 1
866
	rjmp up2b
867
	sbc r16, r17
868
	brcc down2b
869
	clr r16
870
up2b:
871
	add r16, r17
872
	brcc down2b
873
	ser r16
874
down2b:
875
	sts chan2_tvol, r16
876
	sts chan2_ptrm, r16
877
878
	rjmp skip23
879
skip22:
880
	rjmp skip2
881
skip23:
882
	
883
	lds r16, chan3_tvol
884
	lds r17, chan3_vol_slide
885
	sbrc r20, 2
886
	rjmp up3b
887
	sbc r16, r17
888
	brcc down3b
889
	clr r16
890
up3b:
891
	add r16, r17
892
	brcc down3b
893
	ser r16
894
down3b:
895
	sts chan3_tvol, r16
896
	sts chan3_ptrm, r16
897
	
898
	lds r16, chan4_tvol
899
	lds r17, chan4_vol_slide
900
	sbrc r20, 3
901
	rjmp up4b
902
	sbc r16, r17
903
	brcc down4b
904
	clr r16
905
up4b:
906
	add r16, r17
907
	brcc down4b
908
	ser r16
909
down4b:
910
	sts chan4_tvol, r16
911
	sts chan4_ptrm, r16
912
913
	rjmp skip3
914
	
915
skip2:
916
	rjmp skip
917
	
918
skip3:
919
	lds r16, note_on
920
	lds r17, chan1_notes + 1
921
	cpi r17, 0x00
922
	breq skip11
923
	ori r16, 0b0001
924
	
925
skip11:
926
	sbrs r16, 0
927
	rjmp skip7
928
	andi r16, 0b1110
929
	sts note_on, r16
930
931
	lds r16, chan1_notes
932
	lds r17, chan1_notes + 1
933
	rcall handle_note
934
	sts chan1_tpit, r16
935
	sts chan1_tpit + 1, r17
936
937
skip7:
938
	lds r16, note_on
939
	lds r17, chan2_notes + 1
940
	cpi r17, 0x00
941
	breq skip12
942
	ori r16, 0b0010
943
	
944
skip12:
945
	sbrs r16, 1
946
	rjmp skip8
947
	andi r16, 0b1101
948
	sts note_on, r16
949
950
	lds r16, chan2_notes
951
	lds r17, chan2_notes + 1
952
	rcall handle_note
953
	sts chan2_tpit, r16
954
	sts chan2_tpit + 1, r17
955
	
956
skip8:
957
	lds r16, note_on
958
	lds r17, chan3_notes + 1
959
	cpi r17, 0x00
960
	breq skip13
961
	ori r16, 0b0100
962
	
963
skip13:
964
	sbrs r16, 2
965
	rjmp skip9
966
	andi r16, 0b1011
967
	sts note_on, r16
968
969
	lds r16, chan3_notes
970
	lds r17, chan3_notes + 1
971
	rcall handle_note
972
	sts chan3_tpit, r16
973
	sts chan3_tpit + 1, r17
974
	
975
skip9:
976
	lds r16, note_on
977
	lds r17, chan4_notes + 1
978
	cpi r17, 0x00
979
	breq skip14
980
	ori r16, 0b1000
981
	
982
skip14:
983
	sbrs r16, 3
984
	rjmp skip10
985
	andi r16, 0b0111
986
	sts note_on, r16
987
988
	lds r16, chan4_notes
989
	lds r17, chan4_notes + 1
990
	rcall handle_note
991
	sts chan4_tpit, r16
992
	sts chan4_tpit + 1, r17
993
	
994
skip10:
995
	lds CHAN1_FRQL, chan1_pvib
996
	lds CHAN1_FRQH, chan1_pvib + 1
997
	lds CHAN2_FRQL, chan2_pvib
998
	lds CHAN2_FRQH, chan2_pvib + 1
999
	lds CHAN3_FRQL, chan3_pvib
1000
	lds CHAN3_FRQH, chan3_pvib + 1
1001
	lds CHAN4_FRQL, chan4_pvib
1002
	lds CHAN4_FRQH, chan4_pvib + 1
1003
	
1004
	lds r21, slide_timer
1005
	inc r21
1006
	cpi r21, 0x4
1007
	brne skip15
1008
	clr r21
1009
skip15:
1010
	sts slide_timer, r21
1011
	cpi r21, 0x00
1012
	brne skip16
1013
	ser r21
1014
	rjmp skip17
1015
skip16:
1016
	clr r21
1017
skip17:
1018
	lds r20, pit_slide_dir
1019
	
1020
	lds r16, chan1_tpit
1021
	lds r17, chan1_tpit + 1
1022
	sbrs r21, 0
1023
	rjmp skip18
1024
	lds r18, chan1_pit_slide
1025
	ldi r19, 0x00
1026
	sbrc r20, 0
1027
	rjmp up1
1028
	cpi r17, 0x00
1029
	brne down1a
1030
	cpi r16, 0x00
1031
	breq down1
1032
down1a:
1033
	sbc r16, r18
1034
	brcc down1
1035
	dec r17
1036
	rjmp down1
1037
up1:
1038
	add r16, r18
1039
	adc r17, r19
1040
down1:
1041
	sts chan1_tpit, r16
1042
	sts chan1_tpit + 1, r17
1043
skip18:
1044
	sbrs r21, 0
1045
	rjmp port1
1046
	lds r18, chan1_port
1047
	cpi r18, 0x00
1048
	breq skip_port1
1049
	mov r23, CHAN1_FRQL
1050
	cpi r23, 0x00
1051
	brne ne1
1052
	mov r23, CHAN1_FRQH
1053
	cpi r23, 0x00
1054
	breq skip_port1
1055
ne1:
1056
	cp CHAN1_FRQH, r17
1057
	brlo higher1
1058
	cp r17, CHAN1_FRQH
1059
	brlo lower1
1060
	cp CHAN1_FRQL, r16
1061
	brlo higher1
1062
	cp r16, CHAN1_FRQL
1063
	brlo lower1
1064
	rjmp skip_port1
1065
higher1:
1066
	ldi r19, 0x00
1067
	add CHAN1_FRQL, r18
1068
	adc CHAN1_FRQH, r19
1069
	cp r17, CHAN1_FRQH
1070
	brlo skip_port1
1071
	cp CHAN1_FRQH, r17
1072
	brlo port1
1073
	cp r16, CHAN1_FRQL
1074
	brlo skip_port1
1075
	rjmp port1
1076
lower1:
1077
	clc
1078
	sbc CHAN1_FRQL, r18
1079
	brcc lower1a
1080
	dec CHAN1_FRQH
1081
lower1a:
1082
	cp CHAN1_FRQH, r17
1083
	brlo skip_port1
1084
	cp r17, CHAN1_FRQH
1085
	brlo port1
1086
	cp CHAN1_FRQL, r16
1087
	brlo skip_port1
1088
	rjmp port1
1089
skip_port1:
1090
	mov CHAN1_FRQL, r16
1091
	mov CHAN1_FRQH, r17
1092
port1:
1093
	
1094
	lds r16, chan2_tpit
1095
	lds r17, chan2_tpit + 1
1096
	sbrs r21, 0
1097
	rjmp skip19
1098
	lds r18, chan2_pit_slide
1099
	ldi r19, 0x00
1100
	sbrc r20, 1
1101
	rjmp up2
1102
	cpi r17, 0x00
1103
	brne down2a
1104
	cpi r16, 0x00
1105
	breq down2
1106
down2a:
1107
	sbc r16, r18
1108
	brcc down2
1109
	dec r17
1110
	rjmp down2
1111
up2:
1112
	add r16, r18
1113
	adc r17, r19
1114
down2:
1115
	sts chan2_tpit, r16
1116
	sts chan2_tpit + 1, r17
1117
skip19:
1118
	sbrs r21, 0
1119
	rjmp port2
1120
	lds r18, chan2_port
1121
	cpi r18, 0x00
1122
	breq skip_port2
1123
	mov r23, CHAN2_FRQL
1124
	cpi r23, 0x00
1125
	brne ne2
1126
	mov r23, CHAN2_FRQH
1127
	cpi r23, 0x00
1128
	breq skip_port2
1129
ne2:
1130
	cp CHAN2_FRQH, r17
1131
	brlo higher2
1132
	cp r17, CHAN2_FRQH
1133
	brlo lower2
1134
	cp CHAN2_FRQL, r16
1135
	brlo higher2
1136
	cp r16, CHAN2_FRQL
1137
	brlo lower2
1138
	rjmp skip_port2
1139
higher2:
1140
	ldi r19, 0x00
1141
	add CHAN2_FRQL, r18
1142
	adc CHAN2_FRQH, r19
1143
	cp r17, CHAN2_FRQH
1144
	brlo skip_port2
1145
	cp CHAN2_FRQH, r17
1146
	brlo port2
1147
	cp r16, CHAN2_FRQL
1148
	brlo skip_port2
1149
	rjmp port2
1150
lower2:
1151
	clc
1152
	sbc CHAN2_FRQL, r18
1153
	brcc lower2a
1154
	dec CHAN2_FRQH
1155
lower2a:
1156
	cp CHAN2_FRQH, r17
1157
	brlo skip_port2
1158
	cp r17, CHAN2_FRQH
1159
	brlo port2
1160
	cp CHAN2_FRQL, r16
1161
	brlo skip_port2
1162
	rjmp port2
1163
skip_port2:
1164
	mov CHAN2_FRQL, r16
1165
	mov CHAN2_FRQH, r17
1166
port2:
1167
	
1168
	lds r16, chan3_tpit
1169
	lds r17, chan3_tpit + 1
1170
	sbrs r21, 0
1171
	rjmp skip20
1172
	lds r18, chan3_pit_slide
1173
	ldi r19, 0x00
1174
	sbrc r20, 2
1175
	rjmp up3
1176
	cpi r17, 0x00
1177
	brne down3a
1178
	cpi r16, 0x00
1179
	breq down3
1180
down3a:
1181
	sbc r16, r18
1182
	brcc down3
1183
	dec r17
1184
	rjmp down3
1185
up3:
1186
	add r16, r18
1187
	adc r17, r19
1188
down3:
1189
	sts chan3_tpit, r16
1190
	sts chan3_tpit + 1, r17
1191
skip20:
1192
	sbrs r21, 0
1193
	rjmp port3
1194
	lds r18, chan3_port
1195
	cpi r18, 0x00
1196
	breq skip_port3
1197
	mov r23, CHAN3_FRQL
1198
	cpi r23, 0x00
1199
	brne ne3
1200
	mov r23, CHAN3_FRQH
1201
	cpi r23, 0x00
1202
	breq skip_port3
1203
ne3:
1204
	cp CHAN3_FRQH, r17
1205
	brlo higher3
1206
	cp r17, CHAN3_FRQH
1207
	brlo lower3
1208
	cp CHAN3_FRQL, r16
1209
	brlo higher3
1210
	cp r16, CHAN3_FRQL
1211
	brlo lower3
1212
	rjmp skip_port3
1213
higher3:
1214
	ldi r19, 0x00
1215
	add CHAN3_FRQL, r18
1216
	adc CHAN3_FRQH, r19
1217
	cp r17, CHAN3_FRQH
1218
	brlo skip_port3
1219
	cp CHAN3_FRQH, r17
1220
	brlo port3
1221
	cp r16, CHAN3_FRQL
1222
	brlo skip_port3
1223
	rjmp port3
1224
lower3:
1225
	clc
1226
	sbc CHAN3_FRQL, r18
1227
	brcc lower3a
1228
	dec CHAN3_FRQH
1229
lower3a:
1230
	cp CHAN3_FRQH, r17
1231
	brlo skip_port3
1232
	cp r17, CHAN3_FRQH
1233
	brlo port3
1234
	cp CHAN3_FRQL, r16
1235
	brlo skip_port3
1236
	rjmp port3
1237
skip_port3:
1238
	mov CHAN3_FRQL, r16
1239
	mov CHAN3_FRQH, r17
1240
port3:
1241
	
1242
	lds r16, chan4_tpit
1243
	lds r17, chan4_tpit + 1
1244
	sbrs r21, 0
1245
	rjmp skip21
1246
	lds r18, chan4_pit_slide
1247
	ldi r19, 0x00
1248
	sbrc r20, 3
1249
	rjmp up4
1250
	cpi r17, 0x00
1251
	brne down4a
1252
	cpi r16, 0x00
1253
	breq down4
1254
down4a:
1255
	sbc r16, r18
1256
	brcc down4
1257
	dec r17
1258
	rjmp down4
1259
up4:
1260
	add r16, r18
1261
	adc r17, r19
1262
down4:
1263
	sts chan4_tpit, r16
1264
	sts chan4_tpit + 1, r17
1265
skip21:
1266
	sbrs r21, 0
1267
	rjmp port4
1268
	lds r18, chan4_port
1269
	cpi r18, 0x00
1270
	breq skip_port4
1271
	mov r23, CHAN4_FRQL
1272
	cpi r23, 0x00
1273
	brne ne4
1274
	mov r23, CHAN4_FRQH
1275
	cpi r23, 0x00
1276
	breq skip_port4
1277
ne4:
1278
	cp CHAN4_FRQH, r17
1279
	brlo higher4
1280
	cp r17, CHAN4_FRQH
1281
	brlo lower4
1282
	cp CHAN4_FRQL, r16
1283
	brlo higher4
1284
	cp r16, CHAN4_FRQL
1285
	brlo lower4
1286
	rjmp skip_port4
1287
higher4:
1288
	ldi r19, 0x00
1289
	add CHAN4_FRQL, r18
1290
	adc CHAN4_FRQH, r19
1291
	cp r17, CHAN4_FRQH
1292
	brlo skip_port4
1293
	cp CHAN4_FRQH, r17
1294
	brlo port4
1295
	cp r16, CHAN4_FRQL
1296
	brlo skip_port4
1297
	rjmp port4
1298
lower4:
1299
	clc
1300
	sbc CHAN4_FRQL, r18
1301
	brcc lower4a
1302
	dec CHAN4_FRQH
1303
lower4a:
1304
	cp CHAN4_FRQH, r17
1305
	brlo skip_port4
1306
	cp r17, CHAN4_FRQH
1307
	brlo port4
1308
	cp CHAN4_FRQL, r16
1309
	brlo skip_port4
1310
	rjmp port4
1311
skip_port4:
1312
	mov CHAN4_FRQL, r16
1313
	mov CHAN4_FRQH, r17
1314
port4:
1315
	sts chan1_pvib, CHAN1_FRQL
1316
	sts chan1_pvib + 1, CHAN1_FRQH
1317
	sts chan2_pvib, CHAN2_FRQL
1318
	sts chan2_pvib + 1, CHAN2_FRQH
1319
	sts chan3_pvib, CHAN3_FRQL
1320
	sts chan3_pvib + 1, CHAN3_FRQH
1321
	sts chan4_pvib, CHAN4_FRQL
1322
	sts chan4_pvib + 1, CHAN4_FRQH
1323
	
1324
	lds r21, vibrato_timer
1325
	inc r21
1326
	cpi r21, 0x8
1327
	brne skip27
1328
	clr r21
1329
skip27:
1330
	sts vibrato_timer, r21
1331
	
1332
	push r0
1333
	push r1
1334
	
1335
	lds r16, chan1_tvib
1336
	lds r17, chan1_vib
1337
	mov r19, r17
1338
	andi r17, 0xF0
1339
	lsr r17
1340
	andi r19, 0x0F
1341
	
1342
	cpi r21, 0x00
1343
	brne skip26
1344
	
1345
	add r16, r17
1346
	sts chan1_tvib, r16
1347
skip26:
1348
	sbrc r16, 7
1349
	com r16
1350
	lsr r16
1351
	lsr r16
1352
	lsr r16
1353
	mul r16, r19
1354
	mov r16, r0
1355
	lsr r16
1356
	lsr r16
1357
	lsr r16
1358
	ldi r19, 0x00
1359
	lds r18, chan1_fine
1360
	add r16, r18
1361
	add CHAN1_FRQL, r16
1362
	adc CHAN1_FRQH, r19
1363
	
1364
	lds r16, chan2_tvib
1365
	lds r17, chan2_vib
1366
	mov r19, r17
1367
	andi r17, 0xF0
1368
	lsr r17
1369
	andi r19, 0x0F
1370
	
1371
	cpi r21, 0x00
1372
	brne skip30
1373
	
1374
	add r16, r17
1375
	sts chan2_tvib, r16
1376
skip30:
1377
	sbrc r16, 7
1378
	com r16
1379
	lsr r16
1380
	lsr r16
1381
	lsr r16
1382
	mul r16, r19
1383
	mov r16, r0
1384
	lsr r16
1385
	lsr r16
1386
	lsr r16
1387
	ldi r19, 0x00
1388
	lds r18, chan2_fine
1389
	add r16, r18
1390
	add CHAN2_FRQL, r16
1391
	adc CHAN2_FRQH, r19
1392
	
1393
	lds r16, chan3_tvib
1394
	lds r17, chan3_vib
1395
	mov r19, r17
1396
	andi r17, 0xF0
1397
	lsr r17
1398
	andi r19, 0x0F
1399
	
1400
	cpi r21, 0x00
1401
	brne skip28
1402
	
1403
	add r16, r17
1404
	sts chan3_tvib, r16
1405
skip28:
1406
	sbrc r16, 7
1407
	com r16
1408
	lsr r16
1409
	lsr r16
1410
	lsr r16
1411
	mul r16, r19
1412
	mov r16, r0
1413
	lsr r16
1414
	lsr r16
1415
	lsr r16
1416
	ldi r19, 0x00
1417
	lds r18, chan3_fine
1418
	add r16, r18
1419
	add CHAN3_FRQL, r16
1420
	adc CHAN3_FRQH, r19
1421
	
1422
	lds r16, chan4_tvib
1423
	lds r17, chan4_vib
1424
	mov r19, r17
1425
	andi r17, 0xF0
1426
	lsr r17
1427
	andi r19, 0x0F
1428
	
1429
	cpi r21, 0x00
1430
	brne skip29
1431
	
1432
	add r16, r17
1433
	sts chan4_tvib, r16
1434
skip29:
1435
	sbrc r16, 7
1436
	com r16
1437
	lsr r16
1438
	lsr r16
1439
	lsr r16
1440
	mul r16, r19
1441
	mov r16, r0
1442
	lsr r16
1443
	lsr r16
1444
	lsr r16
1445
	ldi r19, 0x00
1446
	lds r18, chan4_fine
1447
	add r16, r18
1448
	add CHAN4_FRQL, r16
1449
	adc CHAN4_FRQH, r19
1450
	
1451
	lds r16, chan1_ttrm
1452
	lds r17, chan1_trm
1453
	mov r19, r17
1454
	andi r17, 0xF0
1455
	lsr r17
1456
	andi r19, 0x0F
1457
	lsl r19
1458
	lsl r19
1459
	lsl r19
1460
	lsl r19
1461
	cpi r21, 0x00
1462
	brne skip31
1463
	add r16, r17
1464
	sts chan1_ttrm, r16
1465
skip31:
1466
	sbrc r16, 7
1467
	com r16
1468
	lsl r16
1469
	mul r16, r19
1470
	mov r16, r1
1471
	lds r18, chan1_ptrm
1472
	clc
1473
	sbc r18, r16
1474
	brcc skip32
1475
	clr r18
1476
skip32:
1477
	sts chan1_vol, r18
1478
	
1479
	lds r16, chan2_ttrm
1480
	lds r17, chan2_trm
1481
	mov r19, r17
1482
	andi r17, 0xF0
1483
	lsr r17
1484
	andi r19, 0x0F
1485
	lsl r19
1486
	lsl r19
1487
	lsl r19
1488
	lsl r19
1489
	cpi r21, 0x00
1490
	brne skip33
1491
	add r16, r17
1492
	sts chan2_ttrm, r16
1493
skip33:
1494
	sbrc r16, 7
1495
	com r16
1496
	lsl r16
1497
	mul r16, r19
1498
	mov r16, r1
1499
	lds r18, chan2_ptrm
1500
	clc
1501
	sbc r18, r16
1502
	brcc skip34
1503
	clr r18
1504
skip34:
1505
	sts chan2_vol, r18
1506
	
1507
	lds r16, chan3_ttrm
1508
	lds r17, chan3_trm
1509
	mov r19, r17
1510
	andi r17, 0xF0
1511
	lsr r17
1512
	andi r19, 0x0F
1513
	lsl r19
1514
	lsl r19
1515
	lsl r19
1516
	lsl r19
1517
	cpi r21, 0x00
1518
	brne skip38
1519
	add r16, r17
1520
	sts chan3_ttrm, r16
1521
skip38:
1522
	sbrc r16, 7
1523
	com r16
1524
	lsl r16
1525
	mul r16, r19
1526
	mov r16, r1
1527
	lds r18, chan3_ptrm
1528
	clc
1529
	sbc r18, r16
1530
	brcc skip35
1531
	clr r18
1532
skip35:
1533
	sts chan3_vol, r18
1534
	
1535
	lds r16, chan4_ttrm
1536
	lds r17, chan4_trm
1537
	mov r19, r17
1538
	andi r17, 0xF0
1539
	lsr r17
1540
	andi r19, 0x0F
1541
	lsl r19
1542
	lsl r19
1543
	lsl r19
1544
	lsl r19
1545
	cpi r21, 0x00
1546
	brne skip36
1547
	add r16, r17
1548
	sts chan4_ttrm, r16
1549
skip36:
1550
	sbrc r16, 7
1551
	com r16
1552
	lsl r16
1553
	mul r16, r19
1554
	mov r16, r1
1555
	lds r18, chan4_ptrm
1556
	clc
1557
	sbc r18, r16
1558
	brcc skip37
1559
	clr r18
1560
skip37:
1561
	sts chan4_vol, r18
1562
	
1563
	lds r16, chan1_tpwm
1564
	lds r17, chan1_pwm
1565
	mov r19, r17
1566
	andi r17, 0xF0
1567
	lsr r17
1568
	lsr r17
1569
	lsr r17
1570
	lsr r17
1571
	andi r19, 0x0F
1572
	lsl r19
1573
	lsl r19
1574
	lsl r19
1575
	lsl r19
1576
	cpi r21, 0x00
1577
	brne skip39
1578
	add r16, r17
1579
	sts chan1_tpwm, r16
1580
skip39:
1581
	sbrc r16, 7
1582
	com r16
1583
	mul r16, r19
1584
	mov r16, r1
1585
	lds r18, chan1_tdut
1586
	add r18, r16
1587
	sts chan1_dut, r18
1588
	
1589
	lds r16, chan2_tpwm
1590
	lds r17, chan2_pwm
1591
	mov r19, r17
1592
	andi r17, 0xF0
1593
	lsr r17
1594
	lsr r17
1595
	lsr r17
1596
	lsr r17
1597
	andi r19, 0x0F
1598
	lsl r19
1599
	lsl r19
1600
	lsl r19
1601
	lsl r19
1602
	cpi r21, 0x00
1603
	brne skip40
1604
	add r16, r17
1605
	sts chan2_tpwm, r16
1606
skip40:
1607
	sbrc r16, 7
1608
	com r16
1609
	mul r16, r19
1610
	mov r16, r1
1611
	lds r18, chan2_tdut
1612
	add r18, r16
1613
	sts chan2_dut, r18
1614
	
1615
	lds r16, chan3_tpwm
1616
	lds r17, chan3_pwm
1617
	mov r19, r17
1618
	andi r17, 0xF0
1619
	lsr r17
1620
	lsr r17
1621
	lsr r17
1622
	lsr r17
1623
	andi r19, 0x0F
1624
	lsl r19
1625
	lsl r19
1626
	lsl r19
1627
	lsl r19
1628
	cpi r21, 0x00
1629
	brne skip41
1630
	add r16, r17
1631
	sts chan3_tpwm, r16
1632
skip41:
1633
	sbrc r16, 7
1634
	com r16
1635
	mul r16, r19
1636
	mov r16, r1
1637
	lds r18, chan3_tdut
1638
	add r18, r16
1639
	sts chan3_dut, r18
1640
	
1641
	lds r16, chan4_tpwm
1642
	lds r17, chan4_pwm
1643
	mov r19, r17
1644
	andi r17, 0xF0
1645
	lsr r17
1646
	lsr r17
1647
	lsr r17
1648
	lsr r17
1649
	andi r19, 0x0F
1650
	lsl r19
1651
	lsl r19
1652
	lsl r19
1653
	lsl r19
1654
	cpi r21, 0x00
1655
	brne skip42
1656
	add r16, r17
1657
	sts chan4_tpwm, r16
1658
skip42:
1659
	sbrc r16, 7
1660
	com r16
1661
	mul r16, r19
1662
	mov r16, r1
1663
	lds r18, chan4_tdut
1664
	add r18, r16
1665
	sts chan4_dut, r18
1666
	
1667
	pop r1
1668
	pop r0
1669
	
1670
skip:
1671
	lds r16, tick_timer
1672
	inc r16
1673
	sts tick_timer, r16
1674
	
1675
	reti
1676
	
1677
handle_note:
1678
	lds r18, arp_timer
1679
	inc r18
1680
	mov r19, r18
1681
	lsr r19
1682
	lsr r19
1683
	lsr r19
1684
	lsr r19
1685
	lsr r19
1686
	andi r19, 0b11
1687
	cpi r19, 0b11
1688
	brne skip5
1689
	ldi r18, 0x0
1690
	
1691
skip5:
1692
	sts arp_timer, r18
1693
	
1694
	sbrc r19, 0
1695
	rjmp arp1
1696
	sbrc r19, 1
1697
	rjmp arp2
1698
	rjmp skip6
1699
1700
arp1:
1701
	andi r17, 0xF0
1702
	add r16, r17
1703
	brcc skip6
1704
	ldi r18, 0x41
1705
	add r16, r18
1706
	
1707
arp2:
1708
	lsl r17
1709
	lsl r17
1710
	lsl r17
1711
	lsl r17
1712
	add r16, r17
1713
	brcc skip6
1714
	ldi r18, 0x41
1715
	add r16, r18
1716
1717
skip6:
1718
	rjmp note_freq
1719
	
1720
note_freq:
1721
	mov r19, r16
1722
	lsr r16
1723
	lsr r16
1724
	lsr r16
1725
	lsr r16
1726
	cpi r16, 0x04
1727
	breq setc
1728
	cpi r16, 0x05
1729
	breq setcs
1730
	cpi r16, 0x06
1731
	breq setd
1732
	cpi r16, 0x07
1733
	breq setds
1734
	cpi r16, 0x08
1735
	breq sete
1736
	cpi r16, 0x09
1737
	breq setf
1738
	cpi r16, 0x0A
1739
	breq setfs
1740
	cpi r16, 0x0B
1741
	breq setg
1742
	cpi r16, 0x0C
1743
	breq setgs
1744
	cpi r16, 0x0D
1745
	breq seta
1746
	cpi r16, 0x0E
1747
	breq setas
1748
	cpi r16, 0x0F
1749
	breq setb
1750
	ret
1751
setc:
1752
	ldi r16, LOW(NOTE_C)
1753
	ldi r17, HIGH(NOTE_C)
1754
	rjmp skip4
1755
setcs:
1756
	ldi r16, LOW(NOTE_Cs)
1757
	ldi r17, HIGH(NOTE_Cs)
1758
	rjmp skip4
1759
setd:
1760
	ldi r16, LOW(NOTE_D)
1761
	ldi r17, HIGH(NOTE_D)
1762
	rjmp skip4
1763
setds:
1764
	ldi r16, LOW(NOTE_Ds)
1765
	ldi r17, HIGH(NOTE_Ds)
1766
	rjmp skip4
1767
sete:
1768
	ldi r16, LOW(NOTE_E)
1769
	ldi r17, HIGH(NOTE_E)
1770
	rjmp skip4
1771
setf:
1772
	ldi r16, LOW(NOTE_F)
1773
	ldi r17, HIGH(NOTE_F)
1774
	rjmp skip4
1775
setfs:
1776
	ldi r16, LOW(NOTE_Fs)
1777
	ldi r17, HIGH(NOTE_Fs)
1778
	rjmp skip4
1779
setg:
1780
	ldi r16, LOW(NOTE_G)
1781
	ldi r17, HIGH(NOTE_G)
1782
	rjmp skip4
1783
setgs:
1784
	ldi r16, LOW(NOTE_Gs)
1785
	ldi r17, HIGH(NOTE_Gs)
1786
	rjmp skip4
1787
seta:
1788
	ldi r16, LOW(NOTE_A)
1789
	ldi r17, HIGH(NOTE_A)
1790
	rjmp skip4
1791
setas:
1792
	ldi r16, LOW(NOTE_As)
1793
	ldi r17, HIGH(NOTE_As)
1794
	rjmp skip4
1795
setb:
1796
	ldi r16, LOW(NOTE_B)
1797
	ldi r17, HIGH(NOTE_B)
1798
	rjmp skip4
1799
skip4:
1800
	andi r19, 0x0F
1801
	cpi r19, 0x01
1802
	breq seto1
1803
	cpi r19, 0x02
1804
	breq seto2
1805
	cpi r19, 0x03
1806
	breq seto3
1807
	cpi r19, 0x04
1808
	breq seto4
1809
	cpi r19, 0x05
1810
	breq seto5
1811
	cpi r19, 0x06
1812
	breq seto6
1813
	cpi r19, 0x07
1814
	breq seto7
1815
	cpi r19, 0x08
1816
	breq seto8
1817
	ret
1818
seto1:
1819
	lsr r17
1820
	ror r16
1821
	lsr r17
1822
	ror r16
1823
	lsr r17
1824
	ror r16
1825
	ret
1826
seto2:
1827
	lsr r17
1828
	ror r16
1829
	lsr r17
1830
	ror r16
1831
	ret
1832
seto3:
1833
	lsr r17
1834
	ror r16
1835
	ret
1836
seto4:
1837
	ret
1838
seto5:
1839
	lsl r16
1840
	rol r17
1841
	ret
1842
seto6:
1843
	lsl r16
1844
	rol r17
1845
	lsl r16
1846
	rol r17
1847
	ret
1848
seto7:
1849
	lsl r16
1850
	rol r17
1851
	lsl r16
1852
	rol r17
1853
	lsl r16
1854
	rol r17
1855
	ret
1856
seto8:
1857
	lsl r16
1858
	rol r17
1859
	lsl r16
1860
	rol r17
1861
	lsl r16
1862
	rol r17
1863
	lsl r16
1864
	rol r17
1865
	ret
1866
	
1867
generate:
1868
	clr r17
1869
	cpi r18, 0b00
1870
	breq gen_pulse
1871
	cpi r18, 0b01
1872
	breq gen_triangle
1873
	cpi r18, 0b10
1874
	breq gen_saw
1875
	cpi r18, 0b11
1876
	breq gen_noise
1877
	ret
1878
	
1879
gen_pulse:
1880
	cp r19, r21
1881
	brlo return
1882
	mov r17, r20
1883
	lsr r17
1884
	lsr r17
1885
return:
1886
	ret
1887
	
1888
gen_triangle:
1889
	mov r17, r19
1890
	sbrc r19, 7
1891
	com r17
1892
	rjmp apply_volume
1893
	ret
1894
	
1895
gen_saw:
1896
	mov r17, r19
1897
	lsr r17
1898
	lsr r17
1899
	rjmp apply_volume
1900
	ret
1901
	
1902
gen_noise:
1903
	clr r21
1904
	clr r19
1905
	sbrc NOISEH, 6
1906
	ser r21
1907
	sbrc NOISEL, 3
1908
	ser r19
1909
	eor r19, r21
1910
	clr r21
1911
	lsl NOISEH
1912
	lsl NOISEL
1913
	adc NOISEH, r21
1914
	sbrc r19, 0
1915
	inc NOISEL
1916
	mov r17, NOISEL
1917
	lsr r17
1918
	rjmp apply_volume
1919
	ret
1920
	
1921
apply_volume:
1922
	push r0
1923
	push r1
1924
	
1925
	mul r17, r20
1926
	mov r17, r1
1927
	
1928
	pop r1
1929
	pop r0
1930
	
1931
	ret
1932
1933
.dseg
1934
chan1_vol: .byte 1
1935
chan2_vol: .byte 1
1936
chan3_vol: .byte 1
1937
chan4_vol: .byte 1
1938
1939
chan1_dut: .byte 1
1940
chan2_dut: .byte 1
1941
chan3_dut: .byte 1
1942
chan4_dut: .byte 1
1943
1944
waveform: .byte 1
1945
enable: .byte 1
1946
1947
tick_timer: .byte 1
1948
arp_timer: .byte 1
1949
slide_timer: .byte 1
1950
vibrato_timer: .byte 1
1951
1952
note_on: .byte 1
1953
1954
; 0 - 3: note
1955
; 4 - 7: octave
1956
; 8 - 11: arp 1
1957
; 12 - 15: arp 2
1958
chan1_notes: .byte 2
1959
chan2_notes: .byte 2
1960
chan3_notes: .byte 2
1961
chan4_notes: .byte 2
1962
1963
chan1_tpit: .byte 2
1964
chan2_tpit: .byte 2
1965
chan3_tpit: .byte 2
1966
chan4_tpit: .byte 2
1967
1968
chan1_tvol: .byte 1
1969
chan2_tvol: .byte 1
1970
chan3_tvol: .byte 1
1971
chan4_tvol: .byte 1
1972
1973
chan1_tdut: .byte 1
1974
chan2_tdut: .byte 1
1975
chan3_tdut: .byte 1
1976
chan4_tdut: .byte 1
1977
1978
; 0 - down
1979
; 1 - up
1980
vol_slide_dir: .byte 1
1981
pit_slide_dir: .byte 1
1982
1983
chan1_vol_slide: .byte 1
1984
chan2_vol_slide: .byte 1
1985
chan3_vol_slide: .byte 1
1986
chan4_vol_slide: .byte 1
1987
1988
chan1_pit_slide: .byte 1
1989
chan2_pit_slide: .byte 1
1990
chan3_pit_slide: .byte 1
1991
chan4_pit_slide: .byte 1
1992
1993
chan1_port: .byte 1
1994
chan2_port: .byte 1
1995
chan3_port: .byte 1
1996
chan4_port: .byte 1
1997
1998
; 0 - 3: rate
1999
; 4 - 7: depth
2000
chan1_vib: .byte 1
2001
chan2_vib: .byte 1
2002
chan3_vib: .byte 1
2003
chan4_vib: .byte 1
2004
2005
chan1_trm: .byte 1
2006
chan2_trm: .byte 1
2007
chan3_trm: .byte 1
2008
chan4_trm: .byte 1
2009
2010
chan1_pwm: .byte 1
2011
chan2_pwm: .byte 1
2012
chan3_pwm: .byte 1
2013
chan4_pwm: .byte 1
2014
2015
chan1_pvib: .byte 2
2016
chan2_pvib: .byte 2
2017
chan3_pvib: .byte 2
2018
chan4_pvib: .byte 2
2019
2020
chan1_ptrm: .byte 2
2021
chan2_ptrm: .byte 2
2022
chan3_ptrm: .byte 2
2023
chan4_ptrm: .byte 2
2024
2025
chan1_tvib: .byte 1
2026
chan2_tvib: .byte 1
2027
chan3_tvib: .byte 1
2028
chan4_tvib: .byte 1
2029
2030
chan1_ttrm: .byte 1
2031
chan2_ttrm: .byte 1
2032
chan3_ttrm: .byte 1
2033
chan4_ttrm: .byte 1
2034
2035
chan1_tpwm: .byte 1
2036
chan2_tpwm: .byte 1
2037
chan3_tpwm: .byte 1
2038
chan4_tpwm: .byte 1
2039
2040
; 0 - 3: attack
2041
; 4 - 7: decay
2042
; 8 - 11: sustain
2043
; 12 - 15: release
2044
chan1_env: .byte 2
2045
chan2_env: .byte 2
2046
chan3_env: .byte 2
2047
chan4_env: .byte 2
2048
2049
chan1_fine: .byte 1
2050
chan2_fine: .byte 1
2051
chan3_fine: .byte 1
2052
chan4_fine: .byte 1