diff --git a/software/ugophy/render.asm b/software/ugophy/render.asm index cd97d44..511331b 100644 --- a/software/ugophy/render.asm +++ b/software/ugophy/render.asm @@ -87,7 +87,7 @@ pageScrollDn: pageScrollUp: ld a, (show_offset) and a - ret z + jp z, showLp ld hl, (show_offset) ld de, 20 @@ -96,9 +96,7 @@ pageScrollUp: ld a, 20 ld (cursor_pos), a - call renderScreen - call showCursor - jp showLp + jp backToPage selectItem: ld a, (cursor_pos) @@ -227,6 +225,8 @@ imgExt db ".scr", 0 imgExt2 db ".SCR", 0 pt3Ext db ".pt3", 0 pt3Ext2 db ".PT3", 0 +pt2Ext db ".pt2", 0 +pt2Ext2 db ".PT2", 0 checkFile: ;; Images @@ -240,6 +240,9 @@ checkFile: cp 1 jr z, loadImage ;; Music + xor a + ld (#4000 + 10), a + ld hl, pt3Ext call searchRing cp 1 @@ -248,6 +251,20 @@ checkFile: ld hl, pt3Ext2 call searchRing cp 1 + jr z, playMusic + + ld a, 2 + ld (#4000 + 10), a + + ld hl, pt2Ext2 + call searchRing + cp 1 + jr z, playMusic + + + ld hl, pt2Ext + call searchRing + cp 1 jr z, playMusic jp dfl @@ -557,7 +574,7 @@ show_offset db 0 display $ cursor_pos db 1 -head db " UGophy - ZX-UNO Gopher client v. 0.7 (c) Alexander Sharikhin", 13,0 +head db " UGophy - ZX-UNO Gopher client v. 0.7b (c) Alexander Sharikhin", 13,0 cleanLine db " ",0 playing db "Playing... Hold to stop!", 0 diff --git a/software/ugophy/vtpl.asm b/software/ugophy/vtpl.asm index 1fa70ed..1b1934c 100644 --- a/software/ugophy/vtpl.asm +++ b/software/ugophy/vtpl.asm @@ -1,1189 +1,1555 @@ - DEVICE ZXSPECTRUM48 -;Vortex Tracker II v1.0 PT3 player for ZX Spectrum -;(c)2004,2007 S.V.Bulba -;http://bulba.untergrund.net (http://bulba.at.kz) - -;Release number -Release EQU "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 #4000 - -;Test codes (commented) -; CALL START -; EI -;_LP HALT -; CALL START+5 -; XOR A -; IN A,(#FE) -; CPL -; AND 15 -; JR Z,_LP -; JR START+8 - -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 - -;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 MUTE -SETUP DB 0 ;set bit0 to 1, if you want to play without looping - ;bit7 is set each time, when loop point is passed -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+AmplA),A - LD (AYREGS+AmplB),HL - JP ROUT_A0 - -INIT -;HL - AddressOfModule - - LD (MODADDR),HL - LD (MDADDR2),HL - PUSH HL - LD DE,100 - ADD HL,DE - LD A,(HL) - LD (Delay),A - PUSH HL - POP IX - ADD HL,DE - LD (CrPsPtr),HL - LD E,(IX+102-100) - ADD HL,DE - INC HL - 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 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 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,H - LD (BC),A - DEC BC - LD A,L - LD (BC),A - DEC BC - SUB #F8*2 - 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,#F001 ;H - CHP.Volume, L - CHP.NtSkCn - LD (ChanA+CHP.NtSkCn),HL - LD (ChanB+CHP.NtSkCn),HL - LD (ChanC+CHP.NtSkCn),HL - - LD HL,EMPTYSAMORN - LD (AdInPtA),HL ;ptr to zero - LD (ChanA+CHP.OrnPtr),HL ;ornament 0 is "0,1,0" - LD (ChanB+CHP.OrnPtr),HL ;in all versions from - LD (ChanC+CHP.OrnPtr),HL ;3.xx to 3.6x and VTII - - LD (ChanA+CHP.SamPtr),HL ;S1 There is no default - LD (ChanB+CHP.SamPtr),HL ;S2 sample in PT3, so, you - LD (ChanC+CHP.SamPtr),HL ;S3 can comment S1,2,3; see - ;also EMPTYSAMORN comment - - LD A,(IX+13-100) ;EXTRACT VERSION NUMBER - SUB #30 - JR C,L20 - CP 10 - JR C,L21 -L20 LD A,6 -L21 LD (Version),A - PUSH AF - CP 4 - LD A,(IX+99-100) ;TONE TABLE NUMBER - RLA - AND 7 - -;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),A - EX DE,HL - POP BC ;BC=T1_ - ADD HL,BC - - LD A,(DE) - ADD A,T_ - 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 IXH,8 - -L2 SRL B - RR C -L3 DB #19 ;AND A or NOP - LD A,C - ADC A,D ;=ADC 0 - LD (HL),A - INC HL - LD A,B - ADC A,D - LD (HL),A - ADD HL,DE - 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 - JR NZ,CORR_1 - LD A,#FD - LD (NT_+#2E),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 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),A - - LD IX,VT_+16 - LD C,#10 - -INITV2 PUSH HL - - ADD HL,DE - EX DE,HL - SBC HL,HL - -INITV1 LD A,L -M2 DB #7D - LD A,H - ADC A,0 - LD (IX),A - INC IX - ADD HL,DE - INC C - LD A,C - AND 15 - JR NZ,INITV1 - - POP HL - LD A,E - CP #77 - JR NZ,M3 - INC E -M3 LD A,C - AND A - JR NZ,INITV2 - - JP ROUT_A0 - -;pattern decoder -PD_OrSm LD (IX-12+CHP.Env_En),0 - CALL SETORN - LD A,(BC) - INC BC - RRCA - -PD_SAM ADD A,A -PD_SAM_ LD E,A - LD D,0 -SamPtrs EQU $+1 - LD HL,#2121 - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) -MODADDR EQU $+1 - LD HL,#2121 - ADD HL,DE - LD (IX-12+CHP.SamPtr),L - LD (IX-12+CHP.SamPtr+1),H - JR PD_LOOP - -PD_VOL RLCA - RLCA - RLCA - RLCA - LD (IX-12+CHP.Volume),A - JR PD_LP2 - -PD_EOff LD (IX-12+CHP.Env_En),A - LD (IX-12+CHP.PsInOr),A - JR PD_LP2 - -PD_SorE DEC A - JR NZ,PD_ENV - LD A,(BC) - INC BC - LD (IX-12+CHP.NNtSkp),A - 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),A - LD (IX-12+CHP.PsInOr),A - CALL NZ,SETENV - LD A,(BC) - INC BC - JR PD_SAM_ - -PTDECOD LD A,(IX-12+CHP.Note) - LD (PrNote+1),A - 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+#FF20-#2000 - 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-12+CHP.Flags) - JR PD_RES - -PD_NOTE LD (IX-12+CHP.Note),A - 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),A - RET - -C_PORTM RES 2,(IX-12+CHP.Flags) - LD A,(BC) - INC BC -;SKIP PRECALCULATED TONE DELTA (BECAUSE -;CANNOT BE RIGHT AFTER PT3 COMPILATION) - INC BC - INC BC - LD (IX-12+CHP.TnSlDl),A - LD (IX-12+CHP.TSlCnt),A - LD DE,NT_ - LD A,(IX-12+CHP.Note) - LD (IX-12+CHP.SlToNt),A - 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),A - 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),L - LD (IX-12+CHP.TnDelt+1),H - LD E,(IX-12+CHP.CrTnSl) - LD D,(IX-12+CHP.CrTnSl+1) -Version EQU $+1 - LD A,#3E - CP 6 - JR C,OLDPRTM ;Old 3xxx for PT v3.5- -PrSlide LD DE,#1111 - LD (IX-12+CHP.CrTnSl),E - LD (IX-12+CHP.CrTnSl+1),D -OLDPRTM LD A,(BC) ;SIGNED TONE STEP - 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-12+CHP.TSlStp+1),A - EX AF,AF' - LD (IX-12+CHP.TSlStp),A - LD (IX-12+CHP.COnOff),0 - RET - -C_GLISS SET 2,(IX-12+CHP.Flags) - LD A,(BC) - INC BC - LD (IX-12+CHP.TnSlDl),A - AND A - JR NZ,GL36 - LD A,(Version) ;AlCo PT3.7+ - CP 7 - SBC A,A - INC A -GL36 LD (IX-12+CHP.TSlCnt),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-12+CHP.PsInSm),A - RET - -C_ORPOS LD A,(BC) - INC BC - LD (IX-12+CHP.PsInOr),A - RET - -C_VIBRT LD A,(BC) - INC BC - LD (IX-12+CHP.OnOffD),A - LD (IX-12+CHP.COnOff),A - LD A,(BC) - INC BC - LD (IX-12+CHP.OffOnD),A - XOR A - LD (IX-12+CHP.TSlCnt),A - LD (IX-12+CHP.CrTnSl),A - LD (IX-12+CHP.CrTnSl+1),A - RET - -C_ENGLS LD A,(BC) - INC BC - LD (Env_Del),A - LD (CurEDel),A - 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),A - RET - -SETENV LD (IX-12+CHP.Env_En),E - LD (AYREGS+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-12+CHP.PsInOr),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,0 - LD (IX-12+CHP.PsInOr),D -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),L - LD (IX-12+CHP.OrnPtr+1),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_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+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 - CP D - JR C,CH_ORPS - LD A,E -CH_ORPS LD (IX+CHP.PsInOr),A - 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,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 - 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+CHP.PsInSm),A - POP BC - POP HL - 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),L - LD (IX+CHP.TnAcc+1),H -CH_NOAC EX DE,HL - EX AF,AF' - LD L,A - LD H,0 - LD SP,NT_ - ADD HL,SP - 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),A - LD L,(IX+CHP.TSlStp) - LD H,(IX+CHP.TSlStp+1) - LD A,H - ADD HL,DE - LD (IX+CHP.CrTnSl),L - LD (IX+CHP.CrTnSl+1),H - 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),A - XOR A - LD (IX+CHP.TSlCnt),A - LD (IX+CHP.CrTnSl),A - LD (IX+CHP.CrTnSl+1),A -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),A -CH_NOAM LD L,A - 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) - LD L,A - LD H,0 - LD DE,VT_ - ADD HL,DE - LD A,(HL) -CH_ENV BIT 0,C - JR NZ,CH_NOEN - OR (IX+CHP.Env_En) -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+CHP.CrEnSl) ;SEE COMMENT BELOW - BIT 5,B - JR Z,NO_ENAC - LD (IX+CHP.CrEnSl),A -NO_ENAC LD HL,AddToEn - ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE. - ;FIX IT IN NEXT VERSION? - LD (HL),A - JR CH_MIX -NO_ENSL RRA - ADD A,(IX+CHP.CrNsSl) - LD (AddToNs),A - BIT 5,B - JR Z,CH_MIX - LD (IX+CHP.CrNsSl),A -CH_MIX LD A,B - RRA - AND #48 -CH_EXIT LD HL,AYREGS+Mixer - OR (HL) - RRCA - LD (HL),A - POP HL - XOR A - OR (IX+CHP.COnOff) - RET Z - DEC (IX+CHP.COnOff) - RET NZ - XOR (IX+CHP.Flags) - LD (IX+CHP.Flags),A - RRA - LD A,(IX+CHP.OnOffD) - JR C,CH_ONDL - LD A,(IX+CHP.OffOnD) -CH_ONDL LD (IX+CHP.COnOff),A - RET - -PLAY XOR A - LD (AddToEn),A - LD (AYREGS+Mixer),A - DEC A - LD (AYREGS+EnvTp),A - LD HL,DelyCnt - DEC (HL) - JR 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 - LD D,A - LD (Ns_Base),A - LD HL,(CrPsPtr) - INC HL - LD A,(HL) - INC A - JR NZ,PLNLP - CALL CHECKLP -LPosPtr EQU $+1 - LD HL,#2121 - LD A,(HL) - INC A -PLNLP LD (CrPsPtr),HL - DEC A - ADD A,A - LD E,A - RL D -PatsPtr EQU $+1 - LD HL,#2121 - ADD HL,DE - LD DE,(MODADDR) - 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),A - -PL2 LD IX,ChanA - LD HL,(AYREGS+TonA) - CALL CHREGS - LD (AYREGS+TonA),HL - LD A,(Ampl) - LD (AYREGS+AmplA),A - LD IX,ChanB - LD HL,(AYREGS+TonB) - CALL CHREGS - LD (AYREGS+TonB),HL - LD A,(Ampl) - LD (AYREGS+AmplB),A - LD IX,ChanC - LD HL,(AYREGS+TonC) - CALL CHREGS -; LD A,(Ampl) ;Ampl = AYREGS+AmplC -; LD (AYREGS+AmplC),A - LD (AYREGS+TonC),HL - - LD HL,(Ns_Base_AddToNs) - LD A,H - ADD A,L - LD (AYREGS+Noise),A - -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_A0 - DEC (HL) - JR NZ,ROUT -Env_Del EQU $+1 - LD A,#3E - LD (HL),A -ESldAdd EQU $+1 - LD HL,#2121 - ADD HL,DE - LD (CurESld),HL - -ROUT XOR A -ROUT_A0 LD DE,#FFBF - LD BC,#FFFD - LD HL,AYREGS -LOUT OUT (C),A - LD B,E - OUTI - LD B,D - INC A - CP 13 - 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 - -;vars from here can be stripped -;you can move VARS to any other address - -VARS - -;ChannelsVars - STRUCT CHP -;reset group -PsInOr DB 0 -PsInSm DB 0 -CrAmSl DB 0 -CrNsSl DB 0 -CrEnSl DB 0 -TSlCnt DB 0 -CrTnSl DW 0 -TnAcc DW 0 -COnOff DB 0 -;reset group - -OnOffD DB 0 - -;IX for PTDECOD here (+12) -OffOnD DB 0 -OrnPtr DW 0 -SamPtr DW 0 -NNtSkp DB 0 -Note DB 0 -SlToNt DB 0 -Env_En DB 0 -Flags DB 0 - ;Enabled - 0,SimpleGliss - 2 -TnSlDl DB 0 -TSlStp DW 0 -TnDelt DW 0 -NtSkCn DB 0 -Volume DB 0 - ENDS - -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 - -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: -;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 #651 bytes -;Variables #21D bytes (can be stripped) -;Size in RAM #651+#21D=#86E (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. - SAVEBIN "player.bin", START, $ - START \ No newline at end of file +;Universal PT2 and PT3 player for ZX Spectrum and MSX +;(c)2004-2007 S.V.Bulba +;http://bulba.untergrund.net (http://bulba.at.kz) + +;Release number +Release EQU "1" + DEVICE ZXSPECTRUM48 + +;Conditional assembly +;1) Version of ROUT (ZX or MSX standards) +ZX=1 +MSX=0 +;2) Current position counter at (START+11) +CurPosCounter=0 +;3) Allow channels allocation bits at (START+10) +ACBBAC=0 +;4) Allow loop checking and disabling +LoopChecker=0 +;5) Insert official identificator +Id=0 + +;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). +;-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 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 + + ORG #4000 + +;Test codes (commented) +; LD A,2 ;PT2,ABC,Looped +; LD (START+10),A +; CALL START +; EI +;_LP HALT +; CALL START+5 +; XOR A +; IN A,(#FE) +; CPL +; AND 15 +; JR Z,_LP +; JR START+8 + +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 + +;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) + +START + LD HL,MDLADDR + 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),A + 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),A + 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),A + 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,6 +L21 LD (Version),A + PUSH AF ;VolTable version + CP 4 + LD A,(IX+99-100) ;TONE TABLE NUMBER + RLA + AND 7 + PUSH AF ;NoteTable number + LD HL,(e_-SamCnv-2)*256+#18 + LD (SamCnv),HL + LD A,#BA + LD (OrnCP),A + LD (SamCP),A + LD A,#7B + LD (OrnLD),A + LD (SamLD),A + LD A,#87 + LD (SamClc2),A + LD BC,PT3PD + LD HL,0 + LD DE,PT3EMPTYORN + JR INITCOMMON + +INITPT2 LD A,(HL) + LD (Delay),A + 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),A + ENDIF + + ADD HL,DE + LD (LPosPtr),HL + POP HL + ADD HL,BC + LD (PatsPtr),HL + LD A,5 + LD (Version),A + PUSH AF + LD A,2 + PUSH AF + LD HL,#51CB + LD (SamCnv),HL + LD A,#BB + LD (OrnCP),A + LD (SamCP),A + LD A,#7A + LD (OrnLD),A + LD (SamLD),A + LD A,#80 + LD (SamClc2),A + 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,H + LD (BC),A + DEC BC + LD A,L + LD (BC),A + DEC BC + SUB #F8*2 + JR NZ,TP_0 + + IF LoopChecker + LD HL,SETUP + RES 7,(HL) + + IF CurPosCounter + INC HL + LD (HL),A + ENDIF + + ELSE + + IF CurPosCounter + LD (CurPos),A + ENDIF + + ENDIF + + LD HL,VARS + LD (HL),A + LD DE,VARS+1 + LD BC,VAR0END-VARS-1 + LDIR + LD (AdInPtA),HL ;ptr to zero + INC A + LD (DelyCnt),A + 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),A + EX DE,HL + POP BC ;BC=T1_ + ADD HL,BC + + LD A,(DE) + ADD A,T_ + 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 IXH,8 + +L2 SRL B + RR C +L3 DB #19 ;AND A or NOP + LD A,C + ADC A,D ;=ADC 0 + LD (HL),A + INC HL + LD A,B + ADC A,D + LD (HL),A + ADD HL,DE + 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 + JR NZ,CORR_1 + LD A,#FD + LD (NT_+#2E),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.. - 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),A + + 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,L +M2 DB #7D + LD A,H + ADC A,0 + LD (IX),A + 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),A + JR PD2_LOOP + +PD2_ENV LD (IX-12+CHP.Env_En),16 + LD (AYREGS+EnvTp),A + 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),A + JR PD2_LOOP + +PD2_VOL RRCA + RRCA + RRCA + RRCA + LD (IX-12+CHP.Volume),A + 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),A + LD (IX-12+CHP.TSlCnt),A + LD A,(BC) + INC BC + LD (IX-12+CHP.TSlStp),A + ADD A,A + SBC A,A + LD (IX-12+CHP.TSlStp+1),A + 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),A + 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),A + JR PD2_LOOP + +PD2_REL LD (IX-12+CHP.Flags),A + JR PD2_EXIT + +PD2_NOTE LD L,A + LD A,(IX-12+CHP.Note) + LD (PrNote+1),A + LD (IX-12+CHP.Note),L + XOR A + LD (IX-12+CHP.TSlCnt),A + SET 0,(IX-12+CHP.Flags) + EX AF,AF' + JR NC,NOGLIS2 + BIT 2,(IX-12+CHP.Flags) + JR NZ,NOPORT2 + LD (LoStep),A + 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),1 +NOGLIS2 XOR A + + +PD2_EXIT LD (IX-12+CHP.PsInSm),A + LD (IX-12+CHP.PsInOr),A + LD (IX-12+CHP.CrTnSl),A + LD (IX-12+CHP.CrTnSl+1),A + JP PD_FIN + +;PT3 pattern decoder +PD_OrSm LD (IX-12+CHP.Env_En),0 + 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),A + JR PD_LP2 + +PD_EOff LD (IX-12+CHP.Env_En),A + LD (IX-12+CHP.PsInOr),A + JR PD_LP2 + +PD_SorE DEC A + JR NZ,PD_ENV + LD A,(BC) + INC BC + LD (IX-12+CHP.NNtSkp),A + 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),A + LD (IX-12+CHP.PsInOr),A + CALL NZ,SETENV + JR PD_SAM_ + +PT3PD LD A,(IX-12+CHP.Note) + LD (PrNote+1),A + 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+#FF20-#2000 + 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-12+CHP.Flags) + JR PD_RES + +PD_NOTE LD (IX-12+CHP.Note),A + 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),A + 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),A + 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),A + LD (IX-12+CHP.TSlCnt),A + PUSH HL + LD DE,NT_ + LD A,(IX-12+CHP.Note) + LD (IX-12+CHP.SlToNt),A + 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),A + 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),L + LD (IX-12+CHP.TnDelt+1),H + POP DE +Version EQU $+1 + LD A,#3E + CP 6 + JR C,OLDPRTM ;Old 3xxx for PT v3.5- +PrSlide LD DE,#1111 + LD (IX-12+CHP.CrTnSl),E + LD (IX-12+CHP.CrTnSl+1),D +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),A + EX AF,AF' + LD (IX-12+CHP.TSlStp),A + LD (IX-12+CHP.COnOff),0 + RET + +C_GLISS SET 2,(IX-12+CHP.Flags) + LD A,(BC) + INC BC + LD (IX-12+CHP.TnSlDl),A + AND A + JR NZ,GL36 + LD A,(Version) ;AlCo PT3.7+ + CP 7 + SBC A,A + INC A +GL36 LD (IX-12+CHP.TSlCnt),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-12+CHP.PsInSm),A + RET + +C_ORPOS LD A,(BC) + INC BC + LD (IX-12+CHP.PsInOr),A + RET + +C_VIBRT LD A,(BC) + INC BC + LD (IX-12+CHP.OnOffD),A + LD (IX-12+CHP.COnOff),A + LD A,(BC) + INC BC + LD (IX-12+CHP.OffOnD),A + XOR A + LD (IX-12+CHP.TSlCnt),A + LD (IX-12+CHP.CrTnSl),A + LD (IX-12+CHP.CrTnSl+1),A + RET + +C_ENGLS LD A,(BC) + INC BC + LD (Env_Del),A + LD (CurEDel),A + 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),A + RET + +SETENV LD (IX-12+CHP.Env_En),E + LD (AYREGS+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-12+CHP.PsInOr),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,0 + LD (IX-12+CHP.PsInOr),D +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),L + LD (IX-12+CHP.OrnPtr+1),H + RET + +SETSAM ADD A,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),L + LD (IX-12+CHP.SamPtr+1),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_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+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),A + 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,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),A + 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),L + LD (IX+CHP.TnAcc+1),H +CH_NOAC EX DE,HL + EX AF,AF' + ADD A,NT_ + 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),A + LD L,(IX+CHP.TSlStp) + LD H,(IX+CHP.TSlStp+1) + LD A,H + ADD HL,DE + LD (IX+CHP.CrTnSl),L + LD (IX+CHP.CrTnSl+1),H + 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),A + XOR A + LD (IX+CHP.TSlCnt),A + LD (IX+CHP.CrTnSl),A + LD (IX+CHP.CrTnSl+1),A +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),A +CH_NOAM LD L,A + 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_ + LD L,A + ADC A,VT_/256 + SUB L + LD H,A + LD A,(HL) +CH_ENV BIT 0,C + JR NZ,CH_NOEN + OR (IX+CHP.Env_En) +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+CHP.CrEnSl) ;SEE COMMENT BELOW + BIT 5,B + JR Z,NO_ENAC + LD (IX+CHP.CrEnSl),A +NO_ENAC LD HL,AddToEn + ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE + LD (HL),A + JR CH_MIX +NO_ENSL RRA + ADD A,(IX+CHP.CrNsSl) + LD (AddToNs),A + BIT 5,B + JR Z,CH_MIX + LD (IX+CHP.CrNsSl),A +CH_MIX LD A,B + RRA + AND #48 +CH_EXIT LD HL,AYREGS+Mixer + OR (HL) + RRCA + LD (HL),A + POP HL + XOR A + OR (IX+CHP.COnOff) + RET Z + DEC (IX+CHP.COnOff) + RET NZ + XOR (IX+CHP.Flags) + LD (IX+CHP.Flags),A + RRA + LD A,(IX+CHP.OnOffD) + JR C,CH_ONDL + LD A,(IX+CHP.OffOnD) +CH_ONDL LD (IX+CHP.COnOff),A + RET + +PLAY XOR A + LD (AddToEn),A + LD (AYREGS+Mixer),A + DEC A + LD (AYREGS+EnvTp),A + 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 + LD D,A + LD (Ns_Base),A +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),A + 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),A + +PL2 LD IX,ChanA + LD HL,(AYREGS+TonA) + CALL CHREGS + LD (AYREGS+TonA),HL + LD A,(Ampl) + LD (AYREGS+AmplA),A + LD IX,ChanB + LD HL,(AYREGS+TonB) + CALL CHREGS + LD (AYREGS+TonB),HL + LD A,(Ampl) + LD (AYREGS+AmplB),A + 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),A + +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),A +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 + 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),C + LD (HL),A + INC HL + LD A,(IX+TonB+1) + LD C,(HL) + LD (IX+TonB+1),C + LD (HL),A + LD A,(DE) + INC DE + LD C,A + ADD HL,BC + LD A,(IX+AmplB) + LD C,(HL) + LD (IX+AmplB),C + LD (HL),A + LD A,(DE) + INC DE + LD (RxCA1),A + XOR 8 + LD (RxCA2),A + 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),A +ABC + ENDIF + + IF ZX + XOR A + LD DE,#FFBF + LD BC,#FFFD + LD HL,AYREGS +LOUT OUT (C),A + LD B,E + OUTI + LD B,D + INC A + CP 13 + JR NZ,LOUT + OUT (C),A + LD A,(HL) + AND A + RET M + LD B,E + OUT (C),A + RET + ENDIF + + IF MSX +;MSX version of ROUT (c)Dioniso + XOR A + LD C,#A0 + LD HL,AYREGS +LOUT OUT (C),A + INC C + OUTI + DEC C + INC A + CP 13 + JR NZ,LOUT + OUT (C),A + LD A,(HL) + AND A + RET M + INC C + OUT (C),A + 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,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 + +PT3EMPTYORN EQU $-1 + DB 1,0 + +;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 + +;vars from here can be stripped +;you can move VARS to any other address + +VARS + +;ChannelsVars + STRUCT CHP +;reset group +PsInOr DB 0 +PsInSm DB 0 +CrAmSl DB 0 +CrNsSl DB 0 +CrEnSl DB 0 +TSlCnt DB 0 +CrTnSl DW 0 +TnAcc DW 0 +COnOff DB 0 +;reset group + +OnOffD DB 0 + +;IX for PTDECOD here (+12) +OffOnD DB 0 +OrnPtr DW 0 +SamPtr DW 0 +NNtSkp DB 0 +Note DB 0 +SlToNt DB 0 +Env_En DB 0 +Flags DB 0 + ;Enabled - 0,SimpleGliss - 2 +TnSlDl DB 0 +TSlStp DW 0 +TnDelt DW 0 +NtSkCn DB 0 +Volume DB 0 + ENDS + +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 +;Release 1 steps: +;04/15/2005 +;Removed loop bit resetting for no loop build (5 bytes shorter) +;04/30/2007 +;New 1.xx and 2.xx interpretation for PT 3.7+. + +;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 #7B9 bytes +;Variables #21D bytes (can be stripped) +;Size in RAM #7B9+#21D=#9D6 (2518) 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. + SAVEBIN "player.bin", #4000, $ - #4000 \ No newline at end of file