2010-12-26 20:59:17 -04:00
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/xhtml;charset=UTF-8" / >
2010-12-30 03:51:53 -04:00
< title > ArduPilot Libraries: macros.inc Source File< / title >
2010-12-26 20:59:17 -04:00
< link href = "tabs.css" rel = "stylesheet" type = "text/css" / >
2010-12-26 23:23:35 -04:00
< link href = "search/search.css" rel = "stylesheet" type = "text/css" / >
< script type = "text/javaScript" src = "search/search.js" > < / script >
2010-12-26 20:59:17 -04:00
< link href = "doxygen.css" rel = "stylesheet" type = "text/css" / >
< / head >
2010-12-26 23:23:35 -04:00
< body onload = 'searchBox.OnSelectItem(0);' >
2010-12-26 20:59:17 -04:00
<!-- Generated by Doxygen 1.7.1 -->
< div class = "navigation" id = "top" >
< div class = "tabs" >
< ul class = "tablist" >
< li > < a href = "main.html" > < span > Main Page< / span > < / a > < / li >
2010-12-30 03:51:53 -04:00
< li > < a href = "pages.html" > < span > Related Pages< / span > < / a > < / li >
2010-12-26 20:59:17 -04:00
< li > < a href = "namespaces.html" > < span > Namespaces< / span > < / a > < / li >
< li > < a href = "annotated.html" > < span > Classes< / span > < / a > < / li >
< li class = "current" > < a href = "files.html" > < span > Files< / span > < / a > < / li >
< / ul >
< / div >
< div class = "tabs2" >
< ul class = "tablist" >
< li > < a href = "files.html" > < span > File List< / span > < / a > < / li >
< li > < a href = "globals.html" > < span > File Members< / span > < / a > < / li >
< / ul >
< / div >
< div class = "header" >
< div class = "headertitle" >
2010-12-30 03:51:53 -04:00
< h1 > macros.inc< / h1 > < / div >
2010-12-26 20:59:17 -04:00
< / div >
< div class = "contents" >
< a href = "macros_8inc.html" > Go to the documentation of this file.< / a > < div class = "fragment" > < pre class = "fragment" > < a name = "l00001" > < / a > 00001 < span class = "comment" > /* Copyright (c) 2002, 2005, 2006, 2007 Marek Michalkiewicz< / span >
< a name = "l00002" > < / a > 00002 < span class = "comment" > Copyright (c) 2006 Dmitry Xmelkov< / span >
< a name = "l00003" > < / a > 00003 < span class = "comment" > All rights reserved.< / span >
< a name = "l00004" > < / a > 00004 < span class = "comment" > < / span >
< a name = "l00005" > < / a > 00005 < span class = "comment" > Redistribution and use in source and binary forms, with or without< / span >
< a name = "l00006" > < / a > 00006 < span class = "comment" > modification, are permitted provided that the following conditions are met:< / span >
< a name = "l00007" > < / a > 00007 < span class = "comment" > < / span >
< a name = "l00008" > < / a > 00008 < span class = "comment" > * Redistributions of source code must retain the above copyright< / span >
< a name = "l00009" > < / a > 00009 < span class = "comment" > notice, this list of conditions and the following disclaimer.< / span >
< a name = "l00010" > < / a > 00010 < span class = "comment" > < / span >
< a name = "l00011" > < / a > 00011 < span class = "comment" > * Redistributions in binary form must reproduce the above copyright< / span >
< a name = "l00012" > < / a > 00012 < span class = "comment" > notice, this list of conditions and the following disclaimer in< / span >
< a name = "l00013" > < / a > 00013 < span class = "comment" > the documentation and/or other materials provided with the< / span >
< a name = "l00014" > < / a > 00014 < span class = "comment" > distribution.< / span >
< a name = "l00015" > < / a > 00015 < span class = "comment" > < / span >
< a name = "l00016" > < / a > 00016 < span class = "comment" > * Neither the name of the copyright holders nor the names of< / span >
< a name = "l00017" > < / a > 00017 < span class = "comment" > contributors may be used to endorse or promote products derived< / span >
< a name = "l00018" > < / a > 00018 < span class = "comment" > from this software without specific prior written permission.< / span >
< a name = "l00019" > < / a > 00019 < span class = "comment" > < / span >
< a name = "l00020" > < / a > 00020 < span class = "comment" > THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS" < / span >
< a name = "l00021" > < / a > 00021 < span class = "comment" > AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE< / span >
< a name = "l00022" > < / a > 00022 < span class = "comment" > IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE< / span >
< a name = "l00023" > < / a > 00023 < span class = "comment" > ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE< / span >
< a name = "l00024" > < / a > 00024 < span class = "comment" > LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR< / span >
< a name = "l00025" > < / a > 00025 < span class = "comment" > CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF< / span >
< a name = "l00026" > < / a > 00026 < span class = "comment" > SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS< / span >
< a name = "l00027" > < / a > 00027 < span class = "comment" > INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN< / span >
< a name = "l00028" > < / a > 00028 < span class = "comment" > CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)< / span >
< a name = "l00029" > < / a > 00029 < span class = "comment" > ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE< / span >
< a name = "l00030" > < / a > 00030 < span class = "comment" > POSSIBILITY OF SUCH DAMAGE. */< / span >
< a name = "l00031" > < / a > 00031
< a name = "l00032" > < / a > 00032 < span class = "comment" > /*< / span >
< a name = "l00033" > < / a > 00033 < span class = "comment" > macros.inc - macros for use in assembler sources< / span >
< a name = "l00034" > < / a > 00034 < span class = "comment" > < / span >
< a name = "l00035" > < / a > 00035 < span class = "comment" > Contributors:< / span >
< a name = "l00036" > < / a > 00036 < span class = "comment" > Created by Marek Michalkiewicz < marekm@linux.org.pl> < / span >
< a name = "l00037" > < / a > 00037 < span class = "comment" > */< / span >
< a name = "l00038" > < / a > 00038
< a name = "l00039" > < / a > 00039 < span class = "preprocessor" > #include < avr/io.h> < / span >
< a name = "l00040" > < / a > 00040 < span class = "comment" > //#include " sectionname.h" < / span >
< a name = "l00041" > < / a > 00041
< a name = "l00042" > < / a > 00042 < span class = "comment" > /* if not defined, assume old version with underscores */< / span >
< a name = "l00043" > < / a > 00043 < span class = "preprocessor" > #ifndef __USER_LABEL_PREFIX__< / span >
< a name = "l00044" > < / a > 00044 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define __USER_LABEL_PREFIX__ _< / span >
< a name = "l00045" > < / a > 00045 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00046" > < / a > 00046 < span class = "preprocessor" > < / span >
< a name = "l00047" > < / a > 00047 < span class = "preprocessor" > #ifndef __REGISTER_PREFIX__< / span >
< a name = "l00048" > < / a > 00048 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define __REGISTER_PREFIX__< / span >
< a name = "l00049" > < / a > 00049 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00050" > < / a > 00050 < span class = "preprocessor" > < / span >
< a name = "l00051" > < / a > 00051 < span class = "comment" > /* the assembler line separator (just in case it ever changes) */< / span >
< a name = "l00052" > < / a > 00052 < span class = "preprocessor" > #define _L $< / span >
< a name = "l00053" > < / a > 00053 < span class = "preprocessor" > < / span >
< a name = "l00054" > < / a > 00054 < span class = "preprocessor" > #define CONCAT1(a, b) CONCAT2(a, b)< / span >
< a name = "l00055" > < / a > 00055 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define CONCAT2(a, b) a ## b< / span >
< a name = "l00056" > < / a > 00056 < span class = "preprocessor" > < / span >
< a name = "l00057" > < / a > 00057 < span class = "preprocessor" > #define _U(x) CONCAT1(__USER_LABEL_PREFIX__, x)< / span >
< a name = "l00058" > < / a > 00058 < span class = "preprocessor" > < / span >
< a name = "l00059" > < / a > 00059 < span class = "preprocessor" > #define _R(x) CONCAT1(__REGISTER_PREFIX__, x)< / span >
< a name = "l00060" > < / a > 00060 < span class = "preprocessor" > < / span >
< a name = "l00061" > < / a > 00061 < span class = "comment" > /* these should help to fix the " can' t have function named r1()" bug< / span >
< a name = "l00062" > < / a > 00062 < span class = "comment" > which may require adding ' %' in front of register names. */< / span >
< a name = "l00063" > < / a > 00063
< a name = "l00064" > < / a > 00064 < span class = "preprocessor" > #define r0 _R(r0)< / span >
< a name = "l00065" > < / a > 00065 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r1 _R(r1)< / span >
< a name = "l00066" > < / a > 00066 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r2 _R(r2)< / span >
< a name = "l00067" > < / a > 00067 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r3 _R(r3)< / span >
< a name = "l00068" > < / a > 00068 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r4 _R(r4)< / span >
< a name = "l00069" > < / a > 00069 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r5 _R(r5)< / span >
< a name = "l00070" > < / a > 00070 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r6 _R(r6)< / span >
< a name = "l00071" > < / a > 00071 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r7 _R(r7)< / span >
< a name = "l00072" > < / a > 00072 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r8 _R(r8)< / span >
< a name = "l00073" > < / a > 00073 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r9 _R(r9)< / span >
< a name = "l00074" > < / a > 00074 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r10 _R(r10)< / span >
< a name = "l00075" > < / a > 00075 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r11 _R(r11)< / span >
< a name = "l00076" > < / a > 00076 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r12 _R(r12)< / span >
< a name = "l00077" > < / a > 00077 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r13 _R(r13)< / span >
< a name = "l00078" > < / a > 00078 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r14 _R(r14)< / span >
< a name = "l00079" > < / a > 00079 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r15 _R(r15)< / span >
< a name = "l00080" > < / a > 00080 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r16 _R(r16)< / span >
< a name = "l00081" > < / a > 00081 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r17 _R(r17)< / span >
< a name = "l00082" > < / a > 00082 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r18 _R(r18)< / span >
< a name = "l00083" > < / a > 00083 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r19 _R(r19)< / span >
< a name = "l00084" > < / a > 00084 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r20 _R(r20)< / span >
< a name = "l00085" > < / a > 00085 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r21 _R(r21)< / span >
< a name = "l00086" > < / a > 00086 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r22 _R(r22)< / span >
< a name = "l00087" > < / a > 00087 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r23 _R(r23)< / span >
< a name = "l00088" > < / a > 00088 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r24 _R(r24)< / span >
< a name = "l00089" > < / a > 00089 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r25 _R(r25)< / span >
< a name = "l00090" > < / a > 00090 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r26 _R(r26)< / span >
< a name = "l00091" > < / a > 00091 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r27 _R(r27)< / span >
< a name = "l00092" > < / a > 00092 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r28 _R(r28)< / span >
< a name = "l00093" > < / a > 00093 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r29 _R(r29)< / span >
< a name = "l00094" > < / a > 00094 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r30 _R(r30)< / span >
< a name = "l00095" > < / a > 00095 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define r31 _R(r31)< / span >
< a name = "l00096" > < / a > 00096 < span class = "preprocessor" > < / span >
< a name = "l00097" > < / a > 00097 < span class = "preprocessor" > #ifndef __tmp_reg__< / span >
< a name = "l00098" > < / a > 00098 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define __tmp_reg__ r0< / span >
< a name = "l00099" > < / a > 00099 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00100" > < / a > 00100 < span class = "preprocessor" > < / span >
< a name = "l00101" > < / a > 00101 < span class = "preprocessor" > #ifndef __zero_reg__< / span >
< a name = "l00102" > < / a > 00102 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define __zero_reg__ r1< / span >
< a name = "l00103" > < / a > 00103 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00104" > < / a > 00104 < span class = "preprocessor" > < / span >
< a name = "l00105" > < / a > 00105 < span class = "preprocessor" > #if __AVR_MEGA__< / span >
< a name = "l00106" > < / a > 00106 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define XJMP jmp< / span >
< a name = "l00107" > < / a > 00107 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define XCALL call< / span >
< a name = "l00108" > < / a > 00108 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #else< / span >
< a name = "l00109" > < / a > 00109 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define XJMP rjmp< / span >
< a name = "l00110" > < / a > 00110 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define XCALL rcall< / span >
< a name = "l00111" > < / a > 00111 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00112" > < / a > 00112 < span class = "preprocessor" > < / span >
< a name = "l00113" > < / a > 00113 < span class = "comment" > /* used only by fplib/strtod.S - libgcc internal function calls */< / span >
< a name = "l00114" > < / a > 00114 < span class = "preprocessor" > #define PROLOGUE_SAVES(offset) XJMP (__prologue_saves__ + 2 * (offset))< / span >
< a name = "l00115" > < / a > 00115 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define EPILOGUE_RESTORES(offset) XJMP (__epilogue_restores__ + 2 * (offset))< / span >
< a name = "l00116" > < / a > 00116 < span class = "preprocessor" > < / span >
< a name = "l00117" > < / a > 00117 < span class = "preprocessor" > #if FLASHEND > 0x10000 < / span > < span class = "comment" > /* ATmega103 */< / span >
< a name = "l00118" > < / a > 00118 < span class = "preprocessor" > #define BIG_CODE 1< / span >
< a name = "l00119" > < / a > 00119 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #else< / span >
< a name = "l00120" > < / a > 00120 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #define BIG_CODE 0< / span >
< a name = "l00121" > < / a > 00121 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00122" > < / a > 00122 < span class = "preprocessor" > < / span >
< a name = "l00123" > < / a > 00123 < span class = "preprocessor" > #ifndef __AVR_HAVE_MOVW__< / span >
< a name = "l00124" > < / a > 00124 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # if defined(__AVR_ENHANCED__) & & __AVR_ENHANCED__< / span >
< a name = "l00125" > < / a > 00125 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # define __AVR_HAVE_MOVW__ 1< / span >
< a name = "l00126" > < / a > 00126 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # endif< / span >
< a name = "l00127" > < / a > 00127 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00128" > < / a > 00128 < span class = "preprocessor" > < / span >
< a name = "l00129" > < / a > 00129 < span class = "preprocessor" > #ifndef __AVR_HAVE_LPMX__< / span >
< a name = "l00130" > < / a > 00130 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # if defined(__AVR_ENHANCED__) & & __AVR_ENHANCED__< / span >
< a name = "l00131" > < / a > 00131 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # define __AVR_HAVE_LPMX__ 1< / span >
< a name = "l00132" > < / a > 00132 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # endif< / span >
< a name = "l00133" > < / a > 00133 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00134" > < / a > 00134 < span class = "preprocessor" > < / span >
< a name = "l00135" > < / a > 00135 < span class = "preprocessor" > #ifndef __AVR_HAVE_MUL__< / span >
< a name = "l00136" > < / a > 00136 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # if defined(__AVR_ENHANCED__) & & __AVR_ENHANCED__< / span >
< a name = "l00137" > < / a > 00137 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # define __AVR_HAVE_MUL__ 1< / span >
< a name = "l00138" > < / a > 00138 < span class = "preprocessor" > < / span > < span class = "preprocessor" > # endif< / span >
< a name = "l00139" > < / a > 00139 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00140" > < / a > 00140 < span class = "preprocessor" > < / span >
< a name = "l00141" > < / a > 00141 < span class = "comment" > /*< / span >
< a name = "l00142" > < / a > 00142 < span class = "comment" > Smart version of movw:< / span >
< a name = "l00143" > < / a > 00143 < span class = "comment" > - uses " movw" if possible (supported by MCU, and both registers even)< / span >
< a name = "l00144" > < / a > 00144 < span class = "comment" > - handles overlapping register pairs correctly< / span >
< a name = "l00145" > < / a > 00145 < span class = "comment" > - no instruction generated if source and destination are the same< / span >
< a name = "l00146" > < / a > 00146 < span class = "comment" > (may expand to 0, 1 or 2 instructions).< / span >
< a name = "l00147" > < / a > 00147 < span class = "comment" > */< / span >
< a name = "l00148" > < / a > 00148
< a name = "l00149" > < / a > 00149 .macro X_movw dst src
< a name = "l00150" > < / a > 00150 .L_movw_dst = -1
< a name = "l00151" > < / a > 00151 .L_movw_src = -1
< a name = "l00152" > < / a > 00152 .L_movw_n = 0
< a name = "l00153" > < / a > 00153 .irp reg, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
< a name = "l00154" > < / a > 00154 r10,r11,r12,r13,r14,r15,r16,r17,r18,r19, \
< a name = "l00155" > < / a > 00155 r20,r21,r22,r23,r24,r25,r26,r27,r28,r29, \
< a name = "l00156" > < / a > 00156 r30,r31
< a name = "l00157" > < / a > 00157 .ifc \reg,\dst
< a name = "l00158" > < / a > 00158 .L_movw_dst = .L_movw_n
< a name = "l00159" > < / a > 00159 .endif
< a name = "l00160" > < / a > 00160 .ifc \reg,\src
< a name = "l00161" > < / a > 00161 .L_movw_src = .L_movw_n
< a name = "l00162" > < / a > 00162 .endif
< a name = "l00163" > < / a > 00163 .L_movw_n = .L_movw_n + 1
< a name = "l00164" > < / a > 00164 .endr
< a name = "l00165" > < / a > 00165 .L_movw_n = 0
< a name = "l00166" > < / a > 00166 .irp reg, R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
< a name = "l00167" > < / a > 00167 R10,R11,R12,R13,R14,R15,R16,R17,R18,R19, \
< a name = "l00168" > < / a > 00168 R20,R21,R22,R23,R24,R25,R26,R27,R28,R29, \
< a name = "l00169" > < / a > 00169 R30,R31
< a name = "l00170" > < / a > 00170 .ifc \reg,\dst
< a name = "l00171" > < / a > 00171 .L_movw_dst = .L_movw_n
< a name = "l00172" > < / a > 00172 .endif
< a name = "l00173" > < / a > 00173 .ifc \reg,\src
< a name = "l00174" > < / a > 00174 .L_movw_src = .L_movw_n
< a name = "l00175" > < / a > 00175 .endif
< a name = "l00176" > < / a > 00176 .L_movw_n = .L_movw_n + 1
< a name = "l00177" > < / a > 00177 .endr
< a name = "l00178" > < / a > 00178 .if .L_movw_dst < 0
< a name = "l00179" > < / a > 00179 .L_movw_n = 0
< a name = "l00180" > < / a > 00180 .rept 32
< a name = "l00181" > < / a > 00181 .if \dst == .L_movw_n
< a name = "l00182" > < / a > 00182 .L_movw_dst = .L_movw_n
< a name = "l00183" > < / a > 00183 .endif
< a name = "l00184" > < / a > 00184 .L_movw_n = .L_movw_n + 1
< a name = "l00185" > < / a > 00185 .endr
< a name = "l00186" > < / a > 00186 .endif
< a name = "l00187" > < / a > 00187 .if .L_movw_src < 0
< a name = "l00188" > < / a > 00188 .L_movw_n = 0
< a name = "l00189" > < / a > 00189 .rept 32
< a name = "l00190" > < / a > 00190 .if \src == .L_movw_n
< a name = "l00191" > < / a > 00191 .L_movw_src = .L_movw_n
< a name = "l00192" > < / a > 00192 .endif
< a name = "l00193" > < / a > 00193 .L_movw_n = .L_movw_n + 1
< a name = "l00194" > < / a > 00194 .endr
< a name = "l00195" > < / a > 00195 .endif
< a name = "l00196" > < / a > 00196 .if (.L_movw_dst < 0) || (.L_movw_src < 0)
< a name = "l00197" > < / a > 00197 .err ; Invalid < span class = "stringliteral" > ' X_movw' < / span > arg.
< a name = "l00198" > < / a > 00198 .endif
< a name = "l00199" > < / a > 00199
< a name = "l00200" > < / a > 00200 .if ((.L_movw_src) - (.L_movw_dst)) < span class = "comment" > /* different registers */< / span >
< a name = "l00201" > < / a > 00201 .if (((.L_movw_src) | (.L_movw_dst)) & 0x01)
< a name = "l00202" > < / a > 00202 .if (((.L_movw_src)-(.L_movw_dst)) & 0x80) < span class = "comment" > /* src < dest */< / span >
< a name = "l00203" > < / a > 00203 mov (.L_movw_dst)+1, (.L_movw_src)+1
< a name = "l00204" > < / a > 00204 mov (.L_movw_dst), (.L_movw_src)
< a name = "l00205" > < / a > 00205 .< span class = "keywordflow" > else< / span > < span class = "comment" > /* src > dest */< / span >
< a name = "l00206" > < / a > 00206 mov (.L_movw_dst), (.L_movw_src)
< a name = "l00207" > < / a > 00207 mov (.L_movw_dst)+1, (.L_movw_src)+1
< a name = "l00208" > < / a > 00208 .endif
< a name = "l00209" > < / a > 00209 .< span class = "keywordflow" > else< / span > < span class = "comment" > /* both even -> overlap not possible */< / span >
< a name = "l00210" > < / a > 00210 #< span class = "keywordflow" > if< / span > defined(__AVR_HAVE_MOVW__) & & __AVR_HAVE_MOVW__
< a name = "l00211" > < / a > 00211 movw \dst, \src
< a name = "l00212" > < / a > 00212 < span class = "preprocessor" > #else< / span >
< a name = "l00213" > < / a > 00213 < span class = "preprocessor" > < / span > mov (.L_movw_dst), (.L_movw_src)
< a name = "l00214" > < / a > 00214 mov (.L_movw_dst)+1, (.L_movw_src)+1
< a name = "l00215" > < / a > 00215 #endif
< a name = "l00216" > < / a > 00216 .endif
< a name = "l00217" > < / a > 00217 .endif
< a name = "l00218" > < / a > 00218 .endm
< a name = "l00219" > < / a > 00219
< a name = "l00220" > < / a > 00220 < span class = "comment" > /* Macro ' X_lpm' extends enhanced lpm instruction for classic chips.< / span >
< a name = "l00221" > < / a > 00221 < span class = "comment" > Usage:< / span >
< a name = "l00222" > < / a > 00222 < span class = "comment" > X_lpm reg, dst< / span >
< a name = "l00223" > < / a > 00223 < span class = "comment" > where< / span >
< a name = "l00224" > < / a > 00224 < span class = "comment" > reg is 0..31, r0..r31 or R0..R31< / span >
< a name = "l00225" > < / a > 00225 < span class = "comment" > dst is z, Z, z+ or Z+< / span >
< a name = "l00226" > < / a > 00226 < span class = "comment" > It is possible to omit both arguments.< / span >
< a name = "l00227" > < / a > 00227 < span class = "comment" > < / span >
< a name = "l00228" > < / a > 00228 < span class = "comment" > Possible results for classic chips:< / span >
< a name = "l00229" > < / a > 00229 < span class = "comment" > lpm< / span >
< a name = "l00230" > < / a > 00230 < span class = "comment" > lpm / mov Rd,r0< / span >
< a name = "l00231" > < / a > 00231 < span class = "comment" > lpm / adiw ZL,1< / span >
< a name = "l00232" > < / a > 00232 < span class = "comment" > lpm / mov Rd,r0 / adiw ZL,1< / span >
< a name = "l00233" > < / a > 00233 < span class = "comment" > < / span >
< a name = "l00234" > < / a > 00234 < span class = "comment" > For enhanced chips it is one instruction always.< / span >
< a name = "l00235" > < / a > 00235 < span class = "comment" > < / span >
< a name = "l00236" > < / a > 00236 < span class = "comment" > ATTENTION: unlike enhanced chips SREG (S,V,N,Z,C) flags are< / span >
< a name = "l00237" > < / a > 00237 < span class = "comment" > changed in case of ' Z+' dst. R0 is scratch.< / span >
< a name = "l00238" > < / a > 00238 < span class = "comment" > */< / span >
< a name = "l00239" > < / a > 00239 .macro X_lpm dst=r0, src=Z
< a name = "l00240" > < / a > 00240
< a name = "l00241" > < / a > 00241 < span class = "comment" > /* dst evaluation */< / span >
< a name = "l00242" > < / a > 00242 .L_lpm_dst = -1
< a name = "l00243" > < / a > 00243
< a name = "l00244" > < / a > 00244 .L_lpm_n = 0
< a name = "l00245" > < / a > 00245 .irp reg, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
< a name = "l00246" > < / a > 00246 r10,r11,r12,r13,r14,r15,r16,r17,r18,r19, \
< a name = "l00247" > < / a > 00247 r20,r21,r22,r23,r24,r25,r26,r27,r28,r29, \
< a name = "l00248" > < / a > 00248 r30,r31
< a name = "l00249" > < / a > 00249 .ifc \reg,\dst
< a name = "l00250" > < / a > 00250 .L_lpm_dst = .L_lpm_n
< a name = "l00251" > < / a > 00251 .endif
< a name = "l00252" > < / a > 00252 .L_lpm_n = .L_lpm_n + 1
< a name = "l00253" > < / a > 00253 .endr
< a name = "l00254" > < / a > 00254
< a name = "l00255" > < / a > 00255 .L_lpm_n = 0
< a name = "l00256" > < / a > 00256 .irp reg, R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
< a name = "l00257" > < / a > 00257 R10,R11,R12,R13,R14,R15,R16,R17,R18,R19, \
< a name = "l00258" > < / a > 00258 R20,R21,R22,R23,R24,R25,R26,R27,R28,R29, \
< a name = "l00259" > < / a > 00259 R30,R31
< a name = "l00260" > < / a > 00260 .ifc \reg,\dst
< a name = "l00261" > < / a > 00261 .L_lpm_dst = .L_lpm_n
< a name = "l00262" > < / a > 00262 .endif
< a name = "l00263" > < / a > 00263 .L_lpm_n = .L_lpm_n + 1
< a name = "l00264" > < / a > 00264 .endr
< a name = "l00265" > < / a > 00265
< a name = "l00266" > < / a > 00266 .< span class = "keywordflow" > if< / span > .L_lpm_dst < 0
< a name = "l00267" > < / a > 00267 .L_lpm_n = 0
< a name = "l00268" > < / a > 00268 .rept 32
< a name = "l00269" > < / a > 00269 .< span class = "keywordflow" > if< / span > \dst == .L_lpm_n
< a name = "l00270" > < / a > 00270 .L_lpm_dst = .L_lpm_n
< a name = "l00271" > < / a > 00271 .endif
< a name = "l00272" > < / a > 00272 .L_lpm_n = .L_lpm_n + 1
< a name = "l00273" > < / a > 00273 .endr
< a name = "l00274" > < / a > 00274 .endif
< a name = "l00275" > < / a > 00275
< a name = "l00276" > < / a > 00276 .< span class = "keywordflow" > if< / span > (.L_lpm_dst < 0)
< a name = "l00277" > < / a > 00277 .err ; Invalid dst arg of < span class = "stringliteral" > ' X_lpm' < / span > macro.
< a name = "l00278" > < / a > 00278 .endif
< a name = "l00279" > < / a > 00279
< a name = "l00280" > < / a > 00280 < span class = "comment" > /* src evaluation */< / span >
< a name = "l00281" > < / a > 00281 .L_lpm_src = -1
< a name = "l00282" > < / a > 00282 .L_lpm_n = 0
< a name = "l00283" > < / a > 00283 .irp reg, z,Z,z+,Z+
< a name = "l00284" > < / a > 00284 .ifc \reg,\src
< a name = "l00285" > < / a > 00285 .L_lpm_src = .L_lpm_n
< a name = "l00286" > < / a > 00286 .endif
< a name = "l00287" > < / a > 00287 .L_lpm_n = .L_lpm_n + 1
< a name = "l00288" > < / a > 00288 .endr
< a name = "l00289" > < / a > 00289
< a name = "l00290" > < / a > 00290 .if (.L_lpm_src < 0)
< a name = "l00291" > < / a > 00291 .err ; Invalid src arg of < span class = "stringliteral" > ' X_lpm' < / span > macro.
< a name = "l00292" > < / a > 00292 .endif
< a name = "l00293" > < / a > 00293
< a name = "l00294" > < / a > 00294 < span class = "comment" > /* instruction(s) */< / span >
< a name = "l00295" > < / a > 00295 .if .L_lpm_src < 2
< a name = "l00296" > < / a > 00296 .if .L_lpm_dst == 0
< a name = "l00297" > < / a > 00297 lpm
< a name = "l00298" > < / a > 00298 .else
< a name = "l00299" > < / a > 00299 < span class = "preprocessor" > #if defined(__AVR_HAVE_LPMX__) & & __AVR_HAVE_LPMX__< / span >
< a name = "l00300" > < / a > 00300 < span class = "preprocessor" > < / span > lpm .L_lpm_dst, Z
< a name = "l00301" > < / a > 00301 < span class = "preprocessor" > #else< / span >
< a name = "l00302" > < / a > 00302 < span class = "preprocessor" > < / span > lpm
< a name = "l00303" > < / a > 00303 mov .L_lpm_dst, r0
< a name = "l00304" > < / a > 00304 < span class = "preprocessor" > #endif< / span >
< a name = "l00305" > < / a > 00305 < span class = "preprocessor" > < / span > .endif
< a name = "l00306" > < / a > 00306 .else
< a name = "l00307" > < / a > 00307 .if (.L_lpm_dst > = 30)
< a name = "l00308" > < / a > 00308 .err ; Registers 30 and 31 are inhibited as < span class = "stringliteral" > ' X_lpm *,Z+' < / span > dst.
< a name = "l00309" > < / a > 00309 .endif
< a name = "l00310" > < / a > 00310 < span class = "preprocessor" > #if defined(__AVR_HAVE_LPMX__) & & __AVR_HAVE_LPMX__< / span >
< a name = "l00311" > < / a > 00311 < span class = "preprocessor" > < / span > lpm .L_lpm_dst, Z+
< a name = "l00312" > < / a > 00312 < span class = "preprocessor" > #else< / span >
< a name = "l00313" > < / a > 00313 < span class = "preprocessor" > < / span > lpm
< a name = "l00314" > < / a > 00314 .if .L_lpm_dst
< a name = "l00315" > < / a > 00315 mov .L_lpm_dst, r0
< a name = "l00316" > < / a > 00316 .endif
< a name = "l00317" > < / a > 00317 adiw r30, 1
< a name = "l00318" > < / a > 00318 < span class = "preprocessor" > #endif< / span >
< a name = "l00319" > < / a > 00319 < span class = "preprocessor" > < / span > .endif
< a name = "l00320" > < / a > 00320 .endm
< a name = "l00321" > < / a > 00321
< a name = "l00322" > < / a > 00322 < span class = "comment" > /*< / span >
< a name = "l00323" > < / a > 00323 < span class = "comment" > LPM_R0_ZPLUS_INIT is used before the loop to initialize RAMPZ< / span >
< a name = "l00324" > < / a > 00324 < span class = "comment" > for future devices with RAMPZ:Z auto-increment - [e]lpm r0, Z+.< / span >
< a name = "l00325" > < / a > 00325 < span class = "comment" > < / span >
< a name = "l00326" > < / a > 00326 < span class = "comment" > LPM_R0_ZPLUS_NEXT is used inside the loop to load a byte from< / span >
< a name = "l00327" > < / a > 00327 < span class = "comment" > the program memory at [RAMPZ:]Z to R0, and increment [RAMPZ:]Z.< / span >
< a name = "l00328" > < / a > 00328 < span class = "comment" > < / span >
< a name = "l00329" > < / a > 00329 < span class = "comment" > The argument in both macros is a register that contains the< / span >
< a name = "l00330" > < / a > 00330 < span class = "comment" > high byte (bits 23-16) of the address, bits 15-0 should be in< / span >
< a name = "l00331" > < / a > 00331 < span class = "comment" > the Z (r31:r30) register. It can be any register except for:< / span >
< a name = "l00332" > < / a > 00332 < span class = "comment" > r0, r1 (__zero_reg__ - assumed to always contain 0), r30, r31.< / span >
< a name = "l00333" > < / a > 00333 < span class = "comment" > */< / span >
< a name = "l00334" > < / a > 00334
< a name = "l00335" > < / a > 00335 .macro LPM_R0_ZPLUS_INIT hhi
< a name = "l00336" > < / a > 00336 < span class = "preprocessor" > #if __AVR_ENHANCED__< / span >
< a name = "l00337" > < / a > 00337 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #if BIG_CODE< / span >
< a name = "l00338" > < / a > 00338 < span class = "preprocessor" > < / span > out AVR_RAMPZ_ADDR, \hhi
< a name = "l00339" > < / a > 00339 < span class = "preprocessor" > #endif< / span >
< a name = "l00340" > < / a > 00340 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00341" > < / a > 00341 < span class = "preprocessor" > < / span > .endm
< a name = "l00342" > < / a > 00342
< a name = "l00343" > < / a > 00343 .macro LPM_R0_ZPLUS_NEXT hhi
< a name = "l00344" > < / a > 00344 < span class = "preprocessor" > #if __AVR_ENHANCED__< / span >
< a name = "l00345" > < / a > 00345 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #if BIG_CODE< / span >
< a name = "l00346" > < / a > 00346 < span class = "preprocessor" > < / span > < span class = "comment" > /* ELPM with RAMPZ:Z post-increment, load RAMPZ only once */< / span >
< a name = "l00347" > < / a > 00347 elpm r0, Z+
< a name = "l00348" > < / a > 00348 < span class = "preprocessor" > #else< / span >
< a name = "l00349" > < / a > 00349 < span class = "preprocessor" > < / span > < span class = "comment" > /* LPM with Z post-increment, max 64K, no RAMPZ (ATmega83/161/163/32) */< / span >
< a name = "l00350" > < / a > 00350 lpm r0, Z+
< a name = "l00351" > < / a > 00351 < span class = "preprocessor" > #endif< / span >
< a name = "l00352" > < / a > 00352 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #else< / span >
< a name = "l00353" > < / a > 00353 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #if BIG_CODE< / span >
< a name = "l00354" > < / a > 00354 < span class = "preprocessor" > < / span > < span class = "comment" > /* ELPM without post-increment, load RAMPZ each time (ATmega103) */< / span >
< a name = "l00355" > < / a > 00355 out AVR_RAMPZ_ADDR, \hhi
< a name = "l00356" > < / a > 00356 elpm
< a name = "l00357" > < / a > 00357 adiw r30,1
< a name = "l00358" > < / a > 00358 adc \hhi, __zero_reg__
< a name = "l00359" > < / a > 00359 < span class = "preprocessor" > #else< / span >
< a name = "l00360" > < / a > 00360 < span class = "preprocessor" > < / span > < span class = "comment" > /* LPM without post-increment, max 64K, no RAMPZ (AT90S*) */< / span >
< a name = "l00361" > < / a > 00361 lpm
< a name = "l00362" > < / a > 00362 adiw r30,1
< a name = "l00363" > < / a > 00363 < span class = "preprocessor" > #endif< / span >
< a name = "l00364" > < / a > 00364 < span class = "preprocessor" > < / span > < span class = "preprocessor" > #endif< / span >
< a name = "l00365" > < / a > 00365 < span class = "preprocessor" > < / span > .endm
< / pre > < / div > < / div >
< / div >
2010-12-26 23:23:35 -04:00
< hr class = "footer" / > < address class = "footer" > < small >
Generated for ArduPilot Libraries by < a href = "http://www.doxygen.org/index.html" > < img class = "footer" src = "doxygen.png" alt = "doxygen" / > < / a > < / small > < / address >
2010-12-26 20:59:17 -04:00
< / body >
< / html >