задействовать DSP ядро в своих целях. Есть некоторое количество ассемблерных исходников. Но вот проблема - я впервые
вижу подобный ассемблер. Вот к примеру генератор синуса:
CODE
;== Component Interface ==
;
.port ToneGenerator_1.Ch1_Out ToneGenerator_1_Ch_Out ; Data Declarations for output
.data_miniDSP_D ToneGenerator_1_Ch_Out ; Data format 3.yy
;
;Coefficients Definitions
.coeff_miniDSP_D ToneGenerator_1_Status =256 @5 ;
.coeff_miniDSP_D ToneGenerator_1_alpha =0,8526401519775390625M1 @5+1 ;
.coeff_miniDSP_D ToneGenerator_1_beta =-0,2612493038177490234375M1 @5+2 ;
.coeff_miniDSP_D ToneGenerator_1_Amplitude =0,5M2 @5+3 ;not used but added to use same DLL as quad
.coeff_miniDSP_D ToneGenerator_1_Minus_stopped =-25344
;Data Definitions
.data_miniDSP_D ToneGenerator_1_Out(n)
.data_miniDSP_D ToneGenerator_1_Out(n-1)
.data_miniDSP_D ToneGenerator_1_Out(n-2)
.data_miniDSP_D ToneGenerator_1_Status(n)
.data_miniDSP_D ToneGenerator_1_Status(n-1)
;
;
.codeblock ToneGenerator_1_Block target=miniDSP_D, cycles=15, stream=Primary, component=ToneGenerator_1
acc_init ToneGenerator_1_Status data_one
compare ToneGenerator_1_Minus_stopped data_one
compare MinusOne_M1 ToneGenerator_1_Status(n-1)
acc_init ToneGenerator_1_beta data_one
write 0 ToneGenerator_1_Status(n)
jump jmp_eq ToneGenerator_1_Stopped
;current status is start
acc_init Zero data_one
jump jmp_eq ToneGenerator_1_RunwoInit
;Do init here
write 0 ToneGenerator_1_Out(n-2)
acc_init MinusOne_M1 ToneGenerator_1_Out(n-2)
write 0 ToneGenerator_1_Out(n-1)
;acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1) // not required because Out(n-1) is zero
jump jmp ToneGenerator_1_Run
ToneGenerator_1_RunwoInit:
;nop balance
acc_init MinusOne_M1 ToneGenerator_1_Out(n-2)
acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1)
nop
nop
ToneGenerator_1_Run:
jump jmp ToneGenerator_1_Done;
ToneGenerator_1_Stopped:
acc_init Zero data_one
nop
;nop balance
nop
nop
nop
nop
nop
ToneGenerator_1_Done:
write 0 ToneGenerator_1_Out(n)
write 0 ToneGenerator_1_Ch_Out
.endcodeblock
;
.port ToneGenerator_1.Ch1_Out ToneGenerator_1_Ch_Out ; Data Declarations for output
.data_miniDSP_D ToneGenerator_1_Ch_Out ; Data format 3.yy
;
;Coefficients Definitions
.coeff_miniDSP_D ToneGenerator_1_Status =256 @5 ;
.coeff_miniDSP_D ToneGenerator_1_alpha =0,8526401519775390625M1 @5+1 ;
.coeff_miniDSP_D ToneGenerator_1_beta =-0,2612493038177490234375M1 @5+2 ;
.coeff_miniDSP_D ToneGenerator_1_Amplitude =0,5M2 @5+3 ;not used but added to use same DLL as quad
.coeff_miniDSP_D ToneGenerator_1_Minus_stopped =-25344
;Data Definitions
.data_miniDSP_D ToneGenerator_1_Out(n)
.data_miniDSP_D ToneGenerator_1_Out(n-1)
.data_miniDSP_D ToneGenerator_1_Out(n-2)
.data_miniDSP_D ToneGenerator_1_Status(n)
.data_miniDSP_D ToneGenerator_1_Status(n-1)
;
;
.codeblock ToneGenerator_1_Block target=miniDSP_D, cycles=15, stream=Primary, component=ToneGenerator_1
acc_init ToneGenerator_1_Status data_one
compare ToneGenerator_1_Minus_stopped data_one
compare MinusOne_M1 ToneGenerator_1_Status(n-1)
acc_init ToneGenerator_1_beta data_one
write 0 ToneGenerator_1_Status(n)
jump jmp_eq ToneGenerator_1_Stopped
;current status is start
acc_init Zero data_one
jump jmp_eq ToneGenerator_1_RunwoInit
;Do init here
write 0 ToneGenerator_1_Out(n-2)
acc_init MinusOne_M1 ToneGenerator_1_Out(n-2)
write 0 ToneGenerator_1_Out(n-1)
;acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1) // not required because Out(n-1) is zero
jump jmp ToneGenerator_1_Run
ToneGenerator_1_RunwoInit:
;nop balance
acc_init MinusOne_M1 ToneGenerator_1_Out(n-2)
acc_2 ToneGenerator_1_alpha ToneGenerator_1_Out(n-1)
nop
nop
ToneGenerator_1_Run:
jump jmp ToneGenerator_1_Done;
ToneGenerator_1_Stopped:
acc_init Zero data_one
nop
;nop balance
nop
nop
nop
nop
nop
ToneGenerator_1_Done:
write 0 ToneGenerator_1_Out(n)
write 0 ToneGenerator_1_Ch_Out
.endcodeblock
Формулы, по которым он работает:
Out (n) = 2*ToneGenerator_1_alpha * Out (n-1) - Out (n-2)
Инициализация:
Out (-1) = 0
Out (-2) = ToneGenerator_1_beta
Кто-нибудь сталкивался с подобным ассемблером? Может быть есть какая-то документация на DSP процессор, у которого
похожий ассемблер?
Если кому интересно
acc_init a b
помещает в аккумулятор a*b, т.е. Акк = a*b
acc a b -> Акк = Акк + a*b
acc_2 a b -> Акк = Акк + 2*a*b
Есть еще команды Init_abs, Writef, Writecoeff, mult, Acc_abs, AC_R_AC, AC_F_AC, AC_RW_AC, ACC_INIT_DATAPAD, ACC_SUB
И так далее. Полный список можно вытащить из компилятора. Но вот что они делают? И зачем так много NOP-ов в исходниках?