📄 cgain.asm
字号:
CGAIN_DEBUG .SET 0
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.IF CGAIN_DEBUG
.version 50
.mmregs
.MLIB "MAC.LIB"
.DATA
CODEBOOK .COPY "CODEBOOK.DAT"
E0 .int 0bh,0fff0h,0dbh,08dh,0dh,0ff85h,0ff3dh,021h,0ffd4h,0ffcbh
.int 0b3h,039h,0ffedh,01h,0fffah,0fff7h,0fff1h,0ff95h,0fff1h,096h
.int 0ffdeh,0ff7bh,0ffe4h,052h,086h,061h,0c3h,06bh,0ffaeh,01ah
.int 0ffc9h,0ff57h,0ffb8h,087h,0d0h,0ff77h,0ffefh,016h,09h,058h
.int 0fffdh,0ffb8h,0fffdh,06h,05fh,092h,0ff79h,0ff7dh,096h,018h
.int 0fff7h,0ff96h,0fe43h,0ff6ch,0fffeh,0ff1dh,0ffbah,0ffa2h,0ff14h,03dh
T .SPACE 16*400H
IMP_H .int 02000h,013f7h,0fe01h,06fdh,06b6h,0280h,01efh,0261h,01ebh,0ff25h,01ch,0d7h,0ff91h,0ffd2h,0eh,0ffe5h,0ffd4h,0ffe1h,0ah,0ffech
.int 0ffe9h,04h,0fffah,0fff8h,00h,00h,00h,0fffeh,00h,00h,0ffffh,00h,00h,00h,00h,00h,00h,00h,00h,00h
.int 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
.TEXT
CALL C50_INIT
LDP #ACCBUF
LACL #1
SACL PG_FIRST
LACC #CODEBOOK+1022
SACL CG_BOOK
LAR AR3,#CG_MATCH
LAR AR4,#CG_GAIN
LACC #30
SACL PG_LEN
SACL CG_Y60
SACL CG_Y59
;------
LAR AR0,#PG_X_E0+59
LACC #E0
SAMM BMAR
MAR *,AR0
RPT #59
BLDD BMAR,*-
;====================
LACL #0
SACL PG_SHIFT
SACL TOPBP_PG
sacl TOPCBINDEX
SLAC PG_EMAX
;====================
LOOP_CG
CALL CGAIN
LACC CG_BOOK
SUB #2
SACL CG_BOOK
SUB #CODEBOOK
BCND LOOP_CG,C
HERE: B HERE
.BSS ACCBUF,2
.BSS SIGNFLAG,1
.BSS PG_EMAX,2
.BSS NEW_PGAIN,1
.BSS PG_COR,2
.BSS PG_ENG,2
.BSS PG_FIRST,1
.BSS PG_LEN,1
.BSS PG_LEN_1,1
.BSS PG_RPTC,1
.BSS PG_SHIFT,1
.BSS TOPBP_PG,1
.BSS TOPPGAIN,1
;-------------
CG_MATCH .USECT "ONCHIP1",512*2
CG_GAIN .USECT "ONCHIP1",512
PG_X_E0 .USECT "ONCHIP1",60 ;DON'T BE IN SAME BLOCK WITH E0
CG_Y_1 .USECT "DRAM",1
CG_Y .USECT "DRAM",60
;--------------
.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;-----------------------------------
;ACCBUF*2, SIGNFLAG ,PG_FIRST,PG_COR*2,PG_ENG*2,CG_Y59,CG_Y60,CG_BOOK
;CALL MPY16_32, CG_DIV
;AR3->MATCH[512*2], AR4->CG_GAIN[512]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: CG_MATCH[512*2], CG_GAIN[512], CG_Y[60], IMP_H[60], E0[60]
; CODEBOOK[1082]
;NOTE: H[0]=0X2000!! DMOV CG_Y, |COR/ENG|<0X7FFF
;H: 3.13,
;CG_Y: 5.11
;COR: 27.5
;ENG: 16.16
;=================================
.BSS CG_EX,1
.BSS CG_EX0,1
.BSS CG_EX1,1
.BSS CG_BOOK,1
.BSS CG_Y59,1
.BSS CG_Y60,1
.bss TOPCGAIN,1
.BSS TOPCBINDEX,1
;.BSS CBINDEX,1
;============================
CGAIN
LACC PG_LEN
SUB #1
SACL PG_LEN_1
LACC PG_FIRST
BCND CG__FIRST,NEQ
;==========================================
; else
; { for(i=l-1;i>=len-1;i--) y[i]=y[i-1];
;==========================================
LACL #60
SUB PG_LEN
SACL PG_RPTC
LAR AR0,#CG_Y+58
MAR *,AR0
RPT PG_RPTC
DMOV *-
;==========================================
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
;==========================================
LACL #2 ;AR0:Y[LEN-3]
SAMM INDX
LACC #IMP_H-2
ADD PG_LEN
SAMM AR2 ;AR2:IMP_H[LEN-2]
;---
LACC CG_BOOK
SAMM AR1 ;ARP==0,PIPELINE
;---
LACC PG_LEN
SUB #3
SAMM BRCR
;--
MAR *,AR1
MAR *+
LACC *-,7
SACL CG_EX1
LACC *,7
BCNDD CG_EX_NEQ,NEQ
SACL CG_EX0
SAMM TREG0 ;TREG0= EX[0]<<7
;-------
LACC CG_EX1 ;AR0: Y[LEN-3]
BCNDD CG_EX_0NEQ,NEQ
SAMM TREG0 ;TREG0=EX[1]<<7
MAR *,AR0
;----ex[0]=ex[1]=0-----
LAMM BRCR
SACL PG_RPTC
RPT PG_RPTC
DMOV *- ;->AR0: Y[-1]
LACL #0 ;y[0]=((long)ex[0]*h1[1] + (long)ex[1] * h1[0])>>2;
BD CG_EX_OVER
SACL *+
SACL * ;Y[-1]=ex[0]* h[0]= CG_Y_1=0
CG_EX_0NEQ
;---ex[0]=0, ex[1]=-1/1 TREG0=EX[1] AR0:Y[LEN-3],AR2: H[LEN-2] ARP==0
;--------------------------------------
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i])>>2);
;================================================
MAR *,AR2
MPY *-,AR0 ;TREG0=EX1<<7
RPTB CG_EX_0NEQ_FOR-1
LACC *+,9,AR2
MPYA *-,AR0
SACH *0-,7 ;INDX=2
CG_EX_0NEQ_FOR ;AR0:Y[-1], AR2:H[0]
LACL #0
SACL *+
BD CG_EX_OVER
LACC CG_EX1,11-7 ;H[0]=1->0X2000=H1[0]>>2
SACL *
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=EX[1]*H[0]
;y[-1]=ex[0]* h[0]= CG_Y_1=0
;==========================================
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[0]*h1[i+1])>>2);
;==========================================
CG_EX_NEQ ;AR1:EX[1], ARP=1,AR2:H[LEN-2] ,TREG0=EX[0], AR0:Y[LEN-3]
LACC CG_EX1
BCND CG_EX_NEQNEQ,NEQ
;--ex[0]=-1/1, ex[1]=0----
MAR *,AR2
MAR *+ ;AR2:H[LEN-1]
MPY *-,AR0
RPTB CG_EX_NEQ0_FOR-1
LACC *+,9,AR2
MPYA *-,AR0
SACH *0-,7 ;INDX=2
CG_EX_NEQ0_FOR ;AR0:Y[-1] ,AR2: H[0]
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=EX[0]*H[1]
;y[-1]=ex[0]* h[0]
LACC CG_EX0,11-7
SACL *+,0,AR2
MAR *+
MPY *,AR0
BD CG_EX_OVER
PAC
SACH *,7
;==========================================
CG_EX_NEQNEQ
;--------------------------------------
; AR1:EX[0],ARP=1,ACC=EX[1],AR0:Y[LEN-3],AR2:H[LEN-2],BRCR=LEN-3
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
;--------------------------------------
MAR *,AR0
BCND CG_EX_NEQGT,GT
LACC CG_EX0
BCND CG_EX_GTLT,GT
;---ex[0]=-1,ex[1]=-1
;-----------------------------------
; for(i=len-2;i>=1;i--) y[i]=y[i-1] - (h1[i] + h1[i+1])>>2;
;-----------------------------------
RPTB CG_EX_LTLT_FOR-1
LACC *+,9,AR2
SUB *+,7
SUB *0-,7,AR0
SACH *0-,7
CG_EX_LTLT_FOR ;AR0:Y[-1] ,AR2: H[0]
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=-H[1]-H[0]>>2
;y[-1]=ex[0]* h[0]=-H[0]>>2
LACC CG_EX0,13 ;EX<<7
SACH *+,7,AR2
MAR *+ ;AR2: H[1]
BD CG_EX_OVER
SUB *,7,AR0
SACH *,7
CG_EX_GTLT
;---ex[0]=1,ex[1]=-1
;-----------------------------------
; for(i=len-2;i>=1;i--) y[i]=y[i-1] - (h1[i] - h1[i+1])>>2;
;-----------------------------------
RPTB CG_EX_GTLT_FOR-1
LACC *+,9,AR2
SUB *+,7
ADD *0-,7,AR0
SACH *0-,7
CG_EX_GTLT_FOR ;AR0:Y[-1] ,AR2: H[0]
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=H[1]-H[0]>>2
;y[-1]=ex[0]* h[0]=H[0]>>2
LACC CG_EX0,13
SACH *+,7,AR2
NEG
MAR *+ ;AR2: H[1]
BD CG_EX_OVER
ADD *,7,AR0
SACH *,7
;==========================================
CG_EX_NEQGT
LACC CG_EX0
BCND CG_EX_GTGT,GT
;---ex[0]=-1,ex[1]=1
;-----------------------------------
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (h1[i] - h1[i+1])>>2;
;-----------------------------------
RPTB CG_EX_LTGT_FOR-1
LACC *+,9,AR2
ADD *+,7
SUB *0-,7,AR0
SACH *0-,7
CG_EX_LTGT_FOR ;AR0:Y[-1] ,AR2: H[0]
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=-H[1]+H[0]>>2
;y[-1]=ex[0]* h[0]=-H[0]>>2
LACC CG_EX0,13
SACH *+,7,AR2
NEG
MAR *+ ;AR2: H[1]
BD CG_EX_OVER
SUB *,7,AR0
SACH *,7
;------------
CG_EX_GTGT
;---ex[0]=1,ex[1]=1
;-----------------------------------
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (h1[i] + h1[i+1])>>2;
;-----------------------------------
RPTB CG_EX_GTGT_FOR-1
LACC *+,9,AR2
ADD *+,7
ADD *0-,7,AR0
SACH *0-,7
CG_EX_GTGT_FOR ;AR0:Y[-1] ,AR2: H[0]
;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=H[1]+H[0]>>2
;y[-1]=ex[0]* h[0]=H[0]>>2
LACC CG_EX0,13
SACH *+,7,AR2
MAR *+ ;AR2: H[1]
;BD CG_EX_OVER
ADD *,7,AR0
SACH *,7
;==========================================
CG_EX_OVER
BD CG_GET_COR ;ARP==0
LAR AR0,#CG_Y+58
;==========================================
CG__FIRST
;==========================================
; if (first)
; { for (i = 0; i < l; i++)
; { acc=0l;
; for (j = 0; j <= i && j < len; j++)
; { p32=(long)h1[j] * ex[i - j]; acc += p32; }
; y[i-1]=acc>>2; }
; }
;=================================
;LACC #CG_Y
;SACL CG_Y_ADDR
LAR AR2,#CG_Y_1
LACC #IMP_H
SAMM BMAR
LACL #0
SACL PG_RPTC
LACL #59
SAMM BRCR
LACC CG_BOOK
SAMM AR0 ;AR0->EX[0]
SACL CG_EX
MAR *,AR0
;-------
RPTB CG_FIRST_I-1
ZAP
RPT PG_RPTC ;AR0 -> EX[I] , BMAR->H[0]
MADS *- ;CODEBOOK[512] & IMP_H[60] MUST NOT IN SAME BLOCK
APAC
BSAR 2
MAR *+,AR2 ;AR0->EX[0]
SACL *+,0,AR0
LACC PG_RPTC
ADD #1
SACB
LACC PG_LEN_1 ;29/59
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -