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