📄 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==1
TRACKS equ 8
ELS
TRACKS 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 bytes
FEAT_CONSTANTSPEED equ 0 ;* cca 28 bytes
;* VARIOUS COMMANDS
FEAT_COMMAND1 equ 1 ;* cca 8 bytes
FEAT_COMMAND2 equ 1 ;* cca 20 bytes (+save 1 address in zero page) and quicker whole RMT routine
FEAT_COMMAND3 equ 1 ;* cca 12 bytes
FEAT_COMMAND4 equ 1 ;* cca 15 bytes
FEAT_COMMAND5 equ 1 ;* cca 67 bytes
FEAT_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
;* PORTAMENTO
FEAT_PORTAMENTO equ 1 ;* cca 138 bytes and quicker whole RMT routine
;* FILTER
FEAT_FILTER equ 1 ;* cca 179 bytes and quicker whole RMT routine
FEAT_FILTERG0L equ 1 ;* (cca 38 bytes for each)
FEAT_FILTERG1L equ 1
FEAT_FILTERG0R equ 1
FEAT_FILTERG1R equ 1
;* BASS16B (i.e. distortion value 6)
FEAT_BASS16 equ 1 ;* cca 194 bytes +128bytes freq table and quicker whole RMT routine
FEAT_BASS16G1L equ 1 ;* (cca 47 bytes for each)
FEAT_BASS16G3L equ 1
FEAT_BASS16G1R equ 1
FEAT_BASS16G3R equ 1
;* VOLUME ONLY for particular generators
FEAT_VOLUMEONLYG0L equ 1 ;* (cca 7 bytes for each)
FEAT_VOLUMEONLYG2L equ 1
FEAT_VOLUMEONLYG3L equ 1
FEAT_VOLUMEONLYG0R equ 1
FEAT_VOLUMEONLYG2R equ 1
FEAT_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 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 TRACKS>4
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
IFT FEAT_VOLUMEMIN
trackn_volumemin org *+TRACKS
EIF
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
IFT FEAT_TABLEGO
trackn_tablelop org *+TRACKS
EIF
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
IFT FEAT_CONSTANTSPEED==0
v_speed org *+1
EIF
v_aspeed org *+1
IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1
v_ainstrspeed org *+1
EIF
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
:PLAYER-$100-$140-* dta 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 [<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,$07
frqtabbass2
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,$00
frqtabpure
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_BASS16
frqtabbasshi
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-$0100
volumetab
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 SetPokey
rmt_init
stx ns
sty ns+1
pha
IFT track_endvariables-track_variables>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
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 #8
ri1 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 GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
rmt_silence
IFT STEREOMODE>0
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
IFT FEAT_INSTRSPEED==0
lda v_instrspeed
ELS
lda #FEAT_INSTRSPEED
EIF
rts
GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
GetSongLine
ldx #0
stx v_abeat
nn0
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
nn1a2 sta trackn_pause,x
lda #$80
sta trackn_instrx2,x
inx
xtracks01 cpx #TRACKS
bne nn1
lda p_song
clc
xtracks02 adc #TRACKS
sta p_song
bcc GetTrackLine
inc p_song+1
nn1b
jmp GetTrackLine
nn2
beq nn3
nn2a
lda #0
beq nn1a2
nn3
ldy #2
lda (p_song),y
tax
iny
lda (p_song),y
sta p_song+1
stx p_song
ldx #0
beq nn0
GetTrackLine
oo0
oo0a
IFT FEAT_CONSTANTSPEED==0
lda v_speed
sta v_bspeed
EIF
ldx #-1
oo1
inx
dec trackn_pause,x
bne oo1x
oo1b
lda trackn_db,x
sta ns
lda trackn_hb,x
sta ns+1
oo1i
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,x
oo1a
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,x
oo1x
xtracks03sub1 cpx #TRACKS-1
bne oo1
IFT FEAT_CONSTANTSPEED==0
lda #$ff
v_bspeed equ *-1
sta v_speed
ELS
lda #FEAT_CONSTANTSPEED
EIF
sta v_aspeed
jmp InitOfNewSetInstrumentsOnly
oo2
cmp #63
beq oo63
lda reg1
and #$c0
beq oo62_b
asl @
rol @
rol @
sta trackn_pause,x
jmp oo1x
oo62_b
iny
lda (ns),y
sta trackn_pause,x
inc trackn_idx,x
jmp oo1x
oo63
lda reg1
IFT FEAT_CONSTANTSPEED==0
bmi oo63_1X
iny
lda (ns),y
sta v_bspeed
inc trackn_idx,x
jmp oo1i
oo63_1X
EIF
cmp #255
beq oo63_11
iny
lda (ns),y
sta trackn_idx,x
jmp oo1i
oo63_11
jmp GetSongLine
p2xrmtp3 jmp rmt_p3
p2x0 dex
bmi p2xrmtp3
InitOfNewSetInstrumentsOnly
p2x1 ldy trackn_instrx2,x
bmi p2x0
SetUpInstrumentY2
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,x
xata_rtshere
jmp p2x0
rmt_play
rmt_p0
jsr SetPokey
rmt_p1
IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1
dec v_ainstrspeed
bne rmt_p3
EIF
IFT FEAT_INSTRSPEED==0
lda #$ff
v_instrspeed equ *-1
sta v_ainstrspeed
ELI FEAT_INSTRSPEED>1
lda #FEAT_INSTRSPEED
sta v_ainstrspeed
EIF
rmt_p2
dec v_aspeed
bne rmt_p3
inc v_abeat
lda v_abeat
cmp #$ff
v_maxtracklen equ *-1
beq p2o3
jmp GetTrackLine
p2o3
jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3
go_ppnext jmp ppnext
rmt_p3
lda #>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
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 + -