?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

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