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

📄 fmult.asm

📁 利用G.723协议在DSP实现音频信号的压缩与解压缩实验
💻 ASM
字号:
;/*
; * fmult()
; *
; * returns the integer product of the 14-bit integer "an" and
; * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
; */
;static short
;fmult(
;	int		an,
;	int		srn)
;{
;	short		anmag, anexp, anmant;
;	short		wanexp /*wanmag*/;
;	short        wanmant;
;	short		retval;
;
;	anmag = (an > 0) ? an : ((-an) & 0x1FFF);
;	anexp = quan(anmag, power2, 15) - 6;
;	anmant = (anmag == 0) ? 32 :
;	    (anexp >= 0) ? shr(anmag ,anexp) : shl(anmag , -anexp);   //not necessary
;	wanexp = anexp + ((srn >> 6) & 0xF) - 13;
;
;	wanmant = (anmant * (srn & 077) + 0x30) >> 4;
;	retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :shr(wanmant,-wanexp);
;	    //(wanmant >> -wanexp);
;
;	return (((an ^ srn) < 0) ? -retval : retval);
;}
;-----------------------------------------------------------------------------
               .title   "fmult.asm"
               .include "g723_global.asm"
               .include "g723tab_h.asm"
               .include "g723_stat.asm"
               .mmregs
arg_an         .set        0
arg_srn        .set        1
temp_anmant    .set        2
temp_anexp     .set        3
temp_r         .set        4
temp_wanexp    .set        5
temp_wanmant   .set        6

               .text
              
fmult:          ;A=an, B=srn
      frame    #-7 
      rsbx     FRCT
      bcd       an1, AGT  
      stl      A, *SP(arg_an)
      stl      B, *SP(arg_srn)   
      neg      A              
      and      #0x1fff, A
an1:
      ;
      stm      #tab_power2, AR3     
      ld       A, B
      pshm     AR4
      pshm     AR5
      call     quan
      popm     AR5
      popm     AR4
      sub      #6, B
      stl      B, *SP(temp_anexp)
      bc       anmag1, AEQ   ;A=anmag
      ;nop
      ;bc       anexp1, BLT
      neg      B
      stlm     B, T
      nop
      nop
      norm     A       ;A=anmant
      b        end_anmag
anmag1:
      ld       #32, A  ;A=anmant
end_anmag    
      stl      A, *SP(temp_anmant)  ;A=anmant
      nop
      ld       *SP(arg_srn), -6, A
      and      #0xf, A 
      sub      #13, A
      add      *SP(temp_anexp), A  ;A=wanexp
      stl      A, *SP(temp_wanexp)
      ld       *SP(arg_srn), A
      and      #077, A    ;077是8进制    
      nop
      nop
      nop
      nop
      stl      A, *SP(temp_r)   ;临时变量,在不同时期存储不同变量的值
      ld       *SP(temp_anmant), 16, A
      mpya     *SP(temp_r)
      add      #0x30, B
      sfta     B, -4  ;B=wanmant
      stl      B, *SP(temp_wanmant)      
      
      ld       *SP(temp_wanexp), A
      ld       #-16, B
      max      B
      stlm     B, T
      nop
      nop
      ld       *SP(temp_wanexp), A
      ld       *SP(temp_wanmant), B 
      norm     B  
      nop  
      xc       2, AGEQ
      and      #0x7fff, B   ;B=retval
      stl      B, *SP(temp_r)
      ld       *SP(arg_an), A
      ld       *SP(arg_srn),B
      ;xor      *SP(arg_srn), A
      xor      B, A
      nop
      ld       *SP(temp_r), B
      xc       1, ALT 
      neg      B   
      ld       B, A      
      frame     #7
      ret

               .end

⌨️ 快捷键说明

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