Viterbi译码汇编程序


Google

.bss Tdr,4,4 ; 微分Tdr值

.bss DStCurrbss,4,4 ; 当前延迟状态指针

.bss DelayPath,320,4 ; 延迟状态和路径状态向量(半字格式)

.bss AccDist,32,4 ; 距离累积值向量(字格式)

.bss Distance,32,4 ; 距离结果向量(字格式)

.bss Dummy,2,2 ; 允许同步进入

.bss State,16,4 ; 状态向量(半字格式)

.bss MCurr,4,4 ; 存储当前调制指针

SK .set 1024 ; 比例因子

.sect "LUTable"

MMMMM .set 0x7FFF ; 有符号数据最大值

SS .set 0xFFFF ; 无符号数据最大值

SZ .set 3 ; 数据指针字大小

.def _M14

_M14: ; 调整方式为14.4 kbps

.int M140 ; 首地址

.int 0x35E ; 提取第4和第5位

.int 0x39C ; 提取第0到第3位

.int 4 ; 移位累加值

M140 .int M141 ; 下一个地址

.short -5*SK,-6*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -7*SK,-4*SK,-3*SK,-8*SK,0x05,0x00 ; Y0,X0,Y1,X1,S0,S1

.short -7*SK,-4*SK,MMMMM,MMMMM,0x05,SS

.short -7*SK,+0*SK,MMMMM,MMMMM,0x07,SS

.short -7*SK,+4*SK,MMMMM,MMMMM,0x03,SS

.short -7*SK,+4*SK,-3*SK,+8*SK,0x03,0x01

.short -3*SK,-8*SK,MMMMM,MMMMM,0x00,SS

.short -3*SK,-4*SK,MMMMM,MMMMM,0x04,SS

.short -3*SK,+0*SK,MMMMM,MMMMM,0x06,SS

.short -3*SK,+4*SK,MMMMM,MMMMM,0x02,SS

.short -3*SK,+8*SK,MMMMM,MMMMM,0x01,SS

.short +1*SK,-8*SK,MMMMM,MMMMM,0x08,SS

.short +1*SK,-4*SK,MMMMM,MMMMM,0x0C,SS

.short +1*SK,+0*SK,MMMMM,MMMMM,0x0E,SS

.short +1*SK,+4*SK,MMMMM,MMMMM,0x0A,SS

.short +1*SK,+8*SK,MMMMM,MMMMM,0x09,SS

.short +5*SK,-4*SK,+1*SK,-8*SK,0x0D,0x08

.short +5*SK,-4*SK,MMMMM,MMMMM,0x0D,SS

.short +5*SK,+0*SK,MMMMM,MMMMM,0x0F,SS

.short +5*SK,+4*SK,MMMMM,MMMMM,0x0B,SS

.short +5*SK,+4*SK,+1*SK,+8*SK,0x0B,0x09

M141 .int M142 ; 下一个地址

.short -3*SK,-6*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -5*SK,-4*SK,-1*SK,-8*SK,0x1B,0x19 ; Y0,X0,Y1,X1,S0,S1

.short -5*SK,-4*SK,MMMMM,MMMMM,0x1B,SS

.short -5*SK,+0*SK,MMMMM,MMMMM,0x1F,SS

.short -5*SK,+4*SK,MMMMM,MMMMM,0x1D,SS

.short -5*SK,+4*SK,-1*SK,+8*SK,0x1D,0x18

.short -1*SK,-8*SK,MMMMM,MMMMM,0x19,SS

.short -1*SK,-4*SK,MMMMM,MMMMM,0x1A,SS

.short -1*SK,+0*SK,MMMMM,MMMMM,0x1E,SS

.short -1*SK,+4*SK,MMMMM,MMMMM,0x1C,SS

.short -1*SK,+8*SK,MMMMM,MMMMM,0x18,SS

.short +3*SK,-8*SK,MMMMM,MMMMM,0x11,SS

.short +3*SK,-4*SK,MMMMM,MMMMM,0x12,SS

.short +3*SK,+0*SK,MMMMM,MMMMM,0x16,SS

.short +3*SK,+4*SK,MMMMM,MMMMM,0x14,SS

.short +3*SK,+8*SK,MMMMM,MMMMM,0x10,SS

.short +7*SK,-4*SK,+3*SK,-8*SK,0x13,0x11

.short +7*SK,-4*SK,MMMMM,MMMMM,0x13,SS

.short +7*SK,+0*SK,MMMMM,MMMMM,0x17,SS

.short +7*SK,+4*SK,MMMMM,MMMMM,0x15,SS

.short +7*SK,+4*SK,+3*SK,+8*SK,0x15,0x10

M142 .int M143 ; Next address

.short -7*SK,-4*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -9*SK,-2*SK,-5*SK,-6*SK,0x28,0x2D ; Y0,X0,Y1,X1,S0,S1

.short -9*SK,-2*SK,MMMMM,MMMMM,0x28,SS

.short -9*SK,+2*SK,MMMMM,MMMMM,0x20,SS

.short -9*SK,+2*SK,-5*SK,+6*SK,0x20,0x25

.short -5*SK,-6*SK,MMMMM,MMMMM,0x2D,SS

.short -5*SK,-2*SK,MMMMM,MMMMM,0x2C,SS

.short -5*SK,+2*SK,MMMMM,MMMMM,0x24,SS

.short -5*SK,+6*SK,MMMMM,MMMMM,0x25,SS

.short -1*SK,-6*SK,MMMMM,MMMMM,0x2F,SS

.short -1*SK,-2*SK,MMMMM,MMMMM,0x2E,SS

.short -1*SK,+2*SK,MMMMM,MMMMM,0x26,SS

.short -1*SK,+6*SK,MMMMM,MMMMM,0x27,SS

.short +3*SK,-6*SK,MMMMM,MMMMM,0x2B,SS

.short +3*SK,-2*SK,MMMMM,MMMMM,0x2A,SS

.short +3*SK,+2*SK,MMMMM,MMMMM,0x22,SS

.short +3*SK,+6*SK,MMMMM,MMMMM,0x23,SS

.short +7*SK,-2*SK,+3*SK,-6*SK,0x29,0x2B

.short +7*SK,-2*SK,MMMMM,MMMMM,0x29,SS

.short +7*SK,+2*SK,MMMMM,MMMMM,0x21,SS

.short +7*SK,+2*SK,+3*SK,+6*SK,0x21,0x23

M143 .int M144 ; Next address

.short -5*SK,-4*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -7*SK,-2*SK,-3*SK,-6*SK,0x31,0x33 ; Y0,X0,Y1,X1,S0,S1

.short -7*SK,-2*SK,MMMMM,MMMMM,0x31,SS

.short -7*SK,+2*SK,MMMMM,MMMMM,0x39,SS

.short -7*SK,+2*SK,-3*SK,+6*SK,0x39,0x3B

.short -3*SK,-6*SK,MMMMM,MMMMM,0x33,SS

.short -3*SK,-2*SK,MMMMM,MMMMM,0x32,SS

.short -3*SK,+2*SK,MMMMM,MMMMM,0x3A,SS

.short -3*SK,+6*SK,MMMMM,MMMMM,0x3B,SS

.short +1*SK,-6*SK,MMMMM,MMMMM,0x37,SS

.short +1*SK,-2*SK,MMMMM,MMMMM,0x36,SS

.short +1*SK,+2*SK,MMMMM,MMMMM,0x3E,SS

.short +1*SK,+6*SK,MMMMM,MMMMM,0x3F,SS

.short +5*SK,-6*SK,MMMMM,MMMMM,0x35,SS

.short +5*SK,-2*SK,MMMMM,MMMMM,0x34,SS

.short +5*SK,+2*SK,MMMMM,MMMMM,0x3C,SS

.short +5*SK,+6*SK,MMMMM,MMMMM,0x3D,SS

.short +9*SK,-2*SK,+5*SK,-6*SK,0x30,0x35

.short +9*SK,-2*SK,MMMMM,MMMMM,0x30,SS

.short +9*SK,+2*SK,MMMMM,MMMMM,0x38,SS

.short +9*SK,+2*SK,+5*SK,+6*SK,0x38,0x3D

M144 .int M145 ; 下一个地址

.short -4*SK,-5*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -6*SK,-3*SK,-2*SK,-7*SK,0x4B,0x49 ; Y0,X0,Y1,X1,S0,S1

.short -6*SK,-3*SK,MMMMM,MMMMM,0x4B,SS

.short -6*SK,+1*SK,MMMMM,MMMMM,0x4F,SS

.short -6*SK,+5*SK,MMMMM,MMMMM,0x4D,SS

.short -6*SK,+5*SK,-2*SK,+9*SK,0x4D,0x48

.short -2*SK,-7*SK,MMMMM,MMMMM,0x49,SS

.short -2*SK,-3*SK,MMMMM,MMMMM,0x4A,SS

.short -2*SK,+1*SK,MMMMM,MMMMM,0x4E,SS

.short -2*SK,+5*SK,MMMMM,MMMMM,0x4C,SS

.short -2*SK,+9*SK,MMMMM,MMMMM,0x48,SS

.short +2*SK,-7*SK,MMMMM,MMMMM,0x41,SS

.short +2*SK,-3*SK,MMMMM,MMMMM,0x42,SS

.short +2*SK,+1*SK,MMMMM,MMMMM,0x46,SS

.short +2*SK,+5*SK,MMMMM,MMMMM,0x44,SS

.short +2*SK,+9*SK,MMMMM,MMMMM,0x40,SS

.short +6*SK,-3*SK,+2*SK,-7*SK,0x43,0x41

.short +6*SK,-3*SK,MMMMM,MMMMM,0x43,SS

.short +6*SK,+1*SK,MMMMM,MMMMM,0x47,SS

.short +6*SK,+5*SK,MMMMM,MMMMM,0x45,SS

.short +6*SK,+5*SK,+2*SK,+9*SK,0x45,0x40

M145 .int M146 ; 下一个地址

.short -4*SK,-7*SK,4*SK,4*SK,(3+1)*SZ,(4+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -6*SK,-5*SK,-2*SK,-9*SK,0x55,0x50 ; Y0,X0,Y1,X1,S0,S1

.short -6*SK,-5*SK,MMMMM,MMMMM,0x55,SS

.short -6*SK,-1*SK,MMMMM,MMMMM,0x57,SS

.short -6*SK,+3*SK,MMMMM,MMMMM,0x53,SS

.short -6*SK,+3*SK,-2*SK,+7*SK,0x53,0x51

.short -2*SK,-9*SK,MMMMM,MMMMM,0x50,SS

.short -2*SK,-5*SK,MMMMM,MMMMM,0x54,SS

.short -2*SK,-1*SK,MMMMM,MMMMM,0x56,SS

.short -2*SK,+3*SK,MMMMM,MMMMM,0x52,SS

.short -2*SK,+7*SK,MMMMM,MMMMM,0x51,SS

.short +2*SK,-9*SK,MMMMM,MMMMM,0x58,SS

.short +2*SK,-5*SK,MMMMM,MMMMM,0x5C,SS

.short +2*SK,-1*SK,MMMMM,MMMMM,0x5E,SS

.short +2*SK,+3*SK,MMMMM,MMMMM,0x5A,SS

.short +2*SK,+7*SK,MMMMM,MMMMM,0x59,SS

.short +6*SK,-5*SK,+2*SK,-9*SK,0x5D,0x58

.short +6*SK,-5*SK,MMMMM,MMMMM,0x5D,SS

.short +6*SK,-1*SK,MMMMM,MMMMM,0x5F,SS

.short +6*SK,+3*SK,MMMMM,MMMMM,0x5B,SS

.short +6*SK,+3*SK,+2*SK,+7*SK,0x5B,0x59

M146 .int M147 ; 下一个地址

.short -6*SK,-5*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -8*SK,-3*SK,-4*SK,-7*SK,0x61,0x63 ; Y0,X0,Y1,X1,S0,S1

.short -8*SK,-3*SK,MMMMM,MMMMM,0x61,SS

.short -8*SK,+1*SK,MMMMM,MMMMM,0x69,SS

.short -8*SK,+1*SK,-4*SK,+5*SK,0x69,0x6B

.short -4*SK,-7*SK,MMMMM,MMMMM,0x63,SS

.short -4*SK,-3*SK,MMMMM,MMMMM,0x62,SS

.short -4*SK,+1*SK,MMMMM,MMMMM,0x6A,SS

.short -4*SK,+5*SK,MMMMM,MMMMM,0x6B,SS

.short +0*SK,-7*SK,MMMMM,MMMMM,0x67,SS

.short +0*SK,-3*SK,MMMMM,MMMMM,0x66,SS

.short +0*SK,+1*SK,MMMMM,MMMMM,0x6E,SS

.short +0*SK,+5*SK,MMMMM,MMMMM,0x6F,SS

.short +4*SK,-7*SK,MMMMM,MMMMM,0x65,SS

.short +4*SK,-3*SK,MMMMM,MMMMM,0x64,SS

.short +4*SK,+1*SK,MMMMM,MMMMM,0x6C,SS

.short +4*SK,+5*SK,MMMMM,MMMMM,0x6D,SS

.short +8*SK,-3*SK,+4*SK,-7*SK,0x60,0x65

.short +8*SK,-3*SK,MMMMM,MMMMM,0x60,SS

.short +8*SK,+1*SK,MMMMM,MMMMM,0x68,SS

.short +8*SK,+1*SK,+4*SK,+5*SK,0x68,0x6D

M147 .int M140 ; 下一个地址

.short -6*SK,-3*SK,4*SK,4*SK,(4+1)*SZ,(3+1)*SZ ; Ys,Xs,Yq,Xq,Ny+1,Nx+1

.short -8*SK,-1*SK,-4*SK,-5*SK,0x78,0x7D ; Y0,X0,Y1,X1,S0,S1

.short -8*SK,-1*SK,MMMMM,MMMMM,0x78,SS

.short -8*SK,+3*SK,MMMMM,MMMMM,0x70,SS

.short -8*SK,+3*SK,-4*SK,+7*SK,0x70,0x75

.short -4*SK,-5*SK,MMMMM,MMMMM,0x7D,SS

.short -4*SK,-1*SK,MMMMM,MMMMM,0x7C,SS

.short -4*SK,+3*SK,MMMMM,MMMMM,0x74,SS

.short -4*SK,+7*SK,MMMMM,MMMMM,0x75,SS

.short +0*SK,-5*SK,MMMMM,MMMMM,0x7F,SS

.short +0*SK,-1*SK,MMMMM,MMMMM,0x7E,SS

.short +0*SK,+3*SK,MMMMM,MMMMM,0x76,SS

.short +0*SK,+7*SK,MMMMM,MMMMM,0x77,SS

.short +4*SK,-5*SK,MMMMM,MMMMM,0x7B,SS

.short +4*SK,-1*SK,MMMMM,MMMMM,0x7A,SS

.short +4*SK,+3*SK,MMMMM,MMMMM,0x72,SS

.short +4*SK,+7*SK,MMMMM,MMMMM,0x73,SS

.short +8*SK,-1*SK,+4*SK,-5*SK,0x79,0x7B

.short +8*SK,-1*SK,MMMMM,MMMMM,0x79,SS

.short +8*SK,+3*SK,MMMMM,MMMMM,0x71,SS

.short +8*SK,+3*SK,+4*SK,+7*SK,0x71,0x73

.def _M12 ; Make this table visible to outside.

_M12: ; 调制方式为12.0 kbps,代码同上

; 参数不同,根据需要修改参数

; . . .

TMBack .int 0x03122130 ; 定义矩阵43 42 41 40 03 02 01 00

.int 0x65475674 ; 53 52 51 50 13 12 11 10

.int 0x12033021 ; 63 62 61 60 23 22 21 20

.int 0x74564765 ; 73 72 71 70 33 32 31 30

Diff .int 0x1B4EE1B4

.text

.def _Init

_Init: ; DStCurrbss = *DelayPath.

MVK DStCurrbss,A0

MVKH DStCurrbss,A0

MVK DelayPath,A1

MVKH DelayPath,A1

STW A1,*A0

MVK 16,B0

PLoop: ; DelayPath[i][j] = 0

MVK 10,B1 ; i=0~15, j=0~9

ZERO A0

KLoop:

SUB 10,B1,A3

STH A0,*+A1[A3]

[B1] SUB B1,1,B1

[B1] B KLoop

NOP 5

ADDAH A1,10,A1

[B0] SUB B0,1,B0

[B0] B PLoop

NOP 5

MVK SK/2,A0

MVK AccDist,A1

MVKH AccDist,A1

MVK 8,B0

ILoop: ; AccDist[i] = 512, i=1~7

SUB 8,B0,A3 ; AccDist[0] = 0

STW A0,*+A1[A3]

[B0] SUB B0,1,B0

[B0] B ILoop

NOP 5

ZERO A0

STW A0,*+A1[0]

ZERO A0

MVK Tdr,A1

MVKH Tdr,A1

STW A0,*A1

B B3

NOP 5

DStCurr .set A13 ; 当前延迟状态指针

TT0 .set A1 ; 临时变量,用于测试

TT1 .set B1 ; 临时变量,用于测试

Q0 .set A3 ; 临时变量

Q1 .set B3 ; 临时变量

W0 .set A6 ; 临时变量

W1 .set B6 ; 临时变量

DS0 .set A0 ; 延迟状态0

DS1 .set B0 ; 延迟状态1

DS2 .set A1 ; 延迟状态2

DS3 .set B1 ; 延迟状态3

DS4 .set A2 ; 延迟状态4

DS5 .set B2 ; 延迟状态5

DS6 .set A3 ; 延迟状态6

DS7 .set B3 ; 延迟状态7

Dist0 .set A7 ; 距离0

Dist1 .set B7 ; 距离1

G0 .set A5 ; 距离累积值0

G1 .set B5 ; 距离累积值1

G2 .set A10 ; 距离累积值2

G3 .set B10 ; 距离累积值3

G4 .set A11 ; 距离累积值4

G5 .set B11 ; 距离累积值5

G6 .set A9 ; 距离累积值6

G7 .set B9 ; 距离累积值7

TTT .set A8 ; 跟踪回溯状态地址

.def _Viterbi

.text

_Viterbi:

; Viterbi译码第一步

; 分配堆栈空间存储B3、A10~A13、B10~B13

; 将参数3(A6)存储到MCurr

; 设置当前延迟状态指针为DStCurr

MV A6,B6 ;*

|| LDW *A6,MCurr0 ; 得到首个调制数据表

|| SUBAW B15,9,B15 ; 分配存储空间

MVK MCurr,B0

|| MVK DStCurrbss,A1

|| MV B15,A9 ; 设置快速存储寄存器

|| STW B3,*+B15[1] ; 保存寄存器内容

MVKH MCurr,B0

|| MVKH DStCurrbss,A1

|| STW A13,*+A9[8] ; 保存寄存器内容

|| STW B13,*+B15[9] ; 保存寄存器内容

STW B6,*B0 ; 保存当前指针

|| LDW *A1,DStCurr ; 取延迟状态指针

STW A12,*+A9[6] ; 保存寄存器内容

|| STW B12,*+B15[7] ; 保存寄存器内容

; Viterbi译码第二步

; 输入为Xi和Yi,输出为距离和状态

; 基于输入Xi和Yi计算距离和状态值

XY .set A0 ; X、Y 用于SUB2指令操作

Cc .set B0 ; 循环计数器

Xt .set A1 ; 测试X

Yt .set B1 ; 测试Y

S1 .set A1 ; 状态 1

S0 .set B1 ; 状态0

TT .set B2 ; 临时变量

Nx .set A3 ; Nx

Ny .set B3 ; Ny

Xi .set A4 ; 接收数据参数1

Yi .set B4 ; 接收数据参数2

Xs .set A5 ; Xs

Ys .set B5 ; Ys

MCurr0 .set A6 ; 位速率调整表

StateP .set B6 ; 状态结果指针

Xq .set A7 ; Xq

Yq .set B7 ; Yq

DistP .set A8 ; 距离结果指针

MCurr1 .set B8 ; B组寄存器指针

Ix .set A9 ; X索引

Iy .set B9 ; Y索引

Id0 .set A9 ; 区域结果

Id1 .set B9 ; B组寄存器区域结果

P2 .set A9 ; 乘法寄存器

P3 .set B9 ; 乘法寄存器

T0 .set A10 ; 临时寄存器

T1 .set B10 ; 临时寄存器

P0 .set A10 ; 乘法寄存器

P1 .set B10 ; 乘法寄存器

T2 .set A11 ; 临时寄存器

T3 .set B11 ; 临时寄存器

MNext0 .set A12 ; 下一个表指针

Step2:

MV MCurr0,TT

|| MVK State,StateP ; 设置状态结果指针

|| MVK Distance,DistP ; 设置距离结果指针

|| STW A11,*+A9[4] ; 保存寄存器

|| STW B11,*+B15[5] ; 保存寄存器

LDH *+MCurr0[3],Xs ; 取Xs和Ys

|| LDH *+TT[2],Ys

|| MVKH State,StateP

|| MVKH Distance,DistP

LDH *+MCurr0[5],Xq ; 取Xq和Yq

|| LDH *+TT[4],Yq

LDH *+MCurr0[7],Nx ; 取Nx和Ny

|| LDH *+TT[6],Ny

|| ZERO Ix ; 初始化索引

|| ZERO Iy

|| MVK 8,Cc ; 初始化循环计数器

STW A10,*+A9[2] ; 保存寄存器

|| STW B10,*+B15[3] ; 保存寄存器

NOP 2

Cloop:

CMPGT Xi,Xs,Xt ; 比较和增加测试水平

|| ADD Xs,Xq,Xs

|| CMPGT Yi,Ys,Yt

|| ADD Ys,Yq,Ys

|| LDW *MCurr0,MNext0 ; 为下一个循环准备

|| MV MCurr0,TT

.loop 4 ; 设置Max (Nx, Ny).

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


免责声明:
1、本文系本网编辑转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
2、如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容