TUNES.S 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. * 1015 180684
  2. *
  3. *
  4. ** TUNES.S **
  5. ** ASTEROIDS FOR THE ATARI 3600 **
  6. ** THIS FILE CONTAINS THE SOUND DRIVER. **
  7. .ORG CODE+$2000
  8. ***** TUNE DATA *****
  9. * TUNTAB: THE ACTUAL VALUE INFO. THIS TABLE SHOULD BEGIN ON A PAGE BOUNADARY
  10. TUNTAB:
  11. * CONSTANT VALUES (RE-USED CONSTANTS WITH THE 'PLAY FOREVER' BIT SET)
  12. TCONST00:
  13. .DC.B $40
  14. TCONST01:
  15. .DC.B $41
  16. TCONST02:
  17. .DC.B $42
  18. TCONST04:
  19. .DC.B $44
  20. TCONST06:
  21. .DC.B $46
  22. TCONST08:
  23. .DC.B $48
  24. TCNTDOWN:
  25. .DC.B $0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$FF
  26. ;00 - VICTOR REZ OUT
  27. TVICTORC:
  28. .DC.B $4D
  29. TVICTORF:
  30. .DC.B $03,$02,$01,$02,$03,$20
  31. TVICTORV:
  32. .DC.B $98,$FE,(TS1V+1)&255
  33. ;01 - HYPERSPACE
  34. THYPERC:
  35. .DC.B $0D,$24
  36. THYPERF:
  37. .DC.B $1F,$1D,$1B,$1A,$18,$17,$15,$14,$13,$12,$11,$10,$0F,$0E,$0D,$2C
  38. THYPERV:
  39. .DC.B $86,$0A,$85,$08,$06,$90,$04,$02,$FF
  40. ;02 - TWINKLE
  41. TTWINKC EQU TCONST04
  42. TTWINKF:
  43. .DC.B $06,$04,$01,$05,$02,$03,$01,$06,$04,$05,$02,$03,$04,$01,$03,$25
  44. TTWINKV:
  45. .DC.B $45
  46. ;03 - BUZZ
  47. TBUZZC EQU TCONST08
  48. TBUZZF EQU TCONST00
  49. TBUZZV:
  50. .DC.B $01,$01,$02,$03,$04,$06,$08,$08,$0C,$0F,$0F,$FF
  51. ;04 - XTRA
  52. TXTRAC EQU TCONST04
  53. TXTRAF:
  54. .DC.B $86,$1F,$18,$1F,$95,$14,$FF
  55. TXTRAV:
  56. .DC.B $08,$00,$08,$00,$08,$00,$FE,(TCNTDOWN+1)&255
  57. ;05 - SHIPE
  58. TSHIPEC EQU TCONST08
  59. TSHIPEF:
  60. .DC.B $5F
  61. TSHIPEV EQU TCNTDOWN
  62. ;06 - UFOSE
  63. TUFOSEC EQU TCONST08
  64. TUFOSEF:
  65. .DC.B $88,$03,$49
  66. TUFOSEV:
  67. .DC.B $09,$07,$09,$07,$FE,(TCNTDOWN+5)&255
  68. ;07 - UFOLE
  69. TUFOLEC EQU TCONST08
  70. TUFOLEF:
  71. .DC.B $8A,$09,$43
  72. TUFOLEV EQU TUFOSEV
  73. ;08 - UFOS
  74. TUFOSC:
  75. .DC.B $07,$23
  76. TUFOSF EQU TCONST00
  77. TUFOSV EQU TCONST04
  78. ;09 - UFOL
  79. TUFOLC:
  80. .DC.B $0F,$03,$07,$23
  81. TUFOLF EQU TCONST02
  82. TUFOLV EQU TCONST04
  83. ;0A - ROCKSE
  84. TROCKSEC EQU TCONST08
  85. TROCKSEF:
  86. .DC.B $4B
  87. TROCKSEV EQU (TCNTDOWN+2) & 255
  88. ;0B - ROCKME
  89. TROCKMEC EQU TCONST08
  90. TROCKMEF:
  91. .DC.B $51
  92. TROCKMEV EQU (TCNTDOWN+2) & 255
  93. ;0C - ROCKLE
  94. TROCKLEC EQU TCONST08
  95. TROCKLEF:
  96. .DC.B $5A
  97. TROCKLEV EQU (TCNTDOWN+1) & 255
  98. ;0D - USHOT
  99. TUSHOTC EQU TCONST04
  100. TUSHOTF:
  101. .DC.B $03,$0F,$12,$13,$13,$14,$14,$15,$16,$16,$17,$FF
  102. TUSHOTV:
  103. .DC.B $03,$05,$07,$84,$06,$05,$04,$82,$03,$02,$01
  104. ;0E - SHOT
  105. TSHOTC EQU TCONST04
  106. TSHOTF:
  107. .DC.B $0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16
  108. .DC.B $17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$FF
  109. TSHOTV:
  110. .DC.B $82,$FE,(TCNTDOWN+1) & 255
  111. ;0F - BEATL
  112. TBEATLC EQU TCONST06
  113. TBEATLF:
  114. .DC.B $53
  115. TBEATLV:
  116. .DC.B $09,$FF
  117. ;10 - BEATH
  118. TBEATHC EQU TCONST06
  119. TBEATHF:
  120. .DC.B $54
  121. TBEATHV EQU TBEATLV
  122. ;11 - THRUST
  123. TTHRUSTC EQU TCONST06
  124. TTHRUSTF:
  125. .DC.B $10,$0E,$0D,$0E,$0C,$0E,$0F,$2E
  126. TTHRUSTV EQU TCONST04
  127. ;12 - S1
  128. TS1C EQU TCONST04
  129. TS1F:
  130. .DC.B $10,$13,$0C,$08,$05,$03,$02,$21
  131. TS1V:
  132. .DC.B $A0,$07,$05,$03,$01,$FF
  133. ;13 - S2
  134. TS2C EQU TCONST04
  135. TS2F:
  136. .DC.B $07,$21
  137. TS2V:
  138. .DC.B $01,$02,$03,$04,$05,$06,$07,$08,$FE,(TCNTDOWN+2)&255
  139. ;14 - S3
  140. TS3C EQU TCONST04
  141. TS3F:
  142. .DC.B $09,$05,$07,$2A
  143. TS3V:
  144. .DC.B $8C,$07,$00,$05,$00,$03,$00,$01,$FF
  145. ;15 - S4
  146. TS4C EQU TCONST04
  147. TS4F:
  148. .DC.B $1A,$12,$2D
  149. TS4V:
  150. .DC.B $9B,$FE,(TS1V+1)&255
  151. ;16 - S5
  152. TS5C EQU TCONST01
  153. TS5F EQU TCONST00
  154. TS5V:
  155. .DC.B $04,$00,$04,$00,$04,$00,$8A,$00,$04,$00,$04
  156. .DC.B $00,$04,$00,$85,$04,$00,$04,$00,$04,$FF
  157. ;17 - S6
  158. TS6C EQU TCONST01
  159. TS6F:
  160. .DC.B $04,$06,$26
  161. TS6V:
  162. .DC.B $92,$01,$02,$03,$FE,(TCNTDOWN+6)&255
  163. *
  164. * TIINDEX: TABLE OF INITIAL INDICES AND DURATIONS
  165. TIINDEX:
  166. .DC.B TVICTORC&255,TVICTORF&255,TVICTORV&255,3 ;SOUND 0 - VICTOR REZOUT
  167. .DC.B THYPERC&255,THYPERF&255,THYPERV&255,1 ;SOUND 1 - HYPERSPACE
  168. .DC.B TTWINKC&255,TTWINKF&255,TTWINKV&255,2 ;SOUND 2 - TWINKLE
  169. .DC.B TBUZZC&255,TBUZZF&255,TBUZZV&255,3 ;SOUND 3 - BUZZ
  170. .DC.B TXTRAC&255,TXTRAF&255,TXTRAV&255,3 ;SOUND 4 - XTRA MAN
  171. .DC.B TSHIPEC&255,TSHIPEF&255,TSHIPEV&255,9 ;SOUND 5 - SHIP EXP
  172. .DC.B TUFOSEC&255,TUFOSEF&255,TUFOSEV&255,3 ;SOUND 6 - MR. BILL EXP
  173. .DC.B TUFOLEC&255,TUFOLEF&255,TUFOLEV&255,4 ;SOUND 7 - SLUGGO EXP
  174. .DC.B TUFOSC&255,TUFOSF&255,TUFOSV&255,3 ;SOUND 8 - MR. BILL
  175. .DC.B TUFOLC&255,TUFOLF&255,TUFOLV&255,5 ;SOUND 9 - SLUGGO
  176. .DC.B TROCKSEC&255,TROCKSEF&255,TROCKSEV&255,4 ;SOUND A - SMALL ROCK EX
  177. .DC.B TROCKMEC&255,TROCKMEF&255,TROCKMEV&255,6 ;SOUND B - MED. ROCK EX
  178. .DC.B TROCKLEC&255,TROCKLEF&255,TROCKLEV&255,8 ;SOUND C - LARGE ROCK EX
  179. .DC.B TUSHOTC&255,TUSHOTF&255,TUSHOTV&255,2 ;SOUND D - UFO SHOT
  180. .DC.B TSHOTC&255,TSHOTF&255,TSHOTV&255,1 ;SOUND E - HERO SHOT
  181. .DC.B TBEATLC&255,TBEATLF&255,TBEATLV&255,6 ;SOUND F - LO HEART BEAT
  182. .DC.B TBEATHC&255,TBEATHF&255,TBEATHV&255,6 ;SOUND 10 - HI HEART BEA
  183. .DC.B TTHRUSTC&255,TTHRUSTF&255,TTHRUSTV&255,2 ;SOUND 11 - SHIP THRUST
  184. .DC.B TS1C&255,TS1F&255,TS1V&255,4 ;SOUND 12 - SPACE SOUND1
  185. .DC.B TS2C&255,TS2F&255,TS2V&255,8 ;SOUND 13 - SPACE SOUND2
  186. .DC.B TS3C&255,TS3F&255,TS3V&255,3 ;SOUND 14 - SPACE SOUND3
  187. .DC.B TS4C&255,TS4F&255,TS4V&255,9 ;SOUND 15 - SPACE SOUND4
  188. .DC.B TS5C&255,TS5F&255,TS5V&255,5 ;SOUND 16 - SPACE SOUND5
  189. .DC.B TS6C&255,TS6F&255,TS6V&255,6 ;SOUND 17 - SPACE SOUND6
  190. *
  191. ***** ACTUAL ROUTINES FOR TUNE DRIVER *****
  192. * DOTUNE2: PLAY TUNE IN AC ONLY IF IT IS NOT ALREADY PLAYING
  193. DOTUNE2:
  194. LDX #1 ;SEE IF THIS TUNE IS ALREADY PLAYING
  195. TFINDLOP:
  196. CMP TUNNUM,X
  197. BEQ TALREADY ;ALREADY PLAYING, DON'T PLAY AGAIN
  198. DEX
  199. BPL TFINDLOP
  200. JSR DOTUNE ;NOT YET PLAYING, START UP HIS THEME
  201. TALREADY:
  202. RTS
  203. * DOTUNE1: PLAY TUNE IN AC, KILLING THE TUNE IF IT IS ALREADY PLAYING
  204. DOTUNE1:
  205. PHA
  206. JSR KILLTUNE
  207. PLA
  208. ; JMP DOTUNE ;FALL THROUGH ...
  209. * DOTUNE: PLAY TUNE IN AC IF POSSIBLE
  210. DOTUNE:
  211. LDX #1 ;FIND A FREE CHANNEL
  212. TUNFRELP:
  213. LDY TUNNUM,X
  214. BMI TUNIN ;FF = FREE
  215. DEX
  216. BPL TUNFRELP
  217. ;NONE FREE
  218. CMP #$10 ;LOW PRI. SOUNDS NEVER BUMP ANYTHING
  219. BCS TUNRTS
  220. LDX #1 ;FIND A LOWER PRIORITY CHANNEL
  221. TUNPRILP:
  222. CMP TUNNUM,X
  223. BCC TUNIN ;FOUND LOWER PRIORITY: BUMP IT
  224. DEX
  225. BPL TUNPRILP
  226. ;SORRY CHARLIE...
  227. TUNRTS:
  228. RTS
  229. * TUNIN: INSTALL THE TUNE IN AC INTO CHANNEL IN X
  230. TUNIN:
  231. STA TUNNUM,X
  232. ASL ;FIND ROW IN INITIALIZATION TABLE
  233. ASL ;(THERE ARE FOUR ENTRIES PER ROW)
  234. TAY
  235. TUNINLOP:
  236. LDA TIINDEX,Y ;COPY IN TUNE INITIAL INDICES
  237. STA TINDEX,X
  238. INY
  239. INX
  240. INX ;SKIP OVER THE OTHER CHANNEL
  241. CPX #6 ;2 CHANNELS * 3 ELEMENTS PER CHANNEL
  242. BCC TUNINLOP
  243. LDA TIINDEX,Y ;COPY IN DURATION
  244. TDURINLP:
  245. DEX
  246. DEX
  247. BMI TUNRTS
  248. STA TDURTAB,X
  249. STA TDURCNT,X
  250. BPL TDURINLP ;BPL = JMP
  251. * CLEARTUN: KILL ALL TUNES, WHEREVER THEY LIE
  252. CLEARTUN:
  253. LDX #1
  254. CLRLOOP:
  255. JSR TOVER
  256. DEX
  257. BPL CLRLOOP ;FALL THRU INIT HUMP
  258. INITHUMP:
  259. LDA #$20 ;INITIALIZE BACKGROUND HEATBEAT COUNTER
  260. STA BEATVAL
  261. ; STA BCOUNTER ;LET IT RIDE...
  262. LDA #$90
  263. STA BEATRATE
  264. RTS
  265. * KILLTUNE: KILLS *ONE INSTANCE OF* TUNE IN AC, IF POSSIBLE
  266. KILLTUNE:
  267. LDX #1 ;FIND IT
  268. KILLLOOP:
  269. CMP TUNNUM,X
  270. BEQ TOVER
  271. DEX
  272. BPL KILLLOOP
  273. RTS
  274. * TOVER: END THE TUNE IN COMPONENT X. THIS IS BOTH CALLED AS A SUBROUTINE AND
  275. * BRANCHED INTO.
  276. TOVER:
  277. TXA
  278. AND #$01 ;LOW BIT IS CHANNEL NUMBER
  279. TAX
  280. LDY #$FF ;FF = NO TUNE
  281. STY TUNNUM,X
  282. INY
  283. STY AUDV0,X ;TURN OFF SOUND
  284. RTS
  285. * TUNER: CALLED ONCE PER FRAME, PLAYS THE TUNES.
  286. TUNER:
  287. LDA GAMSTATE ;PLAY TUNES ONLY IN GAMEPLAY STATE
  288. CMP #PLAYST
  289. BNE TUNRTS
  290. LDA STATUS+25 ;MAKE SURE UFO THEME IS PLAYING, IF ON
  291. BMI TNOUFO
  292. AND #$0F
  293. CLC
  294. ADC #4
  295. JSR DOTUNE2 ;PLAY HIS THEME, IF NOT ALREADY PLAYING
  296. TNOUFO:
  297. LDX #1 ;START WITH CHANNEL 1
  298. TCHX:
  299. TXA ;PUSH CHANNEL NUMBER
  300. PHA
  301. LDA TUNNUM,X
  302. BMI TNOTUNE ;FF = NO TUNE PLAYING
  303. JSR TLOOP
  304. TNOTUNE:
  305. PLA ;RESTORE CHANNEL NUMBER
  306. TAX
  307. DEX
  308. BPL TCHX
  309. RTS
  310. * TLOOP: LOOP THROUGH EACH OF THE THREE COMPONENTS OF CHANNEL X SIGNAL
  311. TLOOP:
  312. LDY TINDEX,X
  313. LDA TUNTAB,Y
  314. CMP #$FF
  315. BEQ TOVER
  316. CMP #$FE
  317. BEQ TBRANCH
  318. CMP #$FD
  319. BEQ TCHAIN
  320. CMP #$80 ;BIT 7 = SET DURATION ONLY
  321. BCS TSETDUR
  322. ;TNORM: NORMAL NOTE
  323. AND #$1F
  324. STA AUDC0,X ;GO POUND SAND IN YOUR ASS
  325. DEC TDURCNT,X ;DURATION UP YET?
  326. BNE TNEXT ;NOPE
  327. LDA TDURTAB,X ;YUP. REPRIME DURATION COUNTER
  328. STA TDURCNT,X
  329. LDA TUNTAB,Y ;CHECK FOR SPECIAL BITS
  330. CMP #$40 ;BIT 6 = HOLD FOREVER (TILL TUNE END)
  331. BCS TNEXT ;-> SIMPLY DON'T BUMP POINTER.
  332. CMP #$20 ;BIT 5 = RESTART THIS COMPONENT
  333. BCS TRESTART
  334. INC TINDEX,X ;BUMP POINTER TO NEXT 'NOTE'
  335. TNEXT:
  336. INX ;GO ON TO NEXT COMPONENT OF THIS
  337. INX ;CHANNEL (SKIP OVER OTHER CHANNEL)
  338. CPX #6 ;2 CHANNELS * 3 COMPONENTS PER CHANNEL
  339. BCC TLOOP
  340. RTS
  341. * TSETDUR: SET DURATION OF COMPONENT IN X TO VALUE IN AC.
  342. TSETDUR:
  343. AND #$7F ;LOW 7 BITS = NEW DURATION
  344. STA TDURTAB,X
  345. STA TDURCNT,X
  346. INC TINDEX,X ;BUMP POINTER
  347. JMP TLOOP ;AND CONTINUE
  348. * TBRANCH: $FE,ADDR = BRANCH INTO RANDOM ADDR FOR THIS COMPONENT
  349. TBRANCH:
  350. INY ;FETCH NEXT BYTE (NEW ADDRESS)
  351. LDA TUNTAB,Y
  352. STA TINDEX,X ;MASH IT INTO INDEX
  353. JMP TLOOP
  354. * TCHAIN: $FD,TUNNUM = CHAIN TO NEW TUNE. NOTE: THIS MEANS *ALL* COMPONENTS
  355. TCHAIN:
  356. INY ;FETCH NEXT BYTE (TUNNUM)
  357. LDA TUNTAB,Y
  358. PHA
  359. JSR TOVER ;END THIS TUNE
  360. PLA
  361. JMP DOTUNE ;JMP = JSR,RTS
  362. * TRESTART: RESTART THIS COMPONENT OF TUNE
  363. TRESTART:
  364. TXA
  365. AND #$01 ;LOW BIT IS CHANNEL NUMBER
  366. TAY
  367. LDA TUNNUM,Y ;GET ITS TUNE NUMBER
  368. ASL ;FIND ROW IN INITIAL INDEX TABLE
  369. ASL ;(FOUR ENTRIES PER ROW)
  370. STA TTEMP
  371. TXA ;GET COMPONENT INDEX
  372. LSR ;BITS 2-1 ARE COMPONENT NUMBER
  373. CLC
  374. ADC TTEMP ;ADD ROW INDEX TO POSITION WITHIN ROW
  375. TAY
  376. LDA TIINDEX,Y ;FETCH INITIAL INDEX
  377. STA TINDEX,X ;POUND IT IN
  378. JMP TNEXT ;AND DO THE NEXT COMPONENT
  379. * ROUTINE TO PLAY THE BUMM, BUMM SOUND OF THE BACKGROUND HEART BEAT
  380. * START OUT AT A SLOW RATE AND INCREASE SLOWLY
  381. BACKSNDS:
  382. * FIRST ADD RANDOM SPACE SOUNDS
  383. LDA FRMCNT ;CHECK ONLY OCCASIONALLY
  384. AND #$06
  385. BNE UPRATE
  386. JSR NEWRAND ;GET RANDOM VALUE
  387. CMP #$06 ;DO ONLY OCCASIONALLY
  388. BCS UPRATE ;HAVE ONLY 6 RANDOM SPACE SOUNDS
  389. CLC ;ADD TO BASE
  390. ADC #$12
  391. JSR DOTUNE
  392. * THEN UPDATE RATE
  393. UPRATE:
  394. INC BEATRATE ;INCREASE RATE
  395. BNE OLDRATE
  396. NEWRATE:
  397. LDA #$90 ;RESET BEATRATE
  398. STA BEATRATE
  399. DEC BEATVAL ;INCREASE RATE BY
  400. LDA BEATVAL ; DECREMENTING BEATVAL
  401. CMP #5 ;DON'T LET GO BELOW 10
  402. BCS OLDRATE
  403. LDA #5
  404. STA BEATVAL
  405. * CHECK IF TIME FOR A BEAT
  406. OLDRATE:
  407. DEC BCOUNTER ;COUNTER COUNTS DOWN FROM
  408. ; BEATVAL TO 0.
  409. BPL DONEBEAT ;IS IT TIME FOR NEW BEAT?
  410. THISTIME:
  411. LDA BEATVAL ;YES, RESET COUNTER
  412. STA BCOUNTER
  413. LDA WHICHBT
  414. EOR #$01 ;TOGGLE TO OTHER TUNE
  415. STA WHICHBT
  416. CLC
  417. ADC #$0F ;ADD OFFSET TO TUNE
  418. JSR DOTUNE ;PLAY IT
  419. DONEBEAT:
  420. RTS