engine_3.asm 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685
  1. ; The third of three duplicated sound engines.
  2. Audio3_UpdateMusic::
  3. ld c, Ch0
  4. .loop
  5. ld b, $0
  6. ld hl, wChannelSoundIDs
  7. add hl, bc
  8. ld a, [hl]
  9. and a
  10. jr z, .nextChannel
  11. ld a, c
  12. cp Ch4
  13. jr nc, .applyAffects ; if sfx channel
  14. ld a, [wMuteAudioAndPauseMusic]
  15. and a
  16. jr z, .applyAffects
  17. bit 7, a
  18. jr nz, .nextChannel
  19. set 7, a
  20. ld [wMuteAudioAndPauseMusic], a
  21. xor a
  22. ld [rNR51], a
  23. ld [rNR30], a
  24. ld a, $80
  25. ld [rNR30], a
  26. jr .nextChannel
  27. .applyAffects
  28. call Audio3_ApplyMusicAffects
  29. .nextChannel
  30. ld a, c
  31. inc c ; inc channel number
  32. cp Ch7
  33. jr nz, .loop
  34. ret
  35. ; this routine checks flags for music effects currently applied
  36. ; to the channel and calls certain functions based on flags.
  37. ; known flags for wChannelFlags1:
  38. ; 0: toggleperfectpitch has been used
  39. ; 1: call has been used
  40. ; 3: a toggle used only by this routine for vibrato
  41. ; 4: pitchbend flag
  42. ; 6: dutycycle flag
  43. Audio3_ApplyMusicAffects:
  44. ld b, $0
  45. ld hl, wChannelNoteDelayCounters ; delay until next note
  46. add hl, bc
  47. ld a, [hl]
  48. cp $1 ; if delay is 1, play next note
  49. jp z, Audio3_PlayNextNote
  50. dec a ; otherwise, decrease the delay timer
  51. ld [hl], a
  52. ld a, c
  53. cp Ch4
  54. jr nc, .startChecks ; if a sfx channel
  55. ld hl, wChannelSoundIDs + Ch4
  56. add hl, bc
  57. ld a, [hl]
  58. and a
  59. jr z, .startChecks
  60. ret
  61. .startChecks
  62. ld hl, wChannelFlags1
  63. add hl, bc
  64. bit 6, [hl] ; dutycycle
  65. jr z, .checkForExecuteMusic
  66. call Audio3_ApplyDutyCycle
  67. .checkForExecuteMusic
  68. ld b, $0
  69. ld hl, wChannelFlags2
  70. add hl, bc
  71. bit 0, [hl]
  72. jr nz, .checkForPitchBend
  73. ld hl, wChannelFlags1
  74. add hl, bc
  75. bit 2, [hl]
  76. jr nz, .disablePitchBendVibrato
  77. .checkForPitchBend
  78. ld hl, wChannelFlags1
  79. add hl, bc
  80. bit 4, [hl] ; pitchbend
  81. jr z, .checkVibratoDelay
  82. jp Audio3_ApplyPitchBend
  83. .checkVibratoDelay
  84. ld hl, wChannelVibratoDelayCounters ; vibrato delay
  85. add hl, bc
  86. ld a, [hl]
  87. and a ; check if delay is over
  88. jr z, .checkForVibrato
  89. dec [hl] ; otherwise, dec delay
  90. .disablePitchBendVibrato
  91. ret
  92. .checkForVibrato
  93. ld hl, wChannelVibratoExtents ; vibrato rate
  94. add hl, bc
  95. ld a, [hl]
  96. and a
  97. jr nz, .vibrato
  98. ret ; no vibrato
  99. .vibrato
  100. ld d, a
  101. ld hl, wChannelVibratoRates
  102. add hl, bc
  103. ld a, [hl]
  104. and $f
  105. and a
  106. jr z, .vibratoAlreadyDone
  107. dec [hl] ; apply vibrato pitch change
  108. ret
  109. .vibratoAlreadyDone
  110. ld a, [hl]
  111. swap [hl]
  112. or [hl]
  113. ld [hl], a ; reset the vibrato value and start again
  114. ld hl, wChannelFrequencyLowBytes
  115. add hl, bc
  116. ld e, [hl] ; get note pitch
  117. ld hl, wChannelFlags1
  118. add hl, bc
  119. bit 3, [hl] ; this is the only code that sets/resets bit three so
  120. jr z, .unset ; it continuously alternates which path it takes
  121. res 3, [hl]
  122. ld a, d
  123. and $f
  124. ld d, a
  125. ld a, e
  126. sub d
  127. jr nc, .noCarry
  128. ld a, $0
  129. .noCarry
  130. jr .done
  131. .unset
  132. set 3, [hl]
  133. ld a, d
  134. and $f0
  135. swap a
  136. add e
  137. jr nc, .done
  138. ld a, $ff
  139. .done
  140. ld d, a
  141. ld b, $3
  142. call Audio3_7d8ac
  143. ld [hl], d
  144. ret
  145. ; this routine executes all music commands that take up no time,
  146. ; like tempo changes, duty changes etc. and doesn't return
  147. ; until the first note is reached
  148. Audio3_PlayNextNote:
  149. ld hl, wChannelVibratoDelayCounterReloadValues
  150. add hl, bc
  151. ld a, [hl]
  152. ld hl, wChannelVibratoDelayCounters
  153. add hl, bc
  154. ld [hl], a
  155. ld hl, wChannelFlags1
  156. add hl, bc
  157. res 4, [hl]
  158. res 5, [hl]
  159. call Audio3_endchannel
  160. ret
  161. Audio3_endchannel:
  162. call Audio3_GetNextMusicByte
  163. ld d, a
  164. cp $ff ; is this command an endchannel?
  165. jp nz, Audio3_callchannel ; no
  166. ld b, $0 ; yes
  167. ld hl, wChannelFlags1
  168. add hl, bc
  169. bit 1, [hl]
  170. jr nz, .returnFromCall
  171. ld a, c
  172. cp Ch3
  173. jr nc, .noiseOrSfxChannel
  174. jr .asm_7d2b3
  175. .noiseOrSfxChannel
  176. res 2, [hl]
  177. ld hl, wChannelFlags2
  178. add hl, bc
  179. res 0, [hl]
  180. cp Ch6
  181. jr nz, .notSfxChannel3
  182. ld a, $0
  183. ld [rNR30], a
  184. ld a, $80
  185. ld [rNR30], a
  186. .notSfxChannel3
  187. jr nz, .asm_7d296
  188. ld a, [wDisableChannelOutputWhenSfxEnds]
  189. and a
  190. jr z, .asm_7d296
  191. xor a
  192. ld [wDisableChannelOutputWhenSfxEnds], a
  193. jr .asm_7d2b3
  194. .asm_7d296
  195. jr .asm_7d2bc
  196. .returnFromCall
  197. res 1, [hl]
  198. ld d, $0
  199. ld a, c
  200. add a
  201. ld e, a
  202. ld hl, wChannelCommandPointers
  203. add hl, de
  204. push hl ; store current channel address
  205. ld hl, wChannelReturnAddresses
  206. add hl, de
  207. ld e, l
  208. ld d, h
  209. pop hl
  210. ld a, [de]
  211. ld [hli], a
  212. inc de
  213. ld a, [de]
  214. ld [hl], a ; loads channel address to return to
  215. jp Audio3_endchannel
  216. .asm_7d2b3
  217. ld hl, Unknown_7db93
  218. add hl, bc
  219. ld a, [rNR51]
  220. and [hl]
  221. ld [rNR51], a
  222. .asm_7d2bc
  223. ld a, [wChannelSoundIDs + Ch4]
  224. cp $14
  225. jr nc, .asm_7d2c5
  226. jr .asm_7d2e2
  227. .asm_7d2c5
  228. ld a, [wChannelSoundIDs + Ch4]
  229. cp $86
  230. jr z, .asm_7d2e2
  231. jr c, .asm_7d2d0
  232. jr .asm_7d2e2
  233. .asm_7d2d0
  234. ld a, c
  235. cp Ch4
  236. jr z, .asm_7d2d9
  237. call Audio3_7d73b
  238. ret c
  239. .asm_7d2d9
  240. ld a, [wSavedVolume]
  241. ld [rNR50], a
  242. xor a
  243. ld [wSavedVolume], a
  244. .asm_7d2e2
  245. ld hl, wChannelSoundIDs
  246. add hl, bc
  247. ld [hl], b
  248. ret
  249. Audio3_callchannel:
  250. cp $fd ; is this command a callchannel?
  251. jp nz, Audio3_loopchannel ; no
  252. call Audio3_GetNextMusicByte ; yes
  253. push af
  254. call Audio3_GetNextMusicByte
  255. ld d, a
  256. pop af
  257. ld e, a
  258. push de ; store pointer
  259. ld d, $0
  260. ld a, c
  261. add a
  262. ld e, a
  263. ld hl, wChannelCommandPointers
  264. add hl, de
  265. push hl
  266. ld hl, wChannelReturnAddresses
  267. add hl, de
  268. ld e, l
  269. ld d, h
  270. pop hl
  271. ld a, [hli]
  272. ld [de], a
  273. inc de
  274. ld a, [hld]
  275. ld [de], a ; copy current channel address
  276. pop de
  277. ld [hl], e
  278. inc hl
  279. ld [hl], d ; overwrite current address with pointer
  280. ld b, $0
  281. ld hl, wChannelFlags1
  282. add hl, bc
  283. set 1, [hl] ; set the call flag
  284. jp Audio3_endchannel
  285. Audio3_loopchannel:
  286. cp $fe ; is this command a loopchannel?
  287. jp nz, Audio3_notetype ; no
  288. call Audio3_GetNextMusicByte ; yes
  289. ld e, a
  290. and a
  291. jr z, .infiniteLoop
  292. ld b, $0
  293. ld hl, wChannelLoopCounters
  294. add hl, bc
  295. ld a, [hl]
  296. cp e
  297. jr nz, .loopAgain
  298. ld a, $1 ; if no more loops to make
  299. ld [hl], a
  300. call Audio3_GetNextMusicByte ; skip pointer
  301. call Audio3_GetNextMusicByte
  302. jp Audio3_endchannel
  303. .loopAgain ; inc loop count
  304. inc a
  305. ld [hl], a
  306. ; fall through
  307. .infiniteLoop ; overwrite current address with pointer
  308. call Audio3_GetNextMusicByte
  309. push af
  310. call Audio3_GetNextMusicByte
  311. ld b, a
  312. ld d, $0
  313. ld a, c
  314. add a
  315. ld e, a
  316. ld hl, wChannelCommandPointers
  317. add hl, de
  318. pop af
  319. ld [hli], a
  320. ld [hl], b
  321. jp Audio3_endchannel
  322. Audio3_notetype:
  323. and $f0
  324. cp $d0 ; is this command a notetype?
  325. jp nz, Audio3_toggleperfectpitch ; no
  326. ld a, d ; yes
  327. and $f
  328. ld b, $0
  329. ld hl, wChannelNoteSpeeds
  330. add hl, bc
  331. ld [hl], a ; store low nibble as speed
  332. ld a, c
  333. cp Ch3
  334. jr z, .noiseChannel ; noise channel has 0 params
  335. call Audio3_GetNextMusicByte
  336. ld d, a
  337. ld a, c
  338. cp Ch2
  339. jr z, .musicChannel3
  340. cp Ch6
  341. jr nz, .notChannel3
  342. ld hl, wSfxWaveInstrument
  343. jr .sfxChannel3
  344. .musicChannel3
  345. ld hl, wMusicWaveInstrument
  346. .sfxChannel3
  347. ld a, d
  348. and $f
  349. ld [hl], a ; store low nibble of param as duty
  350. ld a, d
  351. and $30
  352. sla a
  353. ld d, a
  354. ; fall through
  355. ; if channel 3, store high nibble as volume
  356. ; else, store volume (high nibble) and fade (low nibble)
  357. .notChannel3
  358. ld b, $0
  359. ld hl, wChannelVolumes
  360. add hl, bc
  361. ld [hl], d
  362. .noiseChannel
  363. jp Audio3_endchannel
  364. Audio3_toggleperfectpitch:
  365. ld a, d
  366. cp $e8 ; is this command a toggleperfectpitch?
  367. jr nz, Audio3_vibrato ; no
  368. ld b, $0 ; yes
  369. ld hl, wChannelFlags1
  370. add hl, bc
  371. ld a, [hl]
  372. xor $1
  373. ld [hl], a ; flip bit 0 of wChannelFlags1
  374. jp Audio3_endchannel
  375. Audio3_vibrato:
  376. cp $ea ; is this command a vibrato?
  377. jr nz, Audio3_pitchbend ; no
  378. call Audio3_GetNextMusicByte ; yes
  379. ld b, $0
  380. ld hl, wChannelVibratoDelayCounters
  381. add hl, bc
  382. ld [hl], a ; store delay
  383. ld hl, wChannelVibratoDelayCounterReloadValues
  384. add hl, bc
  385. ld [hl], a ; store delay
  386. call Audio3_GetNextMusicByte
  387. ld d, a
  388. and $f0
  389. swap a
  390. ld b, $0
  391. ld hl, wChannelVibratoExtents
  392. add hl, bc
  393. srl a
  394. ld e, a
  395. adc b
  396. swap a
  397. or e
  398. ld [hl], a ; store rate as both high and low nibbles
  399. ld a, d
  400. and $f
  401. ld d, a
  402. ld hl, wChannelVibratoRates
  403. add hl, bc
  404. swap a
  405. or d
  406. ld [hl], a ; store depth as both high and low nibbles
  407. jp Audio3_endchannel
  408. Audio3_pitchbend:
  409. cp $eb ; is this command a pitchbend?
  410. jr nz, Audio3_duty ; no
  411. call Audio3_GetNextMusicByte ; yes
  412. ld b, $0
  413. ld hl, wChannelPitchBendLengthModifiers
  414. add hl, bc
  415. ld [hl], a ; store first param
  416. call Audio3_GetNextMusicByte
  417. ld d, a
  418. and $f0
  419. swap a
  420. ld b, a
  421. ld a, d
  422. and $f
  423. call Audio3_7d8cc
  424. ld b, $0
  425. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  426. add hl, bc
  427. ld [hl], d ; store unknown part of second param
  428. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  429. add hl, bc
  430. ld [hl], e ; store unknown part of second param
  431. ld b, $0
  432. ld hl, wChannelFlags1
  433. add hl, bc
  434. set 4, [hl] ; set pitchbend flag
  435. call Audio3_GetNextMusicByte
  436. ld d, a
  437. jp Audio3_notelength
  438. Audio3_duty:
  439. cp $ec ; is this command a duty?
  440. jr nz, Audio3_tempo ; no
  441. call Audio3_GetNextMusicByte ; yes
  442. rrca
  443. rrca
  444. and $c0
  445. ld b, $0
  446. ld hl, wChannelDuties
  447. add hl, bc
  448. ld [hl], a ; store duty
  449. jp Audio3_endchannel
  450. Audio3_tempo:
  451. cp $ed ; is this command a tempo?
  452. jr nz, Audio3_stereopanning ; no
  453. ld a, c ; yes
  454. cp Ch4
  455. jr nc, .sfxChannel
  456. call Audio3_GetNextMusicByte
  457. ld [wMusicTempo], a ; store first param
  458. call Audio3_GetNextMusicByte
  459. ld [wMusicTempo + 1], a ; store second param
  460. xor a
  461. ld [wChannelNoteDelayCountersFractionalPart], a ; clear RAM
  462. ld [wChannelNoteDelayCountersFractionalPart + 1], a
  463. ld [wChannelNoteDelayCountersFractionalPart + 2], a
  464. ld [wChannelNoteDelayCountersFractionalPart + 3], a
  465. jr .musicChannelDone
  466. .sfxChannel
  467. call Audio3_GetNextMusicByte
  468. ld [wSfxTempo], a ; store first param
  469. call Audio3_GetNextMusicByte
  470. ld [wSfxTempo + 1], a ; store second param
  471. xor a
  472. ld [wChannelNoteDelayCountersFractionalPart + 4], a ; clear RAM
  473. ld [wChannelNoteDelayCountersFractionalPart + 5], a
  474. ld [wChannelNoteDelayCountersFractionalPart + 6], a
  475. ld [wChannelNoteDelayCountersFractionalPart + 7], a
  476. .musicChannelDone
  477. jp Audio3_endchannel
  478. Audio3_stereopanning:
  479. cp $ee ; is this command a stereopanning?
  480. jr nz, Audio3_unknownmusic0xef ; no
  481. call Audio3_GetNextMusicByte ; yes
  482. ld [wStereoPanning], a ; store panning
  483. jp Audio3_endchannel
  484. ; this appears to never be used
  485. Audio3_unknownmusic0xef:
  486. cp $ef ; is this command an unknownmusic0xef?
  487. jr nz, Audio3_dutycycle ; no
  488. call Audio3_GetNextMusicByte ; yes
  489. push bc
  490. call Audio3_PlaySound
  491. pop bc
  492. ld a, [wDisableChannelOutputWhenSfxEnds]
  493. and a
  494. jr nz, .skip
  495. ld a, [wChannelSoundIDs + Ch7]
  496. ld [wDisableChannelOutputWhenSfxEnds], a
  497. xor a
  498. ld [wChannelSoundIDs + Ch7], a
  499. .skip
  500. jp Audio3_endchannel
  501. Audio3_dutycycle:
  502. cp $fc ; is this command a dutycycle?
  503. jr nz, Audio3_volume ; no
  504. call Audio3_GetNextMusicByte ; yes
  505. ld b, $0
  506. ld hl, wChannelDutyCycles
  507. add hl, bc
  508. ld [hl], a ; store full cycle
  509. and $c0
  510. ld hl, wChannelDuties
  511. add hl, bc
  512. ld [hl], a ; store first duty
  513. ld hl, wChannelFlags1
  514. add hl, bc
  515. set 6, [hl] ; set duty flag
  516. jp Audio3_endchannel
  517. Audio3_volume:
  518. cp $f0 ; is this command a volume?
  519. jr nz, Audio3_executemusic ; no
  520. call Audio3_GetNextMusicByte ; yes
  521. ld [rNR50], a ; store volume
  522. jp Audio3_endchannel
  523. Audio3_executemusic:
  524. cp $f8 ; is this command an executemusic?
  525. jr nz, Audio3_octave ; no
  526. ld b, $0 ; yes
  527. ld hl, wChannelFlags2
  528. add hl, bc
  529. set 0, [hl]
  530. jp Audio3_endchannel
  531. Audio3_octave:
  532. and $f0
  533. cp $e0 ; is this command an octave?
  534. jr nz, Audio3_sfxnote ; no
  535. ld hl, wChannelOctaves ; yes
  536. ld b, $0
  537. add hl, bc
  538. ld a, d
  539. and $f
  540. ld [hl], a ; store low nibble as octave
  541. jp Audio3_endchannel
  542. ; sfxnote is either squarenote or noisenote depending on the channel
  543. Audio3_sfxnote:
  544. cp $20 ; is this command an sfxnote?
  545. jr nz, Audio3_pitchenvelope ; no
  546. ld a, c
  547. cp Ch3 ; is this a noise or sfx channel?
  548. jr c, Audio3_pitchenvelope ; no
  549. ld b, $0
  550. ld hl, wChannelFlags2
  551. add hl, bc
  552. bit 0, [hl]
  553. jr nz, Audio3_pitchenvelope ; no
  554. call Audio3_notelength ; yes
  555. ld d, a
  556. ld b, $0
  557. ld hl, wChannelDuties
  558. add hl, bc
  559. ld a, [hl]
  560. or d
  561. ld d, a
  562. ld b, $1
  563. call Audio3_7d8ac
  564. ld [hl], d
  565. call Audio3_GetNextMusicByte
  566. ld d, a
  567. ld b, $2
  568. call Audio3_7d8ac
  569. ld [hl], d
  570. call Audio3_GetNextMusicByte
  571. ld e, a
  572. ld a, c
  573. cp Ch7
  574. ld a, $0
  575. jr z, .sfxNoiseChannel ; only two params for noise channel
  576. push de
  577. call Audio3_GetNextMusicByte
  578. pop de
  579. .sfxNoiseChannel
  580. ld d, a
  581. push de
  582. call Audio3_7d69d
  583. call Audio3_7d66c
  584. pop de
  585. call Audio3_7d6bf
  586. ret
  587. Audio3_pitchenvelope:
  588. ld a, c
  589. cp Ch4
  590. jr c, Audio3_note ; if not a sfx
  591. ld a, d
  592. cp $10 ; is this command an pitchenvelope?
  593. jr nz, Audio3_note ; no
  594. ld b, $0
  595. ld hl, wChannelFlags2
  596. add hl, bc
  597. bit 0, [hl]
  598. jr nz, Audio3_note ; no
  599. call Audio3_GetNextMusicByte ; yes
  600. ld [rNR10], a
  601. jp Audio3_endchannel
  602. Audio3_note:
  603. ld a, c
  604. cp Ch3
  605. jr nz, Audio3_notelength ; if not noise channel
  606. ld a, d
  607. and $f0
  608. cp $b0 ; is this command a dnote?
  609. jr z, Audio3_dnote ; yes
  610. jr nc, Audio3_notelength ; no
  611. swap a
  612. ld b, a
  613. ld a, d
  614. and $f
  615. ld d, a
  616. ld a, b
  617. push de
  618. push bc
  619. jr asm_7d571
  620. Audio3_dnote:
  621. ld a, d
  622. and $f
  623. push af
  624. push bc
  625. call Audio3_GetNextMusicByte ; get dnote instrument
  626. asm_7d571
  627. ld d, a
  628. ld a, [wDisableChannelOutputWhenSfxEnds]
  629. and a
  630. jr nz, .asm_7d57c
  631. ld a, d
  632. call Audio3_PlaySound
  633. .asm_7d57c
  634. pop bc
  635. pop de
  636. Audio3_notelength:
  637. ld a, d
  638. push af
  639. and $f
  640. inc a
  641. ld b, $0
  642. ld e, a ; store note length (in 16ths)
  643. ld d, b
  644. ld hl, wChannelNoteSpeeds
  645. add hl, bc
  646. ld a, [hl]
  647. ld l, b
  648. call Audio3_7d8bb
  649. ld a, c
  650. cp Ch4
  651. jr nc, .sfxChannel
  652. ld a, [wMusicTempo]
  653. ld d, a
  654. ld a, [wMusicTempo + 1]
  655. ld e, a
  656. jr .skip
  657. .sfxChannel
  658. ld d, $1
  659. ld e, $0
  660. cp Ch7
  661. jr z, .skip ; if noise channel
  662. call Audio3_7d707
  663. ld a, [wSfxTempo]
  664. ld d, a
  665. ld a, [wSfxTempo + 1]
  666. ld e, a
  667. .skip
  668. ld a, l
  669. ld b, $0
  670. ld hl, wChannelNoteDelayCountersFractionalPart
  671. add hl, bc
  672. ld l, [hl]
  673. call Audio3_7d8bb
  674. ld e, l
  675. ld d, h
  676. ld hl, wChannelNoteDelayCountersFractionalPart
  677. add hl, bc
  678. ld [hl], e
  679. ld a, d
  680. ld hl, wChannelNoteDelayCounters
  681. add hl, bc
  682. ld [hl], a
  683. ld hl, wChannelFlags2
  684. add hl, bc
  685. bit 0, [hl]
  686. jr nz, Audio3_notepitch
  687. ld hl, wChannelFlags1
  688. add hl, bc
  689. bit 2, [hl]
  690. jr z, Audio3_notepitch
  691. pop hl
  692. ret
  693. Audio3_notepitch:
  694. pop af
  695. and $f0
  696. cp $c0 ; compare to rest
  697. jr nz, .notRest
  698. ld a, c
  699. cp Ch4
  700. jr nc, .sfxChannel
  701. ld hl, wChannelSoundIDs + Ch4
  702. add hl, bc
  703. ld a, [hl]
  704. and a
  705. jr nz, .quit
  706. ; fall through
  707. .sfxChannel
  708. ld a, c
  709. cp Ch2
  710. jr z, .musicChannel3
  711. cp Ch6
  712. jr nz, .notSfxChannel3
  713. .musicChannel3
  714. ld b, $0
  715. ld hl, Unknown_7db93
  716. add hl, bc
  717. ld a, [rNR51]
  718. and [hl]
  719. ld [rNR51], a
  720. jr .quit
  721. .notSfxChannel3
  722. ld b, $2
  723. call Audio3_7d8ac
  724. ld a, $8
  725. ld [hli], a
  726. inc hl
  727. ld a, $80
  728. ld [hl], a
  729. .quit
  730. ret
  731. .notRest
  732. swap a
  733. ld b, $0
  734. ld hl, wChannelOctaves
  735. add hl, bc
  736. ld b, [hl]
  737. call Audio3_7d8cc
  738. ld b, $0
  739. ld hl, wChannelFlags1
  740. add hl, bc
  741. bit 4, [hl]
  742. jr z, .asm_7d62c
  743. call Audio3_7d803
  744. .asm_7d62c
  745. push de
  746. ld a, c
  747. cp Ch4
  748. jr nc, .skip ; if sfx Channel
  749. ld hl, wChannelSoundIDs + Ch4
  750. ld d, $0
  751. ld e, a
  752. add hl, de
  753. ld a, [hl]
  754. and a
  755. jr nz, .done
  756. jr .skip
  757. .done
  758. pop de
  759. ret
  760. .skip
  761. ld b, $0
  762. ld hl, wChannelVolumes
  763. add hl, bc
  764. ld d, [hl]
  765. ld b, $2
  766. call Audio3_7d8ac
  767. ld [hl], d
  768. call Audio3_7d69d
  769. call Audio3_7d66c
  770. pop de
  771. ld b, $0
  772. ld hl, wChannelFlags1
  773. add hl, bc
  774. bit 0, [hl] ; has toggleperfectpitch been used?
  775. jr z, .skip2
  776. inc e ; if yes, increment the pitch by 1
  777. jr nc, .skip2
  778. inc d
  779. .skip2
  780. ld hl, wChannelFrequencyLowBytes
  781. add hl, bc
  782. ld [hl], e
  783. call Audio3_7d6bf
  784. ret
  785. Audio3_7d66c:
  786. ld b, $0
  787. ld hl, Unknown_7db9b
  788. add hl, bc
  789. ld a, [rNR51]
  790. or [hl]
  791. ld d, a
  792. ld a, c
  793. cp Ch7
  794. jr z, .sfxNoiseChannel
  795. cp Ch4
  796. jr nc, .skip ; if sfx channel
  797. ld hl, wChannelSoundIDs + Ch4
  798. add hl, bc
  799. ld a, [hl]
  800. and a
  801. jr nz, .skip
  802. .sfxNoiseChannel
  803. ld a, [wStereoPanning]
  804. ld hl, Unknown_7db9b
  805. add hl, bc
  806. and [hl]
  807. ld d, a
  808. ld a, [rNR51]
  809. ld hl, Unknown_7db93
  810. add hl, bc
  811. and [hl]
  812. or d
  813. ld d, a
  814. .skip
  815. ld a, d
  816. ld [rNR51], a
  817. ret
  818. Audio3_7d69d:
  819. ld b, $0
  820. ld hl, wChannelNoteDelayCounters
  821. add hl, bc
  822. ld d, [hl]
  823. ld a, c
  824. cp Ch2
  825. jr z, .channel3 ; if music channel 3
  826. cp Ch6
  827. jr z, .channel3 ; if sfx channel 3
  828. ld a, d
  829. and $3f
  830. ld d, a
  831. ld hl, wChannelDuties
  832. add hl, bc
  833. ld a, [hl]
  834. or d
  835. ld d, a
  836. .channel3
  837. ld b, $1
  838. call Audio3_7d8ac
  839. ld [hl], d
  840. ret
  841. Audio3_7d6bf:
  842. ld a, c
  843. cp Ch2
  844. jr z, .channel3
  845. cp Ch6
  846. jr nz, .notSfxChannel3
  847. ; fall through
  848. .channel3
  849. push de
  850. ld de, wMusicWaveInstrument
  851. cp Ch2
  852. jr z, .musicChannel3
  853. ld de, wSfxWaveInstrument
  854. .musicChannel3
  855. ld a, [de]
  856. add a
  857. ld d, $0
  858. ld e, a
  859. ld hl, Audio3_WavePointers
  860. add hl, de
  861. ld e, [hl]
  862. inc hl
  863. ld d, [hl]
  864. ld hl, $ff30
  865. ld b, $f
  866. ld a, $0
  867. ld [rNR30], a
  868. .loop
  869. ld a, [de]
  870. inc de
  871. ld [hli], a
  872. ld a, b
  873. dec b
  874. and a
  875. jr nz, .loop
  876. ld a, $80
  877. ld [rNR30], a
  878. pop de
  879. .notSfxChannel3
  880. ld a, d
  881. or $80
  882. and $c7
  883. ld d, a
  884. ld b, $3
  885. call Audio3_7d8ac
  886. ld [hl], e
  887. inc hl
  888. ld [hl], d
  889. call Audio3_7d729
  890. ret
  891. Audio3_7d707:
  892. call Audio3_7d759
  893. jr nc, .asm_7d71f
  894. ld d, $0
  895. ld a, [wTempoModifier]
  896. add $80
  897. jr nc, .asm_7d716
  898. inc d
  899. .asm_7d716
  900. ld [wSfxTempo + 1], a
  901. ld a, d
  902. ld [wSfxTempo], a
  903. jr .asm_7d728
  904. .asm_7d71f
  905. xor a
  906. ld [wSfxTempo + 1], a
  907. ld a, $1
  908. ld [wSfxTempo], a
  909. .asm_7d728
  910. ret
  911. Audio3_7d729:
  912. call Audio3_7d759
  913. jr nc, .asm_7d73a
  914. ld a, [wFrequencyModifier]
  915. add e
  916. jr nc, .asm_7d735
  917. inc d
  918. .asm_7d735
  919. dec hl
  920. ld e, a
  921. ld [hl], e
  922. inc hl
  923. ld [hl], d
  924. .asm_7d73a
  925. ret
  926. Audio3_7d73b:
  927. call Audio3_7d759
  928. jr nc, .asm_7d756
  929. ld hl, wChannelCommandPointers
  930. ld e, c
  931. ld d, $0
  932. sla e
  933. rl d
  934. add hl, de
  935. ld a, [hl]
  936. sub $1
  937. ld [hl], a
  938. inc hl
  939. ld a, [hl]
  940. sbc $0
  941. ld [hl], a
  942. scf
  943. ret
  944. .asm_7d756
  945. scf
  946. ccf
  947. ret
  948. Audio3_7d759:
  949. ld a, [wChannelSoundIDs + Ch4]
  950. cp $14
  951. jr nc, .asm_7d762
  952. jr .asm_7d768
  953. .asm_7d762
  954. cp $86
  955. jr z, .asm_7d768
  956. jr c, .asm_7d76b
  957. .asm_7d768
  958. scf
  959. ccf
  960. ret
  961. .asm_7d76b
  962. scf
  963. ret
  964. Audio3_ApplyPitchBend:
  965. ld hl, wChannelFlags1
  966. add hl, bc
  967. bit 5, [hl]
  968. jp nz, .asm_7d7b4
  969. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  970. add hl, bc
  971. ld e, [hl]
  972. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  973. add hl, bc
  974. ld d, [hl]
  975. ld hl, wChannelPitchBendFrequencySteps
  976. add hl, bc
  977. ld l, [hl]
  978. ld h, b
  979. add hl, de
  980. ld d, h
  981. ld e, l
  982. ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
  983. add hl, bc
  984. push hl
  985. ld hl, wChannelPitchBendFrequencyStepsFractionalPart
  986. add hl, bc
  987. ld a, [hl]
  988. pop hl
  989. add [hl]
  990. ld [hl], a
  991. ld a, $0
  992. adc e
  993. ld e, a
  994. ld a, $0
  995. adc d
  996. ld d, a
  997. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  998. add hl, bc
  999. ld a, [hl]
  1000. cp d
  1001. jp c, .asm_7d7fa
  1002. jr nz, .asm_7d7e7
  1003. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1004. add hl, bc
  1005. ld a, [hl]
  1006. cp e
  1007. jp c, .asm_7d7fa
  1008. jr .asm_7d7e7
  1009. .asm_7d7b4
  1010. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1011. add hl, bc
  1012. ld a, [hl]
  1013. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1014. add hl, bc
  1015. ld d, [hl]
  1016. ld hl, wChannelPitchBendFrequencySteps
  1017. add hl, bc
  1018. ld e, [hl]
  1019. sub e
  1020. ld e, a
  1021. ld a, d
  1022. sbc b
  1023. ld d, a
  1024. ld hl, wChannelPitchBendFrequencyStepsFractionalPart
  1025. add hl, bc
  1026. ld a, [hl]
  1027. add a
  1028. ld [hl], a
  1029. ld a, e
  1030. sbc b
  1031. ld e, a
  1032. ld a, d
  1033. sbc b
  1034. ld d, a
  1035. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  1036. add hl, bc
  1037. ld a, d
  1038. cp [hl]
  1039. jr c, .asm_7d7fa
  1040. jr nz, .asm_7d7e7
  1041. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1042. add hl, bc
  1043. ld a, e
  1044. cp [hl]
  1045. jr c, .asm_7d7fa
  1046. .asm_7d7e7
  1047. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1048. add hl, bc
  1049. ld [hl], e
  1050. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1051. add hl, bc
  1052. ld [hl], d
  1053. ld b, $3
  1054. call Audio3_7d8ac
  1055. ld a, e
  1056. ld [hli], a
  1057. ld [hl], d
  1058. ret
  1059. .asm_7d7fa
  1060. ld hl, wChannelFlags1
  1061. add hl, bc
  1062. res 4, [hl]
  1063. res 5, [hl]
  1064. ret
  1065. Audio3_7d803:
  1066. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1067. add hl, bc
  1068. ld [hl], d
  1069. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1070. add hl, bc
  1071. ld [hl], e
  1072. ld hl, wChannelNoteDelayCounters
  1073. add hl, bc
  1074. ld a, [hl]
  1075. ld hl, wChannelPitchBendLengthModifiers
  1076. add hl, bc
  1077. sub [hl]
  1078. jr nc, .asm_7d81b
  1079. ld a, $1
  1080. .asm_7d81b
  1081. ld [hl], a
  1082. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1083. add hl, bc
  1084. ld a, e
  1085. sub [hl]
  1086. ld e, a
  1087. ld a, d
  1088. sbc b
  1089. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  1090. add hl, bc
  1091. sub [hl]
  1092. jr c, .asm_7d837
  1093. ld d, a
  1094. ld b, $0
  1095. ld hl, wChannelFlags1
  1096. add hl, bc
  1097. set 5, [hl]
  1098. jr .asm_7d85a
  1099. .asm_7d837
  1100. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1101. add hl, bc
  1102. ld d, [hl]
  1103. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1104. add hl, bc
  1105. ld e, [hl]
  1106. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1107. add hl, bc
  1108. ld a, [hl]
  1109. sub e
  1110. ld e, a
  1111. ld a, d
  1112. sbc b
  1113. ld d, a
  1114. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  1115. add hl, bc
  1116. ld a, [hl]
  1117. sub d
  1118. ld d, a
  1119. ld b, $0
  1120. ld hl, wChannelFlags1
  1121. add hl, bc
  1122. res 5, [hl]
  1123. .asm_7d85a
  1124. ld hl, wChannelPitchBendLengthModifiers
  1125. add hl, bc
  1126. .asm_7d85e
  1127. inc b
  1128. ld a, e
  1129. sub [hl]
  1130. ld e, a
  1131. jr nc, .asm_7d85e
  1132. ld a, d
  1133. and a
  1134. jr z, .asm_7d86c
  1135. dec a
  1136. ld d, a
  1137. jr .asm_7d85e
  1138. .asm_7d86c
  1139. ld a, e
  1140. add [hl]
  1141. ld d, b
  1142. ld b, $0
  1143. ld hl, wChannelPitchBendFrequencySteps
  1144. add hl, bc
  1145. ld [hl], d
  1146. ld hl, wChannelPitchBendFrequencyStepsFractionalPart
  1147. add hl, bc
  1148. ld [hl], a
  1149. ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
  1150. add hl, bc
  1151. ld [hl], a
  1152. ret
  1153. Audio3_ApplyDutyCycle:
  1154. ld b, $0
  1155. ld hl, wChannelDutyCycles
  1156. add hl, bc
  1157. ld a, [hl]
  1158. rlca
  1159. rlca
  1160. ld [hl], a
  1161. and $c0
  1162. ld d, a
  1163. ld b, $1
  1164. call Audio3_7d8ac
  1165. ld a, [hl]
  1166. and $3f
  1167. or d
  1168. ld [hl], a
  1169. ret
  1170. Audio3_GetNextMusicByte:
  1171. ld d, $0
  1172. ld a, c
  1173. add a
  1174. ld e, a
  1175. ld hl, wChannelCommandPointers
  1176. add hl, de
  1177. ld a, [hli]
  1178. ld e, a
  1179. ld a, [hld]
  1180. ld d, a
  1181. ld a, [de] ; get next music command
  1182. inc de
  1183. ld [hl], e ; store address of next command
  1184. inc hl
  1185. ld [hl], d
  1186. ret
  1187. Audio3_7d8ac:
  1188. ld a, c
  1189. ld hl, Unknown_7db8b
  1190. add l
  1191. jr nc, .noCarry
  1192. inc h
  1193. .noCarry
  1194. ld l, a
  1195. ld a, [hl]
  1196. add b
  1197. ld l, a
  1198. ld h, $ff
  1199. ret
  1200. Audio3_7d8bb:
  1201. ld h, $0
  1202. .loop
  1203. srl a
  1204. jr nc, .noCarry
  1205. add hl, de
  1206. .noCarry
  1207. sla e
  1208. rl d
  1209. and a
  1210. jr z, .done
  1211. jr .loop
  1212. .done
  1213. ret
  1214. Audio3_7d8cc:
  1215. ld h, $0
  1216. ld l, a
  1217. add hl, hl
  1218. ld d, h
  1219. ld e, l
  1220. ld hl, Audio3_Pitches
  1221. add hl, de
  1222. ld e, [hl]
  1223. inc hl
  1224. ld d, [hl]
  1225. ld a, b
  1226. .loop
  1227. cp $7
  1228. jr z, .done
  1229. sra d
  1230. rr e
  1231. inc a
  1232. jr .loop
  1233. .done
  1234. ld a, $8
  1235. add d
  1236. ld d, a
  1237. ret
  1238. Audio3_PlaySound::
  1239. ld [wSoundID], a
  1240. cp $ff
  1241. jp z, Audio3_7daa8
  1242. cp $c2
  1243. jp z, Audio3_7d9c2
  1244. jp c, Audio3_7d9c2
  1245. cp $fe
  1246. jr z, .asm_7d901
  1247. jp nc, Audio3_7d9c2
  1248. .asm_7d901
  1249. xor a
  1250. ld [wUnusedC000], a
  1251. ld [wDisableChannelOutputWhenSfxEnds], a
  1252. ld [wMusicTempo + 1], a
  1253. ld [wMusicWaveInstrument], a
  1254. ld [wSfxWaveInstrument], a
  1255. ld d, $8
  1256. ld hl, wChannelReturnAddresses
  1257. call FillAudioRAM3
  1258. ld hl, wChannelCommandPointers
  1259. call FillAudioRAM3
  1260. ld d, $4
  1261. ld hl, wChannelSoundIDs
  1262. call FillAudioRAM3
  1263. ld hl, wChannelFlags1
  1264. call FillAudioRAM3
  1265. ld hl, wChannelDuties
  1266. call FillAudioRAM3
  1267. ld hl, wChannelDutyCycles
  1268. call FillAudioRAM3
  1269. ld hl, wChannelVibratoDelayCounters
  1270. call FillAudioRAM3
  1271. ld hl, wChannelVibratoExtents
  1272. call FillAudioRAM3
  1273. ld hl, wChannelVibratoRates
  1274. call FillAudioRAM3
  1275. ld hl, wChannelFrequencyLowBytes
  1276. call FillAudioRAM3
  1277. ld hl, wChannelVibratoDelayCounterReloadValues
  1278. call FillAudioRAM3
  1279. ld hl, wChannelFlags2
  1280. call FillAudioRAM3
  1281. ld hl, wChannelPitchBendLengthModifiers
  1282. call FillAudioRAM3
  1283. ld hl, wChannelPitchBendFrequencySteps
  1284. call FillAudioRAM3
  1285. ld hl, wChannelPitchBendFrequencyStepsFractionalPart
  1286. call FillAudioRAM3
  1287. ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
  1288. call FillAudioRAM3
  1289. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1290. call FillAudioRAM3
  1291. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1292. call FillAudioRAM3
  1293. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  1294. call FillAudioRAM3
  1295. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1296. call FillAudioRAM3
  1297. ld a, $1
  1298. ld hl, wChannelLoopCounters
  1299. call FillAudioRAM3
  1300. ld hl, wChannelNoteDelayCounters
  1301. call FillAudioRAM3
  1302. ld hl, wChannelNoteSpeeds
  1303. call FillAudioRAM3
  1304. ld [wMusicTempo], a
  1305. ld a, $ff
  1306. ld [wStereoPanning], a
  1307. xor a
  1308. ld [rNR50], a
  1309. ld a, $8
  1310. ld [rNR10], a
  1311. ld a, $0
  1312. ld [rNR51], a
  1313. xor a
  1314. ld [rNR30], a
  1315. ld a, $80
  1316. ld [rNR30], a
  1317. ld a, $77
  1318. ld [rNR50], a
  1319. jp Audio3_7db03
  1320. Audio3_7d9c2:
  1321. ld l, a
  1322. ld e, a
  1323. ld h, $0
  1324. ld d, h
  1325. add hl, hl
  1326. add hl, de
  1327. ld de, SFX_Headers_3
  1328. add hl, de
  1329. ld a, h
  1330. ld [wSfxHeaderPointer], a
  1331. ld a, l
  1332. ld [wSfxHeaderPointer + 1], a
  1333. ld a, [hl]
  1334. and $c0
  1335. rlca
  1336. rlca
  1337. ld c, a
  1338. .asm_7d9db
  1339. ld d, c
  1340. ld a, c
  1341. add a
  1342. add c
  1343. ld c, a
  1344. ld b, $0
  1345. ld a, [wSfxHeaderPointer]
  1346. ld h, a
  1347. ld a, [wSfxHeaderPointer + 1]
  1348. ld l, a
  1349. add hl, bc
  1350. ld c, d
  1351. ld a, [hl]
  1352. and $f
  1353. ld e, a
  1354. ld d, $0
  1355. ld hl, wChannelSoundIDs
  1356. add hl, de
  1357. ld a, [hl]
  1358. and a
  1359. jr z, .asm_7da17
  1360. ld a, e
  1361. cp $7
  1362. jr nz, .asm_7da0e
  1363. ld a, [wSoundID]
  1364. cp $14
  1365. jr nc, .asm_7da07
  1366. ret
  1367. .asm_7da07
  1368. ld a, [hl]
  1369. cp $14
  1370. jr z, .asm_7da17
  1371. jr c, .asm_7da17
  1372. .asm_7da0e
  1373. ld a, [wSoundID]
  1374. cp [hl]
  1375. jr z, .asm_7da17
  1376. jr c, .asm_7da17
  1377. ret
  1378. .asm_7da17
  1379. xor a
  1380. push de
  1381. ld h, d
  1382. ld l, e
  1383. add hl, hl
  1384. ld d, h
  1385. ld e, l
  1386. ld hl, wChannelReturnAddresses
  1387. add hl, de
  1388. ld [hli], a
  1389. ld [hl], a
  1390. ld hl, wChannelCommandPointers
  1391. add hl, de
  1392. ld [hli], a
  1393. ld [hl], a
  1394. pop de
  1395. ld hl, wChannelSoundIDs
  1396. add hl, de
  1397. ld [hl], a
  1398. ld hl, wChannelFlags1
  1399. add hl, de
  1400. ld [hl], a
  1401. ld hl, wChannelDuties
  1402. add hl, de
  1403. ld [hl], a
  1404. ld hl, wChannelDutyCycles
  1405. add hl, de
  1406. ld [hl], a
  1407. ld hl, wChannelVibratoDelayCounters
  1408. add hl, de
  1409. ld [hl], a
  1410. ld hl, wChannelVibratoExtents
  1411. add hl, de
  1412. ld [hl], a
  1413. ld hl, wChannelVibratoRates
  1414. add hl, de
  1415. ld [hl], a
  1416. ld hl, wChannelFrequencyLowBytes
  1417. add hl, de
  1418. ld [hl], a
  1419. ld hl, wChannelVibratoDelayCounterReloadValues
  1420. add hl, de
  1421. ld [hl], a
  1422. ld hl, wChannelPitchBendLengthModifiers
  1423. add hl, de
  1424. ld [hl], a
  1425. ld hl, wChannelPitchBendFrequencySteps
  1426. add hl, de
  1427. ld [hl], a
  1428. ld hl, wChannelPitchBendFrequencyStepsFractionalPart
  1429. add hl, de
  1430. ld [hl], a
  1431. ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
  1432. add hl, de
  1433. ld [hl], a
  1434. ld hl, wChannelPitchBendCurrentFrequencyHighBytes
  1435. add hl, de
  1436. ld [hl], a
  1437. ld hl, wChannelPitchBendCurrentFrequencyLowBytes
  1438. add hl, de
  1439. ld [hl], a
  1440. ld hl, wChannelPitchBendTargetFrequencyHighBytes
  1441. add hl, de
  1442. ld [hl], a
  1443. ld hl, wChannelPitchBendTargetFrequencyLowBytes
  1444. add hl, de
  1445. ld [hl], a
  1446. ld hl, wChannelFlags2
  1447. add hl, de
  1448. ld [hl], a
  1449. ld a, $1
  1450. ld hl, wChannelLoopCounters
  1451. add hl, de
  1452. ld [hl], a
  1453. ld hl, wChannelNoteDelayCounters
  1454. add hl, de
  1455. ld [hl], a
  1456. ld hl, wChannelNoteSpeeds
  1457. add hl, de
  1458. ld [hl], a
  1459. ld a, e
  1460. cp $4
  1461. jr nz, .asm_7da9f
  1462. ld a, $8
  1463. ld [rNR10], a
  1464. .asm_7da9f
  1465. ld a, c
  1466. and a
  1467. jp z, Audio3_7db03
  1468. dec c
  1469. jp .asm_7d9db
  1470. Audio3_7daa8:
  1471. ld a, $80
  1472. ld [rNR52], a
  1473. ld [rNR30], a
  1474. xor a
  1475. ld [rNR51], a
  1476. ld [rNR32], a
  1477. ld a, $8
  1478. ld [rNR10], a
  1479. ld [rNR12], a
  1480. ld [rNR22], a
  1481. ld [rNR42], a
  1482. ld a, $40
  1483. ld [rNR14], a
  1484. ld [rNR24], a
  1485. ld [rNR44], a
  1486. ld a, $77
  1487. ld [rNR50], a
  1488. xor a
  1489. ld [wUnusedC000], a
  1490. ld [wDisableChannelOutputWhenSfxEnds], a
  1491. ld [wMuteAudioAndPauseMusic], a
  1492. ld [wMusicTempo + 1], a
  1493. ld [wSfxTempo + 1], a
  1494. ld [wMusicWaveInstrument], a
  1495. ld [wSfxWaveInstrument], a
  1496. ld d, $a0
  1497. ld hl, wChannelCommandPointers
  1498. call FillAudioRAM3
  1499. ld a, $1
  1500. ld d, $18
  1501. ld hl, wChannelNoteDelayCounters
  1502. call FillAudioRAM3
  1503. ld [wMusicTempo], a
  1504. ld [wSfxTempo], a
  1505. ld a, $ff
  1506. ld [wStereoPanning], a
  1507. ret
  1508. ; fills d bytes at hl with a
  1509. FillAudioRAM3:
  1510. ld b, d
  1511. .loop
  1512. ld [hli], a
  1513. dec b
  1514. jr nz, .loop
  1515. ret
  1516. Audio3_7db03:
  1517. ld a, [wSoundID]
  1518. ld l, a
  1519. ld e, a
  1520. ld h, $0
  1521. ld d, h
  1522. add hl, hl
  1523. add hl, de
  1524. ld de, SFX_Headers_3
  1525. add hl, de
  1526. ld e, l
  1527. ld d, h
  1528. ld hl, wChannelCommandPointers
  1529. ld a, [de] ; get channel number
  1530. ld b, a
  1531. rlca
  1532. rlca
  1533. and $3
  1534. ld c, a
  1535. ld a, b
  1536. and $f
  1537. ld b, c
  1538. inc b
  1539. inc de
  1540. ld c, $0
  1541. .asm_7db25
  1542. cp c
  1543. jr z, .asm_7db2d
  1544. inc c
  1545. inc hl
  1546. inc hl
  1547. jr .asm_7db25
  1548. .asm_7db2d
  1549. push hl
  1550. push bc
  1551. push af
  1552. ld b, $0
  1553. ld c, a
  1554. ld hl, wChannelSoundIDs
  1555. add hl, bc
  1556. ld a, [wSoundID]
  1557. ld [hl], a
  1558. pop af
  1559. cp $3
  1560. jr c, .asm_7db46
  1561. ld hl, wChannelFlags1
  1562. add hl, bc
  1563. set 2, [hl]
  1564. .asm_7db46
  1565. pop bc
  1566. pop hl
  1567. ld a, [de] ; get channel pointer
  1568. ld [hli], a
  1569. inc de
  1570. ld a, [de]
  1571. ld [hli], a
  1572. inc de
  1573. inc c
  1574. dec b
  1575. ld a, b
  1576. and a
  1577. ld a, [de]
  1578. inc de
  1579. jr nz, .asm_7db25
  1580. ld a, [wSoundID]
  1581. cp $14
  1582. jr nc, .asm_7db5f
  1583. jr .asm_7db89
  1584. .asm_7db5f
  1585. ld a, [wSoundID]
  1586. cp $86
  1587. jr z, .asm_7db89
  1588. jr c, .asm_7db6a
  1589. jr .asm_7db89
  1590. .asm_7db6a
  1591. ld hl, wChannelSoundIDs + Ch4
  1592. ld [hli], a
  1593. ld [hli], a
  1594. ld [hli], a
  1595. ld [hl], a
  1596. ld hl, wChannelCommandPointers + Ch6 * 2 ; sfx noise channel pointer
  1597. ld de, Noise3_endchannel
  1598. ld [hl], e
  1599. inc hl
  1600. ld [hl], d ; overwrite pointer to point to endchannel
  1601. ld a, [wSavedVolume]
  1602. and a
  1603. jr nz, .asm_7db89
  1604. ld a, [rNR50]
  1605. ld [wSavedVolume], a
  1606. ld a, $77
  1607. ld [rNR50], a
  1608. .asm_7db89
  1609. ret
  1610. Noise3_endchannel:
  1611. endchannel
  1612. Unknown_7db8b:
  1613. db $10, $15, $1A, $1F ; channels 0-3
  1614. db $10, $15, $1A, $1F ; channels 4-7
  1615. Unknown_7db93:
  1616. db $EE, $DD, $BB, $77 ; channels 0-3
  1617. db $EE, $DD, $BB, $77 ; channels 4-7
  1618. Unknown_7db9b:
  1619. db $11, $22, $44, $88 ; channels 0-3
  1620. db $11, $22, $44, $88 ; channels 4-7
  1621. Audio3_Pitches:
  1622. dw $F82C ; C_
  1623. dw $F89D ; C#
  1624. dw $F907 ; D_
  1625. dw $F96B ; D#
  1626. dw $F9CA ; E_
  1627. dw $FA23 ; F_
  1628. dw $FA77 ; F#
  1629. dw $FAC7 ; G_
  1630. dw $FB12 ; G#
  1631. dw $FB58 ; A_
  1632. dw $FB9B ; A#
  1633. dw $FBDA ; B_