**定时20ms循环处理话音数据包***
*伪指令不占空间不影响执行速度,只是定义和描述但对汇编链接有重要指示作用
*********************************
.title "IS95前向信道设计" ;源程序名
.global _c_int00 ;全局起始标号
.mmregs ;定义所有存储器映像寄存器为全局型 定义存储器为全局符号
.copy "walsh.inc" ;从"walsh.inc" 文件中复制walsh表
STACK .usect "stack",10H ;自定义未初始化堆栈的设置(调用子程序,中断时将当期执行位置自动压栈)
.bss pn1,2048 ;在未初始化段中保留空间,2048个字(一个字16位,一个字节8位,这里是字)
.bss pn2,2048
.bss w,1536
.bss wa,1536
.bss iq,32 ;依次存储4组8个样点波形
;SIN0+COS0;SIN0+COS180;SIN180+COS0;SIN180+COS180
.bss p,4 ;P用于42级缓存三个,用于Wlash地址是4个
.bss q,4 ;P用于42级掩码三个,用于Wlash地址是4个
.bss v,1 ;用于记录pn码循环的位置0-2047
.bss k,1 ;k为偏置系数
.bss x,1
.bss y,1
.bss z,1
.data ;为数据开辟存储空间
cos: .word 07fffH,05a82H,00000H,0a57fH,08002H,0a57fH,00000H,05A82H ;Q15格式 一个或多个16位整型变量
sin: .word 00000H,05A82H,07fffH,05a82H,00000H,0a57fH,08002H,0a57fH
PA0 .set 0 ;符号常数赋给寄存器
PA1 .set 1 ;从此端口传速率标志1,2,4,8
PA2 .set 2
PA3 .set 3
PA4 .set 4
PA5 .set 5
PA6 .set 6
PA7 .set 7
PA8 .set 8
PA9 .set 9 ;此端口输出调制波形
.sect ".vectors" ;中断向量表(自定义已初始化段)
rst: B _c_int00 ;(0号复位中断)无条件转移2个字
NOP
NOP ;两个NOP占2个字,加在一起0号中断共四个字
.space 15*4*16 ;预留1-15号中断地址空间,每个占四个字
int0: B clock ;16号GPS外部中断
NOP
NOP
.space 2*4*16 ;预留17,18号中断地址空间,每个占四个字
tint: B timeout ;19号定时中断向量(20ms(ttt3))
NOP
NOP
.space 12*4*16
.text ;主程序
_c_int00
STM #STACK+10H,SP ;堆栈指针 指向栈底 ************************************************************
*初始化,产生四种SIN与COS相加的波形
*cos+sin, cos-sin, sin-cos, -cos-sin
************************************************************
SSBX SXM ;=1符号扩展,进行算数运算,数据进入ALU中符号位扩展(SSBX 对状态寄存器ST0/1特定位置置1)
STM #w,AR2 ;w AR2存放cos的样点
STM #wa,AR3 ;wa AR3存放sin的样点
STM #7, BRC ;块循环8
RPTB lop1
LD #cos,A
;RPT #7
READA *AR2+ ;cos w(AR2)中存8个cos样点, 按累加器A寻址读程序存储器并存入数据存储器
lop1: ADD #1, A
RPTB lop2
LD #sin,A
;RPT #7
STM #7, BRC
READA *AR3+ ;sin wa(AR3)中存8个sin样点
lop2: ADD #1, A
;;存采样点
STM #iq,AR4 ;iq数据单元存放四种波形 cos+sin, cos-sin, sin-cos, -sin-cos
STM #w,AR2 ;指向 cos起始位置
STM #wa,AR3 ;指向 sin起始位置
STM #7,BRC
RPTB ttt-1
LD *AR2+,A
ADD *AR3+,A
STL A,*AR4+ ;AR4 *(iq)=cos0+sin0 ttt: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt1-1
LD *AR2+,A
SUB *AR3+,A
STL A,*AR4+ ;AR4 *(iq+8)=cos0+sin180 ttt1: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt2-1
LD *AR3+,A
SUB *AR2+,A ;AR4 *(iq+16)=cos180+sin0
STL A,*AR4+ ttt2: STM #w,AR2
STM #wa,AR3
STM #7,BRC
RPTB ttt3-1
LD *AR2+,A
NEG A ;计数累加器反值
SUB *AR3+,A
STL A,*AR4+ ;AR4 *(iq+24)=cos180+sin180
;;存4种合成波形
************************************************************
**初始化PN1和PN2,准正交15级M序列
**先产生好引导序列,最后15个零,初始状态14个零,1个一
**序列周期2^15-1=32768-1=32767
**每两秒75个PN序列周期,1.2288Mc(M chip, 长码工作频率)/S*2S = 75*32768, 32768/16 = 2048个字
**I(X) = x15+x13+x9+x8+x7+x5+1
**Q(x) = x15+x12+x11+x10+x6+x5+x4+x3+1
************************************************************
STM #32767,BRC ;循环次数 PN1
LD #0x0001,A ;初始状态14个零1个一,移存器初态,1为x位
STM #15,AR4 ;计数器,一个字16位
STM #pn1,AR3 ;放置序列地址
ST #0X0001,*AR3 ;先输出1(存进pn1段内存空间中)
RPTB PP-1
LD #0,B ;B为M序列反馈位
XOR A,-4,B ;x5与B异或
XOR A,-6,B
XOR A,-7,B
XOR A,-8,B
XOR A,-12,B
XOR A,-14,B
AND #0x0001,B
SFTL A,1 ;左移一位
OR B,A ;反馈位或到最低位
BANZ PP1,*AR4- ;未积满一个字后转移(AR4的内容为0不跳转)
STL B,*+AR3 ;更新输出地址
STM #15,AR4
B PP2
PP1: ADD *AR3,1,B
STL B,*AR3
PP2: NOP
PP: LD *AR3,A ;周期性,AR3又重新指向了pn1的开头
AND #0XFFFE,A ;提前输出的1强制变为0
STL A,*AR3
************************************************************
STM #32767,BRC ;PN2
LD #0x0001,A ;初始状态14个零,1个一
STM #15,AR4 ;计数器,一个字16位
STM #pn2,AR3 ;放置序列地址
ST #0X0001,*AR3 ;先输出1
RPTB PPPP-1
LD #0,B ;B为M序列反馈位
XOR A,-2,B ;x3与B异或
XOR A,-3,B
XOR A,-4,B
XOR A,-5,B
XOR A,-9,B
XOR A,-10,B
XOR A,-11,B
XOR A,-14,B
AND #0x0001,B
SFTL A,1 ;左移一位
OR B,A ;反馈位或到最低位
BANZ PPPP1,*AR4- ;未积满一个字后转移
STL B,*+AR3 ;更新输出地址
STM #15,AR4
B PP2
PPPP1: ADD *AR3,1,B
STL B,*AR3
PPPP2: NOP
PPPP: LD *AR3,A ;提前输出的1强制变为0
AND #0XFFFE,A
STL A,*AR3
*************************************************************
ttt3: SSBX INTM ;=1,关闭所有可屏蔽中断
RSBX SXM ;=0,禁止符号位扩展
ST #0,*(x) ;初始化x=0,x为十次定时记数
STM #0,SWWSR ;插入0等待周期
STM #0xffa8,PMST ;改变中断向量映射到0xff80,IPTR取PMST高九位9个1
STM #9007h,CLKMD ;CLKMD倍频设置 PLLMUL=9,CLKIN=10M,CLKOUT=CLKIN X (PLLMUL+1)=100M
STM #19999,PRD ;该为PRD=20000-1;TDDR=10-1 主频100M 则定时2ms
STM #0039h,TCR ;T = t*(TDDR+1)*(PRD+1)
;TDDR=9,TSS=1停止 *************************************************************
**主程序和码元重复
**速率标志1,2,4,8
**测试标志的0123位
*************************************************************
susp STM #y,AR4 ;添加帧质量指示,速率标志
PORTR PA1,*AR4 ;速率标志1,2,4,8
BIT *AR4,15-0 ;速率1, 检测第0位,15-0最右面一位
BC bbb1,NTC ;TC=0转移
CALL crc12 ;12位CRC校验子程序,8.6*20=172+12=184
LD #183,A ;卷积输入184码元 172+12
CALL juanji ;卷积加尾比特 184+8=192*2=384
STM #wa,AR5 ;码元重复1次,wa输出 w输入
STM #w,AR3
RPT #383 ;卷积输出384个码元,作为码元重复的输入
MVDD *AR3+,*AR5+ ;每个码元重复1次
CALL jiaozhi
CALL raoluan ;42级扰乱加密子程序
CALL kuopin ;沃尔什码扩频子程序
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb1: BIT *AR4,15-1 ;速率2(速率1/2)
BC bbb2,NTC ;TC = 0跳移
CALL crc8 ;8位CRC校验子程序,4.0*20 = 80+8 = 88
LD #87,A ;卷积输入88码元
CALL juanji ;卷积加尾比特 88+8 = 96*2 = 192
STM #wa,AR5 ;码元重复2次,wa输出
STM #w,AR3 ;w输入
STM #191,BRC ;卷积输出192个码元,作为码元重复的输入
RPTB ccb1-1
MVDD *AR3,*AR5+ ;每个码元重复2次
MVDD *AR3+,*AR5+
ccb1 CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb2: BIT *AR4,15-2 ;速率4(速率1/4),检测第2位
BC bbb3,NTC ;TC = 0 转移
STM #w,AR3
STM #wa,AR4
RPT #39 ;2.0*20 = 40
MVDD *AR3+,*AR4+ ;统一接口 等效于CRC校验 wa AR3->w AR4
LD #39,A ;卷积输入 40码元
CALL juanji ;卷积加尾比特 40+8 = 48*2 = 96
STM #wa,AR5 ;码元重复4次,wa输出w输入
STM #w,AR3
STM #95,BRC ;卷积输出96个码元,作为码元重复的输入
RPTB ccb2-1
MVDD *AR3,*AR5+ ;每个码元重复4次
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3+,*AR5+
ccb2 CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
B bbb bbb3 STM #w,AR3 ;速率8(速率1/8), 检测第3位
STM #wa,AR4
RPT #15 ;0.8*20 = 16
MVDD *AR3+,*AR4+
LD #15,A
CALL juanji ;卷积加尾比特 16+8 = 24*2 = 48
STM #wa,AR5 ;码元重复8次,wa输出w输入
STM #w,AR3
STM #47,BRC
RPTB ccc-1
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3,*AR5+
MVDD *AR3+,*AR5+
ccc CALL jiaozhi
CALL raoluan
CALL kuopin
CALL pianzhi1
CALL pianzhi2
CALL qpsk
nop
bbb nop
*********************************************************************
**用x定时, 初始化于171行
*********************************************************************
susp1 LD *(x),A ;保证程序每次间隔20ms
SUB #10,A
BC susp,AEQ ; x = 10时,说明20ms完成, 跳到susp, 即从上面的码元重复开始从头开始执行. 判断是否到20ms,取第二个数据包处理
B susp1 ;否则x < 10,没记满,时间没到,死循环等待,时间记满进行下个程序周期
*********************************************************************
timeout ADDM #1,*(x) ;x++ 定时中断子程序1加到十即20ms
LD #10,A
SUB *(x),A
BC secout,ALEQ ;x >= 10,跳,说明10次记满,x清零,
B exit ;否则直接退出中断
secout ST #0,*(x)
exit NOP
RETE
*********************************************************************
*外部GPS时钟2秒钟复位一次
*根据偏置系数K确定引导pn序列的起始位置v
*********************************************************************
clock: PORTR PA0,*(k) ;读偏置系数
LD *(k),2,A ;4个字,相邻偏执系数相差64位
AND #0x7fc,A ;0111,1111,1100只有中间9位有效,屏蔽低2位
STL A,*(v) ;V = k*4(即k左移两位),周期序列起始位置
STM #0FFFFh,IFR ;所有中断标志置1
STM #0008h,IMR ;TINT0=1定时中断开放
RSBX INTM ;=0,开放所有可屏蔽中断
LDM TCR,A
AND #0FFEFH,A
STLM A,TCR ;TSS=0,定时器启动工作
RETE ********************************************************************
*循环冗余编码编程
*CRC效验子程序
*12位帧质量指示码产生器
*w存储172位要效验的信息
*wa存储184位输出信息
*f(x)=x12+x11+x10+x9+x8+x4+x+1
*********************************************************************
crc12 STM #w,AR3 ;输入输入数据间接寻址
STM #wa,AR4 ;输出
LD #0XFFF,B ;B为12位移存器初始化,左为刚入X12,右为最早入X
STM #171,BRC ;计算172位CRC效验
RPTB next-1 ;块循环
SFTL B,-11,A ;B中存储12位移存器值,取最高延迟位至A中
MVDD *AR3,*AR4+ ;数据由w->wa,输入还没产生反馈为,
XOR *AR3+,A ;最高延迟位与输入模2加产生反馈输入
AND #0X0001,A ;确保只要一位
SFTL B,1 ;12位移存器左移一位,图右移
AND #0X0FFE,B ;x位清空,放反馈位
XOR A,11,B ;产生移存器的X12,有抽头
XOR A,10,B ;产生移存器的X11
XOR A,9,B ;产生移存器的X10
XOR A,8,B ;产生移存器的X9
XOR A,7,B ;产生移存器的X8
XOR A,3,B ;产生移存器的X4
XOR A,B ;产生移存器的X
next: NOP ;将存在累加器A中的校验12位码传递到信息位的最后12个字
SFTL B,-11,A ;12位校验位存在B中
AND #0X0001,A ;取校验最高位输出
STL A,*AR4+ ;AR4为输出数据地址
SFTL B,-10,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-9,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-8,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-7,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-6,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-5,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-4,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-3,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
AND #0X0001,B
STL B,*AR4+
RET
***********************************************************************************
*crc效验:F(X)=X8+X7+X4+X3+X+1
*8位帧质量指示码产生器
*w存储80位要效验的信息
*wa存储88位输出信息
***********************************************************************************
crc8 STM #w,AR3 ;输入
STM #wa,AR4 ;输出
LD #0XFF,B ;B为8位移存器初始化,右为刚入,左为最早入
STM #79,BRC ;计算80位CRC效验
RPTB nex-1
SFTL B,-7,A ;取最高延迟位
MVDD *AR3,*AR4+ ;数据由w->wa
XOR *AR3+,A ;最高延迟位与输入模2加产生反馈输入
AND #0X0001,A
SFTL B,1 ;移存器移位,x8在左
AND #0X0FE,B
XOR A,7,B ;产生移存器的X8
XOR A,6,B ;产生移存器的X7
XOR A,3,B ;产生移存器的X4
XOR A,2,B ;产生移存器的X3
XOR A,B ;产生移存器的X
nex: NOP ;将存在累加器A中的校验8位码传递到信息位的最后8个字
SFTL B,-7,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-6,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-5,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-4,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-3,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
SFTL B,-2,A
AND #0X0001,A
STL A,*AR4+
AND #0X0001,B
STL B,*AR4+
RET
**********************************************************************************
*卷积编码g0=111101011 1 X X1 ... X8 ,B中相反
* g1=101110001
*wa为输入数据,w为编码输出
*包括8位尾比特处理
**********************************************************************************
juanji: STLM A,BRC ;BRC值与速率有关,A=183,87,39,15
STM #wa,AR2 ;输入
STM #w,AR3 ;输出
LD #0,B ;B中存储8位移存器,初始化0
RPTB ddd-1 ;循环
LD *AR2,A ;当前输入送输出
XOR B,A ;g0 = 111101011
XOR B,-1,A ;B移存器有抽头位异或存于A中
XOR B,-2,A
XOR B,-4,A
XOR B,-6,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;编码后输出
LD *AR2,A ;g1 = 101110001
XOR B,-1,A ;B移存器有抽头位异或存于A中
XOR B,-2,A
XOR B,-3,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;编码后输出
SFTL B,1
AND #0XFE,B
OR *AR2+,B
ddd: NOP
STM #7,BRC ;加尾比特8个0
RPTB eee-1
LD #0,A ;无输入信息
XOR B,A
XOR B,-1,A
XOR B,-2,A
XOR B,-4,A
XOR B,-6,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;将编码后比特输出
LD #0,A ;无输入信息
XOR B,-1,A
XOR B,-2,A
XOR B,-3,A
XOR B,-7,A
AND #0X0001,A
STL A,*AR3+ ;将编码后比特输出
SFTL B,1 ;移存器移位
eee: NOP
RET
*************************************************************************
*交织器 打乱,把突发错误变为随机错误
*将384码元横向输入一个6*64矩阵,先对64列数据进行进行比特反转寻址方式交织,再纵向依次输出。
*输入数据在wa中,中间倒序寻址数据在w中,最后数据仍在wa中
*************************************************************************
jiaozhi: STM #wa,AR2 ;输入,输出
STM #w,AR3 ;中间倒序寻址数据
STM #32,AR0 ;64比特反转寻址方式:AR0=64/2=32 长度一半
STM #64-1,BRC ;一行64个都要打乱
RPTB #jj1-1
MVDD *AR2,*AR3+ ;
MAR *AR2+0B ;不支持双操作数寻址 所以分两步实现位倒序 完成第一行64比特反转寻址交织
jj1: STM #wa+64,AR2 ;第二行首地址
RPTB #jj2-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第二行64比特反转寻址交织
jj2: STM #wa+2*64,AR2
RPTB #jj3-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第三行64比特反转寻址交织 jj3: STM #wa+3*64,AR2
RPTB #jj4-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第四行64比特反转寻址交织
jj4: STM #wa+4*64,AR2
RPTB #jj5-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第五行64比特反转寻址交织
jj5: STM #wa+5*64,AR2
RPTB #jj6-1
MVDD *AR2,*AR3+
MAR *AR2+0B ;完成第六行64比特反转寻址交织
jj6: STM #wa,AR2
STM #w,AR3
STM #64-1,BRC
STM #64,AR0 ;按列输出,上下相隔64
RPTB jjj1-1
MVDD *AR3,*AR2+
MAR *AR3+0 ;同样不支持双操作数寻址,所以分两步
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
MAR *AR3+0
MVDD *AR3,*AR2+
LDM AR3,A
SUB #5*64-1,A ;输出下一列,更新地址,相差-(5*64+1)
STLM A,AR3 ;AR3=A
jjj1: RET ;返回指令,返回到调用或发生中断的位置
*************************************************************************
*扰乱加密P(x)=x42+x35+x33+x31
* +x27+x26+x25+x22+x21+x19+x18+x17+x16
* +x10+x7+x6+x5+x3+x2+x+1
*加扰之前的数据在wa中,加扰后数据在w中,p,p+1与p+2中分别放移存器低14位中14位和高14位
*q,q+1与q+2中分别放掩码标志码低14位中14位和高14位
*数据掩我渤莆萑怕遥淠康氖俏耸莸陌踩? *为了保密安全起见,42级移位寄存器的各级输出与用户的42比特长码掩码相与,再进行模二相加,
*产生一种长码输出。长码的时钟工作频率是1.2288MHz,相应的长码俾适?.2288Mc/s,经64分频器,
*输出速率为19.2kb/s的的长码比特流,再与经卷积、交织处理后的调制码元进行模加,完成数据掩蔽工作.
*************************************************************************
raoluan: STM #wa,AR4 ;输入存储器映象寄存器寻址
STM #w,AR5 ;out
STM #384-1,AR3 ;384个要加密,循环384次,因为已用过块循环,块循环不能嵌套
PORTR PA2,*(p) ;获得移存器初态低14位 ,42=14*3 端口分三次读入 绝对寻址
LD *(p),A
AND #0X3fff,A ;确保低14
STL A,*(p)
PORTR PA3,*(p+1) ;获得移存器初态中14位
LD *(p+1),A
AND #0X3fff,A
STL A,*(p+1)
PORTR PA4,*(p+2) ;获得移存器初态高14位
LD *(p+2),A
AND #0X3fff,A
STL A,*(p+2)
PORTR PA5,*(q) ;获得掩码标志码低14位
LD *(q),A
AND #0X3fff,A
STL A,*(q)
PORTR PA6,*(q+1) ;获得掩码标志码中14位
LD *(q+1),A
AND #0X3fff,A
STL A,*(q+1)
PORTR PA7,*(q+2) ;获得掩码标志码高14位
LD *(q+2),A
AND #0X3fff,A
STL A,*(q+2)
bbc: STM #63,BRC ;42级m序列产生器同时64分频 64次掩码才输出
RPTB bbc1-1
LD #0,B ;B反馈位 初始化 P移存器初始状态 左X14
LD *(p),A ;*(p)存储m序列低14位 有抽头加一起产生反馈位
XOR A,B ;X 最右X
XOR A,-1,B ;X2 右移1位
XOR A,-2,B ;X3
XOR A,-4,B ;X5
XOR A,-5,B ;X6
XOR A,-6,B ;X7
XOR A,-9,B ;X10
; AND #0X0001,B
LD *(p+1),A ;*(p+1)存储m序列中14位 X15
XOR A,-1,B ;X16
XOR A,-2,B ;X17
XOR A,-3,B ;X18
XOR A,-4,B ;X19
XOR A,-6,B ;X21
XOR A,-7,B ;X22
XOR A,-10,B ;X25
XOR A,-11,B ;X26
XOR A,-12,B ;X27
; AND #0X0001,B
LD *(p+2),A ;*(p+2)存储m序列高14位 X30
XOR A,-2,B ;X31
XOR A,-4,B ;X33
XOR A,-6,B ;X35
XOR A,-13,B ;X42
AND #0X0001,B ;新产生的1BIT将存入B中
LD *(p+1),-13,A ;42级移位 取中14位最高位填到高14位最低位
AND #0X0001,A
ADD *(p+2),1,A
AND #0X03FF,A
STL A,*(p+2) ;完成高14位移位
LD *(p),-13,A
AND #0X0001,A
ADD *(p+1),1,A
AND #0X03FF,A
STL A,*(p+1) ;完成中14位移位
LD *(p),1,A
XOR B,A ;反馈比特移入第一级
AND #0X03FF,A
STL A,*(p) ;完成低14位移位
bbc1: NOP
LD #0,B ;掩码与移存器状态相与模二加产生1BIT输出 秘钥 B长码输出
LD *(p),A
AND *(q),A
STM #13,BRC
RPTB bbc2-1
XOR A,B
SFTL A,-1
bbc2: LD *(p+1),A
AND *(q+1),A
STM #13,BRC
RPTB bbc3-1
XOR A,B
SFTL A,-1
bbc3: LD *(p+2),A
AND *(q+2),A
STM #13,BRC
RPTB bbc4-1
XOR A,B
SFTL A,-1
bbc4: AND #0X0001,B ;B中是输出的m序列比特 可以不判断直接模2加
BC bbc5,BNEQ ; B不等于0跳转 取反
MVDD *AR4+,*AR5+ ;m序列输出为0直接输出信息比特
B bbc6
bbc5: LD *AR4+,A
XOR #0X0001,A ; 取反
STL A,*AR5+ ;m序列输出不为0输出信息反比特
bbc6: BANZ bbc,*AR3- ;循环384 判断AR3是否为0,不为0跳回去
RET
*********************************************************************************
*扩频:正向CDMA信道使用64进制的沃尔什函数扩展频谱和区分信道。
*经过长码掩蔽的调制码元速率19.kb/s与1.2288Mc/s的沃尔什函数进行模2加,即进行扩频 *输入是加扰后的19.2b/s的数据存在W中384比特
*WALSH码表存在文件table.inc中,4个字一个64位W码,存在程序区
*PA8口输入W地址号
*扩频后数据存在wa中,384*4=1536 ,每个调制符号包含子码数为:64
*********************************************************************************
kuopin: STM #p,AR4 ;*(p)中是4个64位Wals地址正码 q wals地址反码
PORTR PA8,*(z) ;获得W地址号,Z为地址编号
LD *(z),2,A ;地址号*4 (4个字一个地址),形成偏移地址 一个wals占4个字
AND #0xfc,A ;1111 1100 保证偏移地址不超过64*4
STL A,*(z)
ADD #table_a,A ;table 在程序区,基址+偏移地址 形成 地址号对应的地址
RPT #3 ;将4个字的walsh码读进来,存在AR4中
READA *AR4+ ;累加器寻址
STM #p,AR4 ;p中是64位正码
STM #q,AR5 ;q中是64位反码
LD *AR4+,A ;取反码
CMPL A ;取反
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+
LD *AR4+,A
CMPL A
STL A,*AR5+ ;执行4次,完成walsh码4个字的取反工作
STM #wa,AR3 ;wa输出
STM #w,AR7 ;w输入
STM #383,BRC ;1个码元对应4个字的walsh码,384个码元重复384次
RPTB LOOP-1
LD *AR7+,A
STM #p,AR4 ;定位到正码,反码起始位置,;正极性沃尔什码
STM #q,AR5 ;反极性沃尔什码
BC LOOP1,ANEQ ;=0, 输出正码
MVDD *AR4+,*AR3+ ;输出正码
MVDD *AR4+,*AR3+
MVDD *AR4+,*AR3+
MVDD *AR4+,*AR3+
B LOOP-1
LOOP1: MVDD *AR5+,*AR3+ ;=1 输出反码
MVDD *AR5+,*AR3+ ;输出反码
MVDD *AR5+,*AR3+
MVDD *AR5+,*AR3+
NOP
LOOP: NOP
RET
**********************************************************************************
*I信道引导序列
*P1(x)=x15+x13+x9+x8+x7+x5+1
*v中记录上一个数据包结束PN1所在周期中的比特位置
*输入数据在wa中1536个字,输出在w中1536个字
*周期为2048个字
**********************************************************************************
pianzhi1: STM #wa,AR3 ;输入数据
STM #w,AR5 ;输出数据
LD #pn1,A ;引导序列起始地址
ADD *(v),A ;引导序列地址,绝对寻址
STLM A,AR4 ;AR4->引导序列地址
LD *(v),A
SUB #512,A ;PN序列,周期2048字,数据长1536字
BC ppp,AGQ ;若V大于512,数据需分两段序列(跨PN周期)模2加 V>512跳到ppp
STM #1535,BRC ;若起点V小于等于512,直接序列模2加
RPTB ppp1-1 ;循环1536次 序列周期均为215(32768),
LD *AR3+,A ;AR3输入
XOR *AR4+,A ;AR4 PN序列
STL A,*AR5+
ppp1: B ppp2
ppp: LD #2047,A ;V>512时,前半部分
SUB *(v),A
STLM A,BRC ;循环次数为2048-V BRC=2048-V-1
RPTB ppp3-1
LD *AR3+,A
XOR *AR4+,A ;PN序列 AR4开始时,指向V
STL A,*AR5+
ppp3: LD *(v),A ;后半部分
SUB #513,A ;循环次数为1536-(2048-V) = V-512 BRC=V-512-1
STLM A,BRC
STM #pn1,AR4 ;第二段数据与PN序列的起始相异或 因为PN序列是周期的
RPTB ppp2-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
ppp2: RET
**********************************************************************************
*Q信道引导序列
*PQ(x)=x15+x12+x11+x10+x6+x5+x4+x3+1
*v中记录上一个数据包结束PN1所在周期中的比特位置
*输入数据在wa中1536个字,输出在wa中1536个字
*周期2048个字
*对V地址进行更新
**********************************************************************************
pianzhi2: STM #wa,AR3 ;输入数据 输入和输出都是wa
STM #wa,AR5 ;输入数据
LD #pn2,A ;引导序列地址
ADD *(v),A ;引导序列起始地址
STLM A,AR4 ;引导序列
LD *(v),A
SUB #512,A
BC qqq,AGQ ;若V大于512,分两段序列模2加
STM #1535,BRC ;若起点V小于等于512,直接序列模2加
RPTB qqq1-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq1: LD *(v),A ;更新V地址, 为下一数据包
ADD #1536,A
STL A,*(v)
B qqq2
qqq: LD #2047,A
SUB *(v),A
STLM A,BRC ;循环次数为2048-V BRC=2048-V-1
RPTB qqq3-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq3: LD *(v),A
SUB #513,A ;循环次数为V-512 BRC=V-512-1
STLM A,BRC
STM #pn2,AR4
RPTB qqq2-1
LD *AR3+,A
XOR *AR4+,A
STL A,*AR5+
qqq2: LD *(v),A ;更新V地址
SUB #512,A
STL A,*(v)
RET
*******************************************************************
*QPSK调制器
*I信道数据在W中1536*16比特,Q信道数据在WA中1536*16比特
*IQ分别为00,01,10,11四种刺涑鏊闹衷ご娴牟ㄐ?每种波形8个样点
*cos+sin;cos-sin;sin-cos;-cos-sin四种波形
*对应位置为*iq,*iq+8,iq+16,iq+24
*******************************************************************
qpsk: STM #w,AR2 ;输入I信道
STM #wa,AR3 ;输入Q信道
STM #1535,BRC ;1536个字,调制 扩频结束1536字 左先来
RPTB kkk-1 ;每次循环完成一个字
LD #iq,A ;iq 合成波数据
BIT *AR2,15-0 ;输出0位
BC kkk1,NTC ;TC = 0时,地址不变
ADD #16,A ;TC = 1时,地址加16
kkk1: BIT *AR3,15-0 ;测试Q支路最低位
BC kkk2,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk2: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7 ;8个样点,每个样点存在一个数据单元
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-1 ;输出1位
BC kkk3,NTC
ADD #16,A
kkk3: BIT *AR3,15-1
BC kkk4,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk4: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-2 ;输出2位
BC kkk5,NTC
ADD #16,A
kkk5: BIT *AR3,15-2
BC kkk6,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk6: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-3 ;输出3位
BC kkk7,NTC
ADD #16,A
kkk7: BIT *AR3,15-3
BC kkk8,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk8: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-4 ;输出4位
BC kkk9,NTC
ADD #16,A
kkk9: BIT *AR3,15-4
BC kkk10,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk10: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-5 ;输出5位
BC kkk11,NTC
ADD #16,A
kkk11: BIT *AR3,15-5
BC kkk12,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk12: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-6 ;输出6位
BC kkk13,NTC
ADD #16,A
kkk13: BIT *AR3,15-6
BC kkk14,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk14: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-7 ;输出7位
BC kkk15,NTC
ADD #16,A
kkk15: BIT *AR3,15-7
BC kkk16,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk16: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-8 ;输出8位
BC kkk17,NTC
ADD #16,A
kkk17: BIT *AR3,15-8
BC kkk18,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk18: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波?个样点
LD #iq,A
BIT *AR2,15-9 ;输出9位
BC kkk19,NTC
ADD #16,A
kkk19: BIT *AR3,15-9
BC kkk20,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk20: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-10 ;输出10位
BC kkk21,NTC
ADD #16,A
kkk21: BIT *AR3,15-10
BC kkk22,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk22: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-11 ;输出11位
BC kkk23,NTC
ADD #16,A
kkk23: BIT *AR3,15-11
BC kkk24,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk24: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-12 ;输出12位
BC kkk25,NTC
ADD #16,A
kkk25: BIT *AR3,15-12
BC kkk26,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk26: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-13 ;输出13位
BC kkk27,NTC
ADD #16,A
kkk27: BIT *AR3,15-13
BC kkk28,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk28: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2,15-14 ;输出14位
BC kkk29,NTC
ADD #16,A
kkk29: BIT *AR3,15-14
BC kkk30,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk30: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
LD #iq,A
BIT *AR2+,15-15 ;输出15位处理下一个字
BC kkk31,NTC
ADD #16,A
kkk31: BIT *AR3+,15-15 ;输出15位处理下一个字
BC kkk32,NTC
ADD #8,A ;A=*iq,*iq+8,iq+16,iq+24
kkk32: STLM A,AR4 ;A=*iq,*iq+8,iq+16,iq+24
RPT #7
PORTW *AR4+,PA9 ;输出调制波形8个样点
kkk: RET
*********************************************************************
.end ;结束汇编
table_a: .sect        "table_a"
.word 0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0xffff,0xffff ;0-1
.word 0x0000,0xffff,0xffff,0x0000, 0x0000,0xffff,0x0000,0xffff ;2-3
.word 0x00ff,0xff00,0x00ff,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff ;4-5
.word 0x00ff,0x00ff,0xff00,0xff00, 0x00ff,0x00ff,0x00ff,0x00ff ;6-7
.word 0x0ff0,0x0ff0,0x0ff0,0x0ff0, 0x0ff0,0x0ff0,0xf00f,0xf00f ;8-9
.word 0x0ff0,0xf00f,0xf00f,0x0ff0, 0x0ff0,0xf00f,0x0ff0,0xf00f ;10-11
.word 0x0f0f,0xf0f0,0x0f0f,0xf0f0, 0x0f0f,0xf0f0,0xf0f0,0x0f0f ;12-13
.word 0x0f0f,0x0f0f,0xf0f0,0xf0f0, 0x0f0f,0x0f0f,0x0f0f,0x0f0f ;14-15
.word 0x3c3c,0x3c3c,0x3c3c,0x3c3c, 0x3c3c,0x3c3c,0xc3c3,0xc3c3 ;16-17
.word 0x3c3c,0xc3c3,0xc3c3,0x3c3c, 0x3c3c,0xc3c3,0x3c3c,0xc3c3 ;18-19
.word 0x3cc3,0xc33c,0x3cc3,0xc33c, 0x3cc3,0xc33c,0xc33c,0x3cc3 ;20-21
.word 0x3cc3,0x3cc3,0xc33c,0xc33c, 0x3cc3,0x3cc3,0x3cc3,0x3cc3 ;22-23
.word 0x33cc,0x33cc,0x33cc,0x33cc, 0x33cc,0x33cc,0xcc33,0xcc33 ;24-25
.word 0x33cc,0xcc33,0xcc33,0x33cc, 0x33cc,0xcc33,0x33cc,0xcc33 ;26-27
.word 0x3333,0xcccc,0x3333,0xcccc, 0x3333,0xcccc,0xcccc,0x3333 ;28-29
.word 0x3333,0x3333,0xcccc,0xcccc, 0x3333,0x3333,0x3333,0x3333 ;30-31
.word 0x6666,0x6666,0x6666,0x6666, 0x6666,0x6666,0x9999,0x9999 ;32-33
.word 0x6666,0x9999,0x9999,0x6666, 0x6666,0x9999,0x6666,0x9999 ;34-35
.word 0x6699,0x9966,0x6699,0x9966, 0x6699,0x9966,0x9966,0x6699 ;36-37
.word 0x6699,0x6699,0x9966,0x9966, 0x6699,0x6699,0x6699,0x6699 ;38-39
.word 0x6996,0x6996,0x6996,0x6996, 0x6996,0x6996,0x9669,0x9669 ;40-41
.word 0x6996,0x9669,0x9669,0x6996, 0x6996,0x9669,0x6996,0x9669 ;42-43
.word 0x6969,0x9696,0x6969,0x9696, 0x6969,0x9696,0x9696,0x6969 ;44-45
.word 0x6969,0x6969,0x9696,0x9696, 0x6969,0x6969,0x6969,0x6969 ;46-47
.word 0x5a5a,0x5a5a,0x5a5a,0x5a5a, 0x5a5a,0x5a5a,0xa5a5,0xa5a5 ;48-49
.word 0x5a5a,0xa5a5,0xa5a5,0x5a5a, 0x5a5a,0xa5a5,0x5a5a,0xa5a5 ;50-51
.word 0x5aa5,0xa55a,0x5aa5,0xa55a, 0x5aa5,0xa55a,0xa55a,0x5aa5 ;52-53
.word 0x5aa5,0x5aa5,0xa55a,0xa55a, 0x5aa5,0x5aa5,0x5aa5,0x5aa5 ;54-55
.word 0x55aa,0x55aa,0x55aa,0x55aa, 0x55aa,0x55aa,0xaa55,0xaa55 ;56-57
.word 0x55aa,0xaa55,0xaa55,0x55aa, 0x55aa,0xaa55,0x55aa,0xaa55 ;58-59
.word 0x5555,0xaaaa,0x5555,0xaaaa, 0x5555,0xaaaa,0xaaaa,0x5555 ;60-61
.word 0x5555,0x5555,0xaaaa,0xaaaa, 0x5555,0x5555,0x5555,0x5555 ;62-63
TSIZE: .set $-table_a
MEMORY
{
PAGE 0: VECS: origin = 0xff80, length = 0x80
PROG: origin = 0x2400, length = 0x1a00 PAGE 1: SPRAM: origin = 0x200, length = 0x2200
STACK: origin = 0x0080, length = 0x100
} SECTIONS
{
.vectors: {} > VECS PAGE 0
.text: {} > PROG PAGE 0
table_a: > PROG PAGE 0
.data > PROG PAGE 0
.bss: > SPRAM PAGE 1
.stack: {} > STACK PAGE 1
}

基于DSP的IS95正向业务信道模块设计的更多相关文章

  1. 基于 SOA 的组件化业务基础平台

    业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 “应用软件的业务描述和操作系统平台.软件基础架构平台之间的交互与管理问题”.操作系统平台解决了“应用软件系统与硬件之间的交互与管理问题” ...

  2. 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

    原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...

  3. OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...

  4. 基于SOA的组件化业务基础平台[转]

    转自https://www.ibm.com/developerworks/cn/webservices/1111_xiaojg_soa/index.html 业务基础平台是业务逻辑和基础架构平台之间的 ...

  5. [开源]OSharpNS 步步为营系列 - 1. 业务模块设计

    什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...

  6. [转载] 使用C/C++语言编写基于DSP程序的注意事项

    原文地址:『转』使用C/C++语言编写基于DSP程序的注意事项作者:skysmile   1.不影响执行速度的情况下,可以使用c或c/c++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师 ...

  7. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...

  8. 基于UML的毕业设计管理系统的分析与设计

    基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...

  9. 文献综述七:基于SSM的网上商城的开发与设计

    一.基本信息 标题:基于SSM的网上商城的开发与设计 时间:2018 出版源:Computer Knowledge and Technology 文件分类:对框架的研究 二.研究背景 为了解决现在电商 ...

随机推荐

  1. Nginx优化文件编写

    server_tokens off; #并不会让nginx执行的速度更快,关闭它可隐藏错误页面中的nginx版本号charset utf-8,gbk; #字符#sendfile on;#tcp_nop ...

  2. hdu 1160 FatMouse's Speed (最长上升子序列+打印路径)

    Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...

  3. A1139. First Contact

    Unlike in nowadays, the way that boys and girls expressing their feelings of love was quite subtle i ...

  4. 第五篇:数据备份、pymysql模块

    http://www.cnblogs.com/linhaifeng/articles/7525619.html#_label3 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们 ...

  5. django 前端模板继承显示model中使用choices的字段

    比如model中的一个class Need class Need(models.Model): """ 任务 """ party_a=mod ...

  6. Day30--Python--struct, socketserver

    1. struct struct.pack 打包 def pack(fmt, *args): # known case of _struct.pack """ pack( ...

  7. Elastic 基础篇(2)

    1.基本概念 1)Elastic和RDMS对比 RDMS Elastic 数据库database 索引index 表table 类型type 行row 文档document 列column 字段fie ...

  8. E212: Can't open file for writing

    意思是不能保存. 原因是权限不够,普通用户用vi 进行不了保存,需要使用超级用户才可以 命令:sudo su     转换成超级用户 vi hello       打开文件 :wq 即可保存退出

  9. 10款 Mac 经典原型设计开发软件推荐

    在Mac上有大量强大的开发和设计工具,今天和大家推荐10款Mac上的经典原型设计开发工具,原型设计工具是开发者必备的一款工具,无论是网站开发还是移动APP开发,都需要在前期进行严格细致的原型设计,才能 ...

  10. 定时任务调度-Celery

    确保任务不重叠解决方法: from celery import task from celery.five import monotonic from celery.utils.log import ...