📄 tm2.asx
字号:
lda aud1,y
sta $d218
txa
ldy quadro
spl:and #4
tay
lda freqtabs,y
sta $d210
lda voltabs,x
sta $d211
lda freqtabs+1,y
sta $d212
lda voltabs+1,x
sta $d213
lda freqtabs+2,y
sta $d214
lda voltabs+2,x
sta $d215
lda freqtabs+3,y
sta $d216
lda voltabs+3,x
sta $d217
pokey1 lda pokeys ; data for pokey 0
tax
lsr @
lsr @
and #1
tay
lda aud1,y
sta $d208
txa
ldy quadro
spl:and #4
tay
lda freqtabs,y
sta $d200
lda voltabs,x
sta $d201
lda freqtabs+1,y
sta $d202
lda voltabs+1,x
sta $d203
lda freqtabs+2,y
sta $d204
lda voltabs+2,x
sta $d205
lda freqtabs+3,y
sta $d206
lda voltabs+3,x
sta $d207
rts
els ; !!!
rts
pokey lda audctl+4
ora audctl+5
ora audctl+6
ora audctl+7
sta $d218
lda frq+4
sta $d210
lda vol1ch+4
ora znksz+4
sta $d211
lda frq+5
sta $d212
lda vol1ch+5
ora znksz+5
sta $d213
lda frq+6
sta $d214
lda vol1ch+6
ora znksz+6
sta $d215
lda frq+7
sta $d216
lda vol1ch+7
ora znksz+7
sta $d217
lda audctl+0
ora audctl+1
ora audctl+2
ora audctl+3
sta $d208
lda frq+0
sta $d200
lda vol1ch+0
ora znksz+0
sta $d201
lda frq+1
sta $d202
lda vol1ch+1
ora znksz+1
sta $d203
lda frq+2
sta $d204
lda vol1ch+2
ora znksz+2
sta $d205
lda frq+3
sta $d206
lda vol1ch+3
ora znksz+3
sta $d207
rts
eif ; !!!
; sound processing
graj lda adrsnl,x
sta addr
lda adrsnh,x
sta addr+1
mva shiftfrq,x byte
mva shiftnote,x bajt
mva shiftfilter,x filter
lda slupy,x
cmp sndlen,x
bcc n1
sta opadst,x
lda sndlop,x
sta slupy,x
jmp n0
n1 lda opadst,x ; sound fading
beq n6
n0 lda opad1,x
beq n7
dec lopad1,x
bne n7
sta lopad1,x
lda actvl1,x
beq n7
sub #16
sta actvl1,x
n7 lda opad2,x
beq n6
dec lopad2,x
bne n6
sta lopad2,x
ift normal ; !!!
lda actvl2,x
beq n6
sub #16
sta actvl2,x
eif ; !!!
n6 ldy aperm,x ; arpeggio
lda (addr),y
add wysdzw,x
add:sta bajt
dec lperm,x
bpl m1
lda dperm,x
sta lperm,x
lda kolejn,x
beq m6
add aperm,x
sta aperm,x
beq m7
cmp ilperm,x
bcc m1
lda #$ff
sta kolejn,x
jmp m1
m7 lda #1
sta kolejn,x
jmp m1
m6 inc aperm,x
lda ilperm,x
cmp aperm,x
bcs m1
lda #0
sta aperm,x
m1 lda #19
add:sta addr
scc:inc addr+1
ldy slupy,x
lda (addr),y ; main sound data
and #$f0
sta znksz,x
lda (addr),y
and #15
ora actvl1,x
tay
lda voltab,y
ora maxvol
tay
lda voltab,y
sta vol1ch,x
ift normal ; !!!
ldy slupy,x
iny
lda (addr),y
and #15
ora actvl2,x
tay
lda voltab,y
ora maxvol
tay
lda voltab,y
sta vol2ch,x
eif ; !!!
lda czekaj,x
bne m2
lda typ,x
sta m5+1
m5 bpl * ; jmp
jmp typ0
nop
jmp typ1
nop
jmp typ2
nop
jmp typ3
nop
jmp typ4
nop
jmp typ5
nop
jmp typ6
nop
jmp typ7
m2 dec czekaj,x
m3 ldy slupy,x ; accents
iny
lda (addr),y
and #$70
lsr @
lsr @
lsr @
sta n5+1
lda (addr),y
bmi n3
lda mainaudctl,x
jmp n4
n3 lda addaudctl,x
n4 and usedaudctl,x
sta audctl,x
iny
iny
tya
sta slupy,x
dey
lda (addr),y
n5 bcc * ; jmp
bcc a0
bcc a1
bcc a2
bcc a3
bcc a4
bcc a5
bcc a6
bcc a7
; accents
a1 adc:sta shiftfrq,x
lda (addr),y
a0 add:sta byte
jmp grajreturn
a3 adc:sta shiftnote,x
lda (addr),y
a2 add:sta bajt
jmp grajreturn
a5 adc:sta shiftfilter,x
lda (addr),y
a4 add:sta filter
jmp grajreturn
a6 sta byte
lda #0
a7 sta bajt
jmp grajreturn
; effects
typ1 lda typdat,x
and #3
lsr @
bcc t0
bne t1
lda param,x
add:sta byte
t0 dec ltyp,x
bpl typ0
inc typdat,x
mva dtyp,x ltyp,x
jmp m3
t1 lda byte
sbc param,x ; sec
sta byte
dec ltyp,x
bpl typ0
inc typdat,x
mva dtyp,x ltyp,x
jmp m3
typ2 ldy typdat,x
lda param,x
bmi t2
iny
iny
t2 dey
tya
add:sta byte
dec ltyp,x
bpl typ0
tya
sta typdat,x
cmp param,x
bne t3
eor #$ff
sta param,x
t3 mva dtyp,x ltyp,x
typ0 jmp m3
typ3 ldy typdat,x
lda param,x
bmi t4
iny
iny
t4 dey
tya
add:sta bajt
dec ltyp,x
bpl typ0
tya
sta typdat,x
cmp param,x
bne t3
eor #$ff
sta param,x
mva dtyp,x ltyp,x
jmp m3
typ4 lda typdat,x
add:sta byte
dec ltyp,x
bpl typ0
lda param,x
add:sta typdat,x
mva dtyp,x ltyp,x
jmp m3
typ5 lda bajt
sub typdat,x
sta bajt
dec ltyp,x
bpl typ0
lda param,x
add:sta typdat,x
mva dtyp,x ltyp,x
jmp m3
typ6 lda param,x
add:sta byte
typ7 jmp m3 ; placeholder for new type of sound
;----------------
; init functions
; play song, X=number of song
songx ldy #16
zm4 lda #0
sta addr
zm5 lda #0
sta addr+1
mva #0 pozsng
d5 txa
beq inic
lda (addr),y
seq:bpl d4
dex
d4 lda #17
add:sta addr
scc:inc addr+1
inc pozsng
bne d5
ldx #0
; play song, X=line of song
playx lda #0
sta byte
txa
sta pozsng
asl @
rol byte
asl @
rol byte
asl @
rol byte
asl @
rol byte
adc pozsng ; clc
scc:inc byte
clc
zm6 adc #0
sta addr
lda byte
zm7 adc #0
sta addr+1
inic jsr stop
mwa addr adrsng
ldx #7
i4 mva #$ff actvol,x
lda #$f0
sta actvl1,x
ift normal ; !!!
sta actvl2,x
eif ; !!!
dex
bpl i4
lda #3
sta $d20f
sta $d21f
ift normal ; !!!
sta $d22f
sta $d23f
eif ; !!!
dec pozsng
inx
stx ltempo
inx
stx pozptr
stx czygrc
rts
i1 txa ; change of tempo
and #15
sta tempo
rts
i2 stx czygrc ; pause, continue
rts
init cmp #$10 ; A=$00
jcc songx
cmp #$20 ; A=$10
bcc playx
cmp #$30 ; A=$20
jcc d2
cmp #$40 ; A=$30
bcc i1
cmp #$50 ; A=$40
jcc stop
cmp #$60 ; A=$50
bcc i2
cmp #$70 ; A=$60
jcs i3
sty bajt
specialcode and #15
asl @
sta sc17+1
lda bajt
sc17 bcc * ; jmp
bcc sc0
bcc sc1
bcc sc2
bcc sc3
bcc sc4
bcc sc5
bcc sc6
bcc sc7
bcc sc8
bcc sc9
bcc sc10
bcc sc11
bcc sc12
bcc sc13
bcc sc14
bcc sc15
sc0 sta specialflag ; code 0: set special flag
sc10 equ *
sc11 equ *
sc12 equ *
sc13 equ *
sc14 equ *
sc15 equ *
rts
; special codes
sc4 sta sndfilter,x
rts
sc5 sta mainaudctl,x
rts
sc6 sta addaudctl,x
rts
sc7 sta shiftfilter,x
rts
sc8 sta shiftfrq,x
rts
sc9 sta shiftnote,x
rts
sc1 and #$70
lsr @
lsr @
sta typ,x
and #$30
sne:sta typdat,x
lda bajt
bmi sc16
and #15
sta param,x
rts
sc16 and #15
eor #$ff
add #1
sta param,x
rts
sc2 and #$3f
sta dtyp,x
sta ltyp,x
rts
sc3 and #$80
asl @
rol @
sta kolejn,x
lda bajt
and #$70
lsr @
lsr @
lsr @
lsr @
sta ilperm,x
sne:sta kolejn,x
lda bajt
and #15
sta dperm,x
sta lperm,x
lda aperm,x
cmp ilperm,x
bcc sc0
lda ilperm,x
seq:sbc #1 ; sec
sta aperm,x
rts
; init of new song
i3 sty addr
stx addr+1
ldy #25
mva (addr),y+ quadro
mva (addr),y+ pokeys
mva (addr),y+ pokeys+1
mva (addr),y+ pokeys+2
mva (addr),y+ pokeys+3
lda (addr),y
sta tempo
lda addr ; low byte of instruments data
eor #$80
smi:inx
sta zm8+1
stx zm8+2
eor #$80 ; low byte of pattern data
smi:inx
sta zm2+1
stx zm2+2
inx ; high byte of pattern data
sta zm3+1
stx zm3+2
inx ; high byte of instrument data
sta zm9+1
stx zm9+2
eor #$80 ; track data
smi:inx
sta adrsng
sta zm0+1
sta zm4+1
sta zm6+1
stx adrsng+1
stx zm1+1
stx zm5+1
stx zm7+1
mva #$f0 maxvol
lda #0
sta czygrc
sta specialflag
; stop playing
stop ldx #7
lda #0
sta czygrc
d9 sta czygrx,x
sta audctl,x
sta vol1ch,x
ift normal ; !!!
sta vol2ch,x
sta volume,x
sta $d230,x
sta $d220,x
eif ; !!!
sta $d210,x
sta $d200,x
dex
bpl d9
sta $d218
sta $d208
ift normal ; !!!
sta $d238
sta $d228
sta aud1
sta aud2
eif ; !!!
rts
; procedures for play new instrument
d1 sta vol1ch,x ; if attempt to play empty sound - clear data
ift normal ; !!!
sta vol2ch,x
sta volume,x
eif ; !!!
sta audctl,x
rts
d0 tya ; change only volume
sta actvol,x
d3 and #$f0
sta actvl1,x
lda actvol,x
ift normal ; !!!
asl @
asl @
asl @
asl @
sta actvl2,x
eif ; !!!
rts
d2 and #7
sta addr
txa
ldx addr
and #$3f
beq d0
sta wysdzw,x
tya
bmi d2-1
lda actvol,x
jsr d3
dzwiek mva #0 czygrx,x
zm9 lda $ffff,y
beq d1
sta adrsnh,x
sta addr+1
zm8 lda $ffff,y
sta adrsnl,x
sta addr
tya
sta numdzw,x
ldy #8
mva (addr),y+ sndlen,x
mva (addr),y+ sndlop,x
mva (addr),y+ sndfilter,x
mva (addr),y+ mainaudctl,x
mva (addr),y+ addaudctl,x
mva (addr),y+ opad1,x
sta lopad1,x
mva (addr),y+ opad2,x
sta lopad2,x
lda (addr),y
and #$70
lsr @
lsr @
sta typ,x
lda (addr),y+
bmi d7
and #15
sta param,x
jmp d8
d7 and #15
eor #$ff
add #1
sta param,x
d8 mva (addr),y+ czekaj,x
lda (addr),y+
and #$3f
sta dtyp,x
sta ltyp,x
lda (addr),y
and #$80
asl @
rol @
sta kolejn,x
lda (addr),y
and #$70
lsr @
lsr @
lsr @
lsr @
sta ilperm,x
bne d6
sta kolejn,x
d6 lda (addr),y-
and #15
sta dperm,x
sta lperm,x
lda (addr),y
and #$c0
ora wysdzw,x
sta wysdzw,x
tay
lda frqtab,y
sta frq,x
lda #0
sta slupy,x
sta typdat,x
sta opadst,x
sta aperm,x
sta shiftfrq,x
sta shiftnote,x
sta shiftfilter,x
lda #1
sta czygrx,x
rts
endplr end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -