Advertisement
MegaLoler

Untitled

Dec 18th, 2012
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; sound generation:
  2. ; two output channels buffers
  3. ; four software channels
  4. ; first two hard-panned to left, second two hard-panned to right
  5. ; each channel switchable between either pulse, triangle, saw, and noise
  6. ; 16-bit oscilators and frequencies for each channel
  7. ; 4-bit fine tuners for each channel
  8. ; 8-bit volumes for each channel
  9. ; 8-bit duty cycle settings for each channel
  10. ; enable bits for each channel
  11. ;
  12. ; music generation:
  13. ; tempo
  14. ; ticks per frame
  15. ; repeat section
  16. ; each channel has three notes that are arpeggiated to modulate the target frequency
  17. ; each channel has its own target frequency
  18. ; each channel has its own frequency sweep speed which is the amount added or substracted from the channel frequency per tick until the target frequency is reached
  19. ; each channel has its own target volume
  20. ; each channel has its own volume sweep speed which is the amount added or substracted from the channel volume per tick until the target volume is reached
  21. ; each channel has its own vibrato settings split between depth and rate which control the effective target frequency
  22. ; each channel has its own tremolo settings split between depth and rate which control the effective target volume
  23. ; each channel has its own effect that is to be applied per tick
  24. ;
  25. ; song format:
  26. ; 0x00 - tempo
  27. ; 0x01 - ticks per frame
  28. ; 0x02 - repeat low
  29. ; 0x03 - repeat high
  30. ; [0x10 - end] - frames
  31. ;
  32. ; frame format:
  33. ; first byte - note
  34. ; second byte - volume
  35. ; third byte - effect
  36. ; fourth byte - arppegio
  37. ;
  38. ; effect format:
  39. ; first nybble - effect
  40. ; second nybble - argument
  41. ;
  42. ; note format:
  43. ; first nybble - note
  44. ; second nybble - octave
  45. ;
  46. ; notes:
  47. ; 0x0 - null
  48. ; 0x1 - same as root (for arppegio notes)
  49. ; 0x2 - stop
  50. ; 0x3 - revive
  51. ; 0x4 - C
  52. ; 0x5 - C#
  53. ; 0x6 - D
  54. ; 0x7 - D#
  55. ; 0x8 - E
  56. ; 0x9 - F
  57. ; 0xA - F#
  58. ; 0xB - G
  59. ; 0xC - G#
  60. ; 0xD - A
  61. ; 0xE - A#
  62. ; 0xF - B
  63. ;
  64. ; arppegio format:
  65. ; first nybble - note 2 (above octave of note 1)
  66. ; second nybble - note 3 (above octave of note 1)
  67. ;
  68. ; effects:
  69. ; 0 - null
  70. ; 1 - stop effect
  71. ; 2 - set vibrato rate
  72. ; 3 - set vibrato depth
  73. ; 4 - set tremolo rate
  74. ; 5 - set tremolo depth
  75. ; 6 - portamento to note
  76. ; 7 - volume slide
  77. ; 8 - increment duty cycle
  78. ; 9 - set duty cycle
  79.  
  80. .define NOTE_C 262
  81. .define NOTE_Cs 277
  82. .define NOTE_D 294
  83. .define NOTE_Ds 311
  84. .define NOTE_E 330
  85. .define NOTE_F 349
  86. .define NOTE_Fs 370
  87. .define NOTE_G 392
  88. .define NOTE_Gs 415
  89. .define NOTE_A 440
  90. .define NOTE_As 466
  91. .define NOTE_B 494
  92.  
  93. .def LEFT_BUF = r2
  94. .def RIGHT_BUF = r3
  95.  
  96. .def CHAN1_OSCL = r4
  97. .def CHAN1_OSCH = r5
  98. .def CHAN2_OSCL = r6
  99. .def CHAN2_OSCH = r7
  100. .def CHAN3_OSCL = r8
  101. .def CHAN3_OSCH = r9
  102. .def CHAN4_OSCL = r10
  103. .def CHAN4_OSCH = r11
  104.  
  105. .def CHAN1_FRQL = r12
  106. .def CHAN1_FRQH = r13
  107. .def CHAN2_FRQL = r14
  108. .def CHAN2_FRQH = r15
  109. .def CHAN3_FRQL = r24
  110. .def CHAN3_FRQH = r25
  111. .def CHAN4_FRQL = r26
  112. .def CHAN4_FRQH = r27
  113.  
  114. .def NOISEL = r0
  115. .def NOISEH = r1
  116.  
  117. .def EFF_DIR = r18
  118.  
  119. .NOLIST
  120. .include "m48def.inc"
  121. .LIST
  122.  
  123. .cseg
  124. .org 0x00
  125. rjmp start
  126.  
  127. .org 0x09
  128. rjmp timer
  129.  
  130. .org 0x40
  131. start:
  132. ldi r16, LOW(RAMEND)
  133. out spl, r16
  134. ldi r16, HIGH(RAMEND)
  135. out sph, r16
  136.  
  137. ldi r16, 1
  138. sts TIMSK2, r16
  139. ldi r16, 0b001
  140. sts TCCR2B, r16
  141.  
  142. ldi r16, 0xFF
  143. out ddrd, r16
  144. out ddrc, r16
  145.  
  146. ldi r16, 0xFF
  147. mov LEFT_BUF, r16
  148. mov RIGHT_BUF, r16
  149.  
  150. ldi r16, 0x01
  151. mov NOISEL, r16
  152. ldi r16, 0x00
  153. mov NOISEH, r16
  154.  
  155. ldi r16, 0b1111
  156. sts enable, r16
  157.  
  158. ldi r16, 0x08
  159. sts tempo, r16
  160. ldi r16, 0x06
  161. sts speed, r16
  162.  
  163. ldi r16, 0x2F
  164. sts chan1_eff, r16
  165. sts chan2_eff, r16
  166. sts chan3_eff, r16
  167. sts chan4_eff, r16
  168.  
  169. ldi r16, 0x1F
  170. sts chan1_vib, r16
  171. sts chan2_vib, r16
  172. sts chan3_vib, r16
  173. sts chan4_vib, r16
  174.  
  175. ldi r16, 0x0F
  176. sts chan1_trm, r16
  177. sts chan2_trm, r16
  178. sts chan3_trm, r16
  179. sts chan4_trm, r16
  180.  
  181. ldi r16, 0x40
  182. sts chan1_tvol, r16
  183. sts chan2_tvol, r16
  184. sts chan3_tvol, r16
  185. sts chan4_tvol, r16
  186.  
  187. ldi r16, 0x80
  188. sts chan1_dut, r16
  189. sts chan2_dut, r16
  190. sts chan3_dut, r16
  191. sts chan4_dut, r16
  192.  
  193. ldi r16, 0x64
  194. sts chan1_notes, r16
  195. sts chan2_notes, r16
  196. sts chan3_notes, r16
  197. sts chan4_notes, r16
  198. ldi r16, 0x00
  199. sts chan1_notes + 1, r16
  200. sts chan2_notes + 1, r16
  201. sts chan3_notes + 1, r16
  202. sts chan4_notes + 1, r16
  203.  
  204. ldi r16, 0b00000000
  205. sts waveform, r16
  206.  
  207. sei
  208.  
  209. loop:
  210. rjmp loop
  211.  
  212. note_freq:
  213. mov r16, r19
  214. lsr r16
  215. lsr r16
  216. lsr r16
  217. lsr r16
  218. cpi r16, 0x04
  219. breq setc
  220. cpi r16, 0x05
  221. breq setcs
  222. cpi r16, 0x06
  223. breq setd
  224. cpi r16, 0x07
  225. breq setds
  226. cpi r16, 0x08
  227. breq sete
  228. cpi r16, 0x09
  229. breq setf
  230. cpi r16, 0x0A
  231. breq setfs
  232. cpi r16, 0x0B
  233. breq setg
  234. cpi r16, 0x0C
  235. breq setgs
  236. cpi r16, 0x0D
  237. breq seta
  238. cpi r16, 0x0E
  239. breq setas
  240. cpi r16, 0x0F
  241. breq setb
  242. ret
  243. setc:
  244. ldi r16, LOW(NOTE_C)
  245. ldi r17, HIGH(NOTE_C)
  246. rjmp skip4
  247. setcs:
  248. ldi r16, LOW(NOTE_Cs)
  249. ldi r17, HIGH(NOTE_Cs)
  250. rjmp skip4
  251. setd:
  252. ldi r16, LOW(NOTE_D)
  253. ldi r17, HIGH(NOTE_D)
  254. rjmp skip4
  255. setds:
  256. ldi r16, LOW(NOTE_Ds)
  257. ldi r17, HIGH(NOTE_Ds)
  258. rjmp skip4
  259. sete:
  260. ldi r16, LOW(NOTE_E)
  261. ldi r17, HIGH(NOTE_E)
  262. rjmp skip4
  263. setf:
  264. ldi r16, LOW(NOTE_F)
  265. ldi r17, HIGH(NOTE_F)
  266. rjmp skip4
  267. setfs:
  268. ldi r16, LOW(NOTE_Fs)
  269. ldi r17, HIGH(NOTE_Fs)
  270. rjmp skip4
  271. setg:
  272. ldi r16, LOW(NOTE_G)
  273. ldi r17, HIGH(NOTE_G)
  274. rjmp skip4
  275. setgs:
  276. ldi r16, LOW(NOTE_Gs)
  277. ldi r17, HIGH(NOTE_Gs)
  278. rjmp skip4
  279. seta:
  280. ldi r16, LOW(NOTE_A)
  281. ldi r17, HIGH(NOTE_A)
  282. rjmp skip4
  283. setas:
  284. ldi r16, LOW(NOTE_As)
  285. ldi r17, HIGH(NOTE_As)
  286. rjmp skip4
  287. setb:
  288. ldi r16, LOW(NOTE_B)
  289. ldi r17, HIGH(NOTE_B)
  290. rjmp skip4
  291. skip4:
  292. andi r19, 0x0F
  293. cpi r19, 0x01
  294. breq seto1
  295. cpi r19, 0x02
  296. breq seto2
  297. cpi r19, 0x03
  298. breq seto3
  299. cpi r19, 0x04
  300. breq seto4
  301. cpi r19, 0x05
  302. breq seto5
  303. cpi r19, 0x06
  304. breq seto6
  305. cpi r19, 0x07
  306. breq seto7
  307. cpi r19, 0x08
  308. breq seto8
  309. ret
  310. seto1:
  311. lsr r17
  312. ror r16
  313. lsr r17
  314. ror r16
  315. lsr r17
  316. ror r16
  317. ret
  318. seto2:
  319. lsr r17
  320. ror r16
  321. lsr r17
  322. ror r16
  323. ret
  324. seto3:
  325. lsr r17
  326. ror r16
  327. ret
  328. seto4:
  329. ret
  330. seto5:
  331. lsl r16
  332. rol r17
  333. ret
  334. seto6:
  335. lsl r16
  336. rol r17
  337. lsl r16
  338. rol r17
  339. ret
  340. seto7:
  341. lsl r16
  342. rol r17
  343. lsl r16
  344. rol r17
  345. lsl r16
  346. rol r17
  347. ret
  348. seto8:
  349. lsl r16
  350. rol r17
  351. lsl r16
  352. rol r17
  353. lsl r16
  354. rol r17
  355. lsl r16
  356. rol r17
  357. ret
  358.  
  359. track:
  360. ret
  361.  
  362. arpeggio:
  363. mov r21, r19
  364. andi r21, 0xF0
  365. cpi r16, 1
  366. breq first
  367. cpi r16, 2
  368. breq second
  369. ret
  370. first:
  371. andi r20, 0xF0
  372. andi r19, 0x0F
  373. cpi r20, 4
  374. brlo nope2
  375. cp r21, r20
  376. brlo nope
  377. inc r19
  378. nope:
  379. or r19, r20
  380. ret
  381. second:
  382. lsl r20
  383. lsl r20
  384. lsl r20
  385. lsl r20
  386. andi r19, 0x0F
  387. cpi r20, 4
  388. brlo nope2
  389. cp r21, r20
  390. brlo nope
  391. inc r19
  392. nope2:
  393. or r19, r21
  394. ret
  395.  
  396. music:
  397. clr r18
  398. sts music_timer, r18
  399. sts music_timer + 1, r18
  400.  
  401. lds r16, tick_timer
  402. mov r17, r16
  403. lsr r17
  404. lsr r17
  405. lsr r17
  406. lsr r17
  407. andi r16, 0x0F
  408. inc r17
  409. lds r18, speed
  410. cp r17, r18
  411. brlo no_track
  412. rcall track
  413. clr r17
  414. rjmp okay
  415. no_track:
  416. lsl r17
  417. lsl r17
  418. lsl r17
  419. lsl r17
  420. okay:
  421. lds r18, fine_tune
  422.  
  423. push r17
  424. push r16
  425.  
  426. lds r19, chan1_notes
  427. lds r20, chan1_notes + 1
  428. rcall arpeggio
  429. rcall note_freq
  430.  
  431. lds r21, chan1_vib
  432. mov r22, CHAN1_FRQL
  433. mov r23, CHAN1_FRQH
  434.  
  435. rcall sweep
  436.  
  437. mov CHAN1_FRQL, r22
  438. mov CHAN1_FRQH, r23
  439.  
  440. mov r19, r18
  441. andi r19, 0x0F
  442. add CHAN1_FRQL, r19
  443.  
  444. pop r16
  445. push r16
  446.  
  447. lds r19, chan2_notes
  448. lds r20, chan2_notes + 1
  449. rcall arpeggio
  450. rcall note_freq
  451.  
  452. lds r21, chan2_vib
  453. mov r22, CHAN2_FRQL
  454. mov r23, CHAN2_FRQH
  455.  
  456. rcall sweep
  457.  
  458. mov CHAN2_FRQL, r22
  459. mov CHAN2_FRQH, r23
  460.  
  461. lsr r18
  462. lsr r18
  463. lsr r18
  464. lsr r18
  465. add CHAN2_FRQL, r18
  466.  
  467. lds r18, fine_tune + 1
  468.  
  469. pop r16
  470. push r16
  471.  
  472. lds r19, chan3_notes
  473. lds r20, chan3_notes + 1
  474. rcall arpeggio
  475. rcall note_freq
  476.  
  477. lds r21, chan3_vib
  478. mov r22, CHAN3_FRQL
  479. mov r23, CHAN3_FRQH
  480.  
  481. rcall sweep
  482.  
  483. mov CHAN3_FRQL, r22
  484. mov CHAN3_FRQH, r23
  485.  
  486. mov r19, r18
  487. andi r19, 0x0F
  488. add CHAN3_FRQL, r19
  489.  
  490. pop r16
  491. push r16
  492.  
  493. lds r19, chan4_notes
  494. lds r20, chan4_notes + 1
  495. rcall arpeggio
  496. rcall note_freq
  497.  
  498. lds r21, chan4_vib
  499. mov r22, CHAN4_FRQL
  500. mov r23, CHAN4_FRQH
  501.  
  502. rcall sweep
  503.  
  504. mov CHAN4_FRQL, r22
  505. mov CHAN4_FRQH, r23
  506.  
  507. lsr r18
  508. lsr r18
  509. lsr r18
  510. lsr r18
  511. add CHAN4_FRQL, r18
  512.  
  513. pop r16
  514. pop r17
  515.  
  516. inc r16
  517. cpi r16, 3
  518. brlo lower
  519. clr r16
  520. lower:
  521. or r17, r16
  522. sts tick_timer, r17
  523.  
  524. lds r16, chan1_trm
  525. lds r17, chan1_vol
  526. lds r18, chan1_tvol
  527. rcall vol_sweep
  528. sts chan1_vol, r17
  529.  
  530. lds r16, chan2_trm
  531. lds r17, chan2_vol
  532. lds r18, chan2_tvol
  533. rcall vol_sweep
  534. sts chan2_vol, r17
  535.  
  536. lds r16, chan3_trm
  537. lds r17, chan3_vol
  538. lds r18, chan3_tvol
  539. rcall vol_sweep
  540. sts chan3_vol, r17
  541.  
  542. lds r16, chan4_trm
  543. lds r17, chan4_vol
  544. lds r18, chan4_tvol
  545. rcall vol_sweep
  546. sts chan4_vol, r17
  547.  
  548. lds r16, chan1_eff
  549. lds r17, chan1_trm
  550. lds r18, chan1_vib
  551. lds r19, chan1_dut
  552. rcall apply_effect
  553. sts chan1_trm, r17
  554. sts chan1_vib, r18
  555. sts chan1_dut, r19
  556.  
  557. lds r16, chan2_eff
  558. lds r17, chan2_trm
  559. lds r18, chan2_vib
  560. lds r19, chan2_dut
  561. rcall apply_effect
  562. sts chan2_trm, r17
  563. sts chan2_vib, r18
  564. sts chan2_dut, r19
  565.  
  566. lds r16, chan3_eff
  567. lds r17, chan3_trm
  568. lds r18, chan3_vib
  569. lds r19, chan3_dut
  570. rcall apply_effect
  571. sts chan3_trm, r17
  572. sts chan3_vib, r18
  573. sts chan3_dut, r19
  574.  
  575. lds r16, chan4_eff
  576. lds r17, chan4_trm
  577. lds r18, chan4_vib
  578. lds r19, chan4_dut
  579. rcall apply_effect
  580. sts chan4_trm, r17
  581. sts chan4_vib, r18
  582. sts chan4_dut, r19
  583.  
  584. ret
  585.  
  586. apply_effect:
  587. mov r20, r16
  588. lsr r16
  589. lsr r16
  590. lsr r16
  591. lsr r16
  592. andi r20, 0x0F
  593.  
  594. cpi r16, 0x2
  595. breq set_vib_rate
  596. cpi r16, 0x3
  597. breq set_vib_depth
  598. cpi r16, 0x4
  599. breq set_trm_rate
  600. cpi r16, 0x5
  601. breq set_trm_depth
  602. cpi r16, 0x6
  603. breq set_portamento
  604. cpi r16, 0x7
  605. breq set_vol_slide
  606. cpi r16, 0x8
  607. breq inc_dut
  608. cpi r16, 0x9
  609. breq set_dut
  610. ret
  611. set_vib_rate:
  612. lsl r20
  613. lsl r20
  614. lsl r20
  615. lsl r20
  616. andi r18, 0x0F
  617. or r18, r20
  618. ret
  619. set_vib_depth:
  620. andi r18, 0xF0
  621. or r18, r20
  622. ret
  623. set_trm_rate:
  624. lsl r20
  625. lsl r20
  626. lsl r20
  627. lsl r20
  628. andi r17, 0x0F
  629. or r17, r20
  630. ret
  631. set_trm_depth:
  632. andi r17, 0xF0
  633. or r17, r20
  634. ret
  635. set_portamento:
  636. lsl r20
  637. lsl r20
  638. lsl r20
  639. lsl r20
  640. mov r18, r20
  641. ret
  642. set_vol_slide:
  643. lsl r20
  644. lsl r20
  645. lsl r20
  646. lsl r20
  647. mov r17, r20
  648. ret
  649. inc_dut:
  650. add r19, r20
  651. ret
  652. set_dut:
  653. lsl r20
  654. lsl r20
  655. lsl r20
  656. lsl r20
  657. mov r19, r20
  658. ret
  659.  
  660. vol_sweep:
  661. lsr r16
  662. lsr r16
  663. lsr r16
  664. lsr r16
  665. cpi r16, 0
  666. breq vol_equal
  667. cp r17, r18
  668. brlo vol_smaller
  669. cp r18, r17
  670. brlo vol_bigger
  671. rjmp vol_equal
  672. vol_smaller:
  673. add r17, r16
  674. cp r18, r17
  675. brlo vol_equal
  676. ret
  677. vol_bigger:
  678. sub r17, r16
  679. cp r17, r18
  680. brlo vol_equal
  681. ret
  682. vol_equal:
  683. mov r17, r18
  684. ret
  685.  
  686. sweep:
  687. lsr r21
  688. lsr r21
  689. lsr r21
  690. lsr r21
  691. cpi r21, 0
  692. breq equal
  693. cp r23, r17
  694. brlo smaller
  695. cp r17, r23
  696. brlo bigger
  697. cp r22, r16
  698. brlo smaller
  699. cp r16, r22
  700. brlo bigger
  701. rjmp equal
  702. bigger:
  703. sub r22, r21
  704. brcc yeah
  705. dec r23
  706. yeah:
  707. rjmp done_big
  708. done_big:
  709. cp r23, r17
  710. brlo equal
  711. cp r17, r23
  712. brlo return2
  713. cp r22, r16
  714. brlo equal
  715. rjmp return2
  716. smaller:
  717. clr r19
  718. add r22, r21
  719. adc r23, r19
  720. rjmp done_small
  721. done_small:
  722. cp r23, r17
  723. brlo return2
  724. cp r17, r23
  725. brlo equal
  726. cp r22, r16
  727. brlo return2
  728. cp r16, r22
  729. brlo equal
  730. rjmp return2
  731. equal:
  732. mov r22, r16
  733. mov r23, r17
  734. return2:
  735. ret
  736.  
  737. timer:
  738. mov r16, LEFT_BUF
  739. lsr r16
  740. lsr r16
  741. mov r17, RIGHT_BUF
  742. lsr r17
  743. lsr r17
  744. out portd, r16
  745. out portc, r17
  746.  
  747. lds r16, music_timer
  748. lds r17, music_timer + 1
  749. ldi r18, 0
  750. ldi r19, 1
  751. add r16, r19
  752. adc r17, r18
  753. sts music_timer, r16
  754. sts music_timer + 1, r17
  755. lds r18, tempo
  756. cp r17, r18
  757. brlo no_music
  758. rcall music
  759.  
  760. no_music:
  761. clr LEFT_BUF
  762. clr RIGHT_BUF
  763.  
  764. add CHAN1_OSCL, CHAN1_FRQL
  765. adc CHAN1_OSCH, CHAN1_FRQH
  766. add CHAN2_OSCL, CHAN2_FRQL
  767. adc CHAN2_OSCH, CHAN2_FRQH
  768. add CHAN3_OSCL, CHAN3_FRQL
  769. adc CHAN3_OSCH, CHAN3_FRQH
  770. add CHAN4_OSCL, CHAN4_FRQL
  771. adc CHAN4_OSCH, CHAN4_FRQH
  772.  
  773. lds r16, waveform
  774. lds r22, enable
  775.  
  776. mov r18, r16
  777. andi r18, 0b00000011
  778. mov r19, CHAN1_OSCH
  779. lds r20, chan1_vol
  780. lds r21, chan1_dut
  781. rcall generate
  782. sbrc r22, 0
  783. add LEFT_BUF, r17
  784.  
  785. lsr r16
  786. lsr r16
  787. mov r18, r16
  788. andi r18, 0b00000011
  789. mov r19, CHAN2_OSCH
  790. lds r20, chan2_vol
  791. lds r21, chan2_dut
  792. rcall generate
  793. sbrc r22, 1
  794. add LEFT_BUF, r17
  795.  
  796. lsr r16
  797. lsr r16
  798. mov r18, r16
  799. andi r18, 0b00000011
  800. mov r19, CHAN3_OSCH
  801. lds r20, chan3_vol
  802. lds r21, chan3_dut
  803. rcall generate
  804. sbrc r22, 2
  805. add RIGHT_BUF, r17
  806.  
  807. lsr r16
  808. lsr r16
  809. mov r18, r16
  810. andi r18, 0b00000011
  811. mov r19, CHAN4_OSCH
  812. lds r20, chan4_vol
  813. lds r21, chan4_dut
  814. rcall generate
  815. sbrc r22, 3
  816. add RIGHT_BUF, r17
  817.  
  818. reti
  819.  
  820. generate:
  821. clr r17
  822. cpi r18, 0b00
  823. breq gen_pulse
  824. cpi r18, 0b01
  825. breq gen_triangle
  826. cpi r18, 0b10
  827. breq gen_saw
  828. cpi r18, 0b11
  829. breq gen_noise
  830. ret
  831.  
  832. gen_pulse:
  833. cp r19, r21
  834. brlo return
  835. mov r17, r20
  836. lsr r17
  837. lsr r17
  838. ret
  839.  
  840. gen_triangle:
  841. mov r17, r19
  842. sbrc r19, 7
  843. com r17
  844. rjmp apply_volume
  845. ret
  846.  
  847. gen_saw:
  848. mov r17, r19
  849. lsr r17
  850. lsr r17
  851. rjmp apply_volume
  852. ret
  853.  
  854. gen_noise:
  855. clr r21
  856. clr r19
  857. sbrc NOISEH, 6
  858. ser r21
  859. sbrc NOISEL, 3
  860. ser r19
  861. eor r19, r21
  862. clr r21
  863. lsl NOISEH
  864. lsl NOISEL
  865. adc NOISEH, r21
  866. sbrc r19, 0
  867. inc NOISEL
  868. mov r17, NOISEL
  869. lsr r17
  870. rjmp apply_volume
  871. ret
  872.  
  873. apply_volume:
  874. sbrc r20, 7
  875. rjmp return
  876. lsr r17
  877. sbrc r20, 6
  878. rjmp return
  879. lsr r17
  880. sbrc r20, 5
  881. rjmp return
  882. lsr r17
  883. sbrc r20, 4
  884. rjmp return
  885. lsr r17
  886. sbrc r20, 3
  887. rjmp return
  888. lsr r17
  889. sbrc r20, 2
  890. rjmp return
  891. lsr r17
  892. sbrc r20, 1
  893. rjmp return
  894. lsr r17
  895. return:
  896. ret
  897.  
  898. .dseg
  899. chan1_vol: .byte 1
  900. chan2_vol: .byte 1
  901. chan3_vol: .byte 1
  902. chan4_vol: .byte 1
  903.  
  904. chan1_dut: .byte 1
  905. chan2_dut: .byte 1
  906. chan3_dut: .byte 1
  907. chan4_dut: .byte 1
  908.  
  909. fine_tune: .byte 2
  910. waveform: .byte 1
  911. enable: .byte 1
  912. music_timer: .byte 2
  913. tick_timer: .byte 1
  914.  
  915. tempo: .byte 1
  916. speed: .byte 1
  917.  
  918. chan1_tvol: .byte 1
  919. chan2_tvol: .byte 1
  920. chan3_tvol: .byte 1
  921. chan4_tvol: .byte 1
  922.  
  923. chan1_notes: .byte 2
  924. chan2_notes: .byte 2
  925. chan3_notes: .byte 2
  926. chan4_notes: .byte 2
  927.  
  928. chan1_vib: .byte 1
  929. chan2_vib: .byte 1
  930. chan3_vib: .byte 1
  931. chan4_vib: .byte 1
  932.  
  933. chan1_trm: .byte 1
  934. chan2_trm: .byte 1
  935. chan3_trm: .byte 1
  936. chan4_trm: .byte 1
  937.  
  938. chan1_eff: .byte 1
  939. chan2_eff: .byte 1
  940. chan3_eff: .byte 1
  941. chan4_eff: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement