基于DSP的IS95正向业务信道模块设计
**定时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 }