?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. ;Universal PT2'n'PT3 Turbo Sound player for ZX Spectrum
  2. ;(c)2004-2007 S.V.Bulba <vorobey@mail.khstu.ru>
  3. ;Specially for AlCo
  4. ;http://bulba.untergrund.net/ (http://bulba.at.kz/)
  5.         MODULE VTPL
  6. ;Release number
  7. Release EQU "0"
  8. ;Conditional assembly
  9. ;1) Current position counters at (Vars1+0) and (Vars2+0)
  10. CurPosCounter=0
  11. ;2) Allow channels allocation bits at (START+10)
  12. ACBBAC=0
  13. ;3) Allow loop checking and disabling
  14. LoopChecker=1
  15. ;4) Insert official identificator
  16. Id=0
  17. ;5) Set IY for correct return to ZX Basic
  18. Basic=1
  19.  
  20. ;Features
  21. ;--------
  22. ;-Can be compiled at any address (i.e. no need rounding ORG
  23. ; address).
  24. ;-Variables (VARS) can be located at any address (not only after
  25. ; code block).
  26. ;-INIT subprogram checks PT3-module version and rightly
  27. ; generates both note and volume tables outside of code block
  28. ; (in VARS).
  29. ;-Two portamento (spc. command 3xxx) algorithms (depending of
  30. ; PT3 module version).
  31. ;-New 1.XX and 2.XX special command behaviour (only for PT v3.7
  32. ; and higher).
  33. ;-Any Tempo value are accepted (including Tempo=1 and Tempo=2).
  34. ;-TS modes: 2xPT3, 2xPT2 and PT v3.7 TS standard.
  35. ;-Fully compatible with Ay_Emul PT3 and PT2 players codes.
  36. ;-See also notes at the end of this source code.
  37.  
  38. ;Limitations
  39. ;-----------
  40. ;-Can run in RAM only (self-modified code is used).
  41. ;-PT2 position list must be end by #FF marker only.
  42.  
  43. ;Warning!!! PLAY subprogram can crash if no module are loaded
  44. ;into RAM or INIT subprogram was not called before.
  45.  
  46. ;Call MUTE or INIT one more time to mute sound after stopping
  47. ;playing
  48.  
  49. ;Test codes (commented)
  50. ;       LD A,32 ;SinglePT3(TS if TSPT3.7),ABC,Looped
  51. ;       LD (START+10),A
  52. ;       LD HL,#8000 ;Mod1
  53. ;       LD DE,#A000 ;Mod2 (optional)
  54. ;       CALL START+3
  55. ;       EI
  56. ;_LP    HALT
  57. ;       CALL START+5
  58. ;       XOR A
  59. ;       IN A,(#FE)
  60. ;       CPL
  61. ;       AND 15
  62. ;       JR Z,_LP
  63. ;       JR START+8
  64.  
  65. TonA    EQU 0
  66. TonB    EQU 2
  67. TonC    EQU 4
  68. Noise   EQU 6
  69. Mixer   EQU 7
  70. AmplA   EQU 8
  71. AmplB   EQU 9
  72. AmplC   EQU 10
  73. Env     EQU 11
  74. EnvTp   EQU 13
  75.  
  76. ;Entry and other points
  77. ;START initialize playing of modules at MDLADDR (single module)
  78. ;START+3 initialization with module address in HL and DE (TS)
  79. ;START+5 play one quark
  80. ;START+8 mute
  81. ;START+10 setup and status flags
  82.  
  83. START:
  84.         LD HL,outputBuffer ;DE - address of 2nd module for TS
  85.         JR INIT
  86.         JP PLAY
  87.         JR MUTE
  88. SETUP   DB 0 ;set bit0, if you want to play without looping
  89.              ;(optional);
  90.              ;set bit1 for PT2 and reset for PT3 before
  91.              ;calling INIT;
  92.              ;bits2-3: %00-ABC, %01-ACB, %10-BAC (optional);
  93.              ;bits4-5: %00-no TS, %01-2 modules TS, %10-
  94.              ;autodetect PT3 TS-format by AlCo (PT 3.7+);
  95.              ;Remark: old PT3 TS-format by AlCo (PT 3.6) is not
  96.              ;documented and must be converted to new standard.
  97.              ;bit6 is set each time, when loop point of 2nd TS
  98.              ;module is passed (optional).
  99.              ;bit7 is set each time, when loop point of 1st TS
  100.              ;or of single module is passed (optional).
  101.  
  102. ;Identifier
  103.         IF Id
  104.         DB "=UniPT2/PT3/TS-Player r.",Release,"="
  105.         ENDIF
  106.  
  107.         IF LoopChecker
  108. CHECKLP LD HL,SETUP
  109.         BIT 0,(IY-100+VRS.ModNum)
  110.         JR Z,CHL1
  111.         SET 6,(HL)
  112.         JR CHL2
  113. CHL1    SET 7,(HL)
  114. CHL2    BIT 0,(HL)
  115.         RET Z
  116.         POP HL
  117.         INC (IY-100+VRS.DelyCnt)
  118.         INC (IY-100+VRS.ChanA+CHP.NtSkCn)
  119.         XOR A
  120.         LD (IY-100+VRS.AYREGS+AmplA),A
  121.         LD (IY-100+VRS.AYREGS+AmplB),A
  122.         LD (IY-100+VRS.AYREGS+AmplC),A
  123.         RET
  124.         ENDIF
  125.  
  126. MUTE: XOR A
  127.         LD H,A
  128.         LD L,A
  129.         LD (VARS1+VRS.AYREGS+AmplA),A
  130.         LD (VARS1+VRS.AYREGS+AmplB),HL
  131.         LD (VARS2+VRS.AYREGS+AmplA),A
  132.         LD (VARS2+VRS.AYREGS+AmplB),HL
  133.         JP ROUT
  134.  
  135. INIT:
  136. ;HL - AddressOfModule
  137. ;DE - AddresOf2ndModule
  138.         PUSH DE
  139.         PUSH HL
  140.         LD HL,VARS
  141.         LD (HL),0
  142.         LD DE,VARS+1
  143.         LD BC,VAR0END-VARS-1
  144.         LDIR
  145.         INC HL
  146.         LD (VARS1+VRS.AdInPtA),HL ;ptr to zero
  147.         LD (VARS2+VRS.AdInPtA),HL
  148.  
  149.         POP HL
  150.         LD IY,VARS1+100
  151.         LD A,(START+10)
  152.         AND 2
  153.         JP NZ,I_PT2
  154.  
  155.         CALL INITPT3
  156.         LD HL,(e_-SamCnv-2)*256+#18
  157.         LD (SamCnv),HL
  158.         LD A,#BA
  159.         LD (OrnCP),A
  160.         LD (SamCP),A
  161.         LD A,#7B
  162.         LD (OrnLD),A
  163.         LD (SamLD),A
  164.         LD A,#87
  165.         LD (SamClc2),A
  166.         POP HL
  167.         ;Use version and ton table of 1st module
  168.         LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
  169.         SUB #30
  170.         JR C,L20
  171.         CP 10
  172.         JR C,L21
  173. L20     LD A,6
  174. L21     LD (Version),A
  175.         PUSH AF ;VolTable version
  176.         CP 4
  177.         LD A,(IX+99-100) ;TONE TABLE NUMBER
  178.         RLA
  179.         AND 7
  180.         PUSH AF ;NoteTable number
  181.  
  182.         LD IY,VARS2+100
  183.         LD A,(START+10)
  184.         AND 48
  185.         JR Z,NOTS
  186.         CP 16
  187.         JR Z,TwoPT3s
  188.         LD A,(Version)
  189.         CP 7
  190.         JR C,NOTS
  191.         LD A,(IX+98-100) ;ALCO TS MARKER
  192.         CP #20
  193.         JR Z,NOTS
  194.         LD HL,VARS1
  195.         LD DE,VARS2
  196.         LD BC,VRS
  197.         LDIR
  198.         SET 1,(IY-100+VRS.ModNum)
  199.         LD C,A
  200.         ADD A,A
  201.         ADD A,C
  202.         SUB 2
  203.         LD (TSSub),A
  204.         JR AlCoTS_
  205. TwoPT3s CALL INITPT3
  206. AlCoTS_ LD A,1
  207.         LD (is_ts),A
  208.         SET 0,(IY-100+VRS.ModNum)
  209.  
  210. NOTS    LD BC,PT3PD
  211.         LD HL,0
  212.         LD DE,PT3EMPTYORN
  213.         JR INITCOMMON
  214.  
  215. I_PT2   CALL INITPT2
  216.         LD HL,#51CB
  217.         LD (SamCnv),HL
  218.         LD A,#BB
  219.         LD (OrnCP),A
  220.         LD (SamCP),A
  221.         LD A,#7A
  222.         LD (OrnLD),A
  223.         LD (SamLD),A
  224.         LD A,#80
  225.         LD (SamClc2),A
  226.         POP HL
  227.         LD A,5
  228.         LD (Version),A
  229.         PUSH AF
  230.         LD A,2
  231.         PUSH AF
  232.  
  233.         LD A,(START+10)
  234.         AND 48
  235.         JR Z,NOTS2
  236.  
  237.         LD IY,VARS2+100
  238.         LD A,1
  239.         LD (is_ts),A
  240.         SET 0,(IY-100+VRS.ModNum)
  241.         CALL INITPT2
  242.  
  243. NOTS2   LD BC,PT2PD
  244.         LD HL,#8687
  245.         LD DE,PT2EMPTYORN
  246.  
  247. INITCOMMON
  248.  
  249.         IF Basic
  250.         LD IY,#5C3A
  251.         ENDIF
  252.  
  253.         LD (PTDEC),BC
  254.         LD (PsCalc),HL
  255.         PUSH DE
  256.  
  257. ;note table data depacker
  258. ;(c) Ivan Roshin
  259.         LD DE,T_PACK
  260.         LD BC,T1_+(2*49)-1
  261. TP_0    LD A,(DE)
  262.         INC DE
  263.         CP 15*2
  264.         JR NC,TP_1
  265.         LD H,A
  266.         LD A,(DE)
  267.         LD L,A
  268.         INC DE
  269.         JR TP_2
  270. TP_1    PUSH DE
  271.         LD D,0
  272.         LD E,A
  273.         ADD HL,DE
  274.         ADD HL,DE
  275.         POP DE
  276. TP_2    LD A,H
  277.         LD (BC),A
  278.         DEC BC
  279.         LD A,L
  280.         LD (BC),A
  281.         DEC BC
  282.         SUB #F8*2
  283.         JR NZ,TP_0
  284.  
  285.         INC A
  286.         LD (VARS1+VRS.DelyCnt),A
  287.         LD (VARS2+VRS.DelyCnt),A
  288.         LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn
  289.         LD (VARS1+VRS.ChanA+CHP.NtSkCn),HL
  290.         LD (VARS1+VRS.ChanB+CHP.NtSkCn),HL
  291.         LD (VARS1+VRS.ChanC+CHP.NtSkCn),HL
  292.         LD (VARS2+VRS.ChanA+CHP.NtSkCn),HL
  293.         LD (VARS2+VRS.ChanB+CHP.NtSkCn),HL
  294.         LD (VARS2+VRS.ChanC+CHP.NtSkCn),HL
  295.         POP HL
  296.         LD (VARS1+VRS.ChanA+CHP.OrnPtr),HL
  297.         LD (VARS1+VRS.ChanB+CHP.OrnPtr),HL
  298.         LD (VARS1+VRS.ChanC+CHP.OrnPtr),HL
  299.         LD (VARS2+VRS.ChanA+CHP.OrnPtr),HL
  300.         LD (VARS2+VRS.ChanB+CHP.OrnPtr),HL
  301.         LD (VARS2+VRS.ChanC+CHP.OrnPtr),HL
  302.  
  303.         POP AF
  304.  
  305. ;NoteTableCreator (c) Ivan Roshin
  306. ;A - NoteTableNumber*2+VersionForNoteTable
  307. ;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
  308.  
  309.         LD HL,NT_DATA
  310.         LD D,0
  311.         ADD A,A
  312.         LD E,A
  313.         ADD HL,DE
  314.         LD E,(HL)
  315.         INC HL
  316.         SRL E
  317.         SBC A,A
  318.         AND #A7 ;#00 (NOP) or #A7 (AND A)
  319.         LD (L3),A
  320.         EX DE,HL
  321.         LD BC,T1_
  322.         ADD HL,BC
  323.  
  324.         LD A,(DE)
  325.         ADD A,T_
  326.         LD C,A
  327.         ADC A,T_/256
  328.         SUB C
  329.         LD B,A
  330.         PUSH BC
  331.         LD DE,NT_
  332.         PUSH DE
  333.  
  334.         LD B,12
  335. L1      PUSH BC
  336.         LD C,(HL)
  337.         INC HL
  338.         PUSH HL
  339.         LD B,(HL)
  340.  
  341.         PUSH DE
  342.         EX DE,HL
  343.         LD DE,23
  344.         LD IXH,8
  345.  
  346. L2      SRL B
  347.         RR C
  348. L3      DB #19  ;AND A or NOP
  349.         LD A,C
  350.         ADC A,D ;=ADC 0
  351.         LD (HL),A
  352.         INC HL
  353.         LD A,B
  354.         ADC A,D
  355.         LD (HL),A
  356.         ADD HL,DE
  357.         DEC IXH
  358.         JR NZ,L2
  359.  
  360.         POP DE
  361.         INC DE
  362.         INC DE
  363.         POP HL
  364.         INC HL
  365.         POP BC
  366.         DJNZ L1
  367.  
  368.         POP HL
  369.         POP DE
  370.  
  371.         LD A,E
  372.         CP TCOLD_1
  373.         JR NZ,CORR_1
  374.         LD A,#FD
  375.         LD (NT_+#2E),A
  376.  
  377. CORR_1  LD A,(DE)
  378.         AND A
  379.         JR Z,TC_EXIT
  380.         RRA
  381.         PUSH AF
  382.         ADD A,A
  383.         LD C,A
  384.         ADD HL,BC
  385.         POP AF
  386.         JR NC,CORR_2
  387.         DEC (HL)
  388.         DEC (HL)
  389. CORR_2  INC (HL)
  390.         AND A
  391.         SBC HL,BC
  392.         INC DE
  393.         JR CORR_1
  394.  
  395. TC_EXIT
  396.  
  397.         POP AF
  398.  
  399. ;VolTableCreator (c) Ivan Roshin
  400. ;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
  401.                            ;5.. - 2.x,3.5x..3.6x..VTII1.0)
  402.  
  403.         CP 5
  404.         LD HL,#11
  405.         LD D,H
  406.         LD E,H
  407.         LD A,#17
  408.         JR NC,M1
  409.         DEC L
  410.         LD E,L
  411.         XOR A
  412. M1      LD (M2),A
  413.  
  414.         LD IX,VT_+16
  415.  
  416.         LD C,#F
  417. INITV2  PUSH HL
  418.  
  419.         ADD HL,DE
  420.         EX DE,HL
  421.         SBC HL,HL
  422.  
  423.         LD B,#10
  424. INITV1  LD A,L
  425. M2      DB #7D
  426.         LD A,H
  427.         ADC A,0
  428.         LD (IX),A
  429.         INC IX
  430.         ADD HL,DE
  431.         DJNZ INITV1
  432.  
  433.         POP HL
  434.         LD A,E
  435.         CP #77
  436.         JR NZ,M3
  437.         INC E
  438. M3      DEC C
  439.         JR NZ,INITV2
  440.  
  441.         JP ROUT
  442.  
  443. INITPT3 CALL SETMDAD
  444.         PUSH HL
  445.         LD DE,100
  446.         ADD HL,DE
  447.         LD A,(HL)
  448.         LD (IY-100+VRS.Delay),A
  449.         PUSH HL
  450.         POP IX
  451.         ADD HL,DE
  452.         CALL SETCPPT
  453.         LD E,(IX+102-100)
  454.         INC HL
  455.  
  456.         IF CurPosCounter
  457.         LD (IY-100+VRS.PosSub),L
  458.         ENDIF
  459.  
  460.         ADD HL,DE
  461.         CALL SETLPPT
  462.         POP DE
  463.         LD L,(IX+103-100)
  464.         LD H,(IX+104-100)
  465.         ADD HL,DE
  466.         CALL SETPTPT
  467.         LD HL,169
  468.         ADD HL,DE
  469.         CALL SETORPT
  470.         LD HL,105
  471.         ADD HL,DE
  472.  
  473. SETSMPT LD (IY-100+VRS.SamPtrs),L
  474.         LD (IY-100+VRS.SamPtrs+1),H
  475.         RET
  476.  
  477. INITPT2 LD A,(HL)
  478.         LD (IY-100+VRS.Delay),A
  479.         PUSH HL
  480.         PUSH HL
  481.         PUSH HL
  482.         INC HL
  483.         INC HL
  484.         LD A,(HL)
  485.         INC HL
  486.         CALL SETSMPT
  487.         LD E,(HL)
  488.         INC HL
  489.         LD D,(HL)
  490.         POP HL
  491.         AND A
  492.         SBC HL,DE
  493.         CALL SETMDAD
  494.         POP HL
  495.         LD DE,67
  496.         ADD HL,DE
  497.         CALL SETORPT
  498.         LD E,32
  499.         ADD HL,DE
  500.         LD C,(HL)
  501.         INC HL
  502.         LD B,(HL)
  503.         LD E,30
  504.         ADD HL,DE
  505.         CALL SETCPPT
  506.         LD E,A
  507.         INC HL
  508.  
  509.         IF CurPosCounter
  510.         LD (IY-100+VRS.PosSub),L
  511.         ENDIF
  512.  
  513.         ADD HL,DE
  514.         CALL SETLPPT
  515.         POP HL
  516.         ADD HL,BC
  517.  
  518. SETPTPT LD (IY-100+VRS.PatsPtr),L
  519.         LD (IY-100+VRS.PatsPtr+1),H
  520.         RET
  521.  
  522. SETMDAD LD (IY-100+VRS.MODADDR),L
  523.         LD (IY-100+VRS.MODADDR+1),H
  524.         RET
  525.  
  526. SETORPT LD (IY-100+VRS.OrnPtrs),L
  527.         LD (IY-100+VRS.OrnPtrs+1),H
  528.         RET
  529.  
  530. SETCPPT LD (IY-100+VRS.CrPsPtr),L
  531.         LD (IY-100+VRS.CrPsPtr+1),H
  532.         RET
  533.  
  534. SETLPPT LD (IY-100+VRS.LPosPtr),L
  535.         LD (IY-100+VRS.LPosPtr+1),H
  536.         RET
  537.  
  538. SETENBS LD (IY-100+VRS.EnvBase),L
  539.         LD (IY-100+VRS.EnvBase+1),H
  540.         RET
  541.  
  542. SETESLD LD (IY-100+VRS.CurESld),L
  543.         LD (IY-100+VRS.CurESld+1),H
  544.         RET
  545.  
  546. GETIX   PUSH IY
  547.         POP IX
  548.         ADD IX,DE
  549.         RET
  550.  
  551. PTDECOD CALL GETIX
  552. PTDEC   EQU $+1
  553.         JP #C3C3
  554.  
  555. ;PT2 pattern decoder
  556. PD2_SAM CALL SETSAM
  557.         JR PD2_LOOP
  558.  
  559. PD2_EOff LD (IX-12+CHP.Env_En),A
  560.         JR PD2_LOOP
  561.  
  562. PD2_ENV LD (IX-12+CHP.Env_En),16
  563.         LD (IY-100+VRS.AYREGS+EnvTp),A
  564.         LD A,(BC)
  565.         INC BC
  566.         LD L,A
  567.         LD A,(BC)
  568.         INC BC
  569.         LD H,A
  570.         CALL SETENBS
  571.         JR PD2_LOOP
  572.  
  573. PD2_ORN CALL SETORN
  574.         JR PD2_LOOP
  575.  
  576. PD2_SKIP INC A
  577.         LD (IX-12+CHP.NNtSkp),A
  578.         JR PD2_LOOP
  579.  
  580. PD2_VOL RRCA
  581.         RRCA
  582.         RRCA
  583.         RRCA
  584.         LD (IX-12+CHP.Volume),A
  585.         JR PD2_LOOP
  586.  
  587. PD2_DEL CALL C_DELAY
  588.         JR PD2_LOOP
  589.  
  590. PD2_GLIS SET 2,(IX-12+CHP.Flags)
  591.         INC A
  592.         LD (IX-12+CHP.TnSlDl),A
  593.         LD (IX-12+CHP.TSlCnt),A
  594.         LD A,(BC)
  595.         INC BC
  596.         LD (IX-12+CHP.TSlStp),A
  597.         ADD A,A
  598.         SBC A,A
  599.         LD (IX-12+CHP.TSlStp+1),A
  600.         SCF
  601.         JR PD2_LP2
  602.  
  603. PT2PD   AND A
  604.  
  605. PD2_LP2 EX AF,AF'
  606.  
  607. PD2_LOOP LD A,(BC)
  608.         INC BC
  609.         ADD A,#20
  610.         JR Z,PD2_REL
  611.         JR C,PD2_SAM
  612.         ADD A,96
  613.         JR C,PD2_NOTE
  614.         INC A
  615.         JR Z,PD2_EOff
  616.         ADD A,15
  617.         JP Z,PD_FIN
  618.         JR C,PD2_ENV
  619.         ADD A,#10
  620.         JR C,PD2_ORN
  621.         ADD A,#40
  622.         JR C,PD2_SKIP
  623.         ADD A,#10
  624.         JR C,PD2_VOL
  625.         INC A
  626.         JR Z,PD2_DEL
  627.         INC A
  628.         JR Z,PD2_GLIS
  629.         INC A
  630.         JR Z,PD2_PORT
  631.         INC A
  632.         JR Z,PD2_STOP
  633.         LD A,(BC)
  634.         INC BC
  635.         LD (IX-12+CHP.CrNsSl),A
  636.         JR PD2_LOOP
  637.  
  638. PD2_PORT RES 2,(IX-12+CHP.Flags)
  639.         LD A,(BC)
  640.         INC BC
  641.         INC BC ;ignoring precalc delta to right sound
  642.         INC BC
  643.         SCF
  644.         JR PD2_LP2
  645.  
  646. PD2_STOP LD (IX-12+CHP.TSlCnt),A
  647.         JR PD2_LOOP
  648.  
  649. PD2_REL LD (IX-12+CHP.Flags),A
  650.         JR PD2_EXIT
  651.  
  652. PD2_NOTE LD L,A
  653.         LD A,(IX-12+CHP.Note)
  654.         LD (PrNote+1),A
  655.         LD (IX-12+CHP.Note),L
  656.         XOR A
  657.         LD (IX-12+CHP.TSlCnt),A
  658.         SET 0,(IX-12+CHP.Flags)
  659.         EX AF,AF'
  660.         JR NC,NOGLIS2
  661.         BIT 2,(IX-12+CHP.Flags)
  662.         JR NZ,NOPORT2
  663.         LD (LoStep),A
  664.         ADD A,A
  665.         SBC A,A
  666.         EX AF,AF'
  667.         LD H,A
  668.         LD L,A
  669.         INC A
  670.         CALL SETPORT
  671. NOPORT2 LD (IX-12+CHP.TSlCnt),1
  672. NOGLIS2 XOR A
  673.  
  674.  
  675. PD2_EXIT LD (IX-12+CHP.PsInSm),A
  676.         LD (IX-12+CHP.PsInOr),A
  677.         LD (IX-12+CHP.CrTnSl),A
  678.         LD (IX-12+CHP.CrTnSl+1),A
  679.         JP PD_FIN
  680.  
  681. ;PT3 pattern decoder
  682. PD_OrSm LD (IX-12+CHP.Env_En),0
  683.         CALL SETORN
  684. PD_SAM_ LD A,(BC)
  685.         INC BC
  686.         RRCA
  687.  
  688. PD_SAM  CALL SETSAM
  689.         JR PD_LOOP
  690.  
  691. PD_VOL  RRCA
  692.         RRCA
  693.         RRCA
  694.         RRCA
  695.         LD (IX-12+CHP.Volume),A
  696.         JR PD_LP2
  697.        
  698. PD_EOff LD (IX-12+CHP.Env_En),A
  699.         LD (IX-12+CHP.PsInOr),A
  700.         JR PD_LP2
  701.  
  702. PD_SorE DEC A
  703.         JR NZ,PD_ENV
  704.         LD A,(BC)
  705.         INC BC
  706.         LD (IX-12+CHP.NNtSkp),A
  707.         JR PD_LP2
  708.  
  709. PD_ENV  CALL SETENV
  710.         JR PD_LP2
  711.  
  712. PD_ORN  CALL SETORN
  713.         JR PD_LOOP
  714.  
  715. PD_ESAM LD (IX-12+CHP.Env_En),A
  716.         LD (IX-12+CHP.PsInOr),A
  717.         CALL NZ,SETENV
  718.         JR PD_SAM_
  719.  
  720. PT3PD   LD A,(IX-12+CHP.Note)
  721.         LD (PrNote+1),A
  722.         LD L,(IX-12+CHP.CrTnSl)
  723.         LD H,(IX-12+CHP.CrTnSl+1)
  724.         LD (PrSlide+1),HL
  725.  
  726. PD_LOOP LD DE,#2010
  727. PD_LP2  LD A,(BC)
  728.         INC BC
  729.         ADD A,E
  730.         JR C,PD_OrSm
  731.         ADD A,D
  732.         JR Z,PD_FIN
  733.         JR C,PD_SAM
  734.         ADD A,E
  735.         JR Z,PD_REL
  736.         JR C,PD_VOL
  737.         ADD A,E
  738.         JR Z,PD_EOff
  739.         JR C,PD_SorE
  740.         ADD A,96
  741.         JR C,PD_NOTE
  742.         ADD A,E
  743.         JR C,PD_ORN
  744.         ADD A,D
  745.         JR C,PD_NOIS
  746.         ADD A,E
  747.         JR C,PD_ESAM
  748.         ADD A,A
  749.         LD E,A
  750.         LD HL,SPCCOMS+#FF20-#2000
  751.         ADD HL,DE
  752.         LD E,(HL)
  753.         INC HL
  754.         LD D,(HL)
  755.         PUSH DE
  756.         JR PD_LOOP
  757.  
  758. PD_NOIS LD (IY-100+VRS.Ns_Base),A
  759.         JR PD_LP2
  760.  
  761. PD_REL  RES 0,(IX-12+CHP.Flags)
  762.         JR PD_RES
  763.  
  764. PD_NOTE LD (IX-12+CHP.Note),A
  765.         SET 0,(IX-12+CHP.Flags)
  766.         XOR A
  767.  
  768. PD_RES  LD (PDSP_+1),SP
  769.         LD SP,IX
  770.         LD H,A
  771.         LD L,A
  772.         PUSH HL
  773.         PUSH HL
  774.         PUSH HL
  775.         PUSH HL
  776.         PUSH HL
  777.         PUSH HL
  778. PDSP_   LD SP,#3131
  779.  
  780. PD_FIN  LD A,(IX-12+CHP.NNtSkp)
  781.         LD (IX-12+CHP.NtSkCn),A
  782.         RET
  783.  
  784. C_PORTM LD A,(BC)
  785.         INC BC
  786. ;SKIP PRECALCULATED TONE DELTA (BECAUSE
  787. ;CANNOT BE RIGHT AFTER PT3 COMPILATION)
  788.         INC BC
  789.         INC BC
  790.         EX AF,AF'
  791.         LD A,(BC) ;SIGNED TONE STEP
  792.         INC BC
  793.         LD (LoStep),A
  794.         LD A,(BC)
  795.         INC BC
  796.         AND A
  797.         EX AF,AF'
  798.         LD L,(IX-12+CHP.CrTnSl)
  799.         LD H,(IX-12+CHP.CrTnSl+1)
  800.  
  801. ;Set portamento variables
  802. ;A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl
  803.  
  804. SETPORT RES 2,(IX-12+CHP.Flags)
  805.         LD (IX-12+CHP.TnSlDl),A
  806.         LD (IX-12+CHP.TSlCnt),A
  807.         PUSH HL
  808.         LD DE,NT_
  809.         LD A,(IX-12+CHP.Note)
  810.         LD (IX-12+CHP.SlToNt),A
  811.         ADD A,A
  812.         LD L,A
  813.         LD H,0
  814.         ADD HL,DE
  815.         LD A,(HL)
  816.         INC HL
  817.         LD H,(HL)
  818.         LD L,A
  819.         PUSH HL
  820. PrNote  LD A,#3E
  821.         LD (IX-12+CHP.Note),A
  822.         ADD A,A
  823.         LD L,A
  824.         LD H,0
  825.         ADD HL,DE
  826.         LD E,(HL)
  827.         INC HL
  828.         LD D,(HL)
  829.         POP HL
  830.         SBC HL,DE
  831.         LD (IX-12+CHP.TnDelt),L
  832.         LD (IX-12+CHP.TnDelt+1),H
  833.         POP DE
  834. Version EQU $+1
  835.         LD A,#3E
  836.         CP 6
  837.         JR C,OLDPRTM ;Old 3xxx for PT v3.5-
  838. PrSlide LD DE,#1111
  839.         LD (IX-12+CHP.CrTnSl),E
  840.         LD (IX-12+CHP.CrTnSl+1),D
  841. LoStep  EQU $+1
  842. OLDPRTM LD A,#3E
  843.         EX AF,AF'
  844.         JR Z,NOSIG
  845.         EX DE,HL
  846. NOSIG   SBC HL,DE
  847.         JP P,SET_STP
  848.         CPL
  849.         EX AF,AF'
  850.         NEG
  851.         EX AF,AF'
  852. SET_STP LD (IX-12+CHP.TSlStp+1),A
  853.         EX AF,AF'
  854.         LD (IX-12+CHP.TSlStp),A
  855.         LD (IX-12+CHP.COnOff),0
  856.         RET
  857.  
  858. C_GLISS SET 2,(IX-12+CHP.Flags)
  859.         LD A,(BC)
  860.         INC BC
  861.         LD (IX-12+CHP.TnSlDl),A
  862.         AND A
  863.         JR NZ,GL36
  864.         LD A,(Version) ;AlCo PT3.7+
  865.         CP 7
  866.         SBC A,A
  867.         INC A
  868. GL36    LD (IX-12+CHP.TSlCnt),A
  869.         LD A,(BC)
  870.         INC BC
  871.         EX AF,AF'
  872.         LD A,(BC)
  873.         INC BC
  874.         JR SET_STP
  875.  
  876. C_SMPOS LD A,(BC)
  877.         INC BC
  878.         LD (IX-12+CHP.PsInSm),A
  879.         RET
  880.  
  881. C_ORPOS LD A,(BC)
  882.         INC BC
  883.         LD (IX-12+CHP.PsInOr),A
  884.         RET
  885.  
  886. C_VIBRT LD A,(BC)
  887.         INC BC
  888.         LD (IX-12+CHP.OnOffD),A
  889.         LD (IX-12+CHP.COnOff),A
  890.         LD A,(BC)
  891.         INC BC
  892.         LD (IX-12+CHP.OffOnD),A
  893.         XOR A
  894.         LD (IX-12+CHP.TSlCnt),A
  895.         LD (IX-12+CHP.CrTnSl),A
  896.         LD (IX-12+CHP.CrTnSl+1),A
  897.         RET
  898.  
  899. C_ENGLS LD A,(BC)
  900.         INC BC
  901.         LD (IY-100+VRS.Env_Del),A
  902.         LD (IY-100+VRS.CurEDel),A
  903.         LD A,(BC)
  904.         INC BC
  905.         LD L,A
  906.         LD A,(BC)
  907.         INC BC
  908.         LD H,A
  909.         LD (IY-100+VRS.ESldAdd),L
  910.         LD (IY-100+VRS.ESldAdd+1),H
  911.         RET
  912.  
  913. C_DELAY LD A,(BC)
  914.         INC BC
  915.         LD (IY-100+VRS.Delay),A
  916.         LD HL,VARS2+VRS.ModNum ;if AlCo_TS
  917.         BIT 1,(HL)
  918.         RET Z
  919.         LD (VARS1+VRS.Delay),A
  920.         LD (VARS1+VRS.DelyCnt),A
  921.         LD (VARS2+VRS.Delay),A
  922.         RET
  923.        
  924. SETENV  LD (IX-12+CHP.Env_En),E
  925.         LD (IY-100+VRS.AYREGS+EnvTp),A
  926.         LD A,(BC)
  927.         INC BC
  928.         LD H,A
  929.         LD A,(BC)
  930.         INC BC
  931.         LD L,A
  932.         CALL SETENBS
  933.         XOR A
  934.         LD (IX-12+CHP.PsInOr),A
  935.         LD (IY-100+VRS.CurEDel),A
  936.         LD H,A
  937.         LD L,A
  938.         JP SETESLD
  939.  
  940. SETORN  ADD A,A
  941.         LD E,A
  942.         LD D,0
  943.         LD (IX-12+CHP.PsInOr),D
  944.         LD L,(IY-100+VRS.OrnPtrs)
  945.         LD H,(IY-100+VRS.OrnPtrs+1)
  946.         ADD HL,DE
  947.         LD E,(HL)
  948.         INC HL
  949.         LD D,(HL)
  950.         LD L,(IY-100+VRS.MODADDR)
  951.         LD H,(IY-100+VRS.MODADDR+1)
  952.         ADD HL,DE
  953.         LD (IX-12+CHP.OrnPtr),L
  954.         LD (IX-12+CHP.OrnPtr+1),H
  955. C_NOP   RET
  956.  
  957. SETSAM  ADD A,A
  958.         LD E,A
  959.         LD D,0
  960.         LD L,(IY-100+VRS.SamPtrs);
  961.         LD H,(IY-100+VRS.SamPtrs+1);
  962.         ADD HL,DE
  963.         LD E,(HL)
  964.         INC HL
  965.         LD D,(HL)
  966.         LD L,(IY-100+VRS.MODADDR)
  967.         LD H,(IY-100+VRS.MODADDR+1)
  968.         ADD HL,DE
  969.         LD (IX-12+CHP.SamPtr),L
  970.         LD (IX-12+CHP.SamPtr+1),H
  971.         RET
  972.  
  973. ;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
  974. SPCCOMS DW C_NOP
  975.         DW C_GLISS
  976.         DW C_PORTM
  977.         DW C_SMPOS
  978.         DW C_ORPOS
  979.         DW C_VIBRT
  980.         DW C_NOP
  981.         DW C_NOP
  982.         DW C_ENGLS
  983.         DW C_DELAY
  984.         DW C_NOP
  985.         DW C_NOP
  986.         DW C_NOP
  987.         DW C_NOP
  988.         DW C_NOP
  989.         DW C_NOP
  990.  
  991. CHREGS  CALL GETIX
  992.         XOR A
  993.         LD (Ampl),A
  994.         BIT 0,(IX+CHP.Flags)
  995.         PUSH HL
  996.         JP Z,CH_EXIT
  997.         LD (CSP_+1),SP
  998.         LD L,(IX+CHP.OrnPtr)
  999.         LD H,(IX+CHP.OrnPtr+1)
  1000.         LD SP,HL
  1001.         POP DE
  1002.         LD H,A
  1003.         LD A,(IX+CHP.PsInOr)
  1004.         LD L,A
  1005.         ADD HL,SP
  1006.         INC A
  1007.                 ;PT2    PT3
  1008. OrnCP   INC A   ;CP E   CP D
  1009.         JR C,CH_ORPS
  1010. OrnLD   DB 1    ;LD A,D LD A,E
  1011. CH_ORPS LD (IX+CHP.PsInOr),A
  1012.         LD A,(IX+CHP.Note)
  1013.         ADD A,(HL)
  1014.         JP P,CH_NTP
  1015.         XOR A
  1016. CH_NTP  CP 96
  1017.         JR C,CH_NOK
  1018.         LD A,95
  1019. CH_NOK  ADD A,A
  1020.         EX AF,AF'
  1021.         LD L,(IX+CHP.SamPtr)
  1022.         LD H,(IX+CHP.SamPtr+1)
  1023.         LD SP,HL
  1024.         POP DE
  1025.         LD H,0
  1026.         LD A,(IX+CHP.PsInSm)
  1027.         LD B,A
  1028.         ADD A,A
  1029. SamClc2 ADD A,A ;or ADD A,B for PT2
  1030.         LD L,A
  1031.         ADD HL,SP
  1032.         LD SP,HL
  1033.         LD A,B
  1034.         INC A
  1035.                 ;PT2    PT3
  1036. SamCP   INC A   ;CP E   CP D
  1037.         JR C,CH_SMPS
  1038. SamLD   DB 1    ;LD A,D LD A,E
  1039. CH_SMPS LD (IX+CHP.PsInSm),A
  1040.         POP BC
  1041.         POP HL
  1042.  
  1043. ;Convert PT2 sample to PT3
  1044.                 ;PT2            PT3
  1045. SamCnv  POP HL  ;BIT 2,C        JR e_
  1046.         POP HL 
  1047.         LD H,B
  1048.         JR NZ,$+8
  1049.         EX DE,HL
  1050.         AND A
  1051.         SBC HL,HL
  1052.         SBC HL,DE
  1053.         LD D,C
  1054.         RR C
  1055.         SBC A,A
  1056.         CPL
  1057.         AND #3E
  1058.         RR C
  1059.         RR B
  1060.         AND C
  1061.         LD C,A
  1062.         LD A,B
  1063.         RRA
  1064.         RRA
  1065.         RR D
  1066.         RRA
  1067.         AND #9F
  1068.         LD B,A
  1069.  
  1070. e_      LD E,(IX+CHP.TnAcc)
  1071.         LD D,(IX+CHP.TnAcc+1)
  1072.         ADD HL,DE
  1073.         BIT 6,B
  1074.         JR Z,CH_NOAC
  1075.         LD (IX+CHP.TnAcc),L
  1076.         LD (IX+CHP.TnAcc+1),H
  1077. CH_NOAC EX DE,HL
  1078.         EX AF,AF'
  1079.         ADD A,NT_
  1080.         LD L,A
  1081.         ADC A,NT_/256
  1082.         SUB L
  1083.         LD H,A
  1084.         LD SP,HL
  1085.         POP HL
  1086.         ADD HL,DE
  1087.         LD E,(IX+CHP.CrTnSl)
  1088.         LD D,(IX+CHP.CrTnSl+1)
  1089.         ADD HL,DE
  1090. CSP_    LD SP,#3131
  1091.         EX (SP),HL
  1092.         XOR A
  1093.         OR (IX+CHP.TSlCnt)
  1094.         JR Z,CH_AMP
  1095.         DEC (IX+CHP.TSlCnt)
  1096.         JR NZ,CH_AMP
  1097.         LD A,(IX+CHP.TnSlDl)
  1098.         LD (IX+CHP.TSlCnt),A
  1099.         LD L,(IX+CHP.TSlStp)
  1100.         LD H,(IX+CHP.TSlStp+1)
  1101.         LD A,H
  1102.         ADD HL,DE
  1103.         LD (IX+CHP.CrTnSl),L
  1104.         LD (IX+CHP.CrTnSl+1),H
  1105.         BIT 2,(IX+CHP.Flags)
  1106.         JR NZ,CH_AMP
  1107.         LD E,(IX+CHP.TnDelt)
  1108.         LD D,(IX+CHP.TnDelt+1)
  1109.         AND A
  1110.         JR Z,CH_STPP
  1111.         EX DE,HL
  1112. CH_STPP SBC HL,DE
  1113.         JP M,CH_AMP
  1114.         LD A,(IX+CHP.SlToNt)
  1115.         LD (IX+CHP.Note),A
  1116.         XOR A
  1117.         LD (IX+CHP.TSlCnt),A
  1118.         LD (IX+CHP.CrTnSl),A
  1119.         LD (IX+CHP.CrTnSl+1),A
  1120. CH_AMP  LD A,(IX+CHP.CrAmSl)
  1121.         BIT 7,C
  1122.         JR Z,CH_NOAM
  1123.         BIT 6,C
  1124.         JR Z,CH_AMIN
  1125.         CP 15
  1126.         JR Z,CH_NOAM
  1127.         INC A
  1128.         JR CH_SVAM
  1129. CH_AMIN CP -15
  1130.         JR Z,CH_NOAM
  1131.         DEC A
  1132. CH_SVAM LD (IX+CHP.CrAmSl),A
  1133. CH_NOAM LD L,A
  1134.         LD A,B
  1135.         AND 15
  1136.         ADD A,L
  1137.         JP P,CH_APOS
  1138.         XOR A
  1139. CH_APOS CP 16
  1140.         JR C,CH_VOL
  1141.         LD A,15
  1142. CH_VOL  OR (IX+CHP.Volume)
  1143.         ADD A,VT_
  1144.         LD L,A
  1145.         ADC A,VT_/256
  1146.         SUB L
  1147.         LD H,A
  1148.         LD A,(HL)
  1149. CH_ENV  BIT 0,C
  1150.         JR NZ,CH_NOEN
  1151.         OR (IX+CHP.Env_En)
  1152. CH_NOEN LD (Ampl),A
  1153.         BIT 7,B
  1154.         LD A,C
  1155.         JR Z,NO_ENSL
  1156.         RLA
  1157.         RLA
  1158.         SRA A
  1159.         SRA A
  1160.         SRA A
  1161.         ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW
  1162.         BIT 5,B
  1163.         JR Z,NO_ENAC
  1164.         LD (IX+CHP.CrEnSl),A
  1165. NO_ENAC ADD A,(IY-100+VRS.AddToEn) ;BUG IN PT3 - NEED WORD HERE
  1166.         LD (IY-100+VRS.AddToEn),A
  1167.         JR CH_MIX
  1168. NO_ENSL RRA
  1169.         ADD A,(IX+CHP.CrNsSl)
  1170.         LD (IY-100+VRS.AddToNs),A
  1171.         BIT 5,B
  1172.         JR Z,CH_MIX
  1173.         LD (IX+CHP.CrNsSl),A
  1174. CH_MIX  LD A,B
  1175.         RRA
  1176.         AND #48
  1177. CH_EXIT OR (IY-100+VRS.AYREGS+Mixer)
  1178.         RRCA
  1179.         LD (IY-100+VRS.AYREGS+Mixer),A
  1180.         POP HL
  1181.         XOR A
  1182.         OR (IX+CHP.COnOff)
  1183.         RET Z
  1184.         DEC (IX+CHP.COnOff)
  1185.         RET NZ
  1186.         XOR (IX+CHP.Flags)
  1187.         LD (IX+CHP.Flags),A
  1188.         RRA
  1189.         LD A,(IX+CHP.OnOffD)
  1190.         JR C,CH_ONDL
  1191.         LD A,(IX+CHP.OffOnD)
  1192. CH_ONDL LD (IX+CHP.COnOff),A
  1193.         RET
  1194.  
  1195. PLAY_   XOR A
  1196.         LD (IY-100+VRS.AddToEn),A
  1197.         LD (IY-100+VRS.AYREGS+Mixer),A
  1198.         DEC A
  1199.         LD (IY-100+VRS.AYREGS+EnvTp),A
  1200.         DEC (IY-100+VRS.DelyCnt)
  1201.         JP NZ,PL2
  1202.         DEC (IY-100+VRS.ChanA+CHP.NtSkCn)
  1203.         JR NZ,PL1B
  1204.         LD C,(IY-100+VRS.AdInPtA)
  1205.         LD B,(IY-100+VRS.AdInPtA+1)
  1206.         LD A,(BC)
  1207.         AND A
  1208.         JR NZ,PL1A
  1209.         LD D,A
  1210.         LD (IY-100+VRS.Ns_Base),A
  1211.         LD L,(IY-100+VRS.CrPsPtr)
  1212.         LD H,(IY-100+VRS.CrPsPtr+1)
  1213.         INC HL
  1214.         LD A,(HL)
  1215.         INC A
  1216.         JR NZ,PLNLP
  1217.  
  1218.         IF LoopChecker
  1219.         CALL CHECKLP
  1220.         ENDIF
  1221.  
  1222.         LD L,(IY-100+VRS.LPosPtr)
  1223.         LD H,(IY-100+VRS.LPosPtr+1)
  1224.         LD A,(HL)
  1225.         INC A
  1226. PLNLP   CALL SETCPPT
  1227.         DEC A
  1228.         BIT 1,(IY-100+VRS.ModNum)
  1229.         JR Z,NoAlCo
  1230. TSSub   EQU $+1
  1231.         SUB #D6
  1232.         CPL
  1233. NoAlCo
  1234.                 ;PT2            PT3
  1235. PsCalc  DEC A   ;ADD A,A        NOP
  1236.         DEC A   ;ADD A,(HL)     NOP
  1237.         ADD A,A
  1238.         LD E,A
  1239.         RL D
  1240.  
  1241.         IF CurPosCounter
  1242.         LD A,L
  1243.         SUB (IY-100+VRS.PosSub)
  1244.         LD (IY-100+VRS.CurPos),A
  1245.         ENDIF
  1246.  
  1247.         LD L,(IY-100+VRS.PatsPtr)
  1248.         LD H,(IY-100+VRS.PatsPtr+1)
  1249.         ADD HL,DE
  1250.         LD E,(IY-100+VRS.MODADDR)
  1251.         LD D,(IY-100+VRS.MODADDR+1)
  1252.         LD (PSP_+1),SP
  1253.         LD SP,HL
  1254.         POP HL
  1255.         ADD HL,DE
  1256.         LD B,H
  1257.         LD C,L
  1258.         POP HL
  1259.         ADD HL,DE
  1260.         LD (IY-100+VRS.AdInPtB),L
  1261.         LD (IY-100+VRS.AdInPtB+1),H
  1262.         POP HL
  1263.         ADD HL,DE
  1264.         LD (IY-100+VRS.AdInPtC),L
  1265.         LD (IY-100+VRS.AdInPtC+1),H
  1266. PSP_    LD SP,#3131
  1267. PL1A    LD DE,VRS.ChanA+12-100
  1268.         CALL PTDECOD
  1269.         LD (IY-100+VRS.AdInPtA),C
  1270.         LD (IY-100+VRS.AdInPtA+1),B
  1271.  
  1272. PL1B    DEC (IY-100+VRS.ChanB+CHP.NtSkCn)
  1273.         JR NZ,PL1C
  1274.         LD DE,VRS.ChanB+12-100
  1275.         LD C,(IY-100+VRS.AdInPtB)
  1276.         LD B,(IY-100+VRS.AdInPtB+1)
  1277.         CALL PTDECOD
  1278.         LD (IY-100+VRS.AdInPtB),C
  1279.         LD (IY-100+VRS.AdInPtB+1),B
  1280.  
  1281. PL1C    DEC (IY-100+VRS.ChanC+CHP.NtSkCn)
  1282.         JR NZ,PL1D
  1283.         LD DE,VRS.ChanC+12-100
  1284.         LD C,(IY-100+VRS.AdInPtC)
  1285.         LD B,(IY-100+VRS.AdInPtC+1)
  1286.         CALL PTDECOD
  1287.         LD (IY-100+VRS.AdInPtC),C
  1288.         LD (IY-100+VRS.AdInPtC+1),B
  1289.  
  1290. PL1D    LD A,(IY-100+VRS.Delay)
  1291.         LD (IY-100+VRS.DelyCnt),A
  1292.  
  1293. PL2     LD DE,VRS.ChanA-100
  1294.         LD L,(IY-100+VRS.AYREGS+TonA)
  1295.         LD H,(IY-100+VRS.AYREGS+TonA+1)
  1296.         CALL CHREGS
  1297.         LD (IY-100+VRS.AYREGS+TonA),L
  1298.         LD (IY-100+VRS.AYREGS+TonA+1),H
  1299. Ampl    EQU $+1
  1300.         LD A,#3E
  1301.         LD (IY-100+VRS.AYREGS+AmplA),A
  1302.         LD DE,VRS.ChanB-100
  1303.         LD L,(IY-100+VRS.AYREGS+TonB)
  1304.         LD H,(IY-100+VRS.AYREGS+TonB+1)
  1305.         CALL CHREGS
  1306.         LD (IY-100+VRS.AYREGS+TonB),L
  1307.         LD (IY-100+VRS.AYREGS+TonB+1),H
  1308.         LD A,(Ampl)
  1309.         LD (IY-100+VRS.AYREGS+AmplB),A
  1310.         LD DE,VRS.ChanC-100
  1311.         LD L,(IY-100+VRS.AYREGS+TonC)
  1312.         LD H,(IY-100+VRS.AYREGS+TonC+1)
  1313.         CALL CHREGS
  1314.         LD (IY-100+VRS.AYREGS+TonC),L
  1315.         LD (IY-100+VRS.AYREGS+TonC+1),H
  1316.         LD A,(Ampl)
  1317.         LD (IY-100+VRS.AYREGS+AmplC),A
  1318.  
  1319.         LD A,(IY-100+VRS.Ns_Base)
  1320.         ADD (IY-100+VRS.AddToNs)
  1321.         LD (IY-100+VRS.AYREGS+Noise),A
  1322.  
  1323.         LD A,(IY-100+VRS.AddToEn)
  1324.         LD E,A
  1325.         ADD A,A
  1326.         SBC A,A
  1327.         LD D,A
  1328.         LD L,(IY-100+VRS.EnvBase)
  1329.         LD H,(IY-100+VRS.EnvBase+1)
  1330.         ADD HL,DE
  1331.         LD E,(IY-100+VRS.CurESld)
  1332.         LD D,(IY-100+VRS.CurESld+1)
  1333.         ADD HL,DE
  1334.         LD (IY-100+VRS.AYREGS+Env),L
  1335.         LD (IY-100+VRS.AYREGS+Env+1),H
  1336.  
  1337.         XOR A
  1338.         OR (IY-100+VRS.CurEDel)
  1339.         RET Z
  1340.         DEC (IY-100+VRS.CurEDel)
  1341.         RET NZ
  1342.         LD A,(IY-100+VRS.Env_Del)
  1343.         LD (IY-100+VRS.CurEDel),A
  1344.         LD L,(IY-100+VRS.ESldAdd)
  1345.         LD H,(IY-100+VRS.ESldAdd+1)
  1346.         ADD HL,DE
  1347.         JP SETESLD
  1348.  
  1349. PLAY    LD IY,VARS1+100
  1350.         CALL PLAY_
  1351.         LD A,(is_ts)
  1352.         AND A
  1353.         JR Z,PL_nts
  1354.         LD IY,VARS2+100
  1355.         CALL PLAY_
  1356. PL_nts
  1357.         IF Basic
  1358.         LD IY,#5C3A
  1359.         ENDIF
  1360.  
  1361. ROUT    LD BC,#FFFD
  1362.         LD A,(is_ts)
  1363.         AND A
  1364.         JR Z,r_nts ;keep old standard
  1365.         OUT (C),B
  1366. r_nts   EX AF,AF'
  1367.  
  1368.         IF ACBBAC
  1369.         LD IX,VARS1+VRS.AYREGS
  1370.         ELSE
  1371.         LD HL,VARS1+VRS.AYREGS
  1372.         ENDIF
  1373.  
  1374.         CALL ROUT_
  1375.         EX AF,AF'
  1376.         RET Z
  1377.         LD B,D
  1378.         CPL
  1379.         OUT (C),A
  1380.  
  1381.         IF ACBBAC
  1382.         LD IX,VARS2+VRS.AYREGS
  1383.         ELSE
  1384.         LD HL,VARS2+VRS.AYREGS
  1385.         ENDIF
  1386.  
  1387. ROUT_
  1388.         IF ACBBAC
  1389.         LD A,(SETUP)
  1390.         AND 12
  1391.         JR Z,ABC
  1392.         ADD A,CHTABLE
  1393.         LD E,A
  1394.         ADC A,CHTABLE/256
  1395.         SUB E
  1396.         LD D,A
  1397.         LD B,0
  1398.         PUSH IX
  1399.         POP HL
  1400.         LD A,(DE)
  1401.         INC DE
  1402.         LD C,A
  1403.         ADD HL,BC
  1404.         LD A,(IX+TonB)
  1405.         LD C,(HL)
  1406.         LD (IX+TonB),C
  1407.         LD (HL),A
  1408.         INC HL
  1409.         LD A,(IX+TonB+1)
  1410.         LD C,(HL)
  1411.         LD (IX+TonB+1),C
  1412.         LD (HL),A
  1413.         LD A,(DE)
  1414.         INC DE
  1415.         LD C,A
  1416.         ADD HL,BC
  1417.         LD A,(IX+AmplB)
  1418.         LD C,(HL)
  1419.         LD (IX+AmplB),C
  1420.         LD (HL),A
  1421.         LD A,(DE)
  1422.         INC DE
  1423.         LD (RxCA1),A
  1424.         XOR 8
  1425.         LD (RxCA2),A
  1426.         LD A,(DE)
  1427.         AND (IX+Mixer)
  1428.         LD E,A
  1429.         LD A,(IX+Mixer)
  1430. RxCA1   DB #E6
  1431.         AND %010010
  1432.         OR E
  1433.         LD E,A
  1434.         LD A,(IX+Mixer)
  1435.         AND %010010
  1436. RxCA2   OR E
  1437.         OR E
  1438.         LD (IX+Mixer),A
  1439. ABC
  1440.         ENDIF
  1441.  
  1442.         XOR A
  1443.         LD DE,#FFBF
  1444.  
  1445.         IF ACBBAC
  1446.         LD BC,#FFFD
  1447.         PUSH IX
  1448.         POP HL
  1449.         ENDIF
  1450.  
  1451. LOUT    OUT (C),A
  1452.         LD B,E
  1453.         OUTI
  1454.         LD B,D
  1455.         INC A
  1456.         CP 13
  1457.         JR NZ,LOUT
  1458.         OUT (C),A
  1459.         LD A,(HL)
  1460.         AND A
  1461.         RET M
  1462.         LD B,E
  1463.         OUT (C),A
  1464.         RET
  1465.  
  1466.         IF ACBBAC
  1467. CHTABLE EQU $-4
  1468.         DB 4,5,15,%001001,0,7,7,%100100
  1469.         ENDIF
  1470.  
  1471. NT_DATA DB (T_NEW_0-T1_)*2
  1472.         DB TCNEW_0-T_
  1473.         DB (T_OLD_0-T1_)*2+1
  1474.         DB TCOLD_0-T_
  1475.         DB (T_NEW_1-T1_)*2+1
  1476.         DB TCNEW_1-T_
  1477.         DB (T_OLD_1-T1_)*2+1
  1478.         DB TCOLD_1-T_
  1479.         DB (T_NEW_2-T1_)*2
  1480.         DB TCNEW_2-T_
  1481.         DB (T_OLD_2-T1_)*2
  1482.         DB TCOLD_2-T_
  1483.         DB (T_NEW_3-T1_)*2
  1484.         DB TCNEW_3-T_
  1485.         DB (T_OLD_3-T1_)*2
  1486.         DB TCOLD_3-T_
  1487.  
  1488. T_
  1489.  
  1490. TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
  1491.         DB #18+1,#24+1,#3C+1,0
  1492. TCOLD_1 DB #5C+1,0
  1493. TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
  1494.         DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
  1495. TCNEW_3 DB #56+1
  1496. TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
  1497. TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
  1498.         DB #BC+1,#BE+1,0
  1499. TCNEW_1 EQU TCOLD_1
  1500. TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
  1501.         DB #BA+1,#BC+1,#BE+1,0
  1502.  
  1503. PT3EMPTYORN EQU $-1
  1504.         DB 1,0
  1505.  
  1506. ;first 12 values of tone tables (packed)
  1507.  
  1508. T_PACK  DB #06EC*2/256,#06EC*2
  1509.         DB #0755-#06EC
  1510.         DB #07C5-#0755
  1511.         DB #083B-#07C5
  1512.         DB #08B8-#083B
  1513.         DB #093D-#08B8
  1514.         DB #09CA-#093D
  1515.         DB #0A5F-#09CA
  1516.         DB #0AFC-#0A5F
  1517.         DB #0BA4-#0AFC
  1518.         DB #0C55-#0BA4
  1519.         DB #0D10-#0C55
  1520.         DB #066D*2/256,#066D*2
  1521.         DB #06CF-#066D
  1522.         DB #0737-#06CF
  1523.         DB #07A4-#0737
  1524.         DB #0819-#07A4
  1525.         DB #0894-#0819
  1526.         DB #0917-#0894
  1527.         DB #09A1-#0917
  1528.         DB #0A33-#09A1
  1529.         DB #0ACF-#0A33
  1530.         DB #0B73-#0ACF
  1531.         DB #0C22-#0B73
  1532.         DB #0CDA-#0C22
  1533.         DB #0704*2/256,#0704*2
  1534.         DB #076E-#0704
  1535.         DB #07E0-#076E
  1536.         DB #0858-#07E0
  1537.         DB #08D6-#0858
  1538.         DB #095C-#08D6
  1539.         DB #09EC-#095C
  1540.         DB #0A82-#09EC
  1541.         DB #0B22-#0A82
  1542.         DB #0BCC-#0B22
  1543.         DB #0C80-#0BCC
  1544.         DB #0D3E-#0C80
  1545.         DB #07E0*2/256,#07E0*2
  1546.         DB #0858-#07E0
  1547.         DB #08E0-#0858
  1548.         DB #0960-#08E0
  1549.         DB #09F0-#0960
  1550.         DB #0A88-#09F0
  1551.         DB #0B28-#0A88
  1552.         DB #0BD8-#0B28
  1553.         DB #0C80-#0BD8
  1554.         DB #0D60-#0C80
  1555.         DB #0E10-#0D60
  1556.         DB #0EF8-#0E10
  1557.  
  1558. ;vars from here can be stripped
  1559. ;you can move VARS to any other address
  1560.  
  1561. VARS
  1562.  
  1563. is_ts   DB 0
  1564.  
  1565. ;ChannelsVars
  1566.         STRUCT  CHP
  1567. ;reset group
  1568. PsInOr  DB 0
  1569. PsInSm  DB 0
  1570. CrAmSl  DB 0
  1571. CrNsSl  DB 0
  1572. CrEnSl  DB 0
  1573. TSlCnt  DB 0
  1574. CrTnSl  DW 0
  1575. TnAcc   DW 0
  1576. COnOff  DB 0
  1577. ;reset group
  1578.  
  1579. OnOffD  DB 0
  1580.  
  1581. ;IX for PTDECOD here (+12)
  1582. OffOnD  DB 0
  1583. OrnPtr  DW 0
  1584. SamPtr  DW 0
  1585. NNtSkp  DB 0
  1586. Note    DB 0
  1587. SlToNt  DB 0
  1588. Env_En  DB 0
  1589. Flags   DB 0
  1590. ;Enabled - 0, SimpleGliss - 2
  1591. TnSlDl  DB 0
  1592. TSlStp  DW 0
  1593. TnDelt  DW 0
  1594. NtSkCn  DB 0
  1595. Volume  DB 0
  1596.         ENDS
  1597.  
  1598.         STRUCT  VRS
  1599.  
  1600. ;IF not works in STRUCT in SjASM :(
  1601. ;       IF CurPosCounter
  1602. CurPos  DB 0
  1603. PosSub  DB 0
  1604. ;       ENDIF
  1605.  
  1606. ModNum  DB 0 ;bit0: ChipNum
  1607.              ;bit1: 1-reversed patterns order (AlCo TS)
  1608.  
  1609. ChanA   DS CHP
  1610. ChanB   DS CHP
  1611. ChanC   DS CHP
  1612.  
  1613. ;GlobalVars
  1614. MODADDR DW 0
  1615. OrnPtrs DW 0
  1616. SamPtrs DW 0
  1617. PatsPtr DW 0
  1618. AdInPtA DW 0
  1619. AdInPtB DW 0
  1620. AdInPtC DW 0
  1621. CrPsPtr DW 0
  1622. LPosPtr DW 0
  1623. Delay   DB 0
  1624. DelyCnt DB 0
  1625. ESldAdd DW 0
  1626. CurESld DW 0
  1627. Env_Del DB 0
  1628. CurEDel DB 0
  1629. Ns_Base DB 0
  1630. AddToNs DB 0
  1631. AddToEn DB 0
  1632. EnvBase DW 0
  1633. AYREGS  DS 14
  1634.         ENDS
  1635.  
  1636. VARS1   DS VRS
  1637. VARS2   DS VRS
  1638.  
  1639. VT_     EQU $-16
  1640.         DS 256-16 ;CreatedVolumeTableAddress
  1641.  
  1642. T1_     EQU VT_+16 ;Tone tables data depacked here
  1643.  
  1644. T_OLD_1 EQU T1_
  1645. T_OLD_2 EQU T_OLD_1+24
  1646. T_OLD_3 EQU T_OLD_2+24
  1647. T_OLD_0 EQU T_OLD_3+2
  1648. T_NEW_0 EQU T_OLD_0
  1649. T_NEW_1 EQU T_OLD_1
  1650. T_NEW_2 EQU T_NEW_0+24
  1651. T_NEW_3 EQU T_OLD_3
  1652.  
  1653. PT2EMPTYORN EQU VT_+31 ;1,0,0 sequence
  1654.  
  1655. NT_     DS 192 ;CreatedNoteTableAddress
  1656.  
  1657. VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1
  1658.  
  1659. VARSEND EQU $
  1660.  
  1661. MDLADDR EQU outputBuffer
  1662.  
  1663. ;Release 0 steps:
  1664. ;04/21/2007
  1665. ;Works start (PTxPlay adaptation); first beta.
  1666. ;04/22/2007
  1667. ;Job finished; beta-testing.
  1668. ;04/23/2007
  1669. ;PT v3.7 TS mode corrected (after AlCo remarks).
  1670. ;04/29/2007
  1671. ;Added 1.XX and 2.XX special commands interpretation for PT3
  1672. ;modules of v3.7+.
  1673.  
  1674. ;Size (minimal build for ZX Spectrum):
  1675. ;Code block #908 bytes
  1676. ;Variables #2BF bytes (can be stripped)
  1677. ;Total size #908+#2BF=#BC7 (3015) bytes
  1678.         ENDMODULE