📄 pclsp.asm
字号:
; .version 50
; .mmregs
; .GLOBAL STATUS,ACCBUF,SINCOR,SIGNFLAG,HP10,LSPFLAG,LSP,FL,FR,FM,PXR
; .BSS STATUS,2
; .BSS ACCBUF,2
; .BSS ACCBBUF,2
; .BSS SIGNFLAG,1
; .bss LSPFLAG,1
; .BSS LSPPQ,5
; .BSS LSP,11
; .BSS FL,1
; .BSS FR,1
; .BSS FM,1
; .GLOBAL PXL,TFR,TPXR,PXM,IBUF,MINPQ,LSPEPS
; .BSS PXR,1
; .BSS PXL,1
; .BSS TFR,1
; .BSS TPXR,1
; .BSS PXM,1
; .BSS IBUF,1
; .BSS MINPQ,2
; .BSS QXL,1
; .BSS QXR,1
; .BSS QXM,1
; .BSS TQXR,1
;P10 .SET 10
;P10_1 .SET P10-1
;P10P .SET P10+1
;HP10 .SET P10/2
;HP10_1 .SET HP10-1
;N128 .SET 128
;NBP .SET 10
;NBQ .SET 10
;LSPEPS .SET 1
; .data
;LSPJC .INT 11,9,7,5,3,1
;COSCOR .INT 0e216H,2078H,0fd54H,1eH,0ffffH
;LPC0 .INT 02000h
;LPC .INT 0ef06h,0f496h,0f84ch,0604h,0fefeh
; .INT 0166h,0f7c6h,0f420h,0fdf5h,013e3h
; ;38h,38dh,f9ah,107bh,1ea7h,209bh,2aceh,2dd1h,33cfh,3908h
; ;.int 0fc89h, 0fc59h, 0dbb8h, 0f8ddh, 0aeh
; ;.int 0181fh, 0566h, 0585h, 0f3aeh, 02cbh
; ;389H,534H,c8bH,1acfH, 2096H,23eaH, 2980H,2b87H, 3352H,3692H
;=================================
;LSPCOS .COPY "LSPCOS.DAT" ;cos(i* pi * 0.5*(11.0-2*j)/N) *0x8000u
;----------
.BSS FL,1
.BSS FR,1
.BSS FM,1
.BSS TFR,1
;-----------
.BSS PXR,1
.BSS PXM,1
.BSS PXL,1
.BSS TPXR,1
;------------
.BSS QXL,1
.BSS QXR,1
.BSS QXM,1
.BSS TQXR,1
;=================================
PCLSP
.COPY LSPP.ASM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCLSP_GETQ0
;=============================
;for (i = 0; i < mh; i++)
; { q[i] = a[i+1] - a[m-i];
; if(fabs(q[i]>0x7fff))
; { for (j = 0; j < m; j++) freq[j] = lastfreq[j];
; return; } }
;==================================
LACC #LSP+10
SAMM ARCR
LAR AR1,#LSPPQ
LAR AR3,#LPC
LAR AR6,#LPC+P10_1
MAR *,AR3
LACC #HP10_1
SAMM BRCR
LACL #0
SACL CORFLAG
RPTB PCLSP_Q_Q-1
LACC *+,0,AR6
SUB *-,0,AR1
;PUSH
SACL ACC_PUSH
ABS
SUB #7FFFH
NOP
XC 2,GT
LACL #1
SACL CORFLAG
;POP
LACC ACC_PUSH
SACL *+,0,AR3
PCLSP_Q_Q
LACC CORFLAG
BCND PCLSP_END1,GT ;if >0x7fff last lsp used.
;============================================
; freq[m] = 0.5*0x8000u;
; fl = freq[0];
; p32=wsin(mp*2*fl)>>2;
;============================================
LACC #4000H
SACL LSP+10
;-----------
LAR AR0,#LSP
MAR *,AR0
LACC *0+
SACL FL
;------------
LACC #P10P
SAMM TREG0
SUB #2
SAMM AR5
MPY FL
PAC
SFL
CALL WSIN
SFR ;1.15->>3.13
SFR
SACB
;===================================
; for (j = 0; j < mh; j++)
; { jc = mp - (j+1) * 2;
; ax0=wsin(jc*2*fl);
; p32 += (long)(ax0 * q[j])>>15; }
;=================================
LAR AR4,#HP10_1
LAR AR1,#LSPPQ
MAR *,AR1
;----------
PCLSP_Q_QXL_0
LAMM AR5
SAMM TREG0
SUB #2
SAMM AR5
MPY FL
PAC
SFL
;-------
EXAR
SACL ACCBBUF
SACH ACCBBUF+1
EXAR
CALL WSIN
EXAR
LACC ACCBBUF+1,16
OR ACCBBUF
EXAR
;---------
MAR *,AR1
SAMM TREG0
MPY *+,AR4
PAC
SATL
ADDB
SACB
BANZ PCLSP_Q_QXL_0,*-
;=================================
; if(fabs(p32)>0x7fff) p32>>=2;
; qxl=p32;
; tqxl=qxl;
;=================================
CALL INTACC
SACH QXL
;SACH TQXL
;=============AR0=freq[2]====================
; for (i = 2; i < mp; qxl = tqxr, fl = tfr, i += 2)
; { fr = freq[i];
; tfr=fr;
; p32=wsin(mp*2*fr)>>2;
;=================================
;MAR *,AR0
PCLSP_Q_FOR
MAR *,AR0
LACC *- ;AR0>>LSP[1]
SACL FR
SACL TFR
LACC #P10P
SAMM TREG0
SUB #2
SAMM AR5
MPY FR
PAC
SFL
CALL WSIN
SFR ;1.15->>3.13
SFR
SACB
;=================================
; for (j = 0; j < mh; j++)
; { jc = mp - (j+1) * 2;
; ax0=wsin(jc*2*fr);
; p32 += (long)(ax0 * q[j])>>15; }
;=================================
LAR AR4,#HP10_1
LAR AR1,#LSPPQ
MAR *,AR1
;----------
PCLSP_Q_QXR
LAMM AR5
SAMM TREG0
SUB #2
SAMM AR5
MPY FR
PAC
SFL
;-------
EXAR
SACL ACCBBUF
SACH ACCBBUF+1
EXAR
CALL WSIN
EXAR
LACC ACCBBUF+1,16
OR ACCBBUF
EXAR
;---------
MAR *,AR1
SAMM TREG0
MPY *+,AR4
PAC
SATL
ADDB
SACB
BANZ PCLSP_Q_QXR,*-
;=================================
; if(fabs(p32)>0x7fff) p32>>=2;
; qxr=p32;
; tqxr = qxr;
;=================================
CALL INTACC
SACH QXR
SACH TQXR
;===============================
; if(fabs(qxl)<fabs(qxr) ){minpxm[0]=qxl; minpxm[1]=fl;}
; else {minpxm[0]=qxr; minpxm[1]=fr;}
;===============================
LACC QXL
ABS
SACB
LACC QXR
ABS
CRLT
SACL MINPQ
BCND PCLSP_Q_MIN_1,C ;jump if fabs(qxr)<fabs(qxl)
LACC FL
B PCLSP_Q_MIN_2
PCLSP_Q_MIN_1
LACC FR
PCLSP_Q_MIN_2
SACL MINPQ+1
;===================================
; if(qxl*qxr>=0){printf("qxl*qxr>0 at frame %d last lsps used.\n",frame);
; for (j = 0; j < m; j++) freq[j] = lastfreq[j];
; for(i=0;i<=10;i++) a[i]=a[i]/0x2000;
; return;}
;===================================
LT QXL
MPY QXR
PAC
BCND PCLSP_END1,GEQ
;=================================
; mb=0;
; do{ mb++;
; fm = fl+fr;
;=================================
LAR AR6,#NBQ-1
PCLSP_Q_DO
LACC FL
ADD FR
SACL FM
;=================================
; p32=wsin(mp*fm)>>2;
;=================================
LACC #P10P
SAMM TREG0
SUB #2
SAMM AR5
MPY FM
PAC
CALL WSIN
SFR ;1.15->>3.13
SFR
SACB
;=================================
; for (j = 0; j < mh; j++)
; {jc = mp - (j+1) * 2;
; ax0=wsin(jc*fm);
; p32 += (long)(ax0 * q[j])>>15; }
;=================================
LAR AR4,#HP10_1
LAR AR1,#LSPPQ
MAR *,AR1
;----------
PCLSP_Q_QXM
LAMM AR5
SAMM TREG0
SUB #2
SAMM AR5
MPY FM
PAC
;-------
EXAR
SACL ACCBBUF
SACH ACCBBUF+1
EXAR
CALL WSIN
EXAR
LACC ACCBBUF+1,16
OR ACCBBUF
EXAR
;---------
MAR *,AR1
SAMM TREG0
MPY *+,AR4
PAC
SATL
ADDB
SACB
BANZ PCLSP_Q_QXM,*-
;----------
; fm/=2;
;-----------
LACC FM ;FM/=2
SFR
SACL FM
;=======================
; if(fabs(p32)>0x7fff) p32>>=2;
; qxm=p32;
;=========================
LACB
CALL INTACC
SACH QXM
;======================
; if(fabs(qxm)<fabs(minpxm[0])) {minpxm[0]=qxm; minpxm[1]=fm;}
;=======================
LACC QXM
ABS
SACB
LACC MINPQ
ABS
CRLT
BCND PCLSP_Q_MINQXM, C ;jump if fabs(qxm)>fabs(minpq)
SACL MINPQ ;if minpq>=qxm
LACC FM
SACL MINPQ+1
PCLSP_Q_MINQXM
;===========================
; (qxm*qxl > 0.0) ? (qxl = qxm, fl = fm) : (qxr = qxm, fr = fm);
;==========================-
LACC FM,16
OR QXM
SACB
SAMM TREG0
MPY QXL
PAC
BCND PCLSP_Q_LMR_1,GT
LACB
SACL QXR
SACH FR
B PCLSP_Q_LMR_2
PCLSP_Q_LMR_1
LACB
SACL QXL
SACH FL
PCLSP_Q_LMR_2
;-----------------------------------------------
; } while ((fabs(minpxm[0]) > LSPEPS) && (mb < NBQ));
;===============================================
LACC MINPQ
SUB #LSPEPS
BCND PCLSP_Q_GETQ,LEQ
MAR *,AR6
BANZ PCLSP_Q_DO,*-
;===========================================
; freq[i-1]=minpxm[1];
; }// for (i = 2; i < mp; qxl = tqxr, fl = tfr, i += 2)
;===========================================
PCLSP_Q_GETQ
MAR *,AR0
LACC MINPQ+1
SACL *+ ;INDX=2
MAR *0+ ;AR0 : LSP[1]==>LSP[4]
CMPR 2 ;test if ar0>arcr=#LSP+10
BCND PCLSP_GOOD_END,TC
LACC TQXR
SACL QXL
LACC TFR
SACL FL
B PCLSP_Q_FOR,*,AR0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCLSP_END1
LACC #1
SACL LSPFLAG
LACC #LSP
SAMM BMAR
LAR AR0,#LASTLSP
MAR *,AR0
RPT #P10_1
BLDD *+,BMAR
PCLSP_GOOD_END
;==================================================
; for (i = 0; i < m; i++) lastfreq[i] = freq[i];
;==================================================
MAR *,AR0
LACC #LSP
SAMM BMAR
LAR AR0,#LASTLSP
RPT #P10_1
BLDD BMAR,*+
RET
;=================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -