📄 mpa_layer1.s
字号:
%1 eld a, @rp1+s1
ecp a, #0
ebra ec2, %f2
eld a, @rp2+s1
ecp a, #0
ebra ec2, %f2
eld a, @rp3+s1
ecp a, #0
ebra ec2, %f2
eld a, #0
%2 erps rp1+s0
erps rp2+s0
erps rp3+s0
bnzd r6, %b1
eld @rp0+d0, a
esec2 #ECP_LE
; initialize mc bs buffer
eld sr, #0 /* bs_buffer */
eld sa, #0 /* bit_count */
esd3 s0, #0
eld rp3, #SBF0_PTR
ld a8, #SFR_BASE
; ld a9, #BS_MULTICHANNEL-SB0_BASE
; ldw @[a8+rSBL0OFF], a9
ld a9, #_buffer_ptr
ldw r1, @[a9+_BS_MULTICHANNEL+0]
ldw r0, @[a9+_BS_MULTICHANNEL+2]
sub r1, #^SB0_BASE ;0x24
ldw @[a8+rSBL0OFF+0], r1
ldw @[a8+rSBL0OFF+2], r0
ld r1, #SB0_RD /* fill command */
ldw @[a8+rSBFCON], r1
brad end_of_layer_I_decoding
mRETURN (_DECODE_OK)
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
; multiply scalefactors
I_denormalize_sample
jsr MPG_I_denormalize_sample
brad end_of_layer_I_decoding
mRETURN (_DECODE_OK)
end_of_layer_I_decoding
pop a14
ret
.if( _DECODER_TYPE != MPEG_1_AUDIO )
/********************************************************************
Function: I_paste_stream
Description:
Arguments: r1: Total bits of current main frame excluded
continuous bit.
********************************************************************/
I_paste_stream:
; mask remain bits of the last byte mc bit stream and fill bits
push a14
eld c, bs_status+I_mc_totbits
eld a, c
eld b, #BITS_PER_WORD
mDIVIDE a, b
esla a
ecld r2, a ; position of last byte
ecld r3, b ; remain bits of the last byte
; ld a12, #BS_MULTICHANNEL
ld a12, #_buffer_ptr
ldw a12, @[a12+_BS_MULTICHANNEL]
add a12, r2
ldw r4, @[a12]
ld r5, #0xffff
%0 cmp eq, r3, #0
brt %f1
sr r5
brad %b0
dec r3
%1 com r5
and r4, r5
; paste ext bitstream to mc stream
esub b, #BITS_PER_WORD
eneg b
eadd c, b
ecld r5, b
sub r1, r5
eld a, b
jsr getbits
ecld r5, d
or r4, r5
ldw @[a12], r4
add a12, #2
%2 cmp gt, r1, #BITS_PER_WORD-1
brf %f3
eld a, #BITS_PER_WORD
eadd c, a
jsr getbits
ecld r4, d
ldw @[a12], r4
add a12, #2
brad %b2
sub r1, #BITS_PER_WORD
%3 ecld a, r1
eadd c, a
jsr getbits
ecld r4, d
ld r6, #BITS_PER_WORD
sub r6, r1
cmp eq, r6, #0
brt %f4
dec r6
bnzd r6, $
sl r4
%4 ldw @[a12], r4
eld bs_status+I_mc_totbits, c
pop a14
ret
/********************************************************************
Function: I_EXT_seek_sync_ext
Description: seek syncword of base bit stream.
********************************************************************/
I_EXT_seek_sync_ext::
push a14
ldw a11, @[a10+_ExtInputBufferOffset]
ld r0, e11
add r0, #^SB0_BASE
ld e11, r0
; ld a14, #EXT_BUF_LIMIT
ld a14, #_buffer_ptr
ldw a14, @[a14+_EXT_BUF_LIMIT]
; search mpg-1 sync word
_1_byte_ext ldb r0, @[a11]
add a11, #1
cmp eq, a11, a14
brf _2_byte_ext
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
_2_byte_ext ldb r1, @[a11]
add a11, #1
cmp eq, a11, a14
brf check_ext_sync
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
check_ext_sync
slb r0
or r0, r1
and r0, #0x7ff0
cmp eq, r0, #EXT_SYNC_WORD<<4
brfd I_end_seek_sync_ext
mRETURN (_EXT_SYNC_NOT_FOUND)
_3_byte_ext ldb r2, @[a11]
add a11, #1
cmp eq, a11, a14
brf _4_byte_ext
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
_4_byte_ext ldb r3, @[a11]
add a11, #1
cmp eq, a11, a14
brf get_ext_crc
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
get_ext_crc
slb r1
or r1, r2
sl r1
sl r1
sl r1
sl r1
ld r6, r3
sr r3
sr r3
sr r3
sr r3
or r1, r3
ecld a, r1
eld rpd0.ext_crc_val, a
_5_byte_ext ldb r1, @[a11]
add a11, #1
cmp eq, a11, a14
brf I_get_ext_length
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
I_get_ext_length
ld r2, #0
slb r6
or r6, r1
sr r6
incc r2
and r6, #0x7ff
ecld a, r6
ecld b, r2
eld rpd0.ext_length, a
eld rpd0.ext_ID, b
; copy extension stream to BS_EXTENSION
ecld r7, a
cmpu gt, r7, #EXT_HEADER_SIZE
brfd I_end_seek_sync_ext
mRETURN (_DECODE_OK)
; ld a12, #BS_EXTENSION
ld a12, #_buffer_ptr
ldw a12, @[a12+_BS_EXTENSION]
sub r7, #EXT_HEADER_SIZE+1
%4 ldb r0, @[a11]
add a11, #1
ldb @[a12], r0
cmp eq, a11, a14
brf %f5
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
%5 bnzd r7, %b4
add a12, #1
; mandatory extension CRC check
eld a, rpd1.mandatory_crc_check
ecp a, #TRUE
ebra ec1, I_end_seek_sync_ext
; ld a12, #BS_EXTENSION
ld a12, #_buffer_ptr
ldw a12, @[a12+_BS_EXTENSION]
jsr MC_EXT_error_check
eld a, rpd0.ext_crc_val
ecp c, a
ebra ec1, error_crc_ext
mRETURN (_DECODE_OK)
I_end_seek_sync_ext
ld r0, e11
sub r0, #^SB0_BASE ;#0x24
ld e11, r0
ldw @[a10+_ExtInputBufferOffset], a11
pop a14
ret
;========================================================================;
error_crc_ext:
.ifdef _DEBUG_
/** debug **/ bra $
.endif
eld b, rpd1.error_count
eadd b, #1
eld rpd1.error_count, b
brad I_end_seek_sync_ext
mRETURN (_EXT_CRC_ERROR)
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
/********************************************************************
END of MPG_layer_I_decode
********************************************************************/
/************ Subroutines of MPG_layer_I_decode part ***************/
/********************************************************************
Function: MPG_I_decode_sample
Description: Decode subband sample code from bit stream and degouping.
1. Decode sample
bits = bit_alloc[sb][ch]
sample = getbits(bits+1)
2. Dequantize sample
The requantized value can be obtained by applying a
linear formula.
for Layer I :
2^nb
s' = ------------ * (s" + 2^(-nb+1))
2^nb - 1
where s" is fractional number, s' is requantized
value and nb is the number of bitalloc.
Arguments: rp0 sample buffer (fraction) pointer.
rp2 allocation table pointer of current sb.
a bit_alloc[sb][ch]
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: 32 x x x
sd2: x x 0 x
@bank1
d1 d0 s1 s0
---------------------------------------
sd3: x x x 16
********************************************************************/
MPG_I_decode_sample:
push a14
ecld r1, a
jsr getbits
eld b, d
; mGETBITS
; invert most significant bit, extend sign, dequantize sample
; then scale to fixed format.
ebk #1000b
eld c, sr
ecld a, r1 ; index
eld rp3, #I_MSB_position
erpn rp3, a
eld a, @rp3+s0
esft b, a ; b: sample
etst c, ec3 ; check msb is +/-
brad ec3, %f1
eld b, #0 ; 0.0
ecld bh, r0 ; -1.0
%1 eld a, #-1
esft sr, a
eadd b, sr ; 2's complement sample
; dequantize the sample
eld ma0, @rp3+s0 ; I_dequant_coeff_1
eadd b, ma0, y1, @rp3+s0 ; I_dequant_coeff_2
eld x0, b
emul x0y1
; 2002.09.26, move to upper loop for empty delay slot
; eld @rp0+d1, p ; dequantized sample[part]
eld sr, c
ebk #0000b
pop a14
ret
/********************************************************************
Function: MPG_I_denormalize_sample
Description: Denormalize sample.
The requantized values have to be rescaled.
The multiplication factors in Table B.1 "Layer I,II
scalefactors", ISO/IEC 11172-3: 1993
Next the dequantized values have to be rescaled
s' = scalefactor * s"
where s' is denormalized sample, s" is dequantized
sample value.
Arguments: - rp0 fraction buffer pointer.
- rp1 scale_index buffer pointer.
- rp3 scalefactor table pointer
NOTE!
x0 (fraction -1 ~ 1, 1.23 integer format) is signed and
y1 (scalefactor 0 ~ 1, 0.24 integer format) is unsigned number.
xsd, psh1, usm flags must be set to 1.
index registers:
@bank1
d1 d0 s1 s0
---------------------------------------
sd0: -95 32 -64 32
sd1: x x x 3
sd3: x x x 0
********************************************************************/
MPG_I_denormalize_sample:
es psh1
er usm
es opm
ebk #1011b
er xsd
eld sd0, #0x1000
eld sd3, #0x0000
es xsd
eld sd0, #0xa2c2
eld sd3, #0x0000
eld sd1, #0x0003
eld rpd1, #layer_info
eld a, rpd1.layer_I_frames
esla a
esla a
ecld r5, a
eld rp0, #fraction
ld r6, #SBLIMIT-1
ld r2, r6
ld r8, #0
eld b, rpd1.stereo
ecld r0, b
eld c, #scalefactor
eld d, #(MAX_CHANNEL*PARTS-1)*SBLIMIT
eld b, #-PARTS*SBLIMIT
cmp eq, r0, #STEREO
brt I_denorm_gr_loop_start
eld b, #0
I_denorm_gr_loop_start
eld rp1, #scale_index
I_denorm_sb_loop_start
ld r7, r0 ; channels
dec r7
I_denorm_ch_loop_start
eld rp3, c
eld a, @rp1+s0 ; scale_index[sb][ch][part]
erpn rp3, a
eld x0, @rp0+s0, y1, @rp3
emul x0y1, x0, @rp0+s0
emld ma0, x0y1, x0, @rp0+s1
emld ma1, x0y1
eld @rp0+d0, ma0
eld ma0, p, @rp0+d0, ma1
bnzd r7, I_denorm_ch_loop_start
eld @rp0+d0, ma0
erpd rp0+d1
bnzd r6, I_denorm_sb_loop_start
erpn rp0, b
I_denorm_gr_loop_check
erpn rp0, d
inc r8
cmp eq, r8, r5 ;#GRANULES
brfd I_denorm_gr_loop_start
ld r6, r2
ebk #0000b
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -