⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function_lib_s.sa

📁 网络中交换节点的上数据的交换和下行数据分发的硬件实现
💻 SA
字号:

;本函数用于将确定地址的数据赋给变量或数组。
;sr_addr是源地址,ds_addr是目的地址,
;count是数据长度(flag=0时以字节为单位,flag=1时以2字节为单位,
;flag=2时以4字节为单位)



              .global    _memcopy
        
        
_memcopy:     .cproc     sr_addr,ds_addr,count,flag
              
              .reg      br0,br1
              
              mvk        5,br1
              
  ;  [!flag]   b         memb           
              sub       flag,0x1,flag
    [!flag]   b         memh
           
memw:         ldw      *sr_addr++,br0
              
              shr      br1,1,br1
              
              stw      br0,*ds_addr++
              sub      count,0x1,count
    [count]   b        memw
              b        memend
              
memh:         ldh      *sr_addr++,br0
              sth      br0,*ds_addr++
              sub      count,0x1,count
    [count]   b        memh
              b        memend                                    
                            
;memb:         ldb       *sr_addr++,br0
;              stb       br0,*ds_addr++
;              sub       count,0x1,count
;    [count]   b         memb                        
              
memend:         
              .endproc
              
              
              
              

;本函数用于读取内存中的数据。
;addr是内存地址,flag是数据类型标志,
;0表示字符型数据,1表示短整型(16位),2表示整型(32位)。




           .global    _peek
        
        
_peek:     .cproc     addr,flag  
          
           mv         addr,a0
           mv         flag,a2
           
           cmpeq      0x0,a2,b0
           cmpeq      0x1,a2,b1
           cmpeq      0x2,a2,b2
           
    [b0]   ldb        *a0,a1
    
    [b1]   ldh        *a0,a1
                      
    [b2]   ldw        *a0,a1
              
    
           .return     a1
           
           .endproc
           
           
           
           
           

;本函数用于向内存写入数据。
;addr是内存地址,data是要写入的数据,flag是数据类型标志,
;0表示字符型数据,1表示短整型(16位)2表示整型(32位)。




           .global    _poke
        
        
_poke:     .cproc     addr,data,flag  
           
           
           mv         addr,a0
           mv         data,a1
           mv         flag,a2
           
           cmpeq      0x0,a2,b0
           cmpeq      0x1,a2,b1
           cmpeq      0x2,a2,b2
           
   [b0]    stb        a1,*a0
   
   [b1]    sth        a1,*a0
   
   [b2]    stw        a1,*a0
   
   
           .endproc
            

;本函数用于将内存中的数据写入FLASH
;sr_addr是内存地址,ds_addr是FLASH地址,count是数据长度(以4字节为单位)           
          
           .global _flash_w
           
_flash_w:  .cproc   sr_addr,ds_addr,count

           .reg    ar0,ar1,ar2,ar3
           .reg    br0,br1,br2,br3,br4,br5,br6,br7
           
           mvkl  0x1401554,ar1
           mvkh  0x1401554,ar1
          
           mvkl  0x1400aa8,ar2
           mvkh  0x1400aa8,ar2
          
           mvkl  0x00aa00aa,br1
           mvkh  0x00aa00aa,br1
          
           mvkl  0x550055,br2
           mvkh  0x550055,br2
          
           mvkl  0x00a000a0,br3
           mvkh  0x00a000a0,br3
          
           mvkl  0x200020,br5
           mvkh  0x200020,br5
          
           mvkl  0x900090,br6
           mvkh  0x900090,br6
          
           zero  br7  
          
           stw  br1,*ar1
           stw  br2,*ar2
           stw  br5,*ar1
          
label1:          
           stw  br3,*ar1 
           
           ldw  *sr_addr++,br4
           stw  br4,*ds_addr++
           
           sub  ds_addr,0x4,ar3
label2:    ldw  *ar3,br0
           cmpeq br0,br4,br5
  [!br5]   b    label2     
           
           sub  count,0x1,count
          
          
  [count]  b   label1
   
           stw br6,*ar1
           stw br7,*ar1

           .endproc
           
           

;本函数用于整片擦除FLASH           
           
           .global _erase 

_erase:    .cproc

           .reg  ar1,ar2,ar3
           .reg  br0,br1,br2,br3,br4,br5,br6
           
           mvkl 0x1401554,ar1
           mvkh 0x1401554,ar1
          
           mvkl 0x1400aa8,ar2
           mvkh 0x1400aa8,ar2
           
           mvkl 0xaa00aa,br1
           mvkh 0xaa00aa,br1
           
           mvkl 0x550055,br2
           mvkh 0x550055,br2
           
           mvkl 0x800080,br3
           mvkh 0x800080,br3
           
           mvkl 0x100010,br4
           mvkh 0x100010,br4
           
           mvkl 0xffffffff,br5
           mvkh 0xffffffff,br5
           
           mvkl 0x1400000,ar3
           mvkh 0x1400000,ar3
           
           stw  br1,*ar1
           stw  br2,*ar2
           stw  br3,*ar1
           stw  br1,*ar1
           stw  br2,*ar2
           stw  br4,*ar1 
           
label6:    ldw  *ar3,br6
           cmpeq br6,br5,br0
   [!br0]  b  label6
   
           .endproc
           
           

;本函数用于DSP向主机发中断 

           .global _dtopi 

_dtopi:    .cproc 

           .reg ar0
           .reg br0,br1,br2
           
         ;  mvkl  0x01A7fff0,ar0
        ;   mvkh  0x01A7fff0,ar0         ;hsr寄存器地址
           
         ;  mvk 0x0,br2
           
         ;  stw br2,*ar0
           
           
           mvkl  0x01800014,ar0
           mvkh  0x01800014,ar0         ;CE3寄存器地址
           
           mvkl  0x11210622,br2
           mvkh  0x11210622,br2
           
           stw   br2,*ar0
           
           mvkl  0x2050000,br0          ;触发中断
           mvkh  0x2050000,br0
           
           mvkl  0x01,br1
           mvkh  0x01,br1
           
           stw   br1,*br0
           
                 
                       
                                   ;向主机发中断  
           
           .endproc 
           
           
           
;本函数用于擦除指定的flash扇区
;sec_addr是要擦除的扇区地址

           
           .global _secerase 

_secerase:    .cproc  sec_addr 
           
               
           .reg  ar1,ar2,ar3
           .reg  br0,br1,br2,br3,br4,br5,br6
            
            
           mvkl 0x1401554,ar1
           mvkh 0x1401554,ar1
          
           mvkl 0x1400aa8,ar2
           mvkh 0x1400aa8,ar2
           
          
           mvkl 0xaa00aa,br1
           mvkh 0xaa00aa,br1
           
           mvkl 0x550055,br2
           mvkh 0x550055,br2
           
           mvkl 0x800080,br3
           mvkh 0x800080,br3
           
           mvkl 0x300030,br4
           mvkh 0x300030,br4
           
           mvkl 0xffffffff,br5
           mvkh 0xffffffff,br5
                     
           
           stw  br1,*ar1
           stw  br2,*ar2
           stw  br3,*ar1
           stw  br1,*ar1
           stw  br2,*ar2
           stw  br4,*sec_addr 
           
label7:    ldw  *sec_addr,br6
           cmpeq br6,br5,br0
   [!br0]  b  label7
   
           .endproc           
                      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -