📄 d4i40_1fv.asm
字号:
LD sq2,A
STL A,sq
LD alp_16,A
STL A,alp
LD i2,A
STL A,ix
LD i3,A
STL A,iy
BeforeLoopi3End:
MAR *+pDn(STEP)
ADDM #STEP,i3
Loopi3End:
ADDM #STEP,i2
BANZD Loopi2,*AR_INDEX2-
MVDM addr_dn,pDn
;s=L_msu(L_mult(alpk,sq),psk,alp)
LD alpk,T
MPY sq,A
LD psk,T
MPY alp,B
SUB B,A
BC BeforeSearch4,ALEQ ;if(s>0)
LD sq,A
STL A,psk
LD alp,A
STL A,alpk
LD i0,A
STL A,ip2
LD i1,A
STL A,ip3
LD ix,A
STL A,ip0
LD iy,A
STL A,ip1
BeforeSearch4:
ST #-1,sq ;sq=-1
ST #1,alp ;alp=1;
;i0 loop:2 positions in track 3/4
ST #-1,prev_i0
STM #2-1,AR_INDEX2 ;for(i=0;i<2;i++)
Loop_3_4_i0:
ST #-1,max
LD #4 ,A
SUB *(AR_INDEX),A
STLM A,AR0 ;j=4-AR_INDEX ------>AR0
STM #Addr_Dn,pDn ;calculate the head address of Dn
ADD *(pDn),A ;A=dn[j]
STLM A,pDn
;search "dn[]" maximum posiition in track 3/4
STM #NB_POS-1,BRC
RPTB SearchMaxDn_3_4_End-1
LD *pDn,A
LD max,B
MAX A
STLM A,T ;T for the temp result
BCD BeforeSearchMaxDn_3_4_End,C ;if A<B (dn[j]<max) goto ...
MAR *+pDn(STEP) ;use the delate circle
LD prev_i0,A
SUB *(AR0),A
BC BeforeSearchMaxDn_3_4_End,AEQ ;if prev_i0==j goto ...
LDM T,A ;else all above
STL A,max
MVMD AR0,i0
BeforeSearchMaxDn_3_4_End:
MAR *+AR0(STEP) ;j+=STEP
SearchMaxDn_3_4_End:
STM #6554,T
LD i0,A
STL A,prev_i0
MPY i0,A
LD A,-16 ;j(A)=mult(i0,6554)
STLM A,BRC ;save j into BRC for temp purpose ;save j into T
MVDM ptr_rri3i3_i4,p0
ADD *(p0),A
STLM A,p0
STM #8192,T
MPY *p0,A
DST A,alp1 ;alp1=L_mult(*p0,_1_4)
STM #Addr_Dn,pDn ;ps1=dn[i0]
LD i0,A
ADD *(pDn),A
STLM A,pDn
NOP
NOP
LD *pDn,A
STL A,ps1
LD *(BRC),A
MVDM ptr_rri0i3_i4,p0 ;p0=ptr_rri0i3_i4
Add *(p0),A
; STLM A,p0
STM #rri0i0,p1 ;p1=rri0i0;
STLM A,p0
STM #NB_POS-1,BRC
STM #Addr_Dn,pDn
ST #0,i1
RPTB LoopTrack_3_4_End-1
STM #16384,T ;alp2=L_mac(alp1,*p0,_1_2);
MPY *p0,B ;alp2=L_mac(alp2,*p1++,_1_2);
DADD alp1, B
MAR *+p0(NB_POS)
STM #8192,T
MPY *p1+,A
ADD B,A ;A=alp2
ADD #1,15,A ;apl_16=round(alp2)
STL A,-16,alp_16
LD ps1,A ;ps2=add(s1,dn[i1])
ADD *pDn,A
STL A,ps2
SQUR *(AL),B
STL B,-16,sq2
;s=L_msu(L_mult(alp,sq2),sq,alp_16)
LD alp,T
MPY sq2,A
LD sq,T
MPY alp_16,B
SUB B,A
BC BeforLoopTrack_3_4_End,ALEQ ;if(s>0)
LD sq2,A
STL A,sq
LD ps2,A
STL A,ps
LD alp_16,A
STL A,alp
LD i0,A
STL A,ix
LD i1,A
STL A,iy
BeforLoopTrack_3_4_End:
MAR *+pDn(STEP)
ADDM #STEP,i1
LoopTrack_3_4_End:
BANZ Loop_3_4_i0,*AR_INDEX2-
LD ix,A
STL A,i0
LD iy,A
STL A,i1
STM #6554,T
MPY i1,A
LD A,-16
LD A,3
STL A,i1_offset
LD ps,A
STL A,ps0
STM #8192,T
MPY alp,A
DST A,alp0
ST #-1,sq
ST #1,alp
STM #6554,T
MVDM ptr_rri2i3_i4,p0 ;p0=ptr_rri2i3_i4+mult(i0,6554)
MPY i0,A
LD A,-16
ADD *(p0),A
STLM A,p0
STM #rri0i2,p1 ;p1=rri0i2+i1_offset
LD i1_offset,A
ADD *(p1),A
STLM A,p1
STM #rri2i2,p2 ;p2=rri2i2
STM #tmp_vect,p3 ;p3=tmp_vect
;for(i3=2;i3<L_SUBFR;i3+=STEP)
STM #NB_POS-1,BRC
RPTB Loopi2_3_4_End-1
STM #8192,T ;s=L_mult(*p0,_1_4)
MPY *p0,A
MAR *+p0(NB_POS) ;p0+=NB_POS
MPY *p1+,B ;s=L_mac(s,*p1++,_1_4)
ADD B,A
STM #4096,T ;s=L_mac(s,*p2++,_1_8)
MPY *p2+,B
ADD B,A
ADD #1,15,A ;*p3++=round(s)
STL A,-16,*p3+
Loopi2_3_4_End:
STM #6554,T
MVDM ptr_rri1i3_i4,p0 ;p0=PTR_rri1i3_I4+mult(i0,6554)
MPY i0,A
LD A,-16
ADD *(p0),A
STLM A,p0
STM #rri0i1,p1 ;p1=rri0i1+I1_offset
LD i1_offset,A
ADD *(p1),A
STLM A,p1
STM #rri1i1,p2 ;p2=rri1i1
STM #rri1i2,p3 ;p3=rri1i2
STM #NB_POS-1,AR_INDEX2 ;AR_INDEX2(AR7) is the loop counter.
STM #Addr_Dn+1,pDn
ST #1,i2
Loop_3_4_i2:
LD ps0,A
ADD *pDn,A
MAR *+pDn(STEP)
STL A,ps1
MVMD pDn,addr_dn ;save the pointer into addr_dn
;alp1=alp0+rr[i0][i2]+rr[i1][i2]+0.5*rr[i2][i2]
STM #4096,T
DLD alp0,A
MPY *p0,B
ADD B,A
MAR *+p0(NB_POS)
MPY *p1+,B
ADD B,A
STM #2048,T
MPY *p2+,B
ADD B,A
DST A,alp1
STM #tmp_vect,p4
STM #Addr_Dn+2,pDn ;pDn=dn[i3]
STM #NB_POS-1,BRC
ST #2,i3
RPTB Loopi3_3_4_End-1
LD ps1,A ;ps2=add(ps1,dn[i3])
ADD *pDn,A
STL A,ps2
SQUR *(AL),B ;sq2=mult(ps2,ps2)
STL B,-16,sq2
STM #4096,T
DLD alp1,A ;alp2=L_mac(alp1,*p3++,_1_8)
MPY *p3+,B
ADD B,A
STM #16384,T ;alp2=L_mac(alp2,*p4++,_1_2)
MPY *p4+,B
ADD B,A
DST A,alp2
ADD #1,15,A ;alp_16=round(alp2)
STL A,-16,alp_16
;s=L_msu(L_mult(alp,sq2),sq,alp_16)
LD alp,T
MPY sq2,A
LD sq,T
MPY alp_16,B
SUB B,A
BC BeforeLoopi3_3_4_End,ALEQ ;if(s>0)
LD sq2,A
STL A,sq
LD alp_16,A
STL A,alp
LD i2,A
STL A,ix
LD i3,A
STL A,iy
BeforeLoopi3_3_4_End:
MAR *+pDn(STEP)
ADDM #STEP,i3
Loopi3_3_4_End:
ADDM #STEP,i2
BANZD Loop_3_4_i2,*AR_INDEX2-
MVDM addr_dn,pDn
;s=L_msu(L_mult(alpk,sq),psk,alp)
LD alpk,T
MPY sq,A
LD psk,T
MPY alp,B
SUB B,A
BC BeforeSetSign,ALEQ ;if(s>0)
LD sq,A
STL A,psk
LD alp,A
STL A,alpk
LD i0,A
STL A,ip3
LD i1,A
STL A,ip0
LD ix,A
STL A,ip1
LD iy,A
STL A,ip2
BeforeSetSign:
;modify pointer of rrixiy
ST #rri0i4,ptr_rri0i3_i4
ST #rri1i4,ptr_rri1i3_i4
ST #rri2i4,ptr_rri2i3_i4
ST #rri4i4,ptr_rri3i3_i4
BANZ SearchPosLoop,*AR_INDEX-
;Find the codeword corresponding to the selected positions
STM #(L_SUBFR>>1)-1,BRC
LD #0,A
RPTBD InitCodEnd-1
STM #Addr_cn,pCn ;pCn=AR2
DST A,*pCn+
InitCodEnd:
;Set the sign oimpulses
;note:the following code can be optimized.
LD ip0,A ;i0=sign_dn[ip0]
STM #sign_dn,pSignDn
ADD *(pSignDn),A
STLM A,pSignDn
NOP
NOP
LD *pSignDn,A
STL A,i0
LD ip1,A ;i1=sign_dn[ip1]
STM #sign_dn,pSignDn
ADD *(pSignDn),A
STLM A,pSignDn
NOP
NOP
LD *pSignDn,A
STL A,i1
LD ip2,A ;i2=sign_dn[ip2]
STM #sign_dn,pSignDn
ADD *(pSignDn),A
STLM A,pSignDn
NOP
NOP
LD *pSignDn,A
STL A,i2
LD ip3,A ;i3=sign_dn[ip3]
STM #sign_dn,pSignDn
ADD *(pSignDn),A
STLM A,pSignDn
NOP
NOP
LD *pSignDn,A
STL A,i3
STM #Addr_cn,pCn ;cod[ip0]=shr(i0,2)
LD i0,-2,A
LD ip0,B
ADD *(pCn),B
STLM B,pCn
LD i1,-2,B ;using circle inteval
STL A,*pCn
STM #Addr_cn,pCn
LD ip1,A
ADD *(pCn),A
STLM A,pCn
LD i2,-2,A
STL B,*pCn
STM #Addr_cn,pCn
LD ip2,B
ADD *(pCn),B
STLM B,pCn
LD i3,-2,B
STL A,*pCn
STM #Addr_cn,pCn
LD ip3,A
ADD *(pCn),A
STLM A,pCn
LD ip0,A
STLM A,BRC
STL B,*pCn
;find the filterd codeword
;for(i=0;i<ip0;i++) y[i]=0;
RPTBD i0Begin-1
STM #Addr_yn2,pYn2
ST #0,*pYn2+
i0Begin:
LD #0,B
STM #Addr_h1,pH1
STM #Addr_yn2,pYn2
LD #L_SUBFR-1,A
SUB ip0,A
STLM A,BRC
STLM A,T
LD ip0,A
ADD *(pYn2),A
STLM A,pYn2
LD i0,A
BC i0Else,ALEQ ;if(i0>0)
RPTB Beforei0Else-1
MVDD *pH1+,*pYn2+
Beforei0Else:
ADD #1,B
B i1Begin
i0Else: ;slse
RPTB i1Begin-1
LD *pH1+,A
NEG A
STL A,*pYn2+
i1Begin:
STM #Addr_h1,pH1
STM #Addr_yn2,pYn2
LD #L_SUBFR-1,A
SUB ip1,A
STLM A,BRC
LD ip1,A
ADD *(pYn2),A
STLM A,pYn2
LD i1,A
BC i1Else,ALEQ ;if(i1>0)
RPTB Beforei1Else-1
LD *pYn2,A
ADD *pH1+,A
STL A,*pYn2+
Beforei1Else:
ADD #2,B
B i2Begin
i1Else:
RPTB i2Begin-1
LD *pYn2,A
SUB *pH1+,A
STL A,*pYn2+
i2Begin:
STM #Addr_h1,pH1
STM #Addr_yn2,pYn2
LD #L_SUBFR-1,A
SUB ip2,A
STLM A,BRC
LD ip2,A
ADD *(pYn2),A
STLM A,pYn2
LD i2,A
BC i2Else,ALEQ ;if(i1>0)
RPTB Beforei2Else-1
LD *pYn2,A
ADD *pH1+,A
STL A,*pYn2+
Beforei2Else:
ADD #4,B
B i3Begin
i2Else:
RPTB i3Begin-1
LD *pYn2,A
SUB *pH1+,A
STL A,*pYn2+
i3Begin:
STM #Addr_h1,pH1
STM #Addr_yn2,pYn2
LD #L_SUBFR-1,A
SUB ip3,A
STLM A,BRC
LD ip3,A
ADD *(pYn2),A
STLM A,pYn2
LD i3,A
BC i3Else,ALEQ ;if(i1>0)
RPTB Beforei3Else-1
LD *pYn2,A
ADD *pH1+,A
STL A,*pYn2+
Beforei3Else:
ADD #8,B
B FindEnd
i3Else:
RPTB FindEnd-1
LD *pYn2,A
SUB *pH1+,A
STL A,*pYn2+
FindEnd:
;*sign=i
STL B,*(PulseSign)
STM #6554,T
MPY ip0,A
STL A,-16,ip0
MPY ip1,A
STL A,-16,ip1
MPY ip2,A
STL A,-16,ip2
MPY ip3,A ;A(i)=mult(ip3,6554)
LD A,-16
LD A,#2,B ;B=shl(i,2)
ADD A,B ;B(j)=i+shl(i,2)
ADD #3,B
STLM A,T ;save shl(i,1)
LD ip3,A
SUB B,A
LDM T,B
LD B,1
ADD A,B
STL B,ip3
LD ip0,B
LD ip1,3,A
ADD A,B
LD ip2,6,A
ADD A,B
LD ip3,9,A
ADD A,B
STL B,*(PulseIndex) ;return i
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -