rmt.asx
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:22k
源码类别:

Windows CE

开发平台:

C/C++

  1. ;*
  2. ;* Raster Music Tracker, RMT Atari routine version 1.20051226
  3. ;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2005
  4. ;* http://raster.atari.org
  5. ;*
  6. ;* Warnings:
  7. ;*
  8. ;* 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed
  9. ;*    from any other routines) as well as cca 1KB of memory before the "PLAYER"
  10. ;*    address for frequency tables and functionary variables. It's:
  11. ;*   a) from PLAYER-$400 to PLAYER for stereo RMTplayer
  12. ;*    b) from PLAYER-$380 to PLAYER for mono RMTplayer
  13. ;*
  14. ;* 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page.
  15. ;*    i.e. "PLAYER" address can be $..00 only!
  16. ;*
  17. ;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time.
  18. ;*
  19. ;* STEREOMODE equ 0 ;0 => compile RMTplayer for 4 tracks mono
  20. ;* ;1 => compile RMTplayer for 8 tracks stereo
  21. ;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4
  22. ;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4
  23. ;*
  24. PLAYER equ $0600
  25. ;*
  26. IFT STEREOMODE==1
  27. TRACKS equ 8
  28. ELS
  29. TRACKS equ 4
  30. EIF
  31. ;*
  32. ;* RMT FEATures definitions
  33. ;* For optimizations of RMT player routine to concrete RMT modul only!
  34. ;* --------BEGIN--------
  35. FEAT_INSTRSPEED equ 0 ;* cca 21 or 5 bytes
  36. FEAT_CONSTANTSPEED equ 0 ;* cca 28 bytes
  37. ;* VARIOUS COMMANDS
  38. FEAT_COMMAND1 equ 1 ;* cca 8 bytes
  39. FEAT_COMMAND2 equ 1 ;* cca 20 bytes (+save 1 address in zero page) and quicker whole RMT routine
  40. FEAT_COMMAND3 equ 1 ;* cca 12 bytes
  41. FEAT_COMMAND4 equ 1 ;* cca 15 bytes
  42. FEAT_COMMAND5 equ 1 ;* cca 67 bytes
  43. FEAT_COMMAND6 equ 1 ;* cca 15 bytes
  44. ;* COMMAND7 SETNOTE (i.e. command 7 with parameter != $80)
  45. FEAT_COMMAND7SETNOTE equ 1 ;* cca 12 bytes
  46. ;* COMMAND7 VOLUMEONLY (i.e. command 7 with parameter == $80)
  47. FEAT_COMMAND7VOLUMEONLY equ 1 ;* cca 74 bytes
  48. ;* PORTAMENTO
  49. FEAT_PORTAMENTO equ 1 ;* cca 138 bytes and quicker whole RMT routine
  50. ;* FILTER
  51. FEAT_FILTER equ 1 ;* cca 179 bytes and quicker whole RMT routine
  52. FEAT_FILTERG0L equ 1 ;* (cca 38 bytes for each)
  53. FEAT_FILTERG1L equ 1
  54. FEAT_FILTERG0R equ 1
  55. FEAT_FILTERG1R equ 1
  56. ;* BASS16B (i.e. distortion value 6)
  57. FEAT_BASS16 equ 1 ;* cca 194 bytes +128bytes freq table and quicker whole RMT routine
  58. FEAT_BASS16G1L equ 1 ;* (cca 47 bytes for each)
  59. FEAT_BASS16G3L equ 1
  60. FEAT_BASS16G1R equ 1
  61. FEAT_BASS16G3R equ 1
  62. ;* VOLUME ONLY for particular generators
  63. FEAT_VOLUMEONLYG0L equ 1 ;* (cca 7 bytes for each)
  64. FEAT_VOLUMEONLYG2L equ 1
  65. FEAT_VOLUMEONLYG3L equ 1
  66. FEAT_VOLUMEONLYG0R equ 1
  67. FEAT_VOLUMEONLYG2R equ 1
  68. FEAT_VOLUMEONLYG3R equ 1
  69. ;* TABLE TYPE (i.e. TABLETYPE=1)
  70. FEAT_TABLETYPE equ 1 ;* cca 53 bytes and quicker whole RMT routine
  71. ;* TABLE MODE (i.e. TABLEMODE=1)
  72. FEAT_TABLEMODE equ 1 ;* cca 16 bytes and quicker whole RMT routine
  73. ;* TABLE GO (i.e. TGO is nonzero value)
  74. FEAT_TABLEGO equ 1 ;* cca 6 bytes and quicker whole RMT routine
  75. ;* AUDCTLMANUALSET (i.e. any MANUAL AUDCTL setting is nonzero value)
  76. FEAT_AUDCTLMANUALSET equ 1 ;* cca 27 bytes and quicker whole RMT routine
  77. ;* VOLUME MINIMUM (i.e. VMIN is nonzero value)
  78. FEAT_VOLUMEMIN equ 1 ;* cca 12 bytes and quicker whole RMT routine
  79. ;* --------END--------
  80. ;*
  81. ;* RMT ZeroPage addresses
  82. org 203
  83. p_tis
  84. p_instrstable org *+2
  85. p_trackslbstable org *+2
  86. p_trackshbstable org *+2
  87. p_song org *+2
  88. ns org *+2
  89. nr org *+2
  90. nt org *+2
  91. reg1 org *+1
  92. reg2 org *+1
  93. reg3 org *+1
  94. tmp org *+1
  95. IFT FEAT_COMMAND2
  96. frqaddcmd2 org *+1
  97. EIF
  98. IFT TRACKS>4
  99. org PLAYER-$400
  100. ELS
  101. org PLAYER-$380
  102. EIF
  103. track_variables
  104. trackn_db org *+TRACKS
  105. trackn_hb org *+TRACKS
  106. trackn_idx org *+TRACKS
  107. trackn_pause org *+TRACKS
  108. trackn_note org *+TRACKS
  109. trackn_volume org *+TRACKS
  110. trackn_distor  org *+TRACKS
  111. trackn_shiftfrq org *+TRACKS
  112. IFT FEAT_PORTAMENTO
  113. trackn_portafrqc org *+TRACKS
  114. trackn_portafrqa org *+TRACKS
  115. trackn_portaspeed org *+TRACKS
  116. trackn_portaspeeda org *+TRACKS
  117. trackn_portadepth org *+TRACKS
  118. EIF
  119. trackn_instrx2 org *+TRACKS
  120. trackn_instrdb org *+TRACKS
  121. trackn_instrhb org *+TRACKS
  122. trackn_instridx org *+TRACKS
  123. trackn_instrlen org *+TRACKS
  124. trackn_instrlop org *+TRACKS
  125. trackn_instrreachend org *+TRACKS
  126. trackn_volumeslidedepth org *+TRACKS
  127. trackn_volumeslidevalue org *+TRACKS
  128. IFT FEAT_VOLUMEMIN
  129. trackn_volumemin org *+TRACKS
  130. EIF
  131. trackn_effdelay org *+TRACKS
  132. trackn_effvibratoa org *+TRACKS
  133. trackn_effvibratobeg org *+TRACKS
  134. trackn_effvibratoend org *+TRACKS
  135. trackn_effshift org *+TRACKS
  136. trackn_tabletypespeed org *+TRACKS
  137. IFT FEAT_TABLEMODE
  138. trackn_tablemode org *+TRACKS
  139. EIF
  140. trackn_tablenote org *+TRACKS
  141. trackn_tablea org *+TRACKS
  142. trackn_tableend org *+TRACKS
  143. IFT FEAT_TABLEGO
  144. trackn_tablelop org *+TRACKS
  145. EIF
  146. trackn_tablespeeda org *+TRACKS
  147. trackn_command org *+TRACKS
  148. IFT FEAT_BASS16
  149. trackn_outnote org *+TRACKS
  150. EIF
  151. IFT FEAT_FILTER
  152. trackn_filter org *+TRACKS
  153. EIF
  154. trackn_audf org *+TRACKS
  155. trackn_audc org *+TRACKS
  156. IFT FEAT_AUDCTLMANUALSET
  157. trackn_audctl org *+TRACKS
  158. EIF
  159. IFT FEAT_CONSTANTSPEED==0
  160. v_speed org *+1
  161. EIF
  162. v_aspeed org *+1
  163. IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1
  164. v_ainstrspeed org *+1
  165. EIF
  166. v_abeat org *+1
  167. track_endvariables
  168. org PLAYER-$100-$140-$30
  169. INSTRPAR equ 12
  170. tabbeganddistor
  171.  dta frqtabpure-frqtab,$00
  172.  dta frqtabpure-frqtab,$20
  173.  dta frqtabpure-frqtab,$40
  174.  dta frqtabbass1-frqtab,$c0
  175.  dta frqtabpure-frqtab,$80
  176.  dta frqtabpure-frqtab,$a0
  177.  dta frqtabbass1-frqtab,$c0
  178.  dta frqtabbass2-frqtab,$c0
  179. vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0,vibx-vib0
  180. vib0 dta 0
  181. vib1 dta 1,-1,-1,1
  182. vib2 dta 1,0,-1,-1,0,1
  183. vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1
  184. vibx
  185. :PLAYER-$100-$140-* dta 0
  186. ; org PLAYER-$100-$140
  187. IFT FEAT_BASS16
  188. frqtabbasslo
  189. dta $F2,$33,$96,$E2,$38,$8C,$00,$6A,$E8,$6A,$EF,$80,$08,$AE,$46,$E6
  190. dta $95,$41,$F6,$B0,$6E,$30,$F6,$BB,$84,$52,$22,$F4,$C8,$A0,$7A,$55
  191. dta $34,$14,$F5,$D8,$BD,$A4,$8D,$77,$60,$4E,$38,$27,$15,$06,$F7,$E8
  192. dta $DB,$CF,$C3,$B8,$AC,$A2,$9A,$90,$88,$7F,$78,$70,$6A,$64,$5E,$00
  193. EIF
  194. org PLAYER-$100-$100
  195. frqtab
  196. ERT [<frqtab]!=0 ;* frqtab must begin at the memory page bound! (i.e. $..00 address)
  197. frqtabbass1
  198. dta $BF,$B6,$AA,$A1,$98,$8F,$89,$80,$F2,$E6,$DA,$CE,$BF,$B6,$AA,$A1
  199. dta $98,$8F,$89,$80,$7A,$71,$6B,$65,$5F,$5C,$56,$50,$4D,$47,$44,$3E
  200. dta $3C,$38,$35,$32,$2F,$2D,$2A,$28,$25,$23,$21,$1F,$1D,$1C,$1A,$18
  201. dta $17,$16,$14,$13,$12,$11,$10,$0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07
  202. frqtabbass2
  203. dta $FF,$F1,$E4,$D8,$CA,$C0,$B5,$AB,$A2,$99,$8E,$87,$7F,$79,$73,$70
  204. dta $66,$61,$5A,$55,$52,$4B,$48,$43,$3F,$3C,$39,$37,$33,$30,$2D,$2A
  205. dta $28,$25,$24,$21,$1F,$1E,$1C,$1B,$19,$17,$16,$15,$13,$12,$11,$10
  206. dta $0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00
  207. frqtabpure
  208. dta $F3,$E6,$D9,$CC,$C1,$B5,$AD,$A2,$99,$90,$88,$80,$79,$72,$6C,$66
  209. dta $60,$5B,$55,$51,$4C,$48,$44,$40,$3C,$39,$35,$32,$2F,$2D,$2A,$28
  210. dta $25,$23,$21,$1F,$1D,$1C,$1A,$18,$17,$16,$14,$13,$12,$11,$10,$0F
  211. dta $0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00,$00
  212. IFT FEAT_BASS16
  213. frqtabbasshi
  214. dta $0D,$0D,$0C,$0B,$0B,$0A,$0A,$09,$08,$08,$07,$07,$07,$06,$06,$05
  215. dta $05,$05,$04,$04,$04,$04,$03,$03,$03,$03,$03,$02,$02,$02,$02,$02
  216. dta $02,$02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00
  217. dta $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  218. EIF
  219. org PLAYER-$0100
  220. volumetab
  221. dta $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  222. dta $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01
  223. dta $00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$02
  224. dta $00,$00,$00,$01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$03,$03,$03
  225. dta $00,$00,$01,$01,$01,$01,$02,$02,$02,$02,$03,$03,$03,$03,$04,$04
  226. dta $00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$03,$04,$04,$04,$05,$05
  227. dta $00,$00,$01,$01,$02,$02,$02,$03,$03,$04,$04,$04,$05,$05,$06,$06
  228. dta $00,$00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07
  229. dta $00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07,$08
  230. dta $00,$01,$01,$02,$02,$03,$04,$04,$05,$05,$06,$07,$07,$08,$08,$09
  231. dta $00,$01,$01,$02,$03,$03,$04,$05,$05,$06,$07,$07,$08,$09,$09,$0A
  232. dta $00,$01,$01,$02,$03,$04,$04,$05,$06,$07,$07,$08,$09,$0A,$0A,$0B
  233. dta $00,$01,$02,$02,$03,$04,$05,$06,$06,$07,$08,$09,$0A,$0A,$0B,$0C
  234. dta $00,$01,$02,$03,$03,$04,$05,$06,$07,$08,$09,$0A,$0A,$0B,$0C,$0D
  235. dta $00,$01,$02,$03,$04,$05,$06,$07,$07,$08,$09,$0A,$0B,$0C,$0D,$0E
  236. dta $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
  237. org PLAYER
  238. ;*
  239. ;* Set of RMT main vectors:
  240. ;*
  241. RASTERMUSICTRACKER
  242. jmp rmt_init
  243. jmp rmt_play
  244. jmp rmt_p3
  245. jmp rmt_silence
  246. jmp SetPokey
  247. rmt_init
  248. stx ns
  249. sty ns+1
  250. pha
  251. IFT track_endvariables-track_variables>255
  252. ldy #0
  253. tya
  254. ri0 sta track_variables,y
  255. sta track_endvariables-$100,y
  256. iny
  257. bne ri0
  258. ELS
  259. ldy #track_endvariables-track_variables
  260. lda #0
  261. ri0 sta track_variables-1,y
  262. dey
  263. bne ri0
  264. EIF
  265. ldy #4
  266. lda (ns),y
  267. sta v_maxtracklen
  268. iny
  269. IFT FEAT_CONSTANTSPEED==0
  270. lda (ns),y
  271. sta v_speed
  272. EIF
  273. IFT FEAT_INSTRSPEED==0
  274. iny
  275. lda (ns),y
  276. sta v_instrspeed
  277. sta v_ainstrspeed
  278. ELI FEAT_INSTRSPEED>1
  279. lda #FEAT_INSTRSPEED
  280. sta v_ainstrspeed
  281. EIF
  282. ldy #8
  283. ri1 lda (ns),y
  284. sta p_tis-8,y
  285. iny
  286. cpy #8+8
  287. bne ri1
  288. pla
  289. pha
  290. IFT TRACKS>4
  291. asl @
  292. asl @
  293. asl @
  294. clc
  295. adc p_song
  296. sta p_song
  297. pla
  298. php
  299. and #$e0
  300. asl @
  301. rol @
  302. rol @
  303. rol @
  304. ELS
  305. asl @
  306. asl @
  307. clc
  308. adc p_song
  309. sta p_song
  310. pla
  311. php
  312. and #$c0
  313. asl @
  314. rol @
  315. rol @
  316. EIF
  317. plp
  318. adc p_song+1
  319. sta p_song+1
  320. jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
  321. rmt_silence
  322. IFT STEREOMODE>0
  323. lda #0
  324. sta $d208
  325. sta $d218
  326. ldy #3
  327. sty $d20f
  328. sty $d21f
  329. ldy #8
  330. si1 sta $d200,y
  331. sta $d210,y
  332. dey
  333. bpl si1
  334. ELS
  335. lda #0
  336. sta $d208
  337. ldy #3
  338. sty $d20f
  339. ldy #8
  340. si1 sta $d200,y
  341. dey
  342. bpl si1
  343. EIF
  344. IFT FEAT_INSTRSPEED==0
  345. lda v_instrspeed
  346. ELS
  347. lda #FEAT_INSTRSPEED
  348. EIF
  349. rts
  350. GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
  351. GetSongLine
  352. ldx #0
  353. stx v_abeat
  354. nn0
  355. nn1 txa
  356. tay
  357. lda (p_song),y
  358. cmp #$fe
  359. bcs nn2
  360. tay
  361. lda (p_trackslbstable),y
  362. sta trackn_db,x
  363. lda (p_trackshbstable),y
  364. nn1a sta trackn_hb,x
  365. lda #0
  366. sta trackn_idx,x
  367. lda #1
  368. nn1a2 sta trackn_pause,x
  369. lda #$80
  370. sta trackn_instrx2,x
  371. inx
  372. xtracks01 cpx #TRACKS
  373. bne nn1
  374. lda p_song
  375. clc
  376. xtracks02 adc #TRACKS
  377. sta p_song
  378. bcc GetTrackLine
  379. inc p_song+1
  380. nn1b
  381. jmp GetTrackLine
  382. nn2
  383. beq nn3
  384. nn2a
  385. lda #0
  386. beq nn1a2
  387. nn3
  388. ldy #2
  389. lda (p_song),y
  390. tax
  391. iny
  392. lda (p_song),y
  393. sta p_song+1
  394. stx p_song
  395. ldx #0
  396. beq nn0
  397. GetTrackLine
  398. oo0
  399. oo0a
  400. IFT FEAT_CONSTANTSPEED==0
  401. lda v_speed
  402. sta v_bspeed
  403. EIF
  404. ldx #-1
  405. oo1
  406. inx
  407. dec trackn_pause,x
  408. bne oo1x
  409. oo1b
  410. lda trackn_db,x
  411. sta ns
  412. lda trackn_hb,x
  413. sta ns+1
  414. oo1i
  415. ldy trackn_idx,x
  416. inc trackn_idx,x
  417. lda (ns),y
  418. sta reg1
  419. and #$3f
  420. cmp #61
  421. beq oo1a
  422. bcs oo2
  423. sta trackn_note,x
  424. IFT FEAT_BASS16
  425. sta trackn_outnote,x
  426. EIF
  427. iny
  428. lda (ns),y
  429. lsr @
  430. and #$3f*2
  431. sta trackn_instrx2,x
  432. oo1a
  433. lda #1
  434. sta trackn_pause,x
  435. ldy trackn_idx,x
  436. inc trackn_idx,x
  437. lda (ns),y
  438. lsr @
  439. ror reg1
  440. lsr @
  441. ror reg1
  442. lda reg1
  443. and #$f0
  444. sta trackn_volume,x
  445. oo1x
  446. xtracks03sub1 cpx #TRACKS-1
  447. bne oo1
  448. IFT FEAT_CONSTANTSPEED==0
  449. lda #$ff
  450. v_bspeed equ *-1
  451. sta v_speed
  452. ELS
  453. lda #FEAT_CONSTANTSPEED
  454. EIF
  455. sta v_aspeed
  456. jmp InitOfNewSetInstrumentsOnly
  457. oo2
  458. cmp #63
  459. beq oo63
  460. lda reg1
  461. and #$c0
  462. beq oo62_b
  463. asl @
  464. rol @
  465. rol @
  466. sta trackn_pause,x
  467. jmp oo1x
  468. oo62_b
  469. iny
  470. lda (ns),y
  471. sta trackn_pause,x
  472. inc trackn_idx,x
  473. jmp oo1x
  474. oo63
  475. lda reg1
  476. IFT FEAT_CONSTANTSPEED==0
  477. bmi oo63_1X
  478. iny
  479. lda (ns),y
  480. sta v_bspeed
  481. inc trackn_idx,x
  482. jmp oo1i
  483. oo63_1X
  484. EIF
  485. cmp #255
  486. beq oo63_11
  487. iny
  488. lda (ns),y
  489. sta trackn_idx,x
  490. jmp oo1i
  491. oo63_11
  492. jmp GetSongLine
  493. p2xrmtp3 jmp rmt_p3
  494. p2x0 dex
  495.  bmi p2xrmtp3
  496. InitOfNewSetInstrumentsOnly
  497. p2x1 ldy trackn_instrx2,x
  498. bmi p2x0
  499. SetUpInstrumentY2
  500. lda (p_instrstable),y
  501. sta trackn_instrdb,x
  502. sta nt
  503. iny
  504. lda (p_instrstable),y
  505. sta trackn_instrhb,x
  506. sta nt+1
  507. IFT FEAT_FILTER
  508. lda #1
  509. sta trackn_filter,x
  510. EIF
  511. IFT FEAT_TABLEGO
  512. IFT FEAT_FILTER
  513. tay
  514. ELS
  515. ldy #1
  516. EIF
  517. lda (nt),y
  518. sta trackn_tablelop,x
  519. iny
  520. ELS
  521. ldy #2
  522. EIF
  523. lda (nt),y
  524. sta trackn_instrlen,x
  525. iny
  526. lda (nt),y
  527. sta trackn_instrlop,x
  528. iny
  529. lda (nt),y
  530. sta trackn_tabletypespeed,x
  531. IFT FEAT_TABLETYPE||FEAT_TABLEMODE
  532. and #$3f
  533. EIF
  534. sta trackn_tablespeeda,x
  535. IFT FEAT_TABLEMODE
  536. lda (nt),y
  537. and #$40
  538. sta trackn_tablemode,x
  539. EIF
  540. IFT FEAT_AUDCTLMANUALSET
  541. iny
  542. lda (nt),y
  543. sta trackn_audctl,x
  544. iny
  545. ELS
  546. ldy #6
  547. EIF
  548. lda (nt),y
  549. sta trackn_volumeslidedepth,x
  550. IFT FEAT_VOLUMEMIN
  551. iny
  552. lda (nt),y
  553. sta trackn_volumemin,x
  554. iny
  555. ELS
  556. ldy #8
  557. EIF
  558. lda (nt),y
  559. sta trackn_effdelay,x
  560. iny
  561. lda (nt),y
  562. tay
  563. lda vibtabbeg,y
  564. sta trackn_effvibratoa,x
  565. sta trackn_effvibratobeg,x
  566. lda vibtabbeg+1,y
  567. sta trackn_effvibratoend,x
  568. ldy #10
  569. lda (nt),y
  570. sta trackn_effshift,x
  571. lda #128
  572. sta trackn_volumeslidevalue,x
  573. sta trackn_instrx2,x
  574. asl @
  575. sta trackn_instrreachend,x
  576. sta trackn_shiftfrq,x
  577. tay
  578. lda (nt),y
  579. sta trackn_tableend,x
  580. adc #0
  581. sta trackn_instridx,x
  582. lda #INSTRPAR
  583. sta trackn_tablea,x
  584. tay
  585. lda (nt),y
  586. sta trackn_tablenote,x
  587. xata_rtshere
  588. jmp p2x0
  589. rmt_play
  590. rmt_p0
  591. jsr SetPokey
  592. rmt_p1
  593. IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1
  594. dec v_ainstrspeed
  595. bne rmt_p3
  596. EIF
  597. IFT FEAT_INSTRSPEED==0
  598. lda #$ff
  599. v_instrspeed equ *-1
  600. sta v_ainstrspeed
  601. ELI FEAT_INSTRSPEED>1
  602. lda #FEAT_INSTRSPEED
  603. sta v_ainstrspeed
  604. EIF
  605. rmt_p2
  606. dec v_aspeed
  607. bne rmt_p3
  608. inc v_abeat
  609. lda v_abeat
  610. cmp #$ff
  611. v_maxtracklen equ *-1
  612. beq p2o3
  613. jmp GetTrackLine
  614. p2o3
  615. jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
  616. go_ppnext jmp ppnext
  617. rmt_p3
  618. lda #>frqtab
  619. sta nr+1
  620. xtracks05sub1 ldx #TRACKS-1
  621. pp1
  622. lda trackn_instrhb,x
  623. beq go_ppnext
  624. sta ns+1
  625. lda trackn_instrdb,x
  626. sta ns
  627. ldy trackn_instridx,x
  628. lda (ns),y
  629. sta reg1
  630. iny
  631. lda (ns),y
  632. sta reg2
  633. iny
  634. lda (ns),y
  635. sta reg3
  636. iny
  637. tya
  638. cmp trackn_instrlen,x
  639. bcc pp2
  640. beq pp2
  641. lda #$80
  642. sta trackn_instrreachend,x
  643. pp1b
  644. lda trackn_instrlop,x
  645. pp2 sta trackn_instridx,x
  646. lda reg1
  647. IFT TRACKS>4
  648. cpx #4
  649. bcc pp2s
  650. lsr @
  651. lsr @
  652. lsr @
  653. lsr @
  654. pp2s
  655. EIF
  656. and #$0f
  657. ora trackn_volume,x
  658. tay
  659. lda volumetab,y
  660. sta tmp
  661. lda reg2
  662. and #$0e
  663. tay
  664. lda tabbeganddistor,y
  665. sta nr
  666. lda tmp
  667. ora tabbeganddistor+1,y
  668. sta trackn_audc,x
  669. InstrumentsEffects
  670. lda trackn_effdelay,x
  671. beq ei2
  672. cmp #1
  673. bne ei1
  674. lda trackn_shiftfrq,x
  675. clc
  676. adc trackn_effshift,x
  677. clc
  678. ldy trackn_effvibratoa,x
  679. adc vib0,y
  680. sta trackn_shiftfrq,x
  681. iny
  682. tya
  683. cmp trackn_effvibratoend,x
  684. bne ei1a
  685. lda trackn_effvibratobeg,x
  686. ei1a
  687. sta trackn_effvibratoa,x
  688. jmp ei2
  689. ei1
  690. dec trackn_effdelay,x
  691. ei2
  692. ldy trackn_tableend,x
  693. cpy #INSTRPAR+1
  694. bcc ei3
  695. lda trackn_tablespeeda,x
  696. bpl ei2f
  697. ei2c
  698. tya
  699. cmp trackn_tablea,x
  700. bne ei2c2
  701. IFT FEAT_TABLEGO
  702. lda trackn_tablelop,x
  703. ELS
  704. lda #INSTRPAR
  705. EIF
  706. sta trackn_tablea,x
  707. bne ei2a
  708. ei2c2
  709. inc trackn_tablea,x
  710. ei2a
  711. lda trackn_instrdb,x
  712. sta nt
  713. lda trackn_instrhb,x
  714. sta nt+1
  715. ldy trackn_tablea,x
  716. lda (nt),y
  717. IFT FEAT_TABLEMODE
  718. ldy trackn_tablemode,x
  719. beq ei2e
  720. clc
  721. adc trackn_tablenote,x
  722. ei2e
  723. EIF
  724. sta trackn_tablenote,x
  725. lda trackn_tabletypespeed,x
  726. IFT FEAT_TABLETYPE||FEAT_TABLEMODE
  727. and #$3f
  728. EIF
  729. ei2f
  730. sec
  731. sbc #1
  732. sta trackn_tablespeeda,x
  733. ei3
  734. lda trackn_instrreachend,x
  735. bpl ei4
  736. lda trackn_volume,x
  737. beq ei4
  738. IFT FEAT_VOLUMEMIN
  739. cmp trackn_volumemin,x
  740. beq ei4
  741. bcc ei4
  742. EIF
  743. tay
  744. lda trackn_volumeslidevalue,x
  745. clc
  746. adc trackn_volumeslidedepth,x
  747. sta trackn_volumeslidevalue,x
  748. bcc ei4
  749. tya
  750. sbc #16
  751. sta trackn_volume,x
  752. ei4
  753. IFT FEAT_COMMAND2
  754. lda #0
  755. sta frqaddcmd2
  756. EIF
  757. lda reg2
  758. sta trackn_command,x
  759. and #$70
  760. lsr @
  761. lsr @
  762. sta jmx+1
  763. jmx bcc *
  764. jmp cmd0
  765. nop
  766. jmp cmd1
  767. nop
  768. jmp cmd2
  769. nop
  770. jmp cmd3
  771. nop
  772. jmp cmd4
  773. nop
  774. jmp cmd5
  775. nop
  776. jmp cmd6
  777. nop
  778. jmp cmd7
  779. cmd1
  780. IFT FEAT_COMMAND1
  781. lda reg3
  782. jmp cmd0c
  783. EIF
  784. cmd2
  785. IFT FEAT_COMMAND2
  786. lda reg3
  787. sta frqaddcmd2
  788. lda trackn_note,x
  789. jmp cmd0a
  790. EIF
  791. cmd3
  792. IFT FEAT_COMMAND3
  793. lda trackn_note,x
  794. clc
  795. adc reg3
  796. sta trackn_note,x
  797. jmp cmd0a
  798. EIF
  799. cmd4
  800. IFT FEAT_COMMAND4
  801. lda trackn_shiftfrq,x
  802. clc
  803. adc reg3
  804. sta trackn_shiftfrq,x
  805. lda trackn_note,x
  806. jmp cmd0a
  807. EIF
  808. cmd5
  809. IFT FEAT_COMMAND5&&FEAT_PORTAMENTO
  810. IFT FEAT_TABLETYPE
  811. lda trackn_tabletypespeed,x
  812. bpl cmd5a1
  813. ldy trackn_note,x
  814. lda (nr),y
  815. clc
  816. adc trackn_tablenote,x
  817. jmp cmd5ax
  818. EIF
  819. cmd5a1
  820. lda trackn_note,x
  821. clc
  822. adc trackn_tablenote,x
  823. cmp #61
  824. bcc cmd5a2
  825. lda #63
  826. cmd5a2
  827. tay
  828. lda (nr),y
  829. cmd5ax
  830. sta trackn_portafrqc,x
  831. ldy reg3
  832. bne cmd5a
  833. sta trackn_portafrqa,x
  834. cmd5a
  835. tya
  836. lsr @
  837. lsr @
  838. lsr @
  839. lsr @
  840. sta trackn_portaspeed,x
  841. sta trackn_portaspeeda,x
  842. lda reg3
  843. and #$0f
  844. sta trackn_portadepth,x
  845. lda trackn_note,x
  846. jmp cmd0a
  847. ELI FEAT_COMMAND5
  848. jmp pp9
  849. EIF
  850. cmd6
  851. IFT FEAT_COMMAND6&&FEAT_FILTER
  852. lda reg3
  853. clc
  854. adc trackn_filter,x
  855. sta trackn_filter,x
  856. lda trackn_note,x
  857. jmp cmd0a
  858. ELI FEAT_COMMAND6
  859. jmp pp9
  860. EIF
  861. cmd7
  862. IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY
  863. IFT FEAT_COMMAND7SETNOTE
  864. lda reg3
  865. IFT FEAT_COMMAND7VOLUMEONLY
  866. cmp #$80
  867. beq cmd7a
  868. EIF
  869. sta trackn_note,x
  870. jmp cmd0a
  871. EIF
  872. IFT FEAT_COMMAND7VOLUMEONLY
  873. cmd7a
  874. lda trackn_audc,x
  875. ora #$f0
  876. sta trackn_audc,x
  877. lda trackn_note,x
  878. jmp cmd0a
  879. EIF
  880. EIF
  881. cmd0
  882. lda trackn_note,x
  883. clc
  884. adc reg3
  885. cmd0a
  886. IFT FEAT_TABLETYPE
  887. ldy trackn_tabletypespeed,x
  888. bmi cmd0b
  889. EIF
  890. clc
  891. adc trackn_tablenote,x
  892. cmp #61
  893. bcc cmd0a1
  894. lda #0
  895. sta trackn_audc,x
  896. lda #63
  897. cmd0a1
  898. IFT FEAT_BASS16
  899. sta trackn_outnote,x
  900. EIF
  901. tay
  902. lda (nr),y
  903. clc
  904. adc trackn_shiftfrq,x
  905. IFT FEAT_COMMAND2
  906. clc
  907. adc frqaddcmd2
  908. EIF
  909. IFT FEAT_TABLETYPE
  910. jmp cmd0c
  911. cmd0b
  912. cmp #61
  913. bcc cmd0b1
  914. lda #0
  915. sta trackn_audc,x
  916. lda #63
  917. cmd0b1
  918. tay
  919. lda trackn_shiftfrq,x
  920. clc
  921. adc trackn_tablenote,x
  922. clc
  923. adc (nr),y
  924. IFT FEAT_COMMAND2
  925. clc
  926. adc frqaddcmd2
  927. EIF
  928. EIF
  929. cmd0c
  930. sta trackn_audf,x
  931. pp9
  932. IFT FEAT_PORTAMENTO
  933. lda trackn_portaspeeda,x
  934. beq pp10
  935. dec trackn_portaspeeda,x
  936. bne pp10
  937. lda trackn_portaspeed,x
  938. sta trackn_portaspeeda,x
  939. lda trackn_portafrqa,x
  940. cmp trackn_portafrqc,x
  941. beq pp10
  942. bcs pps1
  943. adc trackn_portadepth,x
  944. bcs pps8
  945. cmp trackn_portafrqc,x
  946. bcs pps8
  947. jmp pps9
  948. pps1
  949. sbc trackn_portadepth,x
  950. bcc pps8
  951. cmp trackn_portafrqc,x
  952. bcs pps9
  953. pps8
  954. lda trackn_portafrqc,x
  955. pps9
  956. sta trackn_portafrqa,x
  957. pp10
  958. lda reg2
  959. and #$01
  960. beq pp11
  961. lda trackn_portafrqa,x
  962. clc
  963. adc trackn_shiftfrq,x
  964. sta trackn_audf,x
  965. pp11
  966. EIF
  967. ppnext
  968. dex
  969. bmi rmt_p4
  970. jmp pp1
  971. rmt_p4
  972. IFT FEAT_AUDCTLMANUALSET
  973. lda trackn_audctl+0
  974. ora trackn_audctl+1
  975. ora trackn_audctl+2
  976. ora trackn_audctl+3
  977. tax
  978. ELS
  979. ldx #0
  980. EIF
  981. qq1
  982. stx v_audctl
  983. IFT FEAT_FILTER
  984. IFT FEAT_FILTERG0L
  985. lda trackn_command+0
  986. bpl qq2
  987. lda trackn_audc+0
  988. and #$0f
  989. beq qq2
  990. lda trackn_audf+0
  991. clc
  992. adc trackn_filter+0
  993. sta trackn_audf+2
  994. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L
  995. lda trackn_audc+2
  996. and #$10
  997. bne qq1a
  998. EIF
  999. lda #0
  1000. sta trackn_audc+2
  1001. qq1a
  1002. txa
  1003. ora #4
  1004. tax
  1005. EIF
  1006. qq2
  1007. IFT FEAT_FILTERG1L
  1008. lda trackn_command+1
  1009. bpl qq3
  1010. lda trackn_audc+1
  1011. and #$0f
  1012. beq qq3
  1013. lda trackn_audf+1
  1014. clc
  1015. adc trackn_filter+1
  1016. sta trackn_audf+3
  1017. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L
  1018. lda trackn_audc+3
  1019. and #$10
  1020. bne qq2a
  1021. EIF
  1022. lda #0
  1023. sta trackn_audc+3
  1024. qq2a
  1025. txa
  1026. ora #2
  1027. tax
  1028. EIF
  1029. qq3
  1030. IFT FEAT_FILTERG0L||FEAT_FILTERG1L
  1031. cpx v_audctl
  1032. bne qq5
  1033. EIF
  1034. EIF
  1035. IFT FEAT_BASS16
  1036. IFT FEAT_BASS16G1L
  1037. lda trackn_command+1
  1038. and #$0e
  1039. cmp #6
  1040. bne qq4
  1041. lda trackn_audc+1
  1042. and #$0f
  1043. beq qq4
  1044. ldy trackn_outnote+1
  1045. lda frqtabbasslo,y
  1046. sta trackn_audf+0
  1047. lda frqtabbasshi,y
  1048. sta trackn_audf+1
  1049. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L
  1050. lda trackn_audc+0
  1051. and #$10
  1052. bne qq3a
  1053. EIF
  1054. lda #0
  1055. sta trackn_audc+0
  1056. qq3a
  1057. txa
  1058. ora #$50
  1059. tax
  1060. EIF
  1061. qq4
  1062. IFT FEAT_BASS16G3L
  1063. lda trackn_command+3
  1064. and #$0e
  1065. cmp #6
  1066. bne qq5
  1067. lda trackn_audc+3
  1068. and #$0f
  1069. beq qq5
  1070. ldy trackn_outnote+3
  1071. lda frqtabbasslo,y
  1072. sta trackn_audf+2
  1073. lda frqtabbasshi,y
  1074. sta trackn_audf+3
  1075. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L
  1076. lda trackn_audc+2
  1077. and #$10
  1078. bne qq4a
  1079. EIF
  1080. lda #0
  1081. sta trackn_audc+2
  1082. qq4a
  1083. txa
  1084. ora #$28
  1085. tax
  1086. EIF
  1087. EIF
  1088. qq5
  1089. stx v_audctl
  1090. IFT TRACKS>4
  1091. IFT FEAT_AUDCTLMANUALSET
  1092. lda trackn_audctl+4
  1093. ora trackn_audctl+5
  1094. ora trackn_audctl+6
  1095. ora trackn_audctl+7
  1096. tax
  1097. ELS
  1098. ldx #0
  1099. EIF
  1100. stx v_audctl2
  1101. IFT FEAT_FILTER
  1102. IFT FEAT_FILTERG0R
  1103. lda trackn_command+0+4
  1104. bpl qs2
  1105. lda trackn_audc+0+4
  1106. and #$0f
  1107. beq qs2
  1108. lda trackn_audf+0+4
  1109. clc
  1110. adc trackn_filter+0+4
  1111. sta trackn_audf+2+4
  1112. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R
  1113. lda trackn_audc+2+4
  1114. and #$10
  1115. bne qs1a
  1116. EIF
  1117. lda #0
  1118. sta trackn_audc+2+4
  1119. qs1a
  1120. txa
  1121. ora #4
  1122. tax
  1123. EIF
  1124. qs2
  1125. IFT FEAT_FILTERG1R
  1126. lda trackn_command+1+4
  1127. bpl qs3
  1128. lda trackn_audc+1+4
  1129. and #$0f
  1130. beq qs3
  1131. lda trackn_audf+1+4
  1132. clc
  1133. adc trackn_filter+1+4
  1134. sta trackn_audf+3+4
  1135. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R
  1136. lda trackn_audc+3+4
  1137. and #$10
  1138. bne qs2a
  1139. EIF
  1140. lda #0
  1141. sta trackn_audc+3+4
  1142. qs2a
  1143. txa
  1144. ora #2
  1145. tax
  1146. EIF
  1147. qs3
  1148. IFT FEAT_FILTERG0R||FEAT_FILTERG1R
  1149. cpx v_audctl2
  1150. bne qs5
  1151. EIF
  1152. EIF
  1153. IFT FEAT_BASS16
  1154. IFT FEAT_BASS16G1R
  1155. lda trackn_command+1+4
  1156. and #$0e
  1157. cmp #6
  1158. bne qs4
  1159. lda trackn_audc+1+4
  1160. and #$0f
  1161. beq qs4
  1162. ldy trackn_outnote+1+4
  1163. lda frqtabbasslo,y
  1164. sta trackn_audf+0+4
  1165. lda frqtabbasshi,y
  1166. sta trackn_audf+1+4
  1167. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R
  1168. lda trackn_audc+0+4
  1169. and #$10
  1170. bne qs3a
  1171. EIF
  1172. lda #0
  1173. sta trackn_audc+0+4
  1174. qs3a
  1175. txa
  1176. ora #$50
  1177. tax
  1178. EIF
  1179. qs4
  1180. IFT FEAT_BASS16G3R
  1181. lda trackn_command+3+4
  1182. and #$0e
  1183. cmp #6
  1184. bne qs5
  1185. lda trackn_audc+3+4
  1186. and #$0f
  1187. beq qs5
  1188. ldy trackn_outnote+3+4
  1189. lda frqtabbasslo,y
  1190. sta trackn_audf+2+4
  1191. lda frqtabbasshi,y
  1192. sta trackn_audf+3+4
  1193. IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R
  1194. lda trackn_audc+2+4
  1195. and #$10
  1196. bne qs4a
  1197. EIF
  1198. lda #0
  1199. sta trackn_audc+2+4
  1200. qs4a
  1201. txa
  1202. ora #$28
  1203. tax
  1204. EIF
  1205. EIF
  1206. qs5
  1207. stx v_audctl2
  1208. EIF
  1209. rmt_p5
  1210. IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1
  1211. lda v_ainstrspeed
  1212. ELS
  1213. lda #1
  1214. EIF
  1215. rts
  1216. SetPokey
  1217. IFT STEREOMODE==1 ;* L1 L2 L3 L4 R1 R2 R3 R4
  1218. ldy #$ff
  1219. v_audctl2 equ *-1
  1220. lda trackn_audf+0+4
  1221. ldx trackn_audf+0
  1222. xstastx01 sta $d210
  1223. stx $d200
  1224. lda trackn_audc+0+4
  1225. ldx trackn_audc+0
  1226. xstastx02 sta $d211
  1227. stx $d201
  1228. lda trackn_audf+1+4
  1229. ldx trackn_audf+1
  1230. xstastx03 sta $d212
  1231. stx $d202
  1232. lda trackn_audc+1+4
  1233. ldx trackn_audc+1
  1234. xstastx04 sta $d213
  1235. stx $d203
  1236. lda trackn_audf+2+4
  1237. ldx trackn_audf+2
  1238. xstastx05 sta $d214
  1239. stx $d204
  1240. lda trackn_audc+2+4
  1241. ldx trackn_audc+2
  1242. xstastx06 sta $d215
  1243. stx $d205
  1244. lda trackn_audf+3+4
  1245. ldx trackn_audf+3
  1246. xstastx07 sta $d216
  1247. stx $d206
  1248. lda trackn_audc+3+4
  1249. ldx trackn_audc+3
  1250. xstastx08 sta $d217
  1251. stx $d207
  1252. lda #$ff
  1253. v_audctl equ *-1
  1254. xstysta01 sty $d218
  1255. sta $d208
  1256. ELI STEREOMODE==0 ;* L1 L2 L3 L4
  1257. ldy #$ff
  1258. v_audctl equ *-1
  1259. lda trackn_audf+0
  1260. ldx trackn_audc+0
  1261. sta $d200
  1262. stx $d201
  1263. lda trackn_audf+1
  1264. ldx trackn_audc+1
  1265. sta $d200+2
  1266. stx $d201+2
  1267. lda trackn_audf+2
  1268. ldx trackn_audc+2
  1269. sta $d200+4
  1270. stx $d201+4
  1271. lda trackn_audf+3
  1272. ldx trackn_audc+3
  1273. sta $d200+6
  1274. stx $d201+6
  1275. sty $d208
  1276. ELI STEREOMODE==2 ;* L1 R2 R3 L4
  1277. ldy #$ff
  1278. v_audctl equ *-1
  1279. lda trackn_audf+0
  1280. ldx trackn_audc+0
  1281. sta $d200
  1282. stx $d201
  1283. sta $d210
  1284. lda trackn_audf+1
  1285. ldx trackn_audc+1
  1286. sta $d210+2
  1287. stx $d211+2
  1288. lda trackn_audf+2
  1289. ldx trackn_audc+2
  1290. sta $d210+4
  1291. stx $d211+4
  1292. sta $d200+4
  1293. lda trackn_audf+3
  1294. ldx trackn_audc+3
  1295. sta $d200+6
  1296. stx $d201+6
  1297. sta $d210+6
  1298. sty $d218
  1299. sty $d208
  1300. ELI STEREOMODE==3 ;* L1 L2 R3 R4
  1301. ldy #$ff
  1302. v_audctl equ *-1
  1303. lda trackn_audf+0
  1304. ldx trackn_audc+0
  1305. sta $d200
  1306. stx $d201
  1307. lda trackn_audf+1
  1308. ldx trackn_audc+1
  1309. sta $d200+2
  1310. stx $d201+2
  1311. lda trackn_audf+2
  1312. ldx trackn_audc+2
  1313. sta $d210+4
  1314. stx $d211+4
  1315. sta $d200+4
  1316. lda trackn_audf+3
  1317. ldx trackn_audc+3
  1318. sta $d210+6
  1319. stx $d211+6
  1320. sta $d200+6
  1321. sty $d218
  1322. sty $d208
  1323. EIF
  1324. rts
  1325. RMTEND