; ; Raster Music Tracker, RMT Atari routine version 1.20090108 ; (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 ; 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-$03c0 to PLAYER for stereo RMTplayer ; b) from PLAYER-$0320 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. ; ; STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono ; ;1 => compile RMTplayer for 8 tracks stereo ; ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 ; ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 TRACKS equ 4 ; RMT FEATures definitions file ; For optimizations of RMT player routine to concrete RMT modul only! icl "feat.txt" ;FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT ; ; RMT ZeroPage addresses .zpvar p_tis .word p_instrstable = p_tis .zpvar p_trackslbstable .word .zpvar p_trackshbstable .word .zpvar p_song .word .zpvar ns .word .zpvar nr .word .zpvar nt .byte .zpvar reg1 .byte .zpvar reg2 .byte .zpvar reg3 .byte .zpvar tmp .byte .zpvar v_audctl .byte ; de-self-modification vars .zpvar v_ainstrspeed .byte .zpvar v_maxtracklen .byte .zpvar v_abeat .byte .zpvar v_bspeed .byte .zpvar v_speed .byte .zpvar RMTSFXVOLUME .byte ; MOVED TO variables.asm ; org PLAYER-$400+$e0 ;track_variables ;trackn_db .ds TRACKS ;trackn_hb .ds TRACKS ;trackn_idx .ds TRACKS ;trackn_pause .ds TRACKS ;trackn_note .ds TRACKS ;trackn_volume .ds TRACKS ;trackn_distor .ds TRACKS ;trackn_shiftfrq .ds TRACKS ;trackn_instrx2 .ds TRACKS ;trackn_instrdb .ds TRACKS ;trackn_instrhb .ds TRACKS ;trackn_instridx .ds TRACKS ;trackn_instrlen .ds TRACKS ;trackn_instrlop .ds TRACKS ;trackn_instrreachend .ds TRACKS ;trackn_volumeslidedepth .ds TRACKS ;trackn_volumeslidevalue .ds TRACKS ;trackn_effdelay .ds TRACKS ;trackn_effvibratoa .ds TRACKS ;trackn_effshift .ds TRACKS ;trackn_tabletypespeed .ds TRACKS ;trackn_tablenote .ds TRACKS ;trackn_tablea .ds TRACKS ;trackn_tableend .ds TRACKS ;trackn_tablelop .ds TRACKS ;trackn_tablespeeda .ds TRACKS ;trackn_command .ds TRACKS ;trackn_filter .ds TRACKS ;trackn_audf .ds TRACKS ;trackn_audc .ds TRACKS ;trackn_audctl .ds TRACKS ;v_aspeed .ds 1 ;track_endvariables 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 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 vibtabnext dta vib0-vib0+0 dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 .align $100 frqtab ERT [frqtab sta nr+1 xtracks05sub1 ldx #TRACKS-1 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 and #$0f ora trackn_volume,x tay lda volumetab,y sta tmp lda reg2 and #$0e tay lda tabbeganddistor,y sta nr lda tmp ora tabbeganddistor+1,y sta trackn_audc,x InstrumentsEffects lda trackn_effdelay,x beq ei2 cmp #1 bne ei1 lda trackn_shiftfrq,x clc adc trackn_effshift,x clc ldy trackn_effvibratoa,x adc vib0,y sta trackn_shiftfrq,x lda vibtabnext,y sta trackn_effvibratoa,x jmp ei2 ei1 dec trackn_effdelay,x ei2 ldy trackn_tableend,x cpy #INSTRPAR+1 bcc ei3 lda trackn_tablespeeda,x bpl ei2f ei2c tya cmp trackn_tablea,x bne ei2c2 lda trackn_tablelop,x sta trackn_tablea,x bne ei2a ei2c2 inc trackn_tablea,x ei2a lda trackn_instrdb,x sta nt lda trackn_instrhb,x sta nt+1 ldy trackn_tablea,x lda (nt),y sta trackn_tablenote,x lda trackn_tabletypespeed,x ei2f sec sbc #1 sta trackn_tablespeeda,x ei3 lda trackn_instrreachend,x bpl ei4 lda trackn_volume,x beq 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 lda reg2 sta trackn_command,x and #$70 beq cmd0 cmd1 lda reg3 jmp cmd0c cmd2 cmd3 cmd4 cmd5 cmd6 cmd7 cmd0 lda trackn_note,x clc adc reg3 cmd0a clc adc trackn_tablenote,x cmp #61 bcc cmd0a1 lda #0 sta trackn_audc,x lda #63 cmd0a1 tay lda (nr),y clc adc trackn_shiftfrq,x cmd0c sta trackn_audf,x pp9 ppnext dex bmi rmt_p4 jmp pp1 rmt_p4 lda trackn_audctl+0 ora trackn_audctl+1 ora trackn_audctl+2 ora trackn_audctl+3 tax qq1 stx v_audctl 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 lda #0 sta trackn_audc+2 qq1a txa ora #4 tax qq2 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 lda #0 sta trackn_audc+3 qq2a txa ora #2 tax qq3 ; cpx v_audctl ; bne qq5 ;qq5 stx v_audctl rmt_p5 ; lda v_ainstrspeed .IF TARGET = 800 ldx #$10 ; pseudo stereo bne SetPokey_OffsetX ; pseudo stereo .ELIF TARGET = 5200 rts .ENDIF SetPokey ldx #0 ; POKEY registers offset (for stereo) SetPokey_OffsetX lda trackn_audf+0 sta AUDF1,x lda trackn_audc+0 sta AUDC1,x lda trackn_audf+1 sta AUDF2,x lda trackn_audc+1 sta AUDC2,x lda trackn_audf+2 sta AUDF3,x lda trackn_audc+2 sta AUDC3,x lda trackn_audf+3 sta AUDF4,x lda trackn_audc+3 sta AUDC4,x lda v_audctl sta AUDCTL,x rts RMTPLAYEREND