📄 decode.s
字号:
dmarr r1 ;initiate DMA transfer
wait_dma_4d:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_4d ;wait for dma done
not_loading_nb_table:
movb LBfr_ps_sblimit,r8
movb r8,LBhdr_mode
tsti r8,MPG_MD_JOINT_STEREO
beq htf_020
movb r8,LBfr_ps_sblimit
j htf_025
htf_020:
/* js_bound, for Layer I and II */
movb r8,LBhdr_mode_ext
addi r8,1
shl r8,2
htf_025:
movb LBfr_ps_jsbound,r8
decode_info_done_ok:
movi r10,0
j r26
decode_info_done_error:
movi r10,F_INFO_ERROR
j r26
SUB_chk_CRC:
movi r9,0
movi r10,0
tsth r8,LIold_crc
beq chk_CRC_done
movh r9,LIcrc_error_count
addi r9,1
movh LIcrc_error_count,r9
movh r9,LItotal_error_count
addi r9,1
movh LItotal_error_count,r9
jsr r27,SUB_recover_CRC_error
nop
nop
movh r9,LIcrc_error_count
movi r10,F_CRC_ERROR
chk_CRC_done:
movh LIcrc_error_count,r9
j r26
SUB_recover_CRC_error:
recover_CRC_error_done:
j r27
SUB_I_CRC_calc:
jsr r27,SUB_CRC_calc_header
movi r6,4 // length=4
movi r1,0
CLR_TrapReg
loop SBLIMIT,8f // for(i=0;i<SBLIMIT;i++)
movb r7,LBfr_ps_stereo // r7=stereo
shr r2,r1,2 // r2=i
tstb r2,LBfr_ps_jsbound // (i>jsbound)?
blt 2f // branch if i<jsbound ( r7=stereo )
movi r7,1 // r7=1 ( i>=jsbound )
2:
movi r2,0
loop r7,4f // for(k=0;k<((i<jsbound)?stereo:1);k++)
add r3,r2,r1 // r3=k*32*4+i*4
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[k][i])
movb r7,l10 // r7=bit_alloc[k][i]
jsr r28,SUB_update_CRC
addi r2,32*4 // r2=(j++)*32*4
4:
addi r1,4 // r1=(i++)*4
8:
SET_TrapReg
I_CRC_calc_done:
j r26
SUB_II_CRC_calc:
jsr r27,SUB_CRC_calc_header
movb r11,LBfr_ps_sblimit
movi r0,local_ITaloc_idx_byte
movi r1,0
CLR_TrapReg_1
tsti r11,0
beq 6f
loop r11,6f // for(i=0; i<sblimit(in r11); i++)
movb r7,LBfr_ps_stereo // r7=stereo
shr r2,r1,2 // r2=i
tstb r2,LBfr_ps_jsbound // (i>jsbound)?
blt 2f // branch if i<jsbound
movi r7,1 // r7=1 ( i>=jsbound )
2:
movi r2,0
tsti r7,0
beq 4f
loop r7,4f // for(j=0;j<((i<jsbound)?stereo:1);j++)
add r3,r2,r1 // r3=j*32*4+i*4
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
movb r7,l10 // r7=bit_alloc[j][i]
shr r3,r1,2 // r3=i
add r3,r0 // r3<=(address of table aloc_idx)
movb r5,l3 // r5=aloc_idx[i]
addi r3,r5,local_B2Abits // r3=addr of alloc[i][0].bits
movb r6,l3 // r6=alloc[i][0].bits
jsr r28,SUB_update_CRC
addi r2,32*4 // r2=(j++)*32*4
4:
addi r1,4 // r1=(i++)*4
6:
SET_TrapReg
movb r12,LBfr_ps_stereo // r12=stereo
movi r6,2 // length=2
movi r1,0
CLR_TrapReg_1
tsti r11,0
beq 6f
loop r11,6f // for(i=0; i<sblimit(in r11); i++)
movi r2,0
tsti r12,0
beq 4f
loop r12,4f // for(k=0;k<stereeo;k++)
add r3,r2,r1 // r3=k*32*4+i*4
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[k][i])
movb r7,l10 // r7=bit_alloc[k][i]
tsti r7,0
beq 2f
addi r3,local_ITscfsi_byte // r3<=(addr. of scfsi[k][i])
movb r7,l3 // r7=scfsi[k][i]
jsr r28,SUB_update_CRC
2:
addi r2,32*4 // r2=(k++)*32*4
4:
addi r1,4 // r1=(i++)*4
6:
SET_TrapReg
II_CRC_calc_done:
j r26
SUB_CRC_calc_header:
movi r8,0xffff // r8=crc=0xffff
movi r6,4 // r6=length=4
movb r7,LBhdr_bitrate_index // r7=bit_rate_index
jsr r28,SUB_update_CRC
movi r6,2 // r6=length=2
movb r7,LBhdr_sampling_frequency // r7=sampling_frequency
jsr r28,SUB_update_CRC
movi r6,1 // r6=length=1
movb r7,LBhdr_padding // r7=padding
jsr r28,SUB_update_CRC
movi r6,1 // r6=length=1
movb r7,LBhdr_extension // r7=extension
jsr r28,SUB_update_CRC
movi r6,2 // r6=length=2
movb r7,LBhdr_mode // r7=mode
jsr r28,SUB_update_CRC
movi r6,2 // r6=length=2
movb r7,LBhdr_mode_ext // r7=mode_ext
jsr r28,SUB_update_CRC
movi r6,1 // r6=length=1
movb r7,LBhdr_copyright // r7=copyright
jsr r28,SUB_update_CRC
movi r6,1 // r6=length=1
movb r7,LBhdr_original // r7=original
jsr r28,SUB_update_CRC
movi r6,2 // r6=length=2
movb r7,LBhdr_emphasis // r7=emphasis
jsr r28,SUB_update_CRC
CRC_calc_header_done:
j r27
SUB_update_CRC: // r6=length, r7=data, r8=crc
movi r5,1 // r5=1
shlv r5,r6 // r5=masking=1<<length
1:
shr r5,1 // r5=masking>>=1
tsti r5,0
beq 4f // while((masking>>1))
andi r9,r8,0x8000 // r9=carry=crc*0x8000
tsti r9,0
beq 5f
movi r9,1 // r9=!carry
5:
shl r8,1 // crc<<=1
and r10,r7,r5 // r10=data&masking
tsti r10,0
beq 5f
movi r10,1 // r10=!(data&masking)
5:
xor r9,r10 // r9=!carry^!(data&masking)
tsti r9,0
beq 2f
xori r8,CRC16_POLYNOMIAL
2:
j 1b
4:
andi r8,0xffff
update_CRC_done:
j r28
SUB_I_decode_bitalloc:
movb r10,LBfr_ps_jsbound
movb r9,LBfr_ps_stereo
movi r0,local_ITaloc_idx_byte
tsti r9,0
beq I_dec_ba_020
tsti r10,0
beq I_dec_ba_020
movi r1,0
CLR_TrapReg
loop r10,I_dec_ba_020 // for(i=0;i<jsbound;i++)
movi r2,0
loop r9,I_dec_ba_010 // for(j=0;j<stereo;j++)
gbi r4,4
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
mov AGRAdr4,r3
addi r2,1 // r2=j++
mov a4(0),r4
I_dec_ba_010:
addi r1,1 // r1=i++
I_dec_ba_020:
SET_TrapReg
rsubi r10,SBLIMIT // r10=SBLIMIT-jsbound(r10)
bz I_dec_ba_050
tsti r9,0
beq I_dec_ba_050
CLR_TrapReg
loop r10,I_dec_ba_050 // for(i=jsbound;i<SBLIMIT;i++)
gbi r4,4
movi r2,0
loop r9,I_dec_ba_040 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
mov AGRAdr4,r3
addi r2,1 // r2=j++
mov a4(0),r4
I_dec_ba_040:
addi r1,1 // r1=i++
I_dec_ba_050:
SET_TrapReg
I_decode_bitalloc_done:
j r26
SUB_I_decode_scale:
movb r9,LBfr_ps_stereo
/* decode scale_index[j][k][i] */
tsti r9,0
beq I_dec_sc_060
movi r1,0
CLR_TrapReg
loop SBLIMIT,I_dec_sc_060 // for(i=0;i<SBLIMIT;i++)
movi r2,0
loop r9,I_dec_sc_050 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
movb r4,l10 // r4=bit_alloc[j][i]
multi r10,r2,3*32 // r10=j*3*32
nop
add r10,r1 // r10=j*3*32+i
shl r10,2 // r10=(j*3*32+i)*4
addi r10,local_scale_index_byte
mov AGRAdr4,r10
tsti r4,0
beq I_dec_sc_054 // branch if bit_alloc[j][i]==0
gbi r4,6
nop
mov a4(0),r4 // load scale_index[j][0][i]
j I_dec_sc_058
I_dec_sc_054: // else
movi r4,SCALE_RANGE-1
mov a4(0),r4 // load scale_index[j][0][i]
I_dec_sc_058:
addi r2,1 // r2=j++
I_dec_sc_050:
addi r1,1 // r1=i++
I_dec_sc_060:
SET_TrapReg
I_decode_scale_done:
j r26
SUB_I_buffer_sample:
movi AGRSiz4,0xffff
movi AGRSiz5,0xffff
movb r8,LBfr_ps_jsbound
movb r9,LBfr_ps_stereo
movi r1,0
tsti r9,0
beq I_buffer_sample_done
CLR_TrapReg
loop r8,I_buf_sp_100 // for(i=0;i<jsbound;i++)
movi r2,0
loop r9,I_buf_sp_090 // for(j=0;j<stereo;j++)
shl r3,r2,5 // r3=j*32
add r3,r1 // r3=j*32+i
shl r3,2 // r3=(j*32+i)*4
addi r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
multi r5,r2,3*32 // r5=j*3*32
movb r4,l10 // r4=bit_alloc[j][i]
add r5,r1 // r5=j*3*32+i
shl r5,2 // r5=(j*3*32+i)*4
addi r5,local_sample_byte // r5=addr. of sample[j][0][i]
mov AGRAdr4,r5
movi r3,0
tsti r4,0
beq I_buf_sp_080 // branch if bit_alloc[j][i]==0
addi r4,1 // r4=k+1
gb r3,r4
nop
I_buf_sp_080: // else (bit_alloc[j][i]=0)
mov a4(0),r3 // load sample[j][m][i]
addi r2,1 // r2=j++
I_buf_sp_090:
addi r1,1 // r1=i++
I_buf_sp_100:
SET_TrapReg
rsubi r10,r8,SBLIMIT // r10=SBLIMIT-jsbound(r8)
beq I_buffer_sample_done
shl r1,2 // r1=jsbound*4
CLR_TrapReg
loop r10,6f // for(i=jsbound;i<SBLIMIT;i++)
addi r10,r1,local_bit_alloc_byte
// r10<=(addr. of bit_alloc[0][i])
addi r5,r1,local_sample_byte // r5=addr. of sample[0][0][i]
mov AGRAdr4,r5
movb r4,l10 // r4=bit_alloc[0][i]
tsti r4,0
movi r3,0
beq 1f
addi r4,1 // r4=k+1
gb r3,r4 // r3=s=getbits(bs,k+1)
1:
loop r9,4f // for(j=0;j<stereo;j++)
mov a4(32*2),r3 // load/clear sample[j][0][i]
mov r4,a4(32*2) // dumi
mov r4,a4(32*2) // dumi
mov r4,a4(32*2) // dumi
mov r4,a4(32*2) // dumi
mov r4,a4(32*2) // dumi a4(2*3*32*4)
4:
addi r1,4 // r1=(i++)*4
6:
SET_TrapReg
I_buffer_sample_done:
j r26
SUB_II_decode_bitalloc:
movb r10,LBfr_ps_jsbound
movb r9,LBfr_ps_stereo
movi r0,local_ITaloc_idx_byte
tsti r9,0
beq II_dec_ba_020
tsti r10,0
beq II_dec_ba_020
movi r1,0
CLR_TrapReg
loop r10,II_dec_ba_020 // for(i=0;i<jsbound;i++)
movi r2,0
loop r9,II_dec_ba_010 // for(j=0;j<stereo;j++)
add r4,r0,r1 // r4<=(address of table aloc_idx)
movb r3,l4
addi r4,r3,local_B2Abits
movb r3,l4 // r3=alloc[i][0].bits
gb r4,r3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -