Skip to content

Instantly share code, notes, and snippets.

@gasman
Created January 14, 2015 01:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gasman/12bc5fa42bcac487fc02 to your computer and use it in GitHub Desktop.
Save gasman/12bc5fa42bcac487fc02 to your computer and use it in GitHub Desktop.
Vortex Tracker II PT3 playback routine
; Vortex Tracker II PT3 playback routine - written by Sergey Bulba
; usage:
; ld hl,address_of_pt3_data
; call pt3_init
; then every 1/50 second:
; call play
; to silence:
; call mute
; Disassembled with z80dasm 1.1.2
; command line: z80dasm --origin=49152 -l pt3_player.bin
Release EQU "7"
ld hl,0c000h
jr pt3_init
jp play
jr mute
setup:
db 0
CrPsPtr:
dw 0
;Identifier
db "=VTII PT3 Player r.",Release,"="
checklp:
ld hl,setup
set 7,(hl)
bit 0,(hl)
ret z
pop hl
ld hl,DelyCnt
inc (hl)
ld hl,ChanA+CHP_NtSkCn
inc (hl)
mute:
xor a
ld h,a
ld l,a
ld (AYREGS+AR_AmplA),a
ld (AYREGS+AR_AmplB),hl
jp rout_a0
pt3_init:
ld (modaddr+1),hl
ld (mdaddr2+1),hl
push hl
ld de,00064h
add hl,de
ld a,(hl)
ld (pt3_delay+1),a
push hl
pop ix
add hl,de
ld (CrPsPtr),hl
ld e,(ix+002h)
add hl,de
inc hl
ld (LPosPtr+1),hl
pop de
ld l,(ix+003h)
ld h,(ix+004h)
add hl,de
ld (PatsPtr+1),hl
ld hl,000a9h
add hl,de
ld (OrnPtrs+1),hl
ld hl,00069h
add hl,de
ld (SamPtrs+1),hl
ld hl,setup
res 7,(hl)
; note table data depacker
ld de,T_PACK
ld bc,T1_+(2*49)-1
tp_0:
ld a,(de)
inc de
cp 01eh
jr nc,tp_1
ld h,a
ld a,(de)
ld l,a
inc de
jr tp_2
tp_1:
push de
ld d,000h
ld e,a
lc091h:
add hl,de
add hl,de
pop de
tp_2:
ld a,h
ld (bc),a
dec bc
ld a,l
ld (bc),a
dec bc
sub 0f0h
jr nz,tp_0
ld hl,vars
ld (hl),a
ld de,vars+1
ld bc,VAR0END-vars-1
ldir
inc a
ld (DelyCnt),a
ld hl,0f001h
ld (ChanA+CHP_NtSkCn),hl
ld (ChanB+CHP_NtSkCn),hl
ld (ChanC+CHP_NtSkCn),hl
ld hl,emptysamorn
ld (AdInPtA+1),hl
ld (ChanA+CHP_OrnPtr),hl
ld (ChanB+CHP_OrnPtr),hl
ld (ChanC+CHP_OrnPtr),hl
ld (ChanA+CHP_SamPtr),hl
ld (ChanB+CHP_SamPtr),hl
ld (ChanC+CHP_SamPtr),hl
ld a,(ix-057h)
sub 030h
jr c,l20
cp 00ah
jr c,l21
l20:
ld a,006h
l21:
ld (version+1),a
push af
cp 004h
ld a,(ix-001h)
rla
and 007h
;NoteTableCreator (c) Ivan Roshin
;A - NoteTableNumber*2+VersionForNoteTable
;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
ld hl,nt_data
push de
ld d,b
add a,a
ld e,a
add hl,de
ld e,(hl)
inc hl
srl e
sbc a,a
and 0a7h ;#00 (NOP) or #A7 (AND A)
ld (l3),a
ex de,hl
pop bc
add hl,bc
ld a,(de)
add a,T_ & 0xff
ld c,a
adc a,T_ >> 8
sub c
ld b,a
push bc
ld de,NT_
push de
ld b,00ch
l1:
push bc
ld c,(hl)
inc hl
push hl
ld b,(hl)
push de
ex de,hl
ld de,00017h
defb 0ddh
ld h,008h ;= ld ixh,8
l2:
srl b
rr c
l3:
add hl,de ; will be replaced by AND A or NOP apparently
ld a,c
adc a,d
ld (hl),a
inc hl
ld a,b
adc a,d
ld (hl),a
add hl,de
defb 0ddh
dec h ;= dec ixh
jr nz, l2
pop de
inc de
inc de
pop hl
inc hl
pop bc
djnz l1
pop hl
pop de
ld a,e
cp TCOLD_1 & 0xff
jr nz,corr_1
ld a,0fdh
ld (NT_+02eh),a
corr_1:
ld a,(de)
and a
jr z,tc_exit
rra
push af
add a,a
ld c,a
add hl,bc
pop af
jr nc,corr_2
dec (hl)
dec (hl)
corr_2:
inc (hl)
and a
sbc hl,bc
inc de
jr corr_1
tc_exit:
pop af
;VolTableCreator (c) Ivan Roshin
;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
;5.. - 3.5x..3.6x..VTII1.0)
cp 005h
ld hl,00011h
ld d,h
ld e,h
ld a,017h
jr nc,m1
dec l
ld e,l
xor a
m1:
ld (m2),a
ld ix,VT_+16
ld c,010h
pt3_initv2:
push hl
add hl,de
ex de,hl
sbc hl,hl
pt3_initv1:
ld a,l
m2:
ld a,l
ld a,h
adc a,000h
ld (ix+000h),a
inc ix
add hl,de
inc c
ld a,c
and 00fh
jr nz,pt3_initv1
pop hl
ld a,e
cp 077h
jr nz,m3
inc e
m3:
ld a,c
and a
jr nz,pt3_initv2
jp rout_a0
; pattern decoder
PD_OrSm:
ld (ix+008h),000h
call setorn
ld a,(bc)
inc bc
rrca
pd_sam:
add a,a
pd_sam_: ; lc19dh
ld e,a
ld d,000h
SamPtrs:
ld hl,02121h
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
modaddr
ld hl,02121h
add hl,de
ld (ix+003h),l
ld (ix+004h),h
jr pd_loop
pd_vol:
rlca
rlca
rlca
rlca
ld (ix+010h),a
jr pd_lp2
pd_eoff:
ld (ix+008h),a
ld (ix-00ch),a
jr pd_lp2
pd_SorE:
dec a
jr nz,pd_env
ld a,(bc)
inc bc
ld (ix+005h),a
jr pd_lp2
pd_env:
call setenv
jr pd_lp2
pd_orn:
call setorn
jr pd_loop
pd_esam:
ld (ix+008h),a
ld (ix-00ch),a
call nz,setenv
ld a,(bc)
inc bc
jr pd_sam_
ptdecod:
ld a,(ix+006h)
ld (PrNote+1),a
ld l,(ix-006h)
ld h,(ix-005h)
ld (PrSlide+1),hl
pd_loop:
ld de,02010h
pd_lp2:
ld a,(bc)
inc bc
add a,e
jr c,PD_OrSm
add a,d
jr z,pd_fin
jr c,pd_sam
add a,e
jr z,pd_rel
jr c,pd_vol
add a,e
jr z,pd_eoff
jr c,pd_SorE
add a,060h
jr c,pd_note
add a,e
jr c,pd_orn
add a,d
jr c,pd_nois
add a,e
jr c,pd_esam
add a,a
ld e,a
ld hl,spccoms+0FF20h-02000h
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
push de
jr pd_loop
pd_nois:
ld (ns_base),a
jr pd_lp2
pd_rel:
res 0,(ix+009h)
jr pd_res
pd_note:
ld (ix+006h),a
set 0,(ix+009h)
xor a
pd_res:
ld (pdsp_+1),sp
ld sp,ix
ld h,a
ld l,a
push hl
push hl
push hl
push hl
push hl
push hl
pdsp_
ld sp,03131h
pd_fin:
ld a,(ix+005h)
ld (ix+00fh),a
ret
c_portm:
res 2,(ix+009h)
ld a,(bc)
inc bc
inc bc
inc bc
ld (ix+00ah),a
ld (ix-007h),a
ld de,NT_
ld a,(ix+006h)
ld (ix+007h),a
add a,a
ld l,a
ld h,000h
add hl,de
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
push hl
PrNote
ld a,03eh
ld (ix+006h),a
add a,a
ld l,a
ld h,000h
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
pop hl
sbc hl,de
ld (ix+00dh),l
ld (ix+00eh),h
ld e,(ix-006h)
ld d,(ix-005h)
version
ld a,03eh
cp 006h
jr c,oldprtm
PrSlide
ld de,01111h
ld (ix-006h),e
ld (ix-005h),d
oldprtm:
ld a,(bc)
inc bc
ex af,af'
ld a,(bc)
inc bc
and a
jr z,nosig
ex de,hl
nosig:
sbc hl,de
jp p,set_stp
cpl
ex af,af'
neg
ex af,af'
set_stp:
ld (ix+00ch),a
ex af,af'
ld (ix+00bh),a
ld (ix-002h),000h
ret
c_gliss
set 2,(ix+009h)
ld a,(bc)
inc bc
ld (ix+00ah),a
and a
jr nz,gl36
ld a,(version+1)
cp 007h
sbc a,a
inc a
gl36:
ld (ix-007h),a
ld a,(bc)
inc bc
ex af,af'
ld a,(bc)
inc bc
jr set_stp
c_smpos
ld a,(bc)
inc bc
ld (ix-00bh),a
ret
c_orpos:
ld a,(bc)
inc bc
ld (ix-00ch),a
ret
c_vibrt
ld a,(bc)
inc bc
ld (ix-001h),a
ld (ix-002h),a
ld a,(bc)
inc bc
ld (ix+000h),a
xor a
ld (ix-007h),a
ld (ix-006h),a
ld (ix-005h),a
ret
c_engls
ld a,(bc)
inc bc
ld (env_del+1),a
ld (CurEDel),a
ld a,(bc)
inc bc
ld l,a
ld a,(bc)
inc bc
ld h,a
ld (ESldAdd+1),hl
ret
c_pt3_delay:
ld a,(bc)
inc bc
ld (pt3_delay+1),a
ret
setenv:
ld (ix+008h),e
ld (AYREGS+AR_EnvTp),a
ld a,(bc)
inc bc
ld h,a
ld a,(bc)
inc bc
ld l,a
ld (EnvBase),hl
xor a
ld (ix-00ch),a
ld (CurEDel),a
ld h,a
ld l,a
ld (CurESld),hl
c_nop:
ret
setorn:
add a,a
ld e,a
ld d,000h
ld (ix-00ch),d
OrnPtrs:
ld hl,02121h
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
mdaddr2:
ld hl,02121h
add hl,de
ld (ix+001h),l
ld (ix+002h),h
ret
;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
spccoms
dw c_nop
dw c_gliss
dw c_portm
dw c_smpos
dw c_orpos
dw c_vibrt
dw c_nop
dw c_nop
dw c_engls
dw c_pt3_delay
dw c_nop
dw c_nop
dw c_nop
dw c_nop
dw c_nop
dw c_nop
chregs:
xor a
ld (Ampl),a
bit 0,(ix+015h)
push hl
jp z,ch_exit
ld (csp_+1),sp
ld l,(ix+00dh)
ld h,(ix+00eh)
ld sp,hl
pop de
ld h,a
ld a,(ix+000h)
ld l,a
add hl,sp
inc a
cp d
jr c,ch_orps
ld a,e
ch_orps:
ld (ix+000h),a
ld a,(ix+012h)
add a,(hl)
jp p,ch_ntp
xor a
ch_ntp:
cp 060h
jr c,ch_nok
ld a,05fh
ch_nok:
add a,a
ex af,af'
ld l,(ix+00fh)
ld h,(ix+010h)
ld sp,hl
pop de
ld h,000h
ld a,(ix+001h)
ld b,a
add a,a
add a,a
ld l,a
add hl,sp
ld sp,hl
ld a,b
inc a
cp d
jr c,ch_smps
ld a,e
ch_smps:
ld (ix+001h),a
pop bc
pop hl
ld e,(ix+008h)
ld d,(ix+009h)
add hl,de
bit 6,b
jr z,ch_noac
ld (ix+008h),l
ld (ix+009h),h
ch_noac:
ex de,hl
ex af,af'
ld l,a
ld h,000h
ld sp,NT_
add hl,sp
ld sp,hl
pop hl
add hl,de
ld e,(ix+006h)
ld d,(ix+007h)
add hl,de
csp_
ld sp,03131h
ex (sp),hl
xor a
or (ix+005h)
jr z,ch_amp
dec (ix+005h)
jr nz,ch_amp
ld a,(ix+016h)
ld (ix+005h),a
ld l,(ix+017h)
ld h,(ix+018h)
ld a,h
add hl,de
ld (ix+006h),l
ld (ix+007h),h
bit 2,(ix+015h)
jr nz,ch_amp
ld e,(ix+019h)
ld d,(ix+01ah)
and a
jr z,ch_stpp
ex de,hl
ch_stpp:
sbc hl,de
jp m,ch_amp
ld a,(ix+013h)
ld (ix+012h),a
xor a
ld (ix+005h),a
ld (ix+006h),a
ld (ix+007h),a
ch_amp:
ld a,(ix+002h)
bit 7,c
jr z,ch_noam
bit 6,c
jr z,ch_amin
cp 00fh
jr z,ch_noam
inc a
jr ch_svam
ch_amin:
cp 0f1h
jr z,ch_noam
dec a
ch_svam:
ld (ix+002h),a
ch_noam:
ld l,a
ld a,b
and 00fh
add a,l
jp p,ch_apos
xor a
ch_apos:
cp 010h
jr c,ch_vol
ld a,00fh
ch_vol:
or (ix+01ch)
ld l,a
ld h,000h
ld de,VT_
add hl,de
ld a,(hl)
ch_env:
bit 0,c
jr nz,ch_noen
or (ix+014h)
ch_noen:
ld (Ampl),a
bit 7,b
ld a,c
jr z,no_ensl
rla
rla
sra a
sra a
sra a
add a,(ix+004h)
bit 5,b
jr z,no_enac
ld (ix+004h),a
no_enac:
ld hl,AddToEn+1
add a,(hl)
ld (hl),a
jr ch_mix
no_ensl:
rra
add a,(ix+003h)
ld (AddToNs),a
bit 5,b
jr z,ch_mix
ld (ix+003h),a
ch_mix:
ld a,b
rra
and 048h
ch_exit:
ld hl,AYREGS+AR_Mixer
or (hl)
rrca
ld (hl),a
pop hl
xor a
or (ix+00ah)
ret z
dec (ix+00ah)
ret nz
xor (ix+015h)
ld (ix+015h),a
rra
ld a,(ix+00bh)
jr c,ch_ondl
ld a,(ix+00ch)
ch_ondl:
ld (ix+00ah),a
ret
play:
xor a
ld (AddToEn+1),a
ld (AYREGS+AR_Mixer),a
dec a
ld (AYREGS+AR_EnvTp),a
ld hl,DelyCnt
dec (hl)
jr nz,pl2
ld hl,ChanA+CHP_NtSkCn
dec (hl)
jr nz,pl1b
AdInPtA:
ld bc,00101h
ld a,(bc)
and a
jr nz,pl1a
ld d,a
ld (ns_base),a
ld hl,(CrPsPtr)
inc hl
ld a,(hl)
inc a
jr nz,plnlp
call checklp
LPosPtr:
ld hl,02121h
ld a,(hl)
inc a
plnlp:
ld (CrPsPtr),hl
dec a
add a,a
ld e,a
rl d
PatsPtr:
ld hl,02121h
add hl,de
ld de,(modaddr+1)
ld (psp_+1),sp
ld sp,hl
pop hl
add hl,de
ld b,h
ld c,l
pop hl
add hl,de
ld (AdInPtB+1),hl
pop hl
add hl,de
ld (AdInPtC+1),hl
psp_
ld sp,03131h
pl1a:
ld ix,ChanA+12
call ptdecod
ld (AdInPtA+1),bc
pl1b:
ld hl,ChanB+CHP_NtSkCn
dec (hl)
jr nz,pl1c
ld ix,ChanB+12
AdInPtB:
ld bc,00101h
call ptdecod
ld (AdInPtB+1),bc
pl1c:
ld hl,ChanC+CHP_NtSkCn
dec (hl)
jr nz,pl1d
ld ix,ChanC+12
AdInPtC:
ld bc,00101h
call ptdecod
ld (AdInPtC+1),bc
pl1d:
pt3_delay:
ld a,03eh
ld (DelyCnt),a
pl2:
ld ix,ChanA
ld hl,(AYREGS+AR_TonA)
call chregs
ld (AYREGS+AR_TonA),hl
ld a,(Ampl)
ld (AYREGS+AR_AmplA),a
ld ix,ChanB
ld hl,(AYREGS+AR_TonB)
call chregs
ld (AYREGS+AR_TonB),hl
ld a,(Ampl)
ld (AYREGS+AR_AmplB),a
ld ix,ChanC
ld hl,(AYREGS+AR_TonC)
call chregs
ld (AYREGS+AR_TonC),hl
ld hl,(ns_base_AddToNs)
ld a,h
add a,l
ld (AYREGS+AR_Noise),a
AddToEn
ld a,03eh
ld e,a
add a,a
sbc a,a
ld d,a
ld hl,(EnvBase)
add hl,de
ld de,(CurESld)
add hl,de
ld (AYREGS+AR_Env),hl
xor a
ld hl,CurEDel
or (hl)
jr z,rout_a0
dec (hl)
jr nz,rout
env_del
ld a,03eh
ld (hl),a
ESldAdd:
ld hl,02121h
add hl,de
ld (CurESld),hl
rout:
xor a
rout_a0:
ld de,0ffbfh
ld bc,0fffdh
ld hl,AYREGS
lout:
out (c),a
ld b,e
outi
ld b,d
inc a
cp 00dh
jr nz,lout
out (c),a
ld a,(hl)
and a
ret m
ld b,e
out (c),a
ret
nt_data:
DB (T_NEW_0-T1_)*2
DB TCNEW_0-T_
DB (T_OLD_0-T1_)*2+1
DB TCOLD_0-T_
DB (T_NEW_1-T1_)*2+1
DB TCNEW_1-T_
DB (T_OLD_1-T1_)*2+1
DB TCOLD_1-T_
DB (T_NEW_2-T1_)*2
DB TCNEW_2-T_
DB (T_OLD_2-T1_)*2
DB TCOLD_2-T_
DB (T_NEW_3-T1_)*2
DB TCNEW_3-T_
DB (T_OLD_3-T1_)*2
DB TCOLD_3-T_
T_
TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
DB #18+1,#24+1,#3C+1,0
TCOLD_1 DB #5C+1,0
TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
TCNEW_3 DB #56+1
TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
DB #BC+1,#BE+1,0
TCNEW_1 EQU TCOLD_1
TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
DB #BA+1,#BC+1,#BE+1,0
emptysamorn EQU $-1
DB 1,0,#90 ;delete #90 if you don't need default sample
;first 12 values of tone tables (packed)
T_PACK DB #06EC*2/256,#06EC*2
DB #0755-#06EC
DB #07C5-#0755
DB #083B-#07C5
DB #08B8-#083B
DB #093D-#08B8
DB #09CA-#093D
DB #0A5F-#09CA
DB #0AFC-#0A5F
DB #0BA4-#0AFC
DB #0C55-#0BA4
DB #0D10-#0C55
DB #066D*2/256,#066D*2
DB #06CF-#066D
DB #0737-#06CF
DB #07A4-#0737
DB #0819-#07A4
DB #0894-#0819
DB #0917-#0894
DB #09A1-#0917
DB #0A33-#09A1
DB #0ACF-#0A33
DB #0B73-#0ACF
DB #0C22-#0B73
DB #0CDA-#0C22
DB #0704*2/256,#0704*2
DB #076E-#0704
DB #07E0-#076E
DB #0858-#07E0
DB #08D6-#0858
DB #095C-#08D6
DB #09EC-#095C
DB #0A82-#09EC
DB #0B22-#0A82
DB #0BCC-#0B22
DB #0C80-#0BCC
DB #0D3E-#0C80
DB #07E0*2/256,#07E0*2
DB #0858-#07E0
DB #08E0-#0858
DB #0960-#08E0
DB #09F0-#0960
DB #0A88-#09F0
DB #0B28-#0A88
DB #0BD8-#0B28
DB #0C80-#0BD8
DB #0D60-#0C80
DB #0E10-#0D60
DB #0EF8-#0E10
; channel data offsets
CHP_PsInOr equ 0
CHP_PsInSm equ 1
CHP_CrAmSl equ 2
CHP_CrNsSl equ 3
CHP_CrEnSl equ 4
CHP_TSlCnt equ 5
CHP_CrTnSl equ 6
CHP_TnAcc equ 8
CHP_COnOff equ 10
CHP_OnOffD equ 11
;IX for PTDECOD here (+12)
CHP_OffOnD equ 12
CHP_OrnPtr equ 13
CHP_SamPtr equ 15
CHP_NNtSkp equ 17
CHP_Note equ 18
CHP_SlToNt equ 19
CHP_Env_En equ 20
CHP_Flags equ 21
;Enabled - 0,SimpleGliss - 2
CHP_TnSlDl equ 22
CHP_TSlStp equ 23
CHP_TnDelt equ 25
CHP_NtSkCn equ 27
CHP_Volume equ 28
vars
ChanA ds 29
ChanB ds 29
ChanC ds 29
;GlobalVars
DelyCnt DB 0
CurESld DW 0
CurEDel DB 0
ns_base_AddToNs
ns_base DB 0
AddToNs DB 0
AR_TonA equ 0;word 1
AR_TonB equ 2;word 1
AR_TonC equ 4;word 1
AR_Noise equ 6;byte 1
AR_Mixer equ 7;byte 1
AR_AmplA equ 8;byte 1
AR_AmplB equ 9;byte 1
AR_AmplC equ 10;byte 1
AR_Env equ 11;word 1
AR_EnvTp equ 13;byte 1
AR_Size equ 14
AYREGS equ $
VT_ DS 256 ;CreatedVolumeTableAddress
EnvBase EQU VT_+14
T1_ EQU VT_+16 ;Tone tables data depacked here
T_OLD_1 EQU T1_
T_OLD_2 EQU T_OLD_1+24
T_OLD_3 EQU T_OLD_2+24
T_OLD_0 EQU T_OLD_3+2
T_NEW_0 EQU T_OLD_0
T_NEW_1 EQU T_OLD_1
T_NEW_2 EQU T_NEW_0+24
T_NEW_3 EQU T_OLD_3
NT_ DS 192 ;CreatedNoteTableAddress
;local var
Ampl EQU AYREGS+AR_AmplC
VAR0END EQU VT_+16 ;pt3_init zeroes from VARS to VAR0END-1
VARSEND EQU $
MDLADDR EQU $
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment