?? 9-2.asm
字號:
CMPGT Xi,Xs,Xt ; 比較和增加測試水平
|| [Xt] ADD Xs,Xq,Xs
|| [Xt] ADD Ix,3,Ix ; 增加索引
|| CMPGT Yi,Ys,Yt
|| [Yt] ADD Ys,Yq,Ys
|| [Yt] ADD Iy,Nx,Iy
.endloop
ADD Ix,Iy,Id0 ; 計算區域
|| ADD Ix,Iy,Id1
|| ADDAH MCurr0,8,MCurr0 ; 指向路徑狀態
|| ADDAH TT,10,MCurr1 ; 指向B組寄存器
LDW *MCurr0[Id0],T0 ; 取X0, Y0
|| LDW *MCurr1[Id1],T1 ; 取X1, Y1
|| ADD Id0,2,Id0
LDW *MCurr0[Id0],T2 ; 取狀態0和1
SHL Xi,16,XY ; 連接Xi Yi到XY
|| CLR Yi,16,31,TT
|| LDH *+MNext0[2],Ys ; 為下一個循環準備
OR XY,TT,XY ; 連接Xi Yi到XY
|| LDH *+MNext0[3],Xs ; 為下一個循環準備
LDH *+MNext0[4],Yq ; 為下一個循環準備
SUB2 T0,XY,T0 ; 計算X Y對 X0 Y0的微分
|| SUB2 T1,XY,T1 ; 計算X Y 對X1 Y1的微分
|| LDH *+MNext0[5],Xq ; 為下一個循環準備
MPY T0,T0,P2 ; 計算(Yi - Y0) ^ 2.
|| MPY T1,T1,P3 ; 計算(Yi - Y1) ^ 2.
|| LDH *+MNext0[6],Ny ; 為下一個循環準備
|| [Cc] SUB Cc,1,Cc ; 循環計數器減
MPYH T0,T0,P0 ; 計算(Xi - X0) ^ 2.
|| MPYH T1,T1,P1 ; 計算Get (Yi - Y0) ^ 2.
|| LDH *+MNext0[7],Nx ; 為下一個循環準備
|| [Cc] B Cloop ; 下一個循環
NOP ; 延遲
ADD P0,P2,T0 ; 計算距離X0 Y0的平方
|| ADD P1,P3,T1 ; 計算距離X1 Y1的平方
|| MV T2,T3 ; 狀態0和1
CMPGT T0,T1,TT ; 計算最大距離
|| EXTU T3,16,16,S0 ; 分開狀態0和1
|| EXTU T2,0,16,S1
[TT] MV T1,T0 ; 距離X0 Y0為大值
|| [TT] MV S1,S0 ; 使用距離X1 Y1
STW T0,*DistP++ ; 保存結果
|| STH S0,*StateP++
|| MV MNext0,MCurr0 ; 為下一個循環準備
|| ZERO Ix ; 寄存器索引
|| ZERO Iy
; Viterbi譯碼第三步
; 尋找最短距離,存儲到Dist0和Dist1
; 計算延遲狀態并存儲
; 輸入為距離和狀態
; 輸出為Dist0,Dist1,DS0~DS7和延遲路徑
TMB0 .set A0 ; 表指針
TMB1 .set B0 ; 表指針
T200A .set A2 ; 保存16進制200
T200B .set B2 ; 保存16進制200
DistP0 .set A4 ; 距離指針
DistP1 .set B4 ; 距離指針
Ix0 .set A5 ; 索引
Ix1 .set B5 ; 索引
DSP0 .set A6 ; 延遲狀態指針
DSP1 .set B6 ; 延遲狀態指針
Stp0 .set A8 ; 狀態指針0
Stp1 .set B8 ; 狀態指針1
St0 .set A9 ; 狀態0
St1 .set B9 ; 狀態1
LU0 .set A10 ; 查找表行 0
LU1 .set B10 ; 查找表行1
LU2 .set A11 ; 查找表行2
LU3 .set B11 ; 查找表行3
Step3:
MVK Distance,DistP0 ; 指向距離0到 3
|| MVK Distance,DistP1 ; 指向距離4 到7
MVKH Distance,DistP0
|| MVKH Distance,DistP1
LDW *+DistP0[0],Dist0 ; 計算距離0
|| LDW *+DistP1[4],Dist1 ; 計算距離4
|| MVK TMBack,TMB0 ; 獲得表指針
|| MVK TMBack,TMB1 ; 獲得表指針
LDW *+DistP0[1],Q0 ; 計算距離1
|| LDW *+DistP1[5],Q1 ; 計算距離5
|| MVKH TMBack,TMB0
|| MVKH TMBack,TMB1
LDW *+TMB0[0],LU0 ; 讀查找表
|| LDW *+TMB1[1],LU1 ; 讀查找表
|| MVK State,Stp0 ; 計算狀態指針
|| MVK State,Stp1 ; 計算狀態指針
LDW *+DistP0[2],Q0 ; 計算距離2
|| LDW *+DistP1[6],Q1 ; 計算距離6
|| MVKH State,Stp0 ; 計算狀態指針
|| MVKH State,Stp1 ; 計算狀態指針
LDW *+TMB0[2],LU2 ; 讀查找表
|| LDW *+TMB1[3],LU3 ; 讀查找表
MVK 0x200,T200A
|| MVK 0x200,T200B
|| LDW *+DistP0[3],Q0 ; 計算距離3
|| LDW *+DistP1[7],Q1 ; 計算距離7
CMPGT Dist0,Q0,TT0 ; 如果距離1 < lowest
|| MVK 0x39C,Ix0 ; 提取位0~3
|| CMPGT Dist1,Q1,TT1 ; 如果距離5 < lowest
|| MVK 0x39C,Ix1 ; 提取位0~3
|| LDH *Stp0[0],St0
|| LDH *Stp1[4],St1
[TT0] MV Q0,Dist0 ; 保持最短距離
|| [TT0] MVK 0x31C,Ix0 ; 提取位4~7
|| [TT0] LDH *Stp0[1],St0
|| [TT1] MV Q1,Dist1 ; 保持最短距離
|| [TT1] MVK 0x31C,Ix1 ; 提取位4~7
|| [TT1] LDH *Stp1[5],St1
CMPGT Dist0,Q0,TT0 ; 如果距離2 < lowest
|| CMPGT Dist1,Q1,TT1 ; 如果距離6 < lowest
[TT0] MV Q0,Dist0 ; 保持最短距離
|| [TT0] MVK 0x29C,Ix0 ; 提取位8~11
|| [TT0] LDH *Stp0[2],St0
|| [TT1] MV Q1,Dist1 ; 保持最短距離
|| [TT1] MVK 0x29C,Ix1 ; 提取位8~11
|| [TT1] LDH *Stp1[6],St1
CMPGT Dist0,Q0,TT0 ; 如果距離3 < lowest
|| CMPGT Dist1,Q1,TT1 ; 如果距離7 < lowest
|| MV DStCurr,DSP0 ; 初始化指針到A side
|| MV DStCurr,DSP1 ; 初始化指針到B side
[TT0] MV Q0,Dist0 ; 保持最短距離
|| [TT0] MVK 0x21C,Ix0 ; 提取位12~15
|| [TT0] LDH *Stp0[3],St0
|| [TT1] MV Q1,Dist1 ; 保持最短距離
|| [TT1] MVK 0x21C,Ix1 ; 提取位12~15
|| [TT1] LDH *Stp1[7],St1
EXTU LU0,Ix0,DS0 ; 不提取
|| EXTU LU1,Ix1,DS1 ; 不提取
EXTU LU2,Ix0,DS2
|| EXTU LU3,Ix1,DS3
|| SUB Ix0,T200A,Ix0 ; 提取位16以上位
|| SUB Ix1,T200B,Ix1 ; 提取位16以上位
|| STH DS0,*+DSP0[0] ; 保存延遲狀態0
|| STH DS1,*+DSP1[1] ; 保存延遲狀態1
EXTU LU0,Ix0,DS4
|| EXTU LU1,Ix1,DS5
|| STH DS2,*+DSP0[2] ; 保存延遲狀態2
|| STH DS3,*+DSP1[3] ; 保存延遲狀態3
EXTU LU2,Ix0,DS6
|| EXTU LU3,Ix1,DS7
|| STH DS4,*+DSP0[4] ; 保存延遲狀態4
|| STH DS5,*+DSP1[5] ; 保存延遲狀態5
STH DS6,*+DSP0[6] ; 保存延遲狀態6
|| STH DS7,*+DSP1[7] ; 保存延遲狀態7
|| MVK AccDist,AccP0
|| MVK AccDist,AccP1
STH St0,*+DSP0[8] ; 保存路徑狀態索引
|| STH St1,*+DSP1[9] ; 保存路徑狀態索引
|| MVKH AccDist,AccP0
|| MVKH AccDist,AccP1
; Viterbi譯碼第四步
; 計算累積距離
; 輸入為Dist0,Dist1,DS0~DS7
; 輸出為AccDist和G0~G7
AccP0 .set A4 ; 累積距離指針
AccP1 .set B4 ; 累積距離指針
Step4:
LDW *+AccP0[DS0],G0 ; 讀累積距離
|| LDW *+AccP1[DS1],G1
LDW *+AccP0[DS2],G2 ; 讀累積距離
|| LDW *+AccP1[DS3],G3
LDW *+AccP0[DS4],G4 ; 讀累積距離
|| LDW *+AccP1[DS5],G5
LDW *+AccP0[DS6],G6 ; 讀累積距離
|| LDW *+AccP1[DS7],G7
|| MVK 1,ONE ; ONE表示1
SHR Dist0,3,Dist0 ; 距離除8
|| SHR Dist1,3,Dist1
SHR G0,3,W0 ; 累積距離除8
|| SHR G1,3,W1
SUB G0,W0,G0
|| SUB G1,W1,G1
|| SHR G2,3,W0 ; 累積距離除8
|| SHR G3,3,W1
|| MPY ONE,0,Q0 ; Q0索引為0
|| MPY ONE,1,Q1 ; Q1索引為1
ADD G0,Dist0,G0 ; 距離加
|| ADD G1,Dist1,G1
|| SUB G2,W0,G2
|| SUB G3,W1,G3
|| SHR G4,3,W0 ; 累積距離除8
|| SHR G5,3,W1
STW G0,*+AccP0[0] ; 保存累積距離
|| STW G1,*+AccP1[1]
|| ADD G2,Dist0,G2 ; 距離加
|| ADD G3,Dist1,G3
|| SUB G4,W0,G4
|| SUB G5,W1,G5
STW G2,*+AccP0[2] ; 保存累積距離
|| STW G3,*+AccP1[3]
|| ADD G4,Dist0,G4 ; 距離加
|| ADD G5,Dist1,G5
|| SHR G6,3,W0 ; 累積距離除8
|| SHR G7,3,W1
STW G4,*+AccP0[4] ; 保存累積距離
|| STW G5,*+AccP1[5]
|| SUB G6,W0,G6
|| SUB G7,W1,G7
|| CMPGT G0,G2,TT0 ; 找最小距離
|| CMPGT G1,G3,TT1
ADD G6,Dist0,G6 ; 距離加
|| ADD G7,Dist1,G7
|| [TT0] MV G2,G0 ; 保存最小距離
|| [TT0] MPY ONE,2,Q0 ; 更新索引
|| [TT1] MV G3,G1 ; 保存最小距離
|| [TT1] MPY ONE,3,Q1 ; 更新索引
STW G6,*+AccP0[6] ; 保存累積距離
|| STW G7,*+AccP1[7]
|| CMPGT G0,G1,TT0 ; 找最小距離
|| MPY ONE,4,W0
|| MPY ONE,5,W1
; Viterbi譯碼第五步
; 首次尋找最小累積距離
; 使用延遲路徑回溯尋找路徑狀態
; 輸入為G0~G7,D延遲路徑
; 輸出為TTT
II .set B0 ; 臨時變量
IDD .set A4 ; 索引
DStptr .set A5 ; 延遲狀態指針
JJ .set A7 ; 臨時變量
JJ0 .set B8 ; 臨時變量
ONE .set A12 ; One表示1
Step5:
[TT0] MV G1,G0 ; 計算當前4個中的最小值
|| [!TT0] MV Q0,Q1
|| CMPGT G4,G6,TT0 ; 計算下4個中的最小值
|| CMPGT G5,G7,TT1
[TT0] MV G6,G4 ; 保存最小值
|| [TT0] MPY ONE,6,W0 ; 更新索引
|| [TT1] MV G7,G5 ; 保存最小值
|| [TT1] MPY ONE,7,W1 ; 更新索引
|| MVK MCurr,MCurrx ; 計算回溯指針
CMPGT G4,G5,TT0 ; 尋找最小值
|| MVKH MCurr,MCurrx
[TT0] MV G5,G4 ; 上4個中的最小值
|| [!TT0] MV W0,W1
|| MVK DelayPath,JJ0 ; 準備循環緩沖區JJ
CMPGT G0,G4,TT0 ; 計算最小值實部
|| MV Q1,IDD
|| MVKH DelayPath,JJ0 ; 準備循環緩沖區JJ
[TT0] MV W1,IDD ; 得到IDD
|| MV DStCurr,JJ
|| MVK 14,II ; 回溯計數器
|| LDW *MCurrx,MCurrx ; 載入指針
IILoop:
[II] B IILoop ; 回溯
LDH *+JJ[IDD],IDD ; 保持跟蹤
|| MVK Diff,DFTP ; 計算表diff指針
CMPGT JJ,JJ0,TT0
|| MVKH Diff,DFTP ; 計算表diff指針
[TT0] SUBAH JJ,10,JJ ; 調整循環緩沖區JJ
|| [!TT0] MVK DelayPath+300,JJ ; 調整循環緩沖區JJ
[!TT0] MVKH DelayPath+300,JJ ; 調整循環緩沖區JJ
SUB II,1,II ; 計數器減
AND IDD,1,IDD
|| LDW *+MCurrx[1],Ext1
|| MVK Tdr,TDRP ; 計算Tdr指針
ADD 8,IDD,IDD
|| LDW *+MCurrx[2],Ext2
|| MVKH Tdr,TDRP ; 計算Tdr指針
LDH *+JJ[IDD],TTT
|| MVK DelayPath+300,JJ0 ; 準備循環緩沖區DStCurr
|| MVK DStCurrbss,DStptr ; 計算DStCurr指針
MVKH DelayPath+300,JJ0 ; 準備循環緩沖區DStCurr
|| MVKH DStCurrbss,DStptr ; 計算DStCurr指針
|| LDW *TDRP,TDR ; 讀Tdr
CMPLT DStCurr,JJ0,TT0
|| LDW *+MCurrx[3],Sht ; 計算移位索引
[TT0] ADDAH DStCurr,10,DStCurr ; 調整循環緩沖區DStCurr
|| [!TT0] MVK DelayPath,DStCurr ; 調整循環緩沖區DStCurr
|| LDW *+B15[1],B3 ; 返回序列
[!TT0] MVKH DelayPath,DStCurr ; 調整循環緩沖區DStCurr
|| LDW *DFTP,DFT ; 讀表diff
; Viterbi譯碼第六步
; 處理結果
; 輸入為TTT
; 輸出為A4返回值
MCurrx .set A0 ; 調整表指針
PP .set A0 ; 臨時變量
Ext2 .set A2 ; 提取索引2
TDR .set B2 ; Tdr值
SSS .set A3 ; 臨時變量
Sht .set A4 ; 移位累加
TDRP .set B4 ; Tdr指針
Ext1 .set A6 ; 提起索引1
DFT .set A7 ; 表Diff 值
DFTP .set A9 ; 表Diff指針
Step6:
STW DStCurr,*DStptr ; 保存DStCurr
|| EXTU TTT,Ext1,PP ; 分開TTT成兩片
SHL PP,2,PP ; 計算diff表索引
|| STW PP,*TDRP ; 更新Tdr值
OR PP,TDR,PP ; 計算diff表索引
|| EXTU TTT,Ext2,SSS ; 分開TTT成兩片
SHL PP,1,PP
|| MV B15,A9 ; 返回序列
|| B B3 ; 返回序列
SHR DFT,PP,DFT
|| LDW *+A9[2],A10 ; 返回序列
|| LDW *+B15[3],B10 ; 返回序列
CLR DFT,2,31,DFT ; 保持最低2位
|| LDW *+A9[4],A11 ; 返回序列
|| LDW *+B15[5],B11 ; 返回序列
SHL DFT,Sht,DFT ; 連接SSS
|| LDW *+A9[6],A12 ; 返回序列
|| LDW *+B15[7],B12 ; 返回序列
OR DFT,SSS,A4 ; 連接SSS
|| LDW *+A9[8],A13 ; 返回序列
|| LDW *+B15[9],B13 ; 返回序列
ADDAW B15,9,B15 ; 分配存儲器
Step7: ; 返回,恢復寄存器A10~A13,B10~B13,A3
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -