?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         module pt3player
  2.        
  3. ;Vortex Tracker II v1.0 PT3 player for ZX Spectrum
  4. ;(c)2004,2007 S.V.Bulba <vorobey@mail.khstu.ru>
  5. ;http://bulba.untergrund.net (http://bulba.at.kz)
  6.  
  7. ;Release number
  8. Release EQU "7"
  9.  
  10. ;Features
  11. ;--------
  12. ;-Can be compiled at any address (i.e. no need rounding ORG
  13. ; address).
  14. ;-Variables (VARS) can be located at any address (not only after
  15. ;code block).
  16. ;-INIT subroutine detects module version and rightly generates
  17. ; both note and volume tables outside of code block (in VARS).
  18. ;-Two portamento (spc. command 3xxx) algorithms (depending of
  19. ; module version).
  20. ;-New 1.XX and 2.XX special command behaviour (only for PT v3.7
  21. ; and higher).
  22. ;-Any Tempo value are accepted (including Tempo=1 and Tempo=2).
  23. ;-Fully compatible with Ay_Emul PT3 player codes.
  24. ;-See also notes at the end of this source code.
  25.  
  26. ;Limitations
  27. ;-----------
  28. ;-Can run in RAM only (self-modified code is used).
  29.  
  30. ;Warning!!! PLAY subroutine can crash if no module are loaded
  31. ;into RAM or INIT subroutine was not called before.
  32.  
  33. ;Call MUTE or INIT one more time to mute sound after stopping
  34. ;playing
  35.  
  36.         ;ORG #C000
  37.  
  38. ;Test codes (commented)
  39. ;       CALL START
  40. ;       EI
  41. ;_LP    HALT
  42. ;       CALL START+5
  43. ;       XOR A
  44. ;       IN A,(#FE)
  45. ;       CPL
  46. ;       AND 15
  47. ;       JR Z,_LP
  48. ;       JR START+8
  49.  
  50. TonA    EQU 0
  51. TonB    EQU 2
  52. TonC    EQU 4
  53. Noise   EQU 6
  54. Mixer   EQU 7
  55. AmplA   EQU 8
  56. AmplB   EQU 9
  57. AmplC   EQU 10
  58. Env     EQU 11
  59. EnvTp   EQU 13
  60.  
  61. ;Entry and other points
  62. ;START initialization
  63. ;START+3 initialization with module address in HL
  64. ;START+5 play one quark
  65. ;START+8 mute
  66. ;START+10 setup and status flags
  67. ;START+11 pointer to current position value in PT3 module;
  68. ;After INIT (START+11) points to Postion0-1 (optimization)
  69.  
  70. ;START
  71. ;       LD HL,MDLADDR
  72. ;       JR INIT
  73. ;       JP PLAY
  74. ;       JR MUTE
  75. SETUP   DB 0 ;set bit0 to 1, if you want to play without looping
  76.              ;bit7 is set each time, when loop point is passed
  77. CrPsPtr DW 0
  78.  
  79. ;Identifier
  80.         DB "=VTII PT3 Player r.",Release,"="
  81.  
  82. CHECKLP LD HL,SETUP
  83.         SET 7,(HL)
  84.         BIT 0,(HL)
  85.         RET Z
  86.         POP HL
  87.         LD HL,DelyCnt
  88.         INC (HL)
  89.         LD HL,ChanA+CHP.NtSkCn
  90.         INC (HL)
  91. MUTE    XOR A
  92.         LD H,A
  93.         LD L,A
  94.         LD (AYREGS+AmplA),A
  95.         LD (AYREGS+AmplB),HL
  96.         JP ROUT_A0
  97.  
  98. INIT
  99. ;HL - AddressOfModule
  100.  
  101.         LD (MODADDR),HL
  102.         LD (MDADDR2),HL
  103.         PUSH HL
  104.         LD DE,100
  105.         ADD HL,DE
  106.         LD A,(HL)
  107.         LD (Delay),A
  108.         PUSH HL
  109.         POP IX
  110.         ADD HL,DE
  111.         LD (CrPsPtr),HL
  112.         LD E,(IX+102-100)
  113.         ADD HL,DE
  114.         INC HL
  115.         LD (LPosPtr),HL
  116.         POP DE
  117.         LD L,(IX+103-100)
  118.         LD H,(IX+104-100)
  119.         ADD HL,DE
  120.         LD (PatsPtr),HL
  121.         LD HL,169
  122.         ADD HL,DE
  123.         LD (OrnPtrs),HL
  124.         LD HL,105
  125.         ADD HL,DE
  126.         LD (SamPtrs),HL
  127.         LD HL,SETUP
  128.         RES 7,(HL)
  129.  
  130. ;note table data depacker
  131.         LD DE,T_PACK
  132.         LD BC,T1_+(2*49)-1
  133. TP_0    LD A,(DE)
  134.         INC DE
  135.         CP 15*2
  136.         JR NC,TP_1
  137.         LD H,A
  138.         LD A,(DE)
  139.         LD L,A
  140.         INC DE
  141.         JR TP_2
  142. TP_1    PUSH DE
  143.         LD D,0
  144.         LD E,A
  145.         ADD HL,DE
  146.         ADD HL,DE
  147.         POP DE
  148. TP_2    LD A,H
  149.         LD (BC),A
  150.         DEC BC
  151.         LD A,L
  152.         LD (BC),A
  153.         DEC BC
  154.         SUB (#F8*2)&255
  155.         JR NZ,TP_0
  156.  
  157.         LD HL,VARS
  158.         LD (HL),A
  159.         LD DE,VARS+1
  160.         LD BC,VAR0END-VARS-1
  161.         LDIR
  162.         INC A
  163.         LD (DelyCnt),A
  164.         LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn
  165.         LD (ChanA+CHP.NtSkCn),HL
  166.         LD (ChanB+CHP.NtSkCn),HL
  167.         LD (ChanC+CHP.NtSkCn),HL
  168.  
  169.         LD HL,EMPTYSAMORN
  170.         LD (AdInPtA),HL ;ptr to zero
  171.         LD (ChanA+CHP.OrnPtr),HL ;ornament 0 is "0,1,0"
  172.         LD (ChanB+CHP.OrnPtr),HL ;in all versions from
  173.         LD (ChanC+CHP.OrnPtr),HL ;3.xx to 3.6x and VTII
  174.  
  175.         LD (ChanA+CHP.SamPtr),HL ;S1 There is no default
  176.         LD (ChanB+CHP.SamPtr),HL ;S2 sample in PT3, so, you
  177.         LD (ChanC+CHP.SamPtr),HL ;S3 can comment S1,2,3; see
  178.                                     ;also EMPTYSAMORN comment
  179.  
  180.         LD A,(IX+13-100) ;EXTRACT VERSION NUMBER
  181.         SUB #30
  182.         JR C,L20
  183.         CP 10
  184.         JR C,L21
  185. L20     LD A,6
  186. L21     LD (Version),A
  187.         PUSH AF
  188.         CP 4
  189.         LD A,(IX+99-100) ;TONE TABLE NUMBER
  190.         RLA
  191.         AND 7
  192.  
  193. ;NoteTableCreator (c) Ivan Roshin
  194. ;A - NoteTableNumber*2+VersionForNoteTable
  195. ;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0)
  196.  
  197.         LD HL,NT_DATA
  198.         PUSH DE
  199.         LD D,B
  200.         ADD A,A
  201.         LD E,A
  202.         ADD HL,DE
  203.         LD E,(HL)
  204.         INC HL
  205.         SRL E
  206.         SBC A,A
  207.         AND #A7 ;#00 (NOP) or #A7 (AND A)
  208.         LD (L3),A
  209.         EX DE,HL
  210.         POP BC ;BC=T1_
  211.         ADD HL,BC
  212.  
  213.         LD A,(DE)
  214.         ADD A,T_&255
  215.         LD C,A
  216.         ADC A,T_/256
  217.         SUB C
  218.         LD B,A
  219.         PUSH BC
  220.         LD DE,NT_
  221.         PUSH DE
  222.  
  223.         LD B,12
  224. L1      PUSH BC
  225.         LD C,(HL)
  226.         INC HL
  227.         PUSH HL
  228.         LD B,(HL)
  229.  
  230.         PUSH DE
  231.         EX DE,HL
  232.         LD DE,23
  233.         LD IXH,8
  234.  
  235. L2      SRL B
  236.         RR C
  237. L3      DB #19  ;AND A or NOP
  238.         LD A,C
  239.         ADC A,D ;=ADC 0
  240.         LD (HL),A
  241.         INC HL
  242.         LD A,B
  243.         ADC A,D
  244.         LD (HL),A
  245.         ADD HL,DE
  246.         DEC IXH
  247.         JR NZ,L2
  248.  
  249.         POP DE
  250.         INC DE
  251.         INC DE
  252.         POP HL
  253.         INC HL
  254.         POP BC
  255.         DJNZ L1
  256.  
  257.         POP HL
  258.         POP DE
  259.  
  260.         LD A,E
  261.         CP TCOLD_1&255
  262.         JR NZ,CORR_1
  263.         LD A,#FD
  264.         LD (NT_+#2E),A
  265.  
  266. CORR_1  LD A,(DE)
  267.         AND A
  268.         JR Z,TC_EXIT
  269.         RRA
  270.         PUSH AF
  271.         ADD A,A
  272.         LD C,A
  273.         ADD HL,BC
  274.         POP AF
  275.         JR NC,CORR_2
  276.         DEC (HL)
  277.         DEC (HL)
  278. CORR_2  INC (HL)
  279.         AND A
  280.         SBC HL,BC
  281.         INC DE
  282.         JR CORR_1
  283.  
  284. TC_EXIT
  285.  
  286.         POP AF
  287.  
  288. ;VolTableCreator (c) Ivan Roshin
  289. ;A - VersionForVolumeTable (0..4 - 3.xx..3.4x;
  290.                            ;5.. - 3.5x..3.6x..VTII1.0)
  291.  
  292.         CP 5
  293.         LD HL,#11
  294.         LD D,H
  295.         LD E,H
  296.         LD A,#17
  297.         JR NC,M1
  298.         DEC L
  299.         LD E,L
  300.         XOR A
  301. M1      LD (M2),A
  302.  
  303.         LD IX,VT_+16
  304.         LD C,#10
  305.  
  306. INITV2  PUSH HL
  307.  
  308.         ADD HL,DE
  309.         EX DE,HL
  310.         SBC HL,HL
  311.  
  312. INITV1  LD A,L
  313. M2      DB #7D
  314.         LD A,H
  315.         ADC A,0
  316.         LD (IX),A
  317.         INC IX
  318.         ADD HL,DE
  319.         INC C
  320.         LD A,C
  321.         AND 15
  322.         JR NZ,INITV1
  323.  
  324.         POP HL
  325.         LD A,E
  326.         CP #77
  327.         JR NZ,M3
  328.         INC E
  329. M3      LD A,C
  330.         AND A
  331.         JR NZ,INITV2
  332.  
  333.         JP ROUT_A0
  334.  
  335. ;pattern decoder
  336. PD_OrSm LD (IX-12+CHP.Env_En),0
  337.         CALL SETORN
  338.         LD A,(BC)
  339.         INC BC
  340.         RRCA
  341.  
  342. PD_SAM  ADD A,A
  343. PD_SAM_ LD E,A
  344.         LD D,0
  345. SamPtrs EQU $+1
  346.         LD HL,#2121
  347.         ADD HL,DE
  348.         LD E,(HL)
  349.         INC HL
  350.         LD D,(HL)
  351. MODADDR EQU $+1
  352.         LD HL,#2121
  353.         ADD HL,DE
  354.         LD (IX-12+CHP.SamPtr),L
  355.         LD (IX-12+CHP.SamPtr+1),H
  356.         JR PD_LOOP
  357.  
  358. PD_VOL  RLCA
  359.         RLCA
  360.         RLCA
  361.         RLCA
  362.         LD (IX-12+CHP.Volume),A
  363.         JR PD_LP2
  364.        
  365. PD_EOff LD (IX-12+CHP.Env_En),A
  366.         LD (IX-12+CHP.PsInOr),A
  367.         JR PD_LP2
  368.  
  369. PD_SorE DEC A
  370.         JR NZ,PD_ENV
  371.         LD A,(BC)
  372.         INC BC
  373.         LD (IX-12+CHP.NNtSkp),A
  374.         JR PD_LP2
  375.  
  376. PD_ENV  CALL SETENV
  377.         JR PD_LP2
  378.  
  379. PD_ORN  CALL SETORN
  380.         JR PD_LOOP
  381.  
  382. PD_ESAM LD (IX-12+CHP.Env_En),A
  383.         LD (IX-12+CHP.PsInOr),A
  384.         CALL NZ,SETENV
  385.         LD A,(BC)
  386.         INC BC
  387.         JR PD_SAM_
  388.  
  389. PTDECOD LD A,(IX-12+CHP.Note)
  390.         LD (PrNote+1),A
  391.         LD L,(IX-12+CHP.CrTnSl)
  392.         LD H,(IX-12+CHP.CrTnSl+1)
  393.         LD (PrSlide+1),HL
  394.  
  395. PD_LOOP LD DE,#2010
  396. PD_LP2  LD A,(BC)
  397.         INC BC
  398.         ADD A,E
  399.         JR C,PD_OrSm
  400.         ADD A,D
  401.         JR Z,PD_FIN
  402.         JR C,PD_SAM
  403.         ADD A,E
  404.         JR Z,PD_REL
  405.         JR C,PD_VOL
  406.         ADD A,E
  407.         JR Z,PD_EOff
  408.         JR C,PD_SorE
  409.         ADD A,96
  410.         JR C,PD_NOTE
  411.         ADD A,E
  412.         JR C,PD_ORN
  413.         ADD A,D
  414.         JR C,PD_NOIS
  415.         ADD A,E
  416.         JR C,PD_ESAM
  417.         ADD A,A
  418.         LD E,A
  419.         LD HL,(SPCCOMS+#FF20-#2000)&65535
  420.         ADD HL,DE
  421.         LD E,(HL)
  422.         INC HL
  423.         LD D,(HL)
  424.         PUSH DE
  425.         JR PD_LOOP
  426.  
  427. PD_NOIS LD (Ns_Base),A
  428.         JR PD_LP2
  429.  
  430. PD_REL  RES 0,(IX-12+CHP.Flags)
  431.         JR PD_RES
  432.        
  433. PD_NOTE LD (IX-12+CHP.Note),A
  434.         SET 0,(IX-12+CHP.Flags)
  435.         XOR A
  436.  
  437. PD_RES  LD (PDSP_+1),SP
  438.         LD SP,IX
  439.         LD H,A
  440.         LD L,A
  441.         PUSH HL
  442.         PUSH HL
  443.         PUSH HL
  444.         PUSH HL
  445.         PUSH HL
  446.         PUSH HL
  447. PDSP_   LD SP,#3131
  448.  
  449. PD_FIN  LD A,(IX-12+CHP.NNtSkp)
  450.         LD (IX-12+CHP.NtSkCn),A
  451.         RET
  452.  
  453. C_PORTM RES 2,(IX-12+CHP.Flags)
  454.         LD A,(BC)
  455.         INC BC
  456. ;SKIP PRECALCULATED TONE DELTA (BECAUSE
  457. ;CANNOT BE RIGHT AFTER PT3 COMPILATION)
  458.         INC BC
  459.         INC BC
  460.         LD (IX-12+CHP.TnSlDl),A
  461.         LD (IX-12+CHP.TSlCnt),A
  462.         LD DE,NT_
  463.         LD A,(IX-12+CHP.Note)
  464.         LD (IX-12+CHP.SlToNt),A
  465.         ADD A,A
  466.         LD L,A
  467.         LD H,0
  468.         ADD HL,DE
  469.         LD A,(HL)
  470.         INC HL
  471.         LD H,(HL)
  472.         LD L,A
  473.         PUSH HL
  474. PrNote  LD A,#3E
  475.         LD (IX-12+CHP.Note),A
  476.         ADD A,A
  477.         LD L,A
  478.         LD H,0
  479.         ADD HL,DE
  480.         LD E,(HL)
  481.         INC HL
  482.         LD D,(HL)
  483.         POP HL
  484.         SBC HL,DE
  485.         LD (IX-12+CHP.TnDelt),L
  486.         LD (IX-12+CHP.TnDelt+1),H
  487.         LD E,(IX-12+CHP.CrTnSl)
  488.         LD D,(IX-12+CHP.CrTnSl+1)
  489. Version EQU $+1
  490.         LD A,#3E
  491.         CP 6
  492.         JR C,OLDPRTM ;Old 3xxx for PT v3.5-
  493. PrSlide LD DE,#1111
  494.         LD (IX-12+CHP.CrTnSl),E
  495.         LD (IX-12+CHP.CrTnSl+1),D
  496. OLDPRTM LD A,(BC) ;SIGNED TONE STEP
  497.         INC BC
  498.         EX AF,AF'
  499.         LD A,(BC)
  500.         INC BC
  501.         AND A
  502.         JR Z,NOSIG
  503.         EX DE,HL
  504. NOSIG   SBC HL,DE
  505.         JP P,SET_STP
  506.         CPL
  507.         EX AF,AF'
  508.         NEG
  509.         EX AF,AF'
  510. SET_STP LD (IX-12+CHP.TSlStp+1),A
  511.         EX AF,AF'
  512.         LD (IX-12+CHP.TSlStp),A
  513.         LD (IX-12+CHP.COnOff),0
  514.         RET
  515.  
  516. C_GLISS SET 2,(IX-12+CHP.Flags)
  517.         LD A,(BC)
  518.         INC BC
  519.         LD (IX-12+CHP.TnSlDl),A
  520.         AND A
  521.         JR NZ,GL36
  522.         LD A,(Version) ;AlCo PT3.7+
  523.         CP 7
  524.         SBC A,A
  525.         INC A
  526. GL36    LD (IX-12+CHP.TSlCnt),A
  527.         LD A,(BC)
  528.         INC BC
  529.         EX AF,AF'
  530.         LD A,(BC)
  531.         INC BC
  532.         JR SET_STP
  533.  
  534. C_SMPOS LD A,(BC)
  535.         INC BC
  536.         LD (IX-12+CHP.PsInSm),A
  537.         RET
  538.  
  539. C_ORPOS LD A,(BC)
  540.         INC BC
  541.         LD (IX-12+CHP.PsInOr),A
  542.         RET
  543.  
  544. C_VIBRT LD A,(BC)
  545.         INC BC
  546.         LD (IX-12+CHP.OnOffD),A
  547.         LD (IX-12+CHP.COnOff),A
  548.         LD A,(BC)
  549.         INC BC
  550.         LD (IX-12+CHP.OffOnD),A
  551.         XOR A
  552.         LD (IX-12+CHP.TSlCnt),A
  553.         LD (IX-12+CHP.CrTnSl),A
  554.         LD (IX-12+CHP.CrTnSl+1),A
  555.         RET
  556.  
  557. C_ENGLS LD A,(BC)
  558.         INC BC
  559.         LD (Env_Del),A
  560.         LD (CurEDel),A
  561.         LD A,(BC)
  562.         INC BC
  563.         LD L,A
  564.         LD A,(BC)
  565.         INC BC
  566.         LD H,A
  567.         LD (ESldAdd),HL
  568.         RET
  569.  
  570. C_DELAY LD A,(BC)
  571.         INC BC
  572.         LD (Delay),A
  573.         RET
  574.        
  575. SETENV  LD (IX-12+CHP.Env_En),E
  576.         LD (AYREGS+EnvTp),A
  577.         LD A,(BC)
  578.         INC BC
  579.         LD H,A
  580.         LD A,(BC)
  581.         INC BC
  582.         LD L,A
  583.         LD (EnvBase),HL
  584.         XOR A
  585.         LD (IX-12+CHP.PsInOr),A
  586.         LD (CurEDel),A
  587.         LD H,A
  588.         LD L,A
  589.         LD (CurESld),HL
  590. C_NOP   RET
  591.  
  592. SETORN  ADD A,A
  593.         LD E,A
  594.         LD D,0
  595.         LD (IX-12+CHP.PsInOr),D
  596. OrnPtrs EQU $+1
  597.         LD HL,#2121
  598.         ADD HL,DE
  599.         LD E,(HL)
  600.         INC HL
  601.         LD D,(HL)
  602. MDADDR2 EQU $+1
  603.         LD HL,#2121
  604.         ADD HL,DE
  605.         LD (IX-12+CHP.OrnPtr),L
  606.         LD (IX-12+CHP.OrnPtr+1),H
  607.         RET
  608.  
  609. ;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES
  610. SPCCOMS DW C_NOP
  611.         DW C_GLISS
  612.         DW C_PORTM
  613.         DW C_SMPOS
  614.         DW C_ORPOS
  615.         DW C_VIBRT
  616.         DW C_NOP
  617.         DW C_NOP
  618.         DW C_ENGLS
  619.         DW C_DELAY
  620.         DW C_NOP
  621.         DW C_NOP
  622.         DW C_NOP
  623.         DW C_NOP
  624.         DW C_NOP
  625.         DW C_NOP
  626.  
  627. CHREGS  XOR A
  628.         LD (Ampl),A
  629.         BIT 0,(IX+CHP.Flags)
  630.         PUSH HL
  631.         JP Z,CH_EXIT
  632.         LD (CSP_+1),SP
  633.         LD L,(IX+CHP.OrnPtr)
  634.         LD H,(IX+CHP.OrnPtr+1)
  635.         LD SP,HL
  636.         POP DE
  637.         LD H,A
  638.         LD A,(IX+CHP.PsInOr)
  639.         LD L,A
  640.         ADD HL,SP
  641.         INC A
  642.         CP D
  643.         JR C,CH_ORPS
  644.         LD A,E
  645. CH_ORPS LD (IX+CHP.PsInOr),A
  646.         LD A,(IX+CHP.Note)
  647.         ADD A,(HL)
  648.         JP P,CH_NTP
  649.         XOR A
  650. CH_NTP  CP 96
  651.         JR C,CH_NOK
  652.         LD A,95
  653. CH_NOK  ADD A,A
  654.         EX AF,AF'
  655.         LD L,(IX+CHP.SamPtr)
  656.         LD H,(IX+CHP.SamPtr+1)
  657.         LD SP,HL
  658.         POP DE
  659.         LD H,0
  660.         LD A,(IX+CHP.PsInSm)
  661.         LD B,A
  662.         ADD A,A
  663.         ADD A,A
  664.         LD L,A
  665.         ADD HL,SP
  666.         LD SP,HL
  667.         LD A,B
  668.         INC A
  669.         CP D
  670.         JR C,CH_SMPS
  671.         LD A,E
  672. CH_SMPS LD (IX+CHP.PsInSm),A
  673.         POP BC
  674.         POP HL
  675.         LD E,(IX+CHP.TnAcc)
  676.         LD D,(IX+CHP.TnAcc+1)
  677.         ADD HL,DE
  678.         BIT 6,B
  679.         JR Z,CH_NOAC
  680.         LD (IX+CHP.TnAcc),L
  681.         LD (IX+CHP.TnAcc+1),H
  682. CH_NOAC EX DE,HL
  683.         EX AF,AF'
  684.         LD L,A
  685.         LD H,0
  686.         LD SP,NT_
  687.         ADD HL,SP
  688.         LD SP,HL
  689.         POP HL
  690.         ADD HL,DE
  691.         LD E,(IX+CHP.CrTnSl)
  692.         LD D,(IX+CHP.CrTnSl+1)
  693.         ADD HL,DE
  694. CSP_    LD SP,#3131
  695.         EX (SP),HL
  696.         XOR A
  697.         OR (IX+CHP.TSlCnt)
  698.         JR Z,CH_AMP
  699.         DEC (IX+CHP.TSlCnt)
  700.         JR NZ,CH_AMP
  701.         LD A,(IX+CHP.TnSlDl)
  702.         LD (IX+CHP.TSlCnt),A
  703.         LD L,(IX+CHP.TSlStp)
  704.         LD H,(IX+CHP.TSlStp+1)
  705.         LD A,H
  706.         ADD HL,DE
  707.         LD (IX+CHP.CrTnSl),L
  708.         LD (IX+CHP.CrTnSl+1),H
  709.         BIT 2,(IX+CHP.Flags)
  710.         JR NZ,CH_AMP
  711.         LD E,(IX+CHP.TnDelt)
  712.         LD D,(IX+CHP.TnDelt+1)
  713.         AND A
  714.         JR Z,CH_STPP
  715.         EX DE,HL
  716. CH_STPP SBC HL,DE
  717.         JP M,CH_AMP
  718.         LD A,(IX+CHP.SlToNt)
  719.         LD (IX+CHP.Note),A
  720.         XOR A
  721.         LD (IX+CHP.TSlCnt),A
  722.         LD (IX+CHP.CrTnSl),A
  723.         LD (IX+CHP.CrTnSl+1),A
  724. CH_AMP  LD A,(IX+CHP.CrAmSl)
  725.         BIT 7,C
  726.         JR Z,CH_NOAM
  727.         BIT 6,C
  728.         JR Z,CH_AMIN
  729.         CP 15
  730.         JR Z,CH_NOAM
  731.         INC A
  732.         JR CH_SVAM
  733. CH_AMIN CP -15
  734.         JR Z,CH_NOAM
  735.         DEC A
  736. CH_SVAM LD (IX+CHP.CrAmSl),A
  737. CH_NOAM LD L,A
  738.         LD A,B
  739.         AND 15
  740.         ADD A,L
  741.         JP P,CH_APOS
  742.         XOR A
  743. CH_APOS CP 16
  744.         JR C,CH_VOL
  745.         LD A,15
  746. CH_VOL  OR (IX+CHP.Volume)
  747.         LD L,A
  748.         LD H,0
  749.         LD DE,VT_
  750.         ADD HL,DE
  751.         LD A,(HL)
  752. CH_ENV  BIT 0,C
  753.         JR NZ,CH_NOEN
  754.         OR (IX+CHP.Env_En)
  755. CH_NOEN LD (Ampl),A
  756.         BIT 7,B
  757.         LD A,C
  758.         JR Z,NO_ENSL
  759.         RLA
  760.         RLA
  761.         SRA A
  762.         SRA A
  763.         SRA A
  764.         ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW
  765.         BIT 5,B
  766.         JR Z,NO_ENAC
  767.         LD (IX+CHP.CrEnSl),A
  768. NO_ENAC LD HL,AddToEn
  769.         ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE.
  770.                    ;FIX IT IN NEXT VERSION?
  771.         LD (HL),A
  772.         JR CH_MIX
  773. NO_ENSL RRA
  774.         ADD A,(IX+CHP.CrNsSl)
  775.         LD (AddToNs),A
  776.         BIT 5,B
  777.         JR Z,CH_MIX
  778.         LD (IX+CHP.CrNsSl),A
  779. CH_MIX  LD A,B
  780.         RRA
  781.         AND #48
  782. CH_EXIT LD HL,AYREGS+Mixer
  783.         OR (HL)
  784.         RRCA
  785.         LD (HL),A
  786.         POP HL
  787.         XOR A
  788.         OR (IX+CHP.COnOff)
  789.         RET Z
  790.         DEC (IX+CHP.COnOff)
  791.         RET NZ
  792.         XOR (IX+CHP.Flags)
  793.         LD (IX+CHP.Flags),A
  794.         RRA
  795.         LD A,(IX+CHP.OnOffD)
  796.         JR C,CH_ONDL
  797.         LD A,(IX+CHP.OffOnD)
  798. CH_ONDL LD (IX+CHP.COnOff),A
  799.         RET
  800.  
  801. PLAY    XOR A
  802.         LD (AddToEn),A
  803.         LD (AYREGS+Mixer),A
  804.         DEC A
  805.         LD (AYREGS+EnvTp),A
  806.         LD HL,DelyCnt
  807.         DEC (HL)
  808.         JR NZ,PL2
  809.         LD HL,ChanA+CHP.NtSkCn
  810.         DEC (HL)
  811.         JR NZ,PL1B
  812. AdInPtA EQU $+1
  813.         LD BC,#0101
  814.         LD A,(BC)
  815.         AND A
  816.         JR NZ,PL1A
  817.         LD D,A
  818.         LD (Ns_Base),A
  819.         LD HL,(CrPsPtr)
  820.         INC HL
  821.         LD A,(HL)
  822.         INC A
  823.         JR NZ,PLNLP
  824.         CALL CHECKLP
  825. LPosPtr EQU $+1
  826.         LD HL,#2121
  827.         LD A,(HL)
  828.         INC A
  829. PLNLP   LD (CrPsPtr),HL
  830.         DEC A
  831.         ADD A,A
  832.         LD E,A
  833.         RL D
  834. PatsPtr EQU $+1
  835.         LD HL,#2121
  836.         ADD HL,DE
  837.         LD DE,(MODADDR)
  838.         LD (PSP_+1),SP
  839.         LD SP,HL
  840.         POP HL
  841.         ADD HL,DE
  842.         LD B,H
  843.         LD C,L
  844.         POP HL
  845.         ADD HL,DE
  846.         LD (AdInPtB),HL
  847.         POP HL
  848.         ADD HL,DE
  849.         LD (AdInPtC),HL
  850. PSP_    LD SP,#3131
  851. PL1A    LD IX,ChanA+12
  852.         CALL PTDECOD
  853.         LD (AdInPtA),BC
  854.  
  855. PL1B    LD HL,ChanB+CHP.NtSkCn
  856.         DEC (HL)
  857.         JR NZ,PL1C
  858.         LD IX,ChanB+12
  859. AdInPtB EQU $+1
  860.         LD BC,#0101
  861.         CALL PTDECOD
  862.         LD (AdInPtB),BC
  863.  
  864. PL1C    LD HL,ChanC+CHP.NtSkCn
  865.         DEC (HL)
  866.         JR NZ,PL1D
  867.         LD IX,ChanC+12
  868. AdInPtC EQU $+1
  869.         LD BC,#0101
  870.         CALL PTDECOD
  871.         LD (AdInPtC),BC
  872.  
  873. Delay   EQU $+1
  874. PL1D    LD A,#3E
  875.         LD (DelyCnt),A
  876.  
  877. PL2     LD IX,ChanA
  878.         LD HL,(AYREGS+TonA)
  879.         CALL CHREGS
  880.         LD (AYREGS+TonA),HL
  881.         LD A,(Ampl)
  882.         LD (AYREGS+AmplA),A
  883.         LD IX,ChanB
  884.         LD HL,(AYREGS+TonB)
  885.         CALL CHREGS
  886.         LD (AYREGS+TonB),HL
  887.         LD A,(Ampl)
  888.         LD (AYREGS+AmplB),A
  889.         LD IX,ChanC
  890.         LD HL,(AYREGS+TonC)
  891.         CALL CHREGS
  892. ;       LD A,(Ampl) ;Ampl = AYREGS+AmplC
  893. ;       LD (AYREGS+AmplC),A
  894.         LD (AYREGS+TonC),HL
  895.  
  896.         LD HL,(Ns_Base_AddToNs)
  897.         LD A,H
  898.         ADD A,L
  899.         LD (AYREGS+Noise),A
  900.  
  901. AddToEn EQU $+1
  902.         LD A,#3E
  903.         LD E,A
  904.         ADD A,A
  905.         SBC A,A
  906.         LD D,A
  907.         LD HL,(EnvBase)
  908.         ADD HL,DE
  909.         LD DE,(CurESld)
  910.         ADD HL,DE
  911.         LD (AYREGS+Env),HL
  912.  
  913.         XOR A
  914.         LD HL,CurEDel
  915.         OR (HL)
  916.         JR Z,ROUT_A0
  917.         DEC (HL)
  918.         JR NZ,ROUT
  919. Env_Del EQU $+1
  920.         LD A,#3E
  921.         LD (HL),A
  922. ESldAdd EQU $+1
  923.         LD HL,#2121
  924.         ADD HL,DE
  925.         LD (CurESld),HL
  926.  
  927. ROUT    XOR A
  928. ROUT_A0 LD DE,#FFBF
  929.         LD BC,#FFFD
  930.         LD HL,AYREGS
  931. LOUT    OUT (C),A
  932.         LD B,E
  933.         OUTI
  934.         LD B,D
  935.         INC A
  936.         CP 13
  937.         JR NZ,LOUT
  938.         OUT (C),A
  939.         LD A,(HL)
  940.         AND A
  941.         RET M
  942.         LD B,E
  943.         OUT (C),A
  944.         RET
  945.  
  946. NT_DATA DB (T_NEW_0-T1_)*2
  947.         DB TCNEW_0-T_
  948.         DB (T_OLD_0-T1_)*2+1
  949.         DB TCOLD_0-T_
  950.         DB (T_NEW_1-T1_)*2+1
  951.         DB TCNEW_1-T_
  952.         DB (T_OLD_1-T1_)*2+1
  953.         DB TCOLD_1-T_
  954.         DB (T_NEW_2-T1_)*2
  955.         DB TCNEW_2-T_
  956.         DB (T_OLD_2-T1_)*2
  957.         DB TCOLD_2-T_
  958.         DB (T_NEW_3-T1_)*2
  959.         DB TCNEW_3-T_
  960.         DB (T_OLD_3-T1_)*2
  961.         DB TCOLD_3-T_
  962.  
  963. T_
  964.  
  965. TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1
  966.         DB #18+1,#24+1,#3C+1,0
  967. TCOLD_1 DB #5C+1,0
  968. TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C
  969.         DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0
  970. TCNEW_3 DB #56+1
  971. TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0
  972. TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1
  973.         DB #BC+1,#BE+1,0
  974. TCNEW_1 EQU TCOLD_1
  975. TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1
  976.         DB #BA+1,#BC+1,#BE+1,0
  977.  
  978. EMPTYSAMORN EQU $-1
  979.         DB 1,0,#90 ;delete #90 if you don't need default sample
  980.  
  981. ;first 12 values of tone tables (packed)
  982.  
  983. T_PACK  DB #06EC*2/256,(#06EC*2)&255
  984.         DB #0755-#06EC
  985.         DB #07C5-#0755
  986.         DB #083B-#07C5
  987.         DB #08B8-#083B
  988.         DB #093D-#08B8
  989.         DB #09CA-#093D
  990.         DB #0A5F-#09CA
  991.         DB #0AFC-#0A5F
  992.         DB #0BA4-#0AFC
  993.         DB #0C55-#0BA4
  994.         DB #0D10-#0C55
  995.         DB #066D*2/256,(#066D*2)&255
  996.         DB #06CF-#066D
  997.         DB #0737-#06CF
  998.         DB #07A4-#0737
  999.         DB #0819-#07A4
  1000.         DB #0894-#0819
  1001.         DB #0917-#0894
  1002.         DB #09A1-#0917
  1003.         DB #0A33-#09A1
  1004.         DB #0ACF-#0A33
  1005.         DB #0B73-#0ACF
  1006.         DB #0C22-#0B73
  1007.         DB #0CDA-#0C22
  1008.         DB #0704*2/256,(#0704*2)&255
  1009.         DB #076E-#0704
  1010.         DB #07E0-#076E
  1011.         DB #0858-#07E0
  1012.         DB #08D6-#0858
  1013.         DB #095C-#08D6
  1014.         DB #09EC-#095C
  1015.         DB #0A82-#09EC
  1016.         DB #0B22-#0A82
  1017.         DB #0BCC-#0B22
  1018.         DB #0C80-#0BCC
  1019.         DB #0D3E-#0C80
  1020.         DB #07E0*2/256,(#07E0*2)&255
  1021.         DB #0858-#07E0
  1022.         DB #08E0-#0858
  1023.         DB #0960-#08E0
  1024.         DB #09F0-#0960
  1025.         DB #0A88-#09F0
  1026.         DB #0B28-#0A88
  1027.         DB #0BD8-#0B28
  1028.         DB #0C80-#0BD8
  1029.         DB #0D60-#0C80
  1030.         DB #0E10-#0D60
  1031.         DB #0EF8-#0E10
  1032.  
  1033. ;vars from here can be stripped
  1034. ;you can move VARS to any other address
  1035.  
  1036. VARS
  1037.  
  1038. ;ChannelsVars
  1039.         STRUCT  CHP
  1040. ;reset group
  1041. PsInOr  DB 0
  1042. PsInSm  DB 0
  1043. CrAmSl  DB 0
  1044. CrNsSl  DB 0
  1045. CrEnSl  DB 0
  1046. TSlCnt  DB 0
  1047. CrTnSl  DW 0
  1048. TnAcc   DW 0
  1049. COnOff  DB 0
  1050. ;reset group
  1051.  
  1052. OnOffD  DB 0
  1053.  
  1054. ;IX for PTDECOD here (+12)
  1055. OffOnD  DB 0
  1056. OrnPtr  DW 0
  1057. SamPtr  DW 0
  1058. NNtSkp  DB 0
  1059. Note    DB 0
  1060. SlToNt  DB 0
  1061. Env_En  DB 0
  1062. Flags   DB 0
  1063.  ;Enabled - 0,SimpleGliss - 2
  1064. TnSlDl  DB 0
  1065. TSlStp  DW 0
  1066. TnDelt  DW 0
  1067. NtSkCn  DB 0
  1068. Volume  DB 0
  1069.         ENDS
  1070.  
  1071. ChanA   DS CHP
  1072. ChanB   DS CHP
  1073. ChanC   DS CHP
  1074.  
  1075. ;GlobalVars
  1076. DelyCnt DB 0
  1077. CurESld DW 0
  1078. CurEDel DB 0
  1079. Ns_Base_AddToNs
  1080. Ns_Base DB 0
  1081. AddToNs DB 0
  1082.  
  1083. AYREGS
  1084.  
  1085. VT_     DS 256 ;CreatedVolumeTableAddress
  1086.  
  1087. EnvBase EQU VT_+14
  1088.  
  1089. T1_     EQU VT_+16 ;Tone tables data depacked here
  1090.  
  1091. T_OLD_1 EQU T1_
  1092. T_OLD_2 EQU T_OLD_1+24
  1093. T_OLD_3 EQU T_OLD_2+24
  1094. T_OLD_0 EQU T_OLD_3+2
  1095. T_NEW_0 EQU T_OLD_0
  1096. T_NEW_1 EQU T_OLD_1
  1097. T_NEW_2 EQU T_NEW_0+24
  1098. T_NEW_3 EQU T_OLD_3
  1099.  
  1100. NT_     DS 192 ;CreatedNoteTableAddress
  1101.  
  1102. ;local var
  1103. Ampl    EQU AYREGS+AmplC
  1104.  
  1105. VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1
  1106.  
  1107. VARSEND EQU $
  1108.  
  1109. MDLADDR EQU $
  1110.  
  1111. ;Release 0 steps:
  1112. ;11.Sep.2004 - Note tables creator
  1113. ;12.Sep.2004 - Volume tables creator; INIT subroutine
  1114. ;13.Sep.2004 - Play counters, position counters
  1115. ;14.Sep.2004 - Patterns decoder subroutine
  1116. ;15.Sep.2004 - Resting (no code)
  1117. ;16.Sep.2004 - CHREGS subroutine; global debugging; 1st stable
  1118. ;version was born
  1119. ;17.Sep.2004 - Debugging and optimization. First release!
  1120. ;Release 1 steps:
  1121. ;20.Sep.2004 - local vars moved to code (selfmodified code
  1122. ;smaller and faster)
  1123. ;22.Sep.2004 - added mute sound entry at START+8; position
  1124. ;pointer moved to START+11; added setup and status byte at
  1125. ;START+10 noloop mode and loop passed flags added
  1126. ;Release 2 steps:
  1127. ;28.Sep.2004 - Optimization: code around CHREGS's volume and
  1128. ;vibrato faster now; zeroing PD_RES through stack; Ton and Ampl
  1129. ;moved from channel vars to global ones; first position selector
  1130. ;removed from INIT; optimization for packers(Ivan Roshin method)
  1131. ;Release 3 steps:
  1132. ;2.Oct.2004 - optimization in INIT and PD_LOOP (thanks to Ivan
  1133. ;Roshin)
  1134. ;4.Oct.2004 - load delay from (hl) in INIT (2 bytes shorter)
  1135. ;5.Oct.2004 - optimization in PD_LOOP (->PD_LP2)
  1136. ;7.Oct.2004 - swaping some commands for better packing
  1137. ;Release 4 steps:
  1138. ;9.Oct.2004 - optimization around LD HL,SPCCOMS (thanks to Ivan
  1139. ;Roshin); in PTDECOD swapped BC and DE to optimize C_PORTM;
  1140. ;removed sam and orn len and loop channel vars; CHREGS totally
  1141. ;optimized
  1142. ;Release 5 steps:
  1143. ;11.Oct.2004 - PD_OrSm and C_PORTM optimized; Ivan Roshin's
  1144. ;volume tables creator algorithm (51 bytes shorter than mine)
  1145. ;12.Oct.2004 - Ivan Roshin's note tables creator algorithm (74
  1146. ;bytes shorter than mine)
  1147. ;Release 6 steps:
  1148. ;14.Oct.2004 - loop and next position calculations moved to INIT
  1149. ;15.Oct.2004 - AdInPt moved to code
  1150. ;19.Oct.2004 - Env_Del moved to code
  1151. ;20.Oct.2004 - Version PUSH and POP (1 byte shorter, thanks to
  1152. ;Ivan Roshin)
  1153. ;22.Oct.2004 - Env_En moved from Flags' bit to byte (shorter and
  1154. ;faster code)
  1155. ;25.Oct.2004 - SETENV optimized
  1156. ;29.Oct.2004 - Optimized around AddToEn (SBC A,A, thanks to Ivan
  1157. ;Roshin)
  1158. ;3.Nov.2004 - Note tables data was compressed; with depacker it
  1159. ;is 9 bytes shorter than uncompressed (thanks to Ivan Roshin)
  1160. ;4.Nov.2004 - default sample and ornament both are fixed now
  1161. ;and placed into code block (6 bytes shorter)
  1162. ;7.Nov.2004 - LD A,(Ns_Base):LD L,A changed to LD HL,(Ns_Base)
  1163. ;(thanks to Dima Bystrov)
  1164. ;9.Nov.2004 - Ns_Base and AddToNs are merged to Ns_Base_AddToNs;
  1165. ;LD A,255 changed to DEC A (at start of PLAY); added ROUT_A0
  1166. ;12.Nov.2004 - NtSkCn&Volume are merged (8 bytes smaller init);
  1167. ;LD BC,T1_ changed to PUSH DE...POP BC in note table creator
  1168. ;19.Dec.2004 - NT_DATA reorganized (6 bytes shorter, thanks to
  1169. ;Ivan Roshin); C_PORTM and C_GLISS are merged via SET_STP (48
  1170. ;tacts slower, but 8 bytes smaller, thanks to Ivan Roshin)
  1171. ;Release 7 steps:
  1172. ;29.Apr.2007 - SjAsm adaptation; new 1.xx and 2.xx
  1173. ;interpretation for PT 3.7+.
  1174.  
  1175. ;Tests in IMMATION TESTER V1.0 by Andy Man/POS (thanks to
  1176. ;Himik's ZxZ for help):
  1177. ;Module name/author     Min tacts       Max tacts       Average
  1178. ;Spleen/Nik-O           1720            9256            5500
  1179. ;Chuta/Miguel           1720            9496            5500
  1180. ;Zhara/Macros           4536            8744            5500
  1181.  
  1182. ;Size:
  1183. ;Code block #651 bytes
  1184. ;Variables #21D bytes (can be stripped)
  1185. ;Size in RAM #651+#21D=#86E (2158) bytes
  1186.  
  1187. ;Notes:
  1188. ;Pro Tracker 3.4r can not be detected by header, so PT3.4r tone
  1189. ;tables really used only for modules of 3.3 and older versions.
  1190.  
  1191.         endmodule