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