1 ;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
2 ;(c)2004,2007 S.V.Bulba <vorobey@mail.khstu.ru>
3 ;http://bulba.untergrund.net (http://bulba.at.kz)
6 ;Call MUTE or INIT one more time to mute sound after stopping
11 ;Test codes (commented)
34 ;Entry and other points
36 ;START+3 initialization with module address in HL
37 ;START+5 play one quark
39 ;START+10 setup and status flags
40 ;START+11 pointer to current position value in PT3 module;
41 ;After INIT (START+11) points to Postion0-1 (optimization)
68 GetLoopMode: ; NZ: looping disabled
75 IsLoopPassed: ; NZ: yes
89 SetupFlags DB 0 ;set bit0 to 1, if you want to play without looping
90 ;bit7 is set each time, when loop point is passed
93 CHECKLP LD HL,SetupFlags
100 LD HL,ChanA+CHP.NtSkCn
110 ;HL - AddressOfModule
141 ;note table data depacker
175 LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn
176 LD (ChanA+CHP.NtSkCn),HL
177 LD (ChanB+CHP.NtSkCn),HL
178 LD (ChanC+CHP.NtSkCn),HL
181 LD (AdInPtA),HL ;ptr to zero
182 LD (ChanA+CHP.OrnPtr),HL ;ornament 0 is "0,1,0"
183 LD (ChanB+CHP.OrnPtr),HL ;in all versions from
184 LD (ChanC+CHP.OrnPtr),HL ;3.xx to 3.6x and VTII
186 LD (ChanA+CHP.SamPtr),HL ;S1 There is no default
187 LD (ChanB+CHP.SamPtr),HL ;S2 sample in PT3, so, you
188 LD (ChanC+CHP.SamPtr),HL ;S3 can comment S1,2,3; see
189 ;also EMPTYSAMORN comment
191 LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
200 LD A,(IX+99-100) ;TONE TABLE NUMBER
204 ;NoteTableCreator (c) Ivan Roshin
205 ;A - NoteTableNumber*2+VersionForNoteTable
206 ;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
218 AND #A7 ;#00 (NOP) or #A7 (AND A)
248 L3 DB #19 ;AND A or NOP
299 ;VolTableCreator (c) Ivan Roshin
300 ;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
301 ;5.. - 3.5x..3.6x..VTII1.0)
347 PD_OrSm LD (IX-12+CHP.Env_En),0
365 LD (IX-12+CHP.SamPtr),L
366 LD (IX-12+CHP.SamPtr+1),H
373 LD (IX-12+CHP.Volume),A
376 PD_EOff LD (IX-12+CHP.Env_En),A
377 LD (IX-12+CHP.PsInOr),A
384 LD (IX-12+CHP.NNtSkp),A
393 PD_ESAM LD (IX-12+CHP.Env_En),A
394 LD (IX-12+CHP.PsInOr),A
400 PTDECOD LD A,(IX-12+CHP.Note)
402 LD L,(IX-12+CHP.CrTnSl)
403 LD H,(IX-12+CHP.CrTnSl+1)
430 LD HL,0+(SPCCOMS+#FF20-#2000)&0xFFFF
438 PD_NOIS LD (Ns_Base),A
441 PD_REL RES 0,(IX-12+CHP.Flags)
444 PD_NOTE LD (IX-12+CHP.Note),A
445 SET 0,(IX-12+CHP.Flags)
448 PD_RES LD (PDSP_+1),SP
460 PD_FIN LD A,(IX-12+CHP.NNtSkp)
461 LD (IX-12+CHP.NtSkCn),A
464 C_PORTM RES 2,(IX-12+CHP.Flags)
467 ;SKIP PRECALCULATED TONE DELTA (BECAUSE
468 ;CANNOT BE RIGHT AFTER PT3 COMPILATION)
471 LD (IX-12+CHP.TnSlDl),A
472 LD (IX-12+CHP.TSlCnt),A
474 LD A,(IX-12+CHP.Note)
475 LD (IX-12+CHP.SlToNt),A
486 LD (IX-12+CHP.Note),A
496 LD (IX-12+CHP.TnDelt),L
497 LD (IX-12+CHP.TnDelt+1),H
498 LD E,(IX-12+CHP.CrTnSl)
499 LD D,(IX-12+CHP.CrTnSl+1)
503 JR C,OLDPRTM ;Old 3xxx for PT v3.5-
505 LD (IX-12+CHP.CrTnSl),E
506 LD (IX-12+CHP.CrTnSl+1),D
507 OLDPRTM LD A,(BC) ;SIGNED TONE STEP
521 SET_STP LD (IX-12+CHP.TSlStp+1),A
523 LD (IX-12+CHP.TSlStp),A
524 LD (IX-12+CHP.COnOff),0
527 C_GLISS SET 2,(IX-12+CHP.Flags)
530 LD (IX-12+CHP.TnSlDl),A
533 LD A,(Version) ;AlCo PT3.7+
537 GL36 LD (IX-12+CHP.TSlCnt),A
547 LD (IX-12+CHP.PsInSm),A
552 LD (IX-12+CHP.PsInOr),A
557 LD (IX-12+CHP.OnOffD),A
558 LD (IX-12+CHP.COnOff),A
561 LD (IX-12+CHP.OffOnD),A
563 LD (IX-12+CHP.TSlCnt),A
564 LD (IX-12+CHP.CrTnSl),A
565 LD (IX-12+CHP.CrTnSl+1),A
586 SETENV LD (IX-12+CHP.Env_En),E
596 LD (IX-12+CHP.PsInOr),A
606 LD (IX-12+CHP.PsInOr),D
616 LD (IX-12+CHP.OrnPtr),L
617 LD (IX-12+CHP.OrnPtr+1),H
620 ;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
645 LD H,(IX+CHP.OrnPtr+1)
656 CH_ORPS LD (IX+CHP.PsInOr),A
667 LD H,(IX+CHP.SamPtr+1)
683 CH_SMPS LD (IX+CHP.PsInSm),A
687 LD D,(IX+CHP.TnAcc+1)
692 LD (IX+CHP.TnAcc+1),H
703 LD D,(IX+CHP.CrTnSl+1)
715 LD H,(IX+CHP.TSlStp+1)
719 LD (IX+CHP.CrTnSl+1),H
723 LD D,(IX+CHP.TnDelt+1)
734 LD (IX+CHP.CrTnSl+1),A
735 CH_AMP LD A,(IX+CHP.CrAmSl)
747 CH_SVAM LD (IX+CHP.CrAmSl),A
757 CH_VOL OR (IX+CHP.Volume)
775 ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW
779 NO_ENAC LD HL,AddToEn
780 ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE.
781 ;FIX IT IN NEXT VERSION?
785 ADD A,(IX+CHP.CrNsSl)
793 CH_EXIT LD HL,AYREGS+Mixer
809 CH_ONDL LD (IX+CHP.COnOff),A
820 LD HL,ChanA+CHP.NtSkCn
840 PLNLP LD (CrPsPtr),HL
866 PL1B LD HL,ChanB+CHP.NtSkCn
875 PL1C LD HL,ChanC+CHP.NtSkCn
903 ; LD A,(Ampl) ;Ampl = AYREGS+AmplC
904 ; LD (AYREGS+AmplC),A
907 LD HL,(Ns_Base_AddToNs)
957 NT_DATA DB (T_NEW_0-T1_)*2
976 TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
977 DB #18+1,#24+1,#3C+1,0
979 TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
980 DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
982 TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
983 TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
986 TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
987 DB #BA+1,#BC+1,#BE+1,0
990 DB 1,0,#90 ;delete #90 if you don't need default sample
992 ;first 12 values of tone tables (packed)
994 T_PACK DB #06EC*2/256,(#06EC*2)%256
1006 DB #066D*2/256,(#066D*2)%256
1019 DB #0704*2/256,(#0704*2)%256
1031 DB #07E0*2/256,(#07E0*2)%256
1044 ;vars from here can be stripped
1045 ;you can move VARS to any other address
1065 ;IX for PTDECOD here (+12)
1074 ;Enabled - 0,SimpleGliss - 2
1097 VT_ DS 256,0 ;CreatedVolumeTableAddress
1101 T1_ EQU VT_+16 ;Tone tables data depacked here
1104 T_OLD_2 EQU T_OLD_1+24
1105 T_OLD_3 EQU T_OLD_2+24
1106 T_OLD_0 EQU T_OLD_3+2
1109 T_NEW_2 EQU T_NEW_0+24
1112 NT_ DS 192,0 ;CreatedNoteTableAddress
1115 Ampl EQU AYREGS+AmplC
1117 VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1