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