📄 mpegsubf.a
字号:
;------------------------------------------------------------------------------;; File : MPEGSUBF.a;; Author : St閜hane TAVENARD;; (C) Copyright 1997-1998 St閜hane TAVENARD; All Rights Reserved;; #Rev| Date | Comment; ----|----------|--------------------------------------------------------; 0 |02/06/1997| Initial revision ST; 1 |01/11/1997| Use link instead of static vars ST; 2 |21/06/1998| Use external scaled dewindow now ST;; ------------------------------------------------------------------------;; MPEG SUBroutines optimized (FPU version) !; *** WARNING BUG in GENAM -> 0.5 is set as 0.05 !!! ***;;------------------------------------------------------------------------------ XDEF @MPEGSUBF_antialias XDEF _MPEGSUBF_antialias XDEF @MPEGSUBF_filter_band XDEF _MPEGSUBF_filter_band XDEF @MPEGSUBF_window_band XDEF _MPEGSUBF_window_band; XDEF @MPEGSUBF_config ; #1; XDEF _MPEGSUBF_config ; #1SSIZE 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 bytesps1 equr a3ps2 equr a4pd1 equr a5; pd2 equr a6 ; #1;; Filter COS values for fast cosine transform;COS1_64 fequ 0.50060299823520COS3_64 fequ 0.50547095989754COS5_64 fequ 0.51544730992262COS7_64 fequ 0.53104259108978COS9_64 fequ 0.55310389603444COS11_64 fequ 0.58293496820613COS13_64 fequ 0.62250412303566COS15_64 fequ 0.67480834145501COS17_64 fequ 0.74453627100230COS19_64 fequ 0.83934964541553COS21_64 fequ 0.97256823786196COS23_64 fequ 1.16943993343288COS25_64 fequ 1.48416461631417COS27_64 fequ 2.05778100995341COS29_64 fequ 3.40760841846872COS31_64 fequ 10.1900081235480COS1_32 fequ 0.50241928618816COS3_32 fequ 0.52249861493969COS5_32 fequ 0.56694403481636COS7_32 fequ 0.64682178335999COS9_32 fequ 0.78815462345125COS11_32 fequ 1.06067768599035COS13_32 fequ 1.72244709823833COS15_32 fequ 5.10114861868917COS1_16 fequ 0.50979557910416COS3_16 fequ 0.60134488693505COS5_16 fequ 0.89997622313642COS7_16 fequ 2.56291544774151COS1_8 fequ 0.54119610014620COS3_8 fequ 1.30656296487638COS1_4 fequ 0.70710678118655; section ASMVARS,bss (#1 suppressed vars); CNOP 0,4;filter_p ds.l 16;filter_pp ds.l 16; section ASMVARS,bss;freq_div ds.w 1 ; 1,2 or 4;output_8bits ds.w 1 ; 0 if 16 bits output;quality ds.w 1 ; 0..2 (best);w_begin ds.w 1 ; start offset for windowing;w_width ds.w 1 ; #coeff used for windowing;pcm_count ds.w 1 ; # of samples per subband section ASMDATA,data CNOP 0,4filter_cos64 dc.s 5.0060299823520e-1, 5.0547095989754e-1 dc.s 5.1544730992262e-1, 5.3104259108978e-1 dc.s 5.5310389603444e-1, 5.8293496820613e-1 dc.s 6.2250412303566e-1, 6.7480834145501e-1 dc.s 7.4453627100230e-1, 8.3934964541553e-1 dc.s 9.7256823786196e-1, 1.16943993343288 dc.s 1.48416461631417, 2.05778100995341 dc.s 3.40760841846872, 10.1900081235480 ; #1 Begin ; pcm_loops[ freq_div ] = = (32 / freq_div) - 1pcm_loops dc.w 0, 31, 15, 9, 7, 0 ; #1 End section ASMCODE,code ; #1 Begin (suppressed) IFNE 0; Configure subband routines;; d0 = freq_div; d1 = quality; d2 = output_8bits;@MPEGSUBF_config_MPEGSUBF_config movem.l d2-d7/a2-a6,-(sp) move.w d0,freq_div move.w d1,quality move.w d2,output_8bits move.w #32,d3 ; pcm_count for full freq output cmp.w #2,d0 beq init_decode_1 cmp.w #4,d0 beq init_decode_2 bra init_decode_5init_decode_1 move.w #16,d3 ; pcm_count for half freq output bra init_decode_5init_decode_2 moveq.l #8,d3 ; pcm_count for quarter freq outputinit_decode_5 move.w d3,pcm_count moveq.l #0,d3 ; start offset for windowing moveq.l #16,d4 ; #coeff used for windowing move.w quality,d2 cmp.b #2,d2 ; best quality beq.s init_decode_6 move.w #4,d3 moveq.l #8,d4 cmp.b #1,d2 beq.s init_decode_6 move.w #6,d3 moveq.l #4,d4init_decode_6 move.w d3,w_begin move.w d4,w_width movem.l (sp)+,d2-d7/a2-a6 rts ENDC ; #1 End; 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 <reg>,<ea>; Add a register value with <ea>ADDR MACRO fadd.x \1,\2 ENDM; ADDM <mem>,<ea>; Add a memory value with <ea>ADDM MACRO fadd.s \1,\2 ENDM; SUBR <reg>,<ea>; Sub a register value with <ea>SUBR MACRO fsub.x \1,\2 ENDM; SUBM <mem>,<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 <mem>,<reg>; Multiply a memory value with <reg>MULM MACRO fmul.s \1,\2 ENDM;; ALIAS_U bu,csi,bd,cai,<tmp reg>,<reg>; performs: (bu * csi) - (bd * cai) -> <reg>; <tmp reg> is used for calculation; d6 must be set to ALIAS_BITS;ALIAS_U MACRO MOVR \1,\6 MULI \2,\6 MOVR \3,\5 MULI \4,\5 SUBR \5,\6 ENDM;; ALIAS_D bd,csi,bu,cai,<tmp reg>,<reg>; performs: (bd * csi) + (bu * cai) -> <reg>; <tmp reg> is used for calculation; d6 must be set to ALIAS_BITS;ALIAS_D MACRO MOVR \1,\6 MULI \2,\6 MOVR \3,\5 MULI \4,\5 ADDR \5,\6 ENDMbd equr a1bu equr a2;; ALIAS_B csi,cai; perform 1 alias butterfly; uses fp0..fp3;ALIAS_B MACRO MOVM -(bu),fp2 MOVM (bd),fp3 ALIAS_U fp2,\1,fp3,\2,fp0,fp1 MOVM fp1,(bu) ALIAS_D fp3,\1,fp2,\2,fp0,fp1 MOVM fp1,(bd)+ ENDM; Layer III antialiasing filter;; a0 = sample buffer xr (INT16); d0 = sblimit;@MPEGSUBF_antialias_MPEGSUBF_antialias movem.l d2-d7/a2,-(sp) fmovem.x fp0-fp3,-(sp) move.w d0,d7 subq.w #1,d7 bmi antialias2 clr.l d5 ; d5 = i = 0antialias1 add.l #18,d5 ; i += SSLIMIT lea (a0,d5.w*4),bu ; bu = xr[ i ] move.l bu,bd ; bd = bu ALIAS_B 8.57492924e-1,-5.14495730e-1 ALIAS_B 8.81741941e-1,-4.71731961e-1 ALIAS_B 9.49628592e-1,-3.13377440e-1 ALIAS_B 9.83314574e-1,-1.81913197e-1 ALIAS_B 9.95517790e-1,-9.4574191e-2 ALIAS_B 9.99160528e-1,-4.0965579e-2 ALIAS_B 9.99899149e-1,-1.4198568e-2 ALIAS_B 9.99993145e-1,-3.699975e-3 dbra d7,antialias1antialias2 fmovem.x (sp)+,fp0-fp3 movem.l (sp)+,d2-d7/a2 rtsFFF_MUL MACRO MOVM (ps1)+,fp0 MOVR fp0,fp1 MOVM -(ps2),fp2 ADDR fp2,fp1 MOVM fp1,(pd1)+ SUBR fp2,fp0 MULI \1,fp0 MOVM fp0,\2*TSIZE-TSIZE(pd1) ENDM;; FF4_MUL s1,s2,s3,s4; s1..s4 must be registers; fp0, s1, s2 modified;; s1 + s4 -> (pd1)+; s2 + s3 -> (pd1)+; (s1 - s4) * 0.54119610014620 -> (pd1)+; (s2 - s3) * 1.30656296487638 -> (pd1)+;FF4_MUL MACRO MOVR \1,fp0 ADDR \4,fp0 MOVM fp0,(pd1)+ MOVR \2,fp0 ADDR \3,fp0 MOVM fp0,(pd1)+ SUBR \4,\1 MULI 5.4119610014620e-1,\1 MOVM \1,(pd1)+ SUBR \3,\2 MULI 1.30656296487638,\2 MOVM \2,(pd1)+ ENDM;; FF2_MUL s1,s2,COSx; s1..s2, COSx must be registers; fp0, s1 modified;; s1 + s2 -> (pd1)+; (s1 - s2) * COSx -> (pd1)+;FF2_MUL MACRO MOVR \1,fp0 ADDR \2,fp0 MOVM fp0,(pd1)+ SUBR \2,\1 MULR \3,\1 MOVM \1,(pd1)+ ENDMfast_filter_sub lea -32*4(a6),ps1 ; ps1=@p(0) ; #1 lea 16*TSIZE(ps1),ps2 ; ps2=@p(16) lea -16*4(a6),pd1 ; pd1=@pp(0) ; #1 FFF_MUL 5.0241928618816e-1,8 ; pp(i=0..7) = p(i) + p(15-i) FFF_MUL 5.2249861493969e-1,8 ; pp(i=8..15) = COSx*[p(i) - p(15-i)] FFF_MUL 5.6694403481636e-1,8 FFF_MUL 6.4682178335999e-1,8 FFF_MUL 7.8815462345125e-1,8 FFF_MUL 1.06067768599035,8 FFF_MUL 1.72244709823833,8 FFF_MUL 5.10114861868917,8 lea -16*4(a6),ps1 ; ps1=@pp(0) ; #1 lea 8*TSIZE(ps1),ps2 ; ps2=@pp(8) lea -32*4(a6),pd1 ; pd1=@p(0) ; #1 FFF_MUL 5.0979557910416e-1,4 ; p(i=0..3) = pp(i) + pp(7-i) FFF_MUL 6.0134488693505e-1,4 ; p(i=4..7) = COSx*[pp(i) - pp(7-i)] FFF_MUL 8.9997622313642e-1,4 FFF_MUL 2.56291544774151,4 lea 4*TSIZE(ps1),ps1 ; ps1=@pp(8) lea 8*TSIZE(ps1),ps2 ; ps2=@pp(16) lea 4*TSIZE(pd1),pd1 ; pd1=@p(8) FFF_MUL 5.0979557910416e-1,4 FFF_MUL 6.0134488693505e-1,4 FFF_MUL 8.9997622313642e-1,4 FFF_MUL 2.56291544774151,4 lea -32*4(a6),ps1 ; ps1=@p(0) ; #1 lea -16*4(a6),pd1 ; pd1=@pp(0) ; #1 MOVM (ps1)+,fp1 ; get p0..p3 MOVM (ps1)+,fp2 MOVM (ps1)+,fp3 MOVM (ps1)+,fp4 FF4_MUL fp1,fp2,fp3,fp4 MOVM (ps1)+,fp1 ; get p4..p7 MOVM (ps1)+,fp2 MOVM (ps1)+,fp3 MOVM (ps1)+,fp4 FF4_MUL fp1,fp2,fp3,fp4 MOVM (ps1)+,fp1 ; get p8..p11 MOVM (ps1)+,fp2 MOVM (ps1)+,fp3 MOVM (ps1)+,fp4 FF4_MUL fp1,fp2,fp3,fp4 MOVM (ps1)+,fp1 ; get p12..p15 MOVM (ps1)+,fp2 MOVM (ps1)+,fp3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -