diff --git a/NeoPixelBus.cpp b/NeoPixelBus.cpp index 598b99b..ab34610 100644 --- a/NeoPixelBus.cpp +++ b/NeoPixelBus.cpp @@ -290,82 +290,82 @@ void NeoPixelBus::Show(void) asm volatile( "headD:" "\n\t" // Clk Pseudocode // Bit 7: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n2] , %[lo]" "\n\t" // 1 n2 = lo - "out %[port] , %[n1]" "\n\t" // 1 PORT = n1 + "out %[_port] , %[n1]" "\n\t" // 1 PORT = n1 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 6" "\n\t" // 1-2 if(b & 0x40) "mov %[n2] , %[hi]" "\n\t" // 0-1 n2 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 6: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n1] , %[lo]" "\n\t" // 1 n1 = lo - "out %[port] , %[n2]" "\n\t" // 1 PORT = n2 + "out %[_port] , %[n2]" "\n\t" // 1 PORT = n2 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 5" "\n\t" // 1-2 if(b & 0x20) "mov %[n1] , %[hi]" "\n\t" // 0-1 n1 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 5: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n2] , %[lo]" "\n\t" // 1 n2 = lo - "out %[port] , %[n1]" "\n\t" // 1 PORT = n1 + "out %[_port] , %[n1]" "\n\t" // 1 PORT = n1 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 4" "\n\t" // 1-2 if(b & 0x10) "mov %[n2] , %[hi]" "\n\t" // 0-1 n2 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 4: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n1] , %[lo]" "\n\t" // 1 n1 = lo - "out %[port] , %[n2]" "\n\t" // 1 PORT = n2 + "out %[_port] , %[n2]" "\n\t" // 1 PORT = n2 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 3" "\n\t" // 1-2 if(b & 0x08) "mov %[n1] , %[hi]" "\n\t" // 0-1 n1 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 3: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n2] , %[lo]" "\n\t" // 1 n2 = lo - "out %[port] , %[n1]" "\n\t" // 1 PORT = n1 + "out %[_port] , %[n1]" "\n\t" // 1 PORT = n1 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 2" "\n\t" // 1-2 if(b & 0x04) "mov %[n2] , %[hi]" "\n\t" // 0-1 n2 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 2: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n1] , %[lo]" "\n\t" // 1 n1 = lo - "out %[port] , %[n2]" "\n\t" // 1 PORT = n2 + "out %[_port] , %[n2]" "\n\t" // 1 PORT = n2 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 1" "\n\t" // 1-2 if(b & 0x02) "mov %[n1] , %[hi]" "\n\t" // 0-1 n1 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "rjmp .+0" "\n\t" // 2 nop nop // Bit 1: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n2] , %[lo]" "\n\t" // 1 n2 = lo - "out %[port] , %[n1]" "\n\t" // 1 PORT = n1 + "out %[_port] , %[n1]" "\n\t" // 1 PORT = n1 "rjmp .+0" "\n\t" // 2 nop nop "sbrc %[byte] , 0" "\n\t" // 1-2 if(b & 0x01) "mov %[n2] , %[hi]" "\n\t" // 0-1 n2 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "sbiw %[count], 1" "\n\t" // 2 i-- (don't act on Z flag yet) // Bit 0: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi "mov %[n1] , %[lo]" "\n\t" // 1 n1 = lo - "out %[port] , %[n2]" "\n\t" // 1 PORT = n2 + "out %[_port] , %[n2]" "\n\t" // 1 PORT = n2 "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ "sbrc %[byte] , 7" "\n\t" // 1-2 if(b & 0x80) "mov %[n1] , %[hi]" "\n\t" // 0-1 n1 = hi - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo "brne headD" "\n" // 2 while(i) (Z flag set above) : [byte] "+r" (b), [n1] "+r" (n1), [n2] "+r" (n2), [count] "+w" (i) - : [port] "I" (_SFR_IO_ADDR(PORTD)), + : [_port] "I" (_SFR_IO_ADDR(PORTD)), [ptr] "e" (ptr), [hi] "r" (hi), [lo] "r" (lo)); @@ -384,72 +384,72 @@ void NeoPixelBus::Show(void) asm volatile( "headB:" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n2] , %[lo]" "\n\t" - "out %[port] , %[n1]" "\n\t" + "out %[_port] , %[n1]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 6" "\n\t" "mov %[n2] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n1] , %[lo]" "\n\t" - "out %[port] , %[n2]" "\n\t" + "out %[_port] , %[n2]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 5" "\n\t" "mov %[n1] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n2] , %[lo]" "\n\t" - "out %[port] , %[n1]" "\n\t" + "out %[_port] , %[n1]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 4" "\n\t" "mov %[n2] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n1] , %[lo]" "\n\t" - "out %[port] , %[n2]" "\n\t" + "out %[_port] , %[n2]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 3" "\n\t" "mov %[n1] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n2] , %[lo]" "\n\t" - "out %[port] , %[n1]" "\n\t" + "out %[_port] , %[n1]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 2" "\n\t" "mov %[n2] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n1] , %[lo]" "\n\t" - "out %[port] , %[n2]" "\n\t" + "out %[_port] , %[n2]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 1" "\n\t" "mov %[n1] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "rjmp .+0" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n2] , %[lo]" "\n\t" - "out %[port] , %[n1]" "\n\t" + "out %[_port] , %[n1]" "\n\t" "rjmp .+0" "\n\t" "sbrc %[byte] , 0" "\n\t" "mov %[n2] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "sbiw %[count], 1" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "mov %[n1] , %[lo]" "\n\t" - "out %[port] , %[n2]" "\n\t" + "out %[_port] , %[n2]" "\n\t" "ld %[byte] , %a[ptr]+" "\n\t" "sbrc %[byte] , 7" "\n\t" "mov %[n1] , %[hi]" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "brne headB" "\n" : [byte] "+r" (b), [n1] "+r" (n1), [n2] "+r" (n2), [count] "+w" (i) - : [port] "I" (_SFR_IO_ADDR(PORTB)), [ptr] "e" (ptr), [hi] "r" (hi), + : [_port] "I" (_SFR_IO_ADDR(PORTB)), [ptr] "e" (ptr), [hi] "r" (hi), [lo] "r" (lo)); #ifdef PORTD @@ -481,27 +481,27 @@ void NeoPixelBus::Show(void) asm volatile( "head20:" "\n\t" // Clk Pseudocode (T = 0) - "st %a[port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) + "st %a[_port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) "sbrc %[byte] , 7" "\n\t" // 1-2 if(b & 128) "mov %[next], %[hi]" "\n\t" // 0-1 next = hi (T = 4) - "st %a[port], %[next]" "\n\t" // 2 PORT = next (T = 6) + "st %a[_port], %[next]" "\n\t" // 2 PORT = next (T = 6) "mov %[next] , %[lo]" "\n\t" // 1 next = lo (T = 7) "dec %[bit]" "\n\t" // 1 bit-- (T = 8) "breq nextbyte20" "\n\t" // 1-2 if(bit == 0) "rol %[byte]" "\n\t" // 1 b <<= 1 (T = 10) - "st %a[port], %[lo]" "\n\t" // 2 PORT = lo (T = 12) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 12) "rjmp .+0" "\n\t" // 2 nop nop (T = 14) "rjmp .+0" "\n\t" // 2 nop nop (T = 16) "rjmp .+0" "\n\t" // 2 nop nop (T = 18) "rjmp head20" "\n\t" // 2 -> head20 (next bit out) "nextbyte20:" "\n\t" // (T = 10) - "st %a[port], %[lo]" "\n\t" // 2 PORT = lo (T = 12) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 12) "nop" "\n\t" // 1 nop (T = 13) "ldi %[bit] , 8" "\n\t" // 1 bit = 8 (T = 14) "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ (T = 16) "sbiw %[count], 1" "\n\t" // 2 i-- (T = 18) "brne head20" "\n" // 2 if(i != 0) -> (next byte) - : [port] "+e" (port), + : [_port] "+e" (_port), [byte] "+r" (b), [bit] "+r" (bit), [next] "+r" (next), @@ -544,47 +544,47 @@ void NeoPixelBus::Show(void) // we're exploiting the RCALL and RET as 3- and 4-cycle NOPs! asm volatile( "headD:" "\n\t" // (T = 0) - "out %[port], %[hi]" "\n\t" // (T = 1) + "out %[_port], %[hi]" "\n\t" // (T = 1) "rcall bitTimeD" "\n\t" // Bit 7 (T = 15) - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 6 - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 5 - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 4 - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 3 - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 2 - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeD" "\n\t" // Bit 1 // Bit 0: - "out %[port] , %[hi]" "\n\t" // 1 PORT = hi (T = 1) + "out %[_port] , %[hi]" "\n\t" // 1 PORT = hi (T = 1) "rjmp .+0" "\n\t" // 2 nop nop (T = 3) "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ (T = 5) - "out %[port] , %[next]" "\n\t" // 1 PORT = next (T = 6) + "out %[_port] , %[next]" "\n\t" // 1 PORT = next (T = 6) "mov %[next] , %[lo]" "\n\t" // 1 next = lo (T = 7) "sbrc %[byte] , 7" "\n\t" // 1-2 if(b & 0x80) (T = 8) "mov %[next] , %[hi]" "\n\t" // 0-1 next = hi (T = 9) "nop" "\n\t" // 1 (T = 10) - "out %[port] , %[lo]" "\n\t" // 1 PORT = lo (T = 11) + "out %[_port] , %[lo]" "\n\t" // 1 PORT = lo (T = 11) "sbiw %[count], 1" "\n\t" // 2 i-- (T = 13) "brne headD" "\n\t" // 2 if(i != 0) -> (next byte) "rjmp doneD" "\n\t" "bitTimeD:" "\n\t" // nop nop nop (T = 4) - "out %[port], %[next]" "\n\t" // 1 PORT = next (T = 5) + "out %[_port], %[next]" "\n\t" // 1 PORT = next (T = 5) "mov %[next], %[lo]" "\n\t" // 1 next = lo (T = 6) "rol %[byte]" "\n\t" // 1 b <<= 1 (T = 7) "sbrc %[byte], 7" "\n\t" // 1-2 if(b & 0x80) (T = 8) "mov %[next], %[hi]" "\n\t" // 0-1 next = hi (T = 9) "nop" "\n\t" // 1 (T = 10) - "out %[port], %[lo]" "\n\t" // 1 PORT = lo (T = 11) + "out %[_port], %[lo]" "\n\t" // 1 PORT = lo (T = 11) "ret" "\n\t" // 4 nop nop nop nop (T = 15) "doneD:" "\n" : [byte] "+r" (b), [next] "+r" (next), [count] "+w" (i) - : [port] "I" (_SFR_IO_ADDR(PORTD)), + : [_port] "I" (_SFR_IO_ADDR(PORTD)), [ptr] "e" (ptr), [hi] "r" (hi), [lo] "r" (lo)); @@ -603,44 +603,44 @@ void NeoPixelBus::Show(void) // Same as above, just set for PORTB & stripped of comments asm volatile( "headB:" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port], %[hi]" "\n\t" + "out %[_port], %[hi]" "\n\t" "rcall bitTimeB" "\n\t" - "out %[port] , %[hi]" "\n\t" + "out %[_port] , %[hi]" "\n\t" "rjmp .+0" "\n\t" "ld %[byte] , %a[ptr]+" "\n\t" - "out %[port] , %[next]" "\n\t" + "out %[_port] , %[next]" "\n\t" "mov %[next] , %[lo]" "\n\t" "sbrc %[byte] , 7" "\n\t" "mov %[next] , %[hi]" "\n\t" "nop" "\n\t" - "out %[port] , %[lo]" "\n\t" + "out %[_port] , %[lo]" "\n\t" "sbiw %[count], 1" "\n\t" "brne headB" "\n\t" "rjmp doneB" "\n\t" "bitTimeB:" "\n\t" - "out %[port], %[next]" "\n\t" + "out %[_port], %[next]" "\n\t" "mov %[next], %[lo]" "\n\t" "rol %[byte]" "\n\t" "sbrc %[byte], 7" "\n\t" "mov %[next], %[hi]" "\n\t" "nop" "\n\t" - "out %[port], %[lo]" "\n\t" + "out %[_port], %[lo]" "\n\t" "ret" "\n\t" "doneB:" "\n" : [byte] "+r" (b), [next] "+r" (next), [count] "+w" (i) - : [port] "I" (_SFR_IO_ADDR(PORTB)), [ptr] "e" (ptr), [hi] "r" (hi), + : [_port] "I" (_SFR_IO_ADDR(PORTB)), [ptr] "e" (ptr), [hi] "r" (hi), [lo] "r" (lo)); #ifdef PORTD @@ -665,16 +665,16 @@ void NeoPixelBus::Show(void) asm volatile( "head30:" "\n\t" // Clk Pseudocode (T = 0) - "st %a[port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) + "st %a[_port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) "sbrc %[byte] , 7" "\n\t" // 1-2 if(b & 128) "mov %[next], %[hi]" "\n\t" // 0-1 next = hi (T = 4) "rjmp .+0" "\n\t" // 2 nop nop (T = 6) - "st %a[port], %[next]" "\n\t" // 2 PORT = next (T = 8) + "st %a[_port], %[next]" "\n\t" // 2 PORT = next (T = 8) "rjmp .+0" "\n\t" // 2 nop nop (T = 10) "rjmp .+0" "\n\t" // 2 nop nop (T = 12) "rjmp .+0" "\n\t" // 2 nop nop (T = 14) "nop" "\n\t" // 1 nop (T = 15) - "st %a[port], %[lo]" "\n\t" // 2 PORT = lo (T = 17) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 17) "rjmp .+0" "\n\t" // 2 nop nop (T = 19) "dec %[bit]" "\n\t" // 1 bit-- (T = 20) "breq nextbyte30" "\n\t" // 1-2 if(bit == 0) @@ -689,7 +689,7 @@ void NeoPixelBus::Show(void) "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ (T = 26) "sbiw %[count], 1" "\n\t" // 2 i-- (T = 28) "brne head30" "\n" // 1-2 if(i != 0) -> (next byte) - : [port] "+e" (port), + : [_port] "+e" (_port), [byte] "+r" (b), [bit] "+r" (bit), [next] "+r" (next), @@ -704,8 +704,8 @@ void NeoPixelBus::Show(void) #elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000L) #ifdef INCLUDE_NEO_KHZ400_SUPPORT - if ((_flagsPixels & NEO_SPDMASK) == NEO_KHZ800) - { + if ((_flagsPixels & NEO_SPDMASK) == NEO_KHZ800) + { // 800 KHz bitstream #endif @@ -717,13 +717,43 @@ void NeoPixelBus::Show(void) volatile uint8_t next, bit; - hi = *_port | _pinMask; - lo = *_port & ~_pinMask; + hi = *_port | _pinMask; + lo = *_port & ~_pinMask; next = lo; - bit = 8; - - [lo] "r" (lo)); + bit = 8; + asm volatile( + "head20:" "\n\t" // Clk Pseudocode (T = 0) + "st %a[_port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) + "sbrc %[byte], 7" "\n\t" // 1-2 if(b & 128) + "mov %[next], %[hi]" "\n\t" // 0-1 next = hi (T = 4) + "dec %[bit]" "\n\t" // 1 bit-- (T = 5) + "st %a[_port], %[next]" "\n\t" // 2 PORT = next (T = 7) + "mov %[next] , %[lo]" "\n\t" // 1 next = lo (T = 8) + "breq nextbyte20" "\n\t" // 1-2 if(bit == 0) (from dec above) + "rol %[byte]" "\n\t" // 1 b <<= 1 (T = 10) + "rjmp .+0" "\n\t" // 2 nop nop (T = 12) + "nop" "\n\t" // 1 nop (T = 13) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 15) + "nop" "\n\t" // 1 nop (T = 16) + "rjmp .+0" "\n\t" // 2 nop nop (T = 18) + "rjmp head20" "\n\t" // 2 -> head20 (next bit out) + "nextbyte20:" "\n\t" // (T = 10) + "ldi %[bit] , 8" "\n\t" // 1 bit = 8 (T = 11) + "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ (T = 13) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 15) + "nop" "\n\t" // 1 nop (T = 16) + "sbiw %[count], 1" "\n\t" // 2 i-- (T = 18) + "brne head20" "\n" // 2 if(i != 0) -> (next byte) + : [_port] "+e" (_port), + [byte] "+r" (b), + [bit] "+r" (bit), + [next] "+r" (next), + [count] "+w" (i) + : [ptr] "e" (ptr), + [hi] "r" (hi), + [lo] "r" (lo)); + #ifdef INCLUDE_NEO_KHZ400_SUPPORT } @@ -745,18 +775,18 @@ void NeoPixelBus::Show(void) asm volatile( "head40:" "\n\t" // Clk Pseudocode (T = 0) - "st %a[port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) + "st %a[_port], %[hi]" "\n\t" // 2 PORT = hi (T = 2) "sbrc %[byte] , 7" "\n\t" // 1-2 if(b & 128) "mov %[next] , %[hi]" "\n\t" // 0-1 next = hi (T = 4) "rjmp .+0" "\n\t" // 2 nop nop (T = 6) "rjmp .+0" "\n\t" // 2 nop nop (T = 8) - "st %a[port], %[next]" "\n\t" // 2 PORT = next (T = 10) + "st %a[_port], %[next]" "\n\t" // 2 PORT = next (T = 10) "rjmp .+0" "\n\t" // 2 nop nop (T = 12) "rjmp .+0" "\n\t" // 2 nop nop (T = 14) "rjmp .+0" "\n\t" // 2 nop nop (T = 16) "rjmp .+0" "\n\t" // 2 nop nop (T = 18) "rjmp .+0" "\n\t" // 2 nop nop (T = 20) - "st %a[port], %[lo]" "\n\t" // 2 PORT = lo (T = 22) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 22) "nop" "\n\t" // 1 nop (T = 23) "mov %[next] , %[lo]" "\n\t" // 1 next = lo (T = 24) "dec %[bit]" "\n\t" // 1 bit-- (T = 25) @@ -773,11 +803,11 @@ void NeoPixelBus::Show(void) "ldi %[bit] , 8" "\n\t" // 1 bit = 8 (T = 28) "ld %[byte] , %a[ptr]+" "\n\t" // 2 b = *ptr++ (T = 30) "rjmp .+0" "\n\t" // 2 nop nop (T = 32) - "st %a[port], %[lo]" "\n\t" // 2 PORT = lo (T = 34) + "st %a[_port], %[lo]" "\n\t" // 2 PORT = lo (T = 34) "rjmp .+0" "\n\t" // 2 nop nop (T = 36) "sbiw %[count], 1" "\n\t" // 2 i-- (T = 38) "brne head40" "\n" // 1-2 if(i != 0) -> (next byte) - : [port] "+e" (port), + : [_port] "+e" (_port), [byte] "+r" (b), [bit] "+r" (bit), [next] "+r" (next),