PROTRACKER372 PTCMPV8 H

From MSX MUSIC WIKI
Jump to: navigation, search

PTCMPv8 C��·Б�В√Ц

MAIN "",#C6
CMbuf   DB -1 ;USED ORNS+SMPS
        DS 16+31
t1buf   DB -1,-1,-1,-1,0

        MACRO IYAi
        LD (IY),A
        INC IY
        ENDM 

        MACRO IYNi
        LD (IY),\0
        INC IY
        ENDM 

        MACRO IYLi
        LD (IY),L
        INC IY
        ENDM 

        MACRO IYHi
        LD (IY),H
        INC IY
        ENDM 
PatDisp
        LD A,(IX-0) ;-8
patdisp=$-1
        IYAi
        LD A,(IX-0) ;-7
patdisp1=$-1
        IYAi
        RET 
PUTIY
        PUSH AF
        CALL OUT7
        PUSH HL
        LD HL,(pnter)
        LD A,LY
        SUB mod
        LD (HL),A
        INC HL
        LD A,HY
        SBC A,'mod
        LD (HL),A
        INC HL
        LD (pnter),HL
        POP HL
        POP AF
        RET 

cMPILE
        LD (CMsmpU0),A
        LD (CMornU0),A
        XOR A
        LD (CMPcnt),A
        DI 
        CALL CMPIL
        CALL CMPso
        LD IY,iy
        EI 
       IFN process
        CALL CLOSWIN
        LD A,205,(MHEXFNT+2),A
        CALL OUT7
       ENDIF 
sngE=$+1
        LD HL,lce84
        LD DE,mod
       ;OR A
        SBC HL,DE
        EXD 
        RET 
;1
CMPIL
       IFN process
        CALL PROCESS
       ENDIF 
       IF0 portres
       LD A,97
       LD (t1not),A
       LD (po2not),A
       ENDIF 
       ;DI
        LD HL,CMbuf+1
        LD DE,CMbuf+2
        LD BC,16+31-1
        LD (HL),B
        LDIR 
        LD DE,l5b00+1
        LD H,D,L,B
        LD C,250
        LD (HL),L
        LDIR 
        CALL OUT7
        LD HL,TPROTR
        LD DE,mod
        LD C,99
        LDIR 
        LD H,D,L,E
        INC DE
        LD (HL),B
       LD B,3 ;на всякий случ trks
        LDIR 
        LD A,(FRQn)
        LD (lce84),A
        LD A,(TEMPO)
        LD (lce85),A
        LD A,(LENG)
        LD (lce86),A
        LD B,A
        LD A,(LOOP)
        CP B
        JC $+3
        XOR A
        LD (lce87),A
        LD HL,TPOSS
        LD DE,lceea
CMPpos  LD A,(HL)
        ADD A,A
        ADD A,(HL)
        LD (DE),A
        INC L
        INC DE
        DJNZ CMPpos
        LD A,-1
        LD (DE),A
        INC DE
        EXD 
        LD (sngCUR),HL
        LD DE,-mod
        ADD HL,DE
        LD (lce88),HL
        LD A,(LENG)
        LD C,A
        LD A,PATS-1
CMPmax  LD B,C
        LD HL,TPOSS
        CP (HL)
        JZ CMPmaxQ
        INC L
        DJNZ $-4
        DEC A
        JP P,CMPmax
CMPmaxQ INC A
        LD (CMPlst),A
        LD B,A
       ADD A,A
       ADD A,B
       LD L,A,H,0
       ADD HL,HL
       ;LD DE,6
       ;LD H,D,L,D
       ;ADD HL,DE
       ;DJNZ $-1
sngCUR=$+1
        LD DE,0
        ADD HL,DE
        LD (sngE),HL
       PUSH DE
       LD B,3
CMP00   XOR A
      ;PUSH DE
CMP0
       IFN portres
        LD (CMporeA),A
       ENDIF 
        PUSH AF
       PUSH BC
        CALL CMPP
       POP BC
        POP AF
        INC A
CMPlst=$+1
        CP 0
       IFN process
        JZ CMP0Q
       ;PUSH AF
       PUSH BC
       BIT 0,B
     ;A<>0: bar увеличивается на 1
       CALL Z,PROBAR
       POP BC
       ;POP AF
       ;LD L,A
        JR CMP0
       ELSE 
        JNZ CMP0
       ENDIF 
CMP0Q
      ;POP HL
      ;INC HL,HL
      ;LD (sngCUR),HL
      ;EXD
       LD A,B
       ADD A,5
       LD B,A
       CP 13+5
       JC CMP00

       POP HL
       PUSH HL
       LD DE,BUF
       LD B,3
       LDIR 
       LD HL,BUF
       POP DE
       LD B,3
CMPRE60
       LD A,(CMPlst)
       PUSH DE
CMPRE61
       LDI 
       INC BC
       LDI 
       INC BC
       INC DE,DE,DE,DE
       DEC A
       JNZ CMPRE61
       POP DE
       INC DE,DE
       DJNZ CMPRE60
       IFN process
        JP CMPQ
       ELSE 
        RET 
       ENDIF 
CMPP
       PUSH BC
        LD L,A,H,'TPATSZ
        LD A,(HL),(CMPPlen),A
        LD A,L
       CALL PATtoBUF ;делает OUT7
        LD IY,(sngE)
       IFN portres
       LD A,97
       LD (t1not),A
       LD (po2not),A
       ENDIF 
       POP AF ;3/8/13
        CALL CMt
        LD (sngE),IY
        RET 
CMt
       LD IX,BUF
       LD C,A,B,0
       ADD IX,BC
        NEG 
        LD (patdisp),A
        INC A
        LD (patdisp1),A
       SUB -8+1
       JZ $+4
       LD A,DJt1Nn
       LD (CMisb-1),A

        LD (CMt2IY),IY  ;начало трека
        PUSH IX
        LD HL,t1buf+4
        XOR A
;LD (CMoldT),A
        LD (CMoldN),A
       LD (HL),A
       DEC HL
        LD (HL),A
        DEC HL
       DEC A
        LD (HL),A
        DEC HL
        LD (HL),A
        DEC HL
        LD (HL),A
CMPPlen=$+1
        LD A,0
        INC A
CMt10   EXA 
        LD A,(t1not)
        CP 96
        JNC $+5
        LD (po2not),A
        LD HL,t1buf
        LD A,(IX)
        LD C,A
        AND #7F
        JNZ CMt1NZ
        LD A,97,(t1not),A
        JP CMt1IG
CMt1NZ
        DEC A
        LD (t1not),A
       SLA C
        LD A,(IX+3)
        RRA 
        RRA 
        RRA 
        RRA 
        AND 31
        JZ $+3
        CP (HL)
        JZ CMt1IG
        LD (HL),A
        SUB -#D0
        LD (t1smp),A
        INC L,L
        LD A,(IX+3)
        AND #F
       ;JZ CMt1Nt1
       LD C,A
        LD A,(IX+4)
        AND #F0
       CP C
       JZ CMt1Nt1
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        CP (HL)
        JZ CMt1No1
        LD (HL),A
       INC C
       DEC C
       JNZ CMseFx
       LD A,(t1smp)
       IYAi
       LD A,(HL)
       DEC L
       SUB -#40
       JR CMt1G
CMseFx
        DEC L
        LD (HL),#F
        SUB -#F0
        IYAi
        LD A,(t1smp)
        SUB -#30
        ADD A,A
        JR CMt1G
CMt1No1
        DEC L
        LD A,C
        OR A
        JZ CMt1Nt2
        CP #F
        JNZ CMt1Yt
        CP (HL)
        JZ CMt1Nt2
        LD (HL),A
        XOR A
        JR $+3
CMt1Yt  LD (HL),A
        SUB -#10
        IYAi
        SUB #10
       ;JZ CMt1NE1
       CALL NZ,PatDisp
CMt1NE1 LD A,(t1smp)
        SUB -#30
        ADD A,A
        IYAi
        JR CMt1INE

CMt1Nt1
        LD A,(t1smp)
        JR CMt1Yo2

t1smp=$+1
CMt1Nt2
        LD A,0
CMt1G   IYAi
        DEC L
CMt1IG  INC L
        LD A,(IX+3)
       ;INC L
        AND #F
       LD C,A
       JZ CMt1INE
       ;JZ CMt1INo
       ;DEC L
        CP #F
        JNZ $+5
        CP (HL)
        JZ CMt1INE
        LD (HL),A
        INC A
        AND #F
        SUB -#B0
        IYAi
        SUB #B0
       ;JZ CMt1INE ;B0
;Bx,Henv,Lenv
       CALL NZ,PatDisp
CMt1INE INC L
        LD A,(IX+4)
        AND #F0
       CP C
       JZ CMt1INo
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        CP (HL)
        JZ CMt1INo
        LD (HL),A
        SUB -#40
CMt1Yo2 IYAi
CMt1INo INC L
        LD A,(IX+4)
        AND #F
        JZ CMt1Nv
        CP (HL)
        JZ CMt1Nv
        LD (HL),A
        SUB 64
        IYAi
CMt1Nv  INC L
       JR CMt1Nn
CMisb
        LD A,(IX-6)
        AND 31
        CP (HL)
        JZ CMt1Nn
        LD (HL),A
        SUB -#20
        IYAi
DJt1Nn=$-CMisb
CMt1Nn  LD A,(IX+1)
        AND #F0
        CALL NZ,CMcom
        CALL CMt1PP
        LD A,C
CMoldN=$+1
        CP 0
        JZ CMt1Nb
        IYNi #B1
        LD (CMoldN),A
        IYAi
CMt1Nb  CALL CMnot
CMt1Q   LD H,'CMbuf
        LD A,(t1buf+2)
        LD L,A
        RLA 
        JC $+4
        LD (HL),-1
        LD A,(t1buf)
        ADD A,16
        JC $+5
        LD L,A
        LD (HL),-1
        EXA 
        OR A
        JP NZ,CMt10
        IYAi       ;#0=end of track
        POP IX

        PUSH IY
;CMPcnt=$+1
       LD A,(CMPcnt)
        OR A
        JZ CMt2Q
       ;LD (CMt2L),A ;кол-во сделанных треков
       ;LD IX,lce88  ;начало треков
       ;LD E,(IX)
       ;LD D,(IX+1)
       ;LD HL,mod
       ;ADD HL,DE
       ;PUSH HL
       ;POP IX
       LD IX,(lce88)
       LD DE,mod
       ADD IX,DE
       ;LD IY,(CMt2IY)  ;начало текущего трека
        XOR A
CMt20   LD E,A
        ADD A,A
        LD L,A
        LD H,'l5b00
        LD C,(HL)
        INC L
        LD B,(HL) ;длина старого трека
        LD A,E
        EXA 
        LD L,(IX)
        INC IX
        LD H,(IX)
        LD (CMt2HL),HL ;смещ. старого трека
        INC IX
        LD DE,mod
        ADD HL,DE
       ;PUSH IY
       ;POP DE  ;начало текущего трека
       LD DE,(CMt2IY)  ;начало текущего трека
        LD A,B
        OR C
        JZ CMt2Ncp
CMt2cp  LD A,(DE)
        CP (HL)
        JNZ CMt2Ncp
        INC HL,DE
        DEC BC
        LD A,B
        OR C
        JNZ CMt2cp
CMt2Ycp POP HL  ;бывший IY
CMt2HL=$+1
        LD DE,0  ;смещ. старого трека (к-й такой же, как новый)
        LD HL,CMPcnt
        INC (HL)
        LD HL,(sngCUR)
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
    ;INC HL,HL,HL,HL
        LD (sngCUR),HL
CMt2IY=$+2
        LD IY,0  ;как было до компиляции трека
        RET 
CMt2Ncp
        BIT 7,D
       JNZ CMtNeMEM
       LD A,6
       OUT (-2),A
       JR CMt2Ycp ;память кончилась
CMtNeMEM
        EXA 
        INC A
CMPcnt=$+1
        CP 0  ;кол-во сделанных треков
        JNZ CMt20
CMt2Q   LD HL,CMPcnt
        LD B,(HL)
        INC (HL) ;кол-во сделанных треков
        LD HL,(CMt2IY)
       PUSH HL
        LD DE,-mod
        ADD HL,DE
        EXD 
        LD HL,(sngCUR)
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
    ;INC HL,HL,HL,HL
        LD (sngCUR),HL
       POP DE  ;начало текущего трека
        POP HL  ;бывший IY=после конца трека
        PUSH HL
        POP IY
        OR A
        SBC HL,DE
        EXD 
        LD L,B ;кол-во сделанных треков
        ADD HL,HL
        LD H,'l5b00
        LD (HL),E
        INC L
        LD (HL),D ;длина трека
        RET 
CMPso
        LD HL,lce8a
        LD (pnter),HL
        LD IY,(sngE)
        XOR A
CMPs    PUSH AF
        CALL CMPsmp
        POP AF
        INC A
        AND 31
        JNZ CMPs
        LD HL,lceca
        LD (pnter),HL
CMPo    PUSH AF
        CALL CMPorn
        POP AF
        INC A
        AND 15
        JNZ CMPo
        LD (sngE),IY
        RET 
CMPsmp
        LD L,0
        PUSH AF
        ADD A,'SMPS
        LD H,A
        CALL OUT4
        LD DE,BUF
        PUSH DE
        POP IX
        LD BC,256
        LDIR 
        POP AF
        LD B,A
        ADD A,16
        LD H,'CMbuf
        LD L,A
        LD A,(HL)
        LD L,B
        ADD HL,HL
        LD H,'TSMPSZ
        OR A
        JNZ CMsmpU
        OR (HL)
        JNZ CMsmpU0
        INC A
        INC HL
        SUB (HL)
        DEC HL
        JNZ CMsmpU0
        LD A,(IX+2)
        XOR 64
        OR (IX)
        OR (IX+1)
        JNZ CMsmpU0
        LD A,(IX+3)
        CP 15
CMsmpU0 JZ pntii ;
CMsmpU
        CALL PUTIY
        LD A,(HL)
        IYAi
        INC HL
        LD A,(HL)
        IYAi
        LD B,A
CMPS0   LD A,(IX+2)
        LD C,A
        AND 31
        RLCA 
        LD D,A
        LD A,C
        AND #20
        JZ $+4
        LD A,1
        OR D
       LD D,A
        LD A,(IX+3)
        AND #C0
       OR D
        IYAi
        LD A,C
        RLCA 
        AND #80
        LD D,A
        LD A,C
        RRCA 
        RRCA 
        RRCA 
        AND #10
        OR D
        LD D,A
        LD A,(IX+3)
        LD E,A
        AND #F
        OR D
        LD D,A
        LD A,E
        RLCA 
        AND #60
        OR D
        IYAi
        LD A,(IX)
        IYAi
        LD A,(IX+1)
        IYAi
        LD DE,4
        ADD IX,DE
        DJNZ CMPS0
        RET 
pnter=$+1
pntii
        LD HL,0
        INC HL,HL
        LD (pnter),HL
        RET 
CMPorn
        PUSH AF
        CALL HLOR3
        CALL OUT4
        LD DE,BUF
        LD BC,64
        LDIR 
        POP AF
        LD L,A,H,'CMbuf
        LD C,(HL)
        LD HL,TORNSZ
        ADD A,A
        ADD A,L
        LD L,A
        LD A,C
        OR A
        JNZ CMornU
        OR (HL)
        JNZ CMornU0
        INC A
        INC HL
        SUB (HL)
        DEC HL
        JNZ CMornU0
        LD A,(BUF)
        OR A
CMornU0 JZ pntii ;
CMornU
        CALL PUTIY
        PUSH IY
        POP DE
       LDI 
       INC BC
        LD A,(HL)
        LD (DE),A
        INC DE
        LD C,A
        LD HL,BUF
        LDIR 
        PUSH DE
        POP IY
        RET 

t1not=$+1
CMnot
        LD A,0
       LD H,#D0
        CP 97
        JZ CMnotQ
       LD H,#C0
        CP 96
        JZ CMnotQ
        SUB #B0
       LD H,A
CMnotQ  IYHi
        PUSH IX
CMnotIX=$+2
        LD IX,0
CMjp=$+1
        CALL CMret
        LD HL,CMret,(CMjp),HL
        POP IX
CMret   RET 
CMcom
        LD C,16
        SUB C
        JZ CMglD
        SUB C
        JZ CMglU
        SUB C
        JZ CMpor
        SUB C
        JP Z,CMso
        SUB C
        JP Z,CMoo
        SUB C
        JP Z,CMvib
        SUB 48
        JZ CMenD
        SUB C
        JZ CMenU
        SUB C
        RET NZ
        LD A,(IX+2)
;CMoldT=$+1
;CP 0
;RET Z
        OR A
        RET Z
        LD A,9
        LD HL,CMtm2
        JR CMenDQ
CMglD
        LD HL,CMgD2
        JR $+5
CMglU
        LD HL,CMgU2
        LD A,1
        JR CMenDQ
CMgD2
        LD A,(IX+1)
        AND #F
        LD H,A
        JR CMpoQ
CMgU2
        LD A,(IX+1)
        AND #F
        LD H,A
        SCF 
        JR CMpoQ
CMenU
        LD HL,CMgU2
        JR $+5
CMenD
        LD HL,CMgD2
        LD A,8
CMenDQ  IYAi
        LD (CMjp),HL
        RET 
CMpor
       IFN portres
        LD A,(po2not)
        CP 96
        CALL NC,CMpores
        LD (po2not),A
       ENDIF 
        LD A,(t1not)
        CP 96
        RET NC
po2not=$+1
       CP 0
       RET Z
        LD A,2
        LD HL,CMpo2
        JR CMenDQ
CMpo2
        LD A,(IX+1)
        AND #F
        IYAi
        LD A,(po2not)
        LD HL,FrTab
        ADD A,A
       ADD A,L
        LD L,A
        LD E,(HL)
        INC L
        LD D,(HL)
        LD A,(t1not)
        ADD A,A
       ADD A,FrTab
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        SBC HL,DE
        PUSH AF
        CALL C,NEGHL
        POP AF
        IYLi
CMpoQ
        IYHi
        LD L,(IX+2),H,0
        CALL C,NEGHL
        IYLi
        IYHi
        RET 
CMoo
        LD A,4
        JR CMsoQ
CMso
        LD A,3
CMsoQ   LD HL,CMof
        JR CMenDQ
CMvib
        LD A,5
        LD HL,CMv2
        JR CMenDQ
CMof
        LD A,(IX+2)
        AND 63
        IYAi
        RET 
CMtm2
        LD A,(IX+2)
;LD (CMoldT),A
        IYAi
        RET 
CMv2
        LD A,(IX+2)
        LD C,A
        AND #F0
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        IYAi
        LD A,C
        AND #F
        IYAi
        RET 
CMt1PP
        LD (CMnotIX),IX
        EXA 
        LD B,A
        EXA 
        DJNZ CMisnot
        EXA 
        DEC A
        EXA 
        LD A,(CMoldN)
        DEC A
        JZ CMt1PPQ
        IYNi #B1
        IYNi 1
CMt1PPQ CALL CMnot
        POP HL
        JP CMt1Q

;COUNT blS
CMisnot
        LD C,1
CMisno0 LD DE,18
        ADD IX,DE
        LD HL,t1buf+1
        LD A,(IX)
        AND #7F
        JNZ CMisnoQ
        LD A,(IX+1)
        AND #F0
        JNZ CMisnoQ
        INC L
        LD A,(IX+3)
        AND #F
       LD E,A
       JZ CMisn0x
       ;JZ CMisnNE
        CP #F
        JNZ CMisnoQ
        DEC L
        CP (HL)
        JNZ CMisnoQ
CMisn0x LD A,(IX+4)
        AND #F0
       CP E
       JZ CMisnNE
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        INC L
        CP (HL)
        JNZ CMisnoQ
CMisnNE LD A,(IX+4)
        INC L
        AND #F
        JZ $+5
        CP (HL)
        JNZ CMisnoQ
        INC L
        LD A,(CMisb-1)
        OR A
        JNZ CMisnNQ
        LD A,(IX-6)
        CP (HL)
        JNZ CMisnoQ
CMisnNQ INC C
        DJNZ CMisno0
CMisnoQ EXA 
        SUB C
        EXA 
        RET 
LDPT3PP
        CALL 8026 ;CS=merge
        JNC PT3PP2
        CALL CLPATS
        CALL CLORNSM
        LD DE,TPATSZ+1
        LD BC,PATS-1
        LD H,D,L,B
        LD (HL),63
        LDIR 
PT3PP2
       ;DI
        CALL OUT7
        LD A,(lce84),(FRQn),A
        LD A,(lce85),(TEMPO),A
        LD A,(lce87),(LOOP),A
        LD H,'l5b00
        LD BC,PATS*256
Mdiv3   LD A,C
        ADD A,A,A,C
        LD L,A
        LD (HL),C
        INC C
        DJNZ Mdiv3
        CALL CLPOS
        LD A,(lce86),(LENG),A
        LD B,A
        LD IX,lceea
        LD H,'l5b00
        LD DE,TPOSS
PT3POS  LD L,(IX)
        LD A,(HL),(DE),A
        INC E
        INC IX
        DJNZ PT3POS
       XOR A
       LD (DE),A
       INC E
       JNZ $-2
        LD HL,lce3f
        LD DE,TTITLE
        LD C,32
        LDIR 
        LD HL,lce63
        LD DE,TAUTHOR
        LD C,33;32 ;3.7 for TS
        LDIR 
        CALL PT3PATS
        CALL PT3SMP
        CALL PT3ORN
       JP GETPATLEN
       ;LD HL,(TPOSS),H,'TPATSZ
       ;LD A,(HL),(PATLEN),A
      ;IF process
      ;LD IY,iy
      ;ENDIF
       ;RET
       IFN process
PROCESS
        LD A,201,(MHEXFNT+2),A
        XOR A
        LD (PROBARX),A
        LD BC,mPROCES
        CALL WINDUM
        LD HL,tPROCES
        JP PRMENU
mPROCES DB 4,#C,#1C,#10,#47
tPROCES DB 6,#11,0,"PROCESSIN",#C7
CMPQ
        XOR A
;2
PROBAR
        PUSH AF
PROBARY=$+1
PROBARX=$+2
        LD DE,1
        OR A     ;A=0: 100%
        LD B,1
        JNZ PROBAR0
        LD A,#2A ;?
        SUB D
        JC PROBARQ
       JZ PROBARQ
        LD B,A
PROBAR0 LD A,"0"
        CALL PRADD
        INC D
        DJNZ PROBAR0
        LD (PROBARY),DE
PROBARQ POP AF
        RET 
       ENDIF 
       IFN portres
CMpores
CMporeA=$+1
        LD A,0
        LD HL,TPOSS
        LD B,(HL)
        INC L
cMpore0 CP (HL)
        JZ $+6
        LD B,(HL)
        INC L
        JNZ cMpore0
        LD A,B ;пред.паттерн
       CALL AtoPAT
        LD HL,(patdisp),H,0
        ADD HL,DE
        LD B,#40
        LD DE,18
        LD A,(HL)
        AND #7F
        DEC A
        LD C,A
cMpore1 LD A,(HL)
        AND #7F
        JZ cMpore2
        DEC A
        CP 96
        JZ $+3
        LD C,A
cMpore2 ADD HL,DE
        DJNZ cMpore1
        CALL OUT7
        LD A,C
        RET 
       ENDIF 
LDPT2PP
       LD A,32
       LD (ts48),A
        LD A,1,(FRQn),A
        CALL CLPATS
        CALL CLSMPS ;DICLos? CLORNSM?
        CALL CLORNS
        LD DE,TPATSZ+1
        LD BC,PATS-1
        LD H,D,L,B
        LD (HL),63
        LDIR 
        CALL PT2PP2
        XOR A
        LD (POS),A
        RET 
PT2PP2
        CALL OUT7
        LD HL,mod
        LD A,(HL),(TEMPO),A
        INC HL
        LD A,(HL),(LENG),A
        INC HL
        PUSH AF
        LD A,(HL),(LOOP),A
        LD HL,_ce86
        LD DE,TTITLE
        LD BC,30
        LDIR 
        LD A," "
        LD (DE),A
        INC DE
        LD (DE),A
        LD HL,TAUTHOR
        LD DE,TAUTHOR+1
        LD (HL),A
        LD C,31
        LDIR 
        POP AF
        LD C,A
        LD HL,_cea4
        LD DE,TPOSS
        LDIR 
       XOR A
       LD (DE),A
       INC E
       JNZ $-2
        CALL PT2SMP
        CALL PT2ORN
        CALL PT2PATS
GETPATLEN
        LD HL,(TPOSS),H,'TPATSZ
        LD A,(HL),(PATLEN),A
        RET 
PT3PATS
        CALL OUT7
        LD B,PATS-1
PT3P0   LD HL,TPOSS
PT3P1   LD A,(HL)
        CP B
        JZ PT3P0Q
        INC L
        JNZ PT3P1
        DJNZ PT3P0
PT3P0Q  LD A,B,(PT3Plst),A
        LD HL,(lce88)
        LD DE,mod
        ADD HL,DE
        XOR A
PT3P2   PUSH AF
       CALL KILLBUF
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
         LD A,3,(PT3Edsp),A
        LD IX,BUF+3
        CALL PT3PAPP
        POP HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
         LD A,8,(PT3Edsp),A
       ;LD (PT3putN+1),A ;noise ON
        LD IX,BUF+8
        CALL PT3PAPP
        POP HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
       ;XOR A
       ;LD (PT3putN+1),A ;noise OFF
         LD A,13,(PT3Edsp),A
        LD IX,BUF+13
        CALL PT3PAPP
        POP HL
        POP AF
;D=patlen-1
       CALL PATfrBUF
PT3Plst=$+1
        CP 0
        RET Z
        INC A
        JR PT3P2

;на 99% совпадает с PT3PATS
PT2PATS
        CALL OUT7
        LD B,31
PT2P0   LD HL,TPOSS
PT2P1   LD A,(HL)
        CP B
        JZ PT2P0Q
        INC L
        JNZ PT2P1
        DJNZ PT2P0
PT2P0Q  LD A,B,(PT2Plst),A
        LD HL,(_ce84)
        LD DE,mod
        ADD HL,DE
        XOR A
PT2P2   PUSH AF
       CALL KILLBUF
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
        LD A,3
        LD IX,BUF+3
        CALL PT2PAPP
        POP HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
        LD A,8
        LD IX,BUF+8
        CALL PT2PAPP
        POP HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        PUSH HL
        LD A,13
        LD IX,BUF+13
        CALL PT2PAPP
        POP HL
        POP AF
       CALL PATfrBUF
PT2Plst=$+1
        CP 0
        RET Z
        INC A
        JR PT2P2
PT3PAPP
        EXD 
        LD DE,mod
        ADD HL,DE
        XOR A
        LD (PT3orN),A
        LD (PT3n),A
        LD D,A
PT3PAP0 LD BC,#1020
        LD A,(HL)
        INC HL
        OR A
        RET Z
        ADD A,B
        JC PT3orn
        ADD A,C
        JC PT3smp
        ADD A,B
        JP C,PT3vol
        ADD A,B
        JP C,PT3Et
        ADD A,96
        JC PT3note
        ADD A,B
        JP C,PT3newO
        ADD A,C
        JP C,PT3nois
        ADD A,B
        JP C,PT3Etyp
        ADD A,B
        JP PT3com
PT3blN
        LD A,(HL)
        INC HL
        DEC A
        LD (PT3bls),A
        JR PT3PAP0

PT3bls=$+1
PT3blQ
        LD A,0
        OR A
        JZ PT3PAP0
        LD E,A
        LD BC,18
PT3bl0  INC D
        CALL PT3putN
        ADD IX,BC
        DEC E
        JNZ PT3bl0
        JR PT3PAP0
PT3note
        INC D
        INC A
        LD B,A
        LD A,(IX)
        AND #80
        OR B
        LD (IX),A
        CALL PT3putN
        CALL PT3cU
        LD BC,18
        ADD IX,BC
        JR PT3blQ
PT3orn
;Fx,smp*2
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        LD (PT3orN),A
        OR (IX+4)
        LD (IX+4),A
        LD A,#F
       ;LD (PT3typ),A
        LD (IX+3),A
PT3oQ   LD A,(HL)
        INC HL
        RLCA 
        RLCA 
        LD B,A
        AND #80
        LD (IX),A
        LD A,B
        RLA 
        OR (IX+3)
        LD (IX+3),A
        JP PT3PAP0
PT3smp
        JZ PT3bl ;end of note
        CP 16
        JC $+6
        SET 7,(IX)
        AND #F
        RLCA 
        RLCA 
        RLCA 
        RLCA 
        OR (IX+3)
        LD (IX+3),A
        JP PT3PAP0
PT3bl
        INC D
        CALL PT3putN
        CALL PT3cU
        LD BC,18
        ADD IX,BC
        JP PT3blQ
PT3vol
        JZ PT3res
        OR (IX+4)
        LD (IX+4),A
        JP PT3PAP0
PT3res
        LD A,(IX)
        AND #80
        OR 97
        LD (IX),A
        CALL PT3putN
        CALL PT3cU
        LD BC,18
        ADD IX,BC
        INC D
        JP PT3blQ
PT3Et
        JNZ PT3nEof
;B0=envoff
        LD A,#F
       ;LD (PT3typ),A
        OR (IX+3)
        LD (IX+3),A
        JP PT3eQ
PT3nEof DEC A
        JP Z,PT3blN
       ;LD (PT3typ),A
        LD B,A
        LD A,(IX+3)
        AND #F0
        OR B
        LD (IX+3),A
        CALL PT3env
PT3orN=$+1
PT3eQ   LD A,0
        OR (IX+4)
        LD (IX+4),A
        JP PT3PAP0
PT3env
        PUSH HL
        PUSH IX
        POP HL
PT3Edsp=$+1
        LD BC,0
        OR A
        SBC HL,BC
        LD B,H
        LD C,L
        POP HL
        LD A,(HL)
        INC HL
        LD (BC),A
        INC BC
        LD A,(HL)
        INC HL
        LD (BC),A
        RET 
PT3newO
        RLCA 
        RLCA 
        RLCA 
        RLCA 
        LD (PT3orN),A
        LD B,A
        JNZ PT3nXF0X
        LD A,(IX+3)
        AND #F
        JNZ PT3nXF0X
        LD A,(IX+3)
        OR #F
        LD (IX+3),A
PT3nXF0X
        LD A,(IX+4)
        AND #F
        OR B
        LD (IX+4),A
;PT3typ=$+1
       ;LD A,0
       ;OR (IX+3)
       ;LD (IX+3),A
        JP PT3PAP0
PT3nois
        LD (PT3n),A
        JP PT3PAP0
;4
PT3putN
       ;LD A,0
       ;OR A
       ;RET Z
       LD A,LX ;проверяем channel=B
       RRA 
       RET C
        LD (IX-6),0
PT3n=$-1
        RET 
PT3Etyp
        JNZ PT3EnO
        LD A,#F
       ;LD (PT3typ),A
        OR (IX+3)
        LD (IX+3),A
        JR PT3EtyQ

PT3EnO ;LD (PT3typ),A
        OR (IX+3)
        LD (IX+3),A
        CALL PT3env
PT3EtyQ LD A,(PT3orN)
        OR (IX+4)
        LD (IX+4),A
        JP PT3oQ

PT3jp=$+1
PT3cU
        CALL PT3ret
        PUSH HL
        LD HL,PT3ret
        LD (PT3jp),HL
        POP HL
PT3ret  RET 
PT3com
        PUSH HL
        DEC A
        LD HL,PT3glis
        JZ PT3cQ
        DEC A
        LD HL,PT3port
        JZ PT3cQ
        DEC A
        LD HL,PT3so
        JZ PT3cQ
        DEC A
        LD HL,PT3oo
        JZ PT3cQ
        DEC A
        LD HL,PT3vib
        JZ PT3cQ
        SUB 3
        LD HL,PT3egl
        JZ $+5
        LD HL,PT3tmp
PT3cQ   LD (PT3jp),HL
        POP HL
        JP PT3PAP0
PT3tmp
        LD A,(HL)
        INC HL
        LD (IX+2),A
        LD (IX+1),#B0
        RET 
PT3port
        LD A,(HL)
        OR #30
        LD (IX+1),A
        INC HL,HL,HL
        PUSH DE
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        EXD 
        LD A,H
        OR A
       ;JP P,$+6
        CALL M,NEGHL
XIX2EPOP
        EXD 
       IFN goodpak
        LD (IX+2),E
        POP DE
        RET 
       ELSE 
        LD A,E
        POP DE
IX2A    LD (IX+2),A
        RET 
       ENDIF 
PT3so
        LD A,(HL)
        INC HL
        LD (IX+1),#40
       IFN goodpak
        LD (IX+2),A
        RET 
       ELSE 
        JR IX2A
       ENDIF 
PT3oo
        LD A,(HL)
        INC HL
        LD (IX+1),#50
       IFN goodpak
        LD (IX+2),A
        RET 
       ELSE 
        JR IX2A
       ENDIF 
PT3vib
        LD A,(HL)
        RRCA 
        RRCA 
        RRCA 
        RRCA 
        INC HL
        OR (HL)
        INC HL
        LD (IX+1),#60
       IFN goodpak
        LD (IX+2),A
        RET 
       ELSE 
        JR IX2A
       ENDIF 
PT3glis
        PUSH DE
        LD A,(HL)
        OR #10
        LD C,A
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        EXD 
       ;LD A,H
       ;OR A
        LD (IX+1),C
       BIT 7,H
       JZ PT3gl1
       ;JP P,PT3gl1
        CALL NEGHL
        LD A,C
        AND #F
        OR #20
        LD (IX+1),A
PT3gl1  EXD 
        LD (IX+2),E
        POP DE
        RET 
PT3egl
        PUSH DE
        LD A,(HL)
        OR #90
        LD C,A
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        EXD 
       ;LD A,H
       ;OR A
        LD (IX+1),C
       BIT 7,H
       JZ PT3egl9
       ;JP P,PT3egl9
        CALL NEGHL
        LD A,C
        AND #F
        OR #A0
        LD (IX+1),A
PT3egl9
       IFN goodpak
        EXD 
        LD (IX+2),E
        POP DE
        RET 
       ELSE 
        JR XIX2EPOP
       ENDIF 
PT2orn
        RLCA 
        RLCA 
        RLCA 
        RLCA 
        LD (PT2orN),A
        LD B,A
        LD A,(IX+4)
        AND #F
        OR B
        LD (IX+4),A
PT2typ=$+1
        LD A,0
        OR (IX+3)
        LD (IX+3),A
        JR PT2PAP0
PT2blN
        LD (PT2bls),A
        JR PT2PAP0
PT2vol
        OR (IX+4)
        LD (IX+4),A
        JR PT2PAP0
PT2tmp
        LD (IX+1),#B0
        LD A,(HL)
        JR IX2P2P
PT2port
        LD (IX+1),#31
        LD A,(HL)
        INC HL
        INC HL
        OR A
        JP P,IX2P2P
        NEG 
        JR IX2P2P
PT2glis
        LD (IX+1),#11
        LD A,(HL)
        BIT 7,A
        JZ $+8
        LD (IX+1),#21
        NEG 
IX2P2P  LD (IX+2),A
        INC HL
        JR PT2PAP0
PT2PAPP
        LD (PT2Edsp),A
        EXD 
        LD DE,mod
        ADD HL,DE
        XOR A
        LD (PT2typ),A
        LD (PT2orN),A
        LD D,A
PT2PAP0 LD C,16
        LD A,(HL)
        INC HL
        OR A
        RET Z
        ADD A,32
        JC PT2smp
        ADD A,96
        JC PT2note
        ADD A,C
        JP C,PT2env
        ADD A,C
        JC PT2orn
        ADD A,64
        JC PT2blN
        ADD A,C
        JC PT2vol
        INC A
        JZ PT2tmp
        INC A
        JZ PT2glis
        INC A
        JZ PT2port
        INC A
        JZ PT2PAP0
        LD A,(HL)
        INC HL
        PUSH HL
        LD BC,(PT2Edsp)
        DEC BC,BC
        PUSH IX
        POP HL
        SBC HL,BC
PT2NOI  LD (HL),A ;noise
       LD BC,18
       ADD HL,BC
       LD BC,BUF+#480
       SBC HL,BC
       ADD HL,BC
       JC PT2NOI
        POP HL
        JR PT2PAP0
PT2smp
        JZ PT2res
        CP 16
        JC $+6
        SET 7,(IX)
        AND #F
        RLCA 
        RLCA 
        RLCA 
        RLCA 
        OR (IX+3)
        LD (IX+3),A
        JR PT2PAP0
PT2res
        LD A,96
PT2note INC A
        LD B,A
        LD A,(IX)
        AND #80
        OR B
        LD (IX),A
PT2bl   INC D
        LD BC,18
        ADD IX,BC
PT2bls=$+1
        LD A,0
        OR A
        JZ PT2PAP0
        INC D
        ADD IX,BC
        DEC A
        JNZ $-4
        JR PT2PAP0
PT2env
        JZ PT2bl
        CP #F
        LD (PT2typ),A
        JNZ PT2norn
        OR (IX+3)
        LD (IX+3),A
        JR PT2eQ
PT2norn OR (IX+3)
        LD (IX+3),A
        PUSH HL
        PUSH IX
        POP HL
PT2Edsp=$+1
        LD BC,0
        OR A
        SBC HL,BC
        LD B,H,C,L
        INC BC
        POP HL
        LD A,(HL)
        INC HL
        LD (BC),A
        DEC BC
        LD A,(HL)
        INC HL
        LD (BC),A
PT2orN=$+1
PT2eQ  LD A,0
       OR (IX+4)
       LD (IX+4),A
        JP PT2PAP0
PT3SMP
        LD A,1
        LD HL,lce8a+2
PT3SMP0  PUSH AF
        CALL OUT7
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
       EX (SP),HL
       PUSH HL ;AF
        LD A,E
        OR D
        JZ PT3SMPQ
        LD HL,mod
        ADD HL,DE
        LD DE,BUF
        PUSH DE
        POP IX
        LD B,2;BC,258
        LDIR 
         POP AF
         PUSH AF
        ADD A,A
        LD L,A,H,'TSMPSZ
        LD A,(IX),(HL),A
        INC L
        LD B,(IX+1),(HL),B
         POP AF
         PUSH AF
        ADD A,'SMPS
        LD H,A
        XOR A
        LD L,A
     CP B
     JZ PT3SMPQ
        CALL OUT4
PT3SMP1 LD A,(IX+2+2),(HL),A
        INC HL
        LD A,(IX+3+2),(HL),A
        INC HL
        LD A,(IX+0+2),D,A
        AND #3F
        RRA ;SRL A
        JNC $+4
        OR #20
        LD C,A
        LD A,(IX+1+2),E,A
        AND #F
        INC HL
        LD (HL),A
        LD A,D;(IX+0+2)
        AND #C0
        OR (HL)
        LD (HL),A
        LD A,E
        AND #80
        RRCA 
        OR C
        LD C,A
        LD A,E
        AND #10
        RLCA 
        RLCA 
        RLCA 
        OR C
        DEC HL
        LD (HL),A
        INC HL
        LD A,E
        RRCA 
        AND #30
        OR (HL)
        LD (HL),A
        INC HL
        LD DE,4
        ADD IX,DE
        DJNZ PT3SMP1
PT3SMPQ  POP AF
       POP HL
        INC A
        AND 31
        JNZ PT3SMP0
        RET 

PT2SMP
        LD A,1
        LD HL,_ce26
PT2SMP0  PUSH AF
        CALL OUT7
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
       EX (SP),HL
       PUSH HL ;AF
        LD A,E
        OR D
        JZ PT2SMPQ
        LD HL,mod
        ADD HL,DE
        LD DE,BUF
        PUSH DE
        POP IX
        LD B,2;BC,#C6
        LDIR 
         POP AF
         PUSH AF
        ADD A,A
        LD L,A,H,'TSMPSZ
        LD A,(IX+1),(HL),A
        INC L
        LD B,(IX),(HL),B
         POP AF
         PUSH AF
        ADD A,'SMPS
        LD H,A
        XOR A
        LD L,A
        CALL OUT4
PT2SMP1 LD A,(IX+0+2)
       LD C,A
        RRCA 
        RRCA 
        RRCA 
        AND 31
        INC HL,HL
        LD (HL),A
       BIT 1,C;(IX+0+2)
        JZ $+4
        SET 7,(HL)

        LD A,(IX+1+2)
        ;AND #F0
        ;RRCA
        ;RRCA
        ;RRCA
        ;RRCA
        INC HL
        LD (HL),A
       XOR A
       RRD 
        ;LD A,(IX+1+2)
        ;AND #F
       LD D,A ;(IX+1+2)&#0F

        DEC HL
       BIT 0,C;(IX+0+2)
        JZ PT2SMPN
        LD A,(HL)
        OR #40
        AND #E0
        LD (HL),A
PT2SMPN LD E,(IX+2+2)
       ;LD A,(IX+1+2)
       ;AND #F
       ;LD H,A
       BIT 2,C;(IX+0+2)
        EXD 
        CALL Z,NEGHL
        EXD 
        DEC HL,HL
        LD (HL),E
        INC HL
        LD (HL),D
        LD DE,3
        ADD IX,DE
        ADD HL,DE
        DJNZ PT2SMP1
PT2SMPQ  POP AF
       POP HL
        INC A
        AND 31
        JNZ PT2SMP0
        RET 

PT2ORN
        LD HL,_ce66
        SCF 
        JR PT23ORN
PT3ORN
        LD HL,lceca+2
        OR A
PT23ORN LD A,1
PT3ORN0  PUSH AF
        CALL OUT7
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
       EX (SP),HL
       PUSH HL ;AF
        LD A,D
        OR E
        JZ PT3ORNQ
        LD HL,mod
        ADD HL,DE
        LD DE,BUF
        PUSH DE
        LD B,2;BC,66
        LDIR 
        POP DE
         POP AF
         PUSH AF
        CALL HLOR3
        EXD 
        LD C,A,B,'TORNSZ
        CALL OUT4
         POP AF
         PUSH AF
         JNC PT3ORN3
        INC L
        LD A,(HL),(BC),A
        DEC L
        LD A,(HL)
        INC L
        JR $+6
PT3ORN3  LD A,(HL),(BC),A
         INC L
         LD A,(HL)
        INC C
        LD (BC),A
        INC L
        LD C,A,B,0
        LDIR 
PT3ORNQ  POP AF
       POP HL
        INC A
        BIT 4,A
        JZ PT3ORN0
        RET