📄 mpa_layer2mc.s
字号:
%1 eld rp2, #lfe_fraction + 1
ebk #0000b
eld a, rpd1.mc_channel
eld b, rpd1.sblimit_mc
ecld r7, a
ecld r6, b
ld r10, r6
ld r13, r7 ; r13 => mc channels
add r7, #STEREO
ld r11, r7 ; r11 => total channels
dec r11
ld r0, #0x80 ; high word of -1.0
ld r8, #0 ; granule count
eld a, rpd1.alloc_tbl_ptr ; allocation table pointer
eld rpd1, a
eld rp0, #fraction+96+96
mc_gr_loop_start
eld rp1, #bit_alloc+64
eld rp2, rpd1
ld r6, #0 ; subband count
ld r7, #STEREO ; start_ch
lfe_sample
eld a, layer_info+lfe_allocation
ecp a, #0
ebrad ec0, save_lfe_spl
eld d, #0
eadd a, #1
jsr getbits
save_lfe_spl ebk #0100b
eld @rp2+d0, d
ebk #0000b
mc_sb_loop_start
; search the valid transmission channel
ebk #1011b
ecld a, r6
eld rp3, #sbgr_table
erpn rp3, a
eld b, @rp3 ; the number of sbgr.
eld rp3, #dyn_cross_mode
erpn rp3, b
eld c, @rp3 ; dyn_cross_mode[sbgr]
eld rp0, rp1 ; tc_table pointer
erpn rp0, c
ebk #0000b
mc_ch_loop_start
eld a, @rp1+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebra ec0, mc_ch_not_transmitted
cmp eq, r9, #TRUE ; if (dyn_cross_on == 1)
brf mc_decode_sample
dyn_mode_transmitted_ch
ebk #0001b
eld d, @rp0+s0 ; tc_table[dyn_cross_mode[sbgr]]
ecp d, #5
ebra ec1, mc_channel_copied
ebk #0000b
mc_decode_sample
bsrd MPG_II_decode_sample
eld mc0, rp2
eld rp2, mc0
mc_ch_loop_check
cmp eq, r7, r11
brfd mc_ch_loop_start
inc r7
mc_sb_loop_check
inc r6 ; sb increase
erpn rp2, #16
cmp gt, r13, #1
brfd %f1 ; T bit = !flag
erps rp0+s0
ld r7, r13
sub r7, #2
bnzd r7, $
erps rp0+s1
%1 cmp ge, r6, r10
brfd mc_sb_loop_start
ld r7, #STEREO
rest_subband_sample
; remain subband samples are zero in each granule
ld r2, r10 ; mc_sblimit
ld r3, r13 ; mc_channel
ecld a, r2
ld r6, #SBLIMIT-1
sub r6, r10
ld r2, r6
ld r7, #PARTS
mul uu, r7, r3
dec r7
eld d, #0
%2 bnzd r6, $
eld @rp0+d0, d
erpn rp0, a
bnzd r7, %b2
ld r6, r2
mc_gr_loop_check
ld r2, #MAX_CHANNEL
sub r2, r13 ; MAX_CHANNEL-mc_channel
ld r1, #PARTS*SBLIMIT
mul uu, r2, r1
sub r2, r10
ecld a, r2
erpn rp0, a
cmp eq, r8, #GRANULES-1
brfd mc_gr_loop_start
inc r8
bra mc_denormalize_sample
mc_ch_not_transmitted
eld @rp0+d1, a
eld @rp0+d1, a
eld @rp0+d1, a
ebk #0001b
erps rp0+s0
brad mc_ch_loop_check
ebk #0000b
mc_channel_copied
ebk #1000b
eld rp3, rp0
ecp d, #0
ebra ec0, copy_from_T0
ecp d, #1
ebra ec0, copy_from_T1
ecp d, #2
ebra ec0, copy_from_T2
ecp d, #3
ebra ec0, copy_from_T3
; if index is 4 or 6
bra copy_from_T01
copy_from_T0 ld r1, r7
sub r7, #1
bnzd r7, $
erpd rp3+d1
brad copy_sample
ld r7, r1
copy_from_T1 ld r1, r7
sub r7, #2
bnzd r7, $
erpd rp3+d1
brad copy_sample
ld r7, r1
copy_from_T2 ld r1, r7
sub r7, #3
bnzd r7, $
erpd rp3+d1
brad copy_sample
ld r7, r1
copy_from_T3 brad copy_sample
erpd rp3+d1
copy_from_T01 eld b, layer_info+dyn_cross_bits
ecld r1, b
eld d, rp3
ecld b, r6
eld rp3, #sbgr_table
erpn rp3, b
eld b, @rp3 ; the number of sbgr.
eld rp3, #dyn_cross_mode
erpn rp3, b
eld c, @rp3 ; dyn_cross_mode[sbgr]
eld rp3, #tc_alloc
erpn rp3, b
eld si, @rp3 ; tc_alloc[sbgr]
ecld r2, si
eld rp3, d
cmp eq, r1, #4
brt dyn_mode_4_bits
cmp eq, r1, #3
brt dyn_mode_3_bits
cmp eq, r1, #1
brt dyn_mode_1_bits
cmp eq, r1, #0
brt dyn_mode_0_bits
dyn_mode_4_bits
cmp eq, r2, #1
brt copy_from_T0
cmp eq, r2, #7
brt copy_from_T0
cmp eq, r2, #2
brt copy_from_T1
cmp eq, r2, #6
brt copy_from_T1
eld b, layer_info+dyn_cross_LR
ecp b, #1
ebra ec0, copy_from_T1
bra copy_from_T0
dyn_mode_3_bits
eld b, rpd0.surround
ecld r1, b
ecp c, #1
ebra ec0, _3bits_md1
ecp c, #2
ebra ec0, _3bits_md2
ecp c, #3
ebra ec0, _3bits_md3
_3bits_md1
.ifdef _DEBUG_
cmp eq, r7, #3
/** debug **/ brf $
.endif
cmp eq, r1, #STEREO_SURROUND
brt copy_from_T1
cmp eq, r2, #4
brt copy_from_T1
cmp eq, r2, #5
brt copy_from_T1
cmp eq, r2, #3
brt copy_from_T0
eld c, layer_info+dyn_cross_LR
ecld r1, c
cmp eq, r1, #1
brt copy_from_T1
bra copy_from_T0
_3bits_md2
.ifdef _DEBUG_
cmp eq, r7, #2
/** debug **/ brf $
.endif
cmp eq, r1, #STEREO_SURROUND
brt copy_from_T0
cmp eq, r2, #1
brt copy_from_T0
cmp eq, r2, #5
brt copy_from_T0
cmp eq, r2, #2
brt copy_from_T1
eld c, layer_info+dyn_cross_LR
ecld r1, c
cmp eq, r1, #0
brt copy_from_T0
bra copy_from_T1
_3bits_md3 cmp eq, r7, #2
brt _3bits_md2
cmp eq, r7, #3
brt _3bits_md1
dyn_mode_1_bits
cmp eq, r7, #2
brf dyn_2nd_stereo
ecp c, #0
ebra ec0, transmitted_channel
_1bits_md1_tc0 cmp eq, r2, #0
brf _1bits_md1_tc1
eld c, layer_info+dyn_cross_LR
ecld r1, c
cmp eq, r1, #1
brt copy_from_T1
bra copy_from_T0
_1bits_md1_tc1 cmp eq, r2, #1
brt copy_from_T0
_1bits_md1_tc2 bra copy_from_T1
dyn_2nd_stereo
cmp eq, r7, #3
brt transmitted_channel
eld d, rp2
eld rp2, #dyn_second_stereo
erpn rp2, b
eld c, @rp2
eld rp2, d
ecld r2, c
cmp eq, r2, #1
brt copy_from_T3
bra transmitted_channel
dyn_mode_0_bits
eld c, rpd0.surround
ecp c, #SECOND_STEREO
ebra ec1, return_mc_ch_loop_check
cmp eq, r7, #2
brt transmitted_channel
eld d, rp2
eld rp2, #dyn_second_stereo
erpn rp2, b
eld c, @rp2
eld rp2, d
ecld r2, c
cmp eq, r2, #1
brt copy_from_T2
bra transmitted_channel
transmitted_channel
brad mc_decode_sample
ebk #0000b
copy_sample
eld b, @rp3+s1 ; PART 1
eld c, @rp3+s1 ; PART 2
eld d, @rp3+s1 ; PART 3
eld @rp0+d1, b
eld @rp0+d1, c
eld @rp0+d1, d
return_mc_ch_loop_check
brad mc_ch_loop_check
ebk #0000b
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Denormalize samples ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
mc_denormalize_sample
; multiply scalefactors
eld rpd1, #layer_info
eld a, rpd1.mpeg_version
ecp a, #_MPEG_2_AUG_AUDIO
ebrad ec0, end_of_mc_layer_II_decoding
mRETURN (_DECODE_OK)
jsr MC_II_denormalize_sample
mRETURN (_DECODE_OK)
end_of_mc_layer_II_decoding
er psh1
er usm
er xsd
er op
er opm
pop a14, a10
ret
/********************************************************************
The end of MC_layer_II_decode
********************************************************************/
/************ Subroutines of MC_layer_II_decode part ***************/
/********************************************************************
Function: MC_II_dyncross_bitalloc
Description: Decode bit allocation of dynamic crosstalk mode.
Arguments: r0 - certer mode
r1 - surround mode
r5 - stereo
r8 - dyn_cross_bits value
r10 - sblimit value
r11 - mc channels
rp0 - bit_alloc[2][0] buffer pointer
rp1 - nbal_table pointer
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: x 1 x x
sd1: x x 0 1
sd2: x x x 0
@bank1
d1 d0 s1 s0
---------------------------------------
sd2: x x 2 1
********************************************************************/
MC_II_dyncross_bitalloc:
push a14
er xsd
ebk #0100b
eld sd2, #0x0021
eld rp2, #bit_alloc
ebk #0000b
eld sd0, #0x0100
eld sd1, #0x0001
eld sd2, #0x0000
eld rp2, #dyn_cross_mode
eld mc0, rp2
eld rp2, #sbgr_table
eld mc1, rp2
eld a, rpd1.dyn_cross_bits
ecld r2, a
ld r7, #0
dyn_bitalloc_sb_loop_start
; search the valid sbgr & dyn_cross_mode[sbgr]
eld rp2, mc1 ; sbgr_table
ecld a, r7
erpn rp2, a
eld b, @rp2 ; sbgr No.
eld rp2, mc0 ; dyn_cross_mode
erpn rp2, b
eld c, @rp2 ; dyn_cross_mode[sbgr]
ecld r3, c
cmp eq, r3, #0
brt __dyn_cross_mode_0__
ebk #0100b
eld y0, @rp2+s0 ; T0: bit_alloc[0][sb]
eld y1, @rp2+s0 ; T1: bit_alloc[1][sb]
ebk #0000b
cmp eq, r2, #4
brt __dyn_cross_bits_4__ ; channel mode 3/2
cmp eq, r2, #3
brt __dyn_cross_bits_3__ ; channel mode 3/1 and 2/2
cmp eq, r2, #1
brt __dyn_cross_bits_1__ ; channel mode 3/0 and 2/1
.ifdef _DEBUG_
/** debug **/ bra $
.endif
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -