📄 rmt.asx
字号:
;*;* Raster Music Tracker, RMT Atari routine version 1.20051226;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2005;* 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.;*;* STEREOMODE equ 0 ;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;*PLAYER equ $0600;* IFT STEREOMODE==1TRACKS equ 8 ELSTRACKS equ 4 EIF;*;* RMT FEATures definitions;* For optimizations of RMT player routine to concrete RMT modul only!;* --------BEGIN--------FEAT_INSTRSPEED equ 0 ;* cca 21 or 5 bytesFEAT_CONSTANTSPEED equ 0 ;* cca 28 bytes;* VARIOUS COMMANDSFEAT_COMMAND1 equ 1 ;* cca 8 bytesFEAT_COMMAND2 equ 1 ;* cca 20 bytes (+save 1 address in zero page) and quicker whole RMT routineFEAT_COMMAND3 equ 1 ;* cca 12 bytesFEAT_COMMAND4 equ 1 ;* cca 15 bytesFEAT_COMMAND5 equ 1 ;* cca 67 bytesFEAT_COMMAND6 equ 1 ;* cca 15 bytes;* COMMAND7 SETNOTE (i.e. command 7 with parameter != $80)FEAT_COMMAND7SETNOTE equ 1 ;* cca 12 bytes;* COMMAND7 VOLUMEONLY (i.e. command 7 with parameter == $80)FEAT_COMMAND7VOLUMEONLY equ 1 ;* cca 74 bytes;* PORTAMENTOFEAT_PORTAMENTO equ 1 ;* cca 138 bytes and quicker whole RMT routine;* FILTERFEAT_FILTER equ 1 ;* cca 179 bytes and quicker whole RMT routineFEAT_FILTERG0L equ 1 ;* (cca 38 bytes for each)FEAT_FILTERG1L equ 1FEAT_FILTERG0R equ 1FEAT_FILTERG1R equ 1;* BASS16B (i.e. distortion value 6)FEAT_BASS16 equ 1 ;* cca 194 bytes +128bytes freq table and quicker whole RMT routineFEAT_BASS16G1L equ 1 ;* (cca 47 bytes for each)FEAT_BASS16G3L equ 1FEAT_BASS16G1R equ 1FEAT_BASS16G3R equ 1;* VOLUME ONLY for particular generatorsFEAT_VOLUMEONLYG0L equ 1 ;* (cca 7 bytes for each)FEAT_VOLUMEONLYG2L equ 1FEAT_VOLUMEONLYG3L equ 1FEAT_VOLUMEONLYG0R equ 1FEAT_VOLUMEONLYG2R equ 1FEAT_VOLUMEONLYG3R equ 1;* TABLE TYPE (i.e. TABLETYPE=1)FEAT_TABLETYPE equ 1 ;* cca 53 bytes and quicker whole RMT routine;* TABLE MODE (i.e. TABLEMODE=1)FEAT_TABLEMODE equ 1 ;* cca 16 bytes and quicker whole RMT routine;* TABLE GO (i.e. TGO is nonzero value)FEAT_TABLEGO equ 1 ;* cca 6 bytes and quicker whole RMT routine;* AUDCTLMANUALSET (i.e. any MANUAL AUDCTL setting is nonzero value)FEAT_AUDCTLMANUALSET equ 1 ;* cca 27 bytes and quicker whole RMT routine;* VOLUME MINIMUM (i.e. VMIN is nonzero value)FEAT_VOLUMEMIN equ 1 ;* cca 12 bytes and quicker whole RMT routine;* --------END--------;*;* RMT ZeroPage addresses org 203p_tisp_instrstable org *+2p_trackslbstable org *+2p_trackshbstable org *+2p_song org *+2ns org *+2nr org *+2nt org *+2reg1 org *+1reg2 org *+1reg3 org *+1tmp org *+1 IFT FEAT_COMMAND2frqaddcmd2 org *+1 EIF IFT TRACKS>4 org PLAYER-$400 ELS org PLAYER-$380 EIFtrack_variablestrackn_db org *+TRACKStrackn_hb org *+TRACKStrackn_idx org *+TRACKStrackn_pause org *+TRACKStrackn_note org *+TRACKStrackn_volume org *+TRACKStrackn_distor org *+TRACKStrackn_shiftfrq org *+TRACKS IFT FEAT_PORTAMENTOtrackn_portafrqc org *+TRACKStrackn_portafrqa org *+TRACKStrackn_portaspeed org *+TRACKStrackn_portaspeeda org *+TRACKStrackn_portadepth org *+TRACKS EIFtrackn_instrx2 org *+TRACKStrackn_instrdb org *+TRACKStrackn_instrhb org *+TRACKStrackn_instridx org *+TRACKStrackn_instrlen org *+TRACKStrackn_instrlop org *+TRACKStrackn_instrreachend org *+TRACKStrackn_volumeslidedepth org *+TRACKStrackn_volumeslidevalue org *+TRACKS IFT FEAT_VOLUMEMINtrackn_volumemin org *+TRACKS EIFtrackn_effdelay org *+TRACKStrackn_effvibratoa org *+TRACKStrackn_effvibratobeg org *+TRACKStrackn_effvibratoend org *+TRACKStrackn_effshift org *+TRACKStrackn_tabletypespeed org *+TRACKS IFT FEAT_TABLEMODEtrackn_tablemode org *+TRACKS EIFtrackn_tablenote org *+TRACKStrackn_tablea org *+TRACKStrackn_tableend org *+TRACKS IFT FEAT_TABLEGOtrackn_tablelop org *+TRACKS EIFtrackn_tablespeeda org *+TRACKStrackn_command org *+TRACKS IFT FEAT_BASS16trackn_outnote org *+TRACKS EIF IFT FEAT_FILTERtrackn_filter org *+TRACKS EIFtrackn_audf org *+TRACKStrackn_audc org *+TRACKS IFT FEAT_AUDCTLMANUALSETtrackn_audctl org *+TRACKS EIF IFT FEAT_CONSTANTSPEED==0v_speed org *+1 EIFv_aspeed org *+1 IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1v_ainstrspeed org *+1 EIFv_abeat org *+1track_endvariables org PLAYER-$100-$140-$30INSTRPAR equ 12tabbeganddistor 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,$c0vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0,vibx-vib0vib0 dta 0vib1 dta 1,-1,-1,1vib2 dta 1,0,-1,-1,0,1vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1vibx:PLAYER-$100-$140-* dta 0; org PLAYER-$100-$140 IFT FEAT_BASS16frqtabbasslo 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-$100frqtab ERT [<frqtab]!=0 ;* frqtab must begin at the memory page bound! (i.e. $..00 address)frqtabbass1 dta $BF,$B6,$AA,$A1,$98,$8F,$89,$80,$F2,$E6,$DA,$CE,$BF,$B6,$AA,$A1 dta $98,$8F,$89,$80,$7A,$71,$6B,$65,$5F,$5C,$56,$50,$4D,$47,$44,$3E dta $3C,$38,$35,$32,$2F,$2D,$2A,$28,$25,$23,$21,$1F,$1D,$1C,$1A,$18 dta $17,$16,$14,$13,$12,$11,$10,$0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07frqtabbass2 dta $FF,$F1,$E4,$D8,$CA,$C0,$B5,$AB,$A2,$99,$8E,$87,$7F,$79,$73,$70 dta $66,$61,$5A,$55,$52,$4B,$48,$43,$3F,$3C,$39,$37,$33,$30,$2D,$2A dta $28,$25,$24,$21,$1F,$1E,$1C,$1B,$19,$17,$16,$15,$13,$12,$11,$10 dta $0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00frqtabpure dta $F3,$E6,$D9,$CC,$C1,$B5,$AD,$A2,$99,$90,$88,$80,$79,$72,$6C,$66 dta $60,$5B,$55,$51,$4C,$48,$44,$40,$3C,$39,$35,$32,$2F,$2D,$2A,$28 dta $25,$23,$21,$1F,$1D,$1C,$1A,$18,$17,$16,$14,$13,$12,$11,$10,$0F dta $0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00,$00 IFT FEAT_BASS16frqtabbasshi dta $0D,$0D,$0C,$0B,$0B,$0A,$0A,$09,$08,$08,$07,$07,$07,$06,$06,$05 dta $05,$05,$04,$04,$04,$04,$03,$03,$03,$03,$03,$02,$02,$02,$02,$02 dta $02,$02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00 dta $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 EIF org PLAYER-$0100volumetab dta $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 dta $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01 dta $00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$02 dta $00,$00,$00,$01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$03,$03,$03 dta $00,$00,$01,$01,$01,$01,$02,$02,$02,$02,$03,$03,$03,$03,$04,$04 dta $00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$03,$04,$04,$04,$05,$05 dta $00,$00,$01,$01,$02,$02,$02,$03,$03,$04,$04,$04,$05,$05,$06,$06 dta $00,$00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07 dta $00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07,$08 dta $00,$01,$01,$02,$02,$03,$04,$04,$05,$05,$06,$07,$07,$08,$08,$09 dta $00,$01,$01,$02,$03,$03,$04,$05,$05,$06,$07,$07,$08,$09,$09,$0A dta $00,$01,$01,$02,$03,$04,$04,$05,$06,$07,$07,$08,$09,$0A,$0A,$0B dta $00,$01,$02,$02,$03,$04,$05,$06,$06,$07,$08,$09,$0A,$0A,$0B,$0C dta $00,$01,$02,$03,$03,$04,$05,$06,$07,$08,$09,$0A,$0A,$0B,$0C,$0D dta $00,$01,$02,$03,$04,$05,$06,$07,$07,$08,$09,$0A,$0B,$0C,$0D,$0E dta $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F org PLAYER;*;* Set of RMT main vectors:;*RASTERMUSICTRACKER jmp rmt_init jmp rmt_play jmp rmt_p3 jmp rmt_silence jmp SetPokeyrmt_init stx ns sty ns+1 pha IFT track_endvariables-track_variables>255 ldy #0 tyari0 sta track_variables,y sta track_endvariables-$100,y iny bne ri0 ELS ldy #track_endvariables-track_variables lda #0ri0 sta track_variables-1,y dey bne ri0 EIF ldy #4 lda (ns),y sta v_maxtracklen iny IFT FEAT_CONSTANTSPEED==0 lda (ns),y sta v_speed EIF IFT FEAT_INSTRSPEED==0 iny lda (ns),y sta v_instrspeed sta v_ainstrspeed ELI FEAT_INSTRSPEED>1 lda #FEAT_INSTRSPEED sta v_ainstrspeed EIF ldy #8ri1 lda (ns),y sta p_tis-8,y iny cpy #8+8 bne ri1 pla pha IFT TRACKS>4 asl @ asl @ asl @ clc adc p_song sta p_song pla php and #$e0 asl @ rol @ rol @ rol @ ELS asl @ asl @ clc adc p_song sta p_song pla php and #$c0 asl @ rol @ rol @ EIF plp adc p_song+1 sta p_song+1 jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3rmt_silence IFT STEREOMODE>0 lda #0 sta $d208 sta $d218 ldy #3 sty $d20f sty $d21f ldy #8si1 sta $d200,y sta $d210,y dey bpl si1 ELS lda #0 sta $d208 ldy #3 sty $d20f ldy #8si1 sta $d200,y dey bpl si1 EIF IFT FEAT_INSTRSPEED==0 lda v_instrspeed ELS lda #FEAT_INSTRSPEED EIF rtsGetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3GetSongLine ldx #0 stx v_abeatnn0nn1 txa tay lda (p_song),y cmp #$fe bcs nn2 tay lda (p_trackslbstable),y sta trackn_db,x lda (p_trackshbstable),ynn1a sta trackn_hb,x lda #0 sta trackn_idx,x lda #1nn1a2 sta trackn_pause,x lda #$80 sta trackn_instrx2,x inxxtracks01 cpx #TRACKS bne nn1 lda p_song clcxtracks02 adc #TRACKS sta p_song bcc GetTrackLine inc p_song+1nn1b jmp GetTrackLinenn2 beq nn3nn2a lda #0 beq nn1a2nn3 ldy #2 lda (p_song),y tax iny lda (p_song),y sta p_song+1 stx p_song ldx #0 beq nn0GetTrackLineoo0oo0a IFT FEAT_CONSTANTSPEED==0 lda v_speed sta v_bspeed EIF ldx #-1oo1 inx dec trackn_pause,x bne oo1xoo1b lda trackn_db,x sta ns lda trackn_hb,x sta ns+1oo1i ldy trackn_idx,x inc trackn_idx,x lda (ns),y sta reg1 and #$3f cmp #61 beq oo1a bcs oo2 sta trackn_note,x IFT FEAT_BASS16 sta trackn_outnote,x EIF iny lda (ns),y lsr @ and #$3f*2 sta trackn_instrx2,xoo1a lda #1 sta trackn_pause,x ldy trackn_idx,x inc trackn_idx,x lda (ns),y lsr @ ror reg1 lsr @ ror reg1 lda reg1 and #$f0 sta trackn_volume,xoo1xxtracks03sub1 cpx #TRACKS-1 bne oo1 IFT FEAT_CONSTANTSPEED==0 lda #$ffv_bspeed equ *-1 sta v_speed ELS lda #FEAT_CONSTANTSPEED EIF sta v_aspeed jmp InitOfNewSetInstrumentsOnlyoo2 cmp #63 beq oo63 lda reg1 and #$c0 beq oo62_b asl @ rol @ rol @ sta trackn_pause,x jmp oo1xoo62_b iny lda (ns),y sta trackn_pause,x inc trackn_idx,x jmp oo1xoo63 lda reg1 IFT FEAT_CONSTANTSPEED==0 bmi oo63_1X iny lda (ns),y sta v_bspeed inc trackn_idx,x jmp oo1ioo63_1X EIF cmp #255 beq oo63_11 iny lda (ns),y sta trackn_idx,x jmp oo1ioo63_11 jmp GetSongLinep2xrmtp3 jmp rmt_p3p2x0 dex bmi p2xrmtp3InitOfNewSetInstrumentsOnlyp2x1 ldy trackn_instrx2,x bmi p2x0SetUpInstrumentY2 lda (p_instrstable),y sta trackn_instrdb,x sta nt iny lda (p_instrstable),y sta trackn_instrhb,x sta nt+1 IFT FEAT_FILTER lda #1 sta trackn_filter,x EIF IFT FEAT_TABLEGO IFT FEAT_FILTER tay ELS ldy #1 EIF lda (nt),y sta trackn_tablelop,x iny ELS ldy #2 EIF 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 IFT FEAT_AUDCTLMANUALSET iny lda (nt),y sta trackn_audctl,x iny ELS ldy #6 EIF lda (nt),y sta trackn_volumeslidedepth,x IFT FEAT_VOLUMEMIN iny lda (nt),y sta trackn_volumemin,x iny ELS ldy #8 EIF 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 sta trackn_instrx2,x asl @ sta trackn_instrreachend,x sta trackn_shiftfrq,x tay lda (nt),y sta trackn_tableend,x adc #0 sta trackn_instridx,x lda #INSTRPAR sta trackn_tablea,x tay lda (nt),y sta trackn_tablenote,xxata_rtshere jmp p2x0rmt_playrmt_p0 jsr SetPokeyrmt_p1 IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 dec v_ainstrspeed bne rmt_p3 EIF IFT FEAT_INSTRSPEED==0 lda #$ffv_instrspeed equ *-1 sta v_ainstrspeed ELI FEAT_INSTRSPEED>1 lda #FEAT_INSTRSPEED sta v_ainstrspeed EIFrmt_p2 dec v_aspeed bne rmt_p3 inc v_abeat lda v_abeat cmp #$ffv_maxtracklen equ *-1 beq p2o3 jmp GetTrackLinep2o3 jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3go_ppnext jmp ppnextrmt_p3 lda #>frqtab sta nr+1xtracks05sub1 ldx #TRACKS-1pp1 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,xpp1b lda trackn_instrlop,xpp2 sta trackn_instridx,x lda reg1 IFT TRACKS>4 cpx #4 bcc pp2s lsr @ lsr @ lsr @ lsr @pp2s EIF and #$0f ora trackn_volume,x tay lda volumetab,y sta tmp lda reg2 and #$0e tay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -