X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fattiny%2Fao_async.c;h=f7a29d3b799f88e0ab71dd2e92f4db3f167d4e30;hb=aeb07f2b94b0121d4e5a6ce175ce4e013d6557cf;hp=9f7fd6d761d8072c7ac665b880d347319aaa47f7;hpb=2427eae5f3b429d302fbe14f708dcbc68c851954;p=fw%2Faltos diff --git a/src/attiny/ao_async.c b/src/attiny/ao_async.c index 9f7fd6d7..f7a29d3b 100644 --- a/src/attiny/ao_async.c +++ b/src/attiny/ao_async.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -52,10 +53,6 @@ ao_async_byte(uint8_t byte) ao_arch_block_interrupts(); -#if AO_LED_SERIAL != 4 -#error "expect AO_LED_SERIAL to be 4" -#endif - /* Ok, this is a bit painful. * We need this loop to be precisely timed, which * means knowing exactly how many instructions will @@ -72,18 +69,45 @@ ao_async_byte(uint8_t byte) " andi %[v], %[led_mask]\n" // mask to clear LED bit " mov %[bit], %[w_lo]\n" // get current data byte " andi %[bit], 0x01\n" // get current data bit - " swap %[bit]\n" // rotate by 4 (AO_LED_SERIAL is 4) - " andi %[bit], 0xf0\n" // mask off other 4 bits - " or %[v], %[bit]\n" // add to register - " out %[port], %[v]\n" // write current value - " lsr %[w_hi]\n" // shift data - " ror %[w_lo]\n" // ... +#if AO_LED_SERIAL >= 1 + " add %[bit],%[bit]\n" // shift by one +#else + " nop\n" +#endif +#if AO_LED_SERIAL >= 2 + " add %[bit],%[bit]\n" // shift by one +#else + " nop\n" +#endif +#if AO_LED_SERIAL >= 3 + " add %[bit],%[bit]\n" // shift by one +#else " nop\n" +#endif +#if AO_LED_SERIAL >= 4 + " add %[bit],%[bit]\n" // shift by one +#else " nop\n" +#endif +#if AO_LED_SERIAL >= 5 + " add %[bit],%[bit]\n" // shift by one +#else " nop\n" +#endif +#if AO_LED_SERIAL >= 6 + " add %[bit],%[bit]\n" // shift by one +#else " nop\n" +#endif +#if AO_LED_SERIAL >= 7 + " add %[bit],%[bit]\n" // shift by one +#else " nop\n" - +#endif + " or %[v], %[bit]\n" // add to register + " out %[port], %[v]\n" // write current value + " lsr %[w_hi]\n" // shift data + " ror %[w_lo]\n" // ... " nop\n" " nop\n" " nop\n"