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);
}