📄 coldfire_mpegsubb.s
字号:
//MPEGSUBB_filter_band: move.l sp@(4), a0 move.l sp@(8), a1 move.l sp@(12), d1 move.l sp@(16), d0 ext.l d0 sub.l #44, sp movem.l d2-d7/a2-a6,(sp) move.l d1, a2 move.l d0,d7 // #2 link a6,#-32*4 // #2 need of 2*16 longs moveq.l #MUL_SHIFT,d6 // For MUL32 normalize shift move.l a0,ps1 // ps1=fraction(0) lea 32*2(ps1),ps2 // ps2=fraction(32)// lea filter_p,pd1 // pd1=@p(0) lea -32*4(a6),pd1 // pd1=@p(0)// move.w freq_div,d0// cmp.w #4,d0 cmp.l #4,d7 // #2 jbne filter_band1 // Filter only 1/4 freq move.l #8-1,d2filter_band_q1: // p(i=0..7) = f(i) move.w (ps1)+,d0 ext.l d0 move.l d0,(pd1)+ DBRA (d2,filter_band_q1)// lea filter_p,ps1 // ps1=@p(0) lea -32*4(a6),ps1 // ps1=@p(0) lea 8*4(ps1),ps2 // ps2=@p(8)// lea filter_pp,pd1 // pd1=@pp(0) lea -16*4(a6),pd1 // pd1=@pp(0) FFF_MUL (COS1_16,4) // pp(i=0..3) = p(i) + p(7-i) FFF_MUL (COS3_16,4) // pp(i=4..7) = COSx*[p(i) - p(7-i)] FFF_MUL (COS5_16,4) FFF_MUL (COS7_16,4)// lea filter_pp,ps1 // ps1=@pp(0) lea -16*4(a6),ps1 // ps1=@pp(0)// lea filter_p,pd1 // pd1=@p(0) lea -32*4(a6),pd1 // pd1=@p(0) move.l (ps1)+, d1 // get pp0..pp3 move.l (ps1)+, d2 move.l (ps1)+, d3 move.l (ps1)+, d4 FF4_MUL (d1,d2,d3,d4) move.l (ps1)+, d1 // get pp4..pp7 move.l (ps1)+, d2 move.l (ps1)+, d3 move.l (ps1)+, d4 FF4_MUL (d1,d2,d3,d4)// lea filter_p,ps1 // ps1=@p(0) lea -32*4(a6),ps1 // ps1=@p(0)// lea filter_p,pd1 // pd1=@p(0) lea -32*4(a6),pd1 // pd1=@p(0) move.l #COS1_4,d3 move.l #4-1,d4fast_filter_q2: move.l (ps1)+,d1 move.l (ps1)+,d2 FF2_MUL (d1,d2,d3) DBRA (d4,fast_filter_q2)// lea filter_p,ps1 // ps1=@p(0) lea -32*4(a6),ps1 // ps1=@p(0) GET_P (1,d1) SET_S0 (0,d1) neg.l d1 SET_S1 (0,d1) GET_P (5,d1) ADD_P (7,d1) SET_S0_P (4,d1) GET_P (3,d1) SET_S0_P (8,d1) GET_P (7,d1) SET_S0_P (12,d1) SET_S0 (16,#0) GET_P (6,d3) ADD_P (7,d3) move.l d3,d4 ADD_P (5,d4) SET_S1_P (4,d4) GET_P (2,d4) ADD_P (3,d4) SET_S1_P (8,d4) move.l d3,d4 ADD_P (4,d4) SET_S1_P (12,d4) GET_P (0,d4) neg.l d4 SET_S1 (16,d4) jbra filter_band9filter_band1:// cmp.w #2,d0 cmp.l #2,d7 // #2 jbne filter_band2 // Filter only 1/2 freq move.l #16-1,d2filter_band_h1: // p(i=0..15) = f(i) move.w (ps1)+,d0 ext.l d0 move.l d0,(pd1)+ DBRA (d2,filter_band_h1) jbra filter_band3filter_band2: // Filter full freq move.l #16-1,d2filter_band_f1: // p(i=0..15) = f(i) + f(31-i) move.w (ps1)+,d0 move.w -(ps2),d1 ext.l d0 ext.l d1 add.l d0,d1 move.l d1,(pd1)+ DBRA (d2,filter_band_f1)filter_band3: jbsr fast_filter_sub// lea filter_p,ps1 // ps1=@p(0) lea -32*4(a6),ps1 // ps1=@p(0) GET_P (13,d0) ADD_P (15,d0) GET_P (1,d1) SET_S0 (0,d1) neg.l d1 SET_S1 (0,d1) move.l d0,d1 ADD_P (9,d1) SET_S0_P (2,d1) GET_P (5,d1) ADD_P (7,d1) SET_S0_P (4,d1) move.l d0,d1 ADD_P (11,d1) SET_S0_P (6,d1) GET_P (3,d1) SET_S0_P (8,d1) GET_P (11,d1) ADD_P (15,d1) SET_S0_P (10,d1) GET_P (7,d1) SET_S0_P (12,d1) GET_P (15,d1) SET_S0_P (14,d1) SET_S0 (16,#0) ADD_P (14,d0) GET_P (12,d1) ADD_P (14,d1) ADD_P (15,d1) GET_P (10,d2) ADD_P (11,d2) GET_P (6,d3) ADD_P (7,d3) move.l d0,d4 ADD_P (9,d4) SET_S1_P (2,d4) move.l d3,d4 ADD_P (5,d4) SET_S1_P (4,d4) move.l d0,d4 add.l d2,d4 SET_S1_P (6,d4) GET_P (2,d4) ADD_P (3,d4) SET_S1_P (8,d4) move.l d1,d4 add.l d2,d4 SET_S1_P (10,d4) move.l d3,d4 ADD_P (4,d4) SET_S1_P (12,d4) move.l d1,d4 ADD_P (8,d4) SET_S1_P (14,d4) GET_P (0,d4) neg.l d4 SET_S1 (16,d4)// move.w freq_div,d0// cmp.w #1,d0 cmp.l #1,d7 // #2 jbne filter_band9 move.l a0,ps1 // ps1=fraction(0) lea 32*2(ps1),ps2 // ps2=fraction(32)// lea filter_p,pd1 // pd1=@p(0) lea -32*4(a6),pd1 // pd1=@p(0) lea pc@(filter_cos64),a0 move.l #16-1,d2filter_band_f2: // p(i=0..15) = COSx*[f(i) - f(31-i)] move.w (ps1)+,d0 move.w -(ps2),d1 ext.l d0 ext.l d1 sub.l d1,d0 MUL32AM ((a0)+,d0) move.l d0,(pd1)+ DBRA (d2,filter_band_f2) jbsr fast_filter_sub// lea filter_p,ps1 // ps1=@p(0) lea -32*4(a6),ps1 // ps1=@p(0) GET_P (13,d0) ADD_P (15,d0) GET_P (11,d1) ADD_P (15,d1) GET_P (5,d2) ADD_P (7,d2) move.l d0,d3 ADD_P (9,d3) move.l d3,d4 ADD_P (1,d4) SET_S0_P (1,d4) move.l d2,d4 add.l d3,d4 SET_S0_P (3,d4) move.l d0,d3 ADD_P (11,d3) move.l d3,d4 add.l d2,d4 SET_S0_P (5,d4) move.l d3,d4 ADD_P (3,d4) SET_S0_P (7,d4) move.l d1,d4 ADD_P (3,d4) SET_S0_P (9,d4) move.l d1,d4 ADD_P (7,d4) SET_S0_P (11,d4) GET_P (7,d4) ADD_P (15,d4) SET_S0_P (13,d4) GET_P (15,d4) SET_S0_P (15,d4) ADD_P (14,d0) GET_P (12,d1) ADD_P (14,d1) ADD_P (15,d1) GET_P (10,d2) ADD_P (11,d2) GET_P (6,d3) ADD_P (7,d3) GET_P (1,d4) ADD_P (9,d4) add.l d0,d4 SET_S1_P (1,d4) GET_P (5,d5) add.l d3,d5 add.l d0,d5 GET_P (9,d4) add.l d5,d4 SET_S1_P (3,d4) move.l d5,d4 add.l d2,d4 SET_S1_P (5,d4) GET_P (2,d5) ADD_P (3,d5) add.l d2,d5 move.l d0,d4 add.l d5,d4 SET_S1_P (7,d4) move.l d1,d4 add.l d5,d4 SET_S1_P (9,d4) GET_P (4,d5) add.l d3,d5 add.l d1,d5 move.l d2,d4 add.l d5,d4 SET_S1_P (11,d4) GET_P (8,d4) add.l d5,d4 SET_S1_P (13,d4) GET_P (0,d4) ADD_P (8,d4) add.l d1,d4 SET_S1_P (15,d4)filter_band9: unlk a6 // #2 movem.l (sp),d2-d7/a2-a6 add.l #44,sp rtsfilter_cos64: dc.l COS1_64, COS3_64, COS5_64, COS7_64 dc.l COS9_64, COS11_64, COS13_64, COS15_64 dc.l COS17_64, COS19_64, COS21_64, COS23_64 dc.l COS25_64, COS27_64, COS29_64, COS31_64 // #2 Begin // pcm_loops[ freq_div ] = = (32 / freq_div) - 1pcm_loops: dc.w 0, 31, 15, 9, 7, 0 // #2 End#define WINDOW_CLIP 1//// Window a sub band filtered sample//// a0: out_filter_buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -