📄 mpa_common.s
字号:
recheck_ext_sync
slb r0
or r0, r1
and r0, #0x7ff0
cmp eq, r0, #EXT_SYNC_WORD<<4
brf search_ext_sync
bra success_ext_found
ext_sync_not_found
mRETURN (_EXT_SYNC_NOT_FOUND)
pop a14
ret
;========================================================================;
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
/********************************************************************
Function: MPG_parse_base_header
Description: get header information of base bit stream.
Arguments:
********************************************************************/
samplerate: dl 44100, 48000, 32000
bitrate_I: dl 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000
dl 256000, 288000, 320000, 352000, 384000, 416000, 448000
bitrate_II: dl 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000
dl 128000, 160000, 192000, 224000, 256000, 320000, 384000
MPG_parse_base_header::
push a14
bsrd getbits
eld a, #SYNC_WORD_LENGTH
eld rpd0.syncword, d
; 1. MPEG ID
bsrd getbits
eld a, #1
eld rpd0.version, d
; 2. layer
bsrd getbits
eld a, #2
eld c, #4
esub c, d
eld rpd0.layer, c
ecld r0, c
; 3. protection bit
bsrd getbits
eld a, #1
eld rpd0.protection_bit, d
; 4. bitrate index
bsrd getbits
eld a, #4
eld rpd0.bitrate_index, d
ecld r1, d
; 5. sampling frequency
bsrd getbits
eld a, #2
eld rpd0.sampling_frequency, d
ecld r2, d
; 6. padding bit
bsrd getbits
eld a, #1
eld rpd0.padding_bit, d
ld a11, #L2_bitrate_table
cmp eq, r0, #LAYER_I
brf %f1
ld a11, #L1_bitrate_table
%1 sl r1
add a11, r1
ldc r4, @a11 ; r4 := bitrate
ld a12, #samplerate_table
sl r2
add a12, r2
ldc r5, @a12 ; r5 := samplerate
/* For ADM manager system */
ld a11, #bitrate_II
cmp eq, r0, #LAYER_I
brf %f2
ld a11, #bitrate_I
%2 sl r1
add a11, r1
ldc r7, @a11
add a11, #2
ldc r6, @a11 ; r5:r4 = _BitRate
ld e9, r7
ld r9, r6
ldw @[a10+_BitRate], a9
ld a12, #samplerate
sl r2
add a12, r2
ldc r7, @a12
add a12, #2
ldc r6, @a12 ; r5:r4 = _SamplingRate
ld e9, r7
ld r9, r6
ldw @[a10+_SamplingRate], a9
/* */
; 7. private bit
bsrd getbits
eld a, #1
eld rpd0.private_bit, d
; 8. mode
bsrd getbits
eld a, #2
eld rpd0.mode, d
ecld r1, d
; 9. mode extension
bsrd getbits
eld a, #2
eld rpd0.mode_extension, d
ecld r2, d
/******************************************************
select sblimit, jsbound and allocation table
******************************************************/
cmp eq, r1, #MPEG_MODE_SINGLE
brtd $+6
eld c, #MONO
eld c, #STEREO
eld rpd1.stereo, c
eld a, #SBLIMIT
cmp eq, r0, #LAYER_I
brt %f5
ecp c, #MONO
ebra ec0, %f0
sr r4 /* bitrate per channel */
%0 cmp eq, r4, #320
brt %f1
cmp eq, r4, #480
brf %f2
%1 cmp eq, r5, #320
brtd %f4
eld a, #3
brfd %f4
eld a, #2
%2 eld a, #0
cmp eq, r4, #560
brt %f4
cmp eq, r4, #640
brt %f4
cmp eq, r4, #800
brt %f4
%3 cmp eq, r5, #480
brt %f4
eld a, #1
%4 eld rpd1.tbl_num, a
eld rp1, #allocation_tables
erpn rp1, a
esd1 s0, #4
eld a, @rp1+s0 /* sblimit value */
eld b, @rp1 /* allocation table pointer */
eld rpd1.sblimit, a
eld rpd1.alloc_tbl_ptr, b
%5 cmp eq, r1, #MPEG_MODE_JSTEREO
brf %f6
add r2, #1
ld r3, #4
mul uu, r2, r3
ecld a, r2
%6 eld rpd1.jsbound, a
; 10. copyright
bsrd getbits
eld a, #1
eld rpd0.copyright, d
; 11. original
bsrd getbits
eld a, #1
eld rpd0.original, d
; 12. emphasis
bsrd getbits
eld a, #2
eld rpd0.emphasis, d
pop a14
ret
/********************************************************************
Function: MC_parse_mc_header
Description: get header information of mc bit stream.
********************************************************************/
.if( _DECODER_TYPE != MPEG_1_AUDIO )
MC_parse_mc_header::
push a14
; 1. extension bit stream
bsrd getbits
eld a, #1
eld rpd0.ext_stream_present, d
; 2. additional bytes for ancillary data
ecp d, #TRUE
ebra ec1, %f1
bsrd getbits /* MPEG-1 compatible ancillary data field size */
eld a, #8
%1 eld rpd0.n_ad_bytes, d
; 3. center channel
bsrd getbits
eld a, #2
eld rpd0.center, d
; 4. surround channel
bsrd getbits
eld a, #2
eld rpd0.surround, d
; 5. low frequency enhancement channel
bsrd getbits
eld a, #1
eld rpd0.lfe, d
; 6. large or small room
bsrd getbits
eld a, #1
eld rpd0.audio_mix, d
; 7. dematrix procedure
bsrd getbits
eld a, #2
eld rpd0.dematrix_procedure, d
; 8. multilingual channels
bsrd getbits
eld a, #3
eld rpd0.no_of_multi_lingual_ch, d
; 9. sampling freq. of multilingual channel
bsrd getbits
eld a, #1
eld rpd0.multi_lingual_fs, d
; 10. layer of multilingual channel
bsrd getbits
eld a, #1
eld rpd0.multi_lingual_layer, d
; 11. 72-bit copyright identification field
bsrd getbits
eld a, #1
eld rpd0.copyright_ident_bit, d
; 12. large or small room
bsrd getbits
eld a, #1
eld rpd0.copyright_ident_start, d
/******************************************************
select mc_sblimit and allocation table
******************************************************/
eld c, rpd0.sampling_frequency
eld rp0, #allocation_tables
ecp c, #S_FREQ_48kHz /* sampling freq. =48kHz */
ebra ec0, %f2
//bug fix in layer-I, 2002.09.17
//erps rp0+s0
erpn rp0, #1 ; 48kHz -> table 0
%2 eld d, @rp0
eld rpd1.sblimit_mc, d
eld c, #mc_allocation_table
efz8 c
eld rpd1.alloc_tbl_ptr, c
/******************************************************
set multichannel configuration
******************************************************/
eld a, rpd0.surround
eld b, rpd0.center
eld si, sr
esla a
esra b
eincc a
ecld r0, a
ld a8, #mc_config_table
sl r0
add a8, r0
ldc r0, @a8
ecld c, r0
esla8 c
eld sr, c
eld b, #4
esft sr, b
eld d, sg
eld rpd1.mc_channel, d
esft sr, b
eld d, sg
eld rpd1.tc_alloc_bits, d
esft sr, b
eld d, sg
eld rpd1.dyn_cross_bits, d
eld sr, si
end_of_mc_header_decode
pop a14
ret
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Miscellanious functions ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
/********************************************************************
Function: load_table
Description:
Load table to XMEM or YMEM area with 24-bit aligned.
Arguments: r6 |WORD3_IDATA_ABS$$section-name$$SIZE|
a11 |WORD3_IDATA_ABS$$section-name$$LOAD|
rp2 |WORD3_IDATA_ABS$$section-name$$START|
********************************************************************/
load_table:
esd2 d0, #1
%1 cmp gt, r6, #0
brf end_load_table
ldc r0, @a11
add a11, #2
ldc r1, @a11
add a11, #2
ldc r2, @a11
add a11, #2
ld r3, r0
srb r0
ecld ah, r0
slb r3
ecld bh, r1
srb r1
add r3, r1
ecld a, r3
ecld b, r2
eld @rp2+d0, a
eld @rp2+d0, b
brad %b1
sub r6, #2
end_load_table
ret
/********************************************************************
Function: copy_decode_table
Description:
Load table to XMEM or YMEM area with 24-bit aligned.
Arguments: r6 |WORD3_IDATA_ABS$$section-name$$SIZE|
a11 |WORD3_IDATA_ABS$$section-name$$LOAD|
rp2 |WORD3_IDATA_ABS$$section-name$$START|
********************************************************************/
.extern |WORD3_IDATA_ABS$$secSynthWindow_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secSynthWindow_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secSynthWindow_mac$$START|
.extern |WORD3_IDATA_ABS$$secDCT32Coeff_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secDCT32Coeff_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secDCT32Coeff_mac$$START|
.extern |WORD3_IDATA_ABS$$secDecodeTables_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secDecodeTables_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secDecodeTables_mac$$START|
.extern |WORD3_IDATA_ABS$$secSepCodes_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secSepCodes_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secSepCodes_mac$$START|
.extern |WORD3_IDATA_ABS$$secDRCTable_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secDRCTable_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secDRCTable_mac$$START|
.extern |WORD3_IDATA_ABS$$secLfeSteps_mac$$SIZE|
.extern |WORD3_IDATA_ABS$$secLfeSteps_mac$$LOAD|
.extern |WORD3_IDATA_ABS$$secLfeSteps_mac$$START|
copy_decode_table::
push a14
ld r6, #|WORD3_IDATA_ABS$$secSynthWindow_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secSynthWindow_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secSynthWindow_mac$$START|
jsr load_table
ld r6, #|WORD3_IDATA_ABS$$secDCT32Coeff_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secDCT32Coeff_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secDCT32Coeff_mac$$START|
jsr load_table
ld r6, #|WORD3_IDATA_ABS$$secDecodeTables_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secDecodeTables_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secDecodeTables_mac$$START|
jsr load_table
ld r6, #|WORD3_IDATA_ABS$$secSepCodes_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secSepCodes_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secSepCodes_mac$$START|
jsr load_table
.if( _DECODER_TYPE != MPEG_1_AUDIO )
ld r6, #|WORD3_IDATA_ABS$$secDRCTable_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secDRCTable_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secDRCTable_mac$$START|
jsr load_table
ld r6, #|WORD3_IDATA_ABS$$secLfeSteps_mac$$SIZE|
ld a11, #|WORD3_IDATA_ABS$$secLfeSteps_mac$$LOAD|
eld rp2, #|WORD3_IDATA_ABS$$secLfeSteps_mac$$START|
jsr load_table
.endif
pop a14
ret
.if( 0 )
/********************************************************************
Function: _xymemclr
Description:
- Clear XMEM/YMEM memory.
- R2 is the number of long words.
- A10 is address pointer of X/Y area.
- "C" prototype
void xymemclr(void *, int size);
********************************************************************/
_xymemclr::
push a12
push r4, r5
ld a12, a10
sr r12
ld r5, e10
cmp eq, r5, #0x22
brf %f0
add r12, #0x8000
%0 er xsd
esd0 d0, #1
ld r4, r12
ecld a, r4
eld rp0, a
eld a, #0
ld r4, r2
%1 cmp eq, r4, #0
brt %f2
eld @rp0+d0, a
brad %b1
sub r4, #1
%2 pop r5, r4
pop a12
ret
/********************************************************************
Function: __xmemset
Description: XY memory set routine for "C".
********************************************************************/
__xymemset:: push a8, a9
push r4, r5
ld r5, r10
and r3, #0xff
ld r4, r3
slb r4
add r4, r3
ecld a, r5
ecld b, r4
ecld bh, r4
eld rp0, a
esd0 d0, #1
ld r6, r2
dec r6
%1 bnzd r6, %b1
eld @rp0+d0, b
pop r5, r4
pop a9, a8
ret
.endif
/********************************************************************
Function: __flush_data
Description: Write cache data to external memory.
********************************************************************/
DCACHE_PROHIBIT equ 0x40
DCACHE_ALL_FLUSH equ 0x10
DCACHE_ALL_INVALID equ 0x20
cXCACHE_FLUSH equ 0x0040
cYCACHE_FLUSH equ 0x0004
cSBF0_FLUSH equ 0x2000
cSBF1_FLUSH equ 0x0200
__flush_data::
/*
push a8
push r0
ld a8, #SFR_BASE
ld r0, #cXCACHE_FLUSH | cYCACHE_FLUSH
ldw @[a8+rCACHECON], r0
ld r0, #cSBF0_FLUSH | cSBF1_FLUSH
ldw @[a8+rSBFCON], r0
pop r0
pop a8
*/
ret
/********************************************************************
Function: __pushRegs
Description: Push all registers.
********************************************************************/
__pushRegs::
push r0, r1
push /*r2,*/ r3
push r4, r5
push r6, r7
push a8, a9
push a10, a11
push a12, a13
ret
/********************************************************************
Function: __popRegs
Description: Pop all registers.
********************************************************************/
__popRegs::
pop a13, a12
pop a11, a10
pop a9, a8
pop r7, r6
pop r5, r4
pop r3 /*, r2*/
pop r1, r0
ret
/********************************************************************
Function: __cache_simul_on, __cache_simul_off
Description: ADM cache simulation on/off.
********************************************************************/
cICACHE_ENABLE equ 0x0200
cICACHE_DISABLE equ 0x0300
cXCACHE_ENABLE equ 0x0020
cXCACHE_DISABLE equ 0x0030
cYCACHE_ENABLE equ 0x0002
cYCACHE_DISABLE equ 0x0003
.if( _CACHE_SIMULATION == TRUE )
__cache_simul_on::
push a8
push r0
ld a8, #SFR_BASE
ld r0, #(cICACHE_ENABLE | cXCACHE_ENABLE | cYCACHE_ENABLE)
ldw @[a8+rCACHECON], r0
pop r0
pop a8
ret
__cache_simul_off::
push a8
push r0
ld a8, #SFR_BASE
ld r0, #(cICACHE_DISABLE | cXCACHE_DISABLE | cYCACHE_DISABLE)
ldw @[a8+rCACHECON], r0
pop r0
pop a8
ret
.endif
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -