Advertisement
MegaLoler

New Sound Chip

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