Advertisement
MegaLoler

New Sound Chip

May 4th, 2013
74
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, 0x00
  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.     sei
  123.    
  124. loop:
  125.     rjmp loop
  126.  
  127. timer:
  128.     mov r16, LEFT_BUF
  129.     lsr r16
  130.     lsr r16
  131.    
  132.     mov r17, RIGHT_BUF
  133.     lsr r17
  134.     lsr r17
  135.    
  136.     out portd, r16
  137.     out portc, r17
  138.    
  139.     clr LEFT_BUF
  140.     clr RIGHT_BUF
  141.    
  142.     add CHAN1_OSCL, CHAN1_FRQL
  143.     adc CHAN1_OSCH, CHAN1_FRQH
  144.     add CHAN2_OSCL, CHAN2_FRQL
  145.     adc CHAN2_OSCH, CHAN2_FRQH
  146.     add CHAN3_OSCL, CHAN3_FRQL
  147.     adc CHAN3_OSCH, CHAN3_FRQH
  148.     add CHAN4_OSCL, CHAN4_FRQL
  149.     adc CHAN4_OSCH, CHAN4_FRQH
  150.    
  151.     lds r16, waveform
  152.     lds r22, enable
  153.    
  154.     mov r18, r16
  155.     andi r18, 0b00000011
  156.     mov r19, CHAN1_OSCH
  157.     lds r20, chan1_vol
  158.     lds r21, chan1_dut
  159.     rcall generate
  160.     sbrc r22, 0
  161.     add LEFT_BUF, r17
  162.    
  163.     lsr r16
  164.     lsr r16
  165.     mov r18, r16
  166.     andi r18, 0b00000011
  167.     mov r19, CHAN2_OSCH
  168.     lds r20, chan2_vol
  169.     lds r21, chan2_dut
  170.     rcall generate
  171.     sbrc r22, 1
  172.     add LEFT_BUF, r17
  173.    
  174.     lsr r16
  175.     lsr r16
  176.     mov r18, r16
  177.     andi r18, 0b00000011
  178.     mov r19, CHAN3_OSCH
  179.     lds r20, chan3_vol
  180.     lds r21, chan3_dut
  181.     rcall generate
  182.     sbrc r22, 2
  183.     add RIGHT_BUF, r17
  184.    
  185.     lsr r16
  186.     lsr r16
  187.     mov r18, r16
  188.     andi r18, 0b00000011
  189.     mov r19, CHAN4_OSCH
  190.     lds r20, chan4_vol
  191.     lds r21, chan4_dut
  192.     rcall generate
  193.     sbrc r22, 3
  194.     add RIGHT_BUF, r17
  195.    
  196.     lds r16, tick_timer
  197.     cpi r16, 0x00
  198.     brne skip22
  199.    
  200.     lds r20, vol_slide_dir
  201.    
  202.     lds r16, chan1_tvol
  203.     lds r17, chan1_vol_slide
  204.     sbrc r20, 0
  205.     rjmp up1b
  206.     sbc r16, r17
  207.     brcc down1b
  208.     clr r16
  209. up1b:
  210.     add r16, r17
  211.     brcc down1b
  212.     ser r16
  213. down1b:
  214.     sts chan1_tvol, r16
  215.     sts chan1_ptrm, r16
  216.    
  217.     lds r16, chan2_tvol
  218.     lds r17, chan2_vol_slide
  219.     sbrc r20, 1
  220.     rjmp up2b
  221.     sbc r16, r17
  222.     brcc down2b
  223.     clr r16
  224. up2b:
  225.     add r16, r17
  226.     brcc down2b
  227.     ser r16
  228. down2b:
  229.     sts chan2_tvol, r16
  230.     sts chan2_ptrm, r16
  231.  
  232.     rjmp skip23
  233. skip22:
  234.     rjmp skip2
  235. skip23:
  236.    
  237.     lds r16, chan3_tvol
  238.     lds r17, chan3_vol_slide
  239.     sbrc r20, 2
  240.     rjmp up3b
  241.     sbc r16, r17
  242.     brcc down3b
  243.     clr r16
  244. up3b:
  245.     add r16, r17
  246.     brcc down3b
  247.     ser r16
  248. down3b:
  249.     sts chan3_tvol, r16
  250.     sts chan3_ptrm, r16
  251.    
  252.     lds r16, chan4_tvol
  253.     lds r17, chan4_vol_slide
  254.     sbrc r20, 3
  255.     rjmp up4b
  256.     sbc r16, r17
  257.     brcc down4b
  258.     clr r16
  259. up4b:
  260.     add r16, r17
  261.     brcc down4b
  262.     ser r16
  263. down4b:
  264.     sts chan4_tvol, r16
  265.     sts chan4_ptrm, r16
  266.  
  267.     rjmp skip3
  268.    
  269. skip2:
  270.     rjmp skip
  271.    
  272. skip3:
  273.     lds r16, note_on
  274.     lds r17, chan1_notes + 1
  275.     cpi r17, 0x00
  276.     breq skip11
  277.     ori r16, 0b0001
  278.    
  279. skip11:
  280.     sbrs r16, 0
  281.     rjmp skip7
  282.     andi r16, 0b1110
  283.     sts note_on, r16
  284.  
  285.     lds r16, chan1_notes
  286.     lds r17, chan1_notes + 1
  287.     rcall handle_note
  288.     sts chan1_tpit, r16
  289.     sts chan1_tpit + 1, r17
  290.  
  291. skip7:
  292.     lds r16, note_on
  293.     lds r17, chan2_notes + 1
  294.     cpi r17, 0x00
  295.     breq skip12
  296.     ori r16, 0b0010
  297.    
  298. skip12:
  299.     sbrs r16, 1
  300.     rjmp skip8
  301.     andi r16, 0b1101
  302.     sts note_on, r16
  303.  
  304.     lds r16, chan2_notes
  305.     lds r17, chan2_notes + 1
  306.     rcall handle_note
  307.     sts chan2_tpit, r16
  308.     sts chan2_tpit + 1, r17
  309.    
  310. skip8:
  311.     lds r16, note_on
  312.     lds r17, chan3_notes + 1
  313.     cpi r17, 0x00
  314.     breq skip13
  315.     ori r16, 0b0100
  316.    
  317. skip13:
  318.     sbrs r16, 2
  319.     rjmp skip9
  320.     andi r16, 0b1011
  321.     sts note_on, r16
  322.  
  323.     lds r16, chan3_notes
  324.     lds r17, chan3_notes + 1
  325.     rcall handle_note
  326.     sts chan3_tpit, r16
  327.     sts chan3_tpit + 1, r17
  328.    
  329. skip9:
  330.     lds r16, note_on
  331.     lds r17, chan4_notes + 1
  332.     cpi r17, 0x00
  333.     breq skip14
  334.     ori r16, 0b1000
  335.    
  336. skip14:
  337.     sbrs r16, 3
  338.     rjmp skip10
  339.     andi r16, 0b0111
  340.     sts note_on, r16
  341.  
  342.     lds r16, chan4_notes
  343.     lds r17, chan4_notes + 1
  344.     rcall handle_note
  345.     sts chan4_tpit, r16
  346.     sts chan4_tpit + 1, r17
  347.    
  348. skip10:
  349.     lds CHAN1_FRQL, chan1_pvib
  350.     lds CHAN1_FRQH, chan1_pvib + 1
  351.     lds CHAN2_FRQL, chan2_pvib
  352.     lds CHAN2_FRQH, chan2_pvib + 1
  353.     lds CHAN3_FRQL, chan3_pvib
  354.     lds CHAN3_FRQH, chan3_pvib + 1
  355.     lds CHAN4_FRQL, chan4_pvib
  356.     lds CHAN4_FRQH, chan4_pvib + 1
  357.    
  358.     lds r21, slide_timer
  359.     inc r21
  360.     cpi r21, 0x4
  361.     brne skip15
  362.     clr r21
  363. skip15:
  364.     sts slide_timer, r21
  365.     cpi r21, 0x00
  366.     brne skip16
  367.     ser r21
  368.     rjmp skip17
  369. skip16:
  370.     clr r21
  371. skip17:
  372.     lds r20, pit_slide_dir
  373.    
  374.     lds r16, chan1_tpit
  375.     lds r17, chan1_tpit + 1
  376.     sbrs r21, 0
  377.     rjmp skip18
  378.     lds r18, chan1_pit_slide
  379.     ldi r19, 0x00
  380.     sbrc r20, 0
  381.     rjmp up1
  382.     cpi r17, 0x00
  383.     brne down1a
  384.     cpi r16, 0x00
  385.     breq down1
  386. down1a:
  387.     sbc r16, r18
  388.     brcc down1
  389.     dec r17
  390.     rjmp down1
  391. up1:
  392.     add r16, r18
  393.     adc r17, r19
  394. down1:
  395.     sts chan1_tpit, r16
  396.     sts chan1_tpit + 1, r17
  397. skip18:
  398.     sbrs r21, 0
  399.     rjmp port1
  400.     lds r18, chan1_port
  401.     cpi r18, 0x00
  402.     breq skip_port1
  403.     cp CHAN1_FRQH, r17
  404.     brlo higher1
  405.     cp r17, CHAN1_FRQH
  406.     brlo lower1
  407.     cp CHAN1_FRQL, r16
  408.     brlo higher1
  409.     cp r16, CHAN1_FRQL
  410.     brlo lower1
  411.     rjmp skip_port1
  412. higher1:
  413.     ldi r19, 0x00
  414.     add CHAN1_FRQL, r18
  415.     adc CHAN1_FRQH, r19
  416.     cp r17, CHAN1_FRQH
  417.     brlo skip_port1
  418.     cp CHAN1_FRQH, r17
  419.     brlo port1
  420.     cp r16, CHAN1_FRQL
  421.     brlo skip_port1
  422.     rjmp port1
  423. lower1:
  424.     clc
  425.     sbc CHAN1_FRQL, r18
  426.     brcc lower1a
  427.     dec CHAN1_FRQH
  428. lower1a:
  429.     cp CHAN1_FRQH, r17
  430.     brlo skip_port1
  431.     cp r17, CHAN1_FRQH
  432.     brlo port1
  433.     cp CHAN1_FRQL, r16
  434.     brlo skip_port1
  435.     rjmp port1
  436. skip_port1:
  437.     mov CHAN1_FRQL, r16
  438.     mov CHAN1_FRQH, r17
  439. port1:
  440.    
  441.     lds r16, chan2_tpit
  442.     lds r17, chan2_tpit + 1
  443.     sbrs r21, 0
  444.     rjmp skip19
  445.     lds r18, chan2_pit_slide
  446.     ldi r19, 0x00
  447.     sbrc r20, 1
  448.     rjmp up2
  449.     cpi r17, 0x00
  450.     brne down2a
  451.     cpi r16, 0x00
  452.     breq down2
  453. down2a:
  454.     sbc r16, r18
  455.     brcc down2
  456.     dec r17
  457.     rjmp down2
  458. up2:
  459.     add r16, r18
  460.     adc r17, r19
  461. down2:
  462.     sts chan2_tpit, r16
  463.     sts chan2_tpit + 1, r17
  464. skip19:
  465.     sbrs r21, 0
  466.     rjmp port2
  467.     lds r18, chan2_port
  468.     cpi r18, 0x00
  469.     breq skip_port2
  470.     cp CHAN2_FRQH, r17
  471.     brlo higher2
  472.     cp r17, CHAN2_FRQH
  473.     brlo lower2
  474.     cp CHAN2_FRQL, r16
  475.     brlo higher2
  476.     cp r16, CHAN2_FRQL
  477.     brlo lower2
  478.     rjmp skip_port2
  479. higher2:
  480.     ldi r19, 0x00
  481.     add CHAN2_FRQL, r18
  482.     adc CHAN2_FRQH, r19
  483.     cp r17, CHAN2_FRQH
  484.     brlo skip_port2
  485.     cp CHAN2_FRQH, r17
  486.     brlo port2
  487.     cp r16, CHAN2_FRQL
  488.     brlo skip_port2
  489.     rjmp port2
  490. lower2:
  491.     clc
  492.     sbc CHAN2_FRQL, r18
  493.     brcc lower2a
  494.     dec CHAN2_FRQH
  495. lower2a:
  496.     cp CHAN2_FRQH, r17
  497.     brlo skip_port2
  498.     cp r17, CHAN2_FRQH
  499.     brlo port2
  500.     cp CHAN2_FRQL, r16
  501.     brlo skip_port2
  502.     rjmp port2
  503. skip_port2:
  504.     mov CHAN2_FRQL, r16
  505.     mov CHAN2_FRQH, r17
  506. port2:
  507.    
  508.     lds r16, chan3_tpit
  509.     lds r17, chan3_tpit + 1
  510.     sbrs r21, 0
  511.     rjmp skip20
  512.     lds r18, chan3_pit_slide
  513.     ldi r19, 0x00
  514.     sbrc r20, 2
  515.     rjmp up3
  516.     cpi r17, 0x00
  517.     brne down3a
  518.     cpi r16, 0x00
  519.     breq down3
  520. down3a:
  521.     sbc r16, r18
  522.     brcc down3
  523.     dec r17
  524.     rjmp down3
  525. up3:
  526.     add r16, r18
  527.     adc r17, r19
  528. down3:
  529.     sts chan3_tpit, r16
  530.     sts chan3_tpit + 1, r17
  531. skip20:
  532.     sbrs r21, 0
  533.     rjmp port3
  534.     lds r18, chan3_port
  535.     cpi r18, 0x00
  536.     breq skip_port3
  537.     cp CHAN3_FRQH, r17
  538.     brlo higher3
  539.     cp r17, CHAN3_FRQH
  540.     brlo lower3
  541.     cp CHAN3_FRQL, r16
  542.     brlo higher3
  543.     cp r16, CHAN3_FRQL
  544.     brlo lower3
  545.     rjmp skip_port3
  546. higher3:
  547.     ldi r19, 0x00
  548.     add CHAN3_FRQL, r18
  549.     adc CHAN3_FRQH, r19
  550.     cp r17, CHAN3_FRQH
  551.     brlo skip_port3
  552.     cp CHAN3_FRQH, r17
  553.     brlo port3
  554.     cp r16, CHAN3_FRQL
  555.     brlo skip_port3
  556.     rjmp port3
  557. lower3:
  558.     clc
  559.     sbc CHAN3_FRQL, r18
  560.     brcc lower3a
  561.     dec CHAN3_FRQH
  562. lower3a:
  563.     cp CHAN3_FRQH, r17
  564.     brlo skip_port3
  565.     cp r17, CHAN3_FRQH
  566.     brlo port3
  567.     cp CHAN3_FRQL, r16
  568.     brlo skip_port3
  569.     rjmp port3
  570. skip_port3:
  571.     mov CHAN3_FRQL, r16
  572.     mov CHAN3_FRQH, r17
  573. port3:
  574.    
  575.     lds r16, chan4_tpit
  576.     lds r17, chan4_tpit + 1
  577.     sbrs r21, 0
  578.     rjmp skip21
  579.     lds r18, chan4_pit_slide
  580.     ldi r19, 0x00
  581.     sbrc r20, 3
  582.     rjmp up4
  583.     cpi r17, 0x00
  584.     brne down4a
  585.     cpi r16, 0x00
  586.     breq down4
  587. down4a:
  588.     sbc r16, r18
  589.     brcc down4
  590.     dec r17
  591.     rjmp down4
  592. up4:
  593.     add r16, r18
  594.     adc r17, r19
  595. down4:
  596.     sts chan4_tpit, r16
  597.     sts chan4_tpit + 1, r17
  598. skip21:
  599.     sbrs r21, 0
  600.     rjmp port4
  601.     lds r18, chan4_port
  602.     cpi r18, 0x00
  603.     breq skip_port4
  604.     cp CHAN4_FRQH, r17
  605.     brlo higher4
  606.     cp r17, CHAN4_FRQH
  607.     brlo lower4
  608.     cp CHAN4_FRQL, r16
  609.     brlo higher4
  610.     cp r16, CHAN4_FRQL
  611.     brlo lower4
  612.     rjmp skip_port4
  613. higher4:
  614.     ldi r19, 0x00
  615.     add CHAN4_FRQL, r18
  616.     adc CHAN4_FRQH, r19
  617.     cp r17, CHAN4_FRQH
  618.     brlo skip_port4
  619.     cp CHAN4_FRQH, r17
  620.     brlo port4
  621.     cp r16, CHAN4_FRQL
  622.     brlo skip_port4
  623.     rjmp port4
  624. lower4:
  625.     clc
  626.     sbc CHAN4_FRQL, r18
  627.     brcc lower4a
  628.     dec CHAN4_FRQH
  629. lower4a:
  630.     cp CHAN4_FRQH, r17
  631.     brlo skip_port4
  632.     cp r17, CHAN4_FRQH
  633.     brlo port4
  634.     cp CHAN4_FRQL, r16
  635.     brlo skip_port4
  636.     rjmp port4
  637. skip_port4:
  638.     mov CHAN4_FRQL, r16
  639.     mov CHAN4_FRQH, r17
  640. port4:
  641.     sts chan1_pvib, CHAN1_FRQL
  642.     sts chan1_pvib + 1, CHAN1_FRQH
  643.     sts chan2_pvib, CHAN2_FRQL
  644.     sts chan2_pvib + 1, CHAN2_FRQH
  645.     sts chan3_pvib, CHAN3_FRQL
  646.     sts chan3_pvib + 1, CHAN3_FRQH
  647.     sts chan4_pvib, CHAN4_FRQL
  648.     sts chan4_pvib + 1, CHAN4_FRQH
  649.    
  650.     lds r21, vibrato_timer
  651.     inc r21
  652.     cpi r21, 0x8
  653.     brne skip27
  654.     clr r21
  655. skip27:
  656.     sts vibrato_timer, r21
  657.    
  658.     push r0
  659.     push r1
  660.    
  661.     lds r16, chan1_tvib
  662.     lds r17, chan1_vib
  663.     mov r19, r17
  664.     andi r17, 0xF0
  665.     lsr r17
  666.     andi r19, 0x0F
  667.    
  668.     cpi r21, 0x00
  669.     brne skip26
  670.    
  671.     add r16, r17
  672.     sts chan1_tvib, r16
  673. skip26:
  674.     sbrc r16, 7
  675.     com r16
  676.     lsr r16
  677.     lsr r16
  678.     lsr r16
  679.     mul r16, r19
  680.     mov r16, r0
  681.     lsr r16
  682.     lsr r16
  683.     lsr r16
  684.     ldi r19, 0x00
  685.     lds r18, chan1_fine
  686.     add r16, r18
  687.     add CHAN1_FRQL, r16
  688.     adc CHAN1_FRQH, r19
  689.    
  690.     lds r16, chan2_tvib
  691.     lds r17, chan2_vib
  692.     mov r19, r17
  693.     andi r17, 0xF0
  694.     lsr r17
  695.     andi r19, 0x0F
  696.    
  697.     cpi r21, 0x00
  698.     brne skip30
  699.    
  700.     add r16, r17
  701.     sts chan2_tvib, r16
  702. skip30:
  703.     sbrc r16, 7
  704.     com r16
  705.     lsr r16
  706.     lsr r16
  707.     lsr r16
  708.     mul r16, r19
  709.     mov r16, r0
  710.     lsr r16
  711.     lsr r16
  712.     lsr r16
  713.     ldi r19, 0x00
  714.     lds r18, chan2_fine
  715.     add r16, r18
  716.     add CHAN2_FRQL, r16
  717.     adc CHAN2_FRQH, r19
  718.    
  719.     lds r16, chan3_tvib
  720.     lds r17, chan3_vib
  721.     mov r19, r17
  722.     andi r17, 0xF0
  723.     lsr r17
  724.     andi r19, 0x0F
  725.    
  726.     cpi r21, 0x00
  727.     brne skip28
  728.    
  729.     add r16, r17
  730.     sts chan3_tvib, r16
  731. skip28:
  732.     sbrc r16, 7
  733.     com r16
  734.     lsr r16
  735.     lsr r16
  736.     lsr r16
  737.     mul r16, r19
  738.     mov r16, r0
  739.     lsr r16
  740.     lsr r16
  741.     lsr r16
  742.     ldi r19, 0x00
  743.     lds r18, chan3_fine
  744.     add r16, r18
  745.     add CHAN3_FRQL, r16
  746.     adc CHAN3_FRQH, r19
  747.    
  748.     lds r16, chan4_tvib
  749.     lds r17, chan4_vib
  750.     mov r19, r17
  751.     andi r17, 0xF0
  752.     lsr r17
  753.     andi r19, 0x0F
  754.    
  755.     cpi r21, 0x00
  756.     brne skip29
  757.    
  758.     add r16, r17
  759.     sts chan4_tvib, r16
  760. skip29:
  761.     sbrc r16, 7
  762.     com r16
  763.     lsr r16
  764.     lsr r16
  765.     lsr r16
  766.     mul r16, r19
  767.     mov r16, r0
  768.     lsr r16
  769.     lsr r16
  770.     lsr r16
  771.     ldi r19, 0x00
  772.     lds r18, chan4_fine
  773.     add r16, r18
  774.     add CHAN4_FRQL, r16
  775.     adc CHAN4_FRQH, r19
  776.    
  777.     lds r16, chan1_ttrm
  778.     lds r17, chan1_trm
  779.     mov r19, r17
  780.     andi r17, 0xF0
  781.     lsr r17
  782.     andi r19, 0x0F
  783.     lsl r19
  784.     lsl r19
  785.     lsl r19
  786.     lsl r19
  787.     cpi r21, 0x00
  788.     brne skip31
  789.     add r16, r17
  790.     sts chan1_ttrm, r16
  791. skip31:
  792.     sbrc r16, 7
  793.     com r16
  794.     lsl r16
  795.     mul r16, r19
  796.     mov r16, r1
  797.     lds r18, chan1_ptrm
  798.     clc
  799.     sbc r18, r16
  800.     brcc skip32
  801.     clr r18
  802. skip32:
  803.     sts chan1_vol, r18
  804.    
  805.     lds r16, chan2_ttrm
  806.     lds r17, chan2_trm
  807.     mov r19, r17
  808.     andi r17, 0xF0
  809.     lsr r17
  810.     andi r19, 0x0F
  811.     lsl r19
  812.     lsl r19
  813.     lsl r19
  814.     lsl r19
  815.     cpi r21, 0x00
  816.     brne skip33
  817.     add r16, r17
  818.     sts chan2_ttrm, r16
  819. skip33:
  820.     sbrc r16, 7
  821.     com r16
  822.     lsl r16
  823.     mul r16, r19
  824.     mov r16, r1
  825.     lds r18, chan2_ptrm
  826.     clc
  827.     sbc r18, r16
  828.     brcc skip34
  829.     clr r18
  830. skip34:
  831.     sts chan2_vol, r18
  832.    
  833.     lds r16, chan3_ttrm
  834.     lds r17, chan3_trm
  835.     mov r19, r17
  836.     andi r17, 0xF0
  837.     lsr r17
  838.     andi r19, 0x0F
  839.     lsl r19
  840.     lsl r19
  841.     lsl r19
  842.     lsl r19
  843.     cpi r21, 0x00
  844.     brne skip38
  845.     add r16, r17
  846.     sts chan3_ttrm, r16
  847. skip38:
  848.     sbrc r16, 7
  849.     com r16
  850.     lsl r16
  851.     mul r16, r19
  852.     mov r16, r1
  853.     lds r18, chan3_ptrm
  854.     clc
  855.     sbc r18, r16
  856.     brcc skip35
  857.     clr r18
  858. skip35:
  859.     sts chan3_vol, r18
  860.    
  861.     lds r16, chan4_ttrm
  862.     lds r17, chan4_trm
  863.     mov r19, r17
  864.     andi r17, 0xF0
  865.     lsr r17
  866.     andi r19, 0x0F
  867.     lsl r19
  868.     lsl r19
  869.     lsl r19
  870.     lsl r19
  871.     cpi r21, 0x00
  872.     brne skip36
  873.     add r16, r17
  874.     sts chan4_ttrm, r16
  875. skip36:
  876.     sbrc r16, 7
  877.     com r16
  878.     lsl r16
  879.     mul r16, r19
  880.     mov r16, r1
  881.     lds r18, chan4_ptrm
  882.     clc
  883.     sbc r18, r16
  884.     brcc skip37
  885.     clr r18
  886. skip37:
  887.     sts chan4_vol, r18
  888.    
  889.     lds r16, chan1_tpwm
  890.     lds r17, chan1_pwm
  891.     mov r19, r17
  892.     andi r17, 0xF0
  893.     lsr r17
  894.     lsr r17
  895.     lsr r17
  896.     lsr r17
  897.     andi r19, 0x0F
  898.     lsl r19
  899.     lsl r19
  900.     lsl r19
  901.     lsl r19
  902.     cpi r21, 0x00
  903.     brne skip39
  904.     add r16, r17
  905.     sts chan1_tpwm, r16
  906. skip39:
  907.     sbrc r16, 7
  908.     com r16
  909.     mul r16, r19
  910.     mov r16, r1
  911.     lds r18, chan1_tdut
  912.     add r18, r16
  913.     sts chan1_dut, r18
  914.    
  915.     lds r16, chan2_tpwm
  916.     lds r17, chan2_pwm
  917.     mov r19, r17
  918.     andi r17, 0xF0
  919.     lsr r17
  920.     lsr r17
  921.     lsr r17
  922.     lsr r17
  923.     andi r19, 0x0F
  924.     lsl r19
  925.     lsl r19
  926.     lsl r19
  927.     lsl r19
  928.     cpi r21, 0x00
  929.     brne skip40
  930.     add r16, r17
  931.     sts chan2_tpwm, r16
  932. skip40:
  933.     sbrc r16, 7
  934.     com r16
  935.     mul r16, r19
  936.     mov r16, r1
  937.     lds r18, chan2_tdut
  938.     add r18, r16
  939.     sts chan2_dut, r18
  940.    
  941.     lds r16, chan3_tpwm
  942.     lds r17, chan3_pwm
  943.     mov r19, r17
  944.     andi r17, 0xF0
  945.     lsr r17
  946.     lsr r17
  947.     lsr r17
  948.     lsr r17
  949.     andi r19, 0x0F
  950.     lsl r19
  951.     lsl r19
  952.     lsl r19
  953.     lsl r19
  954.     cpi r21, 0x00
  955.     brne skip41
  956.     add r16, r17
  957.     sts chan3_tpwm, r16
  958. skip41:
  959.     sbrc r16, 7
  960.     com r16
  961.     mul r16, r19
  962.     mov r16, r1
  963.     lds r18, chan3_tdut
  964.     add r18, r16
  965.     sts chan3_dut, r18
  966.    
  967.     lds r16, chan4_tpwm
  968.     lds r17, chan4_pwm
  969.     mov r19, r17
  970.     andi r17, 0xF0
  971.     lsr r17
  972.     lsr r17
  973.     lsr r17
  974.     lsr r17
  975.     andi r19, 0x0F
  976.     lsl r19
  977.     lsl r19
  978.     lsl r19
  979.     lsl r19
  980.     cpi r21, 0x00
  981.     brne skip42
  982.     add r16, r17
  983.     sts chan4_tpwm, r16
  984. skip42:
  985.     sbrc r16, 7
  986.     com r16
  987.     mul r16, r19
  988.     mov r16, r1
  989.     lds r18, chan4_tdut
  990.     add r18, r16
  991.     sts chan4_dut, r18
  992.    
  993.     pop r1
  994.     pop r0
  995.    
  996. skip:
  997.     lds r16, tick_timer
  998.     inc r16
  999.     sts tick_timer, r16
  1000.    
  1001.     reti
  1002.    
  1003. handle_note:
  1004.     lds r18, arp_timer
  1005.     inc r18
  1006.     mov r19, r18
  1007.     lsr r19
  1008.     lsr r19
  1009.     lsr r19
  1010.     lsr r19
  1011.     lsr r19
  1012.     andi r19, 0b11
  1013.     cpi r19, 0b11
  1014.     brne skip5
  1015.     ldi r18, 0x0
  1016.    
  1017. skip5:
  1018.     sts arp_timer, r18
  1019.    
  1020.     sbrc r19, 0
  1021.     rjmp arp1
  1022.     sbrc r19, 1
  1023.     rjmp arp2
  1024.     rjmp skip6
  1025.  
  1026. arp1:
  1027.     andi r17, 0xF0
  1028.     add r16, r17
  1029.     brcc skip6
  1030.     ldi r18, 0x41
  1031.     add r16, r18
  1032.    
  1033. arp2:
  1034.     lsl r17
  1035.     lsl r17
  1036.     lsl r17
  1037.     lsl r17
  1038.     add r16, r17
  1039.     brcc skip6
  1040.     ldi r18, 0x41
  1041.     add r16, r18
  1042.  
  1043. skip6:
  1044.     rjmp note_freq
  1045.    
  1046. note_freq:
  1047.     mov r19, r16
  1048.     lsr r16
  1049.     lsr r16
  1050.     lsr r16
  1051.     lsr r16
  1052.     cpi r16, 0x04
  1053.     breq setc
  1054.     cpi r16, 0x05
  1055.     breq setcs
  1056.     cpi r16, 0x06
  1057.     breq setd
  1058.     cpi r16, 0x07
  1059.     breq setds
  1060.     cpi r16, 0x08
  1061.     breq sete
  1062.     cpi r16, 0x09
  1063.     breq setf
  1064.     cpi r16, 0x0A
  1065.     breq setfs
  1066.     cpi r16, 0x0B
  1067.     breq setg
  1068.     cpi r16, 0x0C
  1069.     breq setgs
  1070.     cpi r16, 0x0D
  1071.     breq seta
  1072.     cpi r16, 0x0E
  1073.     breq setas
  1074.     cpi r16, 0x0F
  1075.     breq setb
  1076.     ret
  1077. setc:
  1078.     ldi r16, LOW(NOTE_C)
  1079.     ldi r17, HIGH(NOTE_C)
  1080.     rjmp skip4
  1081. setcs:
  1082.     ldi r16, LOW(NOTE_Cs)
  1083.     ldi r17, HIGH(NOTE_Cs)
  1084.     rjmp skip4
  1085. setd:
  1086.     ldi r16, LOW(NOTE_D)
  1087.     ldi r17, HIGH(NOTE_D)
  1088.     rjmp skip4
  1089. setds:
  1090.     ldi r16, LOW(NOTE_Ds)
  1091.     ldi r17, HIGH(NOTE_Ds)
  1092.     rjmp skip4
  1093. sete:
  1094.     ldi r16, LOW(NOTE_E)
  1095.     ldi r17, HIGH(NOTE_E)
  1096.     rjmp skip4
  1097. setf:
  1098.     ldi r16, LOW(NOTE_F)
  1099.     ldi r17, HIGH(NOTE_F)
  1100.     rjmp skip4
  1101. setfs:
  1102.     ldi r16, LOW(NOTE_Fs)
  1103.     ldi r17, HIGH(NOTE_Fs)
  1104.     rjmp skip4
  1105. setg:
  1106.     ldi r16, LOW(NOTE_G)
  1107.     ldi r17, HIGH(NOTE_G)
  1108.     rjmp skip4
  1109. setgs:
  1110.     ldi r16, LOW(NOTE_Gs)
  1111.     ldi r17, HIGH(NOTE_Gs)
  1112.     rjmp skip4
  1113. seta:
  1114.     ldi r16, LOW(NOTE_A)
  1115.     ldi r17, HIGH(NOTE_A)
  1116.     rjmp skip4
  1117. setas:
  1118.     ldi r16, LOW(NOTE_As)
  1119.     ldi r17, HIGH(NOTE_As)
  1120.     rjmp skip4
  1121. setb:
  1122.     ldi r16, LOW(NOTE_B)
  1123.     ldi r17, HIGH(NOTE_B)
  1124.     rjmp skip4
  1125. skip4:
  1126.     andi r19, 0x0F
  1127.     cpi r19, 0x01
  1128.     breq seto1
  1129.     cpi r19, 0x02
  1130.     breq seto2
  1131.     cpi r19, 0x03
  1132.     breq seto3
  1133.     cpi r19, 0x04
  1134.     breq seto4
  1135.     cpi r19, 0x05
  1136.     breq seto5
  1137.     cpi r19, 0x06
  1138.     breq seto6
  1139.     cpi r19, 0x07
  1140.     breq seto7
  1141.     cpi r19, 0x08
  1142.     breq seto8
  1143.     ret
  1144. seto1:
  1145.     lsr r17
  1146.     ror r16
  1147.     lsr r17
  1148.     ror r16
  1149.     lsr r17
  1150.     ror r16
  1151.     ret
  1152. seto2:
  1153.     lsr r17
  1154.     ror r16
  1155.     lsr r17
  1156.     ror r16
  1157.     ret
  1158. seto3:
  1159.     lsr r17
  1160.     ror r16
  1161.     ret
  1162. seto4:
  1163.     ret
  1164. seto5:
  1165.     lsl r16
  1166.     rol r17
  1167.     ret
  1168. seto6:
  1169.     lsl r16
  1170.     rol r17
  1171.     lsl r16
  1172.     rol r17
  1173.     ret
  1174. seto7:
  1175.     lsl r16
  1176.     rol r17
  1177.     lsl r16
  1178.     rol r17
  1179.     lsl r16
  1180.     rol r17
  1181.     ret
  1182. seto8:
  1183.     lsl r16
  1184.     rol r17
  1185.     lsl r16
  1186.     rol r17
  1187.     lsl r16
  1188.     rol r17
  1189.     lsl r16
  1190.     rol r17
  1191.     ret
  1192.    
  1193. generate:
  1194.     clr r17
  1195.     cpi r18, 0b00
  1196.     breq gen_pulse
  1197.     cpi r18, 0b01
  1198.     breq gen_triangle
  1199.     cpi r18, 0b10
  1200.     breq gen_saw
  1201.     cpi r18, 0b11
  1202.     breq gen_noise
  1203.     ret
  1204.    
  1205. gen_pulse:
  1206.     cp r19, r21
  1207.     brlo return
  1208.     mov r17, r20
  1209.     lsr r17
  1210.     lsr r17
  1211. return:
  1212.     ret
  1213.    
  1214. gen_triangle:
  1215.     mov r17, r19
  1216.     sbrc r19, 7
  1217.     com r17
  1218.     rjmp apply_volume
  1219.     ret
  1220.    
  1221. gen_saw:
  1222.     mov r17, r19
  1223.     lsr r17
  1224.     lsr r17
  1225.     rjmp apply_volume
  1226.     ret
  1227.    
  1228. gen_noise:
  1229.     clr r21
  1230.     clr r19
  1231.     sbrc NOISEH, 6
  1232.     ser r21
  1233.     sbrc NOISEL, 3
  1234.     ser r19
  1235.     eor r19, r21
  1236.     clr r21
  1237.     lsl NOISEH
  1238.     lsl NOISEL
  1239.     adc NOISEH, r21
  1240.     sbrc r19, 0
  1241.     inc NOISEL
  1242.     mov r17, NOISEL
  1243.     lsr r17
  1244.     rjmp apply_volume
  1245.     ret
  1246.    
  1247. apply_volume:
  1248.     push r0
  1249.     push r1
  1250.    
  1251.     mul r17, r20
  1252.     mov r17, r1
  1253.    
  1254.     pop r1
  1255.     pop r0
  1256.    
  1257.     ret
  1258.  
  1259. .dseg
  1260. chan1_vol: .byte 1
  1261. chan2_vol: .byte 1
  1262. chan3_vol: .byte 1
  1263. chan4_vol: .byte 1
  1264.  
  1265. chan1_dut: .byte 1
  1266. chan2_dut: .byte 1
  1267. chan3_dut: .byte 1
  1268. chan4_dut: .byte 1
  1269.  
  1270. waveform: .byte 1
  1271. enable: .byte 1
  1272.  
  1273. tick_timer: .byte 1
  1274. arp_timer: .byte 1
  1275. slide_timer: .byte 1
  1276. vibrato_timer: .byte 1
  1277.  
  1278. note_on: .byte 1
  1279.  
  1280. ; 0 - 3: note
  1281. ; 4 - 7: octave
  1282. ; 8 - 11: arp 1
  1283. ; 12 - 15: arp 2
  1284. chan1_notes: .byte 2
  1285. chan2_notes: .byte 2
  1286. chan3_notes: .byte 2
  1287. chan4_notes: .byte 2
  1288.  
  1289. chan1_tpit: .byte 2
  1290. chan2_tpit: .byte 2
  1291. chan3_tpit: .byte 2
  1292. chan4_tpit: .byte 2
  1293.  
  1294. chan1_tvol: .byte 1
  1295. chan2_tvol: .byte 1
  1296. chan3_tvol: .byte 1
  1297. chan4_tvol: .byte 1
  1298.  
  1299. chan1_tdut: .byte 1
  1300. chan2_tdut: .byte 1
  1301. chan3_tdut: .byte 1
  1302. chan4_tdut: .byte 1
  1303.  
  1304. ; 0 - down
  1305. ; 1 - up
  1306. vol_slide_dir: .byte 1
  1307. pit_slide_dir: .byte 1
  1308.  
  1309. chan1_vol_slide: .byte 1
  1310. chan2_vol_slide: .byte 1
  1311. chan3_vol_slide: .byte 1
  1312. chan4_vol_slide: .byte 1
  1313.  
  1314. chan1_pit_slide: .byte 1
  1315. chan2_pit_slide: .byte 1
  1316. chan3_pit_slide: .byte 1
  1317. chan4_pit_slide: .byte 1
  1318.  
  1319. chan1_port: .byte 1
  1320. chan2_port: .byte 1
  1321. chan3_port: .byte 1
  1322. chan4_port: .byte 1
  1323.  
  1324. ; 0 - 3: rate
  1325. ; 4 - 7: depth
  1326. chan1_vib: .byte 1
  1327. chan2_vib: .byte 1
  1328. chan3_vib: .byte 1
  1329. chan4_vib: .byte 1
  1330.  
  1331. chan1_trm: .byte 1
  1332. chan2_trm: .byte 1
  1333. chan3_trm: .byte 1
  1334. chan4_trm: .byte 1
  1335.  
  1336. chan1_pwm: .byte 1
  1337. chan2_pwm: .byte 1
  1338. chan3_pwm: .byte 1
  1339. chan4_pwm: .byte 1
  1340.  
  1341. chan1_pvib: .byte 2
  1342. chan2_pvib: .byte 2
  1343. chan3_pvib: .byte 2
  1344. chan4_pvib: .byte 2
  1345.  
  1346. chan1_ptrm: .byte 2
  1347. chan2_ptrm: .byte 2
  1348. chan3_ptrm: .byte 2
  1349. chan4_ptrm: .byte 2
  1350.  
  1351. chan1_tvib: .byte 1
  1352. chan2_tvib: .byte 1
  1353. chan3_tvib: .byte 1
  1354. chan4_tvib: .byte 1
  1355.  
  1356. chan1_ttrm: .byte 1
  1357. chan2_ttrm: .byte 1
  1358. chan3_ttrm: .byte 1
  1359. chan4_ttrm: .byte 1
  1360.  
  1361. chan1_tpwm: .byte 1
  1362. chan2_tpwm: .byte 1
  1363. chan3_tpwm: .byte 1
  1364. chan4_tpwm: .byte 1
  1365.  
  1366. ; 0 - 3: attack
  1367. ; 4 - 7: decay
  1368. ; 8 - 11: sustain
  1369. ; 12 - 15: release
  1370. chan1_env: .byte 2
  1371. chan2_env: .byte 2
  1372. chan3_env: .byte 2
  1373. chan4_env: .byte 2
  1374.  
  1375. chan1_fine: .byte 1
  1376. chan2_fine: .byte 1
  1377. chan3_fine: .byte 1
  1378. chan4_fine: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement