inline int RGB16bppLineAdd(unsigned short int *fb, unsigned short int *source1, unsigned short int *source2)
{
unsigned int *d, *s1, *s2;
unsigned int x3;
d = (unsigned int *)fb;
s1 = (unsigned int *)source1;
s2 = (unsigned int *)source2;
//x3 = 0xF7DEF7DE;
x3 = 0x7BEF7BEF;
/*
* Rejestry:
* r4 - dest
* r5, r6 - s1 i s2 pointers
* r7 - max value
* r8 - maska
* r0-r3 - dane dla s1
* r9-r12 - dane dla s2
*/
asm
(
"stmfd r13!, {r8-r12}\n" // zapisz rejestry
"mov r4, %0\n" // załaduj wskaźnik dest
"mov r5, %1\n" // załaduj wskaźnik source1
"mov r6, %2\n" // załaduj wskaźnik source2
"add r7, r0, #640\n" // wielkość pamięci z bitmapami
"mov r8, %3\n" // załaduj maskę
"loop50:\n"
"ldmia r5!, {r0, r1, r2, r3}\n" // załaduj piksele s1
"ldmia r6!, {r9, r10, r11, r12}\n" // załaduj piksele s2
"and r0, r8, r0, lsr #1\n"
"and r1, r8, r1, lsr #1\n"
"and r2, r8, r2, lsr #1\n"
"and r3, r8, r3, lsr #1\n"
"and r9, r8, r9, lsr #1\n"
"and r10, r8, r10, lsr #1\n"
"and r11, r8, r11, lsr #1\n"
"and r12, r8, r12, lsr #1\n"
"add r0, r0, r9\n"
"add r1, r1, r10\n"
"add r2, r2, r11\n"
"add r3, r3, r12\n"
"stmia r4!, {r0, r1, r2, r3}\n" // zapisanie gotowych pikseli
"cmp r4, r7\n"
"blt loop50\n"
"ldmfd r13!, {r8-r12}\n" // przywróc rejestry
:
: "r"(d), "r"(s1), "r"(s2), "r"(x3)
: "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"
);
return(0);
}
// Mikser korzystający z odejmowania według wzoru (A + C) - B gdzie C jest
// dodane by wynik mieścił się w dostępnym zakresie liczb.
inline int RGB16bppLineSub(unsigned short int *fb, unsigned short int *source1, unsigned short int *source2)
{
unsigned int *d, *s1, *s2;
unsigned int x3, x4;
d = (unsigned int *)fb;
s1 = (unsigned int *)source1;
s2 = (unsigned int *)source2;
//x3 = 0xF7DEF7DE;
x3 = 0x84108410; // dla s1
x4 = 0x7BEF7BEF; // dla s2
/*
* Rejestry:
* r4 - dest
* r5, r6 - s1 i s2 pointers
* r7 - max value
* r8 - maska
* r0-r3 - dane dla s1
* r9-r12 - dane dla s2
*/
asm
(
"stmfd r13!, {r8-r12, r14}\n" // zapisz rejestry
"mov r4, %0\n" // załaduj wskaźnik dest
"mov r5, %1\n" // załaduj wskaźnik source1
"mov r6, %2\n" // załaduj wskaźnik source2
"mov r7, %4\n" // załaduj drugą maskę
"mov r8, %3\n" // załaduj maskę
"mov r14, r7\n"
"add r7, r0, #640\n" // wielkość pamięci z bitmapami
"loop60:\n"
"ldmfd r5!, {r0, r1, r2, r3}\n" // załaduj piksele s1
"ldmfd r6!, {r9, r10, r11, r12}\n" // załaduj piksele s2
"orr r0, r8, r0, lsr #1\n"
"orr r1, r8, r1, lsr #1\n"
"orr r2, r8, r2, lsr #1\n"
"orr r3, r8, r3, lsr #1\n"
"and r9, r14, r9, lsr #1\n"
"and r10, r14, r10, lsr #1\n"
"and r11, r14, r11, lsr #1\n"
"and r12, r14, r12, lsr #1\n"
"sub r0, r0, r9\n"
"sub r1, r1, r10\n"
"sub r2, r2, r11\n"
"sub r3, r3, r12\n"
"stmea r4!, {r0, r1, r2, r3}\n" // zapisanie gotowych pikseli
"cmp r4, r7\n"
"blt loop60\n"
"ldmfd r13!, {r8-r12, r14}\n" // przywróc rejestry
:
: "r"(d), "r"(s1), "r"(s2), "r"(x3), "r"(x4)
: "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"
);
return(0);
}