User Tools

Site Tools


pt3player-asl

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
pt3player-asl [2013/02/12 14:12] – created darkbytept3player-asl [2017/02/16 13:27] (current) darkbyte
Line 1: Line 1:
-Navigation: [[general]] . [[math]] . [[graphic]] . [[sound]] . [[system]] . [[other]] . back to [[start]]+====PT2 / PT3 player==== 
 + 
 +---- 
 + 
 +//syntax is for ASL// 
 + 
 +<code z80> 
 + cpu z80undoc 
 + relaxed on 
 + 
 +;        module p1 
 +;universal pt2 and pt3 player for zx spectrum and msx 
 +;(c)2004-2005 s.v.bulba <vorobey@mail.khstu.ru> 
 +;http://bulba.at.kz 
 +;ASL adaptation by z00m^TCG & mborik 02/2013 
 + 
 +;release number 
 +release equ "0" 
 + 
 +;conditional assembly 
 +;1) version of rout (zx or msx standards) 
 +zx equ 1 
 +msx equ 0 
 + 
 +;2) current position counter at (start+11) 
 +curposcounter equ 1 
 + 
 +;3) allow channels allocation bits at (start+10) 
 +acbbac equ 1 
 + 
 +;4) allow loop checking and disabling 
 +loopchecker equ 1 
 + 
 +;5) insert official identificator 
 +id equ 1 
 + 
 + 
 +;features 
 +;-------- 
 +;-can be compiled at any address (i.e. no need rounding org 
 +; address). 
 +;-variables (vars) can be located at any address (not only after 
 +;code block). 
 +;-init subprogram checks pt3-module version and rightly 
 +; generates both note and volume tables outside of code block 
 +; (in vars). 
 +;-two portamento (spc. command 3xxx) algorithms (depending of 
 +; pt3 module version). 
 +;-any tempo value are accepted (including tempo=1 and tempo=2). 
 +;-fully compatible with ay_emul pt3 and pt2 players codes. 
 +;-see also notes at the end of this source code. 
 + 
 +;limitations 
 +;----------- 
 +;-can run in ram only (self-modified code is used). 
 +;-pt2 position list must be end by #ff marker only. 
 + 
 +;warning!!! play subprogram can crash if no module are loaded 
 +;into ram or init subprogram was not called before. 
 + 
 +;call mute or init one more time to mute sound after stopping 
 +;playing 
 + 
 + 
 +;test codes (commented) 
 +;       ld a,2 ;pt2,abc,looped 
 +;       ld (start+10),
 +;       call start 
 +;       ei 
 +;_lp    halt 
 +;       call start+5 
 +;       xor a 
 +;       in a,(#fe) 
 +;       cpl 
 +;       and 15 
 +;       jr z,_lp 
 + 
 +tona equ 0 
 +tonb equ 2 
 +tonc equ 4 
 +noise equ 6 
 +mixer equ 7 
 +ampla equ 8 
 +amplb equ 9 
 +amplc equ 10 
 +env equ 11 
 +envtp equ 13 
 + 
 +;       struct  chp 
 +;reset group 
 + 
 +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 
 + 
 +;reset group 
 + 
 +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 
 + 
 +;       ends 
 + 
 +chp equ 29 
 + 
 +;entry and other points 
 +;start initialize playing of module at mdladdr 
 +;start+3 initialization with module address in hl 
 +;start+5 play one quark 
 +;start+8 mute 
 +;start+10 setup and status flags 
 +;start+11 current position value (byte) (optional) 
 +;first 12 values of tone tables (packed) 
 + 
 +;@p1 
 + 
 +start 
 + ld hl,modstart 
 + jr init 
 + jp play 
 + jr mute 
 +setup db 0 
 + 
 +;set bit0, if you want to play without looping 
 +;(optional); 
 +;set bit1 for pt2 and reset for pt3 before 
 +;calling init; 
 +;bits2-3: %00-abc, %01 acb, %10 bac (optional); 
 +;bits4-6 are not used 
 +;bit7 is set each time, when loop point is passed 
 +;(optional) 
 + 
 + if curposcounter 
 +curpos db 0 
 +;for visualization only (i.e. no need for playing) 
 + endif 
 + 
 +;identifier 
 + if id 
 + db "=uni pt2 and pt3 player r.",release,"=" 
 + endif 
 + 
 + if loopchecker 
 +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) 
 + endif 
 + 
 +mute xor a 
 + ld h,a 
 + ld l,a 
 + ld (ayregs+ampla),
 + ld (ayregs+amplb),hl 
 + jp rout 
 + 
 +init ;hl - addressofmodule 
 + ld a,(start+10) 
 + and 2 
 + jr nz,initpt2 
 + 
 + call setmdad 
 + push hl 
 + ld de,100 
 + add hl,de 
 + ld a,(hl) 
 + ld (delay),
 + push hl 
 + pop ix 
 + add hl,de 
 + ld (crpsptr),hl 
 + ld e,(ix+102-100) 
 + inc hl 
 + 
 + if curposcounter 
 + ld a,l 
 + ld (possub+1),
 + endif 
 + 
 + add hl,de 
 + ld (lposptr),hl 
 + pop de 
 + ld l,(ix+103-100) 
 + ld h,(ix+104-100) 
 + add hl,de 
 + ld (patsptr),hl 
 + ld hl,169 
 + add hl,de 
 + ld (ornptrs),hl 
 + ld hl,105 
 + add hl,de 
 + ld (samptrs),hl 
 + ld a,(ix+13-100) ;extract version number 
 + sub $30 
 + jr c,l20 
 + cp 10 
 + jr c,l21 
 +l20 ld a,
 +l21 ld (zversion+1),
 + push af ;voltable version 
 + cp 4 
 + ld a,(ix+99-100) ;tone table number 
 + rla 
 + and 7 
 + push af; notetable number 
 + ld hl,$1f18 ;(e_-samcnv-2)*256+#18 
 + ld (samcnv),hl 
 + ld a,$ba 
 + ld (orncp),
 + ld (samcp),
 + ld a,$7b 
 + ld (ornld),
 + ld (samld),
 + ld a,$87 
 + ld (samclc2),
 + ld bc,pt3pd 
 + ld hl,0 
 + ld de,pt3emptyorn 
 + jr initcommon 
 + 
 +initpt2 ld a,(hl) 
 + ld (delay),
 + push hl 
 + push hl 
 + push hl 
 + inc hl 
 + inc hl 
 + ld a,(hl) 
 + inc hl 
 + ld (samptrs),hl 
 + ld e,(hl) 
 + inc hl 
 + ld d,(hl) 
 + pop hl 
 + and a 
 + sbc hl,de 
 + call setmdad 
 + pop hl 
 + ld de,67 
 + add hl,de 
 + ld (ornptrs),hl 
 + ld e,32 
 + add hl,de 
 + ld c,(hl) 
 + inc hl 
 + ld b,(hl) 
 + ld e,30 
 + add hl,de 
 + ld (crpsptr),hl 
 + ld e,a 
 + inc hl 
 + 
 + if curposcounter 
 + ld a,l 
 + ld (possub+1),
 + endif 
 + 
 + add hl,de 
 + ld (lposptr),hl 
 + pop hl 
 + add hl,bc 
 + ld (patsptr),hl 
 + ld a,5 
 + ld (zversion+1),
 + push af 
 + ld a,2 
 + push af 
 + ld hl,$51cb 
 + ld (samcnv),hl 
 + ld a,$bb 
 + ld (orncp),
 + ld (samcp),
 + ld a,$7a 
 + ld (ornld),
 + ld (samld),
 + ld a,$80 
 + ld (samclc2),
 + ld bc,pt2pd 
 + ld hl,$8687 
 + ld de,pt2emptyorn 
 + 
 +initcommon 
 + 
 + ld (ptdecod+1),bc 
 + ld (pscalc),hl 
 + push de 
 + 
 +;note table data depacker 
 +;(c) ivan roshin 
 + ld de,t_pack 
 + ld bc,t1_+(2*49)-1 
 +tp_0 ld a,(de) 
 + inc de 
 + cp 15*2 
 + jr nc,tp_1 
 + ld h,a 
 + ld a,(de) 
 + ld l,a 
 + inc de 
 + jr tp_2 
 +tp_1 push de 
 + ld d,0 
 + ld e,a 
 + add hl,de 
 + add hl,de 
 + pop de 
 +tp_2 ld a,
 + ld (bc),
 + dec bc 
 + ld a,l 
 + ld (bc),
 + dec bc 
 + sub ($f8*2)#256 
 + jr nz,tp_0 
 + 
 + ld hl,setup 
 + res 7,(hl) 
 + 
 + if curposcounter 
 + inc hl 
 + ld (hl),
 + endif 
 + 
 + ld hl,vars 
 + ld (hl),
 + ld de,vars+1 
 + ld bc,var0end-vars-1 
 + ldir 
 + ld (adinpta),hl ;ptr to zero 
 + inc a 
 + ld (delycnt),
 + ld hl,$f001 ;h - chp_volume, l - chp_ntskcn 
 + ld (chana+chp_ntskcn),hl 
 + ld (chanb+chp_ntskcn),hl 
 + ld (chanc+chp_ntskcn),hl 
 + pop hl 
 + ld (chana+chp_ornptr),hl 
 + ld (chanb+chp_ornptr),hl 
 + ld (chanc+chp_ornptr),hl 
 + 
 + pop af 
 + 
 +;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 $a7 ;#00 (nop) or #a7 (and a) 
 + ld (l3),
 + ex de,hl 
 + pop bc ;bc=t1_ 
 + add hl,bc 
 + 
 + ld a,(de) 
 + add a,(t_)#256 
 + ld c,a 
 + adc a,t_/256 
 + sub c 
 + ld b,a 
 + push bc 
 + ld de,nt_ 
 + push de 
 + 
 + ld b,12 
 +l1 push bc 
 + ld c,(hl) 
 + inc hl 
 + push hl 
 + ld b,(hl) 
 + 
 + push de 
 + ex de,hl 
 + ld de,23 
 + ld ixu,
 + 
 +l2 srl b 
 + rr c 
 +l3 db $19 ;and a or nop 
 + ld a,c 
 + adc a,d ;=adc 0 
 + ld (hl),
 + inc hl 
 + ld a,b 
 + adc a,d 
 + ld (hl),
 + add hl,de 
 + dec ixu 
 + 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)#256 
 + jr nz,corr_1 
 + ld a,$fd 
 + ld (nt_+$2e),
 + 
 +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.. - 2.x,3.5x..3.6x..vtii1.0) 
 + 
 + cp 5 
 + ld hl,$11 
 + ld d,h 
 + ld e,h 
 + ld a,$17 
 + jr nc,m1 
 + dec l 
 + ld e,l 
 + xor a 
 +m1 ld (m2),
 + 
 + ld ix,vt_+16 
 + 
 + ld c,$f 
 +initv2 push hl 
 + 
 + add hl,de 
 + ex de,hl 
 + sbc hl,hl 
 + 
 + ld b,$10 
 +initv1 ld a,
 +m2 db $7d 
 + ld a,h 
 + adc a,0 
 + ld (ix),
 + inc ix 
 + add hl,de 
 + djnz initv1 
 + 
 + pop hl 
 + ld a,e 
 + cp $77 
 + jr nz,m3 
 + inc e 
 +m3 dec c 
 + jr nz,initv2 
 + 
 + jp rout 
 + 
 +setmdad ld (modaddr),hl 
 + ld (mdaddr1),hl 
 + ld (mdaddr2),hl 
 + ret 
 + 
 +ptdecod jp $c3c3 
 + 
 +;pt2 pattern decoder 
 +pd2_sam call setsam 
 + jr pd2_loop 
 + 
 +pd2_eoff ld (ix-12+chp_env_en),
 + jr pd2_loop 
 + 
 +pd2_env ld (ix-12+chp_env_en),16 
 + ld (ayregs+envtp),
 + ld a,(bc) 
 + inc bc 
 + ld l,a 
 + ld a,(bc) 
 + inc bc 
 + ld h,a 
 + ld (envbase),hl 
 + jr pd2_loop 
 + 
 +pd2_orn call setorn 
 + jr pd2_loop 
 + 
 +pd2_skip inc a 
 + ld (ix-12+chp_nntskp),
 + jr pd2_loop 
 + 
 +pd2_vol rrca 
 + rrca 
 + rrca 
 + rrca 
 + ld (ix-12+chp_volume),
 + jr pd2_loop 
 + 
 +pd2_del call c_delay 
 + jr pd2_loop 
 + 
 +pd2_glis set 2,(ix-12+chp_flags) 
 + inc a 
 + ld (ix-12+chp_tnsldl),
 + ld (ix-12+chp_tslcnt),
 + ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_tslstp),
 + add a,a 
 + sbc a,a 
 + ld (ix-12+chp_tslstp+1),
 + scf 
 + jr pd2_lp2 
 + 
 +pt2pd and a 
 + 
 +pd2_lp2 ex af,af' 
 + 
 +pd2_loop ld a,(bc) 
 + inc bc 
 + add a,$20 
 + jr z,pd2_rel 
 + jr c,pd2_sam 
 + add a,96 
 + jr c,pd2_note 
 + inc a 
 + jr z,pd2_eoff 
 + add a,15 
 + jp z,pd_fin 
 + jr c,pd2_env 
 + add a,$10 
 + jr c,pd2_orn 
 + add a,$40 
 + jr c,pd2_skip 
 + add a,$10 
 + jr c,pd2_vol 
 + inc a 
 + jr z,pd2_del 
 + inc a 
 + jr z,pd2_glis 
 + inc a 
 + jr z,pd2_port 
 + inc a 
 + jr z,pd2_stop 
 + ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_crnssl),
 + jr pd2_loop 
 + 
 +pd2_port res 2,(ix-12+chp_flags) 
 + ld a,(bc) 
 + inc bc 
 + inc bc ;ignoring precalc delta to right sound 
 + inc bc 
 + scf 
 + jr pd2_lp2 
 + 
 +pd2_stop ld (ix-12+chp_tslcnt),
 + jr pd2_loop 
 + 
 +pd2_rel ld (ix-12+chp_flags),
 + jr pd2_exit 
 + 
 +pd2_note ld l,
 + ld a,(ix-12+chp_note) 
 + ld (prnote+1),
 + ld (ix-12+chp_note),
 + xor a 
 + ld (ix-12+chp_tslcnt),
 + set 0,(ix-12+chp_flags) 
 + ex af,af' 
 + jr nc,noglis2 
 + bit 2,(ix-12+chp_flags) 
 + jr nz,noport2 
 + ld (lostep),
 + add a,a 
 + sbc a,a 
 + ex af,af' 
 + ld h,a 
 + ld l,a 
 + inc a 
 + call setport 
 +noport2 ld (ix-12+chp_tslcnt),
 +noglis2 xor a 
 + 
 + 
 +pd2_exit ld (ix-12+chp_psinsm),
 + ld (ix-12+chp_psinor),
 + ld (ix-12+chp_crtnsl),
 + ld (ix-12+chp_crtnsl+1),
 + jp pd_fin 
 + 
 +;pt3 pattern decoder 
 +pd_orsm ld (ix-12+chp_env_en),
 + call setorn 
 +pd_sam_ ld a,(bc) 
 + inc bc 
 + rrca 
 + 
 +pd_sam call setsam 
 + jr pd_loop 
 + 
 +pd_vol rrca 
 + rrca 
 + rrca 
 + rrca 
 + ld (ix-12+chp_volume),
 + jr pd_lp2 
 + 
 +pd_eoff ld (ix-12+chp_env_en),
 + ld (ix-12+chp_psinor),
 + jr pd_lp2 
 + 
 +pd_sore dec a 
 + jr nz,pd_env 
 + ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_nntskp),
 + jr pd_lp2 
 + 
 +pd_env call setenv 
 + jr pd_lp2 
 + 
 +pd_orn call setorn 
 + jr pd_loop 
 + 
 +pd_esam ld (ix-12+chp_env_en),
 + ld (ix-12+chp_psinor),
 + call nz,setenv 
 + jr pd_sam_ 
 + 
 +pt3pd ld a,(ix-12+chp_note) 
 + ld (prnote+1),
 + ld l,(ix-12+chp_crtnsl) 
 + ld h,(ix-12+chp_crtnsl+1) 
 + ld (prslide+1),hl 
 + 
 +pd_loop ld de,$2010 
 +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,96 
 + 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-$20e0 
 + add hl,de 
 + ld e,(hl) 
 + inc hl 
 + ld d,(hl) 
 + push de 
 + jr pd_loop 
 + 
 +pd_nois ld (ns_base),
 + jr pd_lp2 
 + 
 +pd_rel res 0,(ix-12+chp_flags) 
 + jr pd_res 
 + 
 +pd_note ld (ix-12+chp_note),
 + set 0,(ix-12+chp_flags) 
 + 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,$3131 
 + 
 +pd_fin ld a,(ix-12+chp_nntskp) 
 + ld (ix-12+chp_ntskcn),
 + ret 
 + 
 +c_portm ld a,(bc) 
 + inc bc 
 +;skip precalculated tone delta (because 
 +;cannot be right after pt3 compilation) 
 + inc bc 
 + inc bc 
 + ex af,af' 
 + ld a,(bc) ;signed tone step 
 + inc bc 
 + ld (lostep),
 + ld a,(bc) 
 + inc bc 
 + and a 
 + ex af,af' 
 + ld l,(ix-12+chp_crtnsl) 
 + ld h,(ix-12+chp_crtnsl+1) 
 + 
 +;set portamento variables 
 +;a - delay; a' - hi(step); zf' - (a'=0); hl - crtnsl 
 + 
 +setport res 2,(ix-12+chp_flags) 
 + ld (ix-12+chp_tnsldl),
 + ld (ix-12+chp_tslcnt),
 + push hl 
 + ld de,nt_ 
 + ld a,(ix-12+chp_note) 
 + ld (ix-12+chp_sltont),
 + add a,a 
 + ld l,a 
 + ld h,0 
 + add hl,de 
 + ld a,(hl) 
 + inc hl 
 + ld h,(hl) 
 + ld l,a 
 + push hl 
 +prnote ld a,$3e 
 + ld (ix-12+chp_note),
 + add a,a 
 + ld l,a 
 + ld h,0 
 + add hl,de 
 + ld e,(hl) 
 + inc hl 
 + ld d,(hl) 
 + pop hl 
 + sbc hl,de 
 + ld (ix-12+chp_tndelt),
 + ld (ix-12+chp_tndelt+1),
 + pop de 
 +zversion ld a,$3e 
 + cp 6 
 + jr c,oldprtm ;old 3xxx for pt v3.5- 
 +prslide ld de,$1111 
 + ld (ix-12+chp_crtnsl),
 + ld (ix-12+chp_crtnsl+1),
 +lostep equ $+1 
 +oldprtm ld a,$3e 
 + ex af,af' 
 + 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-12+chp_tslstp+1),
 + ex af,af' 
 + ld (ix-12+chp_tslstp),
 + ld (ix-12+chp_conoff),
 + ret 
 + 
 +c_gliss set 2,(ix-12+chp_flags) 
 + ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_tnsldl),
 + ld (ix-12+chp_tslcnt),
 + 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-12+chp_psinsm),
 + ret 
 + 
 +c_orpos ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_psinor),
 + ret 
 + 
 +c_vibrt ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_onoffd),
 + ld (ix-12+chp_conoff),
 + ld a,(bc) 
 + inc bc 
 + ld (ix-12+chp_offond),
 + xor a 
 + ld (ix-12+chp_tslcnt),
 + ld (ix-12+chp_crtnsl),
 + ld (ix-12+chp_crtnsl+1),
 + ret 
 + 
 +c_engls ld a,(bc) 
 + inc bc 
 + ld (env_del),
 + ld (curedel),
 + ld a,(bc) 
 + inc bc 
 + ld l,a 
 + ld a,(bc) 
 + inc bc 
 + ld h,a 
 + ld (esldadd),hl 
 + ret 
 + 
 +c_delay ld a,(bc) 
 + inc bc 
 + ld (delay),
 + ret 
 + 
 +setenv ld (ix-12+chp_env_en),
 + ld (ayregs+envtp),
 + ld a,(bc) 
 + inc bc 
 + ld h,a 
 + ld a,(bc) 
 + inc bc 
 + ld l,a 
 + ld (envbase),hl 
 + xor a 
 + ld (ix-12+chp_psinor),
 + ld (curedel),
 + ld h,a 
 + ld l,a 
 + ld (curesld),hl 
 +c_nop ret 
 + 
 +setorn add a,
 + ld e,a 
 + ld d,0 
 + ld (ix-12+chp_psinor),
 +ornptrs equ $+1 
 + ld hl,$2121 
 + add hl,de 
 + ld e,(hl) 
 + inc hl 
 + ld d,(hl) 
 +mdaddr2 equ $+1 
 + ld hl,$2121 
 + add hl,de 
 + ld (ix-12+chp_ornptr),
 + ld (ix-12+chp_ornptr+1),
 + ret 
 + 
 +setsam add a,
 + ld e,a 
 + ld d,0 
 +samptrs equ $+1 
 + ld hl,$2121 
 + add hl,de 
 + ld e,(hl) 
 + inc hl 
 + ld d,(hl) 
 +mdaddr1 equ $+1 
 + ld hl,$2121 
 + add hl,de 
 + ld (ix-12+chp_samptr),
 + ld (ix-12+chp_samptr+1),
 + 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_delay 
 + dw c_nop 
 + dw c_nop 
 + dw c_nop 
 + dw c_nop 
 + dw c_nop 
 + dw c_nop 
 + 
 +chregs xor a 
 + ld (ampl),
 + bit 0,(ix+chp_flags) 
 + push hl 
 + jp z,ch_exit 
 + ld (csp_+1),sp 
 + ld l,(ix+chp_ornptr) 
 + ld h,(ix+chp_ornptr+1) 
 + ld sp,hl 
 + pop de 
 + ld h,a 
 + ld a,(ix+chp_psinor) 
 + ld l,a 
 + add hl,sp 
 + inc a 
 + ;pt2    pt3 
 +orncp inc a ;cp e   cp d 
 + jr c,ch_orps 
 +ornld db 1 ;ld a,d ld a,e 
 +ch_orps ld (ix+chp_psinor),
 + ld a,(ix+chp_note) 
 + add a,(hl) 
 + jp p,ch_ntp 
 + xor a 
 +ch_ntp cp 96 
 + jr c,ch_nok 
 + ld a,95 
 +ch_nok add a,
 + ex af,af' 
 + ld l,(ix+chp_samptr) 
 + ld h,(ix+chp_samptr+1) 
 + ld sp,hl 
 + pop de 
 + ld h,0 
 + ld a,(ix+chp_psinsm) 
 + ld b,a 
 + add a,a 
 +samclc2 add a,a ;or add a,b for pt2 
 + ld l,a 
 + add hl,sp 
 + ld sp,hl 
 + ld a,b 
 + inc a 
 + ;pt2    pt3 
 +samcp inc a ;cp e   cp d 
 + jr c,ch_smps 
 +samld db 1 ;ld a,d ld a,e 
 +ch_smps ld (ix+chp_psinsm),
 + pop bc 
 + pop hl 
 + 
 +;convert pt2 sample to pt3 
 + ;pt2            pt3 
 +samcnv pop hl ;bit 2,c        jr e_ 
 + pop hl 
 + ld h,b 
 + jr nz,$+8 
 + ex de,hl 
 + and a 
 + sbc hl,hl 
 + sbc hl,de 
 + ld d,c 
 + rr c 
 + sbc a,a 
 + cpl 
 + and $3e 
 + rr c 
 + rr b 
 + and c 
 + ld c,a 
 + ld a,b 
 + rra 
 + rra 
 + rr d 
 + rra 
 + and $9f 
 + ld b,a 
 + 
 +e_ ld e,(ix+chp_tnacc) 
 + ld d,(ix+chp_tnacc+1) 
 + add hl,de 
 + bit 6,b 
 + jr z,ch_noac 
 + ld (ix+chp_tnacc),
 + ld (ix+chp_tnacc+1),
 +ch_noac ex de,hl 
 + ex af,af' 
 + add a,(nt_)#256 
 + ld l,a 
 + adc a,nt_/256 
 + sub l 
 + ld h,a 
 + ld sp,hl 
 + pop hl 
 + add hl,de 
 + ld e,(ix+chp_crtnsl) 
 + ld d,(ix+chp_crtnsl+1) 
 + add hl,de 
 +csp_ ld sp,$3131 
 + ex (sp),hl 
 + xor a 
 + or (ix+chp_tslcnt) 
 + jr z,ch_amp 
 + dec (ix+chp_tslcnt) 
 + jr nz,ch_amp 
 + ld a,(ix+chp_tnsldl) 
 + ld (ix+chp_tslcnt),
 + ld l,(ix+chp_tslstp) 
 + ld h,(ix+chp_tslstp+1) 
 + ld a,h 
 + add hl,de 
 + ld (ix+chp_crtnsl),
 + ld (ix+chp_crtnsl+1),
 + bit 2,(ix+chp_flags) 
 + jr nz,ch_amp 
 + ld e,(ix+chp_tndelt) 
 + ld d,(ix+chp_tndelt+1) 
 + and a 
 + jr z,ch_stpp 
 + ex de,hl 
 +ch_stpp sbc hl,de 
 + jp m,ch_amp 
 + ld a,(ix+chp_sltont) 
 + ld (ix+chp_note),
 + xor a 
 + ld (ix+chp_tslcnt),
 + ld (ix+chp_crtnsl),
 + ld (ix+chp_crtnsl+1),
 +ch_amp ld a,(ix+chp_cramsl) 
 + bit 7,c 
 + jr z,ch_noam 
 + bit 6,c 
 + jr z,ch_amin 
 + cp 15 
 + jr z,ch_noam 
 + inc a 
 + jr ch_svam 
 +ch_amin cp -15 
 + jr z,ch_noam 
 + dec a 
 +ch_svam ld (ix+chp_cramsl),
 +ch_noam ld l,
 + ld a,b 
 + and 15 
 + add a,l 
 + jp p,ch_apos 
 + xor a 
 +ch_apos cp 16 
 + jr c,ch_vol 
 + ld a,15 
 +ch_vol or (ix+chp_volume) 
 + add a,(vt_)#256 
 + ld l,a 
 + adc a,vt_/256 
 + sub l 
 + ld h,a 
 + ld a,(hl) 
 +ch_env bit 0,
 + jr nz,ch_noen 
 + or (ix+chp_env_en) 
 +ch_noen ld (ampl),
 + bit 7,b 
 + ld a,c 
 + jr z,no_ensl 
 + rla 
 + rla 
 + sra a 
 + sra a 
 + sra a 
 + add a,(ix+chp_crensl) ;see comment below 
 + bit 5,b 
 + jr z,no_enac 
 + ld (ix+chp_crensl),
 +no_enac ld hl,addtoen 
 + add a,(hl) ;bug in pt3 - need word here 
 + ld (hl),
 + jr ch_mix 
 +no_ensl rra 
 + add a,(ix+chp_crnssl) 
 + ld (addtons),
 + bit 5,b 
 + jr z,ch_mix 
 + ld (ix+chp_crnssl),
 +ch_mix ld a,
 + rra 
 + and $48 
 +ch_exit ld hl,ayregs+mixer 
 + or (hl) 
 + rrca 
 + ld (hl),
 + pop hl 
 + xor a 
 + or (ix+chp_conoff) 
 + ret z 
 + dec (ix+chp_conoff) 
 + ret nz 
 + xor (ix+chp_flags) 
 + ld (ix+chp_flags),
 + rra 
 + ld a,(ix+chp_onoffd) 
 + jr c,ch_ondl 
 + ld a,(ix+chp_offond) 
 +ch_ondl ld (ix+chp_conoff),
 + ret 
 + 
 +play xor a 
 + ld (addtoen),
 + ld (ayregs+mixer),
 + dec a 
 + ld (ayregs+envtp),
 + ld hl,delycnt 
 + dec (hl) 
 + jp nz,pl2 
 + ld hl,chana+chp_ntskcn 
 + dec (hl) 
 + jr nz,pl1b 
 +adinpta equ $+1 
 + ld bc,$0101 
 + ld a,(bc) 
 + and a 
 + jr nz,pl1a 
 +jumptonextpos 
 + ld d,a 
 + ld (ns_base),
 +crpsptr equ $+1 
 + ld hl,$2121 
 + inc hl 
 + ld a,(hl) 
 + inc a 
 + jr nz,plnlp 
 + 
 + if loopchecker 
 + call checklp 
 + endif 
 + 
 +lposptr equ $+1 
 + ld hl,$2121 
 + ld a,(hl) 
 + inc a 
 +plnlp ld (crpsptr),hl 
 + dec a 
 + ;pt2            pt3 
 +pscalc dec a ;add a,a        nop 
 + dec a ;add a,(hl)     nop 
 + add a,a 
 + ld e,a 
 + rl d 
 + 
 + if curposcounter 
 + ld a,l 
 +possub sub $d6 
 + ld (curpos),
 + endif 
 + 
 +patsptr equ $+1 
 + ld hl,$2121 
 + add hl,de 
 +modaddr equ $+1 
 + ld de,$1111 
 + 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),hl 
 + pop hl 
 + add hl,de 
 + ld (adinptc),hl 
 +psp_ ld sp,$3131 
 +pl1a ld ix,chana+12 
 + call ptdecod 
 + ld (adinpta),bc 
 + 
 +pl1b ld hl,chanb+chp_ntskcn 
 + dec (hl) 
 + jr nz,pl1c 
 + ld ix,chanb+12 
 +adinptb equ $+1 
 + ld bc,$0101 
 + call ptdecod 
 + ld (adinptb),bc 
 + 
 +pl1c ld hl,chanc+chp_ntskcn 
 + dec (hl) 
 + jr nz,pl1d 
 + ld ix,chanc+12 
 +adinptc equ $+1 
 + ld bc,$0101 
 + call ptdecod 
 + ld (adinptc),bc 
 + 
 +delay equ $+1 
 +pl1d ld a,$3e 
 + ld (delycnt),
 + 
 +pl2 ld ix,chana 
 + ld hl,(ayregs+tona) 
 + call chregs 
 + ld (ayregs+tona),hl 
 + ld a,(ampl) 
 + ld (ayregs+ampla),
 + ld ix,chanb 
 + ld hl,(ayregs+tonb) 
 + call chregs 
 + ld (ayregs+tonb),hl 
 + ld a,(ampl) 
 + ld (ayregs+amplb),
 + ld ix,chanc 
 + ld hl,(ayregs+tonc) 
 + call chregs 
 + ld (ayregs+tonc),hl 
 + 
 + ld hl,(ns_base_addtons) 
 + ld a,h 
 + add a,l 
 + ld (ayregs+noise),
 + 
 +addtoen equ $+1 
 + ld a,$3e 
 + 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+env),hl 
 + 
 + xor a 
 + ld hl,curedel 
 + or (hl) 
 + jr z,rout 
 + dec (hl) 
 + jr nz,rout 
 +env_del equ $+1 
 + ld a,$3e 
 + ld (hl),
 +esldadd equ $+1 
 + ld hl,$2121 
 + add hl,de 
 + ld (curesld),hl 
 + 
 +rout 
 + if acbbac 
 + ld a,(setup) 
 + and 12 
 + jr z,abc 
 + add a,chtable#256 
 + ld e,a 
 + adc a,chtable/256 
 + sub e 
 + ld d,a 
 + ld b,0 
 + ld ix,ayregs 
 + ld hl,ayregs 
 + ld a,(de) 
 + inc de 
 + ld c,a 
 + add hl,bc 
 + ld a,(ix+tonb) 
 + ld c,(hl) 
 + ld (ix+tonb),
 + ld (hl),
 + inc hl 
 + ld a,(ix+tonb+1) 
 + ld c,(hl) 
 + ld (ix+tonb+1),
 + ld (hl),
 + ld a,(de) 
 + inc de 
 + ld c,a 
 + add hl,bc 
 + ld a,(ix+amplb) 
 + ld c,(hl) 
 + ld (ix+amplb),
 + ld (hl),
 + ld a,(de) 
 + inc de 
 + ld (rxca1),
 + xor 8 
 + ld (rxca2),
 + ld hl,ayregs+mixer 
 + ld a,(de) 
 + and (hl) 
 + ld e,a 
 + ld a,(hl) 
 +rxca1 ld a,(hl) 
 + and %010010 
 + or e 
 + ld e,a 
 + ld a,(hl) 
 + and %010010 
 +rxca2 or e 
 + or e 
 + ld (hl),
 +abc 
 + endif 
 + if zx 
 +noout xor a 
 + ld de,$ffbf 
 + ld bc,$fffd 
 + ld hl,ayregs 
 +lout out (c),
 + ld b,e 
 + outi 
 + ld b,d 
 + inc a 
 + cp 13 
 + jr nz,lout 
 + out (c),
 + ld a,(hl) 
 + and a 
 + ret m 
 + ld b,e 
 + out (c),
 + ret 
 + endif 
 + 
 + if msx 
 +;msx version of rout (c)dioniso 
 + xor a 
 + ld c,$a0 
 + ld hl,ayregs 
 +lout out (c),
 + inc c 
 + outi 
 + dec c 
 + inc a 
 + cp 13 
 + jr nz,lout 
 + out (c),
 + ld a,(hl) 
 + and a 
 + ret m 
 + inc c 
 + out (c),
 + ret 
 + endif 
 + 
 + if acbbac 
 +chtable equ $-4 
 + db 4,5,15,%001001,0,7,7,%100100 
 + endif 
 + 
 +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,
 +tcold_1 db $5c+1,
 +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,
 +tcnew_3 db $56+1 
 +tcold_3 db $1e+1,$22+1,$24+1,$28+1,$2c+1,$2e+1,$32+1,$be+1,
 +tcnew_0 db $1c+1,$20+1,$22+1,$26+1,$2a+1,$2c+1,$30+1,$54+1 
 + db $bc+1,$be+1,
 +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,
 + 
 +pt3emptyorn equ $-1 
 + db 1,0 
 +t_pack db ($06ec*2/256)#256,($06ec*2)#256 
 + 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)#256 
 + 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)#256 
 + 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)#256 
 + 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 
 + 
 +;vars from here can be stripped 
 +;you can move vars to any other address 
 + 
 +vars 
 + 
 +;channelsvars 
 +chana ds chp 
 +chanb ds chp 
 +chanc ds chp 
 + 
 +;globalvars 
 +delycnt db 0 
 +curesld dw 0 
 +curedel db 0 
 +ns_base_addtons 
 +ns_base db 0 
 +addtons db 0 
 + 
 +ayregs 
 + 
 +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 
 + 
 +pt2emptyorn equ vt_+31 ;1,0,0 sequence 
 + 
 +nt_ ds 192 ;creatednotetableaddress 
 + 
 +;local var 
 +ampl equ ayregs+amplc 
 + 
 +var0end equ vt_+16 ;init zeroes from vars to var0end-1 
 + 
 +varsend equ $ 
 + 
 + 
 +mdladdr equ $ 
 + 
 +;release 0 steps: 
 +;02/27/2005 
 +;merging pt2 and pt3 players; debug 
 +;02/28/2005 
 +;debug; optimization 
 +;03/01/2005 
 +;migration to sjasm; conditional assembly (zx, msx and 
 +;visualization) 
 +;03/03/2005 
 +;setport subprogram (35 bytes shorter) 
 +;03/05/2005 
 +;fixed curposcounter error 
 +;03/06/2005 
 +;added acb and bac channels swapper (for spectre); more cond. 
 +;assembly keys; optimization 
 + 
 +;tests in immation tester v1.0 by andy man/pos 
 +;(for minimal build) 
 +;module name/author     min tacts       max tacts 
 +;pt3 (a little slower than standalone player) 
 +;spleen/nik-o           1720            9368 
 +;chuta/miguel           1720            9656 
 +;zhara/macros           4536            8792 
 +;pt2 (more slower than standalone player) 
 +;epilogue/nik-o         3928            10232 
 +;ny themes/zhenya       3848            9208 
 +;guest 4/alex job       2824            9352 
 +;kickdb/fatal snipe     1720            9880 
 + 
 +;size (minimal build for zx spectrum): 
 +;code block #7b4 bytes 
 +;variables #21d bytes (can be stripped) 
 +;size in ram #7b4+#21d=#9d1 (2513) bytes 
 + 
 +;notes: 
 +;pro tracker 3.4r can not be detected by header, so pt3.4r tone 
 +;tables realy used only for modules of 3.3 and older versions. 
 + 
 +;        endmodule 
 +</code> 
 + 
 +---- 
 + 
 +**Navigation: [[general]] . [[math]] . [[graphic]] . [[sound]] . [[system]] . [[other]] . back to [[start]]**
pt3player-asl.1360674774.txt.gz · Last modified: 2013/02/12 14:12 by darkbyte