基于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
}
posted @ 2019-01-16 13:18  KwinWei  阅读(1317)  评论(0编辑  收藏  举报