;* ;* Raster Music Tracker, RMT Atari routine version 1.20030510 ;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2003 ;* http://raster.atari.org ;* ;* Warnings: ;* ;* 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed ;* from any other routines) as well as cca 1KB of memory before the "PLAYER" ;* address for frequency tables and functionary variables. It's: ;* a) from PLAYER-$400 to PLAYER for stereo RMTplayer ;* b) from PLAYER-$380 to PLAYER for mono RMTplayer ;* ;* 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page. ;* i.e. "PLAYER" address can be $..00 only! ;* ;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. ;* PLAYER equ $3400 ;* IFT STEREO8T TRACKS equ 8 ELS TRACKS equ 4 EIF ;* ;* RMT FEATures definitions file ;* For optimizations of RMT player routine to concrete RMT modul only! icl "rmt_feat.a65" ;* ;* RMT ZeroPage addresses org 203 p_tis p_instrstable org *+2 p_trackslbstable org *+2 p_trackshbstable org *+2 p_song org *+2 ns org *+2 nr org *+2 nt org *+2 reg1 org *+1 reg2 org *+1 reg3 org *+1 tmp org *+1 IFT FEAT_COMMAND2 frqaddcmd2 org *+1 EIF IFT STEREO8T org PLAYER-$400 ELS org PLAYER-$380 EIF track_variables trackn_db org *+TRACKS trackn_hb org *+TRACKS trackn_idx org *+TRACKS trackn_pause org *+TRACKS trackn_note org *+TRACKS trackn_volume org *+TRACKS trackn_distor org *+TRACKS trackn_shiftfrq org *+TRACKS IFT FEAT_PORTAMENTO trackn_portafrqc org *+TRACKS trackn_portafrqa org *+TRACKS trackn_portaspeed org *+TRACKS trackn_portaspeeda org *+TRACKS trackn_portadepth org *+TRACKS EIF trackn_instrx2 org *+TRACKS trackn_instrdb org *+TRACKS trackn_instrhb org *+TRACKS trackn_instridx org *+TRACKS trackn_instrlen org *+TRACKS trackn_instrlop org *+TRACKS trackn_instrreachend org *+TRACKS trackn_volumeslidedepth org *+TRACKS trackn_volumeslidevalue org *+TRACKS trackn_volumemin org *+TRACKS trackn_effdelay org *+TRACKS trackn_effvibratoa org *+TRACKS trackn_effvibratobeg org *+TRACKS trackn_effvibratoend org *+TRACKS trackn_effshift org *+TRACKS trackn_tabletypespeed org *+TRACKS IFT FEAT_TABLEMODE trackn_tablemode org *+TRACKS EIF trackn_tablenote org *+TRACKS trackn_tablea org *+TRACKS trackn_tableend org *+TRACKS trackn_tablelop org *+TRACKS trackn_tablespeeda org *+TRACKS trackn_command org *+TRACKS IFT FEAT_BASS16 trackn_outnote org *+TRACKS EIF IFT FEAT_FILTER trackn_filter org *+TRACKS EIF trackn_audf org *+TRACKS trackn_audc org *+TRACKS IFT FEAT_AUDCTLMANUALSET trackn_audctl org *+TRACKS EIF v_audctl org *+1 v_audctl2 org *+1 v_speed org *+1 v_aspeed org *+1 v_bspeed org *+1 v_instrspeed org *+1 v_ainstrspeed org *+1 v_maxtracklen org *+1 v_abeat org *+1 track_endvariables org PLAYER-$100-$140-$30 INSTRPAR equ 12 tabbeganddistor dta frqtabpure-frqtab,$00 dta frqtabpure-frqtab,$20 dta frqtabpure-frqtab,$40 dta frqtabbass1-frqtab,$c0 dta frqtabpure-frqtab,$80 dta frqtabpure-frqtab,$a0 dta frqtabbass1-frqtab,$c0 dta frqtabbass2-frqtab,$c0 vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0,vibx-vib0 vib0 dta 0 vib1 dta 1,-1,-1,1 vib2 dta 1,0,-1,-1,0,1 vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 vibx emptytrack dta 62,0 org PLAYER-$100-$140 IFT FEAT_BASS16 frqtabbasslo dta $F2,$33,$96,$E2,$38,$8C,$00,$6A,$E8,$6A,$EF,$80,$08,$AE,$46,$E6 dta $95,$41,$F6,$B0,$6E,$30,$F6,$BB,$84,$52,$22,$F4,$C8,$A0,$7A,$55 dta $34,$14,$F5,$D8,$BD,$A4,$8D,$77,$60,$4E,$38,$27,$15,$06,$F7,$E8 dta $DB,$CF,$C3,$B8,$AC,$A2,$9A,$90,$88,$7F,$78,$70,$6A,$64,$5E,$00 EIF org PLAYER-$100-$100 frqtab ERT [255 ldy #0 tya ri0 sta track_variables,y sta track_endvariables-$100,y iny bne ri0 ELS ldy #track_endvariables-track_variables lda #0 ri0 sta track_variables-1,y dey bne ri0 EIF ldy #4 lda (ns),y sta v_maxtracklen iny lda (ns),y sta v_speed iny lda (ns),y sta v_instrspeed sta v_ainstrspeed ldy #8 ri1 lda (ns),y sta p_tis-8,y iny cpy #8+8 bne ri1 pla pha IFT STEREO8T asl @ asl @ asl @ clc adc p_song sta p_song pla and #$e0 asl @ rol @ rol @ rol @ ELS asl @ asl @ clc adc p_song sta p_song pla and #$c0 asl @ rol @ rol @ EIF adc p_song+1 sta p_song+1 jsr GetSongLine jsr GetTrackLine jsr InitOfNewSetInstrumentsOnly jsr rmt_p3 jsr rmt_silence lda v_instrspeed rts rmt_silence IFT STEREO8T lda #0 sta $d208 sta $d218 ldy #3 sty $d20f sty $d21f ldy #8 si1 sta $d200,y sta $d210,y dey bpl si1 ELS lda #0 sta $d208 ldy #3 sty $d20f ldy #8 si1 sta $d200,y dey bpl si1 EIF rts GetSongLine ldx #0 stx v_abeat nn0 ldx #0 nn1 txa tay lda (p_song),y cmp #$fe bcs nn2 tay lda (p_trackslbstable),y sta trackn_db,x lda (p_trackshbstable),y nn1a sta trackn_hb,x lda #0 sta trackn_idx,x lda #1 sta trackn_pause,x lda #$80 sta trackn_instrx2,x inx cpx #TRACKS bne nn1 lda p_song clc adc #TRACKS sta p_song bcc nn1b inc p_song+1 nn1b rts nn2 beq nn3 nn2a lda #emptytrack jmp nn1a nn3 ldy #2 lda (p_song),y tax iny lda (p_song),y sta p_song+1 stx p_song jmp nn0 GetTrackLine oo0 oo0a lda v_speed sta v_bspeed ldx #0 oo1 lda trackn_pause,x beq oo1x dec trackn_pause,x bne oo1x inc trackn_pause,x oo1b lda trackn_db,x sta ns lda trackn_hb,x sta ns+1 oo1i ldy trackn_idx,x lda (ns),y sta reg1 iny lda (ns),y sta reg2 iny tya sta trackn_idx,x lda reg1 and #$3f cmp #61 beq oo1a bcs oo2 sta trackn_note,x IFT FEAT_BASS16 sta trackn_outnote,x EIF lda reg2 lsr @ and #$3f*2 sta trackn_instrx2,x oo1a lda reg2 lsr @ ror reg1 lsr @ ror reg1 lda reg1 and #$f0 sta trackn_volume,x oo1x inx cpx #TRACKS bne oo1 lda v_bspeed sta v_speed sta v_aspeed rts oo2 cmp #63 beq oo63 lda reg1 and #$c0 beq oo62_b asl @ rol @ rol @ sta trackn_pause,x dec trackn_idx,x jmp oo1x oo62_b lda reg2 sta trackn_pause,x jmp oo1x oo63 lda reg1 bmi oo63_1X lda reg2 sta v_bspeed jmp oo1i oo63_1X cmp #255 beq oo63_11 lda reg2 sta trackn_idx,x jmp oo1i oo63_11 jsr GetSongLine jmp oo0 InitOfNewSetInstrumentsOnly ldx #0 p2x1 ldy trackn_instrx2,x bmi p2x2 jsr SetUpInstrumentY2 lda #$80 sta trackn_instrx2,x p2x2 inx cpx #TRACKS bne p2x1 rts rmt_play rmt_p0 jsr SetPokey rmt_p1 dec v_ainstrspeed beq p1a jmp rmt_p3 p1a lda v_instrspeed sta v_ainstrspeed rmt_p2 dec v_aspeed bne rmt_p3 inc v_abeat lda v_abeat cmp v_maxtracklen bne p2o2 jsr GetSongLine p2o2 jsr GetTrackLine jmp rmt_p2X go_ppnext jmp ppnext rmt_p2X jsr InitOfNewSetInstrumentsOnly rmt_p3 lda #>frqtab sta nr+1 ldx #0 pp1 lda trackn_instrhb,x beq go_ppnext sta ns+1 lda trackn_instrdb,x sta ns ldy trackn_instridx,x lda (ns),y sta reg1 iny lda (ns),y sta reg2 iny lda (ns),y sta reg3 iny tya cmp trackn_instrlen,x bcc pp2 beq pp2 lda #$80 sta trackn_instrreachend,x pp1b lda trackn_instrlop,x pp2 sta trackn_instridx,x lda reg1 IFT STEREO8T cpx #4 bcc pp2s lsr @ lsr @ lsr @ lsr @ pp2s EIF and #$0f ora trackn_volume,x tay lda volumetab,y pha lda reg2 and #$0e tay lda tabbeganddistor,y sta nr pla ora tabbeganddistor+1,y sta trackn_audc,x jmp InstrumentsEffects returnfromInstrumentsEffects IFT FEAT_COMMAND2 lda #0 sta frqaddcmd2 EIF lda reg2 sta trackn_command,x and #$70 lsr @ lsr @ sta jmx+1 jmx bcc * jmp cmd0 nop jmp cmd1 nop jmp cmd2 nop jmp cmd3 nop jmp cmd4 nop jmp cmd5 nop jmp cmd6 nop jmp cmd7 cmd0 lda trackn_note,x clc adc reg3 cmd0a IFT FEAT_TABLETYPE ldy trackn_tabletypespeed,x bmi cmd0b EIF clc adc trackn_tablenote,x cmp #61 bcc cmd0a1 lda #0 sta trackn_audc,x lda #63 cmd0a1 IFT FEAT_BASS16 sta trackn_outnote,x EIF tay lda (nr),y clc adc trackn_shiftfrq,x IFT FEAT_COMMAND2 clc adc frqaddcmd2 EIF sta trackn_audf,x jmp pp9 IFT FEAT_TABLETYPE cmd0b cmp #61 bcc cmd0b1 lda #0 sta trackn_audc,x lda #63 cmd0b1 tay lda trackn_shiftfrq,x clc adc trackn_tablenote,x clc adc (nr),y IFT FEAT_COMMAND2 clc adc frqaddcmd2 EIF sta trackn_audf,x jmp pp9 EIF cmd1 IFT FEAT_COMMAND1 lda reg3 sta trackn_audf,x jmp pp9 EIF cmd2 IFT FEAT_COMMAND2 lda reg3 sta frqaddcmd2 lda trackn_note,x jmp cmd0a EIF cmd3 IFT FEAT_COMMAND3 lda trackn_note,x clc adc reg3 sta trackn_note,x jmp cmd0a EIF cmd4 IFT FEAT_COMMAND4 lda trackn_shiftfrq,x clc adc reg3 sta trackn_shiftfrq,x lda trackn_note,x jmp cmd0a EIF cmd5 IFT FEAT_COMMAND5&&FEAT_PORTAMENTO IFT FEAT_TABLETYPE lda trackn_tabletypespeed,x bpl cmd5a1 ldy trackn_note,x lda (nr),y clc adc trackn_tablenote,x jmp cmd5ax EIF cmd5a1 lda trackn_note,x clc adc trackn_tablenote,x cmp #61 bcc cmd5a2 lda #63 cmd5a2 tay lda (nr),y cmd5ax sta trackn_portafrqc,x ldy reg3 bne cmd5a sta trackn_portafrqa,x cmd5a tya lsr @ lsr @ lsr @ lsr @ sta trackn_portaspeed,x sta trackn_portaspeeda,x lda reg3 and #$0f sta trackn_portadepth,x lda trackn_note,x jmp cmd0a ELI FEAT_COMMAND5 jmp pp9 EIF cmd6 IFT FEAT_COMMAND6&&FEAT_FILTER lda reg3 clc adc trackn_filter,x sta trackn_filter,x lda trackn_note,x jmp cmd0a ELI FEAT_COMMAND6 jmp pp9 EIF cmd7 IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY IFT FEAT_COMMAND7SETNOTE lda reg3 IFT FEAT_COMMAND7VOLUMEONLY cmp #$80 beq cmd7a EIF sta trackn_note,x jmp cmd0a EIF IFT FEAT_COMMAND7VOLUMEONLY cmd7a lda trackn_audc,x ora #$f0 sta trackn_audc,x lda trackn_note,x jmp cmd0a EIF EIF pp9 IFT FEAT_PORTAMENTO lda trackn_portaspeeda,x beq pp10 sec sbc #1 sta trackn_portaspeeda,x bne pp10 lda trackn_portaspeed,x sta trackn_portaspeeda,x lda trackn_portafrqa,x cmp trackn_portafrqc,x beq pp10 bcs pps1 adc trackn_portadepth,x bcs pps8 cmp trackn_portafrqc,x bcs pps8 jmp pps9 pps1 sbc trackn_portadepth,x bcc pps8 cmp trackn_portafrqc,x bcs pps9 pps8 lda trackn_portafrqc,x pps9 sta trackn_portafrqa,x pp10 lda reg2 and #$01 beq pp11 lda trackn_portafrqa,x clc adc trackn_shiftfrq,x sta trackn_audf,x pp11 EIF ppnext inx cpx #TRACKS beq rmt_p4 jmp pp1 rmt_p4 IFT FEAT_AUDCTLMANUALSET ldx #3 lda #0 qq0 ora trackn_audctl,x dex bpl qq0 sta v_audctl qq1 ldx v_audctl ELS ldx #0 stx v_audctl EIF IFT FEAT_FILTER IFT FEAT_FILTERG0L lda trackn_command+0 bpl qq2 lda trackn_audc+0 and #$0f beq qq2 lda trackn_audf+0 clc adc trackn_filter+0 sta trackn_audf+2 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L lda trackn_audc+2 and #$10 bne qq1a EIF lda #0 sta trackn_audc+2 qq1a txa ora #4 tax EIF qq2 IFT FEAT_FILTERG1L lda trackn_command+1 bpl qq3 lda trackn_audc+1 and #$0f beq qq3 lda trackn_audf+1 clc adc trackn_filter+1 sta trackn_audf+3 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L lda trackn_audc+3 and #$10 bne qq2a EIF lda #0 sta trackn_audc+3 qq2a txa ora #2 tax EIF qq3 IFT FEAT_FILTERG0L||FEAT_FILTERG1L cpx v_audctl bne qq5 EIF EIF IFT FEAT_BASS16 IFT FEAT_BASS16G1L lda trackn_command+1 and #$0e cmp #6 bne qq4 lda trackn_audc+1 and #$0f beq qq4 ldy trackn_outnote+1 lda frqtabbasslo,y sta trackn_audf+0 lda frqtabbasshi,y sta trackn_audf+1 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L lda trackn_audc+0 and #$10 bne qq3a EIF lda #0 sta trackn_audc+0 qq3a txa ora #$50 tax EIF qq4 IFT FEAT_BASS16G3L lda trackn_command+3 and #$0e cmp #6 bne qq5 lda trackn_audc+3 and #$0f beq qq5 ldy trackn_outnote+3 lda frqtabbasslo,y sta trackn_audf+2 lda frqtabbasshi,y sta trackn_audf+3 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L lda trackn_audc+2 and #$10 bne qq4a EIF lda #0 sta trackn_audc+2 qq4a txa ora #$28 tax EIF EIF qq5 stx v_audctl IFT STEREO8T IFT FEAT_AUDCTLMANUALSET ldx #3 lda #0 qs0 ora trackn_audctl+4,x dex bpl qs0 sta v_audctl2 qs1 ldx v_audctl2 ELS ldx #0 stx v_audctl2 EIF IFT FEAT_FILTER IFT FEAT_FILTERG0R lda trackn_command+0+4 bpl qs2 lda trackn_audc+0+4 and #$0f beq qs2 lda trackn_audf+0+4 clc adc trackn_filter+0+4 sta trackn_audf+2+4 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R lda trackn_audc+2+4 and #$10 bne qs1a EIF lda #0 sta trackn_audc+2+4 qs1a txa ora #4 tax EIF qs2 IFT FEAT_FILTERG1R lda trackn_command+1+4 bpl qs3 lda trackn_audc+1+4 and #$0f beq qs3 lda trackn_audf+1+4 clc adc trackn_filter+1+4 sta trackn_audf+3+4 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R lda trackn_audc+3+4 and #$10 bne qs2a EIF lda #0 sta trackn_audc+3+4 qs2a txa ora #2 tax EIF qs3 IFT FEAT_FILTERG0R||FEAT_FILTERG1R cpx v_audctl2 bne qs5 EIF EIF IFT FEAT_BASS16 IFT FEAT_BASS16G1R lda trackn_command+1+4 and #$0e cmp #6 bne qs4 lda trackn_audc+1+4 and #$0f beq qs4 ldy trackn_outnote+1+4 lda frqtabbasslo,y sta trackn_audf+0+4 lda frqtabbasshi,y sta trackn_audf+1+4 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R lda trackn_audc+0+4 and #$10 bne qs3a EIF lda #0 sta trackn_audc+0+4 qs3a txa ora #$50 tax EIF qs4 IFT FEAT_BASS16G3R lda trackn_command+3+4 and #$0e cmp #6 bne qs5 lda trackn_audc+3+4 and #$0f beq qs5 ldy trackn_outnote+3+4 lda frqtabbasslo,y sta trackn_audf+2+4 lda frqtabbasshi,y sta trackn_audf+3+4 IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R lda trackn_audc+2+4 and #$10 bne qs4a EIF lda #0 sta trackn_audc+2+4 qs4a txa ora #$28 tax EIF EIF qs5 stx v_audctl2 EIF rmt_p5 lda v_ainstrspeed rts SetPokey IFT STEREO8T ldy v_audctl2 lda trackn_audf+0+4 ldx trackn_audf+0 sta $d210 stx $d200 lda trackn_audc+0+4 ldx trackn_audc+0 sta $d211 stx $d201 lda trackn_audf+1+4 ldx trackn_audf+1 sta $d212 stx $d202 lda trackn_audc+1+4 ldx trackn_audc+1 sta $d213 stx $d203 lda trackn_audf+2+4 ldx trackn_audf+2 sta $d214 stx $d204 lda trackn_audc+2+4 ldx trackn_audc+2 sta $d215 stx $d205 lda trackn_audf+3+4 ldx trackn_audf+3 sta $d216 stx $d206 lda trackn_audc+3+4 ldx trackn_audc+3 sta $d217 stx $d207 lda v_audctl sty $d218 sta $d208 ELS ldy v_audctl lda trackn_audf+0 ldx trackn_audc+0 sta $d200 stx $d201 lda trackn_audf+1 ldx trackn_audc+1 sta $d200+2 stx $d201+2 lda trackn_audf+2 ldx trackn_audc+2 sta $d200+4 stx $d201+4 lda trackn_audf+3 ldx trackn_audc+3 sta $d200+6 stx $d201+6 sty $d208 EIF rts SetUpInstrumentY2 lda (p_instrstable),y sta trackn_instrdb,x sta nt iny lda (p_instrstable),y sta trackn_instrhb,x sta nt+1 ldy #0 lda (nt),y sta trackn_tableend,x clc adc #1 sta trackn_instridx,x iny lda (nt),y sta trackn_tablelop,x iny lda (nt),y sta trackn_instrlen,x iny lda (nt),y sta trackn_instrlop,x iny lda (nt),y sta trackn_tabletypespeed,x IFT FEAT_TABLETYPE||FEAT_TABLEMODE and #$3f EIF sta trackn_tablespeeda,x IFT FEAT_TABLEMODE lda (nt),y and #$40 sta trackn_tablemode,x EIF iny IFT FEAT_AUDCTLMANUALSET lda (nt),y sta trackn_audctl,x EIF iny lda (nt),y sta trackn_volumeslidedepth,x iny lda (nt),y sta trackn_volumemin,x iny lda (nt),y sta trackn_effdelay,x iny lda (nt),y tay lda vibtabbeg,y sta trackn_effvibratoa,x sta trackn_effvibratobeg,x lda vibtabbeg+1,y sta trackn_effvibratoend,x ldy #10 lda (nt),y sta trackn_effshift,x lda #128 sta trackn_volumeslidevalue,x lda #0 sta trackn_instrreachend,x sta trackn_shiftfrq,x lda #INSTRPAR sta trackn_tablea,x tay lda (nt),y sta trackn_tablenote,x IFT FEAT_FILTER lda #1 sta trackn_filter,x EIF rts InstrumentsEffects lda trackn_effdelay,x beq ei2 tay dey bne ei1 lda trackn_shiftfrq,x clc adc trackn_effshift,x clc ldy trackn_effvibratoa,x adc vib0,y sta trackn_shiftfrq,x iny tya cmp trackn_effvibratoend,x bne ei1a lda trackn_effvibratobeg,x ei1a sta trackn_effvibratoa,x jmp ei2 ei1 tya sta trackn_effdelay,x ei2 lda trackn_tableend,x cmp #INSTRPAR beq ei3 lda trackn_tablespeeda,x bpl ei2f ei2c lda trackn_tablea,x clc adc #1 cmp trackn_tableend,x bcc ei2a beq ei2a lda trackn_tablelop,x ei2a sta trackn_tablea,x lda trackn_instrdb,x sta nt lda trackn_instrhb,x sta nt+1 ldy trackn_tablea,x lda (nt),y IFT FEAT_TABLEMODE ldy trackn_tablemode,x beq ei2e clc adc trackn_tablenote,x ei2e EIF sta trackn_tablenote,x lda trackn_tabletypespeed,x IFT FEAT_TABLETYPE||FEAT_TABLEMODE and #$3f EIF ei2f sec sbc #1 sta trackn_tablespeeda,x ei3 lda trackn_instrreachend,x bpl ei4 lda trackn_volume,x beq ei4 cmp trackn_volumemin,x beq ei4 bcc ei4 tay lda trackn_volumeslidevalue,x clc adc trackn_volumeslidedepth,x sta trackn_volumeslidevalue,x bcc ei4 tya sbc #16 sta trackn_volume,x ei4 jmp returnfromInstrumentsEffects