#include "global.h" /* ========================================================================== ms delay */ void delayms (unsigned int ms) { while (ms > 50) { udelay(50000); ms -= 25; wdt_reset(); } udelay(ms * 1000); } /* ========================================================================== us delay */ void udelay (unsigned int us) { asm volatile ( /* test low byte */ "tst %A0\n" "brne L_ud_looplow%=\n" /* 1 or 2 cycles */ /* test high byte */ "L_ud_testhigh%=:\n" "tst %B0\n" "breq L_ud_end%=\n" /* 1 or 2 cycles */ "dec %B0\n" /* decrement high */ "L_ud_looplow%=:\n" "dec %A0\n" /* decrement low */ /* dummy cycles to 1 us (freq-6) */ "nop\n" "nop\n" "breq L_ud_testhigh%=\n" /* 1 or 2 cycles */ #ifdef UTIMER_HALFSTEP "bst %A0,0\n" /* every odd loop shortened by one cycle */ "brts L_ud_looplow%=\n" /* 1 of 2 cycles */ #else "nop\n" "nop\n" #endif "rjmp L_ud_looplow%=\n" /* 2 cycles */ "L_ud_end%=:\n" : : "r" (us) ); }