亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ad_pcm.asm

?? dsp處理器進行adpcm編碼壓縮的c源代碼
?? ASM
字號:
******************************************************************************
******************************************************************************
****                 TMS320C54x用ADPCM編解碼程序V0.1                      ****
****                      All right reserved                              ****
****                         版權所有                                     ****
****                     程序設計:羅茂才                                  **** 
****                 E-mail: luomc@neusoft.com                            ****
****                         luomao2000@163.net                           ****
****                         luomao1977@sina.com                          ****
****                                                                      ****
****  本程序參照Stichting Mathematisch Centrum, Amsterdam,The Netherlands ****
****  所寫的C語言ADPCM編解碼程序設計,作者不承擔任何可能侵犯版權的后果。  ****
****                                                                      ****
****  允許自由使用、復制、修改、傳播該程序,可免費用于商業用途,但不得以  ****
****  該程序作為主體獲得利益。無論在什么情況下使用,都請保留該版權信息。  ****                 
****  作者不保證該程序能完全正確按照你的要求運行,所有由于使用該程序      ****
****  造成的損失,后果自負(呵呵,我可沒有特意留下什么隱患啊)。          ****
****  如果你利用了該程序,請告訴一聲(我想知道有多少人會使用這個程序)。    ****
****  如果你對該程序有任何建議、錯誤信息反饋等,敬請與作者聯系            ****
****  (請采用Algebraic assembly方式匯編該文件)                            ****
****                                                                      ****
****            感謝我的老婆給予我的愛、關心以及支持。                    **** 
****                                                  2003年7月31日       ****
******************************************************************************
******************************************************************************

*
* 編碼函數C語言聲明
* extern void AdpcmEncoder(int* pBufferIn, int* pBufferOut, 
*		   			       int* pPrevValue,int* pPrevIndex, int Length);
* 解碼函數C語言聲明(解碼長度為實際解碼后長度的1/4)
* extern void AdpcmDecoder(int* pBufferIn, int* pBufferOut, 
*					       int* pPrevValue,int* pPrevIndex, int Length);
*
* 編解碼后的PrevValue和PrevIndex都被修改,在后續的編解碼中將繼續被使用
*
* CCS2.1下測試通過

 .title "Intel/DVI ADPCM coder/decoder"
 .def _AdpcmEncoder
 .def _AdpcmDecoder
 .mmregs

 ;索引表 
 .data
IndexTable:    ; 實際上只用了15個,考慮到速度問題,有一個舍棄了 
   .word  -8, -5, -3, -1, 1, 3, 5, 8
   .word  8,  5,  3,  1, -1,-3,-5,-8
   
 ;步進量   
StepSizeTable:  ; 共84個
   .word     4,     5,     6,     7,    8,     9,   10,    11,    12,    14
   .word    16,    18,    20,    22,   25,    28,   32,    36,    42,    49
   .word    57,    67,    78,    90,  103,   118,  134,   152,   170,   189 
   .word   209,   230,   253,   279,  307,   337,  371,   408,   449,   494
   .word   544,   598,   658,   724,  796,   876,  963,  1060,  1166,  1282
   .word  1411,  1552,  1707,  1878, 2066,  2272, 2499,  2749,  3024,  3327
   .word  3660,  4026,  4428,  4871, 5358,  5894, 6484,  7132,  7845,  8630
   .word  9493, 10442, 11487, 12635,13899, 15289,16818, 18500, 20350, 22385
   .word 24623, 27086, 29794, 32767
 
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 寄存器使用規則(調用時不設置)
; AR0: 臨時變量
; AR2: 輸入緩沖區指針
; AR3: 輸出緩沖區指針
; AR4: 步進量地址指針
; AR5: 當前輸出數據計數器(0--3: 16位長度可保存4個編碼數據)
	.asg *SP(3), pBufferOut
	.asg *SP(4), pPrevValue
	.asg *SP(5), pPrevIndex
	.asg *SP(6), Length
	
	.asg *SP(0), PrevValue      ; 占用了這兩個堆棧位置,存放臨時數據
	.asg *SP(1), PrevIndex      ;
   .text
_AdpcmEncoder:
    TC = (*SP(4) == #0)         ; 首先檢測緩沖區長度是否為0,為0則結束
    if(TC) dgoto EncoderEnd
    AR5 = #4                    ; 設置計數器初值
    SP += -2                    ; 調整堆棧指針,以便利用其中的兩個子
	AR2 = A                     ; 讀取輸入緩沖區地址
    B = pBufferOut              ; 讀入輸出緩沖區地址
    AR3 = B
    B = pPrevValue              ; 讀入上次轉換值地址 
    AR0 = B
    ASM = #0
    SXM = 1                     ; 設置符號位擴展
    Length -= 1                 ; 長度減1
    A = pPrevIndex              ; 讀取上次轉換的索引
    B = *AR0                  
    AR0 = A
    PrevValue = B               ; 讀取上次轉換值        
    FRCT = 0 
    A = *AR0                    
    PrevIndex = A               ; 保存上次轉換索引
    A = Length                  ; 讀取轉換長度 
    BRC = A                     ; 設置塊循環計數器
    A = PrevIndex 
    DBLOCKREPEAT(EncoderLoopEnd-1)    ; 啟動塊循環(根據循環最后一條指令確定是1還是2)
    *AR3 = #0                   ; 輸出緩沖區第一個字清零
EncoderLoop:
    A += #StepSizeTable         ; 偏移 
    AR4 = A                     ; 取得步進基地址 + 偏移
    B = *AR2+                   ; 取得輸入緩沖區的值(沒有必要規范到-32768...+32767)
    B -= PrevValue              ; 獲得當前值與上次計算值之間的差值
	
    A = |B|                     ; 計算delta=diff/step,并將商規范到-8...+7
    REPEAT(#16)                 ; 循環減(做除法)多除了一次,相當于商×2
    SUBC(*AR4, A) 
    A += #1                     ; 調整0.5的差值
    A &= #0FFFFh                ; (清除高位無效數據) 
    A = A >> 1
    if(BGEQ) DGOTO EncoderSetDelta  ; 檢測是否是負數
    B = #7                      ; 將Delta數據規范到-8...+7
    A = MIN(A, B)
    
    A = -A                      ; 是負數,商取負
EncoderSetDelta:    
    ;B = #-8                    ; 已經規范到0--7了,取負數后也沒有關系
    ;A =MAX(A, B)

    T = A    
                                ; 計算PrevValue值,并將其規范到(-32768)--(+32767) 
    B = T*(*AR4)                ; 獲得Delta*Step的值,保存在B寄存器中
    B += PrevValue              ; 計算上次值與這次差值的和
    ;B += *AR4 >> 1
    B = B <<C 8                 ; 只有32位的飽和運算
    B = B <<C 8                 ; 移位操作比用max/min指令要快 
    saturate(B)                 ; 飽和成32位的數據
    
    ; 檢測是否需要將輸出指針移動到下一個字
    if(*AR5- != 0) DGOTO EncoderNoInc
    A &= #0Fh                    ; 保留低4位

    AR5 = #3                     ; 重新設置計數器
    *+AR3 = #0                   ; 輸出緩沖區清零
EncoderNoInc:
    PrevValue = hi(B)            ; 保存當前轉換結果
    B = A + *AR3 << 4            ; 將輸出緩沖區當前字左移4位,然后加上當前值 
    *AR3 = B                     ; 
    
    AR0 = A						 ; 取得更新后的索引 
    B = #0
    A = PrevIndex
    A += *AR0(IndexTable)        ; 基地址 + 偏移
    
    A = MAX(A, B)                ; 將PrevIndex規范到0-83
    B = #83
    A = MIN(A, B)
    PrevIndex = A
EncoderLoopEnd:    
    B = pPrevValue               ; 設置轉換后的PrevIndex和PrevValue
    AR0 = B
    A = pPrevIndex
    AR2 = A
    A = PrevIndex
    B = PrevValue 
    *AR2 = A
    SP += 2                      ; 將堆棧指針調整回原來的值
    *AR0 = B
    NOP                          ; 避免沖突用的
EncoderEnd:    
	RETURN
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
; 寄存器使用規則(調用時不設置)
; AR0: 臨時變量
; AR1: 當前轉換值
; AR2: 輸入緩沖區指針
; AR3: 輸出緩沖區指針
; AR4: 步進量地址指針
; AR5: 當前輸出數據計數器(0--3: 16位長度可保存4個編碼數據)
	.asg *SP(3), StepValue        ; 臨時變量,存放當前的輸入處理值(不斷左移4位)
	
_AdpcmDecoder:
	TC = (*SP(4) == #0) 
	if(TC) DGOTO DecoderEnd       ; 如果長度為0,退出
	AR5 = #3                      ; 設置循環計數器 
	SP -= 2                       ; 調整堆棧指針,以便有多余的兩個字可供臨時使用
	AR2 = A                       ; 取輸入緩沖區地址 
	A = pBufferOut                ; 取輸出緩沖區地址
    B = pPrevValue                ; 取存放上次轉換值變量的地址
    AR0 = B
    ASM = #0                      ; (好像沒有用)
    SXM = 1                       ; 設置符號位擴展
	AR3 = A                       ; 取得輸出緩沖區
    B= *AR0                       ; 取得PrevValue 
    A = pPrevIndex                ; 取PrevIndex的地址 
    AR0 = A                       ; 臨時存放地址(直接存會出錯(編譯得就不對)) 
    PrevValue = B                 ; 呵呵,終于取出來了  
    OVM = 1                       ; 溢出吧,我的兄弟,就等你了
    A = *AR0                      ; 讀取PrevIndex的值
    PrevIndex = A
	A = Length<<2                 ; 因為是16位操作,可存放4個轉換值,乘以4 
	A -= #1                       ; 減去1,循環次數要比實際次數少1
	BRC = A                       ; 設置塊循環計數器 
	A = *AR2+                     ; 取輸入緩沖區的值
	
	DBLOCKREPEAT(DecoderLoopEnd-1) ; 運轉起來吧,要不然飯都涼了
	StepValue = A                 ; 獲得當前處理值
	A = PrevIndex				  ; 取得當前index所對應的值
DecoderLoop:
	A += #StepSizeTable
	AR4 = A
	A = StepValue << 4            ; 取當前轉換值,獲得delta值(利用了符號擴展功能)
	StepValue = A      
	B = PrevValue
	B = B + hi(A)*(*AR4)          ; 獲得計算的差值
    ;B += *AR4 >> 1
    B = B <<C 8                   ; 因為只能進行32位的飽和運算,沒有辦法啦      
    B = B <<C 8                   ; 將數據規范到-32768...+32767
    saturate(B)
    
	if(*AR5- != 0) DGOTO DecoderNoInc
    *AR3+ = hi(B)
    PrevValue = hi(B)
	
	AR5 = #3                      ; 重新設置計數器
	B = *AR2+
	StepValue = B
DecoderNoInc:
    
	A = A >> 16                   ; 調整PrevIndex的值
	A &= #0Fh                     ; 并將其調整在0...83之間
    AR0 = A
    B = #0
    A = PrevIndex
    A += *AR0(IndexTable)
    A = MAX(A, B)                 
    B = #83
    A = MIN(A, B)
    PrevIndex = A
DecoderLoopEnd:    
    B = pPrevValue                 ; 設置PrevValue和PrevIndex
    AR0 = B
    B = PrevValue
    A = pPrevIndex
    AR2 = A
    A = PrevIndex
    *AR0 = B
    *AR2 = A
    SP += 2                        ; 將堆棧指針調整回原來的值
    NOP                            ; 避免沖突用的
DecoderEnd:    
    RETURN
    
 .end
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久精品一区二区三| 欧美二区在线观看| 欧美伊人久久久久久久久影院 | 91精品欧美福利在线观看| 在线视频你懂得一区| 亚洲成a人v欧美综合天堂下载| 日韩三级伦理片妻子的秘密按摩| 91浏览器打开| 国产精品萝li| 91福利小视频| 成人美女视频在线观看18| 麻豆91精品视频| 日韩精品国产欧美| 午夜精品福利在线| 精品一区二区综合| 国产一区二区0| 99久久国产综合精品色伊| 成人网在线播放| 欧美又粗又大又爽| 日韩精品一区国产麻豆| 久久综合九色综合97婷婷| 日韩欧美专区在线| 国产欧美日韩综合| 亚洲综合色网站| 亚洲精品日韩一| 亚洲成人精品影院| 国产精品一区一区三区| 在线观看一区二区视频| 日韩免费一区二区| 亚洲动漫第一页| 久久国产乱子精品免费女| 成人免费av网站| 欧美一区二区三区电影| 亚洲国产欧美日韩另类综合| 高清在线不卡av| 久久精品亚洲精品国产欧美kt∨| 亚洲欧洲中文日韩久久av乱码| 日韩成人午夜精品| 在线欧美日韩精品| 一区二区三区欧美视频| 免费观看日韩电影| 国产日产亚洲精品系列| 日本不卡一区二区三区高清视频| 岛国精品一区二区| 日韩欧美在线不卡| 美女久久久精品| 中文字幕一区视频| 成人av手机在线观看| 美国精品在线观看| 成人av免费网站| 中文字幕在线不卡视频| 成人精品国产福利| 欧美日韩在线免费视频| 国产日韩精品一区二区浪潮av | 激情小说欧美图片| 在线欧美日韩精品| 国产日韩高清在线| 天天综合色天天| 91网站在线观看视频| www国产成人| 免费高清在线视频一区·| 欧美亚洲国产一区二区三区| 国产精品网曝门| 丁香婷婷综合色啪| 久久女同性恋中文字幕| 日本不卡免费在线视频| 欧美日韩和欧美的一区二区| 亚洲精品欧美在线| 91视频免费播放| 亚洲欧洲另类国产综合| 国产成人亚洲综合色影视| 日韩欧美一级精品久久| 日韩激情av在线| 欧美日韩的一区二区| 亚洲电影激情视频网站| 欧美在线免费观看亚洲| 亚洲国产综合在线| 欧美日韩在线综合| 日韩av一级片| 日韩精品最新网址| 狠狠色丁香婷婷综合| 久久伊人蜜桃av一区二区| 狠狠色狠狠色综合| 国产女同性恋一区二区| 成人免费视频一区二区| 国产精品乱人伦中文| 成人理论电影网| 一区二区三区四区不卡视频| 在线欧美日韩国产| 日韩福利电影在线| 精品粉嫩aⅴ一区二区三区四区| 精品一区二区免费在线观看| 久久久无码精品亚洲日韩按摩| 国产宾馆实践打屁股91| 1区2区3区欧美| 日本久久一区二区| 麻豆精品新av中文字幕| 久久久不卡网国产精品二区| 成人性视频免费网站| 亚洲欧美视频在线观看视频| 欧美日韩在线综合| 国产精品一区二区91| 国产欧美日本一区视频| 91福利在线观看| 国产一区二区三区四区五区入口| 国产女主播在线一区二区| 欧美亚洲综合久久| 国产精品99久久久久久久女警| 亚洲三级在线看| 欧美不卡一二三| 色综合天天综合色综合av| 美腿丝袜在线亚洲一区| 国产精品国产自产拍高清av| 9191久久久久久久久久久| 波多野结衣在线一区| 日韩av在线播放中文字幕| 中文字幕一区二| 欧美tk—视频vk| 欧美日韩亚洲另类| 成人黄色大片在线观看| 欧美aa在线视频| 一区二区三区欧美在线观看| 国产午夜精品一区二区三区视频| 欧美视频中文字幕| 99久久伊人精品| 久久狠狠亚洲综合| 亚洲国产另类av| 亚洲人快播电影网| 久久精品欧美一区二区三区不卡| 制服视频三区第一页精品| 色综合天天综合网天天看片| 处破女av一区二区| 丝袜美腿亚洲色图| 午夜精品久久久久久| 亚洲乱码国产乱码精品精的特点| 精品久久一区二区三区| 这里只有精品免费| 欧美视频在线观看一区二区| 91一区在线观看| 99久久精品国产毛片| 国产91精品露脸国语对白| 国产一区二三区好的| 免费观看在线色综合| 日韩和欧美的一区| 爽好久久久欧美精品| 亚洲国产成人高清精品| 一区二区三区四区不卡在线 | 一色屋精品亚洲香蕉网站| 久久综合色播五月| 精品久久一区二区三区| 日韩免费看网站| 精品国产一区二区三区忘忧草| 91精品国产综合久久精品图片| 欧美日韩国产成人在线免费| 欧美揉bbbbb揉bbbbb| 精品视频在线看| 欧美一卡二卡三卡| 精品少妇一区二区三区免费观看 | 国产一区二区三区精品欧美日韩一区二区三区 | 一二三四社区欧美黄| 最新成人av在线| 亚洲激情av在线| 亚洲一二三区视频在线观看| 亚洲电影你懂得| 久久精品国产一区二区| 狠狠色狠狠色综合| 成人av网站在线观看免费| 97久久超碰国产精品电影| 91传媒视频在线播放| 51精品国自产在线| 精品99999| 17c精品麻豆一区二区免费| 亚洲伦理在线精品| 日本不卡免费在线视频| 国产精品一区二区免费不卡| 成人黄色国产精品网站大全在线免费观看| gogogo免费视频观看亚洲一| 欧美性猛片aaaaaaa做受| 日韩一级二级三级精品视频| 久久久精品欧美丰满| 一区二区三区不卡视频| 激情五月婷婷综合网| 99久久777色| 日韩精品一区二区三区四区视频| 久久久久久亚洲综合| 亚洲码国产岛国毛片在线| 麻豆精品一区二区综合av| 91香蕉视频mp4| 精品久久一区二区| 亚洲国产视频a| 国产在线精品一区在线观看麻豆| 91原创在线视频| 久久久不卡网国产精品一区| 一区二区三区在线视频免费观看 | 亚洲人123区| 毛片一区二区三区| 色婷婷综合久色| 久久久久久久精| 亚洲国产色一区| 91原创在线视频|