Нашёл интересную реализацию генератора синуса для арм/С.
пытаюсь разобраться, но интересно АРМ устроен, некоторые вещи не ясны.
Вопроса два:
1. есть ли смысл в таком подходе?
2. возможна ли достойная реализация под z80?
вот сам код:
And, of course, there's an assembly version as well. It's only ten instructions, which I think is actually shorter than a LUT+lerp implementation.С:
s32 isin_S3(s32 x)
{
// S(x) = x * ( (3<<p) - (x*x>>r) ) >> s
// n : Q-pos for quarter circle 13
// A : Q-pos for output 12
// p : Q-pos for parentheses intermediate 15
// r = 2n-p 11
// s = A-1-p-n 17
static const int qN = 13, qA= 12, qP= 15, qR= 2*qN-qP, qS= qN+qP+1-qA;
x= x<<(30-qN); // shift to full s32 range (Q13->Q30)
if( (x^(x<<1)) < 0) // test for quadrant 1 or 2
x= (1<<31) - x;
x= x>>(30-qN);
return x * ( (3<<qP) - (x*x>>qR) ) >> qS;
}
дома есть немного раскоментированный код арм-а , могу вечером выложить что обнаружил.@ ARM assembly version, using n=13, p=15, A=12
@ Input: gamma in Q13
.arm
.align
.global isin_S3a
isin_S3a:
mov r0, r0, lsl #(30-13)
teq r0, r0, lsl #1
rsbmi r0, r0, #1<<31
mov r0, r0, asr #(30-13)
mul r1, r0, r0
mov r1, r1, asr #11
rsb r1, r1, #3<<15
mul r0, r1, r0
mov r0, r0, asr #17
bx lr