Scale a 16-bit unsigned value by an 16-bit value, which is treated as the numerator of a fraction whose denominator is 65536.
546 {
547#if SCALE16_C == 1
548 uint16_t result;
549#if FASTLED_SCALE8_FIXED == 1
550 result = ((uint32_t)(i) * (1 + (uint32_t)(
scale))) / 65536;
551#else
552 result = ((uint32_t)(i) * (uint32_t)(
scale)) / 65536;
553#endif
554 return result;
555#elif SCALE16_AVRASM == 1
556#if FASTLED_SCALE8_FIXED == 1
557
558
559
560
561
562
563
564 uint32_t result;
565 asm volatile(
566
567 " mul %A[i], %A[scale] \n\t"
568
569
570
571
572
573 " movw %A[result], r0 \n\t"
574
575
576
577
578
579 : [result] "=r"(result)
581 : "r0", "r1");
582
583 asm volatile(
584
585 " mul %B[i], %B[scale] \n\t"
586
587
588 " movw %C[result], r0 \n\t"
589 : [result] "+r"(result)
591 : "r0", "r1");
592
593 const uint8_t zero = 0;
594 asm volatile(
595
596 " mul %B[i], %A[scale] \n\t"
597
598 " add %B[result], r0 \n\t"
599 " adc %C[result], r1 \n\t"
600 " adc %D[result], %[zero] \n\t"
601
602
603 " mul %A[i], %B[scale] \n\t"
604
605 " add %B[result], r0 \n\t"
606 " adc %C[result], r1 \n\t"
607 " adc %D[result], %[zero] \n\t"
608
609
610 " clr r1 \n\t"
611
612 : [result] "+r"(result)
613 : [i]
"r"(i), [
scale]
"r"(
scale), [zero]
"r"(zero)
614 : "r0", "r1");
615
616 asm volatile(
617
618 " add %A[result], %A[i] \n\t"
619 " adc %B[result], %B[i] \n\t"
620 " adc %C[result], %[zero] \n\t"
621 " adc %D[result], %[zero] \n\t"
622 : [result] "+r"(result)
623 : [i] "r"(i), [zero] "r"(zero));
624
625 result = result >> 16;
626 return result;
627#else
628 uint32_t result;
629 asm volatile(
630
631 " mul %A[i], %A[scale] \n\t"
632
633
634
635
636
637 " movw %A[result], r0 \n\t"
638
639
640
641
642
643
644
645 : [result] "=r"(result)
647 : "r0", "r1");
648
649 asm volatile(
650
651 " mul %B[i], %B[scale] \n\t"
652
653
654 " movw %C[result], r0 \n\t"
655 : [result] "+r"(result)
657 : "r0", "r1");
658
659 const uint8_t zero = 0;
660 asm volatile(
661
662 " mul %B[i], %A[scale] \n\t"
663
664 " add %B[result], r0 \n\t"
665 " adc %C[result], r1 \n\t"
666 " adc %D[result], %[zero] \n\t"
667
668
669 " mul %A[i], %B[scale] \n\t"
670
671 " add %B[result], r0 \n\t"
672 " adc %C[result], r1 \n\t"
673 " adc %D[result], %[zero] \n\t"
674
675
676 " clr r1 \n\t"
677
678 : [result] "+r"(result)
679 : [i]
"r"(i), [
scale]
"r"(
scale), [zero]
"r"(zero)
680 : "r0", "r1");
681
682 result = result >> 16;
683 return result;
684#endif
685#else
686#error "No implementation for scale16 available."
687#endif
688}
UISlider scale("Scale", 1.0f, 0.0f, 1.0f, 0.01f)