?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

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