Fix bad Merge

This commit is contained in:
Makuna
2015-06-08 18:23:53 -07:00
parent 07360645af
commit 3f798a16ba

View File

@@ -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),