Rev 49 | Blame | Compare with Previous | Last modification | View Log | Download
;module pt3player;Vortex Tracker II v1.0 PT3 player for ZX Spectrum;(c)2004,2007 S.V.Bulba <vorobey@mail.khstu.ru>;http://bulba.untergrund.net (http://bulba.at.kz);Release number;Release = "7";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 subroutine detects module version and rightly generates; both note and volume tables outside of code block (in VARS).;-Two portamento (spc. command 3xxx) algorithms (depending of; module version).;-New 1.XX and 2.XX special command behaviour (only for PT v3.7; and higher).;-Any Tempo value are accepted (including Tempo=1 and Tempo=2).;-Fully compatible with Ay_Emul PT3 player codes.;-See also notes at the end of this source code.;Limitations;-----------;-Can run in RAM only (self-modified code is used).;Warning!!! PLAY subroutine can crash if no module are loaded;into RAM or INIT subroutine was not called before.;Call MUTE or INIT one more time to mute sound after stopping;playing;ORG 0xC000;Test codes (commented); CALL START; EI;_LP HALT; CALL START+5; XOR A; IN A,(0xFE); CPL; AND 15; JR Z,_LP; JR START+8TonA = 0TonB = 2TonC = 4Noise = 6Mixer = 7AmplA = 8AmplB = 9AmplC = 10Env = 11EnvTp = 13;Entry and other points;START initialization;START+3 initialization with module address in HL;START+5 play one quark;START+8 mute;START+10 setup and status flags;START+11 pointer to current position value in PT3 module;;After INIT (START+11) points to Postion0-1 (optimization);START; LD HL,MDLADDR; JR INIT; JP PLAY; JR MUTESETUP DB 0 ;set bit0 to 1, if you want to play without looping;bit7 is set each time, when loop point is passedCrPsPtr DW 0;Identifier;DB "=VTII PT3 Player r.",Release,"="CHECKLP LD HL,SETUPSET 7,(HL)BIT 0,(HL)RET ZPOP HLLD HL,DelyCntINC (HL)LD HL,ChanA+CHP.NtSkCnINC (HL)MUTE XOR ALD H,ALD L,ALD (AYREGS+AmplA),ALD (AYREGS+AmplB),HLJP ROUT_A0INIT;HL - AddressOfModuleLD (MODADDR),HLLD (MDADDR2),HLPUSH HLLD DE,100ADD HL,DELD A,(HL)LD (Delay),APUSH HLPOP IXADD HL,DELD (CrPsPtr),HLLD E,(IX+102-100)ADD HL,DEINC HLLD (LPosPtr),HLPOP DELD L,(IX+103-100)LD H,(IX+104-100)ADD HL,DELD (PatsPtr),HLLD HL,169ADD HL,DELD (OrnPtrs),HLLD HL,105ADD HL,DELD (SamPtrs),HLLD HL,SETUPRES 7,(HL);note table data depackerLD DE,T_PACKLD BC,T1_+(2*49)-1TP_0 LD A,(DE)INC DECP 15*2JR NC,TP_1LD H,ALD A,(DE)LD L,AINC DEJR TP_2TP_1 PUSH DELD D,0LD E,AADD HL,DEADD HL,DEPOP DETP_2 LD A,HLD (BC),ADEC BCLD A,LLD (BC),ADEC BCSUB +(0xF8*2)&255JR NZ,TP_0LD HL,VARSLD (HL),ALD DE,VARS+1LD BC,VAR0END-VARS-1LDIRINC ALD (DelyCnt),ALD HL,0xF001 ;H - CHP.Volume, L - CHP.NtSkCnLD (ChanA+CHP.NtSkCn),HLLD (ChanB+CHP.NtSkCn),HLLD (ChanC+CHP.NtSkCn),HLLD HL,EMPTYSAMORNLD (AdInPtA),HL ;ptr to zeroLD (ChanA+CHP.OrnPtr),HL ;ornament 0 is "0,1,0"LD (ChanB+CHP.OrnPtr),HL ;in all versions fromLD (ChanC+CHP.OrnPtr),HL ;3.xx to 3.6x and VTIILD (ChanA+CHP.SamPtr),HL ;S1 There is no defaultLD (ChanB+CHP.SamPtr),HL ;S2 sample in PT3, so, youLD (ChanC+CHP.SamPtr),HL ;S3 can comment S1,2,3; see;also EMPTYSAMORN commentLD A,(IX+13-100) ;EXTRACT VERSION NUMBERSUB 0x30JR C,L20CP 10JR C,L21L20 LD A,6L21 LD (Version),APUSH AFCP 4LD A,(IX+99-100) ;TONE TABLE NUMBERRLAAND 7;NoteTableCreator (c) Ivan Roshin;A - NoteTableNumber*2+VersionForNoteTable;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)LD HL,NT_DATAPUSH DELD D,BADD A,ALD E,AADD HL,DELD E,(HL)INC HLSRL ESBC A,AAND 0xA7 ;0x00 (NOP) or 0xA7 (AND A)LD (L3),AEX DE,HLPOP BC ;BC=T1_ADD HL,BCLD A,(DE)ADD A,T_&255LD C,AADC A,T_/256SUB CLD B,APUSH BCLD DE,NT_PUSH DELD B,12L1 PUSH BCLD C,(HL)INC HLPUSH HLLD B,(HL)PUSH DEEX DE,HLLD DE,23LD HX,8L2 SRL BRR CL3 DB 0x19 ;AND A or NOPLD A,CADC A,D ;=ADC 0LD (HL),AINC HLLD A,BADC A,DLD (HL),AADD HL,DEDEC HXJR NZ,L2POP DEINC DEINC DEPOP HLINC HLPOP BCDJNZ L1POP HLPOP DELD A,ECP TCOLD_1&255JR NZ,CORR_1LD A,0xFDLD (NT_+0x2E),ACORR_1 LD A,(DE)AND AJR Z,TC_EXITRRAPUSH AFADD A,ALD C,AADD HL,BCPOP AFJR NC,CORR_2DEC (HL)DEC (HL)CORR_2 INC (HL)AND ASBC HL,BCINC DEJR CORR_1TC_EXITPOP AF;VolTableCreator (c) Ivan Roshin;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;;5.. - 3.5x..3.6x..VTII1.0)CP 5LD HL,0x11LD D,HLD E,HLD A,0x17JR NC,M1DEC LLD E,LXOR AM1 LD (M2),ALD IX,VT_+16LD C,0x10INITV2 PUSH HLADD HL,DEEX DE,HLSBC HL,HLINITV1 LD A,LM2 DB 0x7DLD A,HADC A,0LD (IX+0),AINC IXADD HL,DEINC CLD A,CAND 15JR NZ,INITV1POP HLLD A,ECP 0x77JR NZ,M3INC EM3 LD A,CAND AJR NZ,INITV2JP ROUT_A0;pattern decoderPD_OrSm LD (IX-12+CHP.Env_En),0CALL SETORNLD A,(BC)INC BCRRCAPD_SAM ADD A,APD_SAM_ LD E,ALD D,0SamPtrs = $+1LD HL,0x2121ADD HL,DELD E,(HL)INC HLLD D,(HL)MODADDR = $+1LD HL,0x2121ADD HL,DELD (IX-12+CHP.SamPtr),LLD (IX-12+CHP.SamPtr+1),HJR PD_LOOPPD_VOL RLCARLCARLCARLCALD (IX-12+CHP.Volume),AJR PD_LP2PD_EOff LD (IX-12+CHP.Env_En),ALD (IX-12+CHP.PsInOr),AJR PD_LP2PD_SorE DEC AJR NZ,PD_ENVLD A,(BC)INC BCLD (IX-12+CHP.NNtSkp),AJR PD_LP2PD_ENV CALL SETENVJR PD_LP2PD_ORN CALL SETORNJR PD_LOOPPD_ESAM LD (IX-12+CHP.Env_En),ALD (IX-12+CHP.PsInOr),ACALL NZ,SETENVLD A,(BC)INC BCJR PD_SAM_PTDECOD LD A,(IX-12+CHP.Note)LD (PrNote+1),ALD L,(IX-12+CHP.CrTnSl)LD H,(IX-12+CHP.CrTnSl+1)LD (PrSlide+1),HLPD_LOOP LD DE,0x2010PD_LP2 LD A,(BC)INC BCADD A,EJR C,PD_OrSmADD A,DJR Z,PD_FINJR C,PD_SAMADD A,EJR Z,PD_RELJR C,PD_VOLADD A,EJR Z,PD_EOffJR C,PD_SorEADD A,96JR C,PD_NOTEADD A,EJR C,PD_ORNADD A,DJR C,PD_NOISADD A,EJR C,PD_ESAMADD A,ALD E,ALD HL,+(SPCCOMS+0xFF20-0x2000)&65535ADD HL,DELD E,(HL)INC HLLD D,(HL)PUSH DEJR PD_LOOPPD_NOIS LD (Ns_Base),AJR PD_LP2PD_REL RES 0,(IX-12+CHP.Flags)JR PD_RESPD_NOTE LD (IX-12+CHP.Note),ASET 0,(IX-12+CHP.Flags)XOR APD_RES LD (PDSP_+1),SPLD SP,IXLD H,ALD L,APUSH HLPUSH HLPUSH HLPUSH HLPUSH HLPUSH HLPDSP_ LD SP,0x3131PD_FIN LD A,(IX-12+CHP.NNtSkp)LD (IX-12+CHP.NtSkCn),ARETC_PORTM RES 2,(IX-12+CHP.Flags)LD A,(BC)INC BC;SKIP PRECALCULATED TONE DELTA (BECAUSE;CANNOT BE RIGHT AFTER PT3 COMPILATION)INC BCINC BCLD (IX-12+CHP.TnSlDl),ALD (IX-12+CHP.TSlCnt),ALD DE,NT_LD A,(IX-12+CHP.Note)LD (IX-12+CHP.SlToNt),AADD A,ALD L,ALD H,0ADD HL,DELD A,(HL)INC HLLD H,(HL)LD L,APUSH HLPrNote LD A,0x3ELD (IX-12+CHP.Note),AADD A,ALD L,ALD H,0ADD HL,DELD E,(HL)INC HLLD D,(HL)POP HLSBC HL,DELD (IX-12+CHP.TnDelt),LLD (IX-12+CHP.TnDelt+1),HLD E,(IX-12+CHP.CrTnSl)LD D,(IX-12+CHP.CrTnSl+1)Version = $+1LD A,0x3ECP 6JR C,OLDPRTM ;Old 3xxx for PT v3.5-PrSlide LD DE,0x1111LD (IX-12+CHP.CrTnSl),ELD (IX-12+CHP.CrTnSl+1),DOLDPRTM LD A,(BC) ;SIGNED TONE STEPINC BCEX AF,AF'LD A,(BC)INC BCAND AJR Z,NOSIGEX DE,HLNOSIG SBC HL,DEJP P,SET_STPCPLEX AF,AF'NEGEX AF,AF'SET_STP LD (IX-12+CHP.TSlStp+1),AEX AF,AF'LD (IX-12+CHP.TSlStp),ALD (IX-12+CHP.COnOff),0RETC_GLISS SET 2,(IX-12+CHP.Flags)LD A,(BC)INC BCLD (IX-12+CHP.TnSlDl),AAND AJR NZ,GL36LD A,(Version) ;AlCo PT3.7+CP 7SBC A,AINC AGL36 LD (IX-12+CHP.TSlCnt),ALD A,(BC)INC BCEX AF,AF'LD A,(BC)INC BCJR SET_STPC_SMPOS LD A,(BC)INC BCLD (IX-12+CHP.PsInSm),ARETC_ORPOS LD A,(BC)INC BCLD (IX-12+CHP.PsInOr),ARETC_VIBRT LD A,(BC)INC BCLD (IX-12+CHP.OnOffD),ALD (IX-12+CHP.COnOff),ALD A,(BC)INC BCLD (IX-12+CHP.OffOnD),AXOR ALD (IX-12+CHP.TSlCnt),ALD (IX-12+CHP.CrTnSl),ALD (IX-12+CHP.CrTnSl+1),ARETC_ENGLS LD A,(BC)INC BCLD (Env_Del),ALD (CurEDel),ALD A,(BC)INC BCLD L,ALD A,(BC)INC BCLD H,ALD (ESldAdd),HLRETC_DELAY LD A,(BC)INC BCLD (Delay),ARETSETENV LD (IX-12+CHP.Env_En),ELD (AYREGS+EnvTp),ALD A,(BC)INC BCLD H,ALD A,(BC)INC BCLD L,ALD (EnvBase),HLXOR ALD (IX-12+CHP.PsInOr),ALD (CurEDel),ALD H,ALD L,ALD (CurESld),HLC_NOP RETSETORN ADD A,ALD E,ALD D,0LD (IX-12+CHP.PsInOr),DOrnPtrs = $+1LD HL,0x2121ADD HL,DELD E,(HL)INC HLLD D,(HL)MDADDR2 = $+1LD HL,0x2121ADD HL,DELD (IX-12+CHP.OrnPtr),LLD (IX-12+CHP.OrnPtr+1),HRET;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULESSPCCOMS DW C_NOPDW C_GLISSDW C_PORTMDW C_SMPOSDW C_ORPOSDW C_VIBRTDW C_NOPDW C_NOPDW C_ENGLSDW C_DELAYDW C_NOPDW C_NOPDW C_NOPDW C_NOPDW C_NOPDW C_NOPCHREGS XOR ALD (Ampl),ABIT 0,(IX+CHP.Flags)PUSH HLJP Z,CH_EXITLD (CSP_+1),SPLD L,(IX+CHP.OrnPtr)LD H,(IX+CHP.OrnPtr+1)LD SP,HLPOP DELD H,ALD A,(IX+CHP.PsInOr)LD L,AADD HL,SPINC ACP DJR C,CH_ORPSLD A,ECH_ORPS LD (IX+CHP.PsInOr),ALD A,(IX+CHP.Note)ADD A,(HL)JP P,CH_NTPXOR ACH_NTP CP 96JR C,CH_NOKLD A,95CH_NOK ADD A,AEX AF,AF'LD L,(IX+CHP.SamPtr)LD H,(IX+CHP.SamPtr+1)LD SP,HLPOP DELD H,0LD A,(IX+CHP.PsInSm)LD B,AADD A,AADD A,ALD L,AADD HL,SPLD SP,HLLD A,BINC ACP DJR C,CH_SMPSLD A,ECH_SMPS LD (IX+CHP.PsInSm),APOP BCPOP HLLD E,(IX+CHP.TnAcc)LD D,(IX+CHP.TnAcc+1)ADD HL,DEBIT 6,BJR Z,CH_NOACLD (IX+CHP.TnAcc),LLD (IX+CHP.TnAcc+1),HCH_NOAC EX DE,HLEX AF,AF'LD L,ALD H,0LD SP,NT_ADD HL,SPLD SP,HLPOP HLADD HL,DELD E,(IX+CHP.CrTnSl)LD D,(IX+CHP.CrTnSl+1)ADD HL,DECSP_ LD SP,0x3131EX (SP),HLXOR AOR (IX+CHP.TSlCnt)JR Z,CH_AMPDEC (IX+CHP.TSlCnt)JR NZ,CH_AMPLD A,(IX+CHP.TnSlDl)LD (IX+CHP.TSlCnt),ALD L,(IX+CHP.TSlStp)LD H,(IX+CHP.TSlStp+1)LD A,HADD HL,DELD (IX+CHP.CrTnSl),LLD (IX+CHP.CrTnSl+1),HBIT 2,(IX+CHP.Flags)JR NZ,CH_AMPLD E,(IX+CHP.TnDelt)LD D,(IX+CHP.TnDelt+1)AND AJR Z,CH_STPPEX DE,HLCH_STPP SBC HL,DEJP M,CH_AMPLD A,(IX+CHP.SlToNt)LD (IX+CHP.Note),AXOR ALD (IX+CHP.TSlCnt),ALD (IX+CHP.CrTnSl),ALD (IX+CHP.CrTnSl+1),ACH_AMP LD A,(IX+CHP.CrAmSl)BIT 7,CJR Z,CH_NOAMBIT 6,CJR Z,CH_AMINCP 15JR Z,CH_NOAMINC AJR CH_SVAMCH_AMIN CP -15JR Z,CH_NOAMDEC ACH_SVAM LD (IX+CHP.CrAmSl),ACH_NOAM LD L,ALD A,BAND 15ADD A,LJP P,CH_APOSXOR ACH_APOS CP 16JR C,CH_VOLLD A,15CH_VOL OR (IX+CHP.Volume)LD L,ALD H,0LD DE,VT_ADD HL,DELD A,(HL)CH_ENV BIT 0,CJR NZ,CH_NOENOR (IX+CHP.Env_En)CH_NOEN LD (Ampl),ABIT 7,BLD A,CJR Z,NO_ENSLRLARLASRA ASRA ASRA AADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOWBIT 5,BJR Z,NO_ENACLD (IX+CHP.CrEnSl),ANO_ENAC LD HL,AddToEnADD A,(HL) ;BUG IN PT3 - NEED WORD HERE.;FIX IT IN NEXT VERSION?LD (HL),AJR CH_MIXNO_ENSL RRAADD A,(IX+CHP.CrNsSl)LD (AddToNs),ABIT 5,BJR Z,CH_MIXLD (IX+CHP.CrNsSl),ACH_MIX LD A,BRRAAND 0x48CH_EXIT LD HL,AYREGS+MixerOR (HL)RRCALD (HL),APOP HLXOR AOR (IX+CHP.COnOff)RET ZDEC (IX+CHP.COnOff)RET NZXOR (IX+CHP.Flags)LD (IX+CHP.Flags),ARRALD A,(IX+CHP.OnOffD)JR C,CH_ONDLLD A,(IX+CHP.OffOnD)CH_ONDL LD (IX+CHP.COnOff),ARETPLAY XOR ALD (AddToEn),ALD (AYREGS+Mixer),ADEC ALD (AYREGS+EnvTp),ALD HL,DelyCntDEC (HL)JR NZ,PL2LD HL,ChanA+CHP.NtSkCnDEC (HL)JR NZ,PL1BAdInPtA = $+1LD BC,0x0101LD A,(BC)AND AJR NZ,PL1ALD D,ALD (Ns_Base),ALD HL,(CrPsPtr)INC HLLD A,(HL)INC AJR NZ,PLNLPCALL CHECKLPLPosPtr = $+1LD HL,0x2121LD A,(HL)INC APLNLP LD (CrPsPtr),HLDEC AADD A,ALD E,ARL DPatsPtr = $+1LD HL,0x2121ADD HL,DELD DE,(MODADDR)LD (PSP_+1),SPLD SP,HLPOP HLADD HL,DELD B,HLD C,LPOP HLADD HL,DELD (AdInPtB),HLPOP HLADD HL,DELD (AdInPtC),HLPSP_ LD SP,0x3131PL1A LD IX,ChanA+12CALL PTDECODLD (AdInPtA),BCPL1B LD HL,ChanB+CHP.NtSkCnDEC (HL)JR NZ,PL1CLD IX,ChanB+12AdInPtB = $+1LD BC,0x0101CALL PTDECODLD (AdInPtB),BCPL1C LD HL,ChanC+CHP.NtSkCnDEC (HL)JR NZ,PL1DLD IX,ChanC+12AdInPtC = $+1LD BC,0x0101CALL PTDECODLD (AdInPtC),BCDelay = $+1PL1D LD A,0x3ELD (DelyCnt),APL2 LD IX,ChanALD HL,(AYREGS+TonA)CALL CHREGSLD (AYREGS+TonA),HLLD A,(Ampl)LD (AYREGS+AmplA),ALD IX,ChanBLD HL,(AYREGS+TonB)CALL CHREGSLD (AYREGS+TonB),HLLD A,(Ampl)LD (AYREGS+AmplB),ALD IX,ChanCLD HL,(AYREGS+TonC)CALL CHREGS; LD A,(Ampl) ;Ampl = AYREGS+AmplC; LD (AYREGS+AmplC),ALD (AYREGS+TonC),HLLD HL,(Ns_Base_AddToNs)LD A,HADD A,LLD (AYREGS+Noise),AAddToEn = $+1LD A,0x3ELD E,AADD A,ASBC A,ALD D,ALD HL,(EnvBase)ADD HL,DELD DE,(CurESld)ADD HL,DELD (AYREGS+Env),HLXOR ALD HL,CurEDelOR (HL)JR Z,ROUT_A0DEC (HL)JR NZ,ROUTEnv_Del = $+1LD A,0x3ELD (HL),AESldAdd = $+1LD HL,0x2121ADD HL,DELD (CurESld),HLROUT XOR AROUT_A0 LD DE,0xFFBFLD BC,0xFFFDLD HL,AYREGSLOUT OUT (C),ALD B,E;OUTIDB 0xed,0xa3LD B,DINC ACP 13JR NZ,LOUTOUT (C),ALD A,(HL)AND ARET MLD B,EOUT (C),ARETNT_DATA DB (T_NEW_0-T1_)*2DB TCNEW_0-T_DB (T_OLD_0-T1_)*2+1DB TCOLD_0-T_DB (T_NEW_1-T1_)*2+1DB TCNEW_1-T_DB (T_OLD_1-T1_)*2+1DB TCOLD_1-T_DB (T_NEW_2-T1_)*2DB TCNEW_2-T_DB (T_OLD_2-T1_)*2DB TCOLD_2-T_DB (T_NEW_3-T1_)*2DB TCNEW_3-T_DB (T_OLD_3-T1_)*2DB TCOLD_3-T_T_TCOLD_0 DB 0x00+1,0x04+1,0x08+1,0x0A+1,0x0C+1,0x0E+1,0x12+1,0x14+1DB 0x18+1,0x24+1,0x3C+1,0TCOLD_1 DB 0x5C+1,0TCOLD_2 DB 0x30+1,0x36+1,0x4C+1,0x52+1,0x5E+1,0x70+1,0x82,0x8C,0x9CDB 0x9E,0xA0,0xA6,0xA8,0xAA,0xAC,0xAE,0xAE,0TCNEW_3 DB 0x56+1TCOLD_3 DB 0x1E+1,0x22+1,0x24+1,0x28+1,0x2C+1,0x2E+1,0x32+1,0xBE+1,0TCNEW_0 DB 0x1C+1,0x20+1,0x22+1,0x26+1,0x2A+1,0x2C+1,0x30+1,0x54+1DB 0xBC+1,0xBE+1,0TCNEW_1 = TCOLD_1TCNEW_2 DB 0x1A+1,0x20+1,0x24+1,0x28+1,0x2A+1,0x3A+1,0x4C+1,0x5E+1DB 0xBA+1,0xBC+1,0xBE+1,0EMPTYSAMORN = $-1DB 1,0,0x90 ;delete 0x90 if you don't need default sample;first 12 values of tone tables (packed)T_PACK DB 0x06EC*2/256,(0x06EC*2)&255DB 0x0755-0x06ECDB 0x07C5-0x0755DB 0x083B-0x07C5DB 0x08B8-0x083BDB 0x093D-0x08B8DB 0x09CA-0x093DDB 0x0A5F-0x09CADB 0x0AFC-0x0A5FDB 0x0BA4-0x0AFCDB 0x0C55-0x0BA4DB 0x0D10-0x0C55DB 0x066D*2/256,(0x066D*2)&255DB 0x06CF-0x066DDB 0x0737-0x06CFDB 0x07A4-0x0737DB 0x0819-0x07A4DB 0x0894-0x0819DB 0x0917-0x0894DB 0x09A1-0x0917DB 0x0A33-0x09A1DB 0x0ACF-0x0A33DB 0x0B73-0x0ACFDB 0x0C22-0x0B73DB 0x0CDA-0x0C22DB 0x0704*2/256,(0x0704*2)&255DB 0x076E-0x0704DB 0x07E0-0x076EDB 0x0858-0x07E0DB 0x08D6-0x0858DB 0x095C-0x08D6DB 0x09EC-0x095CDB 0x0A82-0x09ECDB 0x0B22-0x0A82DB 0x0BCC-0x0B22DB 0x0C80-0x0BCCDB 0x0D3E-0x0C80DB 0x07E0*2/256,(0x07E0*2)&255DB 0x0858-0x07E0DB 0x08E0-0x0858DB 0x0960-0x08E0DB 0x09F0-0x0960DB 0x0A88-0x09F0DB 0x0B28-0x0A88DB 0x0BD8-0x0B28DB 0x0C80-0x0BD8DB 0x0D60-0x0C80DB 0x0E10-0x0D60DB 0x0EF8-0x0E10;vars from here can be stripped;you can move VARS to any other addressVARS;ChannelsVars;STRUCT CHPCHP=0;reset groupCHP.PsInOr=CHPCHP=CHP+1; DB 0CHP.PsInSm=CHPCHP=CHP+1; DB 0CHP.CrAmSl=CHPCHP=CHP+1; DB 0CHP.CrNsSl=CHPCHP=CHP+1; DB 0CHP.CrEnSl=CHPCHP=CHP+1; DB 0CHP.TSlCnt=CHPCHP=CHP+1; DB 0CHP.CrTnSl=CHPCHP=CHP+2; DW 0CHP.TnAcc=CHPCHP=CHP+2; DW 0CHP.COnOff=CHPCHP=CHP+1; DB 0;reset groupCHP.OnOffD=CHPCHP=CHP+1; DB 0;IX for PTDECOD here (+12)CHP.OffOnD=CHPCHP=CHP+1; DB 0CHP.OrnPtr=CHPCHP=CHP+2; DW 0CHP.SamPtr=CHPCHP=CHP+2; DW 0CHP.NNtSkp=CHPCHP=CHP+1; DB 0CHP.Note=CHPCHP=CHP+1; DB 0CHP.SlToNt=CHPCHP=CHP+1; DB 0CHP.Env_En=CHPCHP=CHP+1; DB 0CHP.Flags=CHPCHP=CHP+1; DB 0;Enabled - 0,SimpleGliss - 2CHP.TnSlDl=CHPCHP=CHP+1; DB 0CHP.TSlStp=CHPCHP=CHP+2; DW 0CHP.TnDelt=CHPCHP=CHP+2; DW 0CHP.NtSkCn=CHPCHP=CHP+1; DB 0CHP.Volume=CHPCHP=CHP+1; DB 0;ENDSChanA DS CHPChanB DS CHPChanC DS CHP;GlobalVarsDelyCnt DB 0CurESld DW 0CurEDel DB 0Ns_Base_AddToNsNs_Base DB 0AddToNs DB 0AYREGSVT_ DS 256 ;CreatedVolumeTableAddressEnvBase = VT_+14T1_ = VT_+16 ;Tone tables data depacked hereT_OLD_1 = T1_T_OLD_2 = T_OLD_1+24T_OLD_3 = T_OLD_2+24T_OLD_0 = T_OLD_3+2T_NEW_0 = T_OLD_0T_NEW_1 = T_OLD_1T_NEW_2 = T_NEW_0+24T_NEW_3 = T_OLD_3NT_ DS 192 ;CreatedNoteTableAddress;local varAmpl = AYREGS+AmplCVAR0END = VT_+16 ;INIT zeroes from VARS to VAR0END-1VARSEND = $MDLADDR = $;Release 0 steps:;11.Sep.2004 - Note tables creator;12.Sep.2004 - Volume tables creator; INIT subroutine;13.Sep.2004 - Play counters, position counters;14.Sep.2004 - Patterns decoder subroutine;15.Sep.2004 - Resting (no code);16.Sep.2004 - CHREGS subroutine; global debugging; 1st stable;version was born;17.Sep.2004 - Debugging and optimization. First release!;Release 1 steps:;20.Sep.2004 - local vars moved to code (selfmodified code;smaller and faster);22.Sep.2004 - added mute sound entry at START+8; position;pointer moved to START+11; added setup and status byte at;START+10 noloop mode and loop passed flags added;Release 2 steps:;28.Sep.2004 - Optimization: code around CHREGS's volume and;vibrato faster now; zeroing PD_RES through stack; Ton and Ampl;moved from channel vars to global ones; first position selector;removed from INIT; optimization for packers(Ivan Roshin method);Release 3 steps:;2.Oct.2004 - optimization in INIT and PD_LOOP (thanks to Ivan;Roshin);4.Oct.2004 - load delay from (hl) in INIT (2 bytes shorter);5.Oct.2004 - optimization in PD_LOOP (->PD_LP2);7.Oct.2004 - swaping some commands for better packing;Release 4 steps:;9.Oct.2004 - optimization around LD HL,SPCCOMS (thanks to Ivan;Roshin); in PTDECOD swapped BC and DE to optimize C_PORTM;;removed sam and orn len and loop channel vars; CHREGS totally;optimized;Release 5 steps:;11.Oct.2004 - PD_OrSm and C_PORTM optimized; Ivan Roshin's;volume tables creator algorithm (51 bytes shorter than mine);12.Oct.2004 - Ivan Roshin's note tables creator algorithm (74;bytes shorter than mine);Release 6 steps:;14.Oct.2004 - loop and next position calculations moved to INIT;15.Oct.2004 - AdInPt moved to code;19.Oct.2004 - Env_Del moved to code;20.Oct.2004 - Version PUSH and POP (1 byte shorter, thanks to;Ivan Roshin);22.Oct.2004 - Env_En moved from Flags' bit to byte (shorter and;faster code);25.Oct.2004 - SETENV optimized;29.Oct.2004 - Optimized around AddToEn (SBC A,A, thanks to Ivan;Roshin);3.Nov.2004 - Note tables data was compressed; with depacker it;is 9 bytes shorter than uncompressed (thanks to Ivan Roshin);4.Nov.2004 - default sample and ornament both are fixed now;and placed into code block (6 bytes shorter);7.Nov.2004 - LD A,(Ns_Base):LD L,A changed to LD HL,(Ns_Base);(thanks to Dima Bystrov);9.Nov.2004 - Ns_Base and AddToNs are merged to Ns_Base_AddToNs;;LD A,255 changed to DEC A (at start of PLAY); added ROUT_A0;12.Nov.2004 - NtSkCn&Volume are merged (8 bytes smaller init);;LD BC,T1_ changed to PUSH DE...POP BC in note table creator;19.Dec.2004 - NT_DATA reorganized (6 bytes shorter, thanks to;Ivan Roshin); C_PORTM and C_GLISS are merged via SET_STP (48;tacts slower, but 8 bytes smaller, thanks to Ivan Roshin);Release 7 steps:;29.Apr.2007 - SjAsm adaptation; new 1.xx and 2.xx;interpretation for PT 3.7+.;Tests in IMMATION TESTER V1.0 by Andy Man/POS (thanks to;Himik's ZxZ for help):;Module name/author Min tacts Max tacts Average;Spleen/Nik-O 1720 9256 5500;Chuta/Miguel 1720 9496 5500;Zhara/Macros 4536 8744 5500;Size:;Code block 0x651 bytes;Variables 0x21D bytes (can be stripped);Size in RAM 0x651+0x21D=0x86E (2158) bytes;Notes:;Pro Tracker 3.4r can not be detected by header, so PT3.4r tone;tables really used only for modules of 3.3 and older versions.;endmodule