Difference between revisions of "PROTRACKER372 PTSPLAY H"

From MSX MUSIC WIKI
Jump to: navigation, search
(Created page with "PTUPLAY C��\V�W�Ÿ;RUN=CREATE RELOC TBL ;pt3.67 micro SLOW player with 1 table ;no ini ;85 PATTERNS ;no IY! ;tempo1 MACRO pp tba_smp=MUZ+105 tba_orn=tba_smp+64...")
(Tags: Mobile edit, Mobile web edit)
 
(Tags: Mobile edit, Mobile web edit)
Line 1: Line 1:
PTUPLAY C��\V�W�Ÿ;RUN=CREATE RELOC TBL
+
PTSPlay C��3w�x{�;Universal PT2'n'PT3 Turbo Sound player for ZX Spectrum
;pt3.67 micro SLOW player with 1 table
+
;2004-2007 S.V.Bulba <vorobey@mail.khstu.ru>
;no ini
+
;http://bulba.untergrund.net/ (http://bulba.at.kz/)
;85 PATTERNS
+
 
;no IY!
+
Release="0"
;tempo1
+
 
        MACRO pp
+
;read SjAsm or ZXAsm version source for comments.
tba_smp=MUZ+105
+
 
tba_orn=tba_smp+64
+
;Conditional assembly
PLAYER
+
;1) Current position counters at (Vars1+0) and (Vars2+0)
frq_A=MUZ
+
CurPosCounter=0
frq_B=MUZ+2
+
;2) Allow channels allocation bits at (START+10)
frq_C=MUZ+4
+
ACBBAC=0
N_frq=MUZ+6
+
;3) Allow loop checking and disabling
vol_A=MUZ+8
+
LoopChecker=0
vol_B=MUZ+9
+
;4) Insert official identificator
vol_C=MUZ+10
+
IFN ?Id
frq_E=MUZ+11
+
Id=1
E_form=MUZ+13
+
ENDIF
play
+
;5) Set IY for correct return to ZX Basic
         LD HL,int_qty
+
IFN ?Basic
         DEC (HL)
+
Basic=0
         JP NZ,NOINS
+
ENDIF
;--- nota_A + calc_next_position ---
+
 
      INC HL
+
      ;ORG #C000
      ;LD HL,A_qty
+
 
      DEC (HL)
+
TonA=0
         JR NZ,Aq_0
+
TonB=2
Ach_adr LD DE,tab_vol+16
+
TonC=4
         LD A,(DE)
+
Noise=6
         OR A
+
Mixer=7
         JR NZ,Ps_n0
+
AmplA=8
_m1=$+2
+
AmplB=9
      LD (N_frq),A ;;5!!!
+
AmplC=10
      LD D,A         ;;
+
Env=11
         LD (sav_SP2+1),SP
+
EnvTp=13
Psa_beg LD HL,MUZ+201
+
 
         LD A,(HL)
+
;ChannelsVars
         INC A      ;AAA;6
+
      ;STRUCT  CHP
         JR NZ,Ps_n1 ;NC ;6
+
;reset group
Psa_lop LD HL,MUZ+201
+
PsInOr=0
Ps_n1  LD E,(HL)      ;6
+
PsInSm=1
 +
CrAmSl=2
 +
CrNsSl=3
 +
CrEnSl=4
 +
TSlCnt=5
 +
CrTnSl=6
 +
TnAcc=8
 +
COnOff=10
 +
;reset group
 +
 
 +
OnOffD=11
 +
 
 +
;IX for PTDECOD here (+12)
 +
OffOnD=12
 +
OrnPtr=13
 +
SamPtr=15
 +
NNtSkp=17
 +
Note=18
 +
SlToNt=19
 +
Env_En=20
 +
Flags=21
 +
;Enabled - 0, SimpleGliss - 2
 +
TnSlDl=22
 +
TSlStp=23
 +
TnDelt=25
 +
NtSkCn=27
 +
Volume=28
 +
      ;ENDS
 +
CHP=29
 +
 
 +
      ;STRUCT  VRS
 +
 
 +
CurPos=0
 +
PosSub=1
 +
 
 +
ModNum=2 ;bit0: ChipNum
 +
            ;bit1: 1-reversed patterns order (AlCo TS)
 +
ChanA=3
 +
ChanB=ChanA+CHP
 +
ChanC=ChanB+CHP
 +
 
 +
;GlobalVars
 +
MODADDR=ChanC+CHP
 +
OrnPtrs=MODADDR+2
 +
SamPtrs=MODADDR+4
 +
PatsPtr=MODADDR+6
 +
AdInPtA=MODADDR+8
 +
AdInPtB=MODADDR+10
 +
AdInPtC=MODADDR+12
 +
CrPsPtr=MODADDR+14
 +
LPosPtr=MODADDR+16
 +
Delay=MODADDR+18
 +
DelyCnt=MODADDR+19
 +
ESldAdd=MODADDR+20
 +
CurESld=MODADDR+22
 +
Env_Del=MODADDR+24
 +
CurEDel=MODADDR+25
 +
Ns_Base=MODADDR+26
 +
AddToNs=MODADDR+27
 +
AddToEn=MODADDR+28
 +
EnvBase=MODADDR+29
 +
AYREGS=MODADDR+31
 +
      ;ENDS
 +
VRS=AYREGS+14
 +
 
 +
START
 +
         LD HL,MDLADDR ;DE - address of 2nd module for TS
 +
         JR INIT
 +
         JP PLAY
 +
        JR MUTE
 +
SETUP  DB 0
 +
 
 +
        IFN Id
 +
        DB "=UniPT2/PT3/TS-Player r.",Release,"="
 +
        ENDIF
 +
 
 +
        IFN LoopChecker
 +
CHECKLP LD HL,SETUP
 +
        BIT 0,(IY-100+ModNum)
 +
        JR Z,CHL1
 +
        SET 6,(HL)
 +
         JR CHL2
 +
CHL1    SET 7,(HL)
 +
CHL2    BIT 0,(HL)
 +
        RET Z
 +
        POP HL
 +
        INC (IY-100+DelyCnt)
 +
         INC (IY-100+ChanA+NtSkCn)
 +
         XOR A
 +
         LD (IY-100+AYREGS+AmplA),A
 +
        LD (IY-100+AYREGS+AmplB),A
 +
        LD (IY-100+AYREGS+AmplC),A
 +
        RET
 +
        ENDIF
 +
 
 +
MUTE    XOR A
 +
        LD H,A
 +
        LD L,A
 +
         LD (VARS1+AYREGS+AmplA),A
 +
        LD (VARS1+AYREGS+AmplB),HL
 +
        LD (VARS2+AYREGS+AmplA),A
 +
         LD (VARS2+AYREGS+AmplB),HL
 +
         JP ROUT
 +
 
 +
INIT
 +
;HL - AddressOfModule
 +
;DE - AddresOf2ndModule
 +
        PUSH DE
 +
        PUSH HL
 +
         LD HL,VARS
 +
        LD (HL),0
 +
        LD DE,VARS+1
 +
        LD BC,VAR0END-VARS-1
 +
        LDIR
 
         INC HL
 
         INC HL
         LD (Psa_beg+1),HL
+
         LD (VARS1+AdInPtA),HL ;ptr to zero
 +
        LD (VARS2+AdInPtA),HL
  
Psa_chn LD HL,0
 
        ADD HL,DE
 
        ADD HL,DE
 
        LD SP,HL
 
        ;POP HL
 
;ia_pos0 LD BC,MUZ
 
        ;ADD HL,BC
 
        ;EX DE,HL      ;DE=adr_chn_A
 
      POP DE
 
 
         POP HL
 
         POP HL
         ;ADD HL,BC      ;HL=adr_chn_B
+
         LD IY,VARS1+100
         LD (Bch_adr+1),HL
+
        LD A,(START+10)
 +
        AND 2
 +
        JP NZ,I_PT2
 +
 
 +
        CALL INITPT3
 +
        LD HL,#1F18 ;(e_-SamCnv-2)*256+#18 ;ALASM :(
 +
        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
 
         POP HL
 
         POP HL
         ;ADD HL,BC      ;HL=adr_chn_C
+
         ;Use version and ton table of 1st module
         LD (Cch_adr+1),HL
+
         LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
sav_SP2 LD SP,0
+
        SUB #30
Ps_n0
+
         JR C,L20
_m12=$+1
+
         CP 10
         LD H,'tba_smp
+
         JR C,L21
         CALL An_clc1
+
L20    LD A,6
         LD (Ach_adr+1),DE
+
L21    LD (Version),A
Ai_qty  LD A,0
+
        PUSH AF ;VolTable version
        LD (A_qty),A
+
        CP 4
      DJNZ Aq_0
+
         LD A,(IX+99-100) ;TONE TABLE NUMBER
         LD H,B
+
        RLA
         LD L,B
+
        AND 7
         LD (Asl_dsp+1),HL
+
        PUSH AF ;NoteTable number
Aq_0
+
 
;--- nota_B ---
+
         LD IY,VARS2+100
      LD HL,B_qty
+
         LD A,(START+10)
      DEC (HL)
+
        AND 48
         JR NZ,Bq_0
+
        JR Z,NOTS
Bch_adr LD DE,0
+
        CP 16
_m13=$+1
+
        JR Z,TwoPT3s
         LD H,'tba_smp
+
        LD A,(Version)
         CALL Bn_clc1
+
        CP 7
         LD (Bch_adr+1),DE
+
        JR C,NOTS
Bi_qty  LD A,0
+
        LD A,(IX+98-100) ;ALCO TS MARKER
         LD (B_qty),A
+
        CP #20
      DJNZ Bq_0
+
         JR Z,NOTS
        LD H,B
+
        LD HL,VARS1
         LD L,B
+
        LD DE,VARS2
         LD (Bsl_dsp+1),HL
+
         LD BC,VRS
Bq_0
+
         LDIR
;--- nota_C ---
+
         SET 1,(IY-100+ModNum)
      LD HL,C_qty
+
        LD C,A
      DEC (HL)
+
        ADD A,A
         JR NZ,Cq_0
+
        ADD A,C
Cch_adr LD DE,0
+
        SUB 2
_m14=$+1
+
         LD (TSSub),A
         LD H,'tba_smp
+
        JR AlCoTS_
         CALL Cn_clc1
+
TwoPT3s CALL INITPT3
         LD (Cch_adr+1),DE
+
AlCoTS_ LD A,1
Ci_qty  LD A,0
+
         LD (is_ts),A
         LD (C_qty),A
+
         SET 0,(IY-100+ModNum)
      DJNZ Cq_0
+
 
         LD H,B
+
NOTS    LD BC,PT3PD
         LD L,B
+
        LD HL,0
         LD (Csl_dsp+1),HL
+
        LD DE,PT3EMPTYORN
Cq_0
+
         JR INITCOMMON
;--- install_E ---
+
 
Ei_form LD A,0        ;env_form
+
I_PT2  CALL INITPT2
_m11=$+2
+
        LD HL,#51CB
         LD (E_form),A
+
        LD (SamCnv),HL
         OR A
+
         LD A,#BB
         JR Z,temp
+
         LD (OrnCP),A
Ei_frq  LD HL,0        ;env_frq
+
         LD (SamCP),A
         LD (E_frq+1),HL
+
        LD A,#7A
        XOR A
+
         LD (OrnLD),A
         LD L,A
+
         LD (SamLD),A
         LD H,A
+
         LD A,#80
         LD (Ei_form+1),A
+
         LD (SamClc2),A
         LD (Esl_frq+1),HL
+
        POP HL
         LD (Esl_stp+1),A
+
        LD A,5
 +
         LD (Version),A
 +
         PUSH AF
 +
        LD A,2
 +
         PUSH AF
 +
 
 +
         LD A,(START+10)
 +
        AND 48
 +
        JR Z,NOTS2
 +
 
 +
         LD IY,VARS2+100
 +
         LD A,1
 +
         LD (is_ts),A
 +
         SET 0,(IY-100+ModNum)
 +
        CALL INITPT2
 +
 
 +
NOTS2  LD BC,PT2PD
 +
        LD HL,#8687
 +
         LD DE,PT2EMPTYORN
 +
 
 +
INITCOMMON
 +
 
 +
        IFN Basic
 +
        LD IY,#5C3A
 +
        ENDIF
  
temp    LD A,3        ;temp
+
         LD (PTDEC),BC
         LD (int_qty),A
+
         LD (PsCalc),HL
NOINS
+
         PUSH DE
play_0 LD L,0        ;smp_sl_env
 
        EXX
 
N_add  LD IX,0        ;HX=noise LX=mix
 
         LD (sav_SP1+1),SP
 
E_ins0  JR Ei_Q
 
Esl_ids LD HL,0        ;stp_sld_env
 
        LD (Esl_sds+1),HL
 
Esl_ist LD A,0        ;stp_sld_p
 
         LD (Esl_stp+1),A
 
        LD (Esl_sts+1),A
 
        LD A,24
 
        LD (E_ins0),A
 
Ei_Q
 
;---- sampler_A ----
 
  
Avb_lok LD A,-1
+
;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 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
 +
 
         INC A
 
         INC A
         JP Z,Avb_n0
+
         LD (VARS1+DelyCnt),A
 +
        LD (VARS2+DelyCnt),A
 +
        LD HL,#F001 ;H - Volume, L - NtSkCn
 +
        LD (VARS1+ChanA+NtSkCn),HL
 +
        LD (VARS1+ChanB+NtSkCn),HL
 +
        LD (VARS1+ChanC+NtSkCn),HL
 +
        LD (VARS2+ChanA+NtSkCn),HL
 +
        LD (VARS2+ChanB+NtSkCn),HL
 +
        LD (VARS2+ChanC+NtSkCn),HL
 +
        POP HL
 +
        LD (VARS1+ChanA+OrnPtr),HL
 +
        LD (VARS1+ChanB+OrnPtr),HL
 +
        LD (VARS1+ChanC+OrnPtr),HL
 +
        LD (VARS2+ChanA+OrnPtr),HL
 +
        LD (VARS2+ChanB+OrnPtr),HL
 +
        LD (VARS2+ChanC+OrnPtr),HL
 +
 
 +
        POP AF
 +
 
 +
;NoteTableCreator (c) Ivan Roshin
 +
;A - NoteTableNumber*2+VersionForNoteTable
 +
;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
  
As_adr  LD SP,DUMMYSMP ;sample
+
         LD HL,NT_DATA
        POP DE         ;loop E=beg D=end
+
         LD D,0
As_dsp  LD A,0
 
        LD L,A
 
        INC A
 
        CP D
 
        JR C,As_n0    ;bug NZ/C
 
        LD A,E
 
As_n0  LD (As_dsp+1),A
 
      SLA L
 
      SLA L
 
      ;ADD HL,HL,HL,HL
 
        ADD HL,SP
 
         LD SP,HL
 
        POP DE ;D= Nm ts ns Tm v3 v2 v1 v0
 
        LD A,D ;E= sv +- N4 N3 N2 N1 N0 Em
 
      OR #F0
 
      ;AND 15
 
        LD L,A
 
        LD A,E
 
 
         ADD A,A
 
         ADD A,A
As_Vsl  LD A,16
+
         LD E,A
        JR NC,As_VslG
+
         ADD HL,DE
        JP M,As_n2
+
         LD E,(HL)
        SUB 1
+
         INC HL
        JR As_n3
 
As_n2  CP 31
 
As_n3  ADC A,0
 
         LD (As_Vsl+1),A
 
As_VslG
 
         ADD A,L
 
        JR C,As_n4
 
        XOR A
 
As_n4  CP 16
 
        JR C,Ag_vol
 
         LD A,15
 
Ag_vol  ADD A,#F0
 
         LD L,A
 
        LD H,'tab_vol
 
        LD A,(HL)
 
 
         SRL E
 
         SRL E
         JR C,Am_vo0
+
         SBC A,A
Am_vol  OR 0
+
        AND #A7 ;#00 (NOP) or #A7 (AND A)
Am_vo0  EXA
+
        LD (L3),A
         LD A,D
+
        EX DE,HL
      ;LD L,A
+
        LD BC,T1_
         RLCA
+
        ADD HL,BC
      ;LD H,A
+
 
         JR C,As_n5
+
         LD A,(DE)
As_Nsl LD A,0
+
        ADD A,T_
         ADD A,E
+
        LD C,A
         BIT 5,D
+
         ADC A,'T_
         JR Z,As_n6
+
        SUB C
         LD (As_Nsl+1),A
+
        LD B,A
As_n6  LD HX,A
+
         PUSH BC
         JR As_n7
+
        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 HX,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 HX
 +
         JR NZ,L2
  
As_n5  LD A,E
+
         POP DE
        AND 31
+
         INC DE
        CP 16
+
         INC DE
        JR C,As_Esl
+
         POP HL
        OR #F0
+
         INC HL
As_Esl  ADD A,0
 
        BIT 5,D
 
        JR Z,As_n9
 
         LD (As_Esl+1),A
 
As_n9  EXX
 
      ADD A,L
 
      LD L,A
 
      EXX
 
As_n7  LD A,D
 
        RLCA
 
      RLCA
 
         RLCA
 
         RLCA
 
         AND 9
 
         LD LX,A
 
 
         POP BC
 
         POP BC
      ;LD A,D
+
        DJNZ L1
As_dtn LD HL,0        ;dsp_frq_smp
+
 
 +
        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
 
         ADD HL,BC
      BIT 6,D
+
        POP AF
      ;AND 64
+
        JR NC,CORR_2
         JR Z,As_n10
+
        DEC (HL)
         LD (As_dtn+1),HL
+
        DEC (HL)
As_n10  EX DE,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
  
Ao_adr  LD SP,DUMMYORN ;ornament
 
        POP BC        ;loop C=beg B=end
 
Ao_dsp  LD A,0
 
        LD L,A
 
        INC A
 
        CP B
 
        JR C,$+3      ;bug NZ/C
 
        LD A,C
 
        LD (Ao_dsp+1),A
 
        LD H,0
 
        ADD HL,SP
 
        LD A,(As_note+1)
 
        ADD A,(HL)    ;dsp_orn
 
        ADD A,A
 
    JR NC,$+3
 
    XOR A
 
        LD L,A
 
        LD H,'tab_frq
 
        LD SP,HL
 
 
         POP HL
 
         POP HL
 +
        LD A,E
 +
        CP #77
 +
        JR NZ,M3
 +
        INC E
 +
M3      DEC C
 +
        JR NZ,INITV2
 +
 +
        JP ROUT
 +
 +
INITPT3 CALL SETMDAD
 +
        PUSH HL
 +
        LD DE,100
 
         ADD HL,DE
 
         ADD HL,DE
Asl_dsp LD BC,0
+
        LD A,(HL)
         ADD HL,BC
+
        LD (IY-100+Delay),A
_m3=$+2
+
        PUSH HL
         LD (frq_A),HL
+
        POP IX
 +
         ADD HL,DE
 +
        CALL SETCPPT
 +
        LD E,(IX+102-100)
 +
        INC HL
 +
 
 +
        IFN CurPosCounter
 +
         LD (IY-100+PosSub),L
 +
        ENDIF
 +
 
 +
        ADD HL,DE
 +
        CALL SETLPPT
 +
        POP DE
 +
        LD L,(IX+103-100)
 +
        LD H,(IX+104-100)
 +
        ADD HL,DE
 +
        CALL SETPTPT
 +
        LD HL,169
 +
        ADD HL,DE
 +
        CALL SETORPT
 +
        LD HL,105
 +
        ADD HL,DE
 +
 
 +
SETSMPT LD (IY-100+SamPtrs),L
 +
        LD (IY-100+SamPtrs+1),H
 +
        RET
  
Asl_stp LD A,0
+
INITPT2 LD A,(HL)
         DEC A
+
         LD (IY-100+Delay),A
         JP M,Asl_s0
+
         PUSH HL
         JR NZ,Asl_s1
+
         PUSH HL
Asl_tfr LD DE,0
+
        PUSH HL
      ADD HL,DE
+
        INC HL
      EX DE,HL
+
         INC HL
         ADD HL,BC
+
         LD A,(HL)
         LD (Asl_dsp+1),HL
+
        INC HL
         JR Asl_sts    ;port off/on
+
         CALL SETSMPT
Asl_plk
+
         LD E,(HL)
Asl_not LD A,0
+
         INC HL
         LD L,A
+
         LD D,(HL)
         ADD HL,HL
 
         LD H,'tab_frq
 
        LD SP,HL
 
 
         POP HL
 
         POP HL
As_note CP 0
+
         AND A
         JR NC,$+3
 
        EX DE,HL
 
 
         SBC HL,DE
 
         SBC HL,DE
         JR C,Asl_sts
+
         CALL SETMDAD
         LD (As_note+1),A
+
        POP HL
         XOR A
+
        LD DE,67
 +
        ADD HL,DE
 +
        CALL SETORPT
 +
        LD E,32
 +
        ADD HL,DE
 +
        LD C,(HL)
 +
        INC HL
 +
        LD B,(HL)
 +
        LD E,30
 +
        ADD HL,DE
 +
        CALL SETCPPT
 +
        LD E,A
 +
        INC HL
 +
 
 +
        IFN CurPosCounter
 +
        LD (IY-100+PosSub),L
 +
        ENDIF
 +
 
 +
        ADD HL,DE
 +
        CALL SETLPPT
 +
        POP HL
 +
         ADD HL,BC
 +
 
 +
SETPTPT LD (IY-100+PatsPtr),L
 +
        LD (IY-100+PatsPtr+1),H
 +
        RET
 +
 
 +
SETMDAD LD (IY-100+MODADDR),L
 +
        LD (IY-100+MODADDR+1),H
 +
        RET
 +
 
 +
SETORPT LD (IY-100+OrnPtrs),L
 +
        LD (IY-100+OrnPtrs+1),H
 +
        RET
 +
 
 +
SETCPPT LD (IY-100+CrPsPtr),L
 +
        LD (IY-100+CrPsPtr+1),H
 +
        RET
 +
 
 +
SETLPPT LD (IY-100+LPosPtr),L
 +
        LD (IY-100+LPosPtr+1),H
 +
        RET
 +
 
 +
SETENBS LD (IY-100+EnvBase),L
 +
        LD (IY-100+EnvBase+1),H
 +
        RET
 +
 
 +
SETESLD LD (IY-100+CurESld),L
 +
        LD (IY-100+CurESld+1),H
 +
        RET
 +
 
 +
GETIX  PUSH IY
 +
        POP IX
 +
        ADD IX,DE
 +
        RET
 +
 
 +
PTDECOD CALL GETIX
 +
PTDEC=$+1
 +
        JP #C3C3
 +
 
 +
;PT2 pattern decoder
 +
PD2_SAM CALL SETSAM
 +
        JR PD2_LOOP
 +
 
 +
PD2_EOff LD (IX-12+Env_En),A
 +
        JR PD2_LOOP
 +
 
 +
PD2_ENV LD (IX-12+Env_En),16
 +
        LD (IY-100+AYREGS+EnvTp),A
 +
         LD A,(BC)
 +
        INC BC
 
         LD L,A
 
         LD L,A
         LD (Asl_dsp+1),HL
+
         LD A,(BC)
         JR $+4
+
        INC BC
Asl_sts LD A,0
+
        LD H,A
Asl_s1  LD (Asl_stp+1),A
+
        CALL SETENBS
Asl_s0  EXA
+
        JR PD2_LOOP
 +
 
 +
PD2_ORN CALL SETORN
 +
         JR PD2_LOOP
 +
 
 +
PD2_SKIP INC A
 +
        LD (IX-12+NNtSkp),A
 +
        JR PD2_LOOP
 +
 
 +
PD2_VOL RRCA
 +
        RRCA
 +
        RRCA
 +
        RRCA
 +
        LD (IX-12+Volume),A
 +
        JR PD2_LOOP
  
_m7=$+2
+
PD2_DEL CALL C_DELAY
Avb_n0  LD (vol_A),A
+
        JR PD2_LOOP
Avb_stp LD A,0
+
 
         DEC A
+
PD2_GLIS SET 2,(IX-12+Flags)
         JP M,Bvb_lok
+
         INC A
         JR NZ,Avb_n1
+
         LD (IX-12+TnSlDl),A
        DEC A         ;;
+
         LD (IX-12+TSlCnt),A
         LD HL,Avb_lok+1;;
+
         LD A,(BC)
         XOR (HL)      ;;
+
         INC BC
         LD (HL),A     ;;4
+
         LD (IX-12+TSlStp),A
Avb_frq LD A,0
+
        ADD A,A
         JR NZ,Avb_n1
+
         SBC A,A
Avb_sts LD A,0
+
        LD (IX-12+TSlStp+1),A
Avb_n1  LD (Avb_stp+1),A
+
        SCF
 +
        JR PD2_LP2
 +
 
 +
PT2PD  AND A
  
;---- sampler_B ----
+
PD2_LP2 EXA
  
Bvb_lok LD A,-1
+
PD2_LOOP LD A,(BC)
         LD H,A
+
         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
 
         INC A
         JP Z,Bvb_n0
+
         JR Z,PD2_STOP
 +
        LD A,(BC)
 +
        INC BC
 +
        LD (IX-12+CrNsSl),A
 +
        JR PD2_LOOP
 +
 
 +
PD2_PORT RES 2,(IX-12+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+TSlCnt),A
 +
        JR PD2_LOOP
 +
 
 +
PD2_REL LD (IX-12+Flags),A
 +
        JR PD2_EXIT
  
Bs_adr  LD SP,DUMMYSMP
+
PD2_NOTE LD L,A
         POP DE
+
         LD A,(IX-12+Note)
Bs_dsp  LD A,0
+
        LD (PrNote+1),A
 +
        LD (IX-12+Note),L
 +
        XOR A
 +
        LD (IX-12+TSlCnt),A
 +
        SET 0,(IX-12+Flags)
 +
        EXA
 +
        JR NC,NOGLIS2
 +
        BIT 2,(IX-12+Flags)
 +
        JR NZ,NOPORT2
 +
        LD (LoStep),A
 +
        ADD A,A
 +
        SBC A,A
 +
        EXA
 +
        LD H,A
 
         LD L,A
 
         LD L,A
 
         INC A
 
         INC A
         CP D
+
         CALL SETPORT
         JR C,Bs_n0
+
NOPORT2 LD (IX-12+TSlCnt),1
         LD A,E
+
NOGLIS2 XOR A
Bs_n0   LD (Bs_dsp+1),A
+
 
      SLA L
+
 
      SLA L
+
PD2_EXIT LD (IX-12+PsInSm),A
      ;ADD HL,HL,HL,HL
+
        LD (IX-12+PsInOr),A
         ADD HL,SP
+
        LD (IX-12+CrTnSl),A
         LD SP,HL
+
        LD (IX-12+CrTnSl+1),A
         POP DE
+
        JP PD_FIN
         LD A,D
+
 
      OR #F0
+
;PT3 pattern decoder
      ;AND 15
+
PD_OrSm LD (IX-12+Env_En),0
         LD L,A
+
        CALL SETORN
         LD A,E
+
PD_SAM_ LD A,(BC)
 +
        INC BC
 +
        RRCA
 +
 
 +
PD_SAM  CALL SETSAM
 +
        JR PD_LOOP
 +
 
 +
PD_VOL  RRCA
 +
        RRCA
 +
        RRCA
 +
        RRCA
 +
        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
 +
        JR PD_SAM_
 +
 
 +
PT3PD   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
 
         ADD A,A
Bs_Vsl  LD A,16
+
        LD E,A
         JR NC,Bs_VslG
+
        LD HL,SPCCOMS+#FF20-#2000
         JP M,Bs_n2
+
         ADD HL,DE
         SUB 1
+
         LD E,(HL)
         JR Bs_n3
+
         INC HL
Bs_n2  CP 31
+
        LD D,(HL)
Bs_n3  ADC A,0
+
        PUSH DE
         LD (Bs_Vsl+1),A
+
         JR PD_LOOP
Bs_VslG
+
 
         ADD A,L
+
PD_NOIS LD (IY-100+Ns_Base),A
        JR C,Bs_n4
+
        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
 
         XOR A
Bs_n4  CP 16
+
 
         JR C,Bg_vol
+
PD_RES  LD (PDSP_+1),SP
         LD A,15
+
         LD SP,IX
Bg_vol  ADD A,#F0
+
         LD H,A
 
         LD L,A
 
         LD L,A
         LD H,'tab_vol
+
         PUSH HL
         LD A,(HL)
+
        PUSH HL
         SRL E
+
        PUSH HL
         JR C,Bm_vo0
+
        PUSH HL
Bm_vol  OR 0
+
        PUSH HL
Bm_vo0  EXA  
+
        PUSH HL
         LD A,D
+
PDSP_  LD SP,#3131
      ;LD L,A
+
 
         RLCA
+
PD_FIN  LD A,(IX-12+NNtSkp)
      ;LD H,A
+
        LD (IX-12+NtSkCn),A
         JR C,Bs_n5
+
         RET
Bs_Nsl  LD A,0
+
 
         ADD A,E
+
C_PORTM LD A,(BC)
         BIT 5,D
+
         INC BC
         JR Z,Bs_n6
+
;SKIP PRECALCULATED TONE DELTA (BECAUSE
         LD (Bs_Nsl+1),A
+
;CANNOT BE RIGHT AFTER PT3 COMPILATION)
Bs_n6  LD HX,A
+
         INC BC
        JR Bs_n7
+
        INC BC
 +
        EXA  
 +
         LD A,(BC) ;SIGNED TONE STEP
 +
         INC BC
 +
        LD (LoStep),A
 +
         LD A,(BC)
 +
        INC BC
 +
         AND A
 +
         EXA
 +
         LD L,(IX-12+CrTnSl)
 +
         LD H,(IX-12+CrTnSl+1)
  
Bs_n5  LD A,E
+
;Set portamento variables
        AND 31
+
;A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl
        CP 16
 
        JR C,Bs_Esl
 
        OR #F0
 
Bs_Esl  ADD A,0
 
        BIT 5,D
 
        JR Z,Bs_n9
 
        LD (Bs_Esl+1),A
 
Bs_n9  EXX
 
      ADD A,L
 
      LD L,A
 
      EXX
 
Bs_n7  LD A,D
 
      RRCA
 
      RRCA
 
      RRCA
 
        AND 18
 
        OR LX
 
        LD LX,A
 
        POP BC
 
      ;LD A,D
 
Bs_dtn  LD HL,0
 
        ADD HL,BC
 
      BIT 6,D
 
      ;AND 64
 
        JR Z,Bs_n10
 
        LD (Bs_dtn+1),HL
 
Bs_n10  EX DE,HL
 
  
Bo_adr  LD SP,DUMMYORN
+
SETPORT RES 2,(IX-12+Flags)
         POP BC
+
        LD (IX-12+TnSlDl),A
Bo_dsp  LD A,0
+
        LD (IX-12+TSlCnt),A
 +
        PUSH HL
 +
        LD DE,NT_
 +
         LD A,(IX-12+Note)
 +
        LD (IX-12+SlToNt),A
 +
        ADD A,A
 
         LD L,A
 
         LD L,A
        INC A
 
        CP B
 
        JR C,Bo_n0
 
        LD A,C
 
Bo_n0  LD (Bo_dsp+1),A
 
 
         LD H,0
 
         LD H,0
         ADD HL,SP
+
         ADD HL,DE
         LD A,(Bs_note+1)
+
         LD A,(HL)
         ADD A,(HL)
+
        INC HL
 +
        LD H,(HL)
 +
         LD L,A
 +
        PUSH HL
 +
PrNote  LD A,#3E
 +
        LD (IX-12+Note),A
 
         ADD A,A
 
         ADD A,A
    JR NC,$+3
 
    XOR A
 
 
         LD L,A
 
         LD L,A
         LD H,'tab_frq
+
         LD H,0
        LD SP,HL
 
        POP HL
 
 
         ADD HL,DE
 
         ADD HL,DE
Bsl_dsp LD BC,0
+
        LD E,(HL)
        ADD HL,BC
+
         INC HL
_m5=$+2
+
         LD D,(HL)
        LD (frq_B),HL
 
 
 
Bsl_stp LD A,0
 
        DEC A
 
        JP M,Bsl_s0
 
        JR NZ,Bsl_s1
 
Bsl_tfr LD DE,0
 
      ADD HL,DE
 
      EX DE,HL
 
        ADD HL,BC
 
        LD (Bsl_dsp+1),HL
 
        JR Bsl_sts
 
Bsl_plk
 
Bsl_not LD A,0
 
        LD L,A
 
         ADD HL,HL
 
         LD H,'tab_frq
 
        LD SP,HL
 
 
         POP HL
 
         POP HL
Bs_note CP 0
+
        SBC HL,DE
         JR NC,$+3
+
        LD (IX-12+TnDelt),L
 +
        LD (IX-12+TnDelt+1),H
 +
        POP DE
 +
Version=$+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
 +
LoStep=$+1
 +
OLDPRTM LD A,#3E
 +
        EXA
 +
        JR Z,NOSIG
 
         EX DE,HL
 
         EX DE,HL
        SBC HL,DE
+
NOSIG  SBC HL,DE
         JR C,Bsl_sts
+
        JP P,SET_STP
         LD (Bs_note+1),A
+
        CPL
 +
        EXA
 +
        NEG
 +
        EXA
 +
SET_STP LD (IX-12+TSlStp+1),A
 +
        EXA
 +
        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
 +
        EXA
 +
        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
 
         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 (IY-100+Env_Del),A
 +
        LD (IY-100+CurEDel),A
 +
        LD A,(BC)
 +
        INC BC
 
         LD L,A
 
         LD L,A
         LD (Bsl_dsp+1),HL
+
         LD A,(BC)
         JR $+4
+
         INC BC
Bsl_sts LD A,0
+
        LD H,A
Bsl_s1  LD (Bsl_stp+1),A
+
        LD (IY-100+ESldAdd),L
Bsl_s0  EXA
+
        LD (IY-100+ESldAdd+1),H
 +
        RET
  
_m8=$+2
+
C_DELAY LD A,(BC)
Bvb_n0  LD (vol_B),A
+
         INC BC
Bvb_stp LD A,0
+
         LD (IY-100+Delay),A
         DEC A
+
         LD HL,VARS2+ModNum ;if AlCo_TS
         JP M,Cvb_lok
+
         BIT 1,(HL)
        JR NZ,Bvb_n1
+
        RET Z
        DEC A         ;;
+
         LD (VARS1+Delay),A
         LD HL,Bvb_lok+1;;
+
        LD (VARS1+DelyCnt),A
         XOR (HL)       ;;
+
         LD (VARS2+Delay),A
         LD (HL),A     ;;4
+
        RET
Bvb_frq LD A,0
 
         JR NZ,Bvb_n1
 
Bvb_sts LD A,0
 
Bvb_n1  LD (Bvb_stp+1),A
 
 
 
;---- sampler_C ----
 
  
Cvb_lok LD A,-1
+
SETENV  LD (IX-12+Env_En),E
 +
        LD (IY-100+AYREGS+EnvTp),A
 +
        LD A,(BC)
 +
        INC BC
 
         LD H,A
 
         LD H,A
        INC A
+
         LD A,(BC)
        JP Z,Cvb_n0
+
         INC BC
 
 
Cs_adr  LD SP,DUMMYSMP
 
        POP DE
 
Cs_dsp  LD A,0
 
        LD L,A
 
        INC A
 
        CP D
 
        JR C,Cs_n0
 
         LD A,E
 
Cs_n0  LD (Cs_dsp+1),A
 
      SLA L
 
      SLA L
 
      ;ADD HL,HL,HL,HL
 
         ADD HL,SP
 
        LD SP,HL
 
        POP DE
 
        LD A,D
 
      OR #F0
 
      ;AND 15
 
 
         LD L,A
 
         LD L,A
         LD A,E
+
         CALL SETENBS
        ADD A,A
 
Cs_Vsl  LD A,16
 
        JR NC,Cs_VslG
 
        JP M,Cs_n2
 
        SUB 1
 
        JR Cs_n3
 
Cs_n2  CP 31
 
Cs_n3  ADC A,0
 
        LD (Cs_Vsl+1),A
 
Cs_VslG
 
        ADD A,L
 
        JR C,Cs_n4
 
 
         XOR A
 
         XOR A
Cs_n4  CP 16
+
        LD (IX-12+PsInOr),A
         JR C,Cg_vol
+
         LD (IY-100+CurEDel),A
         LD A,15
+
         LD H,A
Cg_vol  ADD A,#F0
 
 
         LD L,A
 
         LD L,A
         LD H,'tab_vol
+
        JP SETESLD
         LD A,(HL)
+
 
         SRL E
+
SETORN  ADD A,A
         JR C,Cm_vo0
+
        LD E,A
Cm_vol  OR 0
+
         LD D,0
Cm_vo0  EXA
+
        LD (IX-12+PsInOr),D
         LD A,D
+
         LD L,(IY-100+OrnPtrs)
      ;LD L,A
+
         LD H,(IY-100+OrnPtrs+1)
         RLCA
+
         ADD HL,DE
      ;LD H,A
+
        LD E,(HL)
         JR C,Cs_n5
+
        INC HL
Cs_Nsl  LD A,0
+
         LD D,(HL)
         ADD A,E
+
        LD L,(IY-100+MODADDR)
         BIT 5,D
+
        LD H,(IY-100+MODADDR+1)
         JR Z,Cs_n6
+
        ADD HL,DE
         LD (Cs_Nsl+1),A
+
         LD (IX-12+OrnPtr),L
Cs_n6  LD HX,A
+
        LD (IX-12+OrnPtr+1),H
         JR Cs_n7
+
C_NOP  RET
 +
 
 +
SETSAM  ADD A,A
 +
         LD E,A
 +
        LD D,0
 +
        LD L,(IY-100+SamPtrs);
 +
        LD H,(IY-100+SamPtrs+1);
 +
         ADD HL,DE
 +
        LD E,(HL)
 +
         INC HL
 +
        LD D,(HL)
 +
         LD L,(IY-100+MODADDR)
 +
         LD H,(IY-100+MODADDR+1)
 +
        ADD HL,DE
 +
        LD (IX-12+SamPtr),L
 +
        LD (IX-12+SamPtr+1),H
 +
         RET
  
Cs_n5  LD A,E
+
;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
        AND 31
+
SPCCOMS DW C_NOP
         CP 16
+
         DW C_GLISS
         JR C,Cs_Esl
+
         DW C_PORTM
         OR #F0
+
         DW C_SMPOS
Cs_Esl  ADD A,0
+
         DW C_ORPOS
         BIT 5,D
+
         DW C_VIBRT
         JR Z,Cs_n9
+
         DW C_NOP
         LD (Cs_Esl+1),A
+
         DW C_NOP
Cs_n9  EXX
+
         DW C_ENGLS
      ADD A,L
+
         DW C_DELAY
      LD L,A
+
         DW C_NOP
      EXX
+
         DW C_NOP
Cs_n7  LD A,D
+
         DW C_NOP
         RRCA
+
         DW C_NOP
         RRCA
+
         DW C_NOP
      ;RRCA
+
         DW C_NOP
         AND 36
 
         OR LX
 
         LD LX,A
 
         POP BC
 
      ;LD A,D
 
Cs_dtn  LD HL,0
 
         ADD HL,BC
 
      BIT 6,D
 
      ;AND 64
 
         JR Z,Cs_n10
 
         LD (Cs_dtn+1),HL
 
Cs_n10  EX DE,HL
 
  
Co_adr LD SP,DUMMYORN
+
CHREGS CALL GETIX
         POP BC
+
        XOR A
Co_dsp  LD A,0
+
        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
 
         LD L,A
 +
        ADD HL,SP
 
         INC A
 
         INC A
         CP B
+
                ;PT2    PT3
         JR C,Co_n0
+
OrnCP  INC A  ;CP E  CP D
         LD A,C
+
        JR C,CH_ORPS
Co_n0  LD (Co_dsp+1),A
+
OrnLD  DB 1    ;LD A,D 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
 +
        EXA
 +
        LD L,(IX+SamPtr)
 +
        LD H,(IX+SamPtr+1)
 +
        LD SP,HL
 +
        POP DE
 
         LD H,0
 
         LD H,0
        ADD HL,SP
+
         LD A,(IX+PsInSm)
         LD A,(Cs_note+1)
+
         LD B,A
         ADD A,(HL)
 
 
         ADD A,A
 
         ADD A,A
    JR NC,$+3
+
SamClc2 ADD A,A ;or ADD A,B for PT2
    XOR A
 
 
         LD L,A
 
         LD L,A
         LD H,'tab_frq
+
         ADD HL,SP
 
         LD SP,HL
 
         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+PsInSm),A
 +
        POP BC
 +
        POP HL
 +
 +
;Convert PT2 sample to PT3
 +
                ;PT2            PT3
 +
SamCnv  POP HL  ;BIT 2,C        JR e_
 
         POP HL
 
         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+TnAcc)
 +
        LD D,(IX+TnAcc+1)
 
         ADD HL,DE
 
         ADD HL,DE
Csl_dsp LD BC,0
+
        BIT 6,B
         ADD HL,BC
+
         JR Z,CH_NOAC
_m6=$+2
+
         LD (IX+TnAcc),L
         LD (frq_C),HL
+
         LD (IX+TnAcc+1),H
 
+
CH_NOAC EX DE,HL
Csl_stp LD A,0
+
         EXA
        DEC A
+
         ADD A,NT_
         JP M,Csl_s0
 
        JR NZ,Csl_s1
 
Csl_tfr LD DE,0
 
      ADD HL,DE
 
      EX DE,HL
 
         ADD HL,BC
 
         LD (Csl_dsp+1),HL
 
        JR Csl_sts
 
Csl_plk
 
Csl_not LD A,0
 
 
         LD L,A
 
         LD L,A
         ADD HL,HL
+
         ADC A,'NT_
         LD H,'tab_frq
+
        SUB L
 +
         LD H,A
 
         LD SP,HL
 
         LD SP,HL
 
         POP HL
 
         POP HL
Cs_note CP 0
+
        ADD HL,DE
         JR NC,$+3
+
        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
 
         EX DE,HL
        SBC HL,DE
+
CH_STPP SBC HL,DE
         JR C,Csl_sts
+
        JP M,CH_AMP
         LD (Cs_note+1),A
+
        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
 
         XOR A
 +
CH_APOS CP 16
 +
        JR C,CH_VOL
 +
        LD A,15
 +
CH_VOL  OR (IX+Volume)
 +
        ADD A,VT_
 
         LD L,A
 
         LD L,A
         LD (Csl_dsp+1),HL
+
        ADC A,'VT_
         JR $+4
+
        SUB L
Csl_sts LD A,0
+
         LD H,A
Csl_s1 LD (Csl_stp+1),A
+
        LD A,(HL)
Csl_s0  EXA
+
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 ADD A,(IY-100+AddToEn) ;BUG IN PT3 - NEED WORD HERE
 +
        LD (IY-100+AddToEn),A
 +
        JR CH_MIX
 +
NO_ENSL RRA
 +
        ADD A,(IX+CrNsSl)
 +
        LD (IY-100+AddToNs),A
 +
        BIT 5,B
 +
        JR Z,CH_MIX
 +
        LD (IX+CrNsSl),A
 +
CH_MIX LD A,B
 +
        RRA
 +
        AND #48
 +
CH_EXIT OR (IY-100+AYREGS+Mixer)
 +
        RRCA
 +
        LD (IY-100+AYREGS+Mixer),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
  
_m9=$+2
+
PLAY_  XOR A
Cvb_n0  LD (vol_C),A
+
        LD (IY-100+AddToEn),A
Cvb_stp LD A,0
+
        LD (IY-100+AYREGS+Mixer),A
 
         DEC A
 
         DEC A
         JP M,Esl_
+
         LD (IY-100+AYREGS+EnvTp),A
         JR NZ,Cvb_n1
+
        DEC (IY-100+DelyCnt)
         DEC A          ;;
+
         JP NZ,PL2
         LD HL,Cvb_lok+1;;
+
         DEC (IY-100+ChanA+NtSkCn)
         XOR (HL)       ;;
+
        JR NZ,PL1B
         LD (HL),A      ;;4
+
         LD C,(IY-100+AdInPtA)
Cvb_frq LD A,0
+
         LD B,(IY-100+AdInPtA+1)
         JR NZ,Cvb_n1
+
         LD A,(BC)
Cvb_sts LD A,0
+
        AND A
Cvb_n1  LD (Cvb_stp+1),A
+
         JR NZ,PL1A
 +
        LD D,A
 +
        LD (IY-100+Ns_Base),A
 +
        LD L,(IY-100+CrPsPtr)
 +
        LD H,(IY-100+CrPsPtr+1)
 +
        INC HL
 +
        LD A,(HL)
 +
        INC A
 +
        JR NZ,PLNLP
 +
 
 +
        IFN LoopChecker
 +
        CALL CHECKLP
 +
        ENDIF
  
;---- sampler_E ----
+
        LD L,(IY-100+LPosPtr)
 +
        LD H,(IY-100+LPosPtr+1)
 +
        LD A,(HL)
 +
        INC A
 +
PLNLP  CALL SETCPPT
 +
        DEC A
 +
        BIT 1,(IY-100+ModNum)
 +
        JR Z,NoAlCo
 +
TSSub=$+1
 +
        SUB #D6
 +
        CPL
 +
NoAlCo
 +
                ;PT2            PT3
 +
PsCalc  DEC A  ;ADD A,A        NOP
 +
        DEC A  ;ADD A,(HL)    NOP
 +
        ADD A,A
 +
        LD E,A
 +
        RL D
  
Esl_    EXX
+
        IFN CurPosCounter
 
         LD A,L
 
         LD A,L
Esl_frq LD DE,0        ;stp_sl_env
+
        SUB (IY-100+PosSub)
E_frq  LD HL,0        ;frq_env
+
        LD (IY-100+CurPos),A
         ADD A,L
+
        ENDIF
         LD L,A
+
 
 +
        LD L,(IY-100+PatsPtr)
 +
        LD H,(IY-100+PatsPtr+1)
 +
        ADD HL,DE
 +
        LD E,(IY-100+MODADDR)
 +
        LD D,(IY-100+MODADDR+1)
 +
        LD (PSP_+1),SP
 +
        LD SP,HL
 +
        POP HL
 +
        ADD HL,DE
 +
         LD B,H
 +
         LD C,L
 +
        POP HL
 
         ADD HL,DE
 
         ADD HL,DE
_m10=$+2
+
         LD (IY-100+AdInPtB),L
         LD (frq_E),HL
+
        LD (IY-100+AdInPtB+1),H
Esl_stp LD A,0
+
         POP HL
        DEC A
 
         JP M,sav_SP1
 
        JR NZ,E_n0
 
Esl_sds LD HL,0
 
 
         ADD HL,DE
 
         ADD HL,DE
         LD (Esl_frq+1),HL
+
         LD (IY-100+AdInPtC),L
Esl_sts LD A,0
+
        LD (IY-100+AdInPtC+1),H
E_n0   LD (Esl_stp+1),A
+
PSP_    LD SP,#3131
 +
PL1A   LD DE,ChanA+12-100
 +
        CALL PTDECOD
 +
        LD (IY-100+AdInPtA),C
 +
        LD (IY-100+AdInPtA+1),B
  
;---- out_to_processor ----
+
PL1B    DEC (IY-100+ChanB+NtSkCn)
 +
        JR NZ,PL1C
 +
        LD DE,ChanB+12-100
 +
        LD C,(IY-100+AdInPtB)
 +
        LD B,(IY-100+AdInPtB+1)
 +
        CALL PTDECOD
 +
        LD (IY-100+AdInPtB),C
 +
        LD (IY-100+AdInPtB+1),B
  
sav_SP1 LD SP,0
+
PL1C    DEC (IY-100+ChanC+NtSkCn)
out_
+
        JR NZ,PL1D
         LD DE,#FFBF
+
         LD DE,ChanC+12-100
         LD C,-3
+
         LD C,(IY-100+AdInPtC)
_m4=$+2
+
        LD B,(IY-100+AdInPtC+1)
         LD HL,frq_A
+
        CALL PTDECOD
 +
         LD (IY-100+AdInPtC),C
 +
        LD (IY-100+AdInPtC+1),B
  
        LD A,7
+
PL1D    LD A,(IY-100+Delay)
         CALL OUTER
+
         LD (IY-100+DelyCnt),A
  
         LD A,HX        ;noise
+
PL2    LD DE,ChanA-100
         LD (N_add+3),A
+
        LD L,(IY-100+AYREGS+TonA)
         ADD A,(HL)
+
        LD H,(IY-100+AYREGS+TonA+1)
         OUT (C),A
+
        CALL CHREGS
         INC L
+
        LD (IY-100+AYREGS+TonA),L
         LD B,D
+
        LD (IY-100+AYREGS+TonA+1),H
         OUT (C),L
+
Ampl=$+1
         LD A,LX        ;mix
+
         LD A,#3E
         LD B,E
+
         LD (IY-100+AYREGS+AmplA),A
         OUT (C),A
+
         LD DE,ChanB-100
        INC L
+
        LD L,(IY-100+AYREGS+TonB)
 +
        LD H,(IY-100+AYREGS+TonB+1)
 +
        CALL CHREGS
 +
        LD (IY-100+AYREGS+TonB),L
 +
        LD (IY-100+AYREGS+TonB+1),H
 +
        LD A,(Ampl)
 +
         LD (IY-100+AYREGS+AmplB),A
 +
         LD DE,ChanC-100
 +
        LD L,(IY-100+AYREGS+TonC)
 +
         LD H,(IY-100+AYREGS+TonC+1)
 +
        CALL CHREGS
 +
         LD (IY-100+AYREGS+TonC),L
 +
         LD (IY-100+AYREGS+TonC+1),H
 +
         LD A,(Ampl)
 +
         LD (IY-100+AYREGS+AmplC),A
  
         LD A,6
+
         LD A,(IY-100+Ns_Base)
         CALL OUTER
+
         ADD A,(IY-100+AddToNs)
 +
        LD (IY-100+AYREGS+Noise),A
  
         OR (HL)
+
         LD A,(IY-100+AddToEn)
      RET Z
+
        LD E,A
         OUT (C),A
+
        ADD A,A
         LD (HL),0 ;;4
+
        SBC A,A
      RET
+
         LD D,A
 
+
         LD L,(IY-100+EnvBase)
;--- nota_A ---
+
        LD H,(IY-100+EnvBase+1)
 +
        ADD HL,DE
 +
        LD E,(IY-100+CurESld)
 +
        LD D,(IY-100+CurESld+1)
 +
        ADD HL,DE
 +
        LD (IY-100+AYREGS+Env),L
 +
        LD (IY-100+AYREGS+Env+1),H
  
Ani_vol JR NZ,Ani_v0
 
        LD (Avb_stp+1),A
 
        DEC A
 
        LD (Avb_lok+1),A
 
        RET
 
Ani_v0
 
      DUP 4
 
      ADD A,A
 
      EDUP
 
        LD (Ag_vol+1),A
 
      JP  An_clc2
 
Ani_s_o
 
      CALL ornPP
 
      LD (Ao_adr+1),BC
 
Ani_vse
 
      CALL NZ,EiPP
 
Ani_sm0 LD (Am_vol+1),A
 
 
         XOR A
 
         XOR A
         LD (Ao_dsp+1),A
+
         OR (IY-100+CurEDel)
         LD A,(DE)
+
         RET Z
         INC DE
+
        DEC (IY-100+CurEDel)
      JR Anism0U ;
+
         RET NZ
Ani_smp RET Z    ;
+
         LD A,(IY-100+Env_Del)
         ADD A,A   ;
+
        LD (IY-100+CurEDel),A
Anism0U
+
        LD L,(IY-100+ESldAdd)
      CALL smpPP
+
         LD H,(IY-100+ESldAdd+1)
         LD (As_adr+1),BC
+
        ADD HL,DE
 +
        JP SETESLD
  
An_clc1 LD BC,#1020
+
PLAY    LD IY,VARS1+100
An_clc2 LD A,(DE)
+
        CALL PLAY_
         INC DE
+
        LD A,(is_ts)
        ADD A,B
+
         AND A
         JR C,Ani_s_o
+
         JR Z,PL_nts
         ADD A,C
+
         LD IY,VARS2+100
         JR C,Ani_smp
+
         CALL PLAY_
        ADD A,B
+
PL_nts
        JR C,Ani_vol
+
         IFN Basic
        ADD A,B
+
         LD IY,#5C3A
        JR C,Ani_vqe
+
         ENDIF
        ADD A,96
 
        JR C,Ani_not
 
        ADD A,B
 
         JR C,Ani_orn
 
        ADD A,48
 
        JR C,Ani_vse
 
         LD HL,A_eff+30
 
         LD BC,As_note+1
 
      CALL NPUSH
 
        JR An_clc1
 
  
Ani_vqe JR Z,Ani_v1
+
ROUT    LD BC,#FFFD
         DEC A
+
        LD A,(is_ts)
         JR NZ,Ani_e0
+
         AND A
         LD A,(DE)
+
         JR Z,r_nts
         LD (Ai_qty+1),A
+
        IF0 ?ONtfm
         INC DE
+
         LD L,#F9
        JR An_clc2
+
        OUT (C),L
 +
         ELSE
 +
        OUT (C),B
 +
         ENDIF
 +
r_nts  EXA
  
Ani_e0 CALL EiPP
+
        IFN ACBBAC
Ani_v1  LD (Am_vol+1),A
+
        LD IX,VARS1+AYREGS
         JR An_clc2
+
         ELSE
Ani_orn
+
        LD HL,VARS1+AYREGS
      CALL ornPP
+
         ENDIF
      LD (Ao_adr+1),BC
 
        LD (Ao_dsp+1),A
 
         JR An_clc1
 
  
Ani_not LD (As_note+1),A
+
         CALL ROUT_
         XOR A
+
         EXA
         LD H,A
+
         RET Z
         LD L,A
+
         LD B,D
         LD (As_dsp+1),A
+
         IF0 ?ONtfm
         LD (As_Nsl+1),A
+
         LD A,#F8
         LD (As_Esl+1),A
+
         ELSE
        LD (Ao_dsp+1),A
+
         CPL
         LD (Asl_stp+1),A
+
         ENDIF
         LD (Avb_lok+1),A
+
         OUT (C),A
         LD (Avb_stp+1),A
 
      ;LD (Asl_dsp+1),HL
 
         LD (As_dtn+1),HL
 
      LD A,16
 
      LD (As_Vsl+1),A
 
      ;JR LDB1
 
        LD B,1
 
        RET
 
  
;--- nota_B ---
+
        IFN ACBBAC
 +
        LD IX,VARS2+AYREGS
 +
        ELSE
 +
        LD HL,VARS2+AYREGS
 +
        ENDIF
  
Bni_vol JR NZ,Bni_v0
+
ROUT_
         LD (Bvb_stp+1),A
+
        IFN ACBBAC
         DEC A
+
         LD A,(SETUP)
         LD (Bvb_lok+1),A
+
         AND 12
         RET
+
         JR Z,ABC
Bni_v0
+
         ADD A,CHTABLE
      DUP 4
+
         LD E,A
      ADD A,A
+
        ADC A,'CHTABLE
      EDUP
+
        SUB E
         LD (Bg_vol+1),A
+
        LD D,A
      JP  Bn_clc2
+
        LD B,0
Bni_s_o
+
         PUSH IX
      CALL ornPP
+
         POP HL
      LD (Bo_adr+1),BC
 
Bni_vse
 
      CALL NZ,EiPP
 
Bni_sm0 LD (Bm_vol+1),A
 
         XOR A
 
         LD (Bo_dsp+1),A
 
 
         LD A,(DE)
 
         LD A,(DE)
 
         INC DE
 
         INC DE
      JR Bnism0U ;
+
        LD C,A
Bni_smp RET Z    ;
+
        ADD HL,BC
         ADD A,A   ;
+
         LD A,(IX+TonB)
Bnism0U
+
        LD C,(HL)
      CALL smpPP
+
        LD (IX+TonB),C
         LD (Bs_adr+1),BC
+
        LD (HL),A
 
+
        INC HL
Bn_clc1 LD BC,#1020
+
        LD A,(IX+TonB+1)
Bn_clc2 LD A,(DE)
+
        LD C,(HL)
 +
         LD (IX+TonB+1),C
 +
        LD (HL),A
 +
        LD A,(DE)
 
         INC DE
 
         INC DE
         ADD A,B
+
         LD C,A
        JR C,Bni_s_o
+
         ADD HL,BC
        ADD A,C
+
         LD A,(IX+AmplB)
        JR C,Bni_smp
+
         LD C,(HL)
        ADD A,B
+
         LD (IX+AmplB),C
        JR C,Bni_vol
+
         LD (HL),A
        ADD A,B
 
        JR C,Bni_vqe
 
         ADD A,96
 
        JR C,Bni_not
 
        ADD A,B
 
        JR C,Bni_orn
 
        ADD A,C
 
        JR C,Bni_noi
 
        ADD A,B
 
        JR C,Bni_vse
 
        LD HL,B_eff+30
 
        LD BC,Bs_note+1
 
      CALL NPUSH
 
         JR Bn_clc1
 
 
 
Bni_not LD (Bs_note+1),A
 
        XOR A
 
        LD H,A
 
        LD L,A
 
        LD (Bs_dsp+1),A
 
         LD (Bs_Nsl+1),A
 
        LD (Bs_Esl+1),A
 
         LD (Bo_dsp+1),A
 
        LD (Bsl_stp+1),A
 
        LD (Bvb_lok+1),A
 
        LD (Bvb_stp+1),A
 
      ;LD (Bsl_dsp+1),HL
 
         LD (Bs_dtn+1),HL
 
      LD A,16
 
      LD (Bs_Vsl+1),A
 
LDB1  LD B,1
 
        RET
 
 
 
_m2=$+2
 
Bni_noi LD (N_frq),A;GLOBALnoise
 
        JR Bn_clc2
 
 
 
Bni_vqe JR Z,Bni_v1
 
        DEC A
 
        JR NZ,Bni_e0
 
 
         LD A,(DE)
 
         LD A,(DE)
        LD (Bi_qty+1),A
 
 
         INC DE
 
         INC DE
         JR Bn_clc2
+
         LD (RxCA1),A
 +
        XOR 8
 +
        LD (RxCA2),A
 +
        LD A,(DE)
 +
        AND (IX+Mixer)
 +
        LD E,A
 +
        LD A,(IX+Mixer)
 +
RxCA1  DB #E6
 +
        AND %010010
 +
        OR E
 +
        LD E,A
 +
        LD A,(IX+Mixer)
 +
        AND %010010
 +
RxCA2  OR E
 +
        OR E
 +
        LD (IX+Mixer),A
 +
ABC
 +
        ENDIF
  
Bni_e0 CALL EiPP
+
        XOR A
Bni_v1  LD (Bm_vol+1),A
+
         LD DE,#FFBF
        JR Bn_clc2
 
Bni_orn
 
      CALL ornPP
 
      LD (Bo_adr+1),BC
 
         LD (Bo_dsp+1),A
 
        JR Bn_clc1
 
  
;--- nota_C ---
+
        IFN ACBBAC
 +
        LD BC,#FFFD
 +
        PUSH IX
 +
        POP HL
 +
        ENDIF
  
Cni_not LD (Cs_note+1),A
+
LOUT
         XOR A
+
      IF0 ?ONtfm
         LD H,A
+
        INF
         LD L,A
+
        JP M,$-2
         LD (Cs_dsp+1),A
+
      ENDIF
         LD (Cs_Nsl+1),A
+
        OUT (C),A
         LD (Cs_Esl+1),A
+
      IF0 ?ONtfm
         LD (Co_dsp+1),A
+
         INF
         LD (Csl_stp+1),A
+
         JP M,$-2
         LD (Cvb_lok+1),A
+
      ENDIF
         LD (Cvb_stp+1),A
+
         LD B,E
       ;LD (Csl_dsp+1),HL
+
         OUTI
         LD (Cs_dtn+1),HL
+
         LD B,D
      LD A,16
+
         INC A
      LD (Cs_Vsl+1),A
+
         CP 13
      ;JR LDB1
+
         JR NZ,LOUT
         LD B,1
+
      IF0 ?ONtfm
         RET  
+
         INF
 
+
         JP M,$-2
Cni_vol JR NZ,Cni_v0
+
       ENDIF
         LD (Cvb_stp+1),A
+
         OUT (C),A
         DEC A
+
        LD A,(HL)
        LD (Cvb_lok+1),A
+
         AND A
 +
         RET M
 +
      IF0 ?ONtfm
 +
        INF
 +
        JP M,$-2
 +
      ENDIF
 +
         LD B,E
 +
         OUT (C),A
 
         RET  
 
         RET  
Cni_v0
 
      DUP 4
 
      ADD A,A
 
      EDUP
 
        LD (Cg_vol+1),A
 
      JP  Cn_clc2
 
Cni_s_o
 
      CALL ornPP
 
      LD (Co_adr+1),BC
 
Cni_vse
 
      CALL NZ,EiPP
 
Cni_sm0 LD (Cm_vol+1),A
 
        XOR A
 
        LD (Co_dsp+1),A
 
        LD A,(DE)
 
        INC DE
 
      JR Cnism0U ;
 
Cni_smp RET Z    ;
 
        ADD A,A  ;
 
Cnism0U
 
      CALL smpPP
 
        LD (Cs_adr+1),BC
 
 
Cn_clc1 LD BC,#1020
 
Cn_clc2 LD A,(DE)
 
        INC DE
 
        ADD A,B
 
        JR C,Cni_s_o
 
        ADD A,C
 
        JR C,Cni_smp
 
        ADD A,B
 
        JR C,Cni_vol
 
        ADD A,B
 
        JR C,Cni_vqe
 
        ADD A,96
 
        JR C,Cni_not
 
        ADD A,B
 
        JR C,Cni_orn
 
        ADD A,48
 
        JR C,Cni_vse
 
        LD HL,C_eff+30
 
        LD BC,Cs_note+1
 
      CALL NPUSH
 
        JR Cn_clc1
 
 
Cni_vqe JR Z,Cni_v1
 
        DEC A
 
        JR NZ,Cni_e0
 
        LD A,(DE)
 
        LD (Ci_qty+1),A
 
        INC DE
 
        JR Cn_clc2
 
  
Cni_e0 CALL EiPP
+
        IFN ACBBAC
Cni_v1  LD (Cm_vol+1),A
+
CHTABLE=$-4
         JR Cn_clc2
+
         DB 4,5,15,%001001,0,7,7,%100100
Cni_orn
+
         ENDIF
      CALL ornPP
 
      LD (Co_adr+1),BC
 
        LD (Co_dsp+1),A
 
         JR Cn_clc1
 
  
;---- special_effects_COM.xxxx ----
+
;Stupid ALASM limitations
 +
NT_DATA DB 50*2 ;(T_NEW_0-T1_)*2
 +
        DB TCNEW_0-T_
 +
        DB 50*2+1 ;(T_OLD_0-T1_)*2+1
 +
        DB TCOLD_0-T_
 +
        DB 0*2+1 ;(T_NEW_1-T1_)*2+1
 +
        DB TCNEW_1-T_
 +
        DB 0*2+1 ;(T_OLD_1-T1_)*2+1
 +
        DB TCOLD_1-T_
 +
        DB 74*2;(T_NEW_2-T1_)*2
 +
        DB TCNEW_2-T_
 +
        DB 24*2 ;(T_OLD_2-T1_)*2
 +
        DB TCOLD_2-T_
 +
        DB 48*2 ;(T_NEW_3-T1_)*2
 +
        DB TCNEW_3-T_
 +
        DB 48*2 ;(T_OLD_3-T1_)*2
 +
        DB TCOLD_3-T_
  
EiPP  LD (Ei_form+1),A
+
T_
      LD A,(DE)
 
      INC DE
 
      LD (Ei_frq+2),A
 
      LD A,(DE)
 
      INC DE
 
      LD (Ei_frq+1),A
 
      LD A,16
 
      RET ;16
 
  
Aef_dSm LD A,(DE)      ;dsp_smp
+
TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
         INC DE
+
         DB #18+1,#24+1,#3C+1,0
        LD (As_dsp+1),A          ;;si
+
TCOLD_1 DB #5C+1,0
         RET
+
TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
Bef_dSm LD A,(DE)
+
         DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
        INC DE
+
TCNEW_3 DB #56+1
         LD (Bs_dsp+1),A          ;;si
+
TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
        RET
+
TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
Cef_dSm LD A,(DE)
+
         DB #BC+1,#BE+1,0
         INC DE
+
TCNEW_1=TCOLD_1
        LD (Cs_dsp+1),A
+
TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
        RET
+
         DB #BA+1,#BC+1,#BE+1,0
  
A_eff  DW Aef_slT ;1xxx,2xxx - sld_tone
+
PT3EMPTYORN=$-1
        DW Aef_nsT ;3xxx - port_note
+
         DB 1,0
        DW Aef_dSm ;4.xx - dsp_smp
 
        DW Aef_dOr ;5.xx - dsp_orn
 
        DW Aef_vib ;6.xx - vibrato
 
Aef_vib LD A,(DE)
 
         INC DE
 
      JR Aef_vjr
 
        DW Eef_sld ;9xxx,Axxx - sld_env
 
        DW eff_tmp ;B.xx - temp
 
  
Aef_vjr LD (Avb_sts+1),A;fix fr/st;;ist
+
;first 12 values of tone tables (packed)
      LD (Avb_stp+1),A
 
        LD A,(DE)
 
        INC DE
 
        LD (Avb_frq+1),A;fix st/fr;;ifr
 
        RET
 
  
B_eff  DW Bef_slT
+
T_PACK  DB #06EC*2/256,#06EC*2
         DW Bef_nsT
+
        DB #0755-#06EC
         DW Bef_dSm
+
        DB #07C5-#0755
         DW Bef_dOr
+
         DB #083B-#07C5
         DW Bef_vib
+
         DB #08B8-#083B
Bef_vib LD A,(DE)
+
         DB #093D-#08B8
         INC DE
+
         DB #09CA-#093D
      JR Bef_vjr
+
        DB #0A5F-#09CA
         DW Eef_sld
+
        DB #0AFC-#0A5F
         DW eff_tmp
+
        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
  
Bef_vjr LD (Bvb_sts+1),A;fix fr/st;;ist
+
         DISPLAY $
      LD (Bvb_stp+1),A
 
         LD A,(DE)
 
        INC DE
 
        LD (Bvb_frq+1),A;fix st/fr;;ifr
 
        RET
 
  
C_eff  DW Cef_slT
+
;vars from here can be stripped
        DW Cef_nsT
+
;you can move VARS to any other address
        DW Cef_dSm
 
        DW Cef_dOr
 
        DW Cef_vib
 
int_qty DB 1
 
A_qty  DB 1
 
B_qty  DB 1
 
C_qty  DB 1
 
        DW Eef_sld
 
        DW eff_tmp
 
  
Cef_vib LD A,(DE)
+
VARS
        INC DE
 
        LD (Cvb_sts+1),A;fix fr/st
 
        LD (Cvb_stp+1),A
 
        LD A,(DE)
 
        INC DE
 
        LD (Cvb_frq+1),A;fix st/fr
 
        RET
 
  
Aef_nsT
+
is_ts   DB 0
      CALL Aef_slT
 
      ;LD (Asl_pfr+1),HL        ;;pi
 
      CALL GETHL
 
        LD (Asl_tfr+1),HL        ;;pi
 
        LD (Asl_plk-1),A;port_on  ;;pi_lok
 
        LD HL,As_note+1          ;;si
 
        LD A,(HL)
 
        LD (Asl_not+1),A          ;;pi
 
AnsQ   EXA
 
        LD (HL),A
 
      LD B,0
 
        RET
 
Bef_nsT
 
      CALL Bef_slT
 
      ;LD (Bsl_pfr+1),HL        ;;pi
 
      CALL GETHL
 
        LD (Bsl_tfr+1),HL        ;;pi
 
        LD (Bsl_plk-1),A          ;;pi_lok
 
        LD HL,Bs_note+1          ;;si
 
        LD A,(HL)
 
        LD (Bsl_not+1),A          ;;pi
 
      JR AnsQ
 
Cef_nsT
 
      CALL Cef_slT
 
      ;LD (Csl_pfr+1),HL
 
      CALL GETHL
 
        LD (Csl_tfr+1),HL
 
        LD (Csl_plk-1),A
 
        LD HL,Cs_note+1
 
        LD A,(HL)
 
        LD (Csl_not+1),A
 
      JR AnsQ
 
  
Aef_slT LD A,(DE)
+
VARS1  DS VRS
        LD (Asl_stp+1),A          ;;pi
+
VARS2  DS VRS
      LD (Asl_sts+1),A
 
      CALL IGETHL    ;sld_ton
 
        LD (Asl_tfr+1),HL        ;;pi
 
      LD (Avb_stp+1),A
 
        LD A,Asl_sts-Asl_plk
 
        LD (Asl_plk-1),A;port_off ;;pi
 
        RET
 
  
Bef_slT LD A,(DE)
+
VT_=$-16
        LD (Bsl_stp+1),A          ;;pi
+
         DS 256-16 ;CreatedVolumeTableAddress
      LD (Bsl_sts+1),A
 
      CALL IGETHL
 
        LD (Bsl_tfr+1),HL        ;;pi
 
      LD (Bvb_stp+1),A
 
        LD A,Bsl_sts-Bsl_plk
 
         LD (Bsl_plk-1),A          ;;pi
 
        RET
 
  
Cef_slT LD A,(DE)
+
T1_=VT_+16 ;Tone tables data depacked here
        LD (Csl_stp+1),A
 
        LD (Csl_sts+1),A
 
      CALL IGETHL
 
        LD (Csl_tfr+1),HL
 
        LD (Cvb_stp+1),A
 
        LD A,Csl_sts-Csl_plk
 
        LD (Csl_plk-1),A
 
        RET
 
  
eff_tmp
+
T_OLD_1=T1_
        LD A,(DE)
+
T_OLD_2=T_OLD_1+24
DISPLAY $,"=#XX00"
+
T_OLD_3=T_OLD_2+24
tab_vol
+
T_OLD_0=T_OLD_3+2
        INC DE
+
T_NEW_0=T_OLD_0
        LD (temp+1),A
+
T_NEW_1=T_OLD_1
        RET
+
T_NEW_2=T_NEW_0+24
 +
T_NEW_3=T_OLD_3
  
ornPP  ADD A,A
+
PT2EMPTYORN=VT_+31 ;1,0,0 sequence
      ADD A,tba_orn-tba_smp
 
smpPP  ADD A,tba_smp
 
      LD L,A
 
      LD C,(HL)
 
      INC L
 
      LD B,(HL)
 
        XOR A
 
      RET ;11
 
DUMMYORN
 
DUMMYSMP
 
DB 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
 
DB 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2
 
DB 0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3
 
DB 0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4
 
DB 0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5
 
DB 0,0,1,1,2,2,2,3,3,4,4,4,5,5,6,6
 
DB 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7
 
DB 0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8
 
DB 0,1,1,2,2,3,4,4,5,5,6,7,7,8,8,9
 
DB 0,1,1,2,3,3,4,5,5,6,7,7,8,9,9,10
 
DB 0,1,1,2,3,4,4,5,6,7,7,8,9,10,10,11
 
DB 0,1,2,2,3,4,5,6,6,7,8,9,10,10,11,12
 
DB 0,1,2,3,3,4,5,6,7,8,9,10,10,11,12,13
 
DB 0,1,2,3,4,5,6,7,7,8,9,10,11,12,13,14
 
DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
 
tab_frq DS #C0
 
Eef_sld LD A,(DE)      ;sld_env
 
        LD (Esl_ist+1),A          ;;stp
 
      CALL IGETHL
 
        LD (Esl_ids+1),HL        ;;sds
 
        LD A,6
 
        LD (E_ins0),A
 
        RET ;16
 
  
      OUTI
+
NT_    DS 192 ;CreatedNoteTableAddress
OUTER  LD B,D
 
      OUT (C),L
 
      LD B,E
 
      DEC A
 
      JR NZ,OUTER-2
 
      RET ;10
 
  
Aef_dOr LD A,(DE)      ;dsp_orn
+
VAR0END=VT_+16 ;INIT zeroes from VARS to VAR0END-1
        INC DE
 
        LD (Ao_dsp+1),A          ;;oi
 
        RET
 
Bef_dOr LD A,(DE)
 
        INC DE
 
        LD (Bo_dsp+1),A          ;;oi
 
        RET
 
Cef_dOr LD A,(DE)
 
        INC DE
 
        LD (Co_dsp+1),A
 
        RET ;6
 
  
IGETHL INC DE
+
VARSEND=$
GETHL
 
      EX DE,HL
 
      LD E,(HL)
 
      INC HL
 
      LD D,(HL)
 
      INC HL
 
      EX DE,HL
 
        XOR A
 
      RET ;9
 
  
NPUSH  RLA
+
MDLADDR=$
      ADD A,L
 
      LD L,A
 
    ;LD H,'A_eff
 
      LD A,(HL)
 
      INC L
 
      LD H,(HL)
 
      LD L,A
 
      EX (SP),HL
 
      LD A,(BC)
 
      EXA
 
      JP (HL) ;11
 
LENP=$-PLAYER
 
        DISPLAY "SIZE=",LENP
 
T_m
 
        DW _m1
 
        DW _m2
 
        DW _m3
 
        DW _m4
 
        DW _m5
 
        DW _m6
 
        DW _m7
 
        DW _m8
 
        DW _m9
 
        DW _m10
 
        DW _m11
 
        DW _m12
 
        DW _m13
 
        DW _m14
 
T_m_l=$-T_m/2
 
        ENDM
 
  
      IF0 $-#8000
+
         DISPLAY $
MUZ
 
P1
 
        LOCAL
 
pp
 
        ENDL
 
         ORG #C000
 
P2
 
pp
 
        ORG $
 
        LD IX,#7000
 
        LD HL,P1
 
        LD DE,P2
 
        LD BC,LENP
 
CP0    LD A,(DE)
 
        SUB (HL)
 
        JR Z,CPOK
 
        CP #40
 
        JR NZ,ERR
 
        LD (IX),E
 
        LD (IX+1),D
 
        INC IX,IX
 
CPOK    INC HL,DE
 
        DEC BC
 
        LD A,B
 
        OR C
 
        JR NZ,CP0
 
        RET
 
ERR    LD HL,0
 
        LD DE,#5800
 
        LD BC,768
 
        LDIR
 
        RET
 
      ELSE
 
pp
 
      ENDIF D (Avb_stp+1),A
 
        LD A,Asl_sts-Asl_plk
 
        LD (Asl_plk-1),A;port_off ;;pi
 
        RET
 
  
Bef_slT LD A,(DE)
+
,LOUT
         LD (Bsl_stp+1),A          ;;pi
+
      IF0 ?ONtfm
       LD
+
        INF
 +
        JP M,$-2
 +
      ENDIF
 +
        OUT (C),A
 +
         LD A,(HL)
 +
        AND A
 +
        RET M
 +
      IF0 ?ONtfm
 +
        INF
 +
        JP M,$-2
 +
       ENDIF
 +
        LD

Revision as of 23:49, 14 February 2020

PTSPlay C��3w�x{�;Universal PT2'n'PT3 Turbo Sound player for ZX Spectrum

2004-2007 S.V.Bulba <vorobey@mail.khstu.ru>
http://bulba.untergrund.net/ (http://bulba.at.kz/)

Release="0"

read SjAsm or ZXAsm version source for comments.
Conditional assembly
1) Current position counters at (Vars1+0) and (Vars2+0)

CurPosCounter=0

2) Allow channels allocation bits at (START+10)

ACBBAC=0

3) Allow loop checking and disabling

LoopChecker=0

4) Insert official identificator

IFN ?Id Id=1 ENDIF

5) Set IY for correct return to ZX Basic

IFN ?Basic Basic=0 ENDIF

      ;ORG #C000

TonA=0 TonB=2 TonC=4 Noise=6 Mixer=7 AmplA=8 AmplB=9 AmplC=10 Env=11 EnvTp=13

ChannelsVars
      ;STRUCT  CHP
reset group

PsInOr=0 PsInSm=1 CrAmSl=2 CrNsSl=3 CrEnSl=4 TSlCnt=5 CrTnSl=6 TnAcc=8 COnOff=10

reset group

OnOffD=11

IX for PTDECOD here (+12)

OffOnD=12 OrnPtr=13 SamPtr=15 NNtSkp=17 Note=18 SlToNt=19 Env_En=20 Flags=21

;Enabled - 0, SimpleGliss - 2

TnSlDl=22 TSlStp=23 TnDelt=25 NtSkCn=27 Volume=28

      ;ENDS

CHP=29

      ;STRUCT  VRS

CurPos=0 PosSub=1

ModNum=2 ;bit0: ChipNum

            ;bit1: 1-reversed patterns order (AlCo TS)

ChanA=3 ChanB=ChanA+CHP ChanC=ChanB+CHP

GlobalVars

MODADDR=ChanC+CHP OrnPtrs=MODADDR+2 SamPtrs=MODADDR+4 PatsPtr=MODADDR+6 AdInPtA=MODADDR+8 AdInPtB=MODADDR+10 AdInPtC=MODADDR+12 CrPsPtr=MODADDR+14 LPosPtr=MODADDR+16 Delay=MODADDR+18 DelyCnt=MODADDR+19 ESldAdd=MODADDR+20 CurESld=MODADDR+22 Env_Del=MODADDR+24 CurEDel=MODADDR+25 Ns_Base=MODADDR+26 AddToNs=MODADDR+27 AddToEn=MODADDR+28 EnvBase=MODADDR+29 AYREGS=MODADDR+31

      ;ENDS

VRS=AYREGS+14

START

       LD HL,MDLADDR ;DE - address of 2nd module for TS
       JR INIT
       JP PLAY
       JR MUTE

SETUP DB 0

       IFN Id
       DB "=UniPT2/PT3/TS-Player r.",Release,"="
       ENDIF 
       IFN LoopChecker

CHECKLP LD HL,SETUP

       BIT 0,(IY-100+ModNum)
       JR Z,CHL1
       SET 6,(HL)
       JR CHL2

CHL1 SET 7,(HL) CHL2 BIT 0,(HL)

       RET Z
       POP HL
       INC (IY-100+DelyCnt)
       INC (IY-100+ChanA+NtSkCn)
       XOR A
       LD (IY-100+AYREGS+AmplA),A
       LD (IY-100+AYREGS+AmplB),A
       LD (IY-100+AYREGS+AmplC),A
       RET 
       ENDIF 

MUTE XOR A

       LD H,A
       LD L,A
       LD (VARS1+AYREGS+AmplA),A
       LD (VARS1+AYREGS+AmplB),HL
       LD (VARS2+AYREGS+AmplA),A
       LD (VARS2+AYREGS+AmplB),HL
       JP ROUT

INIT

HL - AddressOfModule
DE - AddresOf2ndModule
       PUSH DE
       PUSH HL
       LD HL,VARS
       LD (HL),0
       LD DE,VARS+1
       LD BC,VAR0END-VARS-1
       LDIR 
       INC HL
       LD (VARS1+AdInPtA),HL ;ptr to zero
       LD (VARS2+AdInPtA),HL
       POP HL
       LD IY,VARS1+100
       LD A,(START+10)
       AND 2
       JP NZ,I_PT2
       CALL INITPT3
       LD HL,#1F18 ;(e_-SamCnv-2)*256+#18 ;ALASM :(
       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
       POP HL
       ;Use version and ton table of 1st module
       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 IY,VARS2+100
       LD A,(START+10)
       AND 48
       JR Z,NOTS
       CP 16
       JR Z,TwoPT3s
       LD A,(Version)
       CP 7
       JR C,NOTS
       LD A,(IX+98-100) ;ALCO TS MARKER
       CP #20
       JR Z,NOTS
       LD HL,VARS1
       LD DE,VARS2
       LD BC,VRS
       LDIR 
       SET 1,(IY-100+ModNum)
       LD C,A
       ADD A,A
       ADD A,C
       SUB 2
       LD (TSSub),A
       JR AlCoTS_

TwoPT3s CALL INITPT3 AlCoTS_ LD A,1

       LD (is_ts),A
       SET 0,(IY-100+ModNum)

NOTS LD BC,PT3PD

       LD HL,0
       LD DE,PT3EMPTYORN
       JR INITCOMMON

I_PT2 CALL INITPT2

       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
       POP HL
       LD A,5
       LD (Version),A
       PUSH AF
       LD A,2
       PUSH AF
       LD A,(START+10)
       AND 48
       JR Z,NOTS2
       LD IY,VARS2+100
       LD A,1
       LD (is_ts),A
       SET 0,(IY-100+ModNum)
       CALL INITPT2

NOTS2 LD BC,PT2PD

       LD HL,#8687
       LD DE,PT2EMPTYORN

INITCOMMON

       IFN Basic
       LD IY,#5C3A
       ENDIF 
       LD (PTDEC),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
       INC A
       LD (VARS1+DelyCnt),A
       LD (VARS2+DelyCnt),A
       LD HL,#F001 ;H - Volume, L - NtSkCn
       LD (VARS1+ChanA+NtSkCn),HL
       LD (VARS1+ChanB+NtSkCn),HL
       LD (VARS1+ChanC+NtSkCn),HL
       LD (VARS2+ChanA+NtSkCn),HL
       LD (VARS2+ChanB+NtSkCn),HL
       LD (VARS2+ChanC+NtSkCn),HL
       POP HL
       LD (VARS1+ChanA+OrnPtr),HL
       LD (VARS1+ChanB+OrnPtr),HL
       LD (VARS1+ChanC+OrnPtr),HL
       LD (VARS2+ChanA+OrnPtr),HL
       LD (VARS2+ChanB+OrnPtr),HL
       LD (VARS2+ChanC+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
       LD D,0
       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
       LD BC,T1_
       ADD HL,BC
       LD A,(DE)
       ADD A,T_
       LD C,A
       ADC A,'T_
       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 HX,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 HX
       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

INITPT3 CALL SETMDAD

       PUSH HL
       LD DE,100
       ADD HL,DE
       LD A,(HL)
       LD (IY-100+Delay),A
       PUSH HL
       POP IX
       ADD HL,DE
       CALL SETCPPT
       LD E,(IX+102-100)
       INC HL
       IFN CurPosCounter
       LD (IY-100+PosSub),L
       ENDIF 
       ADD HL,DE
       CALL SETLPPT
       POP DE
       LD L,(IX+103-100)
       LD H,(IX+104-100)
       ADD HL,DE
       CALL SETPTPT
       LD HL,169
       ADD HL,DE
       CALL SETORPT
       LD HL,105
       ADD HL,DE

SETSMPT LD (IY-100+SamPtrs),L

       LD (IY-100+SamPtrs+1),H
       RET 

INITPT2 LD A,(HL)

       LD (IY-100+Delay),A
       PUSH HL
       PUSH HL
       PUSH HL
       INC HL
       INC HL
       LD A,(HL)
       INC HL
       CALL SETSMPT
       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
       CALL SETORPT
       LD E,32
       ADD HL,DE
       LD C,(HL)
       INC HL
       LD B,(HL)
       LD E,30
       ADD HL,DE
       CALL SETCPPT
       LD E,A
       INC HL
       IFN CurPosCounter
       LD (IY-100+PosSub),L
       ENDIF 
       ADD HL,DE
       CALL SETLPPT
       POP HL
       ADD HL,BC

SETPTPT LD (IY-100+PatsPtr),L

       LD (IY-100+PatsPtr+1),H
       RET 

SETMDAD LD (IY-100+MODADDR),L

       LD (IY-100+MODADDR+1),H
       RET 

SETORPT LD (IY-100+OrnPtrs),L

       LD (IY-100+OrnPtrs+1),H
       RET 

SETCPPT LD (IY-100+CrPsPtr),L

       LD (IY-100+CrPsPtr+1),H
       RET 

SETLPPT LD (IY-100+LPosPtr),L

       LD (IY-100+LPosPtr+1),H
       RET 

SETENBS LD (IY-100+EnvBase),L

       LD (IY-100+EnvBase+1),H
       RET 

SETESLD LD (IY-100+CurESld),L

       LD (IY-100+CurESld+1),H
       RET 

GETIX PUSH IY

       POP IX
       ADD IX,DE
       RET 

PTDECOD CALL GETIX PTDEC=$+1

       JP #C3C3
PT2 pattern decoder

PD2_SAM CALL SETSAM

       JR PD2_LOOP

PD2_EOff LD (IX-12+Env_En),A

       JR PD2_LOOP

PD2_ENV LD (IX-12+Env_En),16

       LD (IY-100+AYREGS+EnvTp),A
       LD A,(BC)
       INC BC
       LD L,A
       LD A,(BC)
       INC BC
       LD H,A
       CALL SETENBS
       JR PD2_LOOP

PD2_ORN CALL SETORN

       JR PD2_LOOP

PD2_SKIP INC A

       LD (IX-12+NNtSkp),A
       JR PD2_LOOP

PD2_VOL RRCA

       RRCA 
       RRCA 
       RRCA 
       LD (IX-12+Volume),A
       JR PD2_LOOP

PD2_DEL CALL C_DELAY

       JR PD2_LOOP

PD2_GLIS SET 2,(IX-12+Flags)

       INC A
       LD (IX-12+TnSlDl),A
       LD (IX-12+TSlCnt),A
       LD A,(BC)
       INC BC
       LD (IX-12+TSlStp),A
       ADD A,A
       SBC A,A
       LD (IX-12+TSlStp+1),A
       SCF 
       JR PD2_LP2

PT2PD AND A

PD2_LP2 EXA

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+CrNsSl),A
       JR PD2_LOOP

PD2_PORT RES 2,(IX-12+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+TSlCnt),A

       JR PD2_LOOP

PD2_REL LD (IX-12+Flags),A

       JR PD2_EXIT

PD2_NOTE LD L,A

       LD A,(IX-12+Note)
       LD (PrNote+1),A
       LD (IX-12+Note),L
       XOR A
       LD (IX-12+TSlCnt),A
       SET 0,(IX-12+Flags)
       EXA 
       JR NC,NOGLIS2
       BIT 2,(IX-12+Flags)
       JR NZ,NOPORT2
       LD (LoStep),A
       ADD A,A
       SBC A,A
       EXA 
       LD H,A
       LD L,A
       INC A
       CALL SETPORT

NOPORT2 LD (IX-12+TSlCnt),1 NOGLIS2 XOR A


PD2_EXIT LD (IX-12+PsInSm),A

       LD (IX-12+PsInOr),A
       LD (IX-12+CrTnSl),A
       LD (IX-12+CrTnSl+1),A
       JP PD_FIN
PT3 pattern decoder

PD_OrSm LD (IX-12+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+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
       JR PD_SAM_

PT3PD 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 (IY-100+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 LD A,(BC)

       INC BC
SKIP PRECALCULATED TONE DELTA (BECAUSE
CANNOT BE RIGHT AFTER PT3 COMPILATION)
       INC BC
       INC BC
       EXA 
       LD A,(BC) ;SIGNED TONE STEP
       INC BC
       LD (LoStep),A
       LD A,(BC)
       INC BC
       AND A
       EXA 
       LD L,(IX-12+CrTnSl)
       LD H,(IX-12+CrTnSl+1)
Set portamento variables
A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl

SETPORT RES 2,(IX-12+Flags)

       LD (IX-12+TnSlDl),A
       LD (IX-12+TSlCnt),A
       PUSH HL
       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
       POP DE

Version=$+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

LoStep=$+1 OLDPRTM LD A,#3E

       EXA 
       JR Z,NOSIG
       EX DE,HL

NOSIG SBC HL,DE

       JP P,SET_STP
       CPL 
       EXA 
       NEG 
       EXA 

SET_STP LD (IX-12+TSlStp+1),A

       EXA 
       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
       EXA 
       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 (IY-100+Env_Del),A
       LD (IY-100+CurEDel),A
       LD A,(BC)
       INC BC
       LD L,A
       LD A,(BC)
       INC BC
       LD H,A
       LD (IY-100+ESldAdd),L
       LD (IY-100+ESldAdd+1),H
       RET 

C_DELAY LD A,(BC)

       INC BC
       LD (IY-100+Delay),A
       LD HL,VARS2+ModNum ;if AlCo_TS
       BIT 1,(HL)
       RET Z
       LD (VARS1+Delay),A
       LD (VARS1+DelyCnt),A
       LD (VARS2+Delay),A
       RET 

SETENV LD (IX-12+Env_En),E

       LD (IY-100+AYREGS+EnvTp),A
       LD A,(BC)
       INC BC
       LD H,A
       LD A,(BC)
       INC BC
       LD L,A
       CALL SETENBS
       XOR A
       LD (IX-12+PsInOr),A
       LD (IY-100+CurEDel),A
       LD H,A
       LD L,A
       JP SETESLD

SETORN ADD A,A

       LD E,A
       LD D,0
       LD (IX-12+PsInOr),D
       LD L,(IY-100+OrnPtrs)
       LD H,(IY-100+OrnPtrs+1)
       ADD HL,DE
       LD E,(HL)
       INC HL
       LD D,(HL)
       LD L,(IY-100+MODADDR)
       LD H,(IY-100+MODADDR+1)
       ADD HL,DE
       LD (IX-12+OrnPtr),L
       LD (IX-12+OrnPtr+1),H

C_NOP RET

SETSAM ADD A,A

       LD E,A
       LD D,0
       LD L,(IY-100+SamPtrs);
       LD H,(IY-100+SamPtrs+1);
       ADD HL,DE
       LD E,(HL)
       INC HL
       LD D,(HL)
       LD L,(IY-100+MODADDR)
       LD H,(IY-100+MODADDR+1)
       ADD HL,DE
       LD (IX-12+SamPtr),L
       LD (IX-12+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 CALL GETIX

       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
               ;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+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

       EXA 
       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

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+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+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

       EXA 
       ADD A,NT_
       LD L,A
       ADC A,'NT_
       SUB L
       LD H,A
       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)

       ADD A,VT_
       LD L,A
       ADC A,'VT_
       SUB L
       LD H,A
       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 ADD A,(IY-100+AddToEn) ;BUG IN PT3 - NEED WORD HERE

       LD (IY-100+AddToEn),A
       JR CH_MIX

NO_ENSL RRA

       ADD A,(IX+CrNsSl)
       LD (IY-100+AddToNs),A
       BIT 5,B
       JR Z,CH_MIX
       LD (IX+CrNsSl),A

CH_MIX LD A,B

       RRA 
       AND #48

CH_EXIT OR (IY-100+AYREGS+Mixer)

       RRCA 
       LD (IY-100+AYREGS+Mixer),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 

PLAY_ XOR A

       LD (IY-100+AddToEn),A
       LD (IY-100+AYREGS+Mixer),A
       DEC A
       LD (IY-100+AYREGS+EnvTp),A
       DEC (IY-100+DelyCnt)
       JP NZ,PL2
       DEC (IY-100+ChanA+NtSkCn)
       JR NZ,PL1B
       LD C,(IY-100+AdInPtA)
       LD B,(IY-100+AdInPtA+1)
       LD A,(BC)
       AND A
       JR NZ,PL1A
       LD D,A
       LD (IY-100+Ns_Base),A
       LD L,(IY-100+CrPsPtr)
       LD H,(IY-100+CrPsPtr+1)
       INC HL
       LD A,(HL)
       INC A
       JR NZ,PLNLP
       IFN LoopChecker
       CALL CHECKLP
       ENDIF 
       LD L,(IY-100+LPosPtr)
       LD H,(IY-100+LPosPtr+1)
       LD A,(HL)
       INC A

PLNLP CALL SETCPPT

       DEC A
       BIT 1,(IY-100+ModNum)
       JR Z,NoAlCo

TSSub=$+1

       SUB #D6
       CPL 

NoAlCo

               ;PT2            PT3

PsCalc DEC A  ;ADD A,A NOP

       DEC A   ;ADD A,(HL)     NOP
       ADD A,A
       LD E,A
       RL D
       IFN CurPosCounter
       LD A,L
       SUB (IY-100+PosSub)
       LD (IY-100+CurPos),A
       ENDIF 
       LD L,(IY-100+PatsPtr)
       LD H,(IY-100+PatsPtr+1)
       ADD HL,DE
       LD E,(IY-100+MODADDR)
       LD D,(IY-100+MODADDR+1)
       LD (PSP_+1),SP
       LD SP,HL
       POP HL
       ADD HL,DE
       LD B,H
       LD C,L
       POP HL
       ADD HL,DE
       LD (IY-100+AdInPtB),L
       LD (IY-100+AdInPtB+1),H
       POP HL
       ADD HL,DE
       LD (IY-100+AdInPtC),L
       LD (IY-100+AdInPtC+1),H

PSP_ LD SP,#3131 PL1A LD DE,ChanA+12-100

       CALL PTDECOD
       LD (IY-100+AdInPtA),C
       LD (IY-100+AdInPtA+1),B

PL1B DEC (IY-100+ChanB+NtSkCn)

       JR NZ,PL1C
       LD DE,ChanB+12-100
       LD C,(IY-100+AdInPtB)
       LD B,(IY-100+AdInPtB+1)
       CALL PTDECOD
       LD (IY-100+AdInPtB),C
       LD (IY-100+AdInPtB+1),B

PL1C DEC (IY-100+ChanC+NtSkCn)

       JR NZ,PL1D
       LD DE,ChanC+12-100
       LD C,(IY-100+AdInPtC)
       LD B,(IY-100+AdInPtC+1)
       CALL PTDECOD
       LD (IY-100+AdInPtC),C
       LD (IY-100+AdInPtC+1),B

PL1D LD A,(IY-100+Delay)

       LD (IY-100+DelyCnt),A

PL2 LD DE,ChanA-100

       LD L,(IY-100+AYREGS+TonA)
       LD H,(IY-100+AYREGS+TonA+1)
       CALL CHREGS
       LD (IY-100+AYREGS+TonA),L
       LD (IY-100+AYREGS+TonA+1),H

Ampl=$+1

       LD A,#3E
       LD (IY-100+AYREGS+AmplA),A
       LD DE,ChanB-100
       LD L,(IY-100+AYREGS+TonB)
       LD H,(IY-100+AYREGS+TonB+1)
       CALL CHREGS
       LD (IY-100+AYREGS+TonB),L
       LD (IY-100+AYREGS+TonB+1),H
       LD A,(Ampl)
       LD (IY-100+AYREGS+AmplB),A
       LD DE,ChanC-100
       LD L,(IY-100+AYREGS+TonC)
       LD H,(IY-100+AYREGS+TonC+1)
       CALL CHREGS
       LD (IY-100+AYREGS+TonC),L
       LD (IY-100+AYREGS+TonC+1),H
       LD A,(Ampl)
       LD (IY-100+AYREGS+AmplC),A
       LD A,(IY-100+Ns_Base)
       ADD A,(IY-100+AddToNs)
       LD (IY-100+AYREGS+Noise),A
       LD A,(IY-100+AddToEn)
       LD E,A
       ADD A,A
       SBC A,A
       LD D,A
       LD L,(IY-100+EnvBase)
       LD H,(IY-100+EnvBase+1)
       ADD HL,DE
       LD E,(IY-100+CurESld)
       LD D,(IY-100+CurESld+1)
       ADD HL,DE
       LD (IY-100+AYREGS+Env),L
       LD (IY-100+AYREGS+Env+1),H
       XOR A
       OR (IY-100+CurEDel)
       RET Z
       DEC (IY-100+CurEDel)
       RET NZ
       LD A,(IY-100+Env_Del)
       LD (IY-100+CurEDel),A
       LD L,(IY-100+ESldAdd)
       LD H,(IY-100+ESldAdd+1)
       ADD HL,DE
       JP SETESLD

PLAY LD IY,VARS1+100

       CALL PLAY_
       LD A,(is_ts)
       AND A
       JR Z,PL_nts
       LD IY,VARS2+100
       CALL PLAY_

PL_nts

       IFN Basic
       LD IY,#5C3A
       ENDIF 

ROUT LD BC,#FFFD

       LD A,(is_ts)
       AND A
       JR Z,r_nts
       IF0 ?ONtfm
       LD L,#F9
       OUT (C),L
       ELSE 
       OUT (C),B
       ENDIF 

r_nts EXA

       IFN ACBBAC
       LD IX,VARS1+AYREGS
       ELSE 
       LD HL,VARS1+AYREGS
       ENDIF 
       CALL ROUT_
       EXA 
       RET Z
       LD B,D
       IF0 ?ONtfm
       LD A,#F8
       ELSE 
       CPL 
       ENDIF 
       OUT (C),A
       IFN ACBBAC
       LD IX,VARS2+AYREGS
       ELSE 
       LD HL,VARS2+AYREGS
       ENDIF 

ROUT_

       IFN ACBBAC
       LD A,(SETUP)
       AND 12
       JR Z,ABC
       ADD A,CHTABLE
       LD E,A
       ADC A,'CHTABLE
       SUB E
       LD D,A
       LD B,0
       PUSH IX
       POP HL
       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 A,(DE)
       AND (IX+Mixer)
       LD E,A
       LD A,(IX+Mixer)

RxCA1 DB #E6

       AND %010010
       OR E
       LD E,A
       LD A,(IX+Mixer)
       AND %010010

RxCA2 OR E

       OR E
       LD (IX+Mixer),A

ABC

       ENDIF 
       XOR A
       LD DE,#FFBF
       IFN ACBBAC
       LD BC,#FFFD
       PUSH IX
       POP HL
       ENDIF 

LOUT

      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       OUT (C),A
      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       LD B,E
       OUTI 
       LD B,D
       INC A
       CP 13
       JR NZ,LOUT
      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       OUT (C),A
       LD A,(HL)
       AND A
       RET M
      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       LD B,E
       OUT (C),A
       RET 
       IFN ACBBAC

CHTABLE=$-4

       DB 4,5,15,%001001,0,7,7,%100100
       ENDIF 
Stupid ALASM limitations

NT_DATA DB 50*2 ;(T_NEW_0-T1_)*2

       DB TCNEW_0-T_
       DB 50*2+1 ;(T_OLD_0-T1_)*2+1
       DB TCOLD_0-T_
       DB 0*2+1 ;(T_NEW_1-T1_)*2+1
       DB TCNEW_1-T_
       DB 0*2+1 ;(T_OLD_1-T1_)*2+1
       DB TCOLD_1-T_
       DB 74*2;(T_NEW_2-T1_)*2
       DB TCNEW_2-T_
       DB 24*2 ;(T_OLD_2-T1_)*2
       DB TCOLD_2-T_
       DB 48*2 ;(T_NEW_3-T1_)*2
       DB TCNEW_3-T_
       DB 48*2 ;(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=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=$-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
       DISPLAY $
vars from here can be stripped
you can move VARS to any other address

VARS

is_ts DB 0

VARS1 DS VRS VARS2 DS VRS

VT_=$-16

       DS 256-16 ;CreatedVolumeTableAddress

T1_=VT_+16 ;Tone tables data depacked here

T_OLD_1=T1_ T_OLD_2=T_OLD_1+24 T_OLD_3=T_OLD_2+24 T_OLD_0=T_OLD_3+2 T_NEW_0=T_OLD_0 T_NEW_1=T_OLD_1 T_NEW_2=T_NEW_0+24 T_NEW_3=T_OLD_3

PT2EMPTYORN=VT_+31 ;1,0,0 sequence

NT_ DS 192 ;CreatedNoteTableAddress

VAR0END=VT_+16 ;INIT zeroes from VARS to VAR0END-1

VARSEND=$

MDLADDR=$

       DISPLAY $

,LOUT

      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       OUT (C),A
       LD A,(HL)
       AND A
       RET M
      IF0 ?ONtfm
       INF 
       JP M,$-2
      ENDIF 
       LD