📄 excise_20_lib_l_abs.asm
字号:
/*
* Copyright@fortemedia.com.cn
* Author:FeiranYang
* Date:2008/03/22
* Email:feirany@fortemedia.com.cn
20. Long Absolute, LIB_L_ABS
*/
#define N 2
.section/dm data1;
.var x[N]={0x1,0x8000};//input data for words
.var x_abs[N];//output data
.var in;
.var result;
.section/pm interrupts;
__reset: JUMP start; rti; rti; rti; /* 0x0000: reset */
rti; rti; rti; rti; /* 0x0004: IRQ2 */
rti; rti; rti; rti; /* 0x0008: IRQL1 */
rti; rti; rti; rti; /* 0x000c: IRQL0 */
rti; rti; rti; rti; /* 0x0010: SPORT0 tx */
rti; rti; rti; rti; /* 0x0014: SPORT1 rx */
rti; rti; rti; rti; /* 0x0018: IRQE */
rti; rti; rti; rti; /* 0x001c: BDMA */
rti; rti; rti; rti; /* 0x0020: SPORT1 tx or IRQ1 */
rti; rti; rti; rti; /* 0x0024: SPORT1 rx or IRQ0 */
rti; rti; rti; rti; /* 0x0028: timer */
rti; rti; rti; rti; /* 0x002c: power down */
.section/pm seg_code; /* Example setup for DFT routine */
start:
m0=1;
l0=0;
m1=1;
l1=0;
//数据高16位从8000递加到7FFF,其他48位为 0001 0001 0001
cntr=256;//256;
do out_loop until ce;
nop;
cntr=256;
do in_loop until ce;
i0=x; /*input intial*/
ax0=dm(in); //从文件中读数据到寄存器
dm(x+N-1)=ax0;//将高16位数据写到存储器
call LIB_L_ABS;
i1=x_abs; /*output intial*/
ax0=dm(i1,m1); //将输出写到文件,小端模式
dm(result)=ax0;
ax0=dm(i1,m1);
in_loop: dm(result)=ax0;
out_loop: nop;
end: IDLE;
/*
* Get the abstract of any precision, the varible's precision is storee in N
* Calling Parameters:
x[N] with N*16 bit.First LSW,last WSW.
i0->input data
m0=1
l0=0
i1->input data
m1=1
l1=0
* Return Values:
x's abstract ,store in x_abs[N]
* Altered Registers:
i0,i1,ax0,ay0,ar,af
* computation time
8+2*(N-1) for negative
5+2*N for positive
*/
/************************************************************/
LIB_L_ABS:
i0=x; /*input intial*/
i1=x_abs; /*output intial*/
ax0=dm(x+N-1);
af=pass ax0;
if GE jump transfer_direct; /*if input>=0,do nothing,just transfer*/
/*if input<0,do the next processing*/
ax0=dm(i0,m0);
ax0=dm(i0,m0),ar=-ax0; /*x_abs=2^(N*16) - x;here x<0*/
dm(i1,m1)=ar;
cntr=N-1;
do abs_loop until ce; /*mul_precision subtract*/
ax0=dm(i0,m0),ar=-ax0+c-1;
abs_loop: dm(i1,m1)=ar;
rts;
transfer_direct: /*direct tranfer now*/
cntr=N;
do tran_data until ce;
ax0=dm(i0,m0);
tran_data: dm(i1,m1)=ax0;
return: rts;
/************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -