source: arduino-1-6-7/trunk/fuentes/arduino-ide-amd64/hardware/arduino/avr/cores/arduino/wiring_pulse.S @ 4837

Last change on this file since 4837 was 4837, checked in by daduve, 3 years ago

Adding new version

File size: 5.9 KB
Line 
1/*
2  wiring_pulse.s - pulseInASM() function in different flavours
3  Part of Arduino - http://www.arduino.cc/
4
5  Copyright (c) 2014 Martino Facchin
6
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Lesser General Public
9  License as published by the Free Software Foundation; either
10  version 2.1 of the License, or (at your option) any later version.
11
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  Lesser General Public License for more details.
16
17  You should have received a copy of the GNU Lesser General
18  Public License along with this library; if not, write to the
19  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20  Boston, MA  02111-1307  USA
21*/
22
23/*
24 * The following routine was generated by avr-gcc 4.8.3 with the following parameters
25 * -gstabs -Wa,-ahlmsd=output.lst -dp -fverbose-asm -O2
26 * on the original C function
27 *
28 * unsigned long pulseInSimpl(volatile uint8_t *port, uint8_t bit, uint8_t stateMask, unsigned long maxloops)
29 * {
30 *     unsigned long width = 0;
31 *     // wait for any previous pulse to end
32 *     while ((*port & bit) == stateMask)
33 *         if (--maxloops == 0)
34 *             return 0;
35 *
36 *     // wait for the pulse to start
37 *     while ((*port & bit) != stateMask)
38 *         if (--maxloops == 0)
39 *             return 0;
40 *
41 *     // wait for the pulse to stop
42 *     while ((*port & bit) == stateMask) {
43 *         if (++width == maxloops)
44 *             return 0;
45 *     }
46 *     return width;
47 * }
48 *
49 * some compiler outputs were removed but the rest of the code is untouched
50 */
51
52#include <avr/io.h>
53
54.section .text
55
56.global countPulseASM
57
58countPulseASM:
59
60.LM0:
61.LFBB1:
62    push r12   ;   ;  130 pushqi1/1 [length = 1]
63    push r13   ;   ;  131 pushqi1/1 [length = 1]
64    push r14   ;   ;  132 pushqi1/1 [length = 1]
65    push r15   ;   ;  133 pushqi1/1 [length = 1]
66    push r16   ;   ;  134 pushqi1/1 [length = 1]
67    push r17   ;   ;  135 pushqi1/1 [length = 1]
68/* prologue: function */
69/* frame size = 0 */
70/* stack size = 6 */
71.L__stack_usage = 6
72    mov r30,r24  ;  port, port   ;  2 *movhi/1  [length = 2]
73    mov r31,r25  ;  port, port
74/*     unsigned long width = 0;
75***     // wait for any previous pulse to end
76***     while ((*port & bit) == stateMask)
77*/
78.LM1:
79    rjmp .L2   ;   ;  181 jump  [length = 1]
80.L4:
81/*         if (--maxloops == 0) */
82.LM2:
83    subi r16,1   ;  maxloops,  ;  17  addsi3/2  [length = 4]
84    sbc r17, r1   ;  maxloops
85    sbc r18, r1   ;  maxloops
86    sbc r19, r1   ;  maxloops
87    breq .L13  ; ,   ;  19  branch  [length = 1]
88.L2:
89/*         if (--maxloops == 0) */
90.LM3:
91    ld r25,Z   ;  D.1554, *port_7(D)   ;  22  movqi_insn/4  [length = 1]
92    and r25,r22  ;  D.1554, bit  ;  24  andqi3/1  [length = 1]
93    cp r25,r20   ;  D.1554, stateMask  ;  25  *cmpqi/2  [length = 1]
94    breq .L4   ; ,   ;  26  branch  [length = 1]
95    rjmp .L6   ;   ;  184 jump  [length = 1]
96.L7:
97/*             return 0;
98***
99***     // wait for the pulse to start
100***     while ((*port & bit) != stateMask)
101***         if (--maxloops == 0)
102*/
103.LM4:
104    subi r16,1   ;  maxloops,  ;  31  addsi3/2  [length = 4]
105    sbc r17, r1   ;  maxloops
106    sbc r18, r1   ;  maxloops
107    sbc r19, r1   ;  maxloops
108    breq .L13  ; ,   ;  33  branch  [length = 1]
109.L6:
110/*         if (--maxloops == 0) */
111.LM5:
112    ld r25,Z   ;  D.1554, *port_7(D)   ;  41  movqi_insn/4  [length = 1]
113    and r25,r22  ;  D.1554, bit  ;  43  andqi3/1  [length = 1]
114    cpse r25,r20   ;  D.1554, stateMask  ;  44  enable_interrupt-3  [length = 1]
115    rjmp .L7   ;
116    mov r12, r1   ;  width  ;  7 *movsi/2  [length = 4]
117    mov r13, r1   ;  width
118    mov r14, r1   ;  width
119    mov r15, r1   ;  width
120    rjmp .L9   ;   ;  186 jump  [length = 1]
121.L10:
122/*             return 0;
123***
124***     // wait for the pulse to stop
125***     while ((*port & bit) == stateMask) {
126***         if (++width == maxloops)
127*/
128.LM6:
129    ldi r24,-1   ; ,   ;  50  addsi3/3  [length = 5]
130    sub r12,r24  ;  width,
131    sbc r13,r24  ;  width,
132    sbc r14,r24  ;  width,
133    sbc r15,r24  ;  width,
134    cp r16,r12   ;  maxloops, width  ;  51  *cmpsi/2  [length = 4]
135    cpc r17,r13  ;  maxloops, width
136    cpc r18,r14  ;  maxloops, width
137    cpc r19,r15  ;  maxloops, width
138    breq .L13  ; ,   ;  52  branch  [length = 1]
139.L9:
140/*         if (++width == maxloops) */
141.LM7:
142    ld r24,Z   ;  D.1554, *port_7(D)   ;  60  movqi_insn/4  [length = 1]
143    and r24,r22  ;  D.1554, bit  ;  62  andqi3/1  [length = 1]
144    cp r24,r20   ;  D.1554, stateMask  ;  63  *cmpqi/2  [length = 1]
145    breq .L10  ; ,   ;  64  branch  [length = 1]
146/*             return 0;
147***     }
148***     return width;
149*/
150.LM8:
151    mov r22,r12  ;  D.1553, width  ;  108 movqi_insn/1  [length = 1]
152    mov r23,r13  ;  D.1553, width  ;  109 movqi_insn/1  [length = 1]
153    mov r24,r14  ;  D.1553, width  ;  110 movqi_insn/1  [length = 1]
154    mov r25,r15  ;  D.1553, width  ;  111 movqi_insn/1  [length = 1]
155/* epilogue start */
156.LM9:
157    pop r17  ;   ;  171 popqi [length = 1]
158    pop r16  ;   ;  172 popqi [length = 1]
159    pop r15  ;   ;  173 popqi [length = 1]
160    pop r14  ;   ;  174 popqi [length = 1]
161    pop r13  ;   ;  175 popqi [length = 1]
162    pop r12  ;   ;  176 popqi [length = 1]
163    ret  ;  177 return_from_epilogue  [length = 1]
164.L13:
165.LM10:
166    ldi r22,0  ;  D.1553   ;  120 movqi_insn/1  [length = 1]
167    ldi r23,0  ;  D.1553   ;  121 movqi_insn/1  [length = 1]
168    ldi r24,0  ;  D.1553   ;  122 movqi_insn/1  [length = 1]
169    ldi r25,0  ;  D.1553   ;  123 movqi_insn/1  [length = 1]
170/* epilogue start */
171.LM11:
172    pop r17  ;   ;  138 popqi [length = 1]
173    pop r16  ;   ;  139 popqi [length = 1]
174    pop r15  ;   ;  140 popqi [length = 1]
175    pop r14  ;   ;  141 popqi [length = 1]
176    pop r13  ;   ;  142 popqi [length = 1]
177    pop r12  ;   ;  143 popqi [length = 1]
178    ret  ;  144 return_from_epilogue  [length = 1]
Note: See TracBrowser for help on using the repository browser.