Advertisement
MegaLoler

Untitled

Dec 19th, 2012
120
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. ; A - set waveform
  80. ; B - increment volume
  81. ; C - decrement volume
  82. ; D - set finetune
  83.  
  84. .define NOTE_C 262
  85. .define NOTE_Cs 277
  86. .define NOTE_D 294
  87. .define NOTE_Ds 311
  88. .define NOTE_E 330
  89. .define NOTE_F 349
  90. .define NOTE_Fs 370
  91. .define NOTE_G 392
  92. .define NOTE_Gs 415
  93. .define NOTE_A 440
  94. .define NOTE_As 466
  95. .define NOTE_B 494
  96.  
  97. .def LEFT_BUF = r2
  98. .def RIGHT_BUF = r3
  99.  
  100. .def CHAN1_OSCL = r4
  101. .def CHAN1_OSCH = r5
  102. .def CHAN2_OSCL = r6
  103. .def CHAN2_OSCH = r7
  104. .def CHAN3_OSCL = r8
  105. .def CHAN3_OSCH = r9
  106. .def CHAN4_OSCL = r10
  107. .def CHAN4_OSCH = r11
  108.  
  109. .def CHAN1_FRQL = r12
  110. .def CHAN1_FRQH = r13
  111. .def CHAN2_FRQL = r14
  112. .def CHAN2_FRQH = r15
  113. .def CHAN3_FRQL = r24
  114. .def CHAN3_FRQH = r25
  115. .def CHAN4_FRQL = r26
  116. .def CHAN4_FRQH = r27
  117.  
  118. .def NOISEL = r0
  119. .def NOISEH = r1
  120.  
  121. .def EFF_DIR = r18
  122.  
  123. .NOLIST
  124. .include "m48def.inc"
  125. .LIST
  126.  
  127. .cseg
  128. .org 0x00
  129. rjmp start
  130.  
  131. .org 0x09
  132. rjmp timer
  133.  
  134. .org 0x40
  135. start:
  136. ldi r16, LOW(RAMEND)
  137. out spl, r16
  138. ldi r16, HIGH(RAMEND)
  139. out sph, r16
  140.  
  141. ldi r16, 1
  142. sts TIMSK2, r16
  143. ldi r16, 0b001
  144. sts TCCR2B, r16
  145.  
  146. ldi r16, 0xFF
  147. out ddrd, r16
  148. out ddrc, r16
  149.  
  150. ldi r16, 0xFF
  151. mov LEFT_BUF, r16
  152. mov RIGHT_BUF, r16
  153.  
  154. ldi r16, 0x01
  155. mov NOISEL, r16
  156. ldi r16, 0x00
  157. mov NOISEH, r16
  158.  
  159. ldi r16, 0b0000
  160. sts enable, r16
  161.  
  162. ldi r16, 0x08
  163. sts tempo, r16
  164. ldi r16, 0x04
  165. sts speed, r16
  166.  
  167. ldi r16, 0x00
  168. sts chan1_eff, r16
  169. sts chan2_eff, r16
  170. sts chan3_eff, r16
  171. sts chan4_eff, r16
  172.  
  173. ldi r16, 0x0F
  174. sts chan1_vib, r16
  175. sts chan2_vib, r16
  176. sts chan3_vib, r16
  177. sts chan4_vib, r16
  178.  
  179. ldi r16, 0x0F
  180. sts chan1_trm, r16
  181. sts chan2_trm, r16
  182. sts chan3_trm, r16
  183. sts chan4_trm, r16
  184.  
  185. ldi r16, 0x80
  186. sts chan1_tvol, r16
  187. sts chan2_tvol, r16
  188. sts chan3_tvol, r16
  189. sts chan4_tvol, r16
  190.  
  191. ldi r16, 0x80
  192. sts chan1_dut, r16
  193. sts chan2_dut, r16
  194. sts chan3_dut, r16
  195. sts chan4_dut, r16
  196.  
  197. ldi r16, 0x44
  198. sts chan1_notes, r16
  199. sts chan2_notes, r16
  200. sts chan3_notes, r16
  201. sts chan4_notes, r16
  202.  
  203. ldi r16, 0x00
  204. sts chan1_notes + 1, r16
  205. sts chan2_notes + 1, r16
  206. sts chan3_notes + 1, r16
  207. sts chan4_notes + 1, r16
  208.  
  209. ldi r16, 0b00000000
  210. sts waveform, r16
  211.  
  212. ldi r16, 0x01
  213. sts repeat, r16
  214.  
  215. ldi ZL, LOW(song_data << 1)
  216. ldi ZH, HIGH(song_data << 1)
  217.  
  218. sei
  219.  
  220. loop:
  221. rjmp loop
  222.  
  223. note_freq:
  224. mov r16, r19
  225. lsr r16
  226. lsr r16
  227. lsr r16
  228. lsr r16
  229. cpi r16, 0x04
  230. breq setc
  231. cpi r16, 0x05
  232. breq setcs
  233. cpi r16, 0x06
  234. breq setd
  235. cpi r16, 0x07
  236. breq setds
  237. cpi r16, 0x08
  238. breq sete
  239. cpi r16, 0x09
  240. breq setf
  241. cpi r16, 0x0A
  242. breq setfs
  243. cpi r16, 0x0B
  244. breq setg
  245. cpi r16, 0x0C
  246. breq setgs
  247. cpi r16, 0x0D
  248. breq seta
  249. cpi r16, 0x0E
  250. breq setas
  251. cpi r16, 0x0F
  252. breq setb
  253. ret
  254. setc:
  255. ldi r16, LOW(NOTE_C)
  256. ldi r17, HIGH(NOTE_C)
  257. rjmp skip4
  258. setcs:
  259. ldi r16, LOW(NOTE_Cs)
  260. ldi r17, HIGH(NOTE_Cs)
  261. rjmp skip4
  262. setd:
  263. ldi r16, LOW(NOTE_D)
  264. ldi r17, HIGH(NOTE_D)
  265. rjmp skip4
  266. setds:
  267. ldi r16, LOW(NOTE_Ds)
  268. ldi r17, HIGH(NOTE_Ds)
  269. rjmp skip4
  270. sete:
  271. ldi r16, LOW(NOTE_E)
  272. ldi r17, HIGH(NOTE_E)
  273. rjmp skip4
  274. setf:
  275. ldi r16, LOW(NOTE_F)
  276. ldi r17, HIGH(NOTE_F)
  277. rjmp skip4
  278. setfs:
  279. ldi r16, LOW(NOTE_Fs)
  280. ldi r17, HIGH(NOTE_Fs)
  281. rjmp skip4
  282. setg:
  283. ldi r16, LOW(NOTE_G)
  284. ldi r17, HIGH(NOTE_G)
  285. rjmp skip4
  286. setgs:
  287. ldi r16, LOW(NOTE_Gs)
  288. ldi r17, HIGH(NOTE_Gs)
  289. rjmp skip4
  290. seta:
  291. ldi r16, LOW(NOTE_A)
  292. ldi r17, HIGH(NOTE_A)
  293. rjmp skip4
  294. setas:
  295. ldi r16, LOW(NOTE_As)
  296. ldi r17, HIGH(NOTE_As)
  297. rjmp skip4
  298. setb:
  299. ldi r16, LOW(NOTE_B)
  300. ldi r17, HIGH(NOTE_B)
  301. rjmp skip4
  302. skip4:
  303. andi r19, 0x0F
  304. cpi r19, 0x01
  305. breq seto1
  306. cpi r19, 0x02
  307. breq seto2
  308. cpi r19, 0x03
  309. breq seto3
  310. cpi r19, 0x04
  311. breq seto4
  312. cpi r19, 0x05
  313. breq seto5
  314. cpi r19, 0x06
  315. breq seto6
  316. cpi r19, 0x07
  317. breq seto7
  318. cpi r19, 0x08
  319. breq seto8
  320. ret
  321. seto1:
  322. lsr r17
  323. ror r16
  324. lsr r17
  325. ror r16
  326. lsr r17
  327. ror r16
  328. ret
  329. seto2:
  330. lsr r17
  331. ror r16
  332. lsr r17
  333. ror r16
  334. ret
  335. seto3:
  336. lsr r17
  337. ror r16
  338. ret
  339. seto4:
  340. ret
  341. seto5:
  342. lsl r16
  343. rol r17
  344. ret
  345. seto6:
  346. lsl r16
  347. rol r17
  348. lsl r16
  349. rol r17
  350. ret
  351. seto7:
  352. lsl r16
  353. rol r17
  354. lsl r16
  355. rol r17
  356. lsl r16
  357. rol r17
  358. ret
  359. seto8:
  360. lsl r16
  361. rol r17
  362. lsl r16
  363. rol r17
  364. lsl r16
  365. rol r17
  366. lsl r16
  367. rol r17
  368. ret
  369.  
  370. track:
  371. cpi ZH, HIGH(song_end << 1)
  372. brlo continue
  373. brne loopback
  374. cpi ZL, LOW(song_end << 1)
  375. brlo continue
  376. loopback:
  377. ldi ZL, LOW(song_data << 1)
  378. ldi ZH, HIGH(song_data << 1)
  379. lds r20, repeat
  380. ldi r21, 0x00
  381. lsl r20
  382. rol r21
  383. lsl r20
  384. rol r21
  385. lsl r20
  386. rol r21
  387. lsl r20
  388. rol r21
  389. add ZL, r20
  390. adc ZH, r21
  391. continue:
  392. ldi r20, 0b0001
  393. rcall load_command
  394. ldi r20, 0b0010
  395. rcall load_command
  396. ldi r20, 0b0100
  397. rcall load_command
  398. ldi r20, 0b1000
  399. rcall load_command
  400. ret
  401.  
  402. load_command:
  403. lpm r19, Z+
  404. rcall handle_note
  405. lpm r19, Z+
  406. rcall handle_volume
  407. lpm r19, Z+
  408. rcall handle_effect
  409. lpm r19, Z+
  410. rcall handle_arps
  411. ret
  412.  
  413. handle_note:
  414. mov r16, r19
  415. lsr r16
  416. lsr r16
  417. lsr r16
  418. lsr r16
  419. cpi r16, 0x00
  420. breq end_note
  421. cpi r16, 0x01
  422. breq end_note
  423. cpi r16, 0x02
  424. breq stop_note
  425. cpi r16, 0x03
  426. breq start_note
  427. sbrc r20, 0
  428. sts chan1_notes, r19
  429. sbrc r20, 1
  430. sts chan2_notes, r19
  431. sbrc r20, 2
  432. sts chan3_notes, r19
  433. sbrc r20, 3
  434. sts chan4_notes, r19
  435. rjmp start_note
  436. stop_note:
  437. lds r21, enable
  438. sbrc r20, 0
  439. andi r21, 0b1110
  440. sbrc r20, 1
  441. andi r21, 0b1101
  442. sbrc r20, 2
  443. andi r21, 0b1011
  444. sbrc r20, 3
  445. andi r21, 0b0111
  446. sts enable, r21
  447. ret
  448. start_note:
  449. lds r21, enable
  450. sbrc r20, 0
  451. ori r21, 0b0001
  452. sbrc r20, 1
  453. ori r21, 0b0010
  454. sbrc r20, 2
  455. ori r21, 0b0100
  456. sbrc r20, 3
  457. ori r21, 0b1000
  458. sts enable, r21
  459. ret
  460. end_note:
  461. ret
  462.  
  463. handle_volume:
  464. cpi r19, 0x00
  465. breq end_vol
  466. sbrc r20, 0
  467. sts chan1_tvol, r19
  468. sbrc r20, 1
  469. sts chan2_tvol, r19
  470. sbrc r20, 2
  471. sts chan3_tvol, r19
  472. sbrc r20, 3
  473. sts chan4_tvol, r19
  474. end_vol:
  475. ret
  476.  
  477. handle_effect:
  478. cpi r19, 0x00
  479. breq end_eff
  480. sbrc r20, 0
  481. sts chan1_eff, r19
  482. sbrc r20, 1
  483. sts chan2_eff, r19
  484. sbrc r20, 2
  485. sts chan3_eff, r19
  486. sbrc r20, 3
  487. sts chan4_eff, r19
  488. end_eff:
  489. ret
  490.  
  491. handle_arps:
  492. sbrc r20, 0
  493. sts chan1_notes + 1, r19
  494. sbrc r20, 1
  495. sts chan2_notes + 1, r19
  496. sbrc r20, 2
  497. sts chan3_notes + 1, r19
  498. sbrc r20, 3
  499. sts chan4_notes + 1, r19
  500. ret
  501.  
  502. arpeggio:
  503. mov r21, r19
  504. andi r21, 0xF0
  505. cpi r16, 1
  506. breq first
  507. cpi r16, 2
  508. breq second
  509. ret
  510. first:
  511. andi r20, 0xF0
  512. andi r19, 0x0F
  513. cpi r20, 4
  514. brlo nope2
  515. cp r21, r20
  516. brlo nope
  517. inc r19
  518. nope:
  519. or r19, r20
  520. ret
  521. second:
  522. lsl r20
  523. lsl r20
  524. lsl r20
  525. lsl r20
  526. andi r19, 0x0F
  527. cpi r20, 4
  528. brlo nope2
  529. cp r21, r20
  530. brlo nope
  531. inc r19
  532. nope2:
  533. or r19, r21
  534. ret
  535.  
  536. music:
  537. clr r18
  538. sts music_timer, r18
  539. sts music_timer + 1, r18
  540.  
  541. lds r16, tick_timer
  542. mov r17, r16
  543. lsr r17
  544. lsr r17
  545. lsr r17
  546. lsr r17
  547. andi r16, 0x0F
  548. inc r17
  549. lds r18, speed
  550. cp r17, r18
  551. brlo no_track
  552. rcall track
  553. clr r17
  554. rjmp okay
  555. no_track:
  556. lsl r17
  557. lsl r17
  558. lsl r17
  559. lsl r17
  560. okay:
  561. push r16
  562. push r17
  563.  
  564. lds r22, waveform
  565.  
  566. lds r16, chan1_eff
  567. lds r17, chan1_trm
  568. lds r18, chan1_vib
  569. lds r19, chan1_dut
  570. lds r23, chan1_tvol
  571. rcall apply_effect
  572. sts chan1_trm, r17
  573. sts chan1_vib, r18
  574. sts chan1_dut, r19
  575. sts chan1_tvol, r23
  576. sbrs r21, 3
  577. rjmp skipwav1
  578. andi r21, 0b0011
  579. andi r22, 0b11111100
  580. or r22, r21
  581. skipwav1:
  582.  
  583. lds r16, chan2_eff
  584. lds r17, chan2_trm
  585. lds r18, chan2_vib
  586. lds r19, chan2_dut
  587. lds r23, chan2_tvol
  588. lsr r21
  589. lsr r21
  590. rcall apply_effect
  591. sts chan2_trm, r17
  592. sts chan2_vib, r18
  593. sts chan2_dut, r19
  594. sts chan2_tvol, r23
  595. sbrs r21, 3
  596. rjmp skipwav2
  597. andi r21, 0b0011
  598. andi r22, 0b11110011
  599. lsl r21
  600. lsl r21
  601. or r22, r21
  602. skipwav2:
  603.  
  604. lds r16, chan3_eff
  605. lds r17, chan3_trm
  606. lds r18, chan3_vib
  607. lds r19, chan3_dut
  608. lds r23, chan3_tvol
  609. rcall apply_effect
  610. sts chan3_trm, r17
  611. sts chan3_vib, r18
  612. sts chan3_dut, r19
  613. sts chan3_tvol, r23
  614. sbrs r21, 3
  615. rjmp skipwav3
  616. andi r21, 0b0011
  617. andi r22, 0b11001111
  618. lsl r21
  619. lsl r21
  620. lsl r21
  621. lsl r21
  622. or r22, r21
  623. skipwav3:
  624.  
  625. lds r16, chan4_eff
  626. lds r17, chan4_trm
  627. lds r18, chan4_vib
  628. lds r19, chan4_dut
  629. lds r23, chan4_tvol
  630. rcall apply_effect
  631. sts chan4_trm, r17
  632. sts chan4_vib, r18
  633. sts chan4_dut, r19
  634. sts chan4_tvol, r23
  635. sbrs r21, 3
  636. rjmp skipwav4
  637. andi r21, 0b0011
  638. andi r22, 0b00111111
  639. lsl r21
  640. lsl r21
  641. lsl r21
  642. lsl r21
  643. lsl r21
  644. lsl r21
  645. or r22, r21
  646. skipwav4:
  647. sts waveform, r22
  648.  
  649. pop r17
  650. pop r16
  651.  
  652. lds r18, fine_tune
  653.  
  654. push r17
  655. push r16
  656.  
  657. lds r19, chan1_notes
  658. lds r20, chan1_notes + 1
  659. rcall arpeggio
  660. rcall note_freq
  661.  
  662. lds r21, chan1_vib
  663. mov r22, CHAN1_FRQL
  664. mov r23, CHAN1_FRQH
  665.  
  666. rcall sweep
  667.  
  668. mov CHAN1_FRQL, r22
  669. mov CHAN1_FRQH, r23
  670.  
  671. mov r19, r18
  672. andi r19, 0x0F
  673. add CHAN1_FRQL, r19
  674.  
  675. pop r16
  676. push r16
  677.  
  678. lds r19, chan2_notes
  679. lds r20, chan2_notes + 1
  680. rcall arpeggio
  681. rcall note_freq
  682.  
  683. lds r21, chan2_vib
  684. mov r22, CHAN2_FRQL
  685. mov r23, CHAN2_FRQH
  686.  
  687. rcall sweep
  688.  
  689. mov CHAN2_FRQL, r22
  690. mov CHAN2_FRQH, r23
  691.  
  692. lsr r18
  693. lsr r18
  694. lsr r18
  695. lsr r18
  696. add CHAN2_FRQL, r18
  697.  
  698. lds r18, fine_tune + 1
  699.  
  700. pop r16
  701. push r16
  702.  
  703. lds r19, chan3_notes
  704. lds r20, chan3_notes + 1
  705. rcall arpeggio
  706. rcall note_freq
  707.  
  708. lds r21, chan3_vib
  709. mov r22, CHAN3_FRQL
  710. mov r23, CHAN3_FRQH
  711.  
  712. rcall sweep
  713.  
  714. mov CHAN3_FRQL, r22
  715. mov CHAN3_FRQH, r23
  716.  
  717. mov r19, r18
  718. andi r19, 0x0F
  719. add CHAN3_FRQL, r19
  720.  
  721. pop r16
  722. push r16
  723.  
  724. lds r19, chan4_notes
  725. lds r20, chan4_notes + 1
  726. rcall arpeggio
  727. rcall note_freq
  728.  
  729. lds r21, chan4_vib
  730. mov r22, CHAN4_FRQL
  731. mov r23, CHAN4_FRQH
  732.  
  733. rcall sweep
  734.  
  735. mov CHAN4_FRQL, r22
  736. mov CHAN4_FRQH, r23
  737.  
  738. lsr r18
  739. lsr r18
  740. lsr r18
  741. lsr r18
  742. add CHAN4_FRQL, r18
  743.  
  744. pop r16
  745. pop r17
  746.  
  747. inc r16
  748. cpi r16, 3
  749. brlo lower
  750. clr r16
  751. lower:
  752. or r17, r16
  753. sts tick_timer, r17
  754.  
  755. lds r16, chan1_trm
  756. lds r17, chan1_vol
  757. lds r18, chan1_tvol
  758. rcall vol_sweep
  759. sts chan1_vol, r17
  760.  
  761. lds r16, chan2_trm
  762. lds r17, chan2_vol
  763. lds r18, chan2_tvol
  764. rcall vol_sweep
  765. sts chan2_vol, r17
  766.  
  767. lds r16, chan3_trm
  768. lds r17, chan3_vol
  769. lds r18, chan3_tvol
  770. rcall vol_sweep
  771. sts chan3_vol, r17
  772.  
  773. lds r16, chan4_trm
  774. lds r17, chan4_vol
  775. lds r18, chan4_tvol
  776. rcall vol_sweep
  777. sts chan4_vol, r17
  778.  
  779. ret
  780.  
  781. apply_effect:
  782. clr r21
  783. mov r20, r16
  784. lsr r16
  785. lsr r16
  786. lsr r16
  787. lsr r16
  788. andi r20, 0x0F
  789.  
  790. cpi r16, 0x2
  791. breq set_vib_rate
  792. cpi r16, 0x3
  793. breq set_vib_depth
  794. cpi r16, 0x4
  795. breq set_trm_rate
  796. cpi r16, 0x5
  797. breq set_trm_depth
  798. cpi r16, 0x6
  799. breq set_portamento
  800. cpi r16, 0x7
  801. breq set_vol_slide
  802. cpi r16, 0x8
  803. breq inc_dut
  804. cpi r16, 0x9
  805. breq set_dut
  806. cpi r16, 0xA
  807. breq set_wav
  808. cpi r16, 0xB
  809. breq inc_vol
  810. cpi r16, 0xC
  811. breq dec_vol
  812. ret
  813. set_vib_rate:
  814. lsl r20
  815. lsl r20
  816. lsl r20
  817. lsl r20
  818. andi r18, 0x0F
  819. or r18, r20
  820. ret
  821. set_vib_depth:
  822. andi r18, 0xF0
  823. or r18, r20
  824. ret
  825. set_trm_rate:
  826. lsl r20
  827. lsl r20
  828. lsl r20
  829. lsl r20
  830. andi r17, 0x0F
  831. or r17, r20
  832. ret
  833. set_trm_depth:
  834. andi r17, 0xF0
  835. or r17, r20
  836. ret
  837. set_portamento:
  838. lsl r20
  839. lsl r20
  840. lsl r20
  841. lsl r20
  842. mov r18, r20
  843. ret
  844. set_vol_slide:
  845. lsl r20
  846. lsl r20
  847. lsl r20
  848. lsl r20
  849. mov r17, r20
  850. ret
  851. inc_dut:
  852. add r19, r20
  853. ret
  854. set_dut:
  855. lsl r20
  856. lsl r20
  857. lsl r20
  858. lsl r20
  859. mov r19, r20
  860. ret
  861. set_wav:
  862. ldi r21, 0b1000
  863. or r21, r20
  864. ret
  865. inc_vol:
  866. add r23, r20
  867. brcs inc_vol1
  868. ret
  869. inc_vol1:
  870. ldi r23, 0xFF
  871. ret
  872. dec_vol:
  873. sub r23, r20
  874. brcs dec_vol1
  875. ret
  876. dec_vol1:
  877. ldi r23, 0x00
  878. ret
  879.  
  880. vol_sweep:
  881. lsr r16
  882. lsr r16
  883. lsr r16
  884. lsr r16
  885. cpi r16, 0
  886. breq vol_equal
  887. cp r17, r18
  888. brlo vol_smaller
  889. cp r18, r17
  890. brlo vol_bigger
  891. rjmp vol_equal
  892. vol_smaller:
  893. add r17, r16
  894. cp r18, r17
  895. brlo vol_equal
  896. ret
  897. vol_bigger:
  898. sub r17, r16
  899. cp r17, r18
  900. brlo vol_equal
  901. ret
  902. vol_equal:
  903. mov r17, r18
  904. ret
  905.  
  906. sweep:
  907. lsr r21
  908. lsr r21
  909. lsr r21
  910. lsr r21
  911. lsl r21
  912. cpi r21, 0
  913. breq equal
  914. cp r23, r17
  915. brlo smaller
  916. cp r17, r23
  917. brlo bigger
  918. cp r22, r16
  919. brlo smaller
  920. cp r16, r22
  921. brlo bigger
  922. rjmp equal
  923. bigger:
  924. sub r22, r21
  925. brcc yeah
  926. dec r23
  927. yeah:
  928. rjmp done_big
  929. done_big:
  930. cp r23, r17
  931. brlo equal
  932. cp r17, r23
  933. brlo return2
  934. cp r22, r16
  935. brlo equal
  936. rjmp return2
  937. smaller:
  938. clr r19
  939. add r22, r21
  940. adc r23, r19
  941. rjmp done_small
  942. done_small:
  943. cp r23, r17
  944. brlo return2
  945. cp r17, r23
  946. brlo equal
  947. cp r22, r16
  948. brlo return2
  949. cp r16, r22
  950. brlo equal
  951. rjmp return2
  952. equal:
  953. mov r22, r16
  954. mov r23, r17
  955. return2:
  956. ret
  957.  
  958. timer:
  959. mov r16, LEFT_BUF
  960. lsr r16
  961. lsr r16
  962. mov r17, RIGHT_BUF
  963. lsr r17
  964. lsr r17
  965. out portd, r16
  966. out portc, r17
  967.  
  968. lds r16, music_timer
  969. lds r17, music_timer + 1
  970. ldi r18, 0
  971. ldi r19, 1
  972. add r16, r19
  973. adc r17, r18
  974. sts music_timer, r16
  975. sts music_timer + 1, r17
  976. lds r18, tempo
  977. cp r17, r18
  978. brlo no_music
  979. rcall music
  980.  
  981. no_music:
  982. clr LEFT_BUF
  983. clr RIGHT_BUF
  984.  
  985. add CHAN1_OSCL, CHAN1_FRQL
  986. adc CHAN1_OSCH, CHAN1_FRQH
  987. add CHAN2_OSCL, CHAN2_FRQL
  988. adc CHAN2_OSCH, CHAN2_FRQH
  989. add CHAN3_OSCL, CHAN3_FRQL
  990. adc CHAN3_OSCH, CHAN3_FRQH
  991. add CHAN4_OSCL, CHAN4_FRQL
  992. adc CHAN4_OSCH, CHAN4_FRQH
  993.  
  994. lds r16, waveform
  995. lds r22, enable
  996.  
  997. mov r18, r16
  998. andi r18, 0b00000011
  999. mov r19, CHAN1_OSCH
  1000. lds r20, chan1_vol
  1001. lds r21, chan1_dut
  1002. rcall generate
  1003. sbrc r22, 0
  1004. add LEFT_BUF, r17
  1005.  
  1006. lsr r16
  1007. lsr r16
  1008. mov r18, r16
  1009. andi r18, 0b00000011
  1010. mov r19, CHAN2_OSCH
  1011. lds r20, chan2_vol
  1012. lds r21, chan2_dut
  1013. rcall generate
  1014. sbrc r22, 1
  1015. add LEFT_BUF, r17
  1016.  
  1017. lsr r16
  1018. lsr r16
  1019. mov r18, r16
  1020. andi r18, 0b00000011
  1021. mov r19, CHAN3_OSCH
  1022. lds r20, chan3_vol
  1023. lds r21, chan3_dut
  1024. rcall generate
  1025. sbrc r22, 2
  1026. add RIGHT_BUF, r17
  1027.  
  1028. lsr r16
  1029. lsr r16
  1030. mov r18, r16
  1031. andi r18, 0b00000011
  1032. mov r19, CHAN4_OSCH
  1033. lds r20, chan4_vol
  1034. lds r21, chan4_dut
  1035. rcall generate
  1036. sbrc r22, 3
  1037. add RIGHT_BUF, r17
  1038.  
  1039. reti
  1040.  
  1041. generate:
  1042. clr r17
  1043. cpi r18, 0b00
  1044. breq gen_pulse
  1045. cpi r18, 0b01
  1046. breq gen_triangle
  1047. cpi r18, 0b10
  1048. breq gen_saw
  1049. cpi r18, 0b11
  1050. breq gen_noise
  1051. ret
  1052.  
  1053. gen_pulse:
  1054. cp r19, r21
  1055. brlo return
  1056. mov r17, r20
  1057. lsr r17
  1058. lsr r17
  1059. ret
  1060.  
  1061. gen_triangle:
  1062. mov r17, r19
  1063. sbrc r19, 7
  1064. com r17
  1065. rjmp apply_volume
  1066. ret
  1067.  
  1068. gen_saw:
  1069. mov r17, r19
  1070. lsr r17
  1071. lsr r17
  1072. rjmp apply_volume
  1073. ret
  1074.  
  1075. gen_noise:
  1076. clr r21
  1077. clr r19
  1078. sbrc NOISEH, 6
  1079. ser r21
  1080. sbrc NOISEL, 3
  1081. ser r19
  1082. eor r19, r21
  1083. clr r21
  1084. lsl NOISEH
  1085. lsl NOISEL
  1086. adc NOISEH, r21
  1087. sbrc r19, 0
  1088. inc NOISEL
  1089. mov r17, NOISEL
  1090. lsr r17
  1091. rjmp apply_volume
  1092. ret
  1093.  
  1094. apply_volume:
  1095. sbrc r20, 7
  1096. rjmp return
  1097. lsr r17
  1098. sbrc r20, 6
  1099. rjmp return
  1100. lsr r17
  1101. sbrc r20, 5
  1102. rjmp return
  1103. lsr r17
  1104. sbrc r20, 4
  1105. rjmp return
  1106. lsr r17
  1107. sbrc r20, 3
  1108. rjmp return
  1109. lsr r17
  1110. sbrc r20, 2
  1111. rjmp return
  1112. lsr r17
  1113. sbrc r20, 1
  1114. rjmp return
  1115. lsr r17
  1116. return:
  1117. ret
  1118.  
  1119. song_data:
  1120. .db 0x00, 0x00, 0xA0, 0x00 ; pulse 1
  1121. .db 0x00, 0x00, 0xA0, 0x00 ; pulse 2
  1122. .db 0x00, 0x00, 0xA1, 0x00 ; triangle
  1123. .db 0x00, 0x00, 0xA3, 0x00 ; noise
  1124.  
  1125.  
  1126.  
  1127.  
  1128. .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
  1129. .db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
  1130. .db 0xB4, 0x70, 0x00, 0x00 ; triangle
  1131. .db 0x40, 0x30, 0xCf, 0x00 ; noise
  1132.  
  1133. .db 0x00, 0x00, 0x92, 0x00 ; pulse 1
  1134. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1135. .db 0x00, 0x00, 0x00, 0x00 ; triangle
  1136. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1137.  
  1138. .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
  1139. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1140. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1141. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1142.  
  1143. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1144. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1145. .db 0x00, 0x00, 0x00, 0x00 ; triangle
  1146. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1147.  
  1148. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1149. .db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
  1150. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1151. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1152.  
  1153. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1154. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1155. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1156. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1157.  
  1158. .db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
  1159. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1160. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1161. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1162.  
  1163. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1164. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1165. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1166. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1167.  
  1168.  
  1169. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1170. .db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
  1171. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1172. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1173.  
  1174. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1175. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1176. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1177. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1178.  
  1179. .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
  1180. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1181. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1182. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1183.  
  1184. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1185. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1186. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1187. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1188.  
  1189. .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
  1190. .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
  1191. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1192. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1193.  
  1194. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1195. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1196. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1197. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1198.  
  1199. .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
  1200. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1201. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1202. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1203.  
  1204. .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
  1205. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1206. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1207. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1208.  
  1209.  
  1210. .db 0xC3, 0xFF, 0x00, 0x00 ; pulse 1
  1211. .db 0xE1, 0xFF, 0x00, 0x00 ; pulse 2
  1212. .db 0x94, 0x00, 0x00, 0x00 ; triangle
  1213. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1214.  
  1215. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1216. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1217. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1218. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1219.  
  1220. .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
  1221. .db 0xE2, 0xFF, 0x00, 0x00 ; pulse 2
  1222. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1223. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1224.  
  1225. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1226. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1227. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1228. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1229.  
  1230. .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
  1231. .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
  1232. .db 0x94, 0x00, 0x00, 0x00 ; triangle
  1233. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1234.  
  1235. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1236. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1237. .db 0xE4, 0x00, 0x00, 0x00 ; triangle
  1238. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1239.  
  1240. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1241. .db 0xE2, 0xFF, 0x00, 0x00 ; pulse 2
  1242. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1243. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1244.  
  1245. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1246. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1247. .db 0xE4, 0x00, 0x00, 0x00 ; triangle
  1248. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1249.  
  1250.  
  1251. .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 1
  1252. .db 0xF1, 0xFF, 0x00, 0x00 ; pulse 2
  1253. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1254. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1255.  
  1256. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1257. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1258. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1259. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1260.  
  1261. .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
  1262. .db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
  1263. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1264. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1265.  
  1266. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1267. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1268. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1269. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1270.  
  1271. .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
  1272. .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
  1273. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1274. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1275.  
  1276. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1277. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1278. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1279. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1280.  
  1281. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1282. .db 0xF2, 0xFF, 0x00, 0x00 ; pulse 2
  1283. .db 0x95, 0x00, 0x00, 0x00 ; triangle
  1284. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1285.  
  1286. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1287. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1288. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1289. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1290.  
  1291.  
  1292.  
  1293. .db 0x00, 0x00, 0x92, 0x00 ; pulse 1
  1294. .db 0x42, 0xFF, 0x88, 0x00 ; pulse 2
  1295. .db 0xB4, 0x70, 0x00, 0x00 ; triangle
  1296. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1297.  
  1298. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1299. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1300. .db 0x00, 0x00, 0x00, 0x00 ; triangle
  1301. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1302.  
  1303. .db 0x44, 0xFF, 0xCf, 0x00 ; pulse 1
  1304. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1305. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1306. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1307.  
  1308. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1309. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1310. .db 0x00, 0x00, 0x00, 0x00 ; triangle
  1311. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1312.  
  1313. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1314. .db 0x73, 0xFF, 0x00, 0x00 ; pulse 2
  1315. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1316. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1317.  
  1318. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1319. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1320. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1321. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1322.  
  1323. .db 0xE3, 0xFF, 0x00, 0x00 ; pulse 1
  1324. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1325. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1326. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1327.  
  1328. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1329. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1330. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1331. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1332.  
  1333.  
  1334. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1335. .db 0x42, 0xFF, 0x00, 0x00 ; pulse 2
  1336. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1337. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1338.  
  1339. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1340. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1341. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1342. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1343.  
  1344. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1345. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1346. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1347. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1348.  
  1349. .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
  1350. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1351. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1352. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1353.  
  1354. .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
  1355. .db 0x63, 0xFF, 0x00, 0x00 ; pulse 2
  1356. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1357. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1358.  
  1359. .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
  1360. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1361. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1362. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1363.  
  1364. .db 0x44, 0xFF, 0x00, 0x00 ; pulse 1
  1365. .db 0x43, 0xFF, 0x00, 0x00 ; pulse 2
  1366. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1367. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1368.  
  1369. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1370. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1371. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1372. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1373.  
  1374.  
  1375. .db 0x94, 0xFF, 0x00, 0x00 ; pulse 1
  1376. .db 0x92, 0xFF, 0x00, 0x00 ; pulse 2
  1377. .db 0xC4, 0x00, 0x00, 0x00 ; triangle
  1378. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1379.  
  1380. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1381. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1382. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1383. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1384.  
  1385. .db 0x00, 0x80, 0x00, 0x00 ; pulse 1
  1386. .db 0x93, 0xFF, 0x00, 0x00 ; pulse 2
  1387. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1388. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1389.  
  1390. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1391. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1392. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1393. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1394.  
  1395. .db 0x00, 0x30, 0x00, 0x00 ; pulse 1
  1396. .db 0xC3, 0xFF, 0x00, 0x00 ; pulse 2
  1397. .db 0xC4, 0x00, 0x00, 0x00 ; triangle
  1398. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1399.  
  1400. .db 0x00, 0x00, 0x00, 0x00 ; pulse 1
  1401. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1402. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1403. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1404.  
  1405. .db 0xB4, 0xFF, 0x00, 0x00 ; pulse 1
  1406. .db 0x93, 0xFF, 0x00, 0x00 ; pulse 2
  1407. .db 0x75, 0x00, 0x00, 0x00 ; triangle
  1408. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1409.  
  1410. .db 0xC4, 0xFF, 0x00, 0x00 ; pulse 1
  1411. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1412. .db 0x45, 0x00, 0x00, 0x00 ; triangle
  1413. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1414.  
  1415.  
  1416. .db 0xB4, 0xFF, 0x00, 0x00 ; pulse 1
  1417. .db 0xB2, 0xFF, 0x00, 0x00 ; pulse 2
  1418. .db 0xB4, 0x00, 0x00, 0x00 ; triangle
  1419. .db 0x40, 0x30, 0x00, 0x00 ; noise
  1420.  
  1421. .db 0xB5, 0xFF, 0x00, 0x00 ; pulse 1
  1422. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1423. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1424. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1425.  
  1426. .db 0x94, 0xFF, 0x00, 0x00 ; pulse 1
  1427. .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
  1428. .db 0xB5, 0x00, 0x00, 0x00 ; triangle
  1429. .db 0x40, 0x20, 0x00, 0x00 ; noise
  1430.  
  1431. .db 0x95, 0xFF, 0x00, 0x00 ; pulse 1
  1432. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1433. .db 0x20, 0x00, 0x00, 0x00 ; triangle
  1434. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1435.  
  1436. .db 0x74, 0xFF, 0x00, 0x00 ; pulse 1
  1437. .db 0xF3, 0xFF, 0x00, 0x00 ; pulse 2
  1438. .db 0xF4, 0x00, 0x00, 0x00 ; triangle
  1439. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1440.  
  1441. .db 0x75, 0xFF, 0x00, 0x00 ; pulse 1
  1442. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1443. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1444. .db 0x20, 0x00, 0x00, 0x00 ; noise
  1445.  
  1446. .db 0x64, 0xFF, 0x00, 0x00 ; pulse 1
  1447. .db 0xB3, 0xFF, 0x00, 0x00 ; pulse 2
  1448. .db 0x95, 0x00, 0x00, 0x00 ; triangle
  1449. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1450.  
  1451. .db 0x65, 0xFF, 0x00, 0x00 ; pulse 1
  1452. .db 0x00, 0xAA, 0x00, 0x00 ; pulse 2
  1453. .db 0x65, 0x00, 0x00, 0x00 ; triangle
  1454. .db 0x40, 0x50, 0x00, 0x00 ; noise
  1455. song_end:
  1456.  
  1457. .dseg
  1458. chan1_vol: .byte 1
  1459. chan2_vol: .byte 1
  1460. chan3_vol: .byte 1
  1461. chan4_vol: .byte 1
  1462.  
  1463. chan1_dut: .byte 1
  1464. chan2_dut: .byte 1
  1465. chan3_dut: .byte 1
  1466. chan4_dut: .byte 1
  1467.  
  1468. fine_tune: .byte 2
  1469. waveform: .byte 1
  1470. enable: .byte 1
  1471. music_timer: .byte 2
  1472. tick_timer: .byte 1
  1473.  
  1474. tempo: .byte 1
  1475. speed: .byte 1
  1476. repeat: .byte 1
  1477.  
  1478. chan1_tvol: .byte 1
  1479. chan2_tvol: .byte 1
  1480. chan3_tvol: .byte 1
  1481. chan4_tvol: .byte 1
  1482.  
  1483. chan1_notes: .byte 2
  1484. chan2_notes: .byte 2
  1485. chan3_notes: .byte 2
  1486. chan4_notes: .byte 2
  1487.  
  1488. chan1_vib: .byte 1
  1489. chan2_vib: .byte 1
  1490. chan3_vib: .byte 1
  1491. chan4_vib: .byte 1
  1492.  
  1493. chan1_trm: .byte 1
  1494. chan2_trm: .byte 1
  1495. chan3_trm: .byte 1
  1496. chan4_trm: .byte 1
  1497.  
  1498. chan1_eff: .byte 1
  1499. chan2_eff: .byte 1
  1500. chan3_eff: .byte 1
  1501. chan4_eff: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement