📄 lsppc.asm
字号:
LSPPC_DEBUG .SET 0
.IF LSPPC_DEBUG
.version 50
.mmregs
.MLIB "MAC.LIB"
.BSS ACCBUF,2
.BSS ACC_PUSH,2
.BSS SIGNFLAG,1
;-----------------lsppc
LSPPC_A .USECT "ONCHIP1",6*2
LSPPC_A1 .USECT "ONCHIP1",6*2
LSPPC_A2 .USECT "ONCHIP1",6*2
LSPPC_B .USECT "ONCHIP1",6*2
LSPPC_B1 .USECT "ONCHIP1",6*2
LSPPC_B2 .USECT "ONCHIP1",6*2
LSPPC_P .USECT "ONCHIP1",5
LSPPC_Q .USECT "ONCHIP1",5
.DATA
LSP .INT 2f0h,952h,1099h,12b8h,17b5h,2000h,2ac2h,2ccdh,3000h,3333h
TLPC .INT 0e108h,0ee4h,0ea65h,02749h,0d7e9h,0f70h,0f1e5h,0fefh,0f25bh,07e2H
LPC0 .INT 2000H
LPC .INT 0,0,0,0,0,0,0,0,0,0
COSCOR .INT 0e216H,2078H,0fd54H,1eH,0ffffH
;------------
.TEXT
CALL C50_INIT
LDP #ACCBUF
SPLK #LSP,ADDR_LSP
CALL LSPPC
HERE B $
.ENDIF
;---------
.BSS XF,1 ;lsppc
.BSS XX,1
.BSS ADDR_LSP,1
;-----------
;=======================================================
LSPPC
LACL #2
SAMM INDX
;===================================================
; for (i = 0; i < noh + 1; i++)
; { a[i] = 0.; a1[i] = 0.; a2[i] = 0.;
; b[i] = 0.; b1[i] = 0.; b2[i] = 0.; } //LONG
;===================================================
MAR *,AR0
LAR AR0,#LSPPC_A
RPTZ #11
SACL *+
LAR AR0,#LSPPC_A1
RPT #11
SACL *+
LAR AR0,#LSPPC_A2
RPT #11
SACL *+
LAR AR0,#LSPPC_B
RPT #11
SACL *+
LAR AR0,#LSPPC_B1
RPT #11
SACL *+
LAR AR0,#LSPPC_B2
RPT #11
SACL *+
;===================================================
; for (i = 0; i < noh; i++)
; { acc=(long)freq[2*i]*4l;
; p[i]=-wcos(acc); //2.14
; acc=(long)freq[2*i+1]*4l;
; q[i]=-wcos(acc); }
;===============ARP=0====================================
;LAR AR0,#LSP
LACC ADDR_LSP
SAMM AR0
LAR AR1,#LSPPC_P
LAR AR2,#LSPPC_Q
LAR AR7,#HP10_1
LSPPC_PQ
LACC *+,2,AR1
CALL WCOS
MAR *,AR1
NEG
SACL *+,0,AR0
LACC *+,2,AR2
CALL WCOS
MAR *,AR2
NEG
SACL *+,0,AR7
BANZ LSPPC_PQ,*-,AR0
;===================================================
; xf = 0.0;
; for (k = 0; k < no + 1; k++)
; { xx = 0.0;
; if (k == 0) xx = 0x7fff; //1.0; 4.12
; a[0] = xx + xf; b[0] = xx - xf;
; xf = xx;
;===================================================
LAR AR0,#LPC-1
LACL #0
SACL XF
LAR AR7,#P10
LSPPC_K
LACL #0
SACL XX
LAR AR3,#LSPPC_B
LAMM AR7
SUB #P10
BCND LSPPC_NOTK0,NEQ
LACC #7FFFH
SACL XX
LSPPC_NOTK0
MAR *,AR3
LACC XX
SUB XF
SACL *+ ;B[0]
SACH *-
LAR AR3,#LSPPC_A
LACC XX
ADD XF
SACL *+
SACH *-
LACC XX
SACL XF
;===================================================
; for (i = 0; i < noh; i++)
; { acc=a1[i]; j=0;
; while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
; acc=acc*p[i]; acc=acc>>(14-j);
; a[i + 1] = a[i] + acc+ a2[i];
; a2[i] = a1[i]; a1[i] = a[i];}
;===================================================
LAR AR1,#LSPPC_P
LAR AR4,#LSPPC_A1
LAR AR5,#LSPPC_A2
LACC #HP10_1
SAMM BRCR
MAR *,AR4
RPTB LSPPC_IA-1
MAR *+
LACC *-,16
OR *,AR6
LAR AR6,#-2
RPT #15
NORM *+
SACH ACCBUF
NOP
NOP
MAR *,AR1
LT *+,AR3
MPY ACCBUF
LAMM AR6
SAMM TREG1
PAC
SATL
SACB
;---------
; a[i + 1] = a[i] + acc+ a2[i];
MAR *+
LACC *-,16
OR *0+,AR5
ADDB
SACB
MAR *+
LACC *-,16
OR *,AR3
ADDB
SACL *+
SACH *0-,0,AR4 ;->A[I]H
; **** a2[i] = a1[i];
MAR *+
LACC *-,16
OR *,AR5
SACL *+
SACH *+,0,AR3
; a1[i] = a[i];} ->A[I]H
LACC *-,16
OR *0+,AR4
SACL *+
SACH *+
LSPPC_IA
;===================================================
; for (i = 0; i < noh; i++)
; { acc=b1[i]; j=0;
; while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
; acc=acc*q[i]; acc=acc>>(14-j);
; b[i + 1] = b[i] + acc+ b2[i];
; b2[i] = b1[i]; b1[i] = b[i]; }
;===================================================
LAR AR3,#LSPPC_B
LAR AR1,#LSPPC_Q
LAR AR4,#LSPPC_B1
LAR AR5,#LSPPC_B2
LACC #HP10_1
SAMM BRCR
MAR *,AR4
RPTB LSPPC_IB-1
MAR *+
LACC *-,16
OR *,AR6
LAR AR6,#-2
RPT #15
NORM *+
SACH ACCBUF
NOP
NOP
MAR *,AR1
LT *+,AR3
MPY ACCBUF
LAMM AR6
SAMM TREG1
PAC
SATL
SACB
;---------
; b[i + 1] = b[i] + acc+ b2[i];
MAR *+
LACC *-,16
OR *0+,AR5
ADDB
SACB
MAR *+
LACC *-,16
OR *,AR3
ADDB
SACL *+
SACH *0-,0,AR4 ;->A[I]H
; **** b2[i] = b1[i];
MAR *+
LACC *-,16
OR *,AR5
SACL *+
SACH *+,0,AR3
; b1[i] = b[i];} ->A[I]H
LACC *-,16
OR *0+,AR4
SACL *+
SACH *+
LSPPC_IB
;===================================================
; acc=(int)(a[noh] + b[noh])>>3;
; if (k != 0) pc[k] = acc;
;===================================================
LAR AR3,#LSPPC_A+11
LAR AR4,#LSPPC_B+11
MAR *,AR3
LACC *-,16
OR *,AR4
SACB
LACC *-,16
OR *,AR0
ADDB
BSAR 3
;RPT #2
; SFR
SACL *+,0,AR7
BANZ LSPPC_K,*-,AR3
;===================================================
; pc[0] = 1.0*0x2000;
;===================================================
MAR *,AR0
LACC #2000H
LAR AR0,#LPC0
SACL *
;===================================================
RET
;===================================================
.IF LSPPC_DEBUG
.INCLUDE "C50_INIT.ASM"
.INCLUDE "WCOS.ASM"
.INCLUDE "WCOS1.ASM"
.INCLUDE "SET_CON.ASM"
.ENDIF
;================================================
;lsptopc(float *f, float *pc)
;{ noh = no / 2;
; for (j = 0; j < no; j++) freq[j] = f[j];
; for (i = 0; i < noh + 1; i++)
; { a[i] = 0.; a1[i] = 0.; a2[i] = 0.;
; b[i] = 0.; b1[i] = 0.; b2[i] = 0.; }
; for (i = 0; i < noh; i++)
; { acc=(long)freq[2*i]*4l; p[i]=-wcos(acc); //2.14
; acc=(long)freq[2*i+1]*4l; q[i]=-wcos(acc); //2.14
; }
; xf = 0.0;
; for (k = 0; k < no + 1; k++)
; { xx = 0.0;
; if (k == 0) xx = 0x7fff; //1.0; 4.12
; a[0] = xx + xf;
; b[0] = xx - xf;
; xf = xx;
; for (i = 0; i < noh; i++)
; { //a[i + 1] = a[i] + p[i] * a1[i] + a2[i]; //p:2.14 a:3.13
; acc=a1[i];
; j=0;
; while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
; acc=acc*p[i]; //2.14*3.13->4.12
; acc=acc>>(14-j);
; a[i + 1] = a[i] + acc+ a2[i];
; //a[i + 1] = a[i] + ((float)p[i]/0x4000) * a1[i] + a2[i];
; //--------------
; acc=b1[i];
; j=0;
; while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++; }
; acc=acc*q[i]; //2.14*3.13->4.12
; acc=acc>>(14-j);
; b[i + 1] = b[i] + acc+ b2[i];
; //b[i + 1] = b[i] + ((float)q[i]/0x4000) * b1[i] + b2[i];
; //---------------
; a2[i] = a1[i]; a1[i] = a[i];
; b2[i] = b1[i]; b1[i] = b[i];
; }
; acc=a[noh] + b[noh]; acc>>=(1+2);
; if (k != 0) pc[k] = acc;
; //if( k!=0) pc[k]=.5*(a[noh] + b[noh]);
; if(pc[k]>=4.0*0x2000) printf("pc=%f at lsptopc at frame %d.\n",frame);
; } }
;===============
; noh = no / 2;
; for (j = 0; j < no; j++) freq[j] = f[j];
; for (i = 0; i < noh + 1; i++)
; { a[i] = 0.; a1[i] = 0.; a2[i] = 0.; b[i] = 0.;
; b1[i] = 0.; b2[i] = 0.; }
; for (i = 0; i < noh; i++)
; { p[i] = -2. * cos(2. * pi * freq[2 * i]);
; q[i] = -2. * cos(2. * pi * freq[2 * i + 1]); }
; xf = 0.0;
; for (k = 0; k < no + 1; k++)
; { xx = 0.0;
; if (k == 0) xx = 1.0;
; a[0] = xx + xf; b[0] = xx - xf;
; xf = xx;
; for (i = 0; i < noh; i++)
; { a[i + 1] = a[i] + p[i] * a1[i] + a2[i];
; b[i + 1] = b[i] + q[i] * b1[i] + b2[i];
; a2[i] = a1[i]; a1[i] = a[i];
; b2[i] = b1[i]; b1[i] = b[i];
; }
; if (k != 0) pc[k - 1] = -.5 * (a[noh] + b[noh]);
; }
; for (i = no - 1; i >= 0; i--) pc[i + 1] = -pc[i];
; pc[0] = 1.0;
;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -