Advertisement
MegaLoler

New Sound Chip

May 4th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.    
  123.     ldi r16, 0b0000
  124.     sts note_on, r16
  125.    
  126.     ;ldi r16, 0b00100000
  127.     ;ldi r17, 0b10000010
  128.     ;rcall command
  129.     ;ldi r16, 0b00100010
  130.     ;ldi r17, 0b11111110
  131.     ;rcall command
  132.     ;ldi r16, 0b01011100
  133.     ;ldi r17, 0b11111110
  134.     ;rcall command
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement