⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm2.asx

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 ASX
📖 第 1 页 / 共 2 页
字号:
;-------------------
;  TMC 2.00 Player
;------------------

player equ $200
normal equ 1 ; change to 0 for short version

       org player

addr   equ $fa
byte   equ $fc
bajt   equ $fd
filter equ $fe
maxvol equ $ff

; some tables on start (to avoid page breaking)

voltab dta d'                '
       dta d'        !!!!!!!!'
       dta d'    !!!!!!!!""""'
       dta d'   !!!!!"""""###'
       dta d'  !!!!""""####$$'
       dta d'  !!!"""###$$$%%'
       dta d'  !!"""##$$$%%&&'
       dta d'  !!""##$$%%&&'''''
       dta d' !!""##$$%%&&''''('
       dta d' !!""#$$%%&''''(()'
       dta d' !!"##$%%&''''())*'
       dta d' !!"#$$%&''''()**+'
       dta d' !""#$%&&''()**+,'
       dta d' !"##$%&''()**+,-'
       dta d' !"#$%&''''()*+,-.'
       dta d' !"#$%&''()*+,-./'

frqtab dta 0,$f1,$e4,$d7
       dta $cb,$c0,$b5,$aa
       dta $a1,$98,$8f,$87
       dta $7f,$78,$72,$6b
       dta $65,$5f,$5a,$55
       dta $50,$4b,$47,$43
       dta $3f,$3c,$38,$35
       dta $32,$2f,$2c,$2a
       dta $27,$25,$23,$21
       dta $1f,$1d,$1c,$1a
       dta $18,$17,$16,$14
       dta $13,$12,$11,$10
       dta 15,14,13,12
       dta 11,10,9,8
       dta 7,6,5,4
       dta 3,2,1,0

       dta 0,$f2,$e9,$da
       dta $ce,$bf,$b6,$aa
       dta $a1,$98,$8f,$89
       dta $80,$7a,$71,$6b
       dta $65,$5f,$5c,$56
       dta $50,$4d,$47,$44
       dta $3e,$3c,$38,$35
       dta $32,$2f,$2d,$2a
       dta $28,$25,$23,$21
       dta $1f,$1d,$1c,$1a
       dta $18,$17,$16,$14
       dta $13,$12,$11,$10
       dta 15,14,13,12
       dta 11,10,9,8
       dta 7,6,5,4
       dta 3,2,1,0

       dta 0,$ff,$f1,$e4
       dta $d8,$ca,$c0,$b5
       dta $ab,$a2,$99,$8e
       dta $87,$7f,$79,$73
       dta $70,$66,$61,$5a
       dta $55,$52,$4b,$48
       dta $43,$3f,$3c,$39
       dta $37,$33,$30,$2d
       dta $2a,$28,$25,$24
       dta $21,$1f,$1e,$1c
       dta $1b,$19,$17,$16
       dta $15,$13,$12,$11
       dta $10,15,14,13
       dta 12,11,10,9
       dta 8,7,6,5
       dta 4,3,2,1

       dta 0,$f3,$e6,$d9
       dta $cc,$c1,$b5,$ad
       dta $a2,$99,$90,$88
       dta $80,$79,$72,$6c
       dta $66,$60,$5b,$55
       dta $51,$4c,$48,$44
       dta $40,$3c,$39,$35
       dta $32,$2f,$2d,$2a
       dta $28,$25,$23,$21
       dta $1f,$1d,$1c,$1a
       dta $18,$17,$16,$14
       dta $13,$12,$11,$10
       dta 15,14,13,12
       dta 11,10,9,8
       dta 7,6,5,4
       dta 3,2,1,0

basslo dta l($be2,$b38,$a8c,$a00)
       dta l($96a,$8e8,$86a,$7ef)
       dta l($780,$708,$6ae,$646)
       dta l($5e6,$595,$541,$4f6)
       dta l($4b0,$46e,$430,$3f6)
       dta l($3bb,$384,$352,$322)
       dta l($2f4,$2c8,$2a0,$27a)
       dta l($255,$234,$214,$1f5)
       dta l($1d8,$1bd,$1a4,$18d)
       dta l($177,$160,$14e,$138)
       dta l($127,$115,$106,$0f7)
       dta l($0e8,$0db,$0cf,$0c3)
       dta l($0b8,$0ac,$0a2,$09a)
       dta l($090,$088,$07f,$078)
       dta l($070,$06a,$064,$05e)
       dta l($057,$052,$032,$00a)

       dta 0,$f2,$33,$96
       dta $e2,$38,$8c,$00
       dta $6a,$e8,$6a,$ef
       dta $80,$08,$ae,$46
       dta $e6,$95,$41,$f6
       dta $b0,$6e,$30,$f6
       dta $bb,$84,$52,$22
       dta $f4,$c8,$a0,$7a
       dta $55,$34,$14,$f5
       dta $d8,$bd,$a4,$8d
       dta $77,$60,$4e,$38
       dta $27,$15,$06,$f7
       dta $e8,$db,$cf,$c3
       dta $b8,$ac,$a2,$9a
       dta $90,$88,$7f,$78
       dta $70,$6a,$64,$5e

basshi dta h($be2,$b38,$a8c,$a00)
       dta h($96a,$8e8,$86a,$7ef)
       dta h($780,$708,$6ae,$646)
       dta h($5e6,$595,$541,$4f6)
       dta h($4b0,$46e,$430,$3f6)
       dta h($3bb,$384,$352,$322)
       dta h($2f4,$2c8,$2a0,$27a)
       dta h($255,$234,$214,$1f5)
       dta h($1d8,$1bd,$1a4,$18d)
       dta h($177,$160,$14e,$138)
       dta h($127,$115,$106,$0f7)
       dta h($0e8,$0db,$0cf,$0c3)
       dta h($0b8,$0ac,$0a2,$09a)
       dta h($090,$088,$07f,$078)
       dta h($070,$06a,$064,$05e)
       dta h($057,$052,$032,$00a)

       dta 0,13,13,12
       dta 11,11,10,10
       dta 9,8,8,7
       dta 7,7,6,6
       dta 5,5,5,4
       dta 4,4,4,3
       dta 3,3,3,3
       dta 2,2,2,2
       dta 2,2,2,1
       dta 1,1,1,1
       dta 1,1,1,1
       dta 1,1,1,0
       dta 0,0,0,0
       dta 0,0,0,0
       dta 0,0,0,0
       dta 0,0,0,0

tables_len equ *-player

;      org +$300
       jmp init
       jmp play
       jmp sound

; some external controls
quadro dta 1           ; 0=mono, 1-63=stereo, 64-127= RMT stereo, 128-255=quadro
pokeys dta 16          ; which data should go to which pokey (0,1,2 and 3 respectively)
       dta 20          ; for stereo config: 16=first 4 tracks, 20=last 4 tracks
       dta 0           ; for quadro values should be:
       dta 0           ; 0=main volume from tracks 0-3, 4=main volume from tracks 4-5
                       ; 8=additional volume from tracks 0-3, 12=additional volume from tracks 4-5
                       ; typical: 0,4,12,8 which should sound well on pokeys 0&2 on left channel
                       ; and pokeys 1&3 on right channel
                       ; (on stereo atari these settings should also sound well)
silent dta d'        ' ; which channel should be silent

; these values are usable from the outside of player
czygrc dta 0           ; if song should be played
pozsng dta 0           ; position in song

specialflag dta 0      ; flag triggered in song data
adrsng dta a(0)        ; address of song line

tempo  dta 0           ; tempo of song
ltempo dta 0           ; counter of tempo
pozptr dta 0           ; counter of positions in patterns (64 means end of pattern)

       ift normal ; !!!

aud1   dta 0           ; total AUDCTL of left channel
aud2   dta 0           ; and right

voltabs equ *          ; (24 bytes)

       eif ; !!!

vol1ch dta d'        ' ; volume of main channels

       ift normal ; !!!

vol2ch dta d'        ' ; volume of additional channels
volume dta d'        ' ; volume of channels in stereo (taken from vol1ch and vol2ch)

freqtabs equ *         ; (24 bytes)

       eif ; !!!

frq    dta d'        ' ; frequency

       ift normal ; !!!

note   dta d'        ' ; actual note played on channel (taken from aktwys)
freqen dta d'        ' ; frequency of channels in stereo (taken from frq)

       eif ; !!!

; data for accesing pattern data
adrptl dta d'        ' ; address of pattern data
adrpth dta d'        ' ;
pozwpt dta d'        ' ; index for accesing data in pattern
poddzw dta d'        ' ; change of note
delay  dta d'        ' ; how many spaces in pattern should be skipped

; data for accesing instrument data
czygrx dta d'        ' ; if something is played on channel
adrsnl dta d'        ' ; address of instrument data
adrsnh dta d'        ' ;
numdzw dta d'        ' ; number of instrument
wysdzw dta d'        ' ; note to play
aktwys dta d'        ' ; actual played note
znksz  dta d'        ' ; distortion
audctl dta d'        ' ; AUDCTL
slupy  dta d'        ' ; counter for data inside instrument

; data for specific sound effects
sndlen dta d'        ' ; length of instrument
sndlop dta d'        ' ; where to loop sound data
actvol dta d'        ' ; volume of sounds
actvl1 dta d'        ' ; actual control of main volume

       ift normal ; !!!

actvl2 dta d'        ' ; and additional volume

       eif ; !!!

opad1  dta d'        ' ; how soon the sound should fade (main volume)
opad2  dta d'        ' ; and additional volume
lopad1 dta d'        ' ; counters for fading
lopad2 dta d'        ' ;
opadst dta d'        ' ; start of fading
typ    dta d'        ' ; type of effect
param  dta d'        ' ; parameter for effect
typdat dta d'        ' ; data for effect
czekaj dta d'        ' ; how soon the effect should start
dtyp   dta d'        ' ; how often the effect should chanfe
ltyp   dta d'        ' ; counter for effect change
ilperm dta d'        ' ; how many arpeggio sounds
aperm  dta d'        ' ; actual arpeggio sound
dperm  dta d'        ' ; how soon the arpeggio should change
lperm  dta d'        ' ; counter for arpeggio
kolejn dta d'        ' ; order of arpeggio
sndfilter dta d'        ' ; filter from sound data
mainaudctl dta d'        ' ; main audctl
addaudctl dta d'        ' ; additional audctl
shiftfrq dta d'        '
shiftnote dta d'        '
shiftfilter dta d'        '

; some useful tables

       ift normal ; !!!

przeci dta 4,5,6,7     ; which channel is the opposite (used only in stereo)
       dta 0,1,2,3

       eif ; !!!

audtb1 dta 4,2,0,0     ; which byte in audctl has to be set to make sound "2 channel synth"
       dta 4,2,0,0
audtb2 dta 0,16,0,8    ; which byte in audctl has to be set to make sound "2 channel bass"
       dta 0,16,0,8
usedaudctl dta 4+129,$50+2+129,129,$28+129 ; bits of AUDCTL used in channel
       dta 4+129,$50+2+129,129,$28+129

;-------------------------
; start of player program

player_program equ *

; new address of song line
p3     dey
       lda (addr),y
       sta pozsng
       mvx #0 byte
       asl @
       rol byte
       asl @
       rol byte
       asl @
       rol byte
       asl @
       rol byte
       adc pozsng ; clc
       scc:inc byte
       clc
zm0    adc #0
       sta addr
       lda byte
zm1    adc #0
       sta addr+1
       jmp p1

; play song (call only one time per frame)
play   jsr pokey
       lda czygrc
       beq rsound
       dec ltempo
       bmi p4
rsound jmp sound+3

p4     dec pozptr
       bne r1

; get new patterns from song
       ldx #0
       inc pozsng
       mwa adrsng addr

p1     ldy #16
       lda (addr),y
       bmi p3
       jeq stop
       sta pozptr
       dey

p2     lda (addr),y
       dey
       sty byte
       tay
zm2    lda $ffff,y
       sta adrptl,x
zm3    lda $ffff,y
       sta adrpth,x
       lda #0
       sta delay,x
       sta pozwpt,x
       ldy byte
       lda (addr),y
       sta poddzw,x
       inx
       dey
       bpl p2
       lda #17
       add addr
       sta adrsng
       lda #0
       adc addr+1
       sta adrsng+1

; get new data from patterns
r1     mva tempo ltempo

       ldx #7
r2     dec delay,x
       bmi r13

r14    dex
       bpl r2
       jmp sound+3

r13    mva adrptl,x addr
       mva adrpth,x addr+1

       ldy pozwpt,x
r3     lda (addr),y ; get data
       bne r4

       iny ; $00: only new volume
       lda (addr),y
       sta actvol,x
       and #$f0
       sta actvl1,x

       ift normal ; !!!

       lda (addr),y
       asl @
       asl @
       asl @
       asl @
       sta actvl2,x

       eif ; !!!

       iny
       tya
       sta pozwpt,x
       jmp r14

r4     cmp #$40
       bcs r5
       adc poddzw,x ; $01-$3f: new note with sound and maybe volume
       sta wysdzw,x
       iny
       lda (addr),y
       bpl r11
       and #$7f
       sta byte
       iny
       lda (addr),y
       sta actvol,x
       and #$f0
       sta actvl1,x

       ift normal ; !!!

       lda (addr),y
       asl @
       asl @
       asl @
       asl @
       sta actvl2,x

       eif ; !!!

       iny
       tya
       sta pozwpt,x
       ldy byte
       jsr dzwiek
       jmp r14

r11    tay ; without volume
       inc pozwpt,x
       inc pozwpt,x
       lda actvol,x
       and #$f0
       sta actvl1,x

       ift normal ; !!!

       lda actvol,x
       asl @
       asl @
       asl @
       asl @
       sta actvl2,x

       eif ; !!!

       jsr dzwiek
       jmp r14

r5     cmp #$80
       bcs r6
       and #$3f ; $41-$7f: new note with volume
       add poddzw,x
       sta wysdzw,x
       iny
       lda (addr),y
       sta actvol,x
       and #$f0
       sta actvl1,x

       ift normal ; !!!

       lda (addr),y
       asl @
       asl @
       asl @
       asl @
       sta actvl2,x

       eif ; !!!

       iny
       tya
       sta pozwpt,x
       jmp r14

r6     bne r7
       iny ; $80: more than 15 spaces
       lda (addr),y
       sta delay,x
       iny
       tya
       sta pozwpt,x
       jmp r14

r7     cmp #$c0
       bcs r8
       and #$3f ; $81-$bf: new note
       add poddzw,x
       sta wysdzw,x
       inc pozwpt,x
       jmp r14

r8     cmp #$d0
       bcs r9
       iny ; $c0-$cf: new tempo
       inc pozwpt,x
       and #15
       sta tempo
       sta ltempo
       jmp r3

r9     cmp #$e0 ; special code
       bcs r15
       mva (addr),y byte
       iny
       mva (addr),y bajt
       iny
       tya
       sta pozwpt,x
       lda byte
       jsr specialcode
       jmp r14

r15    cmp #$f0 ; special code with volume
       bcs r12
       mva (addr),y byte
       iny
       mva (addr),y bajt
       lda byte
       jsr specialcode
       ldy pozwpt,x
       iny
       iny
       lda (addr),y
       sta actvol,x
       and #$f0
       sta actvl1,x

       ift normal ; !!!

       lda (addr),y
       asl @
       asl @
       asl @
       asl @
       sta actvl2,x

       eif ; !!!

       iny
       tya
       sta pozwpt,x
       jmp r14

r12    cmp #$ff
       bcs r10
       sbc #$ef ; $f0-$fe: spaces-$f0 (c is clear here)
       sta delay,x
       inc pozwpt,x
       jmp r14

r10    lda #$40 ; $ff: spaces till the end of pattern
       sta delay,x
       jmp r14

; main play sound loop
sound  jsr pokey
       ldx #7
p5     lda czygrx,x
       beq p6
       jmp graj

grajreturn equ *
       lda silent,x
       beq p7

       lda #0 ; silent channel
       sta vol1ch,x

       ift normal ; !!!

       sta vol2ch,x

       eif ; !!!

       dex
       bpl p5
       jmp p8

p7     ldy bajt
       lda frqtab,y
       add byte
       sta frq,x
       tya
       sta aktwys,x

       lda audctl,x
       and audtb2,x
       beq p11
       lda bajt ; 2 channel bass
       and #$7f
       tay
       lda basslo,y
       add byte
       sta frq-1,x
       lda basshi,y
       adc #0
       sta frq,x
       lda #0
       sta vol1ch-1,x
       ldy przeci,x
       sta vol2ch-1,y
       dex
       dex
       bpl p5
       jmp p8

p11    lda audctl,x
       and audtb1,x
       beq p6
       lda sndfilter,x ;two channel filter
       add bajt
       sta aktwys+2,x
       tay
       lda frqtab,y
       add byte
       sec
       adc filter
       sta frq+2,x

p6     dex
       bpl p5

; sound postprocessing
p8     inx
       stx byte

       ift normal ; !!!

       ldx #3
       lda quadro
       beq p9
       and #$40
       bne p12

       ldx #7 ; standard stereo settings
p9     txa
       tay
       lda vol1ch,y
       bne p10
       ldy przeci,x
       lda vol2ch,y
       bne p10
       txa
       tay
       lda #0
p10    ora znksz,y
       sta volume,x
       lda frq,y
       sta freqen,x
       lda aktwys,y
       sta note,x

       lda audctl,y
       ora byte
       sta byte

       cpx #4
       sne:sta aud2
       dex
       bpl p9
       sta aud1
       rts

p12    equ * ; RMT stereo
p13    lda vol1ch,x
       ora znksz,x
       sta volume,x
       lda vol2ch+4,x
       ora znksz+4,x
       sta volume+4,x
       mva frq,x freqen,x
       mva frq+4,x freqen+4,x
       mva aktwys,x note,x
       mva aktwys+4,x note+4,x
       dex
       bpl p13

       lda audctl
       ora audctl+1
       ora audctl+2
       ora audctl+3
       sta aud1
       lda audctl+4
       ora audctl+5
       ora audctl+6
       ora audctl+7
       sta aud2
       rts

; set pokey
pokey  lda quadro
       jeq pokey1
       jpl pokey2

       lda pokeys+3 ; data for pokey 3
       tax
       lsr @
       lsr @
       and #1
       tay
       lda aud1,y
       sta $d238
       txa
       and #4
       tay
       lda freqtabs,y
       sta $d230
       lda voltabs,x
       sta $d231
       lda freqtabs+1,y
       sta $d232
       lda voltabs+1,x
       sta $d233
       lda freqtabs+2,y
       sta $d234
       lda voltabs+2,x
       sta $d235
       lda freqtabs+3,y
       sta $d236
       lda voltabs+3,x
       sta $d237

       lda pokeys+2 ; data for pokey 2
       tax
       lsr @
       lsr @
       and #1
       tay
       lda aud1,y
       sta $d228
       txa
       and #4
       tay
       lda freqtabs,y
       sta $d220
       lda voltabs,x
       sta $d221
       lda freqtabs+1,y
       sta $d222
       lda voltabs+1,x
       sta $d223
       lda freqtabs+2,y
       sta $d224
       lda voltabs+2,x
       sta $d225
       lda freqtabs+3,y
       sta $d226
       lda voltabs+3,x
       sta $d227

pokey2 lda pokeys+1 ; data for pokey 1
       tax
       lsr @
       lsr @
       and #1
       tay

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -