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

📄 mpegimdf.a

📁 Application (fix point) for playing MP3 data on embedded systems. mp3play is designed to be able to
💻 A
📖 第 1 页 / 共 3 页
字号:
;------------------------------------------------------------------------------;;   File    :   MPEGIMDF.a;;   Author  :   St閜hane TAVENARD;;   $VER:   MPEGIMDF.a  0.0  (03/06/1997);;   (C) Copyright 1997-1997 St閜hane TAVENARD;       All Rights Reserved;;   #Rev|   Date   |                      Comment;   ----|----------|--------------------------------------------------------;   0   |03/06/1997| Initial revision                                     ST;;   ------------------------------------------------------------------------;;   MPEG IMDCT optimized ! (FPU Version);;------------------------------------------------------------------------------               XDEF     @MPEGIMDF_hybrid               XDEF     _MPEGIMDF_hybrid               XDEF     @MPEGIMDF_long               XDEF     _MPEGIMDF_long               XDEF     @MPEGIMDF_short               XDEF     _MPEGIMDF_short               section  ASMCODE,codeSSIZE          equ      4 ; Source size in bytesDSIZE          equ      4 ; Destination size in bytesTSIZE          equ      4 ; Temp data size in bytesWSIZE          equ      4 ; Window data size in bytesSSLIMIT        equ     18SBLIMIT        equ     32; MOVM <reg>,<ea>; MOVM <ea>,<reg>; Move a value from/to memoryMOVM           MACRO               fmove.s  \1,\2               ENDM; MOVR <reg1>,<reg2>; Move a from register to registerMOVR           MACRO               fmove.x  \1,\2               ENDM; ADDR <imm>,<ea>; Add a register value with <ea>ADDR           MACRO               fadd.x   \1,\2               ENDM; ADDM <ea>,<ea>; Add a memory value with <ea>ADDM           MACRO               fadd.s    \1,\2               ENDM; SUBR <imm>,<ea>; Sub a register value with <ea>SUBR           MACRO               fsub.x   \1,\2               ENDM; SUBM <ea>,<ea>; Sub a memory value with <ea>SUBM           MACRO               fsub.s   \1,\2               ENDM; NEGR <reg>; Negate a registerNEGR           MACRO               fneg.x   \1               ENDM; MULI <imm>,<ea>; Multiply immediate value with <ea>MULI           MACRO               fmul.s   #\1,\2               ENDM; MULR <reg>,<ea>; Multiply a register value with <ea>MULR           MACRO               fmul.x   \1,\2               ENDM; MULM <imm>,<ea>; Multiply memory value with <ea>MULM           MACRO               fmul.s   \1,\2               ENDM; COPY_PREV <i>; copy *prev value to out[i*32]; clear *prev; prev++; Note: d0.l must contain 0COPY_PREV      MACRO               move.l   (a3),32*DSIZE*\1(a1)               move.l   d0,(a3)+               ENDM;              Perform an IMDCT;;              a0:  in array (float *);              a1:  out array (float *);              a2:  prev block (float *);              d0.w: block type;              d1.w: mixed;              d2.w: sb_max;@MPEGIMDF_hybrid_MPEGIMDF_hybrid               movem.l  d2-d7/a2-a6,-(sp)               fmovem.x fp0-fp7,-(sp)               move.l   a2,a3 ; a3 = prev block               move.l   d0,d3 ; d3 = block type               clr.l    d4 ; d4 = sb               move.l   #SSLIMIT*SSIZE,d5               tst.w    d1               beq      MPEGIMDF_imd0               ; mixed block (long block, win = 0)               lea      imdct_e_win0,a2 ; even win0               bsr      imdct_l               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9               lea      imdct_o_win0,a2 ; odd win0               bsr      imdct_l               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9MPEGIMDF_imd0               cmp.w    #2,d3               bne      MPEGIMDF_imd5 ; Long blocksMPEGIMDF_imd1  ; Short blocks               lea      imdct_e_win2,a2 ; even win2               bsr      imdct_s               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9               lea      imdct_o_win2,a2 ; odd win2               bsr      imdct_s               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9               bra      MPEGIMDF_imd1MPEGIMDF_imd5  ; Long blocks               lea      imdct_e_win,a2               move.l   (a2,d3*4),a2 ; even win               bsr      imdct_l               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9               lea      imdct_o_win,a2               move.l   (a2,d3*4),a2 ; odd win               bsr      imdct_l               add.l    d5,a0 ; in += SSLIMIT               add.l    d5,a3 ; prev += SSLIMIT               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               cmp.w    d2,d4               bge      MPEGIMDF_imd9               bra      MPEGIMDF_imd5MPEGIMDF_imd9  ; Fill remaining blocks with help of prev blocks               moveq.l  #0,d0MPEGIMDF_imd91 cmp.w    #SBLIMIT,d4               bge      MPEGIMDF_imde               COPY_PREV 0               COPY_PREV 1               COPY_PREV 2               COPY_PREV 3               COPY_PREV 4               COPY_PREV 5               COPY_PREV 6               COPY_PREV 7               COPY_PREV 8               COPY_PREV 9               COPY_PREV 10               COPY_PREV 11               COPY_PREV 12               COPY_PREV 13               COPY_PREV 14               COPY_PREV 15               COPY_PREV 16               COPY_PREV 17               addq.l   #DSIZE,a1 ; out++               addq.w   #1,d4               bra      MPEGIMDF_imd91MPEGIMDF_imde               fmovem.x (sp)+,fp0-fp7               movem.l  (sp)+,d2-d7/a2-a6               rts;              Perform a long IMDCT;;              a0:  in array (float *);              a1:  out array (float *);              a2:  window (float *);              a3:  prev block (float *);@MPEGIMDF_long_MPEGIMDF_long               movem.l  d2-d7/a2-a6,-(sp)               fmovem.x fp0-fp7,-(sp)               bsr      imdct_l               fmovem.x (sp)+,fp0-fp7               movem.l  (sp)+,d2-d7/a2-a6               rts;              Perform a short IMDCT;;              a0:  in array (float *);              a1:  out array (float *);              a2:  window (float *);              a3:  prev block (float *);@MPEGIMDF_short_MPEGIMDF_short               movem.l  d2-d7/a2-a6,-(sp)               fmovem.x fp0-fp7,-(sp)               bsr      imdct_s               fmovem.x (sp)+,fp0-fp7               movem.l  (sp)+,d2-d7/a2-a6               rts; COS9_x = cos( pi / 18 * x)COS9_1         fequ     9.848077530e-1COS9_2         fequ     9.396926208e-1COS9_3         fequ     8.660254038e-1COS9_4         fequ     7.660444431e-1COS9_5         fequ     6.427876097e-1COS9_6         fequ     5e-1COS9_7         fequ     3.420201433e-1COS9_8         fequ     1.736481777e-1; COST36_x = 0.5 / cos( pi * (2x+1) / 36 )COST36_0       fequ     5.019099188e-1COST36_1       fequ     5.176380902e-1COST36_2       fequ     5.516889595e-1COST36_3       fequ     6.103872944e-1COST36_4       fequ     7.071067812e-1COST36_5       fequ     8.717233978e-1COST36_6       fequ     1.183100792COST36_7       fequ     1.931851653COST36_8       fequ     5.736856623; Get input even samples; GET_I0 <num>,<reg>GET_I0         MACRO               MOVM     \1*2*SSIZE(a0),\2               ENDM; Get input odd samples; GET_I1 <num>,<reg>GET_I1         MACRO               MOVM     \1*2*SSIZE+SSIZE(a0),\2               ENDM; Add input even samples; ADD_I0 <num>,<reg>ADD_I0         MACRO               ADDM     \1*2*SSIZE(a0),\2               ENDM; Add input odd samples; ADD_I1 <num>,<reg>ADD_I1         MACRO               ADDM    \1*2*SSIZE+SSIZE(a0),\2               ENDM; Sub input even samples; SUB_I0 <num>,<reg>SUB_I0         MACRO               SUBM    \1*2*SSIZE(a0),\2               ENDM; Sub input odd samples; SUB_I1 <num>,<reg>SUB_I1         MACRO               SUBM    \1*2*SSIZE+SSIZE(a0),\2               ENDM; Compute CM( I0(i), <cos> ) -> <reg>

⌨️ 快捷键说明

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