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

📄 mpegidma.s

📁 Application (fix point) for playing MP3 data on embedded systems. mp3play is designed to be able to
💻 S
📖 第 1 页 / 共 3 页
字号:
;------------------------------------------------------------------------------;;   File    :   MPEGIMDA.a;;   Author  :   St閜hane TAVENARD;;   $VER:   MPEGIMDA.a  0.1  (10/05/1997);;   (C) Copyright 1997-1997 St閜hane TAVENARD;       All Rights Reserved;;   #Rev|   Date   |                      Comment;   ----|----------|--------------------------------------------------------;   0   |04/03/1997| Initial revision                                     ST;   1   |10/05/1997| use of link instead of static vars                   ST;;   ------------------------------------------------------------------------;;   MPEG IMDCT optimized !;;------------------------------------------------------------------------------               XDEF     @MPEGIMDA_hybrid               XDEF     _MPEGIMDA_hybrid               section  ASMCODE,codeIMDCT_BITS     equ      14;              Perform an IMDCT;;              a0:  in array (16-bit);              a1:  out array (16-bit);              a2:  prev block (16-bit);              d0.w: block type;              d1.w: mixed (0 or 1);              d2.w: sb_max;@MPEGIMDA_hybrid_MPEGIMDA_hybrid               movem.l  d2-d7/a2-a6,-(sp)               move.l   a2,a3    ; a3 = prev block               clr.w    d5               tst.w    d1               beq      MPEGIMDA_h1               ; mixed -> sb 0 & 1 to win 0               lea      imdct_win0,a2               movem.w  d0/d2,-(sp)               bsr      imdct_l               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdct               lea      imdct_win0_odd,a2               movem.w  d0/d2,-(sp)               bsr      imdct_l               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdctMPEGIMDA_h1               cmp.w    #2,d0               beq      MPEGIMDA_h3 ; short blocks               ; Long blocksMPEGIMDA_h2               lea      imdct_win,a2               move.l   (a2,d0.w*4),a2               movem.w  d0/d2,-(sp)               bsr      imdct_l               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdct               lea      imdct_win_odd,a2               move.l   (a2,d0.w*4),a2               movem.w  d0/d2,-(sp)               bsr      imdct_l               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdct               bra      MPEGIMDA_h2               ; Short blocksMPEGIMDA_h3               lea      imdct_win2,a2               movem.w  d0/d2,-(sp)               bsr      imdct_s               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdct               lea      imdct_win2_odd,a2               movem.w  d0/d2,-(sp)               bsr      imdct_s               movem.w  (sp)+,d0/d2               add.l    #2*18,a0    ; in += 18               addq.l   #2,a1       ; out++;               add.l    #2*18,a3    ; prev += 18               addq.w   #1,d5               cmp.w    d2,d5               bge      MPEGIMDA_h5 ; end of imdct               bra      MPEGIMDA_h3               ; End of imdct -> overlap with 0 rest of bandsMPEGIMDA_h5               cmp.w    #32,d5               bge      MPEGIMDA_h7               clr.l    d1MPEGIMDA_h6               move.w   (a3),0*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),1*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),2*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),3*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),4*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),5*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),6*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),7*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),8*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),9*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),10*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),11*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),12*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),13*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),14*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),15*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),16*2*32(a1)               move.w   d1,(a3)+               move.w   (a3),17*2*32(a1)               move.w   d1,(a3)+               addq.l   #2,a1    ; out++               addq.w   #1,d5               cmp.w    #32,d5               blt      MPEGIMDA_h6MPEGIMDA_h7               movem.l  (sp)+,d2-d7/a2-a6               rts#define	K0      16368#define	K1      16244#define	K2      15996#define	K3      15626#define	K4      15137#define	K5      14533#define	K6      13818#define	K7      12998#define	K8      12080#define	K9      11069#define	K10      9974#define	K11      8803#define	K12      7565#define	K13      6270#define	K14      4927#define	K15      3546#define	K16      2139#define	K17      715#define	MUL32	muls.l $$1,$$2 \		asr.l	%d6,$$2		#if 0	MUL32          MACRO               muls.l   \1,\2       ; ##7               asr.l    d6,\2       ; ##7               ENDM#endif/*	;              S   a, <dummy reg>, <dest reg>;              performs: (INT32)x[ a ] - (INT32)x[ 11-a ] - (INT32)x[ 12+a ];*/	#if 0	S              MACRO               move.w   \1*2(a0),\3               ext.l    \3               move.w   22-\1*2(a0),\2               ext.l    \2               sub.l    \2,\3               move.w   24+\1*2(a0),\2               ext.l    \2               sub.l    \2,\3               ENDM#else#define S      move.w   $$1*2(%a0),$$3 \               ext.l    $$3 \               move.w   22-$$1*2(%a0),$$2 \               ext.l    $$2 \               sub.l    $$2,$$3 \               move.w   24+$$1*2(%a0),%%2 \               ext.l    $$2               sub.l    $$2,$$3#endif#if 0;              M   xi, Kx, <dest reg>;              performs: ((INT32)x[ xi ] * (Kx));M              MACRO               move.w   \1*2(a0),\3               muls.w   #\2,\3               ENDM#else#define	M      move.w   $$1*2(a0),$$3 \               muls.w   #$$2,$$3#endif#if 0;;              M_ADD xi, Kx;              performs: M xi, Kx, d0;                        add.l  d0,d3;M_ADD          MACRO               M        \1,\2,d0               add.l    d0,d3               ENDM#else#define	M_ADD  M        $$1,$$2,%d0 \               add.l    %d0,%d3#endif#if 0;;                          M_SUB xi, Kx;              performs: M xi, Kx, d0;                        sub.l  d0,d3;M_SUB          MACRO               M        \1,\2,d0               sub.l    d0,d3               ENDM#else#define	M_SUB  M        $$1,$$2,%d0 \               sub.l    %d0,%d3 #if 0;              MT   ti, Kx, <dest reg>;              performs: (t[ ti ] * (Kx));MT             MACRO               move.l   \1*4(a3),\3               muls.w   #\2,\3               ENDM#else#define	MT     move.l   %%1*4(%a3),$$3 \               muls.w   #$$2,$$3#endif#if 0;;                          MT_ADD ti, Kx;              performs: M ti, Kx, d0;                        add.l  d0,d3;MT_ADD         MACRO               MT       \1,\2,d0               add.l    d0,d3               ENDM#else#define	MT_ADD MT       $$1,$$2,%d0 \               add.l    %d0,%d3#endif#if 0;;                          MT_SUB ti, Kx;              performs: MT ti, Kx, d0;                        sub.l  d0,d3;MT_SUB          MACRO               MT       \1,\2,d0               sub.l    d0,d3               ENDM#else#define	MT_SUB MT       $$1,$$2,%d0 \               sub.l    %d0,%d3#endif#if 0;;              IMDCT_FIX <reg>;              performs <reg> = <reg> >> IMDCT_BITS;IMDCT_FIX      MACRO               asr.l    d6,\1               ENDM#else#define	IMDCT_FIX	asr.l    d6,$$1#endif#if 0;              W   <reg>, wi   -> <reg> -> out[ wi ];              performs: (<reg> * win[ wi ]) >> WIN_BITS + prev[ wi ] -> out[ wi ];W              MACRO               muls.w   \2*2(a2),\1               asr.l    d6,\1               add.w    \2*2(a5),\1               move.w   \1,\2*2*32(a1)               ENDM#else#define	W      muls.w   $$2*2(%a2),%%1 \               asr.l    %d6,$$1 \               add.w    $$2*2(%a5),$$1 \               move.w   $$1,$$2*2*32(%a1)#endif#if 0;              WP   <reg>, wi   -> <reg> -> prev[ wi ];              performs: (<reg> * win[ wi ]) >> WIN_BITS -> prev[ wi-18 ];WP             MACRO               muls.w   \2*2(a2),\1               asr.l    d6,\1               move.w   \1,\2*2-36(a5)               ENDM#else#define	WP     muls.w   $$2*2(%a2),$$1 \               asr.l    %d6,$$1 \               move.w   $$1,%%2*2-36(%a5) #endif;;              IMDCT for Long blocks;;              a0: input  x array (16-bit);              a1: output out     (16-bit);              a2: window array   (16-bit);              a3: prev array     (32-bit)imdct_l:               link     %a6,#-10*4    ; need 4+6 longs               move.l   %a3,%a5               lea      -4*4(%a6),%a3   ; t needs 4 longs               lea      -6*4(%a3),%a4   ; s needs 6 longs;               lea      imdct_sum_t,%a3;               lea      imdct_sum_s,%a4               moveq.l  #IMDCT_BITS,%d6               M        4,K13,%d1               M        13,K4,%d0               sub.l    %d0,%d1      ; k1 = M( 4, K13 ) - M( 13, K4 )               M        4,K4,%d2               M        13,K13,%d0               add.l    %d0,%d2      ; k2 = M( 4, K4 )  + M( 13, K13 ); s[ 0 ] = -M( 1, K7 )  + k1 + M( 7, K1 )  + M( 10, K16 ) - M( 16, K10 )               M        7,K1,%d3               M_SUB    1,K7               M_ADD    10,K16               M_SUB    16,K10               add.l    %d1,%d3               move.l   %d3,0*4(%a4); s[ 1 ] = -M( 1, K4 )  - k1 + M( 7, K13 ) + M( 10, K4 )  + M( 16, K13 )               M        7,K13,%d3               M_SUB    1,K4               M_ADD    10,K4               M_ADD    16,K13               sub.l    %d1,%d3               move.l   %d3,1*4(a4); s[ 2 ] = -M( 1, K1 )  - k2 - M( 7, K7 )  - M( 10, K10 ) - M( 16, K16 )               M        7,K7,%d3               neg.l    %d3               M_SUB    1,K1               M_SUB    10,K10               M_SUB    16,K16

⌨️ 快捷键说明

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