MegaLoler

Soundchip Backup

Dec 18th, 2012
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.96 KB | None | 0 0
  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 instrumnt which is a list of four effects to be applied per tick
  24. ; each channel has its own extra effect
  25. ;
  26. ; song format:
  27. ; 0x00 - tempo
  28. ; 0x01 - ticks per frame
  29. ; 0x02 - repeat low
  30. ; 0x03 - repeat high
  31. ; [0x10 - 0x4F] - instruments
  32. ; [0x50 - end] - frames
  33. ;
  34. ; instrument format:
  35. ; 0x00 - effect 1
  36. ; 0x01 - effect 2
  37. ; 0x02 - effect 3
  38. ; 0x03 - effect 4
  39. ;
  40. ; effect format:
  41. ; first nybble - effect
  42. ; second nybble - argument
  43. ;
  44. ; frame format:
  45. ; first byte - note
  46. ; second byte - volume
  47. ; third byte - instrument
  48. ; fourth byte - arppegio
  49. ;
  50. ; note format:
  51. ; first nybble - note
  52. ; second nybble - octave
  53. ;
  54. ; notes:
  55. ; 0x0 - null
  56. ; 0x1 - same as root (for arppegio notes)
  57. ; 0x2 - stop
  58. ; 0x3 - revive
  59. ; 0x4 - C
  60. ; 0x5 - C#
  61. ; 0x6 - D
  62. ; 0x7 - D#
  63. ; 0x8 - E
  64. ; 0x9 - F
  65. ; 0xA - F#
  66. ; 0xB - G
  67. ; 0xC - G#
  68. ; 0xD - A
  69. ; 0xE - A#
  70. ; 0xF - B
  71. ;
  72. ; arppegio format:
  73. ; first nybble - note 2 (above octave of note 1)
  74. ; second nybble - note 3 (above octave of note 1)
  75.  
  76. .def LEFT_BUF = r2
  77. .def RIGHT_BUF = r3
  78.  
  79. .def CHAN1_OSCL = r4
  80. .def CHAN1_OSCH = r5
  81. .def CHAN2_OSCL = r6
  82. .def CHAN2_OSCH = r7
  83. .def CHAN3_OSCL = r8
  84. .def CHAN3_OSCH = r9
  85. .def CHAN4_OSCL = r10
  86. .def CHAN4_OSCH = r11
  87.  
  88. .def CHAN1_FRQL = r12
  89. .def CHAN1_FRQH = r13
  90. .def CHAN2_FRQL = r14
  91. .def CHAN2_FRQH = r15
  92. .def CHAN3_FRQL = r24
  93. .def CHAN3_FRQH = r25
  94. .def CHAN4_FRQL = r26
  95. .def CHAN4_FRQH = r27
  96.  
  97. .def NOISEL = r0
  98. .def NOISEH = r1
  99.  
  100. .NOLIST
  101. .include "m48def.inc"
  102. .LIST
  103.  
  104. .cseg
  105. .org 0x00
  106. rjmp start
  107.  
  108. .org 0x09
  109. rjmp timer
  110.  
  111. .org 0x40
  112. start:
  113. ldi r16, LOW(RAMEND)
  114. out spl, r16
  115. ldi r16, HIGH(RAMEND)
  116. out sph, r16
  117.  
  118. ldi r16, 1
  119. sts TIMSK2, r16
  120. ldi r16, 0b001
  121. sts TCCR2B, r16
  122.  
  123. ldi r16, 0xFF
  124. out ddrd, r16
  125. out ddrc, r16
  126.  
  127. ldi r16, 0xFF
  128. mov LEFT_BUF, r16
  129. mov RIGHT_BUF, r16
  130.  
  131. ldi r16, 0x01
  132. mov NOISEL, r16
  133. ldi r16, 0x00
  134. mov NOISEH, r16
  135.  
  136. ldi r16, 0b0101
  137. sts enable, r16
  138.  
  139. ldi r16, 0xFF
  140. sts chan1_vol, r16
  141. sts chan2_vol, r16
  142. sts chan3_vol, r16
  143. sts chan4_vol, r16
  144.  
  145. ldi r16, 0x10
  146. sts chan1_dut, r16
  147. sts chan2_dut, r16
  148. sts chan3_dut, r16
  149. sts chan4_dut, r16
  150.  
  151. ldi r16, 0b11111101
  152. sts waveform, r16
  153.  
  154. ldi r16, LOW(392)
  155. ldi r17, HIGH(392)
  156. mov CHAN1_FRQL, r16
  157. mov CHAN1_FRQH, r17
  158.  
  159. ldi r16, LOW(294)
  160. ldi r17, HIGH(294)
  161. mov CHAN2_FRQL, r16
  162. mov CHAN2_FRQH, r17
  163.  
  164. ldi r16, LOW(349)
  165. ldi r17, HIGH(349)
  166. mov CHAN3_FRQL, r16
  167. mov CHAN3_FRQH, r17
  168.  
  169. ldi r16, LOW(494)
  170. ldi r17, HIGH(494)
  171. mov CHAN4_FRQL, r16
  172. mov CHAN4_FRQH, r17
  173.  
  174. sei
  175.  
  176. loop:
  177. rjmp loop
  178.  
  179. timer:
  180. mov r16, LEFT_BUF
  181. lsr r16
  182. lsr r16
  183. mov r17, RIGHT_BUF
  184. lsr r17
  185. lsr r17
  186. out portd, r16
  187. out portc, r17
  188.  
  189. clr LEFT_BUF
  190. clr RIGHT_BUF
  191.  
  192. add CHAN1_OSCL, CHAN1_FRQL
  193. adc CHAN1_OSCH, CHAN1_FRQH
  194. add CHAN2_OSCL, CHAN2_FRQL
  195. adc CHAN2_OSCH, CHAN2_FRQH
  196. add CHAN3_OSCL, CHAN3_FRQL
  197. adc CHAN3_OSCH, CHAN3_FRQH
  198. add CHAN4_OSCL, CHAN4_FRQL
  199. adc CHAN4_OSCH, CHAN4_FRQH
  200.  
  201. lds r16, waveform
  202. lds r22, enable
  203.  
  204. mov r18, r16
  205. andi r18, 0b00000011
  206. mov r19, CHAN1_OSCH
  207. lds r20, chan1_vol
  208. lds r21, chan1_dut
  209. rcall generate
  210. sbrc r22, 0
  211. add LEFT_BUF, r17
  212.  
  213. lsr r16
  214. lsr r16
  215. mov r18, r16
  216. andi r18, 0b00000011
  217. mov r19, CHAN2_OSCH
  218. lds r20, chan2_vol
  219. lds r21, chan2_dut
  220. rcall generate
  221. sbrc r22, 1
  222. add LEFT_BUF, r17
  223.  
  224. lsr r16
  225. lsr r16
  226. mov r18, r16
  227. andi r18, 0b00000011
  228. mov r19, CHAN3_OSCH
  229. lds r20, chan3_vol
  230. lds r21, chan3_dut
  231. rcall generate
  232. sbrc r22, 2
  233. add RIGHT_BUF, r17
  234.  
  235. lsr r16
  236. lsr r16
  237. mov r18, r16
  238. andi r18, 0b00000011
  239. mov r19, CHAN4_OSCH
  240. lds r20, chan4_vol
  241. lds r21, chan4_dut
  242. rcall generate
  243. sbrc r22, 3
  244. add RIGHT_BUF, r17
  245.  
  246. reti
  247.  
  248. generate:
  249. clr r17
  250. cpi r18, 0b00
  251. breq gen_pulse
  252. cpi r18, 0b01
  253. breq gen_triangle
  254. cpi r18, 0b10
  255. breq gen_saw
  256. cpi r18, 0b11
  257. breq gen_noise
  258. ret
  259.  
  260. gen_pulse:
  261. cp r19, r21
  262. brlo return
  263. mov r17, r20
  264. lsr r17
  265. lsr r17
  266. ret
  267.  
  268. gen_triangle:
  269. mov r17, r19
  270. sbrc r19, 7
  271. com r17
  272. rjmp apply_volume
  273. ret
  274.  
  275. gen_saw:
  276. mov r17, r19
  277. lsr r17
  278. lsr r17
  279. rjmp apply_volume
  280. ret
  281.  
  282. gen_noise:
  283. clr r21
  284. clr r19
  285. sbrc NOISEH, 6
  286. ser r21
  287. sbrc NOISEL, 3
  288. ser r19
  289. eor r19, r21
  290. clr r21
  291. lsl NOISEH
  292. lsl NOISEL
  293. adc NOISEH, r21
  294. sbrc r19, 0
  295. inc NOISEL
  296. mov r17, NOISEL
  297. lsr r17
  298. rjmp apply_volume
  299. ret
  300.  
  301. apply_volume:
  302. sbrc r20, 7
  303. rjmp return
  304. lsr r17
  305. sbrc r20, 6
  306. rjmp return
  307. lsr r17
  308. sbrc r20, 5
  309. rjmp return
  310. lsr r17
  311. sbrc r20, 4
  312. rjmp return
  313. lsr r17
  314. sbrc r20, 3
  315. rjmp return
  316. lsr r17
  317. sbrc r20, 2
  318. rjmp return
  319. lsr r17
  320. sbrc r20, 1
  321. rjmp return
  322. lsr r17
  323. return:
  324. ret
  325.  
  326. .dseg
  327. chan1_vol: .byte 1
  328. chan2_vol: .byte 1
  329. chan3_vol: .byte 1
  330. chan4_vol: .byte 1
  331.  
  332. chan1_dut: .byte 1
  333. chan2_dut: .byte 1
  334. chan3_dut: .byte 1
  335. chan4_dut: .byte 1
  336.  
  337. fine_tune: .byte 2
  338. waveform: .byte 1
  339. enable: .byte 1
Advertisement
Add Comment
Please, Sign In to add comment