网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C5000 >> 文章正文
  TI DSP5000系列的DSP汇编源代码         ★★★ 【字体:
TI DSP5000系列的DSP汇编源代码
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-17    

;---------------------
;JPEG编码
;---------------------
JPEGEN.ASM
      .MMREGS
      .GLOBAL JPEG_EN
      .DEF JPEG_EN
      .DEF J_STATUS,J_STACK
      .REF PICT,NEXT_LINE
      .REF IMAGE_LENGTH,IMAGE_WIDTH
      .REF BLOCK_ENCODE,HUFF_EN
      .REF DCT_CODE,Y_QUANTIZE_TABLE

      .REF QUANT_TABLE,ZIGZAG_TABLE
      .REF DCTB1,COMPRESS_DATA
      .REF MASKDATA,MASKSIZE,EOB
      .REF DIFF1,RZERO,IN_SIZE,COWORD
      .REF ABSDIFF,ABSDIFF1,TRANSDIFF
      .REF DC_HEAD,DC_TAIL,LESS_BIT
      .REF DIFF,USER_BIT,RNDOFF
      .REF LAST_DC,LAST_RESULT
      .REF ZIGZAG_TABLE0,RDCHUFF
      .REF DCHUFF,NEXT_SECTION
      .BSS J_STATUS,2

J_STACK         .USECT "J_STACK",10H
DCTB1_ADDR      .SET DCTB1
                .TEXT

JPEG_EN:

;----------------------
;保存程序运行环境
;----------------------
       MVMD ST0,J_STATUS
       MVMD ST1,J_STATUS+1
       LD #J_STACK,DP
       MVMD AR1,J_STACK+1
       MVMD AR2,J_STACK+2
       MVMD AR3,J_STACK+3
       MVMD AR4,J_STACK+4
       MVMD AR5,J_STACK+5
       POPD J_STACK+8
;------------------------
;JPEG编码初始化
;------------------------

      CALL JPEG_EN_INIT
      STM #IMAGE_WIDTH-1,AR7
BLOCKEN_LOOP0:
      STM #IMAGE_LENGTH-1,AR6
BLOCKEN_LOOP:
;--------------------------
;块编码
;--------------------------
        CALL BLOCK_INIT
        CALL BLOCK_ENCODE
        MAR AR6
 BANZ BLOCK_LOOP,#AR6-
 STM #NEXT_SECTION,AR0
 MAR AR4
 MAR *AR4+0
 MAR AR7
 BANZ BLOCKEN_LOOP0,*AR7-
;----------------------------
;恢复程序运行环境
;----------------------------

 LD #J_STACK,DP
 PSHD J_STACK+8
 MVMD J_STACK+5,AR5 
 MVMD J_STACK+4,AR4 
 MVMD J_STACK+3,AR3 
 MVMD J_STACK+2,AR2 
 MVMD J_STACK+1,AR1
 LD #0,DP
 MVMD J_STATUS+1,ST1
        MVMD J_STATUS,ST0
        RET
;--------------------------
;块编码初始化
;--------------------------
BLOCK_INIT;
 STM #NEXT_LINE,AR0
 MAR AR4
 RPT #7
 MVDK *AR4,#DCTB1
 MAR *AR4+0
 RPT #7
 MVDK *AR4+,#DCTB1+8
 MAR *AR4+0
 RPT #7
 MVDK *AR4+,#DCTB1+16
 MAR *AR4+0
 PRT #7 
 
 MVDK *AR4+,#DCTB1+24
 MAR *AR4+0
 RPT #7
        MVDK *AR4+,#DCTB1+32
 MAR *AR4+0
 RPT #7
        MVDK *AR4+,#DCTB1+40
 MAR *AR4+0
 RPT #7
        MVDK *AR4+,#DCTB1+48
 MAR *AR4+0
 RPT #7
        MVDK *AR4+,#DCTB1+56
 STM #NEXT_SECTION,AR0
 MAR *AR4-0
 MAR AR2
 STM #DCTB1,AR2
 STM #63,AR3
JI_LOOP:
 MAR AR2
 LD *AR2,A
 SUB #128,A
 STLM A,*AR2+
 MAR AR3
 BANZ JI_LOOP,*AR3-
 LD #RNDOFF,DP
 STM #800OH,RNDOFF
 RET
;----------------------------
;JPEG编码初始化
;包括DCT、量化和Huffman编码三部分
;-----------------------------
JPEG_EN_INIT:
DCT_INIT
 ORM #0000H,PMST
 RSBX OVLY
 SSBX SXM
 SSBX OVM
 MAR AR5
 STM #0FF00H,AR5
 RPT #63
 MVPD #DCT_COEF,*AR5+
 ORM #0020H,PMST
 SSBX OVLY
QUANT_INIT
 MAR AR5
 STM #QUANT_TABLE,AR5
 RPT #63
 MVPD #Y_QUANTIZE_TABLE,*AR5+
 STM #ZIGZAG_TABLE,AR5
 RPT #63
 MVPD #ZIGZAG_TABLE0,*AR5+
HUFFEN_INIT:
 STM #DCHUFF,AR1
 MAR AR1
 RPT #220
 MVPD #RDCHUFF,*AR1+
 STM #COMPRESS_DATA,AR1
 LD #0,A
 RPT #255
 STM 0,*AR1+
 STM #COMPRESS_DATA,AR5
 STM #PICT,AR4
 LD #DIFF,DP
 ST #0FFF0H,MASKDATA
 ST #0F000H,MASKSIZE
 ST #0AH,EOB
 ST #0H,LAST_DC
 ST #0H,LAST_RESULT
 ST #010H,USER_BIT
 ST #0H,LESS_BIT
 RET
;------------------------
;块编码
;------------------------
BLOCKEN.ASM
 .MMREGS
 .DEF BLOCK_ENCODE,IDCT
 .DEF RNDOFF,BLK2_ADDR,DCTB1
 .DEF QUANT_TABLE,ZIGZAG_TABLE
 .DEF B_STATUS,B_STACK
 .REF DCT_CODE,Y_QUANTIZE_TABLE
 .REF MAX_VALUE,MIN_VALUE
 .DEF DIFF,DIFF1,ABSDIFF,ABSDIFF1
 .DEF RZERO,IN_SIZE,COWORD,EOB
 .DEF MASKDATA,MASKSIZE
 .DEF SRC,DST,DC_TAIL,DC_HEAD
 .DEF ACHUFF,DCHUFF,LMASK
 .DEF QZBI,QZBR,LESS_BIT,DATA
 .DEF HUFF_EN,DCT2,EOB_SIZE
 .DEF DCHUFF,TRANSDIFF,LAST_DC
 .DEF LAST_RESULT,USER_BIT
 .REF RDCHUFF,DIFFSIZE
 .REF COMPRESS_DATA
 .REF ZIGZAG_TABLE0
 
 B_STACK  .USER".B_STACK",10H


RNDOFF  .USECT".DCT_VAR",1
DCTB1  .USECT"DCT_BLK",64
DCTB2  .USECT"DCT_BLK",64
QZBI  .USECT".QZ_BLK",64
QZBR  .USECT".QZ_BLK",64
QUANT_TABLE .USECT".QZ_TBL",64
ZIGZAG_TABLE .USECT".QZ_TBL",64
DIFF  .USECT".HUF_VAR",1
DIFF1  .USECT".HUF_VAR",1
ABSDIFF  .USECT".HUF_VAR",1
ABSDIFF1 .USECT".HUF_VAR",1
RZERO  .USECT".HUF_VAR",1
IN_SIZE  .USECT".HUF_VAR",1
COWORD  .USECT".HUF_VAR",1
TRANSDIFF .USECT".HUF_VAR",1
MASKDATA .USECT".HUF_VAR",1
MASKSIZE .USECT".HUF_VAR",1
EOB  .USECT".HUF_VAR",1
LAST_DC  .USECT".HUF_VAR",1
LAST_RESULT .USECT".HUF_VAR",1
USER_BIT .USECT".HUF_VAR",1
LESS_BIT .USECT".HUF_VAR",1
DC_HEAD  .USECT".HUF_VAR",1
DC TALL  .USECT".HUF_VAR",1
BLOCK_NUMBER .USECT".HUF_VAR",1
SRC  .USECT".HUF_VAR",1
DST  .USECT".HUF_VAR",1
LENGTH  .USECT".HUF_VAR",1
DATA  .USECT".HUF_VAE",12R",1
DCHUFF  .USECT"HUFTABL
DIFFSIZE .USECT"HUFTABLE",16
LMASK  .USECT"HUFTABLE",17
ACHUFF  .USECT"HUFTABLE",176
  .BSS B_STATUS,2
EOB_SIZE .SET 4
BLK2_ADDR.SET QZBR
 .TEXT
BLOCK_ENCODE
;----------------------------------
;保存程序运行环境
;----------------------------------
MVMD ST0,B_STATUS
MVMD ST1,B_STATUS+1
LD #B_STACK,DP
MVMD AR1,B_STACK
MVMD AR2,B_STACK+1
MVMD AR3,B_STACK+2
MVMD AR6,B_STACK+3
POPD B_STACK+4
;----------------------------------
;块编码包括DCT、量化和Huffman编码三部分
;----------------------------------
CALL DCT
CALL QUANT
CALL HUFF_EN
;----------------------------------
;恢复程序运行环境
;----------------------------------
LD #B_STACK,DP
PSHD B_STACK+4
MVDM B_STACK+3,AR6
MVDM B_STACK+2,AR3
MVDM B_STACK+1,AR2
MVDM B_STACK,AR1
LD #0,DP
MVDM B_STATUS+1,ST1
MVDM B_STATUS,ST0
RET
;-----------------------------------
;DCT与IDCT
;-----------------------------------
IDCT:
DCT:
 STM #DCTB1,AR1
 STM #DCTB2,AR2
 CALL DCT1D
 STM #DCTB2,AR1
 STM #DCTB1,AR2
 CALL DCT1D
 RET
;-----------------------------------
;一维DCT变换
;----------------------------------
DCT1D:
 STM #64,AR0
 LD #RNDOFF,DP
 MAR AR1
 STM #7,AR3
ROW1:
 MAR AR1
 LD #0,A
 RPT #7
 MACP *AR1+,0FF00H,A
 MAR AR2
 ADDS RNDOFF,A
 STH A,*AR2+
 MAR AR3
 BANZ ROW1,*AR3-
 MAR *AR1-0
 ST #7,AR3
ROW2:
 MAR AR1
 LD #0,A
 RPT #7
 MACP *AR1+,0FF08H,A
 MAR AR2
 ADDS RNDOFF,A
 STH A,*AR2+
 MAR AR3
 BANZ ROW2,*AR3-
 MAR *AR1-0
 ST #7,AR3
ROW3:
 MAR AR1
 LD #0,A
 RPT #7
 MACP *AR1+,0FF10H,A
 MAR AR2
 ADDS RNDOFF,A
 STH A,*AR2+
 MAR AR3
 BANZ ROW3,*AR3-
 MAR *AR1-0
 ST #7,AR3
ROW4:
 MAR AR1
 LD #0,A
 RPT #7
 MACP *AR1+,0FF18H,A
 MAR AR2
 ADDS RNDOFF,A
 STH A,*AR2+
 MAR AR3
 BANZ ROW4,*AR3-
 MAR *AR1-0
 ST #7,AR3
ROW5:
 MAR AR1
 LD #0,A
 RPT #7
 ADDS RNDOFF,A
 STH A,*AR2+
 MAR AR3
 BANZ ROW8,*AR3-
 MAR *AR1
 RET 
;------------------------
;量化
;注意ZIGZAG表的应用
;量化间隔是不均匀的
;------------------------
QUANT:
 STM #63,AR0
 STM #DCTB1,AR1
 STM #ZIGZAG_TABLE,AR2
 STM #QUANT_TABLE,AR6
Q_LOOP:
 MAR AR2
 MVDK *AR2+,AR3
 MAR AR1
 MVDK *AR1+,T
 MAR AR6
 MPY *AR6+,A
 ADD #0,1,A,A
 MAR AR3
 ADDS RNDOFF,A
 STH A,*AR3
 MAR AR0
 BANZ Q_LOOP,*AR0-
 RET
;------------------------
;Huffman编码
;------------------------
HUFF_EN:
  LD #DIFF,DP
  LD #0,A
  STL A,DIFF
  STL A,IN_SIZE
  STL A,RZERO
DCENHUFF:
  MAR AR1
  STM #QZBR,AR1
  LD *AR1,A
  SUB LAST_DC,A
  CALL GSIZE
  MAR AR3
  STM #DCHUFF,AR3
  MVDM ABSDIFF,AR0
  MAR *AR3+0
  LD *AR3-0,12,A
  MAR AR5
  CALL GCOWORD
ACENHUFF:
  STM #QZBR,AR1
  STM #3EH,AR6
  MAR AR1
  LD *AR1+,A
  STL A,LAST_DC
CHECKZERO:
  LD *AR1+,A
  MAR AR6
  BC CKZERO,AEQ
  CALL GSIZE
CONCHECK:
  LD RZERO.A
  SUB #10H,A
  BC NEXT1,ALT
  LTD ABSDIFF
  LTD DIFF
  STL A,RZERO
  LD #07F9BH,12,A
  STL A,4,ABSDIFF
  STL A,4,DIFF
  CALL GCOWORD
  LD ABSDIFF1,A
  STL A,ABSDIFF
  LD DIFF1,A
  B CONCHECK
NEXT1:
  RSBX SXM
  LD RZERO,A
  ADD ABSDIFF,4,A
  STL A,TRANSDIFF
  MAR AR3
  MVDM ACHUFF,AR3
  MVDM TRANSDIFF,AR0
  MAR *AR3+0
  BIT *AR3,15
  BC NOUSER_16,NTC
  BIT *AR3,7
  BC NOUSER_16,NTC
USER_16:
  LD *AR3-0,16,A
  B CONTE
NOUSER_16:
  LD *AR3-0,12,A
  MAR AR5
CONTE:
  MAR AR5
  CALL GCOWORD
  LD #0,A
  STL A,RZERO
  MAR AR6
  BANZ CHEKZERO,*ARC6-
  B INSERT_EOB
CKZERO:
  MAR AR6
  LD RZERO,A
  ADD #1H,A
  STL A,RZERO
  BANZ CHECKZERO,*AR6-
INSERT_EOB:
  MAR AR3
  STM ACHUFF,AR3
  LD *AR3,12,A
  STL A,4,ABSDIFF
  STL A,4,DIFF
  CALL GCOWORD
  RET
GSIZE:
  MAR AR2
  STL A,DIFF
  BITF DIFF,#8000H
  BC POSTIVE,NTC
NEGATIVE:
  ABS A
  CMPL A
  STL A,DIFF
  CMPL A
POSTIVE:
  STL A,ABSDIFF
  AND MASKDATA,A
  MAR AR2
  BC GETSIZE,AEQ
  LD ABSDIFF,12,A
  STH A,ABSDIFF
  LDU IN_SIZE,A
  ADD #04H,A
  STL A,IN_SIZE
  LDU ABSDIFF,A
  B POSTIVE
GETSIZE:
  MAR AR2
  STM DIFFSIZE,AR2
  STM ABSDIFF,AR0
  LD *AR2+0,A
  ADD IN_SIZE,A
  STL A,ABSDIFF
  STH A,IN_SIZE
  STM LMASK,AR2
  STM ABSDIFF,AR0
  LD *AR2+0,A
  AND DIFF,A
  RET
GCOWORD:
  MAR AR5
  STH A,COWORD
  AND MASKSIZE,A
  BC NOT_16,ANEQ
  ADD #10,12,A
NOT_16:
  SUB USER_BIT,12,A
  NEG A
  STH A,4,USER_BIT
  BC SHIFT_LT,AGT
NEWORDL:
  LD USER_BIT,A
  ADD #10H,A
  STL A,USER_BIT
  LD USER_BIT,T
  LD *AR5,16,A
  ADD COWORD,TS,A
  STH A,*AR5+
  STL A,*AR5
  B CONDIFF
SHIFT_LT:
  LD USER_BIT,T
  LD *AR5,A
  ADD COWORD,TS,A
  STL A,*AR5
CONDIFF:
  LD USER_BIT,A
  SUB ABSDIFF,A
  STL A,USER_BIT
  BC NORMALS,AGT
NEWORD2:
  ADD #10H,A
  STL A,USER_BIT
  LD USER_BIT,T
  LD *AR5,16,A
  ADD DIFF,TS,A
  STH A,*AR5+
  STL A,*AR5
  B ENDSUB

NORMALS:
  LD USER_BIT,T
  LD *AR5,A
  ADD DIFF,TS,A
  STL A,*AR5
ENDSUB:
  SSBX SXM
  RET
;-----------------------
;JPEG编码
;-----------------------
JPEGDE.ASM
  .MMREGS
  .DEF JPEG_DEC
  .REF PICT,NEXT_SECTION,NEXT_LINE
  .REF IMAGE_LENGTH,IMAGE_WIDTH
  .REF BLOCK_DECODE,DCTB1
  .REF ZIGZAG_TABLE1,IDCT_COEF
  .REF J_STATUS,J_STACK,D12TAB
  .REF Y_DQUANTIZE_TABLE
  .REF RD48TAB,RD12TAB,LOWMASK
  .REF HDCDECODE_TABLE,DCDETAB
  .REF DZIGZAG_TABLE,DETABLE
  .REF DC_TAIL,DATA,LESS_BIT
  .REF DQZBR,DQZB1,DQUANT_TABLE
  .REF EMASK,COMPRESS_DATA,DST
  .REF MASKDATA,MASKSIZE,EOB
  .REF LASTRESULT,USER_BIT
  .REF LAST_DC
  
  BLOCK_RESULT .SET DCTB1
     .TEXT
JPEG_DEC:
;--------------------------------
;保存程序运行环境
;--------------------------------
  MVMD ST0,J_STATUS
  MVMD ST1,J_STATUS+1
  LD #J_STACK,DP
  MVMD AR1,J_STACK+1
  MVMD AR2,J_STACK+2
  MVMD AR3,J_STACK+3
  MVMD AR4,J_STACK+4
  MVMD AR5,J_STACK+5
  MVMD AR6,J_STACK+6
  MVMD AR7,J_STACK+7
  POPD J_STACK+8
;--------------------------------
;JPEG解码初始化
;--------------------------------
 CALL JPEG_DEC-INIT
 STM #IMAGE_WIDTH-1,AR7
BLOCKDE_LOOP0:
 STM #IMAGE_LENGTH-1,AR6
BLOCKDE_LOOP:
;--------------------------------
;块解码
;--------------------------------
 CALL BLOCK_DECODE
 CALL BLOCK_ASSEMBLE
 MAR AR6
 BANZ BLOCKDE_LOOP,*AR6-
 STM #NEXT_SECTION,AR0
 MAR AR5
 MAR *AR5+0
 MAR AR7
 BANZ BLOCKDE_LOOP0,*AR7-
;-----------------------------
;JPEG输出
;-----------------------------
JPEGOUT:
 MAR AR4
 STM #PICT,AR4
 STM #(160*120/8)-1,AR7
JPEGOUT_LOOP:
 MAR AR4
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 PORTW *AR4+,0
 MAR AR7
 BANZ JPEGOUT_LOOP,*AR7-
;--------------------------------
;恢复程序运行环境
;--------------------------------
 LD #J_STACK,DP
 PSHD J_STACK,DP
 MVMD AR7,J_STACK+7
 MVMD AR6,J_STACK+6
 MVDM J_STACK+5,AR5
 MVDM J_STACK+4,AR4
 MVDM J_STACK+3,AR3
 MVDM J_STACK+2,AR2
 MVDM J_STACK+1,AR1
 LD #0,DP
 MVDM J_STATUS+1,ST1
 MVDM J_STATUS,ST0
 RET
;-----------------------------
;块充重组
;-----------------------------
BLOCK_ASSEMBLE:
 STM #NEXT_LINE,AR0
 MAR AR5
 RPT #7
 MVKD #BLOCK_RESULT,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+8,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+16,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+24,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+32,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+40,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+48,*AR5+
 MAR *AR5+0
 RPT #7
 MVKD #BLOCK_RESULT+56,*AR5+
 STM #NEXT_SECTION,AR0
 MAR *AR5-0
 RET
;--------------------------------
;JPEG解码初始化
;包括DCT、量化和Huffman解码三部分
;---------------------------------
JPEG_DEC_INIT:
IDCT_INIT:
  SSBX SXM
  SSBX OVM
  MAR AR5
  STM #0200H,AR5
  RPT #63
  MVPD #IDCT_COEF,*AR5+
DEQUANT_INIT:
  MAR AR5
  STM #DQUANT_TABLE,AR5
  RPT #63
  MVPD #Y_DQUANTIZE_TABLE,*AR5+
  STM #DZIGZAG_TABLE,AR5
  RPT #63
  MVPD #ZIGZAG_TABLE1,*AR5+
DEHUFF_INIT:
  MAR AR4
  STM #DETABLE,AR4
  RPT #250
  MVPD #RD48TAB,*AR4+
  STM #D12TAB,AR4
  RPT #87
  MVPD #RD12TAB,*AR4+
  RPT #47
  MVPD #HDCDECODE_TABLE,*AR4+
  RPT #16
  MVPD #LOWMASK,*AR4+
  LD #MASKDATA,DP
  ST #0FFF0H,MASKDATA
  ST #0F000H,MASKSIZE
  ST #0AH,EOB
  ST #0H,LAST_DC
  ST #0H,LAST_RESULT
  ST #10H,USER_BIT
  ST #0H,LESS_BIT
  STM #COMPRESS_DATA,AR4
  LD *AR4+,A
  MVMD AR4,DC_TALL
  STL A,DATA
  LD #DC_TAIL,DP
  STM DC_TAIL,AR4
  STM #PICT,AR5
  MVMD AR5,DST
  RET
;-----------------------
;块解码
;-----------------------
BLOCKDE.ASM
  .MMREGS
  .DEF BLOCK_DECODE,SIZE
  .DEF BLK1_ADDR,DQZB1,DQZBR
  .DEF EMASK,DETABLE,DCDETAB
  .DEF DQUANT_TABLE,F_TAB
  .DEF NEG_VSIZE,JUDGE_DATA
  .DEF DZIGZAG_TABLE,D12TAB
  .DEF COWORD_SIZE,V_SIZE
  .REF B_STATUS,B_STACK,IDCT
  .REF DC_TAIL,DATA,LAST_DC
  .REF EOB,ZIGZAG_TABLE1
  .REF IDCT_COEF,LOWMASK
  .REF SRC,LAST_RESULT,LESS_BIT
  .REF Y_DQUANTIZE_TABLE
  .REF RD48TAB,RD12TAB,RZERO
  .REF MAX_VALUE,MIN_VALUE
  .REF COMPRESS_DATA,EOB_SIZE
  .REF COWORD,DCTB1,USER_BIT
  .REF DIFF,ABSDIFF

  DQZBR .USECT"DQ_BLK",64
  DQZB1 .USECT"DQ_BLK",64
  DQUANT_TABLE .USECT"DQ_TBL",64
  DZIGZAG_TABLE .USECT"DQ_TBL",64
  DETABLE  .USECT"DEHUFFTAB",251  
  D12TAB  .USECT"DEHUFFTAB",88
  DCDETAB  .USECT"DEHUFFTAB",48
  EMASK  .USECT"DEHUFFTAB",17
  F_TAB  .USECT"HUF_VAR",1
  SIZE  .USECT"HUF_VAR",1
  COWORD  .USECT"HUF_VAR",1
  V_SIZE  .USECT"HUF_VAR",1
  NEG_VSIZE .USECT"HUF_VAR",1
  JUDGE_DATA .USECT"HUF_VAR",1
  CHECKDC  .USECT"HUF_VAR",1
  BLK1_ADDR .SET DQZB1
     .TEXT
  BLOCK_DECODE:
;-----------------------------------
;保存程序运行环境
;-----------------------------------
  MVMD ST0,B_STATUS
  MVMD ST1,B_STATUS
  LD #B_STACK,DP
  MVMD AR1,B_STACK
  MVMD AR2,B_STACK+1
  MVMD AR3,B_STACK+2
  MVMD AR6,B_STACK+3
  POPD B_STACK+4
;--------------------------
;Huffman解码、反量化,IDCT
;--------------------------
  CALL HUFFDECODE
  CALL DQUANT
  CALL IDCT
  CALL JPEG_FINAL
;--------------------------
;恢复程序运行环境
;--------------------------
  LD #B_STACK,DP
  PSHD B_STACK+4
  STM B_STACK+3,AR6
  STM B_STACK+2,AR3
  STM B_STACK+1,AR2
  STM B_STACK,AR1
  LD #0,DP
  STM B_STATUS+1,ST1
  STM B_STATUS,ST0
  RET
JPEG_FINAL:
  STM #DCTB1,AR2
  STM #63,AR3
  MAR AR2
BOUND:
  LD *AR2,A
  BC NEG_BOUND,ALT
  SUB #MAX_VALUE,A
  BC END_BOUND,ALT
  LD #MAX_VALUE,A
  STL A,*AR2
  B END_BOUND
NEG_BOUND:
  SUB #MIN_VALUE,A
  BC END_BOUND,AGT
  LD #MIN_VALUE,A
  STL A,*AR2+
  B END_BOUND
END_BOUND:
  MAR *AR2+
  MAR AR0
  BANZ BOUND,*AR0-
ADD_128:
  MAR AR2
  STM #DCTB1,AR2
  STM #63,AR3
JF_LOOP:
  MAR AR2
  LD *AR2,A
  ADD #128,A
  STL A,*AR2+
  MAR AR3
  BANZ JF_LOOP,*AR3-
  RET
;----------------------------
;反量化
;----------------------------
DQUANT:
  STM #63,AR0
  STM #DQZBR,AR2
  STM #DZIGZAG_TABLE,AR3
  STM #DQUANT_TABLE,AR6
DQ_LOOP:
  MAR AR3
  MVDK *AR3+,AR1
  MAR AR1
  LD *AR1+,T
  MAR AR6
  MPY *AR6+,A
  STL A,*AR2+
  MAR AR0
  BANZ DQ_LOOP,*AR0-
  RET
;---------------------------
;Huffman解码
;---------------------------
HUFFDECODE:
  RSBX SXM
  LD #0,A
  MAR AR3
  STM #DQZB1,AR3
  RPT #63
  STL A,*AR3+
DC_DECODE:
  STM #DQZB1,AR3
  MAR AR4
  LD #LESS_BIT,DP
  ST #0FFFFH,CHECK_DC
  LD LESS_BIT,T
  LD DATA 16,A
  ADD AR4,TS,A
  STH A,JUDGE_DATA
  LD JUDGE_DATA,4,A
  STH A,ABSDIFF
  LD ABSDIFF,A
  SUB #0FH,A
  BC GDCANS,ALT
  LD JUDGE_DATA,8,A
  STH A,ABSDIFF
  LD ABSDIFF,A
  SUB #0FFH,A
  BC DCCWLT9B,ALT
  LD JUDGE_DATA,12,A
  AND #0FH,A
  ADD #20H,A
  STL A,ABSDIFF
  B GDCANS
DCCWLT9B:
  LD ABSDIFF,A
  AND #0FH,A
  ADD #10H,A  ;ABSDIFF+=16
  STL A,ABSDIFF
GDCANS:
  MAR AR2
  STM DCDETAB,AR2
  STMAR0,ABSDIFF
  MAR *AR2-0
  LD *AR2-0,8,A
  AND #00FFH,8,A
  STL A,F_TAB
  CALL GET_VEN
  MAR AR3
  MAR *AR3-
  LD *AR3,A
  ADD LAST_DC,A
  STL A,*AR3+
  MAR AR4
  STL A,LAST_DC
  STM #63,AR6
AC_DECODE:
  MAR AR4
  ST #0,CHECK_DC
  STM DETABLE,AR2
  LD LESS_BIT,T
  LD DATA,16,A
  ADD *AR4,TS,A
  STH A,JUDGE_DATA
  LD JUDGE_DATA,8,A
  STH A,ABSDIFF
  LD ABSDIFF,A
  SUB #0BFH,A
  BC NOZERO,ALEQ
  SUB #03BH,A
  BC WITHZERO,ALEQ
  LD JUDGE_DATA,A
  SUB #0FF81H,A
  BC BIT12,ALT
BIT16:
  ADD #21H,A
  STL A,ABSDIFF
  LD LESS_BIT,T
  LD DATA,16,A
  ADD *AR4+,TS,A
  STL A,DATA
  MVMD AR4,DC_TAIL
  CALL JUMPZERO
  LD F_TAB,4,A
  AND #0F00H,A
  STL A,F_TAB
  ST #0FFFFH,CHECK_DC
  CALL GET_VEN
END_ACDECODE:
  BANZ ACDECODE,*AR6-
  LD COWORD,A
  SUB EOB,A
  BC END_DECODE,AEQ
  LD EOB_SIZE.A
  CALL GET_COWORD
  STH A,COWORD
END_DECODE:
  SSBX SXM
  RET
BIT12:
  MAR AR2
  LD JUDGE_DATA,12,A
  STH A,ABSDIFF
  LD ABSDIFF,A
  SUB #0FA0H-(0FAH+1H),A
  STL A,ABSDIFF
WITHZERO:
  CALL JUMPZERO
  LD F_TAB,A
  AND #0FFH,8,A
  STL A,F_TAB
  CALL GET_VEN
  B END_ACDECODE
NOZERO:
  MAR AR2
  STM DETABLE,AR2
  STM ABSDIFF,AR0
  MAR *AR2+0
  LD *AR2-0,A
  AND #0FFH,8,A
  STL,A,F_TAB
  CALL GET_VEN
  B END_ACDECODE
JUMPZERO:
  MAR AR2
  STM ABSDIFF,AR0
  MAR *AR2+0
  LD *AR2-0,A
  STL A,F_TAB
  AND 0FH,A
  STL A,RZERO
  STM RZERO,AR0
  MAR AR3
  MAR *AR3+0
  MAR AR6
  MAR *AR6-0
  RET
GET_VEN:
  LD F_TAB,4,A
  STH A,COWORD_SIZE
  AND #0F000H,A
  STH A,4,V_SIZE
  LD COWORD_SIZE,A
  CALL GET_COWORD
  STH A,COWORD
  LD CHECK_DC,A
  BC SKIP_EOB_CHECKING,ANEQ
  LD COWORD,A
  SUB EOB,A
  MAR AR6
  BC FIND_EOB,AEQ
SKIP_EOB_CHECKING:
  LD V_SIZE,A
  CALL GET_COWORD
  STH A,DIFF
  LD #16,A
  SUB V_SIZE,A
  STL A,NEG_VSIZE
  LD DIFF,A
  LD NEG_VSIZE,T
  BITT DIFF
  BC DPOSTIVE,TC
  MAR AR1
  STM EMASK,AR1
  STM V_SIZE,AR0
  MAR *AR1+0
  LD *AR1-0,A
  CMPL A
  OR DIFF,A
  ADD #1H,A
DPOSITIVE:
  MAR AR3
  STL A,*AR3+
  MAR AR6
  MAR *AR6-
  RET
FIND_EOB:
  STM #0,AR6
  RET
GET_COWORD:
  MAR AR4
  STL A,SIZE
  SUB USER_BIT,A
  STL A,LESS_BIT
  NEG A
  LD SIZE,T
  BC GET_NEWWORD,ALEQ
  STL A,USER_BIT
  LD DATA,TS,A
  STL A,DATA
  B END_GCOWORD
GET_NEWWORD:
  ADD #10H,A
  STL A,USER_BIT
  LD DATA,TS,A
  LD LESS_BIT,T
  ADD *AR4+,TS,A
  STH A,DIFF
  STL A,DATA
  MVMD AR4,DC_TAIL
  LD DC_TAIL,A
  STL A,DC_TAIL
  STM DC_TAIL,AR4
  LD DIFF,16,A
END_GCOWORD:
  RET
  
;-----------------------------
;变量与系数表
;-----------------------------
TABLES.ASM
  .MMREGS
  .DEF MAX_VALUE,MIN_VALUE
  .DEF DCT_COEF,Y_QUANT_TABLE,ZIGZAG_TABLE0,UV_QUANT_TABLE
  .DEF IDCT_COEF,Y_DQUANTIZE_TABLE
  .DEF RDCHUFF,RACHUFF
  .DEF RD48TAB,RD12TAB,LOWMASK
  .DEF RDCHUFF
  .DEF HDCDECODE_TABLE
  .DEF IMAGE_LENGTH,IMAGE_WIDTH,NEXT
  .DEF COMPRESS_DATA
  .REF BLK2_ADDR,DIFFSIZE
  .DEF PICT
  
  
  IMAGE_LENGTH .SET 160/8
  IMAGE_WIDTH  .SET 120/8
  NEXT_LINE  .SET 152
  NEXT_SECTION .SET 7*160
  COMPRESS_DATA .USECT".JPEGEN",800H
  PICT   .USECT".PICTURE",8000H
  MAX_VALUE  .SET-255/2-1
  MIN_VALUE  .SECT"JPEG_TBL"
  
DCT_COEF:
.word 23170,23170,23170,23170,23170,23170,23170,23170
.word 32138,27246,18205,6393,-6393,-18205,-27246,-32138
.word 30274,12540,-12540,-30274,-30274,-12540,12540,30274
.word 27246,-6393,-32138,-18205,18205,32138,6393,27246
.word 23170,-23170,-23170,23170,23170,-23170,-23170,23170
.word 18205,-32138,6393,27246,-27246,-6393,32138,-18205
.word 12540,-30274,30274,-12540,-12540,30274,-30274,12540
.word 6393,-18205,27246,-32138,32138,-27246,18205,-6393  
  
IDCT_COEF:
.word 32170,32138,30274,27246,23170,18205,12540,6393
.word 32170,27246,12540,-6393,-23170,-32138,-30274,-18205
.word 32170,18205,-12540,-32138,-23170,6393,30274,27246
.word 32170,6393,-30274,-18205,23170,27246,-12540,-32138
.word 32170,-6393,-30274,18205,23170,-27246,-12540,32138
.word 32170,-18205,-12540,32138,-23170,-6393,30274,-27246
.word 32170,-27246,12540,6393,-23170,32138,-30274,18205
.word 32170,-32138,30274,-27246,23170,-18205,12540,-6393
Y_QUANT_TABLE:
.word 2048,2979,3277,2048,1365,819,643,537
.word 2731,2731,2341,1725,1260,565,546,596
.word 2341,2521,2048,1365,819,575,475,585
.word 2341,1928,1489,1130,643,377,410,529
.word 1820,1489,886,585,482,301,318,426
.word 1365,936,596,512,405,315,290,356
.word 669,512,420,377,318,271,273,324
.word 455,356,345,334,293,328,318,331
UV_QUANT_TABLE:
.word 1928,1820,1365,697,331,331,331,331
.word 1820,1560,1260,496,331,331,331,331
.word 1365,1260,585,331,331,331,331,331
.word 697,496,331,331,331,331,331,331
.word 331,331,331,331,331,331,331,331
.word 331,331,331,331,331,331,331,331
.word 331,331,331,331,331,331,331,331
.word 331,331,331,331,331,331,331,331
Y_DQUANTIZE_TABLE:
.word 16,11,10,16,24,40,51,61
.word 12,12,14,19,26,58,60,55
.word 14,13,16,24,40,57,69,56
.word 14,17,22,29,51,87,80,62
.word 18,22,37,56,68,109,103,77
.word 24,35,55,64,81,104,113,92
.word 49,64,78,87,103,121,120,101
.word 72,92,95,98,112,100,103,99
UV_DQUANTIZE_TABLE:
.word 17,18,24,47,99,99,99,99
.word 18,21,26,66,99,99,99,99
.word 24,26,56,99,99,99,99,99
.word 47,66,99,99,99,99,99,99
.word 99,99,99,99,99,99,99,99
.word 99,99,99,99,99,99,99,99
.word 99,99,99,99,99,99,99,99
.word 99,99,99,99,99,99,99,99
ZIGZAG_TABLE0:
.word 0+BLK2_ADDR,1+BLK2_ADDR,5+BLK2_ADDR,6+BLK2_ADDR
.word 14+BLK2_ADDR,15+BLK2_ADDR,27+BLK2_ADDR,28+BLK2_ADDR
.word 2+BLK2_ADDR,4+BLK2_ADDR,7+BLK2_ADDR,13+BLK2_ADDR
.word 16+BLK2_ADDR,,26+BLK2_ADDR,29+BLK2_ADDR,42+BLK2_ADDR
.word 3+BLK2_ADDR,8+BLK2_ADDR,12+BLK2_ADDR,17+BLK2_ADDR
.word 25+BLK2_ADDR,30+BLK2_ADDR,41+BLK2_ADDR,43+BLK2_ADDR
.word 9+BLK2_ADDR,11+BLK2_ADDR,18+BLK2_ADDR,24+BLK2_ADDR
.word 31+BLK2_ADDR,40+BLK2_ADDR,44+BLK2_ADDR,53+BLK2_ADDR
.word 10+BLK2_ADDR,19+BLK2_ADDR,23+BLK2_ADDR,32+BLK2_ADDR
.word 39+BLK2_ADDR,45+BLK2_ADDR,52+BLK2_ADDR,+BLK2_ADDR
.word 20+BLK2_ADDR,22+BLK2_ADDR,33+BLK2_ADDR,38+BLK2_ADDR
.word 46+BLK2_ADDR,51+BLK2_ADDR,55+BLK2_ADDR,60+BLK2_ADDR
.word 21+BLK2_ADDR,34+BLK2_ADDR,37+BLK2_ADDR,47+BLK2_ADDR
.word 50+BLK2_ADDR,56+BLK2_ADDR,59+BLK2_ADDR,61+BLK2_ADDR
.word 35+BLK2_ADDR,36+BLK2_ADDR,48+BLK2_ADDR,49+BLK2_ADDR
.word 57+BLK2_ADDR,58+BLK2_ADDR,62+BLK2_ADDR,63+BLK2_ADDR
RDCHUFF:
.word 0002h,0023h,0033h,0043h,0053h,0063h
.word 00e4h,01e5h,03e6h,07e7h,0fe8h,1fe9h
DIFFSIZE:
.word 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4
LOWMASK:
.word 0000h,0001h,0003h,0007h,000fh,001fh,003fh,007fh
.word 00ffh,01ffh,03ffh,07ffh,0ffffh,1fffh,3fffh,7fffh
.word 0ffffh
RACHUFF:
.word 000a4h,0000h,0000h,0000h,0000h,0000h,0000h,0000h
.word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,07f9bh
.word 00002h,000c4h,001c5h,003a6h,003b6h,007a7h,007b7h,00fa8h
.word 01f89h,01f99h,01fa9h,03f9ah,03faah,07f8bh,0ffebh,0fff5h
.word 00012h,001b5h,00f98h,01f79h,03f8ah,07f7bh,0ff6ch,0ff7ch
.word 0ff81h,0ffbeh,0ffc7h,0ffd0h,0ffd9h,0ffe2h,0ffech,0fff6h
.word 00043h,00797h,03f7ah,0ff5ch,0f196h,0ff9eh,0ffa6h,0ffaeh
.word 0ffb6h,0ffc8h,0ffd1h,0ffdah,0ffe3h,0ffedh,0fff7h,0fff9h
.word 000b4h,01f69h,0ff4ch,0ff8fh,0ff97h,0ff9fh,0ffafh,0ffafh
.word 0ffb7h,0ffc0h,0ffc9h,0ffd2h,0ffdbh,0ffe4h,0ffeeh,0fff8h
.word 001a5h,07f6bh,0ff89h,0ff90h,0f198h,0ffa0h,0ffa8h,0ffb0h
.word 0ff08h,0ffc1h,0ffcah,0ffd3h,0ffdch,0ffe5h,0ffefh,0fff9h
.word 00787h,0ff84h,0ff3ah,0f191h,0f199h,0ffa1h,0ffa9h,0ffb1h
.word 0ffb9h,0ffc2h,0ffcbh,0ffd4h,0ffddh,0ffe6h,0fff0h,0fffah
.word 00f38h,0ff35h,0ff5bh,0ff92h,0ff9ah,0ffa2h,0ffaah,0ff02h
.word 0ffbah,0ffc3h,0ffcch,0ffc1h,0ffdeh,0ffe7h,0fff1h,0fff0h
.word 03f6ah,0ff96h,0f11ch,0ff93h,0f19bh,0ffa3h,0ffabh,0ffb3h
.word 0ff0bh,0ffc4h,0ffcdh,0ffd6h,0ffdfh,0ffe8h,0fff2h,0fffch
.word 0ff12h,0fh17h,0f1d1h,0ff94h,0ff9ch,0ffa4h,0ffach,0ffb4h
.word 0ffbch,0ffc5h,0ffceh,0ffd7h,0ffe0h,offe9h,offf3h,0fffdh
.word 0ff83h,0ff95h,0ff8eh,0f195h,0f1afh,0ffa5h,0ffadh,0ffb5h
.word 0ffbdh,0ffc6h,0ffcfh,0ffd8h,0fffeh,10ffeah,0fff4h,0fffeh
HDCDECODE_TABLE:
.word 0020h,0020h,0020h,0020h,0031h,0031h,0032h,0032h
.word 0033h,0033h,0034h,0034h,0035h,0035h,0046h,0000h
.word 0057h,0057h,0057h,0057h,0057h,0057h,0057h,0057h
.word 0068h,0068h,0068h,0068h,0079h,0079h,008ah,009bh
.word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h
.word 0000h,0000h,0000h,0000h,0000h,0000h,0000h,0000h

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    TMS320VC5402初始化样例代码
    McBSP模块配置为LCD12864的S…
    DSP5402之硬件SPI配置
    对于C5000,大于48K的程序如…
    DSP系统常用外围配套芯片——…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号