?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

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