|
22 | 22 |
|
23 | 23 | #include <avr/io.h>
|
24 | 24 |
|
25 |
| -#if 0 // commented version, unusable for macro expansion |
| 25 | +.section .text |
| 26 | + |
| 27 | +.global countPulseASM |
26 | 28 |
|
27 |
| -// bit is r25-24, state is r23-r22, timeout is r21-r18 |
| 29 | +// bit is r25-24, state is r23-r22, timeout is r21-r18, *port is r17-r16 |
28 | 30 | // these register do not need to be restored
|
29 |
| -// save r24 and r22 to r16,r17 for further use |
| 31 | +// save r24 and r22 to r14,r15 for further use |
30 | 32 | // r25-r22 are used to store width and must be restored
|
31 | 33 |
|
32 |
| -#define countPulseASM_gen(X) \ |
33 |
| -countPulseASM_##X: $ \ |
34 |
| -push r17 ; save r17-r15 $ \ |
35 |
| -push r16 $ \ |
36 |
| -push r15 $ \ |
37 |
| -mov r16, r24 ; set r16 to r24 and r17 to r22 $ \ |
38 |
| -mov r17, r22 ; r17 is now state $ \ |
39 |
| -mov r25,r1 ; zero r25-r22 $ \ |
40 |
| -mov r24,r1 $ \ |
41 |
| -mov r23,r1 $ \ |
42 |
| -mov r22,r1 $ \ |
43 |
| -loop_##X: ; start loop $ \ |
44 |
| -subi r22, 255 ; increment width $ \ |
45 |
| -sbci r23, 255 $ \ |
46 |
| -sbci r24, 255 $ \ |
47 |
| -sbci r25, 255 $ \ |
48 |
| -cp r22, r18 ; compare width with timeout $ \ |
49 |
| -cpc r23, r19 $ \ |
50 |
| -cpc r24, r20 $ \ |
51 |
| -cpc r25, r21 $ \ |
52 |
| -breq return_zero_##X ; if equal, return 0 $ \ |
53 |
| -in r26, PIN##X - 0x20 ; save port state to unused r26 $ \ |
54 |
| -eor r26, r17 ; xor with state $ \ |
55 |
| -and r26, r16 ; and with bit $ \ |
56 |
| -cpi r26, 0 ; compare with zero $ \ |
57 |
| -breq loop_##X ; if equal, continue looping $ \ |
58 |
| -rjmp exit_##X $ \ |
59 |
| -return_zero_##X: $ \ |
60 |
| -mov r22,r1 ; return 0 - timeout reached $ \ |
61 |
| -mov r23,r1 $ \ |
62 |
| -mov r24,r1 $ \ |
63 |
| -mov r25,r1 $ \ |
64 |
| -exit_##X: $ \ |
65 |
| -pop r17 $ \ |
66 |
| -pop r16 $ \ |
67 |
| -pop r15 $ \ |
68 |
| -ret |
69 |
| - |
70 |
| -#endif |
71 |
| - |
72 |
| -#define countPulseASM_gen(X) .global countPulseASM_##X $\ |
73 |
| -countPulseASM_##X: $\ |
74 |
| -push r17 $\ |
75 |
| -push r16 $\ |
76 |
| -push r15 $\ |
77 |
| -mov r16, r24 $\ |
78 |
| -mov r17, r22 $\ |
79 |
| -mov r25, r1 $\ |
80 |
| -mov r24, r1 $\ |
81 |
| -mov r23, r1 $\ |
82 |
| -mov r22, r1 $\ |
83 |
| -loop_##X: $\ |
84 |
| -subi r22, 255 $\ |
85 |
| -sbci r23, 255 $\ |
86 |
| -sbci r24, 255 $\ |
87 |
| -sbci r25, 255 $\ |
88 |
| -cp r22, r18 $\ |
89 |
| -cpc r23, r19 $\ |
90 |
| -cpc r24, r20 $\ |
91 |
| -cpc r25, r21 $\ |
92 |
| -breq return_zero_##X $\ |
93 |
| -in r26, PIN##X - 0x20 $\ |
94 |
| -eor r26, r17 $\ |
95 |
| -and r26, r16 $\ |
96 |
| -cpi r26, 0 $\ |
97 |
| -breq loop_##X $\ |
98 |
| -rjmp exit_##X $\ |
99 |
| -return_zero_##X: $\ |
100 |
| -mov r22, r1 $\ |
101 |
| -mov r23, r1 $\ |
102 |
| -mov r24, r1 $\ |
103 |
| -mov r25, r1 $\ |
104 |
| -exit_##X: $\ |
105 |
| -pop r17 $\ |
106 |
| -pop r16 $\ |
107 |
| -pop r15 $\ |
| 34 | +countPulseASM: |
| 35 | +push r14 ; save r14-r15 |
| 36 | +push r15 |
| 37 | +mov r14, r24 ; set r14 to r24 and r15 to r22 |
| 38 | +mov r15, r22 ; r15 is now state |
| 39 | +mov r25,r1 ; zero r25-r22 |
| 40 | +mov r24,r1 |
| 41 | +mov r23,r1 |
| 42 | +mov r22,r1 |
| 43 | +loop: ; start loop |
| 44 | +subi r22, 255 ; increment width |
| 45 | +sbci r23, 255 |
| 46 | +sbci r24, 255 |
| 47 | +sbci r25, 255 |
| 48 | +cp r22, r18 ; compare width with timeout |
| 49 | +cpc r23, r19 |
| 50 | +cpc r24, r20 |
| 51 | +cpc r25, r21 |
| 52 | +breq return_zero ; if equal, return 0 |
| 53 | +movw r30, r16 ; save port state to unused r26 |
| 54 | +ld r26, Z |
| 55 | +eor r26, r15 ; xor with state |
| 56 | +and r26, r14 ; and with bit |
| 57 | +cpi r26, 0 |
| 58 | +breq loop ; if equal, continue looping |
| 59 | +rjmp exit |
| 60 | +return_zero: |
| 61 | +mov r22,r1 ; return 0 - timeout reached |
| 62 | +mov r23,r1 |
| 63 | +mov r24,r1 |
| 64 | +mov r25,r1 |
| 65 | +exit: |
| 66 | +pop r14 |
| 67 | +pop r15 |
108 | 68 | ret
|
109 |
| - |
110 |
| -.section .text |
111 |
| - |
112 |
| -countPulseASM_gen(B) |
113 |
| -countPulseASM_gen(C) |
114 |
| -countPulseASM_gen(D) |
115 |
| - |
116 |
| - |
117 |
| -#if defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__) |
118 |
| - |
119 |
| -countPulseASM_gen(E) |
120 |
| -countPulseASM_gen(F) |
121 |
| -countPulseASM_gen(G) |
122 |
| - |
123 |
| -#endif |
0 commit comments