PROTRACKER372 PT3X0A H
PT3x0A C��┴O�P�з;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- $ $
- $ PRO TRACKER 3.X PLAYER v3x0A by Dr.Lion/RSM (c) 2004 $
- $ $
- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
- Редактирование
- 8.07.2004
- Файл исходника
- PT3x0A (оптимизирован для малого размера)
- Основные технические параметры плеера
- - базирован на ядре проигрывателя RC367 by Alone Coder;
- - версия ядра проигрывателя
- [0] универсальное,малого размера;
- - максимальное время работы
- 8864 такта (тестовый спецмодуль);
- - среднее время работы
- 5440 такта (тестовый спецмодуль);
- - размер проигрывателя
- 1742 (#06CE) байт;
- - качество звука
- среднее
- ------ Основные точки входа в плеер ------
ORG #C000 ;Адрес компиляции
Compile LD HL,module ;Адрес модуля
JR INSTALL JP PLAY JP STOP
- ------ Процедура инсталляции ------
INSTALL DI
PUSH HL LD BC,99 ADD HL,BC LD A,(HL) INC HL PUSH HL LD HL,Tb_PT-24 LD C,24
Find_FT ADD HL,BC
DEC A JP P,Find_FT LD IX,tab_frq
- ------ Frequency Table Generator ------
LD (SP_SV+1),SP LD SP,HL LD C,12
MkFT_L0 POP HL
LD DE,24 LD B,8
MkFT_L1 SRL H
RR L LD A,L ADC A,D LD (IX+0),A LD A,H ADC A,D LD (IX+1),A ADD IX,DE DJNZ MkFT_L1 LD DE,-8*24+2 ADD IX,DE DEC C JR NZ,MkFT_L0
SP_SV LD SP,0
- ------ продолжение инсталляции ------
POP HL LD A,(HL) LD (temp+1),A INC HL INC HL LD A,(HL) INC HL LD E,(HL) INC HL LD D,(HL) INC HL LD (smpPP+1),HL LD C,64 ADD HL,BC LD (ornPP+1),HL LD C,32 ADD HL,BC LD (Psa_beg+1),HL LD C,A ADD HL,BC LD (Psa_lop+1),HL POP HL ADD HL,DE LD (Psa_chn+1),HL LD A,B LD (Am_vol),A LD (Bm_vol),A LD (Cm_vol),A INC A LD (A_qty),A LD (B_qty),A LD (C_qty),A LD HL,ZERO_M LD (Ao_adr),HL LD (Bo_adr),HL LD (Co_adr),HL LD (As_adr),HL LD (Bs_adr),HL LD (Cs_adr),HL LD (Ach_adr),HL SUB 16+1 LD (Ag_vol),A LD (Bg_vol),A LD (Cg_vol),A SBC A,A LD (Avb_lok),A LD (Cvb_lok),A LD (Bvb_lok),A
STOP LD DE,#0E00
DEC D LD BC,#FFFD OUT (C),D LD B,#BF OUT (C),E JR NZ,STOP+3
res RET
- ------ Вычисление адреса орнамента/сэмпла ------
ornPP LD HL,ZERO_M
ADD A,A JR sm_or_P
smpPP LD HL,ZERO_M sm_or_P LD C,A
XOR A LD B,A ADD HL,BC LD C,(HL) INC HL LD B,(HL) LD HL,(Compile+1) ADD HL,BC RET
- ------ Установка формы и частоты ENV ------
EiPP LD (E_form),A
EX DE,HL LD D,(HL) INC HL LD E,(HL) INC HL EX DE,HL LD (Env_frq+1),HL XOR A LD L,A LD H,A LD (Esl_frq+1),HL JR Eipp
- ------ Special Effects COM.9XXX ------
Eef_sld LD A,(DE) ;sld_env
INC DE EX DE,HL LD E,(HL) INC HL LD D,(HL) INC HL EX DE,HL LD (Esl_sds+1),HL ;sds LD (Esl_sts+1),A
Eipp LD (Esl_stp+1),A ;stp
LD A,%00010000 RET
- ------ #C100 Таблица громкости (логарифмическая) ------
DISPLAY "Volume Table :",$
frq_A DW 0 frq_B DW 0 frq_C DW 0 Noise DB 0 Mixer DB 0 vol_A DB 0 vol_B DB 0 vol_C DB 0 frq_E DW 0 E_form DB 0 ZERO_M DW 0 DB 0,0,0,0,0,0,0,0,01,01,01,01,01,01,01,01 DB 0,0,0,0,1,1,1,1,01,01,01,01,02,02,02,02 DB 0,0,0,1,1,1,1,1,02,02,02,02,02,03,03,03 DB 0,0,1,1,1,1,2,2,02,02,03,03,03,03,04,04 DB 0,0,1,1,1,2,2,2,03,03,03,04,04,04,05,05 DB 0,0,1,1,2,2,2,3,03,04,04,04,05,05,06,06 DB 0,0,1,1,2,2,3,3,04,04,05,05,06,06,07,07 DB 0,1,1,2,2,3,3,4,04,05,05,06,06,07,07,08 DB 0,1,1,2,2,3,4,4,05,05,06,07,07,08,08,09 DB 0,1,1,2,3,3,4,5,05,06,07,07,08,09,09,10 DB 0,1,1,2,3,4,4,5,06,07,07,08,09,10,10,11 DB 0,1,2,2,3,4,5,6,06,07,08,09,10,10,11,12 DB 0,1,2,3,3,4,5,6,07,08,09,10,10,11,12,13 DB 0,1,2,3,4,5,6,7,07,08,09,10,11,12,13,14 DB 0,1,2,3,4,5,6,7,08,09,10,11,12,13,14,15
- ------ #C200 Область таблицы частот нот -------
tab_frq EQU $ Test_AY LD DE,#FFBF
LD C,#FD LD A,#02 LD B,D OUT (C),A LD B,E OUT (C),E LD B,D IN A,(C) CP E LD HL,DC_StrA JR NZ,AY_Exit
AY_Pres LD A,#10
OUT (C),A IN A,(C) CP D LD HL,AY_StrA JR NZ,AY_Exit LD HL,YM_StrA
AY_Exit JP STOP
DS 8 DB "Pro Tracker 3.x Player v3x0A" DB " by Dr.Lion (C) 2004 LEN:6CE" DS 8
DC_StrA DB "Disconnected",0 AY_StrA DB "AY-3-8910",0 YM_StrA DB "YM2149F",0
DS 192-($-tab_frq)
- ------ Таблица подпрограмм комманд ------
X_eff DW Xef_slT ;1xxx,2xxx - sld_tone
DW Xef_nsT ;3xxx - port_note DW Xef_dSm ;4.xx - dsp_smp DW Xef_dOr ;5.xx - dsp_orn DW Xef_vib ;6.xx - vibrato DW res DW res DW Eef_sld ;9xxx,Axxx - sld_env DW eff_tmp ;B.xx - temp
- ------ Все переменные канала A ------
Ach_adr DW ZERO_M ;-04 POSITION ADR Ai_qty DB #01 ;-02 STEP COUNTER PRESET A_qty DB #01 ;-01 STEP COUNTER Afrq_Ad DW frq_A ;+00 ADR IN MEM OF FRQ REG Avol_Ad DW vol_A ;+02 ADR IN MEM OF VOL REG As_adr DW ZERO_M ;+04 SAMPLE ADR Ao_adr DW ZERO_M ;+06 ORNAMENT ADR ACh_IDN DB 4 ;+08 CHANNEL ROLL FOR MIXER Asl_plk DB Xsl_sts-Xsl_plk ;+09 DSP FOR PORT ON/OFF Avb_lok DB #FF ;+10 SOUND LOCK (VIBRATO) As_Vsl DB #10 ;+11 VOLUME SLIDE ACC Ag_vol DB #F0 ;+12 GLOBAL VOLUME Am_vol DB 0 ;+13 ENVELOPMENT MASK As_Nsl DB 0 ;+14 NOISE SLIDE ACC As_Esl DB 0 ;+15 ENVELOPMENT SLIDE ACC As_dtn DW 0 ;+16 SAMP FRQ DSP ACC As_dsp DB 0 ;+18 SAMPLE POSITION Ao_dsp DB 0 ;+19 ORNAMENT POSITION Asl_dsp DW 0 ;+20 SLIDE DSP Asl_stp DB 0 ;+22 SLIDE STEP (DELAY) Asl_tfr DW 0 ;+23 SLIDE ADD DSP Asl_not DB 0 ;+25 SLIDE TO NOTE As_note DB 0 ;+26 SAMPLE NOTE Asl_sts DB 0 ;+27 SLIDE COUNTER PRESET Avb_stp DB 0 ;+28 VIBRATO COUNTER Avb_frq DB 0 ;+29 SOUND OFF DELAY (VIBRATO) Avb_sts DB 0 ;+30 VIBRATO COUNTER PRESET
- ------ Все переменные канала B ------
Bch_adr DW ZERO_M Bi_qty DB #01 B_qty DB #01 Bfrq_Ad DW frq_B Bvol_Ad DW vol_B Bs_adr DW ZERO_M Bo_adr DW ZERO_M BCh_IDN DB 3 Bsl_plk DB Xsl_sts-Xsl_plk Bvb_lok DB #FF Bs_Vsl DB #10 Bg_vol DB #F0 Bm_vol DB 0 Bs_Nsl DB 0 Bs_Esl DB 0 Bs_dtn DW 0 Bs_dsp DB 0 Bo_dsp DB 0 Bsl_dsp DW 0 Bsl_stp DB 0 Bsl_tfr DW 0 Bsl_not DB 0 Bs_note DB 0 Bsl_sts DB 0 Bvb_stp DB 0 Bvb_frq DB 0 Bvb_sts DB 0
- ------ Все переменные канала C ------
Cch_adr DW ZERO_M Ci_qty DB #01 C_qty DB #01 Cfrq_Ad DW frq_C Cvol_Ad DW vol_C Cs_adr DW ZERO_M Co_adr DW ZERO_M CCh_IDN DB 2 Csl_plk DB Xsl_sts-Xsl_plk Cvb_lok DB #FF Cs_Vsl DB #10 Cg_vol DB #F0 Cm_vol DB 0 Cs_Nsl DB 0 Cs_Esl DB 0 Cs_dtn DW 0 Cs_dsp DB 0 Co_dsp DB 0 Csl_dsp DW 0 Csl_stp DB 0 Csl_tfr DW 0 Csl_not DB 0 Cs_note DB 0 Csl_sts DB 0 Cvb_stp DB 0 Cvb_frq DB 0 Cvb_sts DB 0
- ------ Play One Frame of Module ------
PLAY PUSH IY int_qty LD A,1
DEC A JR NZ,SamplIT
- ------ Просчет следующей строки паттерна ------
LD IY,Afrq_Ad CALL Get_Pos LD IY,Bfrq_Ad CALL Get_Pos LD IY,Cfrq_Ad CALL Get_Pos
temp LD A,3 ;temp SamplIT LD (int_qty+1),A
- ------ Проигрывание сэмплером каналов ABC ------
N_add LD IX,0 ;HX=noise LX=mix
LD BC,0 ;smp_sl_env EXX LD IY,Afrq_Ad CALL OneChan LD IY,Bfrq_Ad CALL OneChan LD IY,Cfrq_Ad CALL OneChan
- ------ Модифицированый сэмплер Envelopment ------
Sampl_E EXX Esl_frq LD DE,0 ;stp_sl_env Env_frq LD HL,0 ;frq_env
ADD HL,BC ADD HL,DE LD (frq_E),HL
- ------ Просчет Slide DSP для Envelopment ------
Esl_stp LD A,0
DEC A JP M,MPU_Out JR NZ,Esl_n0
Esl_sds LD HL,0
ADD HL,DE LD (Esl_frq+1),HL
Esl_sts LD A,0 Esl_n0 LD (Esl_stp+1),A
- ---- Update Noise & Mixer Than Out ----
MPU_Out LD A,HX ;noise value
LD (N_add+3),A
N_frq ADD A,0
LD (Noise),A LD A,LX ;mixer bits LD (Mixer),A POP IY ;old IY value LD HL,frq_A LD DE,#FFBF LD C,#FD LD A,14
AY_Out LD B,D
OUT (C),L LD B,E DEC A JR Z,EN_Out OUTI JR AY_Out
EN_Out OR (HL)
RET Z OUT (C),A LD (HL),0 RET
- ------ Универсальный сэмплер для каналов ABC ------
OneChan LD (Quit_S+1),SP
LD SP,IY POP HL LD (FrqR_A+1),HL POP HL LD (VolR_A+1),HL POP HL LD (Xs_adr+1),HL POP HL LD (Xo_adr+1),HL POP HL LD A,L LD (Ch_Roll+1),A LD A,H LD (Xsl_plk-1),A
- ------ Переделанный под переменные сэмплер PT3.67 ------
tab_vol EQU frq_A
LD A,(IY+10) ;Xvb_lok LD H,A INC A JP Z,Xvb_n0
Xs_adr LD SP,0 ;sample
POP DE ;loop E=beg D=end LD A,(IY+18) ;Xs_dsp LD L,A INC A CP D JR C,Xs_n0 LD A,E
Xs_n0 LD (IY+18),A
ADD HL,HL ADD HL,HL ADD HL,SP LD SP,HL POP DE ;D= Nm ts ns Tm v3 v2 v1 v0 LD A,D ;E= sv +- N4 N3 N2 N1 N0 Em OR #F0 LD L,A LD A,E ADD A,A LD A,(IY+11) ;Xs_Vsl JR NC,Xs_VslG JP M,Xs_n2 SUB 1 JR Xs_n3
Xs_n2 CP 31 Xs_n3 ADC A,0
LD (IY+11),A
Xs_VslG ADD A,L
JR C,Xs_n4 XOR A
Xs_n4 CP 16
JR C,Xg_vol LD A,15
Xg_vol ADD A,(IY+12) ;Xg_vol
LD L,A LD H,'tab_vol LD A,(HL) SRL E JR C,Xm_vo0 OR (IY+13) ;Xm_vol
Xm_vo0 EXA
LD A,D RLCA JR C,Xs_n5 LD A,(IY+14) ;Xs_Nsl ADD A,E BIT 5,D JR Z,Xs_n6 LD (IY+14),A
Xs_n6 LD HX,A
JR Xs_n7
Xs_n5 LD A,E
AND 31 CP 16 JR C,Xs_Esl OR #F0
Xs_Esl ADD A,(IY+15) ;Xs_Esl
BIT 5,D JR Z,Xs_n9 LD (IY+15),A
Xs_n9 EXX
ADD A,C LD C,A EXX
Xs_n7 LD A,D
AND %10010000
Ch_Roll LD B,0 MixLoop RRCA
DJNZ MixLoop OR LX LD LX,A POP BC ;smp_frq_dsp LD L,(IY+16) ;накопитель dsp LD H,(IY+17) ADD HL,BC BIT 6,D JR Z,Xs_n10 LD (IY+16),L ;новое значение LD (IY+17),H ;накопителя dsp
Xs_n10 EX DE,HL Xo_adr LD SP,0 ;ornament
POP BC ;loop C=beg B=end LD A,(IY+19) ;Xo_dsp LD L,A INC A CP B JR C,Xo_n0 LD A,C
Xo_n0 LD (IY+19),A
LD H,0 ADD HL,SP LD A,(IY+26) ;Xs_note ADD A,(HL) ;dsp_orn (ORNAMENTS ON/OFF) ADD A,A JR NC,Xo_n1 ;; XOR A ;;
Xo_n1 LD L,95*2 ;;
CP L ;; JR NC,Xo_n2 ;; LD L,A ;;
Xo_n2 LD H,'tab_frq
LD SP,HL POP HL ;частота ноты+ ADD HL,DE ;+накопитель сэмпла (смещение)+ LD C,(IY+20) LD B,(IY+21) ADD HL,BC ;+накопитель SLIDE TONE/PORT
FrqR_A LD (frq_A),HL
LD A,(IY+22) ;Xsl_stp DEC A JP M,Xsl_s0 ;If Xsl_stp=0 then SLIDE OFF JR NZ,Xsl_s1 LD E,(IY+23) ;Xsl_tfr-приращение накопителя LD D,(IY+24) ;SLIDE TONE/PORT при его изме- ADD HL,DE ;нении. EX DE,HL ADD HL,BC LD (IY+20),L ;новое значение измененного LD (IY+21),H ;накопителя SLIDE TONE/PORT JR Xsl_sts ;переключатель PORT ON/OFF!
Xsl_plk EQU $
LD A,(IY+25) ;нота, к которой стремится LD L,A ;команда PORT. ADD HL,HL LD H,'tab_frq LD SP,HL POP HL CP (IY+26) ;последняя встреченая нота, в HL JR NC,Xsl_n0 ;вычесленная по ней частота. EX DE,HL
Xsl_n0 SBC HL,DE
JR C,Xsl_sts LD (IY+26),A ;частоты нот совпали и теперь: XOR A ;- Xs_note=Xsl_not LD (IY+20),A ;- Xsl_dsp=0 LD (IY+21),A JR Xsl_s1
Xsl_sts LD A,(IY+27) Xsl_s1 LD (IY+22),A Xsl_s0 EXA Xvb_n0 EQU $ VolR_A LD (vol_A),A
LD A,(IY+28) DEC A JP M,Quit_S JR NZ,Xvb_n1 DEC A ;A=#FF XOR (IY+10) ;A XOR Xvb_lok LD (IY+10),A LD A,(IY+29) JR NZ,Xvb_n1 LD A,(IY+30)
Xvb_n1 LD (IY+28),A Quit_S LD SP,0
RET
- ------ Get Position + Next Pattern ------
Get_Pos DEC (IY-01) ;X_qty
RET NZ LD E,(IY-04) ;adr_chan LD D,(IY-03) LD A,(DE) AND A JR NZ,Cont_0 LD (N_frq+1),A LD D,A LD (Sv_SP0+1),SP
Psa_beg LD HL,module+201
LD A,(HL) INC A JR NZ,Cont_1
Psa_lop LD HL,module+201 Cont_1 LD E,(HL)
INC HL LD (Psa_beg+1),HL
Psa_chn LD HL,0
ADD HL,DE ADD HL,DE LD SP,HL
ia_pos0 LD BC,(Compile+1)
POP HL ADD HL,BC EX DE,HL ;DE=adr_chn_A POP HL ADD HL,BC ;HL=adr_chn_B LD (Bch_adr),HL POP HL ADD HL,BC ;HL=adr_chn_C LD (Cch_adr),HL
Sv_SP0 LD SP,0 Cont_0 CALL Xn_clc1
LD (IY-04),E LD (IY-03),D LD A,(IY-02) ;Xi_qty LD (IY-01),A ;X_qty RET
- ------ Дешифрация позиции по одному каналу ------
Xni_not LD (IY+26),A ;Xs_note
XOR A LD (IY+10),A ;Xvb_lok LD (IY+18),A ;Xs_dsp LD (IY+11),#10 ;Xs_Vsl LD (IY+14),A ;Xs_Nsl LD (IY+15),A ;Xs_Esl LD (IY+16),A ;Xs_dtn low LD (IY+17),A ;Xs_dtn High LD (IY+19),A ;Xo_dsp LD (IY+20),A ;Xsl_dsp low LD (IY+21),A ;Xsl_dsp High LD (IY+22),A ;Xsl_stp LD (IY+28),A ;Xvb_stp RET
Xni_vol JR NZ,Xni_v0
LD (IY+28),A ;Xvb_stp=#00 DEC A LD (IY+10),A ;Xvb_lok=#FF RET
Xni_v0 ADD A,A
ADD A,A ADD A,A ADD A,A LD (IY+12),A ;Xg_vol=A*16 JR Xn_clc2
Xni_s_o CALL ornPP
LD (IY+06),L ;Xo_adr=HL LD (IY+07),H
Xni_vse CALL NZ,EiPP Xni_sm0 LD (IY+13),A ;Xm_vol
XOR A LD (IY+19),A ;Xo_dsp=0 LD A,(DE) INC DE JR Xnism0U
Xni_smp RET Z
ADD A,A
Xnism0U CALL smpPP
LD (IY+04),L ;Xs_adr LD (IY+05),H
Xn_clc1 LD BC,#1020 Xn_clc2 LD A,(DE)
INC DE ADD A,B JR C,Xni_s_o ADD A,C JR C,Xni_smp ADD A,B JR C,Xni_vol ADD A,B JR C,Xni_vqe ADD A,96 JR C,Xni_not ADD A,B JR C,Xni_orn ADD A,C JR C,Xni_noi ADD A,B JR C,Xni_vse ADD A,B LD HL,X_eff-2 ADD A,A ADD A,L LD L,A LD C,(HL) INC L LD B,(HL) PUSH BC LD A,(IY+26) ;Xs_note EXA JR Xn_clc1
Xni_noi LD (N_frq+1),A ;GLOBALnoise
JR Xn_clc2
Xni_vqe JR Z,Xni_v1
DEC A JR NZ,Xni_e0 LD A,(DE) LD (IY-02),A ;Xi_qty INC DE JR Xn_clc2
Xni_e0 CALL EiPP Xni_v1 LD (IY+13),A ;Xm_vol
JR Xn_clc2
Xni_orn CALL ornPP
LD (IY+06),L ;Xo_adr=HL LD (IY+07),H LD (IY+19),A ;Xo_dsp=0 JR Xn_clc1
- ------ Special Effects COM.XXXX ------
Off_PRT EQU Xsl_sts-Xsl_plk Xef_slT LD A,(DE)
INC DE LD (IY+22),A ;Xsl_stp LD (IY+27),A ;Xsl_sts LD A,(DE) INC DE LD (IY+23),A ;Xsl_tfr (LOW) LD A,(DE) INC DE LD (IY+24),A ;Xsl_tfr (HIGH) LD (IY+28),0 ;Xvb_stp LD (IY+09),Off_PRT ;Xsl_plk=PORT_OFF RET
Xef_nsT CALL Xef_slT
LD A,(DE) INC DE LD (IY+23),A ;Xsl_tfr (LOW) LD A,(DE) INC DE LD (IY+24),A ;Xsl_tfr (HIGH) LD (IY+09),0 ;Xsl_plk=PORT_ON LD A,(IY+26) ;Xs_note LD (IY+25),A ;Xsl_not EXA LD (IY+26),A RET
Xef_dSm LD A,(DE)
INC DE LD (IY+18),A ;Xs_dsp RET
Xef_dOr LD A,(DE)
INC DE LD (IY+19),A ;Xo_dsp RET
Xef_vib LD A,(DE)
INC DE LD (IY+28),A LD (IY+30),A LD A,(DE) INC DE LD (IY+29),A LD (IY+22),0 ;Xsl_stp отключение SLIDE RET
eff_tmp LD A,(DE)
INC DE LD (temp+1),A RET
- ------ Frequency Tables for Generate ------
Tb_PT DW #0C22*2,#0B72*2,#0ACF*2,#0A33*2
DW #09A1*2,#0917*2,#0894*2,#0819*2 DW #07A4*2,#0737*2,#06CF*2,#066D*2
Tb_ST DW #0EF8*2,#0E10*2,#0D60*2,#0C80*2
DW #0BD8*2,#0B28*2,#0A88*2,#09F0*2 DW #0960*2,#08E0*2,#0858*2,#07E0*2
Tb_REAL DW #0CDA*2,#0C22*2,#0B72*2,#0ACF*2
DW #0A33*2,#09A1*2,#0917*2,#0894*2 DW #0819*2,#07A4*2,#0737*2,#06CF*2
Tb_ASM DW #0D10*2,#0C55*2,#0BA4*2,#0AFC*2
DW #0A5F*2,#09CA*2,#093D*2,#08B8*2 DW #083B*2,#07C5*2,#0755*2,#06EC*2
- ------ Конец плеера-начало модуля ------
module DISPLAY "Module Adress:",module
DISPLAY "Player Lenght:",module-Compile
- ------ пример использования -------
INCBIN "ace.m" ORG #7000 DI CALL Compile
play_l EI
HALT CALL Compile+5 LD A,#7F IN A,(-2) RRA JR C,play_l JP Compile+8 ADD A,B JR C,Xni_orn ADD A,C