?login_element?

Subversion Repositories NedoOS

Rev

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