Sergey Bulba
15 лет назад
Hello, All!
Все, все тесты успешно пройдены. Не зря провел тест со сравнением PSG нового
плеера PT3 и PSG плера Ay_Emul - нашел одну ошибку. Тестировалась на 15
модулях - соответствие с Ay_Emul теперь стопроцентное. Теперь если в Ay_Emul
есть ошибки, то они такие же, как и в этом плеере :)
1. 'S novim godom, kroshka' (MT) by Sergey Bulba, 24 May 2003
2. der Flaum.aY.aBc.aerial>cc4>@toy by key-jee.oч.feb>jun
3. Trust Me (TrustNoOne)[@toyXtrim] by no.one.ru 'o2 may, 2oo4
4. Das Verbaten La Fuego Ver Chuta! by Miguel from Dreadful Band of CPU
5. ...olia iz lukoil'a... compo mix by siril.4d.perm.ru. o6.o3.2oo1.bac
6. ay bac by macros
7. choleric's nervous system by n1k-o: fukn'crisis 23.o3.o3
8. 's p l e e n' .25-7-2oo2. nocopy by BY NIK-O FOR RGI/POS-WT
9. VAD/UDG:DaNG9eR 13.06.2000 <rMx> by Mm<M of Sage 01.Nov.XX twr 00:01
10.OpUs ... ;) h! mY fReNds & FaNs! by Mm<M of Sage 12.Sep.XX twr 00:13
11. Chicherina! by Macros,06.02.2001.Hello to Joker
12.nsh_full.pt3 by Macros
13. Some fast music for demo by Ivan Shmatov
14. BCE npoudeT by Ishma 31.08.98
15.Theme from "Impossible mission" by Mast/FtL 25.03.99
О фичах нового плеера повторяться не буду (писал вчера). Добавлю только, что
нашел программку IMMATION, которую посоветовал Илья Кудрявцев и померил скорость
(результаты в конце исходника). Скорость в пике как минимум в два раза меньше,
чем стандартный плеер (в доках к PT3.xx где-то есть данные по стандатному
плееру).
Просьба всем заинтересованным лицам принять участие в тестировании нового
плеера. Под таковыми я понимаю прежде всего Диму Быстрова и Илью Кудрявцева :)
Также советую авторам различных универсальных проигрывателей (типа BV, ZXAmp и
т.д.) обратить внимание на мой плеер PT3 - он правильно проиграет любой модуль
PT3, какой бы он версии не был и какие бы частотные таблички он не требовал).
По поводу возможных улучшений, которые я пока не сделал, так как требуется
мнение тех, кто реально будет использовать этот плеер. Есть предложение сделать
накопление огибающей в сэмпле не в байте, а в слове. Бонусы: в сэмпле
реализуется полный аналог спецкоманд 9xxx и Axxx. В трекерах (PT и VT) можно
будет потом подправить тоже. Обратная совместимость именно здесь, по-моему, не
нужна, так как это откровенный баг PT3. Еще одно предложение - можно сделать
так, чтобы подпрограмма PLAY возвращала в одном из регистров флаг, что модуль
зациклился. Или можно даже загружать в A=1 перед INIT, чтобы запретить
зацикливание. Надо ли это? Еще одно предложение - можно сделать небольшую
подпрограммку, которая подсчитыает продолжительность модуля. Это будет аналог
PLAY, но без проигрывания, который надо сделать максимально быстрым. В Ay_Emul
этот алгоритм работает практически мгновенно, а вот как будет на ZX - пока не
знаю.
Ну вот собственно и все. Жду писем (сюда, а также для надежности дублируйте в
мыло).
Да, исходник компилировать в
ZXASM, Z80 cross-platform assembler
(c) Copyright 1997-2002, Ilya G. Aniskovets (2:5020/***@fidonet.org)
иначе придется еще поработать ручками (использованы структуры и директивы в
стиле MASM).
Для не программистов: бинарники постараюсь до понедельника выложить на своем
сайте.
-------Файл VTII10b8.asm-------[Top]
;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
;(c)2004 S.V.Bulba <***@mail.khstu.ru> http://bulba.at.kz
;Release number
Release EQU '0'
;Features
;--------
;-Can be compiled at any address (i.e. no need rounding ORG address).
;-INIT subroutine detects module version and rightly generates both
; note and volume tables after end of code block.
;-Two portamento (spc. command 3xxx) algorithms (depending of module version).
;-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.
;Warning!!! PLAY subroutine can crash if no module are loaded into RAM or INIT
;subroutine was not called before.
;Call INIT one more time to mute sound after stopping playing
ORG #C000
;Test codes (commented)
; CALL START
; EI
;_LP HALT
; CALL START+5
; XOR A
; IN A,(#FE)
; CPL
; AND 15
; JR Z,_LP
START
LD HL,#D000
JR INIT
JP PLAY
;Identifier
DB '=VTII PT3 Player r.',Release,'='
INIT
;HL - AddressOfModule
DI ;SP IS USED, ANY INTERRUPTS ARE NOT EXPECTED
LD (SP_),SP
LD (MODADDR),HL
LD DE,100
ADD HL,DE
PUSH HL
POP IX
ADD HL,DE
INC HL
PUSH HL
XOR A
LD HL,VARS
LD DE,VARS+1
LD BC,VARSEND-VARS-1
LD (HL),A
LDIR
INC A
LD (DelyCnt),A
LD (ChanA+CHNPRM.NtSkCn),A
LD (ChanB+CHNPRM.NtSkCn),A
LD (ChanC+CHNPRM.NtSkCn),A
LD A,(IX+100-100)
LD (Delay),A
POP HL
LD (CrPsPtr),HL
LD A,(HL)
SLA A
LD C,A
LD A,B
ADC A,A
LD B,A
LD L,(IX+103-100)
LD H,(IX+104-100)
ADD HL,BC
LD DE,(MODADDR)
ADD HL,DE
LD SP,HL
POP HL
ADD HL,DE
LD (ChanA+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanB+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanC+CHNPRM.AdInPt),HL
LD HL,169
ADD HL,DE
LD (OrnPtrs),HL
LD L,(HL)
LD H,(IX+170-100)
ADD HL,DE
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.LOrnPs),A
LD (ChanB+CHNPRM.LOrnPs),A
LD (ChanC+CHNPRM.LOrnPs),A
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.OrnLen),A
LD (ChanB+CHNPRM.OrnLen),A
LD (ChanC+CHNPRM.OrnLen),A
LD (ChanA+CHNPRM.OrnPtr),HL
LD (ChanB+CHNPRM.OrnPtr),HL
LD (ChanC+CHNPRM.OrnPtr),HL
LD HL,105
ADD HL,DE
LD (SamPtrs),HL
LD L,(IX+107-100)
LD H,(IX+108-100)
ADD HL,DE
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.LSamPs),A
LD (ChanB+CHNPRM.LSamPs),A
LD (ChanC+CHNPRM.LSamPs),A
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.SamLen),A
LD (ChanB+CHNPRM.SamLen),A
LD (ChanC+CHNPRM.SamLen),A
LD (ChanA+CHNPRM.SamPtr),HL
LD (ChanB+CHNPRM.SamPtr),HL
LD (ChanC+CHNPRM.SamPtr),HL
LD A,15
LD (ChanA+CHNPRM.Volume),A
LD (ChanB+CHNPRM.Volume),A
LD (ChanC+CHNPRM.Volume),A
LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
LD B,(IX+99-100) ;TONE TABLE NUMBER
SUB #30
JP M,L20
CP 10
JR C,L21
L20 LD A,6
L21 LD (Version),A
LD XL,0
CP 4
JR C,L22
INC XL
L22 LD A,B
AND 3
LD XH,A
;NoteTableCreator
;XH - NoteTableNumber
;XL - VersionForNoteTable (0 - 3.xx..3.4r; 1 - 3.4x..3.6x..VTII1.0)
; LD A,XH
CP 2
JR C,L1
JR NZ,L2
ADD A,XL
JR L1
L2 XOR A
L1 ADD A,A
ADD A,A
LD E,A
ADD A,A
ADD A,E
ADD A,A
LD E,A
LD A,XH
LD BC,24
AND A
JR NZ,L3
INC E
INC E
LD C,22
L3
LD D,B
LD HL,T_
ADD HL,DE
LD DE,NT_
LDIR
AND A
JR NZ,L4
LD A,#6D
LD (DE),A
INC DE
LD A,6
LD (DE),A
INC DE
L4 LD HL,NT_
LD B,96-12
L5 INC HL
INC DE
LD A,(HL)
SRL A
LD (DE),A
DEC HL
DEC DE
LD A,(HL)
RRA
LD (DE),A
INC HL
INC HL
INC DE
INC DE
DJNZ L5
LD A,XH
BIT 0,A
JR NZ,L6
ADD A,XL
JR L7
L6 BIT 1,A
JR Z,L8
INC A
JR L7
L8 NEG
L7 AND A
JR NZ,L9
LD SP,NT_
LD B,96
L10 POP HL
DEC HL
PUSH HL
POP HL
DJNZ L10
LD SP,1*2+NT_
POP HL
INC HL
PUSH HL
LD SP,3*2+NT_
POP HL
INC HL
PUSH HL
L9 JP P,L11
LD SP,46*2+NT_
POP HL
DEC HL
PUSH HL
LD SP,23*2+NT_
POP HL
LD C,13
ADD HL,BC
PUSH HL
JR L16
L11 LD H,A
LD E,A
ADD A,A
LD D,A
ADD A,A
ADD A,A
ADD A,E
ADD A,D
LD C,A
LD A,H
EX AF,AF'
LD HL,TB_
ADD HL,BC
LD SP,8*2+NT_
LD C,11
L14 LD A,(HL)
INC HL
LD B,8
L13 POP DE
RRA
JR NC,L12
INC DE
PUSH DE
POP DE
L12 DJNZ L13
DEC C
JR NZ,L14
EX AF,AF'
CP 2
JR NZ,L15
LD SP,86*2+NT_
POP HL
INC HL
PUSH HL
LD SP,87*2+NT_
POP HL
INC HL
PUSH HL
JR L16
L15 LD A,XH
CP 3
JR NZ,L16
LD A,XL
AND A
JR Z,L16
LD SP,43*2+NT_
POP HL
DEC HL
PUSH HL
L16
LD SP,(SP_)
LD A,(Version)
;VolTableCreator
;A - VersionForVolumeTable (0..4 - 3.xx..3.4x; 5.. - 3.5x..3.6x..VTII1.0)
CP 5
LD IX,VOLD_
JR C,OLDVTAB
LD IX,VNEW_
OLDVTAB LD HL,VT_
LD DE,VT_+16
LD A,30
L19 LD C,8
EX AF,AF'
PUSH DE
LDIR
POP DE
EX DE,HL
LD A,(IX+0)
INC IX
LD B,8
L18 RRA
JR NC,L17
INC (HL)
L17 INC HL
DJNZ L18
EX DE,HL
EX AF,AF'
DEC A
JR NZ,L19
JP ROUT ;INTERRUPTS ARE DISABLED!!!
;pattern decoder
PD_OrSm RES 1,(IX+CHNPRM.Flags)
CALL SETORN
LD A,(DE)
INC DE
JR PD_SAM_
PD_SAM ADD A,A
PD_SAM_ LD C,A
LD B,0
LD HL,(SamPtrs)
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,(MODADDR)
ADD HL,BC
LD A,(HL)
INC HL
LD (IX+CHNPRM.LSamPs),A
LD A,(HL)
INC HL
LD (IX+CHNPRM.SamLen),A
LD (IX+CHNPRM.SamPtr),L
LD (IX+CHNPRM.SamPtr+1),H
JR PD_LOOP
PD_VOL LD (IX+CHNPRM.Volume),A
JR PD_LOOP
PD_EOff RES 1,(IX+CHNPRM.Flags)
LD (IX+CHNPRM.PsInOr),A
JR PD_LOOP
PD_SorE DEC A
JR NZ,PD_ENV
LD A,(DE)
INC DE
LD (IX+CHNPRM.NNtSkp),A
JR PD_LOOP
PD_ENV CALL SETENV
JR PD_LOOP
PD_ORN CALL SETORN
JR PD_LOOP
PD_NOIS LD (Ns_Base),A
JR PD_LOOP
PD_ESAM RES 1,(IX+CHNPRM.Flags)
CALL NZ,SETENV
LD (IX+CHNPRM.PsInOr),A
LD A,(DE)
INC DE
JR PD_SAM_
PTDECOD LD A,(IX+CHNPRM.Note)
LD (PrNote+1),A
LD L,(IX+CHNPRM.CrTnSl)
LD H,(IX+CHNPRM.CrTnSl+1)
LD (PrSlide+1),HL
LD E,(IX+CHNPRM.AdInPt)
LD D,(IX+CHNPRM.AdInPt+1)
PD_LOOP LD A,(DE)
INC DE
ADD A,16
JR C,PD_OrSm
ADD A,32
JR Z,PD_FIN
JR C,PD_SAM
ADD A,16
JR Z,PD_REL
JR C,PD_VOL
ADD A,16
JR Z,PD_EOff
JR C,PD_SorE
ADD A,96
JR C,PD_NOTE
ADD A,16
JR C,PD_ORN
ADD A,32
JR C,PD_NOIS
ADD A,16
JR C,PD_ESAM
ADD A,16
ADD A,A
LD C,A
LD B,0
LD HL,SPCCOMS
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
PUSH BC
JR PD_LOOP
PD_REL RES 0,(IX+CHNPRM.Flags)
PD_RES LD (IX+CHNPRM.PsInSm),A
LD (IX+CHNPRM.CrAmSl),A
LD (IX+CHNPRM.CrNsSl),A
LD (IX+CHNPRM.CrEnSl),A
LD (IX+CHNPRM.PsInOr),A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
LD (IX+CHNPRM.TnAcc),A
LD (IX+CHNPRM.TnAcc+1),A
LD (IX+CHNPRM.COnOff),A
PD_FIN LD A,(IX+CHNPRM.NNtSkp)
LD (IX+CHNPRM.NtSkCn),A
JR PD_FIN_
PD_NOTE LD (IX+CHNPRM.Note),A
SET 0,(IX+CHNPRM.Flags)
XOR A
JR PD_RES
C_PORTM LD A,(DE)
INC DE
LD (IX+CHNPRM.TnSlDl),A
LD (IX+CHNPRM.TSlCnt),A
;SKIP PRECALCULATED TONE DELTA (BECAUSE CANNOT BE RIGHT AFTER PT3 COMPILATION)
INC DE
INC DE
LD A,(DE) ;SIGNED TONE STEP
INC DE
LD C,A
LD A,(DE)
INC DE
AND A
LD A,C
JR Z,NOSIG
NEG ;ABSOLUTE VALUE OF TONE STEP
NOSIG EX AF,AF'
PrNote LD A,0
PUSH AF
ADD A,A
LD L,A
LD H,0
LD BC,NT_
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
PUSH HL
LD A,(IX+CHNPRM.Note)
LD (IX+CHNPRM.SlToNt),A
ADD A,A
LD L,A
LD H,0
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
POP BC
SBC HL,BC
LD (IX+CHNPRM.TnDelt),L
LD (IX+CHNPRM.TnDelt+1),H
POP AF
LD (IX+CHNPRM.Note),A
LD C,(IX+CHNPRM.CrTnSl)
LD B,(IX+CHNPRM.CrTnSl+1)
LD A,(Version)
CP 6
JR C,OLDPRTM ;Old 3xxx for PT v3.5-
PrSlide LD BC,0
LD (IX+CHNPRM.CrTnSl),C
LD (IX+CHNPRM.CrTnSl+1),B
OLDPRTM EX AF,AF'
AND A
SBC HL,BC
LD H,0
JP P,PRTPLUS
NEG
DEC H
PRTPLUS LD (IX+CHNPRM.TSlStp),A
LD (IX+CHNPRM.TSlStp+1),H
XOR A
LD (IX+CHNPRM.COnOff),A
RES 2,(IX+CHNPRM.Flags)
PD_FIN_ LD (IX+CHNPRM.AdInPt),E
LD (IX+CHNPRM.AdInPt+1),D
RET
C_GLISS LD A,(DE)
INC DE
LD (IX+CHNPRM.TnSlDl),A
LD (IX+CHNPRM.TSlCnt),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.TSlStp),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.TSlStp+1),A
XOR A
LD (IX+CHNPRM.COnOff),A
SET 2,(IX+CHNPRM.Flags)
JR PD_FIN_
C_SMPOS LD A,(DE)
INC DE
LD (IX+CHNPRM.PsInSm),A
JR PD_FIN_
C_ORPOS LD A,(DE)
INC DE
LD (IX+CHNPRM.PsInOr),A
JR PD_FIN_
C_VIBRT LD A,(DE)
INC DE
LD (IX+CHNPRM.OnOffD),A
LD (IX+CHNPRM.COnOff),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.OffOnD),A
XOR A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
JR PD_FIN_
C_ENGLS LD A,(DE)
INC DE
LD (Env_Del),A
LD (CurEDel),A
LD A,(DE)
INC DE
LD L,A
LD A,(DE)
INC DE
LD H,A
LD (ESldAdd),HL
JR PD_FIN_
C_DELAY LD A,(DE)
INC DE
LD (Delay),A
JR PD_FIN_
SETENV SET 1,(IX+CHNPRM.Flags)
LD (AYREGS+AR.EnvTp),A
LD A,(DE)
INC DE
LD (EnvBase+1),A
LD A,(DE)
INC DE
LD (EnvBase),A
XOR A
LD (IX+CHNPRM.PsInOr),A
LD (CurEDel),A
LD H,A
LD L,A
LD (CurESld),HL
C_NOP RET
SETORN ADD A,A ;THIS SUBPROGRAM _MUST_ RETURN ZERO IN A
LD C,A
LD B,0
LD HL,(OrnPtrs)
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,(MODADDR)
ADD HL,BC
LD A,(HL)
INC HL
LD (IX+CHNPRM.LOrnPs),A
LD A,(HL)
INC HL
LD (IX+CHNPRM.OrnLen),A
LD (IX+CHNPRM.OrnPtr),L
LD (IX+CHNPRM.OrnPtr+1),H
XOR A
LD (IX+CHNPRM.PsInOr),A
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 LD D,0
LD (IX+CHNPRM.Ampl),D
BIT 0,(IX+CHNPRM.Flags)
JP Z,CH_EXIT
LD A,(IX+CHNPRM.PsInSm)
ADD A,A
ADD A,A
LD E,A
LD L,(IX+CHNPRM.SamPtr)
LD H,(IX+CHNPRM.SamPtr+1)
ADD HL,DE
LD (SP_),SP
LD SP,HL
POP BC
POP HL
LD SP,(SP_)
LD E,(IX+CHNPRM.TnAcc)
LD D,(IX+CHNPRM.TnAcc+1)
ADD HL,DE
BIT 6,B
JR Z,CH_NOAC
LD (IX+CHNPRM.TnAcc),L
LD (IX+CHNPRM.TnAcc+1),H
CH_NOAC LD (_SAMTON+1),HL
LD E,(IX+CHNPRM.PsInOr)
LD D,0
LD L,(IX+CHNPRM.OrnPtr)
LD H,(IX+CHNPRM.OrnPtr+1)
ADD HL,DE
LD A,(IX+CHNPRM.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
LD E,A
LD HL,NT_
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
_SAMTON LD HL,0
ADD HL,DE
LD E,(IX+CHNPRM.CrTnSl)
LD D,(IX+CHNPRM.CrTnSl+1)
ADD HL,DE
LD (IX+CHNPRM.Ton),L
LD (IX+CHNPRM.Ton+1),H
XOR A
OR (IX+CHNPRM.TSlCnt)
JR Z,CH_AMP
DEC (IX+CHNPRM.TSlCnt)
JR NZ,CH_AMP
LD A,(IX+CHNPRM.TnSlDl)
LD (IX+CHNPRM.TSlCnt),A
LD L,(IX+CHNPRM.TSlStp)
LD H,(IX+CHNPRM.TSlStp+1)
LD A,H
ADD HL,DE
LD (IX+CHNPRM.CrTnSl),L
LD (IX+CHNPRM.CrTnSl+1),H
BIT 2,(IX+CHNPRM.Flags)
JR NZ,CH_AMP
LD E,(IX+CHNPRM.TnDelt)
LD D,(IX+CHNPRM.TnDelt+1)
AND A
JP P,CH_STPP
EX DE,HL
CH_STPP SBC HL,DE
JP M,CH_AMP
LD A,(IX+CHNPRM.SlToNt)
LD (IX+CHNPRM.Note),A
XOR A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
CH_AMP LD A,(IX+CHNPRM.CrAmSl)
BIT 7,C
JR Z,CH_NOAM
BIT 6,C
JR Z,CH_AMIN
CP 15
JR C,CH_AINC
AND A
JP P,CH_NOAM
CH_AINC INC A
JR CH_NOAM
CH_AMIN CP -14
JR NC,CH_ADEC
AND A
JP M,CH_NOAM
CH_ADEC DEC A
CH_NOAM LD (IX+CHNPRM.CrAmSl),A
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 LD L,A
LD A,(IX+CHNPRM.Volume)
SLA A
SLA A
SLA A
SLA A
OR L
LD L,A
LD H,0
LD DE,VT_
ADD HL,DE
LD A,(HL)
CH_ENV BIT 0,C
JR NZ,CH_NOEN
BIT 1,(IX+CHNPRM.Flags)
JR Z,CH_NOEN
OR 16
CH_NOEN LD (IX+CHNPRM.Ampl),A
BIT 7,B
LD A,C
JR Z,NO_ENSL
RLA
RLA
SRA A
SRA A
SRA A
ADD A,(IX+CHNPRM.CrEnSl) ;SEE COMMENT BELOW
BIT 5,B
JR Z,NO_ENAC
LD (IX+CHNPRM.CrEnSl),A
NO_ENAC LD HL,AddToEnv
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+CHNPRM.CrNsSl)
LD (AddToNs),A
BIT 5,B
JR Z,CH_MIX
LD (IX+CHNPRM.CrNsSl),A
CH_MIX LD A,B
RRA
AND #48
LD HL,AYREGS+AR.Mixer
OR (HL)
LD (HL),A
INC (IX+CHNPRM.PsInSm)
LD A,(IX+CHNPRM.PsInSm)
CP (IX+CHNPRM.SamLen)
JR C,CH_ORNC
LD A,(IX+CHNPRM.LSamPs)
LD (IX+CHNPRM.PsInSm),A
CH_ORNC INC (IX+CHNPRM.PsInOr)
LD A,(IX+CHNPRM.PsInOr)
CP (IX+CHNPRM.OrnLen)
JR C,CH_EXIT
LD A,(IX+CHNPRM.LOrnPs)
LD (IX+CHNPRM.PsInOr),A
CH_EXIT LD HL,AYREGS+AR.Mixer
SRL (HL)
XOR A
OR (IX+CHNPRM.COnOff)
RET Z
DEC (IX+CHNPRM.COnOff)
RET NZ
LD A,(IX+CHNPRM.Flags)
XOR 1
LD (IX+CHNPRM.Flags),A
AND 1
LD A,(IX+CHNPRM.OnOffD)
JR NZ,CH_ONDL
LD A,(IX+CHNPRM.OffOnD)
CH_ONDL LD (IX+CHNPRM.COnOff),A
RET
PLAY
LD A,255
LD (AYREGS+AR.EnvTp),A
LD HL,DelyCnt
DEC (HL)
JR NZ,PL2
LD HL,ChanA+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1B
LD HL,(ChanA+CHNPRM.AdInPt)
AND (HL)
JR NZ,PL1A
LD D,A
LD (Ns_Base),A
LD IX,(MODADDR)
LD HL,(CrPsPtr)
INC HL
LD A,(HL)
INC A
JR NZ,PLNLP
LD E,(IX+102)
LD HL,(MODADDR)
ADD HL,DE
LD E,201
ADD HL,DE
LD A,(HL)
INC A
PLNLP LD (CrPsPtr),HL
DEC A
RLA
LD E,A
RL D
LD L,(IX+103)
LD H,(IX+104)
ADD HL,DE
LD DE,(MODADDR)
ADD HL,DE
LD (SP_),SP
LD SP,HL
POP HL
ADD HL,DE
LD (ChanA+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanB+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanC+CHNPRM.AdInPt),HL
LD SP,(SP_)
PL1A LD IX,ChanA
CALL PTDECOD
PL1B LD HL,ChanB+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1C
LD IX,ChanB
CALL PTDECOD
PL1C LD HL,ChanC+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1D
LD IX,ChanC
CALL PTDECOD
PL1D LD A,(Delay)
LD (DelyCnt),A
PL2 XOR A
LD (AddToEnv),A
LD (AYREGS+AR.Mixer),A
LD IX,ChanA
CALL CHREGS
LD IX,ChanB
CALL CHREGS
LD IX,ChanC
CALL CHREGS
LD HL,(ChanA+CHNPRM.Ton)
LD (AYREGS+AR.TonA),HL
LD HL,(ChanB+CHNPRM.Ton)
LD (AYREGS+AR.TonB),HL
LD HL,(ChanC+CHNPRM.Ton)
LD (AYREGS+AR.TonC),HL
LD A,(ChanA+CHNPRM.Ampl)
LD (AYREGS+AR.AmplA),A
LD A,(ChanB+CHNPRM.Ampl)
LD (AYREGS+AR.AmplB),A
LD A,(ChanC+CHNPRM.Ampl)
LD (AYREGS+AR.AmplC),A
LD A,(Ns_Base)
LD L,A
LD A,(AddToNs)
ADD A,L
LD (AYREGS+AR.Noise),A
LD A,(AddToEnv)
LD E,A
ADD A,A
LD A,0
RLA
NEG
LD D,A
LD HL,(EnvBase)
ADD HL,DE
LD DE,(CurESld)
ADD HL,DE
LD (AYREGS+AR.Env),HL
XOR A
LD HL,CurEDel
OR (HL)
JR Z,PLEND
DEC (HL)
JR NZ,PLEND
LD A,(Env_Del)
LD (HL),A
LD HL,(ESldAdd)
ADD HL,DE
LD (CurESld),HL
PLEND
ROUT LD DE,#FFBF
LD BC,#FFFD
LD HL,AYREGS
XOR A
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
;First 12 values of tone tables
T_ DW #0CDA,#0C22,#0B73,#0ACF,#0A33,#09A1,#0917,#0894,#0819,#07A4,#0737,#06CF
;0_both_3_both
DW #0EF8,#0E10,#0D60,#0C80,#0BD8,#0B28,#0A88,#09F0,#0960,#08E0,#0858,#07E0 ;1
DW #0D3E,#0C80,#0BCC,#0B22,#0A82,#09EC,#095C,#08D6,#0858,#07E0,#076E,#0704
;2_old
DW #0D10,#0C55,#0BA4,#0AFC,#0A5F,#09CA,#093D,#08B8,#083B,#07C5,#0755,#06EC
;2_new
;Correction bits for tone tables
TB_ DB 233,251,191,255,255,255,255,255,255,255,255 ;0_old
DB 160,128,46,70,242,132,172,46,27,107,0 ;0_new
DB 0,0,144,20,76,101,20,94,233,255,126 ;2_old
DB 0,64,16,161,101,248,185,93,204,169,3 ;2_new
DB 64,1,93,140,236,9,89,93,54,214,0 ;3_both
;Compressed new volume table
VNEW_ DB 0,255,240,240,8,239,196,220,32,251,144,246,64,253,
DB 170,170,64,253,144,246,32,251,196,220,8,239,240,240,0,255
;Compressed old volume table
VOLD_ DB 0,255,192,248,48,247,128,236,72,219,160,244,84,255,
DB 0,170,160,245,72,218,144,253,32,230,192,249,0,254,254,255
;vars from here can be stripped
SP_ DW 0 ;OLD STACK POINTER
MODADDR DW 0
VARS
;TEMPVARS
AddToEnv DB 0
;GlobalVars
Version DB 0
EnvBase DW 0
CurESld DW 0
ESldAdd DW 0
CurEDel DB 0
Env_Del DB 0
Ns_Base DB 0
Delay DB 0
AddToNs DB 0
DelyCnt DB 0
CrPsPtr DW 0
SamPtrs DW 0
OrnPtrs DW 0
;ChannelsVars
struc CHNPRM
.AdInPt RESW 1
.OrnPtr RESW 1
.SamPtr RESW 1
.Ton RESW 1
.LOrnPs RESB 1
.OrnLen RESB 1
.PsInOr RESB 1
.LSamPs RESB 1
.SamLen RESB 1
.PsInSm RESB 1
.Volume RESB 1
.NNtSkp RESB 1
.Note RESB 1
.SlToNt RESB 1
.Ampl RESB 1
.Flags RESB 1 ;Envelope_Enabled - 1,Enabled - 0,SimpleGliss - 2
.CrAmSl RESB 1
.CrNsSl RESB 1
.CrEnSl RESB 1
.TSlCnt RESB 1
.COnOff RESB 1
.OnOffD RESB 1
.OffOnD RESB 1
.TnSlDl RESB 1
.CrTnSl RESW 1
.TnAcc RESW 1
.TSlStp RESW 1
.TnDelt RESW 1
.NtSkCn RESB 1
.Size RESB 1
endstruc
ChanA RESB CHNPRM.Size
ChanB RESB CHNPRM.Size
ChanC RESB CHNPRM.Size
struc AR
.TonA RESW 1
.TonB RESW 1
.TonC RESW 1
.Noise RESB 1
.Mixer RESB 1
.AmplA RESB 1
.AmplB RESB 1
.AmplC RESB 1
.Env RESW 1
.EnvTp RESB 1
endstruc
NT_ RESB 192 ;CreatedNoteTableAddress
AYREGS
VT_ RESB 256 ;CreatedVolumeTableAddress
VARSEND 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.2005 - Debugging and optimization. First release!
;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 1736 11016 5500
;Chuta/Miguel 1736 11304 5500
;Zhara/Macros 5176 10392 5500
;Size:
;Code block #791 bytes
;Variables #247 bytes (can be stripped)
;Size in RAM #791+#247=#9D8 (2520) bytes
;Not so bad for the most universal PT3 player, I think ;)
;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.
-------Файл VTII10b8.asm-------[Bottom]
WBR, Sergey Bulba. E-mail: ***@mail.khstu.ru http://bulba.at.kz/
... Ay_Emul: Silent now...
Все, все тесты успешно пройдены. Не зря провел тест со сравнением PSG нового
плеера PT3 и PSG плера Ay_Emul - нашел одну ошибку. Тестировалась на 15
модулях - соответствие с Ay_Emul теперь стопроцентное. Теперь если в Ay_Emul
есть ошибки, то они такие же, как и в этом плеере :)
1. 'S novim godom, kroshka' (MT) by Sergey Bulba, 24 May 2003
2. der Flaum.aY.aBc.aerial>cc4>@toy by key-jee.oч.feb>jun
3. Trust Me (TrustNoOne)[@toyXtrim] by no.one.ru 'o2 may, 2oo4
4. Das Verbaten La Fuego Ver Chuta! by Miguel from Dreadful Band of CPU
5. ...olia iz lukoil'a... compo mix by siril.4d.perm.ru. o6.o3.2oo1.bac
6. ay bac by macros
7. choleric's nervous system by n1k-o: fukn'crisis 23.o3.o3
8. 's p l e e n' .25-7-2oo2. nocopy by BY NIK-O FOR RGI/POS-WT
9. VAD/UDG:DaNG9eR 13.06.2000 <rMx> by Mm<M of Sage 01.Nov.XX twr 00:01
10.OpUs ... ;) h! mY fReNds & FaNs! by Mm<M of Sage 12.Sep.XX twr 00:13
11. Chicherina! by Macros,06.02.2001.Hello to Joker
12.nsh_full.pt3 by Macros
13. Some fast music for demo by Ivan Shmatov
14. BCE npoudeT by Ishma 31.08.98
15.Theme from "Impossible mission" by Mast/FtL 25.03.99
О фичах нового плеера повторяться не буду (писал вчера). Добавлю только, что
нашел программку IMMATION, которую посоветовал Илья Кудрявцев и померил скорость
(результаты в конце исходника). Скорость в пике как минимум в два раза меньше,
чем стандартный плеер (в доках к PT3.xx где-то есть данные по стандатному
плееру).
Просьба всем заинтересованным лицам принять участие в тестировании нового
плеера. Под таковыми я понимаю прежде всего Диму Быстрова и Илью Кудрявцева :)
Также советую авторам различных универсальных проигрывателей (типа BV, ZXAmp и
т.д.) обратить внимание на мой плеер PT3 - он правильно проиграет любой модуль
PT3, какой бы он версии не был и какие бы частотные таблички он не требовал).
По поводу возможных улучшений, которые я пока не сделал, так как требуется
мнение тех, кто реально будет использовать этот плеер. Есть предложение сделать
накопление огибающей в сэмпле не в байте, а в слове. Бонусы: в сэмпле
реализуется полный аналог спецкоманд 9xxx и Axxx. В трекерах (PT и VT) можно
будет потом подправить тоже. Обратная совместимость именно здесь, по-моему, не
нужна, так как это откровенный баг PT3. Еще одно предложение - можно сделать
так, чтобы подпрограмма PLAY возвращала в одном из регистров флаг, что модуль
зациклился. Или можно даже загружать в A=1 перед INIT, чтобы запретить
зацикливание. Надо ли это? Еще одно предложение - можно сделать небольшую
подпрограммку, которая подсчитыает продолжительность модуля. Это будет аналог
PLAY, но без проигрывания, который надо сделать максимально быстрым. В Ay_Emul
этот алгоритм работает практически мгновенно, а вот как будет на ZX - пока не
знаю.
Ну вот собственно и все. Жду писем (сюда, а также для надежности дублируйте в
мыло).
Да, исходник компилировать в
ZXASM, Z80 cross-platform assembler
(c) Copyright 1997-2002, Ilya G. Aniskovets (2:5020/***@fidonet.org)
иначе придется еще поработать ручками (использованы структуры и директивы в
стиле MASM).
Для не программистов: бинарники постараюсь до понедельника выложить на своем
сайте.
-------Файл VTII10b8.asm-------[Top]
;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
;(c)2004 S.V.Bulba <***@mail.khstu.ru> http://bulba.at.kz
;Release number
Release EQU '0'
;Features
;--------
;-Can be compiled at any address (i.e. no need rounding ORG address).
;-INIT subroutine detects module version and rightly generates both
; note and volume tables after end of code block.
;-Two portamento (spc. command 3xxx) algorithms (depending of module version).
;-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.
;Warning!!! PLAY subroutine can crash if no module are loaded into RAM or INIT
;subroutine was not called before.
;Call INIT one more time to mute sound after stopping playing
ORG #C000
;Test codes (commented)
; CALL START
; EI
;_LP HALT
; CALL START+5
; XOR A
; IN A,(#FE)
; CPL
; AND 15
; JR Z,_LP
START
LD HL,#D000
JR INIT
JP PLAY
;Identifier
DB '=VTII PT3 Player r.',Release,'='
INIT
;HL - AddressOfModule
DI ;SP IS USED, ANY INTERRUPTS ARE NOT EXPECTED
LD (SP_),SP
LD (MODADDR),HL
LD DE,100
ADD HL,DE
PUSH HL
POP IX
ADD HL,DE
INC HL
PUSH HL
XOR A
LD HL,VARS
LD DE,VARS+1
LD BC,VARSEND-VARS-1
LD (HL),A
LDIR
INC A
LD (DelyCnt),A
LD (ChanA+CHNPRM.NtSkCn),A
LD (ChanB+CHNPRM.NtSkCn),A
LD (ChanC+CHNPRM.NtSkCn),A
LD A,(IX+100-100)
LD (Delay),A
POP HL
LD (CrPsPtr),HL
LD A,(HL)
SLA A
LD C,A
LD A,B
ADC A,A
LD B,A
LD L,(IX+103-100)
LD H,(IX+104-100)
ADD HL,BC
LD DE,(MODADDR)
ADD HL,DE
LD SP,HL
POP HL
ADD HL,DE
LD (ChanA+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanB+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanC+CHNPRM.AdInPt),HL
LD HL,169
ADD HL,DE
LD (OrnPtrs),HL
LD L,(HL)
LD H,(IX+170-100)
ADD HL,DE
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.LOrnPs),A
LD (ChanB+CHNPRM.LOrnPs),A
LD (ChanC+CHNPRM.LOrnPs),A
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.OrnLen),A
LD (ChanB+CHNPRM.OrnLen),A
LD (ChanC+CHNPRM.OrnLen),A
LD (ChanA+CHNPRM.OrnPtr),HL
LD (ChanB+CHNPRM.OrnPtr),HL
LD (ChanC+CHNPRM.OrnPtr),HL
LD HL,105
ADD HL,DE
LD (SamPtrs),HL
LD L,(IX+107-100)
LD H,(IX+108-100)
ADD HL,DE
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.LSamPs),A
LD (ChanB+CHNPRM.LSamPs),A
LD (ChanC+CHNPRM.LSamPs),A
LD A,(HL)
INC HL
LD (ChanA+CHNPRM.SamLen),A
LD (ChanB+CHNPRM.SamLen),A
LD (ChanC+CHNPRM.SamLen),A
LD (ChanA+CHNPRM.SamPtr),HL
LD (ChanB+CHNPRM.SamPtr),HL
LD (ChanC+CHNPRM.SamPtr),HL
LD A,15
LD (ChanA+CHNPRM.Volume),A
LD (ChanB+CHNPRM.Volume),A
LD (ChanC+CHNPRM.Volume),A
LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
LD B,(IX+99-100) ;TONE TABLE NUMBER
SUB #30
JP M,L20
CP 10
JR C,L21
L20 LD A,6
L21 LD (Version),A
LD XL,0
CP 4
JR C,L22
INC XL
L22 LD A,B
AND 3
LD XH,A
;NoteTableCreator
;XH - NoteTableNumber
;XL - VersionForNoteTable (0 - 3.xx..3.4r; 1 - 3.4x..3.6x..VTII1.0)
; LD A,XH
CP 2
JR C,L1
JR NZ,L2
ADD A,XL
JR L1
L2 XOR A
L1 ADD A,A
ADD A,A
LD E,A
ADD A,A
ADD A,E
ADD A,A
LD E,A
LD A,XH
LD BC,24
AND A
JR NZ,L3
INC E
INC E
LD C,22
L3
LD D,B
LD HL,T_
ADD HL,DE
LD DE,NT_
LDIR
AND A
JR NZ,L4
LD A,#6D
LD (DE),A
INC DE
LD A,6
LD (DE),A
INC DE
L4 LD HL,NT_
LD B,96-12
L5 INC HL
INC DE
LD A,(HL)
SRL A
LD (DE),A
DEC HL
DEC DE
LD A,(HL)
RRA
LD (DE),A
INC HL
INC HL
INC DE
INC DE
DJNZ L5
LD A,XH
BIT 0,A
JR NZ,L6
ADD A,XL
JR L7
L6 BIT 1,A
JR Z,L8
INC A
JR L7
L8 NEG
L7 AND A
JR NZ,L9
LD SP,NT_
LD B,96
L10 POP HL
DEC HL
PUSH HL
POP HL
DJNZ L10
LD SP,1*2+NT_
POP HL
INC HL
PUSH HL
LD SP,3*2+NT_
POP HL
INC HL
PUSH HL
L9 JP P,L11
LD SP,46*2+NT_
POP HL
DEC HL
PUSH HL
LD SP,23*2+NT_
POP HL
LD C,13
ADD HL,BC
PUSH HL
JR L16
L11 LD H,A
LD E,A
ADD A,A
LD D,A
ADD A,A
ADD A,A
ADD A,E
ADD A,D
LD C,A
LD A,H
EX AF,AF'
LD HL,TB_
ADD HL,BC
LD SP,8*2+NT_
LD C,11
L14 LD A,(HL)
INC HL
LD B,8
L13 POP DE
RRA
JR NC,L12
INC DE
PUSH DE
POP DE
L12 DJNZ L13
DEC C
JR NZ,L14
EX AF,AF'
CP 2
JR NZ,L15
LD SP,86*2+NT_
POP HL
INC HL
PUSH HL
LD SP,87*2+NT_
POP HL
INC HL
PUSH HL
JR L16
L15 LD A,XH
CP 3
JR NZ,L16
LD A,XL
AND A
JR Z,L16
LD SP,43*2+NT_
POP HL
DEC HL
PUSH HL
L16
LD SP,(SP_)
LD A,(Version)
;VolTableCreator
;A - VersionForVolumeTable (0..4 - 3.xx..3.4x; 5.. - 3.5x..3.6x..VTII1.0)
CP 5
LD IX,VOLD_
JR C,OLDVTAB
LD IX,VNEW_
OLDVTAB LD HL,VT_
LD DE,VT_+16
LD A,30
L19 LD C,8
EX AF,AF'
PUSH DE
LDIR
POP DE
EX DE,HL
LD A,(IX+0)
INC IX
LD B,8
L18 RRA
JR NC,L17
INC (HL)
L17 INC HL
DJNZ L18
EX DE,HL
EX AF,AF'
DEC A
JR NZ,L19
JP ROUT ;INTERRUPTS ARE DISABLED!!!
;pattern decoder
PD_OrSm RES 1,(IX+CHNPRM.Flags)
CALL SETORN
LD A,(DE)
INC DE
JR PD_SAM_
PD_SAM ADD A,A
PD_SAM_ LD C,A
LD B,0
LD HL,(SamPtrs)
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,(MODADDR)
ADD HL,BC
LD A,(HL)
INC HL
LD (IX+CHNPRM.LSamPs),A
LD A,(HL)
INC HL
LD (IX+CHNPRM.SamLen),A
LD (IX+CHNPRM.SamPtr),L
LD (IX+CHNPRM.SamPtr+1),H
JR PD_LOOP
PD_VOL LD (IX+CHNPRM.Volume),A
JR PD_LOOP
PD_EOff RES 1,(IX+CHNPRM.Flags)
LD (IX+CHNPRM.PsInOr),A
JR PD_LOOP
PD_SorE DEC A
JR NZ,PD_ENV
LD A,(DE)
INC DE
LD (IX+CHNPRM.NNtSkp),A
JR PD_LOOP
PD_ENV CALL SETENV
JR PD_LOOP
PD_ORN CALL SETORN
JR PD_LOOP
PD_NOIS LD (Ns_Base),A
JR PD_LOOP
PD_ESAM RES 1,(IX+CHNPRM.Flags)
CALL NZ,SETENV
LD (IX+CHNPRM.PsInOr),A
LD A,(DE)
INC DE
JR PD_SAM_
PTDECOD LD A,(IX+CHNPRM.Note)
LD (PrNote+1),A
LD L,(IX+CHNPRM.CrTnSl)
LD H,(IX+CHNPRM.CrTnSl+1)
LD (PrSlide+1),HL
LD E,(IX+CHNPRM.AdInPt)
LD D,(IX+CHNPRM.AdInPt+1)
PD_LOOP LD A,(DE)
INC DE
ADD A,16
JR C,PD_OrSm
ADD A,32
JR Z,PD_FIN
JR C,PD_SAM
ADD A,16
JR Z,PD_REL
JR C,PD_VOL
ADD A,16
JR Z,PD_EOff
JR C,PD_SorE
ADD A,96
JR C,PD_NOTE
ADD A,16
JR C,PD_ORN
ADD A,32
JR C,PD_NOIS
ADD A,16
JR C,PD_ESAM
ADD A,16
ADD A,A
LD C,A
LD B,0
LD HL,SPCCOMS
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
PUSH BC
JR PD_LOOP
PD_REL RES 0,(IX+CHNPRM.Flags)
PD_RES LD (IX+CHNPRM.PsInSm),A
LD (IX+CHNPRM.CrAmSl),A
LD (IX+CHNPRM.CrNsSl),A
LD (IX+CHNPRM.CrEnSl),A
LD (IX+CHNPRM.PsInOr),A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
LD (IX+CHNPRM.TnAcc),A
LD (IX+CHNPRM.TnAcc+1),A
LD (IX+CHNPRM.COnOff),A
PD_FIN LD A,(IX+CHNPRM.NNtSkp)
LD (IX+CHNPRM.NtSkCn),A
JR PD_FIN_
PD_NOTE LD (IX+CHNPRM.Note),A
SET 0,(IX+CHNPRM.Flags)
XOR A
JR PD_RES
C_PORTM LD A,(DE)
INC DE
LD (IX+CHNPRM.TnSlDl),A
LD (IX+CHNPRM.TSlCnt),A
;SKIP PRECALCULATED TONE DELTA (BECAUSE CANNOT BE RIGHT AFTER PT3 COMPILATION)
INC DE
INC DE
LD A,(DE) ;SIGNED TONE STEP
INC DE
LD C,A
LD A,(DE)
INC DE
AND A
LD A,C
JR Z,NOSIG
NEG ;ABSOLUTE VALUE OF TONE STEP
NOSIG EX AF,AF'
PrNote LD A,0
PUSH AF
ADD A,A
LD L,A
LD H,0
LD BC,NT_
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
PUSH HL
LD A,(IX+CHNPRM.Note)
LD (IX+CHNPRM.SlToNt),A
ADD A,A
LD L,A
LD H,0
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
POP BC
SBC HL,BC
LD (IX+CHNPRM.TnDelt),L
LD (IX+CHNPRM.TnDelt+1),H
POP AF
LD (IX+CHNPRM.Note),A
LD C,(IX+CHNPRM.CrTnSl)
LD B,(IX+CHNPRM.CrTnSl+1)
LD A,(Version)
CP 6
JR C,OLDPRTM ;Old 3xxx for PT v3.5-
PrSlide LD BC,0
LD (IX+CHNPRM.CrTnSl),C
LD (IX+CHNPRM.CrTnSl+1),B
OLDPRTM EX AF,AF'
AND A
SBC HL,BC
LD H,0
JP P,PRTPLUS
NEG
DEC H
PRTPLUS LD (IX+CHNPRM.TSlStp),A
LD (IX+CHNPRM.TSlStp+1),H
XOR A
LD (IX+CHNPRM.COnOff),A
RES 2,(IX+CHNPRM.Flags)
PD_FIN_ LD (IX+CHNPRM.AdInPt),E
LD (IX+CHNPRM.AdInPt+1),D
RET
C_GLISS LD A,(DE)
INC DE
LD (IX+CHNPRM.TnSlDl),A
LD (IX+CHNPRM.TSlCnt),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.TSlStp),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.TSlStp+1),A
XOR A
LD (IX+CHNPRM.COnOff),A
SET 2,(IX+CHNPRM.Flags)
JR PD_FIN_
C_SMPOS LD A,(DE)
INC DE
LD (IX+CHNPRM.PsInSm),A
JR PD_FIN_
C_ORPOS LD A,(DE)
INC DE
LD (IX+CHNPRM.PsInOr),A
JR PD_FIN_
C_VIBRT LD A,(DE)
INC DE
LD (IX+CHNPRM.OnOffD),A
LD (IX+CHNPRM.COnOff),A
LD A,(DE)
INC DE
LD (IX+CHNPRM.OffOnD),A
XOR A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
JR PD_FIN_
C_ENGLS LD A,(DE)
INC DE
LD (Env_Del),A
LD (CurEDel),A
LD A,(DE)
INC DE
LD L,A
LD A,(DE)
INC DE
LD H,A
LD (ESldAdd),HL
JR PD_FIN_
C_DELAY LD A,(DE)
INC DE
LD (Delay),A
JR PD_FIN_
SETENV SET 1,(IX+CHNPRM.Flags)
LD (AYREGS+AR.EnvTp),A
LD A,(DE)
INC DE
LD (EnvBase+1),A
LD A,(DE)
INC DE
LD (EnvBase),A
XOR A
LD (IX+CHNPRM.PsInOr),A
LD (CurEDel),A
LD H,A
LD L,A
LD (CurESld),HL
C_NOP RET
SETORN ADD A,A ;THIS SUBPROGRAM _MUST_ RETURN ZERO IN A
LD C,A
LD B,0
LD HL,(OrnPtrs)
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,(MODADDR)
ADD HL,BC
LD A,(HL)
INC HL
LD (IX+CHNPRM.LOrnPs),A
LD A,(HL)
INC HL
LD (IX+CHNPRM.OrnLen),A
LD (IX+CHNPRM.OrnPtr),L
LD (IX+CHNPRM.OrnPtr+1),H
XOR A
LD (IX+CHNPRM.PsInOr),A
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 LD D,0
LD (IX+CHNPRM.Ampl),D
BIT 0,(IX+CHNPRM.Flags)
JP Z,CH_EXIT
LD A,(IX+CHNPRM.PsInSm)
ADD A,A
ADD A,A
LD E,A
LD L,(IX+CHNPRM.SamPtr)
LD H,(IX+CHNPRM.SamPtr+1)
ADD HL,DE
LD (SP_),SP
LD SP,HL
POP BC
POP HL
LD SP,(SP_)
LD E,(IX+CHNPRM.TnAcc)
LD D,(IX+CHNPRM.TnAcc+1)
ADD HL,DE
BIT 6,B
JR Z,CH_NOAC
LD (IX+CHNPRM.TnAcc),L
LD (IX+CHNPRM.TnAcc+1),H
CH_NOAC LD (_SAMTON+1),HL
LD E,(IX+CHNPRM.PsInOr)
LD D,0
LD L,(IX+CHNPRM.OrnPtr)
LD H,(IX+CHNPRM.OrnPtr+1)
ADD HL,DE
LD A,(IX+CHNPRM.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
LD E,A
LD HL,NT_
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
_SAMTON LD HL,0
ADD HL,DE
LD E,(IX+CHNPRM.CrTnSl)
LD D,(IX+CHNPRM.CrTnSl+1)
ADD HL,DE
LD (IX+CHNPRM.Ton),L
LD (IX+CHNPRM.Ton+1),H
XOR A
OR (IX+CHNPRM.TSlCnt)
JR Z,CH_AMP
DEC (IX+CHNPRM.TSlCnt)
JR NZ,CH_AMP
LD A,(IX+CHNPRM.TnSlDl)
LD (IX+CHNPRM.TSlCnt),A
LD L,(IX+CHNPRM.TSlStp)
LD H,(IX+CHNPRM.TSlStp+1)
LD A,H
ADD HL,DE
LD (IX+CHNPRM.CrTnSl),L
LD (IX+CHNPRM.CrTnSl+1),H
BIT 2,(IX+CHNPRM.Flags)
JR NZ,CH_AMP
LD E,(IX+CHNPRM.TnDelt)
LD D,(IX+CHNPRM.TnDelt+1)
AND A
JP P,CH_STPP
EX DE,HL
CH_STPP SBC HL,DE
JP M,CH_AMP
LD A,(IX+CHNPRM.SlToNt)
LD (IX+CHNPRM.Note),A
XOR A
LD (IX+CHNPRM.TSlCnt),A
LD (IX+CHNPRM.CrTnSl),A
LD (IX+CHNPRM.CrTnSl+1),A
CH_AMP LD A,(IX+CHNPRM.CrAmSl)
BIT 7,C
JR Z,CH_NOAM
BIT 6,C
JR Z,CH_AMIN
CP 15
JR C,CH_AINC
AND A
JP P,CH_NOAM
CH_AINC INC A
JR CH_NOAM
CH_AMIN CP -14
JR NC,CH_ADEC
AND A
JP M,CH_NOAM
CH_ADEC DEC A
CH_NOAM LD (IX+CHNPRM.CrAmSl),A
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 LD L,A
LD A,(IX+CHNPRM.Volume)
SLA A
SLA A
SLA A
SLA A
OR L
LD L,A
LD H,0
LD DE,VT_
ADD HL,DE
LD A,(HL)
CH_ENV BIT 0,C
JR NZ,CH_NOEN
BIT 1,(IX+CHNPRM.Flags)
JR Z,CH_NOEN
OR 16
CH_NOEN LD (IX+CHNPRM.Ampl),A
BIT 7,B
LD A,C
JR Z,NO_ENSL
RLA
RLA
SRA A
SRA A
SRA A
ADD A,(IX+CHNPRM.CrEnSl) ;SEE COMMENT BELOW
BIT 5,B
JR Z,NO_ENAC
LD (IX+CHNPRM.CrEnSl),A
NO_ENAC LD HL,AddToEnv
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+CHNPRM.CrNsSl)
LD (AddToNs),A
BIT 5,B
JR Z,CH_MIX
LD (IX+CHNPRM.CrNsSl),A
CH_MIX LD A,B
RRA
AND #48
LD HL,AYREGS+AR.Mixer
OR (HL)
LD (HL),A
INC (IX+CHNPRM.PsInSm)
LD A,(IX+CHNPRM.PsInSm)
CP (IX+CHNPRM.SamLen)
JR C,CH_ORNC
LD A,(IX+CHNPRM.LSamPs)
LD (IX+CHNPRM.PsInSm),A
CH_ORNC INC (IX+CHNPRM.PsInOr)
LD A,(IX+CHNPRM.PsInOr)
CP (IX+CHNPRM.OrnLen)
JR C,CH_EXIT
LD A,(IX+CHNPRM.LOrnPs)
LD (IX+CHNPRM.PsInOr),A
CH_EXIT LD HL,AYREGS+AR.Mixer
SRL (HL)
XOR A
OR (IX+CHNPRM.COnOff)
RET Z
DEC (IX+CHNPRM.COnOff)
RET NZ
LD A,(IX+CHNPRM.Flags)
XOR 1
LD (IX+CHNPRM.Flags),A
AND 1
LD A,(IX+CHNPRM.OnOffD)
JR NZ,CH_ONDL
LD A,(IX+CHNPRM.OffOnD)
CH_ONDL LD (IX+CHNPRM.COnOff),A
RET
PLAY
LD A,255
LD (AYREGS+AR.EnvTp),A
LD HL,DelyCnt
DEC (HL)
JR NZ,PL2
LD HL,ChanA+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1B
LD HL,(ChanA+CHNPRM.AdInPt)
AND (HL)
JR NZ,PL1A
LD D,A
LD (Ns_Base),A
LD IX,(MODADDR)
LD HL,(CrPsPtr)
INC HL
LD A,(HL)
INC A
JR NZ,PLNLP
LD E,(IX+102)
LD HL,(MODADDR)
ADD HL,DE
LD E,201
ADD HL,DE
LD A,(HL)
INC A
PLNLP LD (CrPsPtr),HL
DEC A
RLA
LD E,A
RL D
LD L,(IX+103)
LD H,(IX+104)
ADD HL,DE
LD DE,(MODADDR)
ADD HL,DE
LD (SP_),SP
LD SP,HL
POP HL
ADD HL,DE
LD (ChanA+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanB+CHNPRM.AdInPt),HL
POP HL
ADD HL,DE
LD (ChanC+CHNPRM.AdInPt),HL
LD SP,(SP_)
PL1A LD IX,ChanA
CALL PTDECOD
PL1B LD HL,ChanB+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1C
LD IX,ChanB
CALL PTDECOD
PL1C LD HL,ChanC+CHNPRM.NtSkCn
DEC (HL)
JR NZ,PL1D
LD IX,ChanC
CALL PTDECOD
PL1D LD A,(Delay)
LD (DelyCnt),A
PL2 XOR A
LD (AddToEnv),A
LD (AYREGS+AR.Mixer),A
LD IX,ChanA
CALL CHREGS
LD IX,ChanB
CALL CHREGS
LD IX,ChanC
CALL CHREGS
LD HL,(ChanA+CHNPRM.Ton)
LD (AYREGS+AR.TonA),HL
LD HL,(ChanB+CHNPRM.Ton)
LD (AYREGS+AR.TonB),HL
LD HL,(ChanC+CHNPRM.Ton)
LD (AYREGS+AR.TonC),HL
LD A,(ChanA+CHNPRM.Ampl)
LD (AYREGS+AR.AmplA),A
LD A,(ChanB+CHNPRM.Ampl)
LD (AYREGS+AR.AmplB),A
LD A,(ChanC+CHNPRM.Ampl)
LD (AYREGS+AR.AmplC),A
LD A,(Ns_Base)
LD L,A
LD A,(AddToNs)
ADD A,L
LD (AYREGS+AR.Noise),A
LD A,(AddToEnv)
LD E,A
ADD A,A
LD A,0
RLA
NEG
LD D,A
LD HL,(EnvBase)
ADD HL,DE
LD DE,(CurESld)
ADD HL,DE
LD (AYREGS+AR.Env),HL
XOR A
LD HL,CurEDel
OR (HL)
JR Z,PLEND
DEC (HL)
JR NZ,PLEND
LD A,(Env_Del)
LD (HL),A
LD HL,(ESldAdd)
ADD HL,DE
LD (CurESld),HL
PLEND
ROUT LD DE,#FFBF
LD BC,#FFFD
LD HL,AYREGS
XOR A
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
;First 12 values of tone tables
T_ DW #0CDA,#0C22,#0B73,#0ACF,#0A33,#09A1,#0917,#0894,#0819,#07A4,#0737,#06CF
;0_both_3_both
DW #0EF8,#0E10,#0D60,#0C80,#0BD8,#0B28,#0A88,#09F0,#0960,#08E0,#0858,#07E0 ;1
DW #0D3E,#0C80,#0BCC,#0B22,#0A82,#09EC,#095C,#08D6,#0858,#07E0,#076E,#0704
;2_old
DW #0D10,#0C55,#0BA4,#0AFC,#0A5F,#09CA,#093D,#08B8,#083B,#07C5,#0755,#06EC
;2_new
;Correction bits for tone tables
TB_ DB 233,251,191,255,255,255,255,255,255,255,255 ;0_old
DB 160,128,46,70,242,132,172,46,27,107,0 ;0_new
DB 0,0,144,20,76,101,20,94,233,255,126 ;2_old
DB 0,64,16,161,101,248,185,93,204,169,3 ;2_new
DB 64,1,93,140,236,9,89,93,54,214,0 ;3_both
;Compressed new volume table
VNEW_ DB 0,255,240,240,8,239,196,220,32,251,144,246,64,253,
DB 170,170,64,253,144,246,32,251,196,220,8,239,240,240,0,255
;Compressed old volume table
VOLD_ DB 0,255,192,248,48,247,128,236,72,219,160,244,84,255,
DB 0,170,160,245,72,218,144,253,32,230,192,249,0,254,254,255
;vars from here can be stripped
SP_ DW 0 ;OLD STACK POINTER
MODADDR DW 0
VARS
;TEMPVARS
AddToEnv DB 0
;GlobalVars
Version DB 0
EnvBase DW 0
CurESld DW 0
ESldAdd DW 0
CurEDel DB 0
Env_Del DB 0
Ns_Base DB 0
Delay DB 0
AddToNs DB 0
DelyCnt DB 0
CrPsPtr DW 0
SamPtrs DW 0
OrnPtrs DW 0
;ChannelsVars
struc CHNPRM
.AdInPt RESW 1
.OrnPtr RESW 1
.SamPtr RESW 1
.Ton RESW 1
.LOrnPs RESB 1
.OrnLen RESB 1
.PsInOr RESB 1
.LSamPs RESB 1
.SamLen RESB 1
.PsInSm RESB 1
.Volume RESB 1
.NNtSkp RESB 1
.Note RESB 1
.SlToNt RESB 1
.Ampl RESB 1
.Flags RESB 1 ;Envelope_Enabled - 1,Enabled - 0,SimpleGliss - 2
.CrAmSl RESB 1
.CrNsSl RESB 1
.CrEnSl RESB 1
.TSlCnt RESB 1
.COnOff RESB 1
.OnOffD RESB 1
.OffOnD RESB 1
.TnSlDl RESB 1
.CrTnSl RESW 1
.TnAcc RESW 1
.TSlStp RESW 1
.TnDelt RESW 1
.NtSkCn RESB 1
.Size RESB 1
endstruc
ChanA RESB CHNPRM.Size
ChanB RESB CHNPRM.Size
ChanC RESB CHNPRM.Size
struc AR
.TonA RESW 1
.TonB RESW 1
.TonC RESW 1
.Noise RESB 1
.Mixer RESB 1
.AmplA RESB 1
.AmplB RESB 1
.AmplC RESB 1
.Env RESW 1
.EnvTp RESB 1
endstruc
NT_ RESB 192 ;CreatedNoteTableAddress
AYREGS
VT_ RESB 256 ;CreatedVolumeTableAddress
VARSEND 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.2005 - Debugging and optimization. First release!
;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 1736 11016 5500
;Chuta/Miguel 1736 11304 5500
;Zhara/Macros 5176 10392 5500
;Size:
;Code block #791 bytes
;Variables #247 bytes (can be stripped)
;Size in RAM #791+#247=#9D8 (2520) bytes
;Not so bad for the most universal PT3 player, I think ;)
;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.
-------Файл VTII10b8.asm-------[Bottom]
WBR, Sergey Bulba. E-mail: ***@mail.khstu.ru http://bulba.at.kz/
... Ay_Emul: Silent now...
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru