;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
;(c)2004,2007 S.V.Bulba <vorobey@mail.khstu.ru>

;Release 7 steps:
;29.Apr.2007 - SjAsm adaptation; new 1.xx and 2.xx
;interpretation for PT 3.7+.

; ------------------------------------------------------------
; To get the complete PTxTools package, point
; your HTTP-Browser to bulba.untergrund.net
;
; Quick&Dirty Amstrad CPC/Plus Port by Grim/Arkos^Semilanceata 
; Maxam assembler friendly
; ------------------------------------------------------------

testplayer equ 1  ; assemble test code switch
if testplayer

;  Test songs can be selected at the end of this source.

ORG &1000
nolist
di
ld hl,&C9FB
ld (&38),hl

ld hl,5000
call ZXtoCPC_env
ei

; Initialize PT3 driver
ld hl,MDLADDR ; Point to the PT3 song data
call PT3_init

vsync ld b,&F5
in a,(c)
rra
jr nc,vsync+2
djnz $
halt
halt
ld bc,&7F10
out (c),c
ld c,&4B
out (c),c

; 50Hz play song
call PT3_play

ld bc,&7F54
out (c),c
jr vsync
endif


;reset group
PsInOr equ PT3_PsInOr-ChanA
PsInSm equ PT3_PsInSm-ChanA
CrAmSl equ PT3_CrAmSl-ChanA
CrNsSl equ PT3_CrNsSl-ChanA
CrEnSl equ PT3_CrEnSl-ChanA
TSlCnt equ PT3_TSlCnt-ChanA
CrTnSl equ PT3_CrTnSl-ChanA
TnAcc equ PT3_TnAcc-ChanA
COnOff equ PT3_COnOff-ChanA
;reset group
OnOffD equ PT3_OnOffD-ChanA
;IX for PTDECOD here (+12)
OffOnD equ PT3_OffOnD-ChanA
OrnPtr equ PT3_OrnPtr-ChanA
SamPtr equ PT3_SamPtr-ChanA
NNtSkp equ PT3_NNtSkp-ChanA
Note equ PT3_Note-ChanA
SlToNt equ PT3_SlToNt-ChanA
Env_En equ PT3_Env_En-ChanA
Flags equ PT3_Flags-ChanA
;Enabled - 0,SimpleGliss - 2
TnSlDl equ PT3_TnSlDl-ChanA
TSlStp equ PT3_TSlStp-ChanA
TnDelt equ PT3_TnDelt-ChanA
NtSkCn equ PT3_NtSkCn-ChanA
Volume equ PT3_Volume-ChanA


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

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+NtSkCn
INC (HL)
PT3_stop: XOR A
LD H,A
LD L,A
LD (AYREGS+AmplA),A
LD (AYREGS+AmplB),HL
JP ROUT_A0

;HL - AddressOfModule
PT3_init:
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,2*49 + T1a - 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 - Volume, L - NtSkCn
LD (ChanA+NtSkCn),HL
LD (ChanB+NtSkCn),HL
LD (ChanC+NtSkCn),HL

LD HL,EMPTYSAMORN
LD (AdInPtA),HL  ;ptr to zero
LD (ChanA+OrnPtr),HL ;ornament 0 is "0,1,0"
LD (ChanB+OrnPtr),HL ;in all versions from
LD (ChanC+OrnPtr),HL ;3.xx to 3.6x and VTII

LD (ChanA+SamPtr),HL ;S1 There is no default
LD (ChanB+SamPtr),HL ;S2 sample in PT3, so, you
LD (ChanC+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=T1a
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+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+SamPtr),L
LD (IX-12+SamPtr+1),H
JR PD_LOOP

PD_VOL RLCA
RLCA
RLCA
RLCA
LD (IX-12+Volume),A
JR PD_LP2

PD_EOff LD (IX-12+Env_En),A
LD (IX-12+PsInOr),A
JR PD_LP2

PD_SorE DEC A
JR NZ,PD_ENV
LD A,(BC)
INC BC
LD (IX-12+NNtSkp),A
JR PD_LP2

PD_ENV CALL SETENV
JR PD_LP2

PD_ORN CALL SETORN
JR PD_LOOP

PD_ESAM LD (IX-12+Env_En),A
LD (IX-12+PsInOr),A
CALL NZ,SETENV
LD A,(BC)
INC BC
JR PD_SAM_

PTDECOD  LD A,(IX-12+Note)
LD (PrNote+1),A
LD L,(IX-12+CrTnSl)
LD H,(IX-12+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+Flags)
JR PD_RES

PD_NOTE LD (IX-12+Note),A
SET 0,(IX-12+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+NNtSkp)
LD (IX-12+NtSkCn),A
RET

C_PORTM  RES 2,(IX-12+Flags)
LD A,(BC)
INC BC
;SKIP PRECALCULATED TONE DELTA (BECAUSE
;CANNOT BE RIGHT AFTER PT3 COMPILATION)
INC BC
INC BC
LD (IX-12+TnSlDl),A
LD (IX-12+TSlCnt),A
LD DE,NT_
LD A,(IX-12+Note)
LD (IX-12+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+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+TnDelt),L
LD (IX-12+TnDelt+1),H
LD E,(IX-12+CrTnSl)
LD D,(IX-12+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+CrTnSl),E
LD (IX-12+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+TSlStp+1),A
EX AF,AF'
LD (IX-12+TSlStp),A
LD (IX-12+COnOff),0
RET

C_GLISS SET 2,(IX-12+Flags)
LD A,(BC)
INC BC
LD (IX-12+TnSlDl),A
AND A
JR NZ,GL36
LD A,(Version) ;AlCo PT3.7+
CP 7
SBC A,A
INC A
GL36 LD (IX-12+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+PsInSm),A
RET

C_ORPOS LD A,(BC)
INC BC
LD (IX-12+PsInOr),A
RET

C_VIBRT LD A,(BC)
INC BC
LD (IX-12+OnOffD),A
LD (IX-12+COnOff),A
LD A,(BC)
INC BC
LD (IX-12+OffOnD),A
XOR A
LD (IX-12+TSlCnt),A
LD (IX-12+CrTnSl),A
LD (IX-12+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+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+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+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+OrnPtr),L
LD (IX-12+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+Flags)
PUSH HL
JP Z,CH_EXIT
LD (CSP_+1),SP
LD L,(IX+OrnPtr)
LD H,(IX+OrnPtr+1)
LD SP,HL
POP DE
LD H,A
LD A,(IX+PsInOr)
LD L,A
ADD HL,SP
INC A
CP D
JR C,CH_ORPS
LD A,E
CH_ORPS LD (IX+PsInOr),A
LD A,(IX+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+SamPtr)
LD H,(IX+SamPtr+1)
LD SP,HL
POP DE
LD H,0
LD A,(IX+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+PsInSm),A
POP BC
POP HL
LD E,(IX+TnAcc)
LD D,(IX+TnAcc+1)
ADD HL,DE
BIT 6,B
JR Z,CH_NOAC
LD (IX+TnAcc),L
LD (IX+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+CrTnSl)
LD D,(IX+CrTnSl+1)
ADD HL,DE
CSP_ LD SP,&3131
EX (SP),HL
XOR A
OR (IX+TSlCnt)
JR Z,CH_AMP
DEC (IX+TSlCnt)
JR NZ,CH_AMP
LD A,(IX+TnSlDl)
LD (IX+TSlCnt),A
LD L,(IX+TSlStp)
LD H,(IX+TSlStp+1)
LD A,H
ADD HL,DE
LD (IX+CrTnSl),L
LD (IX+CrTnSl+1),H
BIT 2,(IX+Flags)
JR NZ,CH_AMP
LD E,(IX+TnDelt)
LD D,(IX+TnDelt+1)
AND A
JR Z,CH_STPP
EX DE,HL
CH_STPP  SBC HL,DE
JP M,CH_AMP
LD A,(IX+SlToNt)
LD (IX+Note),A
XOR A
LD (IX+TSlCnt),A
LD (IX+CrTnSl),A
LD (IX+CrTnSl+1),A
CH_AMP LD A,(IX+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+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+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+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+CrEnSl) ;SEE COMMENT BELOW
BIT 5,B
JR Z,NO_ENAC
LD (IX+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+CrNsSl)
LD (AddToNs),A
BIT 5,B
JR Z,CH_MIX
LD (IX+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+COnOff)
RET Z
DEC (IX+COnOff)
RET NZ
XOR (IX+Flags)
LD (IX+Flags),A
RRA
LD A,(IX+OnOffD)
JR C,CH_ONDL
LD A,(IX+OffOnD)
CH_ONDL LD (IX+COnOff),A
RET

PT3_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+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+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+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
call ZXtoCPC_tone ; CPC PATCH
LD (AYREGS+TonA),HL
LD A,(Ampl)
LD (AYREGS+AmplA),A
LD IX,ChanB
LD HL,(AYREGS+TonB)
CALL CHREGS
call ZXtoCPC_tone ; CPC PATCH
LD (AYREGS+TonB),HL
LD A,(Ampl)
LD (AYREGS+AmplB),A
LD IX,ChanC
LD HL,(AYREGS+TonC)
CALL CHREGS
call ZXtoCPC_tone ; CPC PATCH
LD (AYREGS+TonC),HL
; LD A,(Ampl) ;Ampl = AYREGS+AmplC
; LD (AYREGS+AmplC),A

LD HL,(Ns_Base_AddToNs)
LD A,H
ADD A,L
srl a ; CPC PATCH (noise/2)
jr nc,$+1
inc a
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
push de
call ZXtoCPC_env ; CPC PATCH
pop 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 HL,AYREGS
LOUT
ld bc,&f4c0
out (c),a
ld b,&f6
out (c),c
db &ed,&71
dec b ; b=&f5
OUTI
ld bc,&f680
out (c),c
db &ed,&71
INC A
CP 13
JR NZ,LOUT
LD A,(HL)
AND A
RET M
ld A,13
ld bc,&f4c0
out (c),a
ld b,&f6
out (c),c
db &ed,&71
dec b ; b=&f5
OUTI
ld bc,&f680
out (c),c
db &ed,&71
RET

ZXtoCPC_tone:
ld b,h
ld c,l ;BC=x256

add hl,hl ;x2
ld d,h
ld e,l
add hl,hl ;HL=x4
ex de,hl
add hl,de
ex de,hl ;DE=x6

add hl,hl ;HL=x2048

ld a,d
add a,l
jr nc,$+3
inc h
add a,c
ld l,a
ld a,h
adc a,b

srl a
rr l
srl a
rr l
srl a
rr l
srl a
rr l
ld h,a
ret nc
inc hl ; round
ret

; Input
;  HL=ZX_AY3_env_period (16bit)
; Output
;  HL=CPC_AY3_env_period
;  register HL,DE,C,AF corrupted

; C=INT(4096*1000/1773) = 2310 = %100100000110 = 2048 + 256 + 4 + 2
ZXtoCPC_env:
; B,HL
; C,DE

ld b,0

ld c,h
ld d,l
ld e,b  ;CDE=x256

add hl,hl
rr b ;BHL=x2
ex de,hl
add hl,de
ld a,c
adc b
; CHL=x256 + x2
; BDE=x2
; A  =C

rl e
rl d
rl b
add hl,de
adc b ; AHL=x256 + x4 + x2 / BDE=x4
ld c,a

rl e
rl d
rl b ; BDE=x2048

;  BDE
; + CHL
ld a,h
add a,e
ld l,a

ld a,c
adc a,d
;ld h,a
jr nc,$+3
inc b


srl b:rra:rr l
srl b:rra:rr l
srl b:rra:rr l
srl b:rra:rr l
ld h,a
ret nc
inc hl
ret



NT_DATA DB T_NEW_0-T1a * 2
DB TCNEW_0-T_
DB T_OLD_0-T1a *2 +1
DB TCOLD_0-T_
DB T_NEW_1-T1a *2 +1
DB TCNEW_1-T_
DB T_OLD_1-T1a *2 +1
DB TCOLD_1-T_
DB T_NEW_2-T1a *2
DB TCNEW_2-T_
DB T_OLD_2-T1a *2
DB TCOLD_2-T_
DB T_NEW_3-T1a *2
DB TCNEW_3-T_
DB T_OLD_3-T1a *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

ChanA
;reset group
PT3_PsInOr DB 0
PT3_PsInSm DB 0
PT3_CrAmSl DB 0
PT3_CrNsSl DB 0
PT3_CrEnSl DB 0
PT3_TSlCnt DB 0
PT3_CrTnSl DW 0
PT3_TnAcc DW 0
PT3_COnOff DB 0
;reset group
PT3_OnOffD DB 0

;IX for PTDECOD here (+12)
PT3_OffOnD DB 0
PT3_OrnPtr DW 0
PT3_SamPtr DW 0
PT3_NNtSkp DB 0
PT3_Note DB 0
PT3_SlToNt DB 0
PT3_Env_En DB 0
PT3_Flags DB 0
 ;Enabled - 0,SimpleGliss - 2
PT3_TnSlDl DB 0
PT3_TSlStp DW 0
PT3_TnDelt DW 0
PT3_NtSkCn DB 0
PT3_Volume DB 0
ChanA_end

ChanB DS ChanA_end-ChanA,0
ChanC DS ChanA_end-ChanA,0

;GlobalVars
DelyCnt DB 0
CurESld DW 0
CurEDel DB 0
Ns_Base_AddToNs
Ns_Base DB 0
AddToNs DB 0

AYREGS

VT_ DS 256,0 ;CreatedVolumeTableAddress

EnvBase EQU VT_+14

T1a EQU VT_+16 ;Tone tables data depacked here

T_OLD_1 EQU T1a
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 $


if testplayer
nolist
; uncomment one of the following lines to change the demos songs
;incbin "PT3-Songs/Chuta.pt3"
;incbin "PT3-Songs/m_entryO.pt3"
;incbin "PT3-Songs/NeOtpusk.pt3"
;incbin "PT3-Songs/TrafOfD.pt3"
incbin "PT3-Songs/UckA_!a.pt3"
endif