?? mpa_frame.s
字號:
; sd0: -64 1 32 1,-1,96
; sd1: 1 7 x x
; sd2: 2 4 -1 1
; sd3: -2 -1 32 33
;
; NOTE: RP0 is register type variable
; 7-ch, 15.5mips
__synthesis_subband__
es psh1
er usm
es opm
es opma
ebk #0000b
er xsd
eld sd0, #0x0100
eld sd3, #0xef01
es xsd
eld sd0, #0xc026 ; s1 = 32, s0 = 96
eld sd3, #0x0022 ; s1 = 32, s0 = 33
eld sd1, #0x1000
eld sd2, #0x24f1
esd1 d0, #MAX_CHANNEL
eld a, rpd1.mpeg_version
ecld r0, a
eld c, #0
eld d, #0
eld a, rpd1.layer_I_frames
; synthesis channels
eld b, rpd1.stereo
cmp eq, r0, #_MPEG_1_AUDIO
brt total_ch
eld c, rpd1.mc_channel
cmp eq, r0, #_MPEG_2_AUDIO
brt total_ch
eld d, rpd1.aug_channel
cmp eq, r0, #_MPEG_2_AUG_AUDIO
brt total_ch
eld c, #0
eld d, #0
total_ch ecld r0, b
esla a
esla a
ecld r5, a ; granules
eadd b, c
eadd b, d
ecld r4, b ; total channels
ld r3, #0 ; No. ch
ld r8, r5
; offset values
eld b, #(MAX_CHANNEL-1)*PARTS*SBLIMIT
eld c, #1024 ; synthesis buffer size each ch
eld rpd1, #backup_register
eld rp0, rpd1.area_synthesis ; synthesis_buffer
eld rp1, #pcm_ch_buffer
eld rp3, #fraction
; synthesis 32 samples per channel
do_synthesis
eld rpd0, rp3
jsr MPG_synthesis_subband ; part 0
eld rp3, rpd0
erps rp3+s1
eld rpd0, rp3
jsr MPG_synthesis_subband ; part 1
eld rp3, rpd0
erps rp3+s1
eld rpd0, rp3
jsr MPG_synthesis_subband ; part 2
eld rp3, rpd0
erps rp3+s1
syn_gr_loop_check
dt r8
brfd do_synthesis
erpn rp3, b
; synthesis start point for next frame
cmp eq, r3, #0
brf syn_ch_loop_check
eld rpd1.area_backup, rp0
syn_ch_loop_check
inc r3
cmp ge, r3, r4
brt end_synthesis
eld rp0, rpd1.area_synthesis
ld r6, r3
dec r6
bnzd r6, $
; next synthesis buffer offset
erpn rp0, c
erpn rp1, #-(MAX_CHANNEL*SAMPLES_PER_FRAME)+1
eld a, header_info+layer
ecp a, #LAYER_I
ebra ec1, %f1
eld a, layer_info+mpeg_version
ecp a, #_MPEG_1_AUDIO
ebra ec1, %f1
erpn rp1, #MAX_CHANNEL*SAMPLES_PER_FRAME*2/3
%1 eld x0, #MAX_CHANNEL*96
ecld a, r5
efz8 a
eld y0, a
emul x0y0
eld a, pl
esra a
esub a, #96
eneg a
erpn rp3, a
cmp eq, r0, #MONO
brf %f2
cmp eq, r3, #1
brf %f2
erpn rp3, #96
%2 brad do_synthesis
ld r8, r5
end_synthesis eld rp0, rpd1.area_backup
eld rpd1.area_synthesis, rp0
er psh1
er op
er opm
er opma
er xsd
eld rpd0, #header_info
eld rpd1, #layer_info
.if( _DECODER_TYPE != MPEG_1_AUDIO )
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Base Management ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; expand LFE sample to 1152 sample
__base_management__
eld a, rpd0.lfe
ecp a, #TRUE
ebra ec1, __DRC_processing__
jsr expand_lfe_sample
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Dynamic Range Control ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; Get dynamic range control (DRC) gain
__DRC_processing__
.if( _DRC_CONTROL == TRUE )
ldw a9, @[a10+_pParameter]
ldb r0, @[a9+_DRC_Mode]
cmp eq, r0, #TRUE
brf __downmix__
.else
bra __downmix__
.endif
check_DRC_value_enable
; if MPEG2 with extension
m2_ext eld a, rpd0.ext_stream_present
eld b, rpd0.n_ad_bytes
ecp a, #TRUE
ebra ec1, no_ext
ecp b, #1
ebra ec2, __downmix__
bra process_drc
; if MPEG1 or MPEG2 without extension
no_ext eld c, rpd1.base_last_pos
eld d, rpd1.frame_size
esub d, #2
ecp c, d
ebra ec2, process_drc
bra __downmix__
process_drc jsr dynamic_range_control
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Downmix and audio output processing ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; dm + not drc + output => 2.55mips
__downmix__
; downmix multichannel to 2-ch
eld a, rpd1.mpeg_version
eld b, rpd1.channel_config
.if( OUPUT_6CH == TRUE )
; If OutMode = 1, multichannel only, OutMode = 0 downmix only
ldw a11, @[a10+_pParameter]
ldb r0, @[a11+_CH_Mode]
cmp eq, r0, #_MPEG2_DOWNMIX
brf downmix_bypass
.endif
; MPEG-1 bypass, copy from stereo channel
ecp a, #_MPEG_1_AUDIO
ebra ec0, downmix_bypass
; MPEG-2 mono or stereo
ecp b, #_MPEG1_MONO
ebra ec0, downmix_bypass
ecp b, #_MPEG1_STEREO
ebra ec0, downmix_bypass
; MPEG-2 5-ch downmix
ecp a, #_MPEG_2_AUDIO
ebra ec1, downmix_aug
eld b, rpd1.stereo
eld c, rpd1.mc_channel
ecp b, #MONO
ebra ec0, downmix_bypass
ecp c, #0
ebra ec0, downmix_bypass
ld a13, #MC_II_downmix_5ch_to_2ch
eadd b, c
ecp b, #5
ebra ec0, downmix_procedure
bra downmix_bypass
; MPEG-2 7-ch downmix
downmix_aug ecp a, #_MPEG_2_AUG_AUDIO
ebra ec1, downmix_bypass
eld b, rpd1.stereo
eld c, rpd1.mc_channel
eld d, rpd1.aug_channel
eadd b, c
eadd b, d
ecp b, #7
ebra ec1, downmix_bypass
eld a, rpd1.channel_config
ld a13, #AUG_II_downmix_7ch_to_2ch ; 7.1 + downmix
ecp a, #_MPEG2_7CH
ebra ec0, downmix_procedure
ld a13, #AUG_II_downmix_7ch_to_5ch ; 5.1 + downmix
ecp a, #_MPEG2_5CH
ebra ec0, downmix_procedure
ecp a, #_MPEG2_DOWNMIX
ebra ec0, downmix_procedure
; if illegal channel option
bra downmix_bypass
downmix_procedure
jsr a13
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
downmix_bypass
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Audio output ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; output pcm, default sample order for IODMA
__audio_output__
jsr output_pcm_sample
jsr output_digital
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: THE END of FRAME DECODING ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
eld a, rpd1.frameNo
eadd a, #1
eld rpd1.frameNo, a
eld a, rpd0.layer
ecp a, #LAYER_I
ebra ec1, end_of___MpegAudioDecode
eld a, rpd1.mpeg_version
ecp a, #_MPEG_1_AUDIO
ebra ec1, end_of___MpegAudioDecode
eld a, rpd1.frameNo
eld b, #3
mDIVIDE a, b
ecp b, #0
ebra ec0, end_of___MpegAudioDecode
jmp START_DECODE
end_of___MpegAudioDecode
ld r0, #_DECODE_OK
ldb @[a10+_DecodeErrFlag], r0
.if( _CACHE_SIMULATION == TRUE )
jsr __cache_simul_off
.endif
jsr __flush_data
jsr __popRegs
mRETURN (_DECODE_OK)
pop a14
ret
/********************************************************************
The end of frame decoding
********************************************************************/
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Error process ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
error___MpegAudioDecode:
jsr mpa_error_process
return_to_main
jsr __flush_data
jsr __popRegs
pop a14
ret
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Initialize Codec ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
initialize_mpeg_audio:
eld c, #0
esd1 d0, #1
; initialize information ( header & layer ) buffer
eld rp1, #header_info
ld r6, #64-1
bnzd r6, $
eld @rp1+d0, c
; initialize synthesis buffer
eld rp0, #synthesis_buffer
eld rpd1, #backup_register
eld rpd1.area_synthesis, rp0
ld r6, #MAX_CHANNEL*WINDOW_SIZE-1
eld rp1, rp0
bnzd r6, $
eld @rp1+d0, c
; initialize fraction buffer
eld rp1, #fraction
ld r6, #MAX_CHANNEL*GRANULES*PARTS*SBLIMIT-1
bnzd r6, $
eld @rp1+d0, c
; initialize synthesis buffer
eld rp1, #pcm_ch_buffer
ld r6, #MAX_CHANNEL*SAMPLES_PER_FRAME-1
bnzd r6, $
eld @rp1+d0, c
.if( _DECODER_TYPE != MPEG_1_AUDIO )
eld rp1, #pcm_dm_buffer
ld r6, #NCH*SAMPLES_PER_FRAME-1
bnzd r6, $
eld @rp1+d0, c
eld rp1, #pcm_lfe_buffer
ld r6, #SAMPLES_PER_FRAME-1
bnzd r6, $
eld @rp1+d0, c
; initialize lfe sample and filter buffer
eld rp1, #lfe_fraction
eld @rp1, c
eld rp1, #v1
ld r6, #32-1
bnzd r6, $
eld @rp1+d0, c
.endif
/* Decoder part
* load table data of MPEG/Audio codec to XMEM/YMEM area.
*/
jsr copy_decode_table
; restore system parameter into mpeg information
eld a, #0
eld rpd1, #layer_info
ldw a11, @[a10+_pParameter]
ldb r0, @[a11+_Version]
ecld a, r0
eld rpd1.mpeg_version, a
ldb r0, @[a11+_CH_Mode]
ecld a, r0
eld rpd1.channel_config, a
ldb r0, @[a11+_CRC_Option]
ecld a, r0
eld rpd1.mandatory_crc_check, a
; ldb r0, @[a11+_LFE_Enable]
; ldb r0, @[a11+_DRC_Mode]
; ldb r0, @[a11+_EXT_Present]
; ldb r0, @[a11+_CH_Content]
; set flag of started signal
ld r0, #SAMPLES_PER_FRAME
ldw @[a10+_NumberOfSample], r0
ld r0, #TRUE
ldb @[a10+_CodecStartFlag], r0
; calculate buffer point and store
ldw a11, @[a10+_InputBufferSize]
ld r3, e11
ld r2, r11
ld a12, #SB0_BASE
ld r1, e12
ld r0, r12
ld a13, #_buffer_ptr
ldw @[a13+_MPG_BUF_BASE], a12
add r0, r2
adc r1, r3
ldw @[a13+_MPG_BUF_LIMIT+0], r1
ldw @[a13+_MPG_BUF_LIMIT+2], r0
ldw @[a13+_EXT_BUF_BASE+0], r1
ldw @[a13+_EXT_BUF_BASE+2], r0
add r0, r2
adc r1, r3
ldw @[a13+_EXT_BUF_LIMIT+0], r1
ldw @[a13+_EXT_BUF_LIMIT+2], r0
ldw @[a13+_BS_MAIN+0], r1
ldw @[a13+_BS_MAIN+2], r0
ld r3, #^MAX_BS_SIZE
ld r2, #>MAX_BS_SIZE
add r0, r2
adc r1, r3
ldw @[a13+_BS_EXTENSION+0], r1
ldw @[a13+_BS_EXTENSION+2], r0
add r0, r2
adc r1, r3
ldw @[a13+_BS_MULTICHANNEL+0], r1
ldw @[a13+_BS_MULTICHANNEL+2], r0
ldw @[a13+_BS_SPDIF_BASE], a12
jmp end_of___MpegAudioDecode
.end ;::: _MpegAudioDecode end ::::::::::::::::::::::::::::::::::::::;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -