📄 mpa_layer1.s
字号:
/*
* mpa_layer1.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.include "mpa_reg.h"
.secFILE_mpa_layer1
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::::::[ Layer I stuff ]:::::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
MPG_layer_I_decode::
push a14
eld a, rpd1.mpeg_version
ecp a, #_MPEG_1_AUDIO
ebrad ec0, main_frames
eld a, #1
eld a, #3
main_frames eld rpd1.layer_I_frames, a
eld a, #0
eld rpd1.layer_I_parts, a
eld bs_status+I_mc_totbits, a
eld bs_status+I_frame_size, a
eld rpd1, #backup_register
eld rp1, #fraction
eld rpd1.area_backup, rp1
part_loop_start
eld rpd1, #layer_info
; mpeg-2 layer I stream is repeated 3 times by mpeg-1 layer I frame
; search sync word, header parsing in 2'nd audio data
eld a, rpd1.layer_I_parts
ecp a, #0
ebra ec0, I_decode_bitalloc
.if( _DEBUG_BITS == TRUE )
ld a11, #_bit_pos
ld r0, #0
ldw @[a11], r0
.endif
jsr MPG_seek_sync_base
cmp eq, r2, #_DECODE_OK
brf end_of_layer_I_decoding
; header parsing
jsr MPG_parse_base_header
; check main audio data is present or not
eld a, rpd1.frame_size
ecld r0, a
cmp gt, r0, #BASE_HEADER_SIZE
brfd end_of_layer_I_decoding
mRETURN (_NO_MAIN_AUDIO_DATA)
; check protection and get CRC value if protection enable
eld a, rpd0.protection_bit
ecp a, #ERROR_PROTECT_NONE
ebrad ec0, %f1
eld d, #-1
eld a, #CRC_WORD_LENGTH
jsr getbits
%1 eld rpd0.crc_val, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode bit allocations & scalefactor ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: 64 1 0 1
; sd1: 3 1 x x
;
I_decode_bitalloc
ebk #0000b
er xsd
eld sd0, #0x0101
eld sd1, #0x3100
es xsd
eld sd0, #0x4000
eld a, rpd1.layer_I_parts
eld rp0, #bit_alloc ; part 'n' bit allocation
ecp a, #0
ebra ec0, %f1
ecld r7, a
dec r7
bnzd r7, $
erpd rp0+d1
%1
ebk #0010b ; for MPG_I_CRC_calc
eld rp1, rp0
ebk #0000b
eld a, rpd1.jsbound
eld b, rpd1.stereo
ecld r6, a
ecld r7, b
ld r11, #SBLIMIT
ld r12, r6 ; jsbound
ld r13, r7 ; stereo
mul uu, r6, r7
dec r6
%1 eld a, #4
jsr getbits
bnzd r6, %b1
eld @rp0+d0, d
ld r2, r12 ; jsbound
ld r3, r11 ; sblimit
dec r7
ld r1, r7
%2 cmp ge, r2, r3
brt I_decode_scalefactor
eld a, #4
jsr getbits
bnzd r7, $
eld @rp0+d0, d
inc r2
brad %b2
ld r7, r1
I_decode_scalefactor
eld a, rpd1.layer_I_parts
eld rp0, #bit_alloc ; part 'n' bit allocation
eld rp1, #scale_index
ecp a, #0
ebra ec0, %f1
ecld r7, a
dec r7
erpd rp0+d1
bnzd r7, $-2
erpd rp1+d0
%1
ld r7, r13
ld r6, #SBLIMIT
mul uu, r6, r7
dec r6
eld p, #SCALE_RANGE-1
%2 eld b, @rp0+s0
eld d, p
ecp b, #0
ebra ec0, %f3
eld a, #6
jsr getbits
%3 bnzd r6, %b2
eld @rp1+d1, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: CRC check ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
I_check_CRC_word
eld a, rpd0.protection_bit
ecp a, #ERROR_PROTECT_NONE
ebra ec0, I_decode_subband_sample
jsr MPG_I_CRC_calc
eld a, rpd0.crc_val
ecp a, c
ebra ec0, I_decode_subband_sample
.ifdef _DEBUG_
/** debug **/ bra $
.endif
eld b, rpd1.error_count
eadd b, #1
eld rpd1.error_count, b
jsr recover_CRC_error
brad end_of_layer_I_decoding
mRETURN (_BASE_CRC_ERROR)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode samples ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; fraction buffer structure
; gr0 ch0 0x2000 :<--- 96 --->:
; ch1 0x2060 :<--- 96 --->:
;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: 96(64) 1 -96 -95
; sd1: x x x 1
;
; @bank1 (dequantize process)
; d1 d0 s1 s0
; ---------------------------------------
; sd3: x x x 16
;
; decode sample and requantize
;
I_decode_subband_sample
es psh1
es usm
es op
es opm
ebk #1000b
er xsd
eld sd3, #0x0000
es xsd
eld sd3, #0x0001
ebk #0000b
er xsd
eld sd0, #0x0101
es xsd
eld sd0, #0x40aa
eld sd1, #0x0001
eld a, rpd1.layer_I_parts
eld rp0, #bit_alloc ; part 'n' bit allocation
ecp a, #0
ebra ec0, %f1
ecld r7, a
dec r7
bnzd r7, $
erpd rp0+d1
%1 eld rp2, rp0
eld a, rpd1.jsbound
eld b, rpd1.stereo
ecld r4, a
ecld r5, b
dec r4
dec r5
ld r6, r4 ; jsbound
ld r7, r5 ; stereo
ld r3, #PARTS ; fraction buffer control
eld rpd1, #backup_register
eld rp1, rpd1.area_backup
eld rp0, rp1 ; fraction
esd0 d1, #6
ld r0, #0x80 ; high word of -1.0
ld r8, #GRANULES ; granule loop count
granule_loop_start
eld rp1, rp2
sbband_loop_start
channel_loop_start
eld a, @rp1+s0
ecp a, #0
ebrad ec0, channel_loop_check ;smpl_not_transfered
eld p, a
bsrd MPG_I_decode_sample
eadd a, #1
channel_loop_check
bnzd r7, channel_loop_start
eld @rp0+d1, p ; dequantized sample[part]
erps rp0+s0
tst r5, r5 ; if T=1, mono
brt 2
erps rp0+s1
sbband_loop_check
bnzd r6, sbband_loop_start
ld r7, r5
; if joint stereo mode (jsbound < 32)
cmp ge, r12, #SBLIMIT
brt fraction_buffer_control
ld r9, r12
esd0 s1, #6
esd1 s0, #2
I_js_loop_start
eld a, @rp1+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebrad ec0, I_js_loop_check
eld p, a
bsrd MPG_I_decode_sample
eadd a, #1
I_js_loop_check
eld @rp0+d1, p ; dequantized sample[part]
eld @rp0+d1, p
erpn rp0, #-(0xc0-1)
cmp ge, r12, #SBLIMIT-1
brfd I_js_loop_start
inc r12
esd0 s1, #0xa
esd1 s0, #1
ld r12, r9
fraction_buffer_control
dt r3
brf granule_loop_check
erpn rp0, #(MAX_CHANNEL-1)*96
ld r3, #PARTS
granule_loop_check
dt r8
brfd granule_loop_start
ld r6, r4
er xsd
er psh1
; code for MPEG-2
eld rp1, rp0 ; fraction
eld rpd1.area_backup, rp1
; if mpeg-2, parsing mc header
eld a, layer_info+mpeg_version
ecld r0, a
cmp eq, r0, #_MPEG_1_AUDIO
brt I_denormalize_sample
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::[ MPEG 2 part decoding ]::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
.if( _DECODER_TYPE != MPEG_1_AUDIO )
I_mpeg2_mc_part
er xsd
er psh1
er usm
er op
er opm
eld rpd1, #layer_info
eld a, rpd1.layer_I_parts
eadd a, #1
ecp a, #1
ebrad ec1, I_mc_bs_paste
eld rpd1.layer_I_parts, a
jsr MC_parse_mc_header ; if mc_ext_data_part1
I_mc_bs_paste
eld a, bs_status+I_frame_size
eld b, rpd1.frame_size
eadd a, b
eld bs_status+I_frame_size, a
ld a8, #SFR_BASE
ldw a9, @[a8+rSBL0OFF]
ld r1, e9
ld r0, r9
; ld r3, #^(BS_MAIN-SB0_BASE)
; ld r2, #>(BS_MAIN-SB0_BASE)
push a11
ld a11, #_buffer_ptr
ldw r3, @[a11+_BS_MAIN+0]
ldw r2, @[a11+_BS_MAIN+2]
sub r2, #>SB0_BASE
sbc r3, #^SB0_BASE
pop a11
sub r0, r2
sbc r1, r3
ecld r1, b
sub r1, r0
ld r0, #8
mul uu, r1, r0
ecld r0, sa
add r1, r0
eld d, rpd1.layer_I_parts
ecp d, #3
ebra ec0, chk_cont_bit
; remove continuous bit
sub r1, #1
chk_cont_bit cmp gt, r1, #0
brf part_loop_check
jsr I_paste_stream
; remove ancillary bits
eld c, bs_status+I_mc_totbits
eld a, rpd0.n_ad_bytes
esla a
esla a
esla a
esub c, a
eld bs_status+I_mc_totbits, c
part_loop_check
; read continuous bit
eld a, rpd1.layer_I_parts
eld b, rpd1.layer_I_frames
ecld r0, a
ecld r1, b
ecp a, #3
ebra ec0, %f4
eld a, #1 ; read continuous bit
jsr getbits
%4 cmp eq, r0, r1
brf part_loop_start
I_seek_ext_sync
eld a, rpd0.ext_stream_present
ecld r2, a
cmp eq, r2, #TRUE
brf mpeg2_bitalloc
; search extension frame header
jsr I_EXT_seek_sync_ext
cmp eq, r2, #_DECODE_OK
brf end_of_layer_I_decoding
I_ext_bs_paste
; initialize ext bit buffer
eld sr, #0 /* bs_buffer */
eld sa, #0 /* bit_count */
ld a8, #SFR_BASE
; ld a9, #BS_EXTENSION-SB0_BASE
; ldw @[a8+rSBL0OFF], a9
ld a9, #_buffer_ptr
ldw r1, @[a9+_BS_EXTENSION+0]
ldw r0, @[a9+_BS_EXTENSION+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
eld c, bs_status+I_mc_totbits
eld a, rpd0.ext_length
esub a, #EXT_HEADER_SIZE ; remove ext header
eld x0, a
eld y0, #8
emul x0y0
eld b, pl
ecld r1, b
cmp gt, r1, #0
brf mpeg2_bitalloc
jsr I_paste_stream
mpeg2_bitalloc
esec2 #ECP_GT
eld sd0, #0x0100
eld sd1, #0x0001
eld sd2, sd1
eld sd3, sd1
eld rp0, #bit_alloc
eld rp1, #bit_alloc+SBLIMIT*2*PART0
eld rp2, #bit_alloc+SBLIMIT*2*PART1
eld rp3, #bit_alloc+SBLIMIT*2*PART2
eld b, rpd1.stereo
ecld r5, b
ld r6, #SBLIMIT
mul uu, r6, r5
dec r6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -