forked from KolibriOS/kolibrios
760 lines
31 KiB
HTML
760 lines
31 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||
<meta name="generator" content="AsciiDoc 8.5.3" />
|
||
<link rel="stylesheet" href="./xhtml11.css" type="text/css" />
|
||
<link rel="stylesheet" href="./xhtml11-quirks.css" type="text/css" />
|
||
<link rel="stylesheet" href="./layout1.css" type="text/css" />
|
||
<script type="text/javascript">
|
||
/*<![CDATA[*/
|
||
window.onload = function(){asciidoc.footnotes();}
|
||
/*]]>*/
|
||
</script>
|
||
<script type="text/javascript" src="./asciidoc-xhtml11.js"></script>
|
||
<title>README</title>
|
||
</head>
|
||
<body>
|
||
<div id="layout-banner">
|
||
<div id="layout-title">AVRA</div>
|
||
<div id="layout-description">Assember for the Atmel AVR microcontroller family</div>
|
||
</div>
|
||
<table>
|
||
<tr valign="top">
|
||
<td id="layout-menu">
|
||
<div>»<a href="index.html">Home</a></div>
|
||
<div>»<a href="README.html">Readme</a></div>
|
||
<div>»<a href="downloads.html">Downloads</a></div>
|
||
<div>»<a href="ChangeLog.html">ChangeLog</a></div>
|
||
<div>»<a href="http://sourceforge.net/projects/avra">Sourceforge</a></div>
|
||
<div id="page-source">»<a href="README.txt">Page Source</a></div>
|
||
</td>
|
||
<td>
|
||
<div id="layout-content">
|
||
<div id="header">
|
||
<h1>README</h1>
|
||
</div>
|
||
<div id="content">
|
||
<h2 id="_general_and_licensing_information">General and licensing information</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>AVRA v1.3.0 - Assember for the Atmel AVR microcontroller family</p></div>
|
||
<h3 id="_licensing_information">Licensing information</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>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; either version 2 of the License, or
|
||
(at your option) any later version. Please read below for for information.</p></div>
|
||
<h3 id="_disclaimer">Disclaimer</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>This program is distributed in the hope that it will be useful, but
|
||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.</p></div>
|
||
<h3 id="_gnu_general_public_license">GNU General Public License</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>You should have received a copy of the GNU General Public License
|
||
along with this program; see the file "COPYING". If not, visit
|
||
<a href="http://www.gnu.org">http://www.gnu.org</a> or write to the Free Software Foundation, Inc.,
|
||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. You can
|
||
also contact the authors of AVRA to receive a copy of the COPYING file.</p></div>
|
||
<h3 id="_trademarks_and_copyright">Trademarks and copyright</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Atmel, AVR, AVR Studio, Intel, Windows are registered enterprises, brands
|
||
and registered trademarks. The mentioned companies have no relation to
|
||
AVRA and are therefore not responslible for any problems that occur when
|
||
using AVRA. Many thanks for your products, support and efforts.</p></div>
|
||
</div>
|
||
<h2 id="_introducion">Introducion</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>AVRA is an assembler for Atmel AVR microcontrollers, and it is almost
|
||
compatible with Atmel’s own assembler AVRASM32. The programming
|
||
principles and conceptions are based on the ANSI programming language "C".</p></div>
|
||
<div class="paragraph"><p>The initial version of AVRA was written by John Anders Haugum. He released
|
||
all versions until v0.7. All later versions were released by Tobias Weber.</p></div>
|
||
<h3 id="_differences_between_avra_and_avrasm32">Differences between AVRA and AVRASM32</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>There are some differences between the original Atmel assembler AVRASM32 and AVRA. Basically AVRA is designed to replace AVRASM32 without special changes in your current Atmel AVR Studio enviroment.
|
||
Command line options have been adapted as far as it was possible until now. Jumping to fault containing line directly by double-clicking on the error message in the output window does work as with AVRASM32.</p></div>
|
||
<h3 id="_the_differences_in_detail">The differences in detail</h3><div style="clear:left"></div>
|
||
<div class="ulist"><ul>
|
||
<li>
|
||
<p>
|
||
Support for some extra preprocessor directives.
|
||
</p>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.define, .undef, .ifdef, .ifndef, .if, .else, .endif, .elif, .elseif, .warning</tt></pre>
|
||
</div></div>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Not all command line options are supported.
|
||
Specifying an eeprom file (-e) is not supported. All eeprom data is
|
||
put out into a file called program.eep.hex and always Intel hex
|
||
format. Other hex file formats than Intel are currently not supported.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Forward references not supported for .ifdef and .ifndef directives.
|
||
This makes sure, that directives like .ifdef and .undef are working
|
||
properly. If you are familiar with the C programming language, you
|
||
should get easily into AVRA. See chapter "Programming techniques" for
|
||
more information about how to write proper code.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Enhanced macro support
|
||
AVRA has some new features for writing flexible macros. This should
|
||
increase the ability to reuse code e.g. build your own library.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Debugging support
|
||
AVRA creates a coff file everytime the assembly was sucessful. This
|
||
file allows AVR Studio or any coff compatible debugger to simulate
|
||
or emulate the program.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Meta tags for assembly time
|
||
This helps you tracking versions of your software and can also be
|
||
used to generate customer specific serial numbers.
|
||
</p>
|
||
</li>
|
||
</ul></div>
|
||
<h3 id="_compatibility">Compatibility</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Since AVRA is written in ANSI C, it should be possible to compile it on
|
||
most system platforms. If you have problems compiling AVRA, please leave
|
||
a message on the sourceforge message board or send a mail to the
|
||
authors of AVRA.</p></div>
|
||
</div>
|
||
<h2 id="_installation">Installation</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>To install avra you should copy the avra-executable to an apropriate
|
||
location. To compile you should rename the appropriate makefile, and
|
||
perform a make (use smake for Amiga SAS/C, and nmake for Mickeysoft
|
||
visual c++).</p></div>
|
||
<h3 id="_linux">Linux</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>To compile avra you need gcc and the automake utilities. These will create
|
||
a ./configure script that evaluates your system enviroment. To get the
|
||
AVRA executable, you have to issue the following commands:</p></div>
|
||
<div class="paragraph"><p>aclocal
|
||
autoconf
|
||
automake -a
|
||
./configure
|
||
make && make install</p></div>
|
||
<h3 id="_amigaos">AmigaOS</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>avra can be copied any apropriate directory. If you are using the source
|
||
distribution a <em>make install</em> will do the same.</p></div>
|
||
<h3 id="_microsoft_windows">Microsoft Windows</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>If you received the Windows binary package, look into the \bin
|
||
directory where you can find avra.exe. This should be copied to any
|
||
apropriate location. You can also overwrite AVRASM32.EXE in your
|
||
Atmel AVR Studio. If you want to compile it yourself you could download then
|
||
OpenWatcom C/C++ Toolchain for windows and create a new project and add the C
|
||
and H files to it and compile.</p></div>
|
||
<h3 id="_apple_os_x">Apple OS X</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>If you recieved the Apple OS X binary package, look into the bin directory this
|
||
file is compiled universal and should run on intel 32 and 64 bit and powerpc. If
|
||
you want to compile it yourself go to the src directory and invoke <tt>make -f
|
||
makefiles/Makefiles.osx</tt> and then the executable should be created.</p></div>
|
||
</div>
|
||
<h2 id="_synopsis">Synopsis</h2>
|
||
<div class="sectionbody">
|
||
<h3 id="_command_line_usage">Command line usage</h3><div style="clear:left"></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>usage: AVRA [-f][O|M|I|G] output file type
|
||
[-o <filename>] output file name
|
||
[-l <filename>] generate list file
|
||
[-m <mapfile>] generate map file
|
||
[--define <symbol>[=<value>]] [--includedir <dir>] [--listmac]
|
||
[--max_errors <number>] [--devices] [--version]
|
||
[-h] [--help] general help
|
||
[-W NoRegDef] supress register redefinition warnings
|
||
<file to assemble></tt></pre>
|
||
</div></div>
|
||
<h3 id="_parameter_list">Parameter list</h3><div style="clear:left"></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>--listfile -l : Create list file
|
||
--mapfile -m : Create map file
|
||
--define -D : Define symbol.
|
||
--includedir -I : Additional include dirs.
|
||
--listmac : List macro expansion in listfile.
|
||
--max_errors : Maximum number of errors before exit
|
||
(default: 10)
|
||
--devices : List out supported devices.
|
||
--version : Version information.
|
||
--help, -h : This help text.</tt></pre>
|
||
</div></div>
|
||
<h3 id="_warning_supression">Warning supression</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Since avra 1.1 there is a possibility to supress certain warnings.
|
||
Currently only register reassignment warnings can be supressed.</p></div>
|
||
<div class="paragraph"><p>Example: avra -W NoRegDef</p></div>
|
||
</div>
|
||
<h2 id="_programming_techniques">Programming techniques</h2>
|
||
<div class="sectionbody">
|
||
<h3 id="_using_directives">Using directives</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>AVRA offers a number of directives that are not part of Atmel’s
|
||
assembler. These directives should help you creating versatile code that
|
||
can be designed more modular.</p></div>
|
||
<h4 id="_directive_define">Directive .define</h4>
|
||
<div class="paragraph"><p>To define a constant, use ".define". This does the same thing as ".equ",
|
||
it is just a little more C style. Keep in mind that AVRA is not case
|
||
sensitive. Do not mix ".def" and ".define", because ".def" is used to
|
||
assign registers only. This is due to backward compatibility to Atmel’s
|
||
AVRASM32. Here is an example on how .define can be used.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.define network 1</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>Now "network" is set to the value 1. You may want to assemble a specific
|
||
part of your code depeding on a define or switch setting. You can test
|
||
your defined word on existence (.ifdef and .ifndef) as well as on the
|
||
value it represents. The following code shows a way to prevent error
|
||
messages due to testing undefined constants. Conditional directives must
|
||
always end with an .endif directive.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.ifndef network
|
||
.define network 0
|
||
.endif</tt></pre>
|
||
</div></div>
|
||
<h4 id="_directive_if_and_else">Directive .if and .else</h4>
|
||
<div class="paragraph"><p>The three lines in the last example set the default value of "network".
|
||
In the next example, you see how we can use default values. If a constant
|
||
has not defined previously, it is set to zero. Now you can test wether
|
||
e.g. network support is included into the assemby process.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.if network = 1
|
||
.include "include\tcpip.asm"
|
||
.else
|
||
.include "include\dummynet.asm"
|
||
.endif</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>In the second part of the above listing you see the use of .else, which
|
||
defines the part of the condition that is being executed if the equation
|
||
of the preceding .if statement is not equal. You can also use the else
|
||
statement to test another equasion. For that purpose use .elif, which
|
||
means "else if". Always close this conditional part with ".endif"</p></div>
|
||
<h4 id="_directive_error">Directive .error</h4>
|
||
<div class="paragraph"><p>This directive can be used to throw errors if a part in the code has reached
|
||
that should not be reached. The following example shows how we can stop
|
||
the assembly process if a particular value has not been previously set.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.ifndef network
|
||
.error "network is not configured!" ;the assembler stops here</tt></pre>
|
||
</div></div>
|
||
<h4 id="_directive_nolist_and_list">Directive .nolist and .list</h4>
|
||
<div class="paragraph"><p>The ouput to the list file can be paused by this two directives. After
|
||
avra discovers a .nolist while assembling, it stops output to the list file.
|
||
After a .list directive is detected, it continues the normal list file output.</p></div>
|
||
<h4 id="_directive_includepath">Directive .includepath</h4>
|
||
<div class="paragraph"><p>By default, any file that is included from within the source file must
|
||
either be a single filename or a complete absolute path. With the directive
|
||
.includepath you can set an additional include path . Furthermore you can
|
||
set as many include paths as you want. Be sure not no use same filename
|
||
in separate includes, because then it is no longer clear which one avra
|
||
should take.</p></div>
|
||
</div>
|
||
<h2 id="_using_include_files">Using include files</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>To avoid multiple inclusions of include files, you may use some pre-
|
||
processor directives. See example file stack.asm that is being included
|
||
into the main programm file as well as in other include files.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.ifndef _STACK_ASM_
|
||
.define _STACK_ASM_</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.include "include/config.inc"</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; *** stack macro ***</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.dseg
|
||
m_stack: .byte __stack_size__
|
||
.cseg</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro stack_setup
|
||
load [v:w,m_stack + __stack_size__]
|
||
outp [SPREG,v:w]
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.endif ; avoid multiple inclusion of stack.asm</tt></pre>
|
||
</div></div>
|
||
<h3 id="_using_build_date_meta_tags">Using build date meta tags</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>If you like to implement compiler build time and date into your
|
||
program, you can make use of some sepcial tags that avra supports.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>%MINUTE% is being replaced by the current minute (00-59)
|
||
%HOUR% is being replaced by the current hour (00-23)
|
||
%DAY% is being replaced by the current day of month (01-31)
|
||
%MONTH% is being replaced by the current month (01-12)
|
||
%YEAR% is being replaced by the current year (2004-9999)</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>buildtime: .db "Release date %DAY%.%MONTH%.%YEAR% %HOUR%:%MINUTE%"</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>This line will then assembled by avra into:</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>buildtime: .db "Release date 10.05.2004 19:54"</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>You may also create a self defined serial number with meta tags:</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.define serialnumber %DAY% + %MONTH%*31 + (%YEAR% - 2000) *31*12</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>The %TAG% is translated before any other parsing happens. The real
|
||
output can be found in the list file.</p></div>
|
||
</div>
|
||
<h2 id="_macro_features">Macro features</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>Sometimes you have to work with 16 bit or greater variables stored
|
||
in 8 bit registers. The enhanced macro support allows you to write short
|
||
and flexible macros that simplify access to big variables. The extended
|
||
mode is active, as soon as you use parenthesis like this "[ ]" to wrap
|
||
macro parameters.</p></div>
|
||
<h3 id="_auto_type_conversion_for_macros">Auto type conversion for macros</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Values representing more than 8 Bits are usualy kept in a set of byte
|
||
wide registers. To simplify 16 Bit or greater operations, I added a new
|
||
language definitions. Words can be written as r16:r17, whereas register
|
||
r16 contains the higher part and register r17 the lower part of this
|
||
16 Bit value.</p></div>
|
||
<h4 id="_macro_data_types">Macro data types</h4>
|
||
<div class="paragraph"><p>There are 3 data types that can be used. They will be added as character
|
||
separated by one underline character.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>immediate values _i
|
||
registers _8,_16,_24,_32,_40,_48,_56,_64
|
||
void parameter _v</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>16 Bit Source and Destionation registers <em>dst</em> and <em>src</em></p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>src = YH:YL
|
||
dst = ZH:ZL</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>Within the parenthesis, the two words src and dst are interpreted as YH:YL
|
||
and ZH:ZL. Normal code outside of the macro parameter parenthesis can
|
||
still make use of these special key words "src" and "dst".</p></div>
|
||
<h4 id="_examples_for_automatic_type_conversion">Examples for automatic type conversion</h4>
|
||
<div class="paragraph"><p>To simplify the parameters in the demonstration below, we need to
|
||
redefine some registers.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.def a = r16 ; general purpose registers
|
||
.def b = r17
|
||
.def c = r18
|
||
.def d = r19</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.def w = r20 ; working register
|
||
.def v = r21 ; working register</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>If we substract 16 Bit values stored in a, higher byte and b, lower byte
|
||
with that in c:d, we usually have to use the following command sequence:</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>sub b,d
|
||
sbc a,c</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>Now we can do the following steps to simplify 16 or more Bit manipulations</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro subs
|
||
.message "no parameters specified"
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro subs_16_16
|
||
sub @1,@3
|
||
sbc @0,@2
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro subs_16_8
|
||
sub @1,@2
|
||
sbci @0,0
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>;now we can write a 16 Bit subraction as:</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>subs [a:b,c:d]</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>;or for calculating 16 minus 8 Bit</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>subs [a:b,c]</tt></pre>
|
||
</div></div>
|
||
<h3 id="_overloading_macros">Overloading macros</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Like in you are used to C functions, you can write macros for different
|
||
parameter lists. If you would like to have a versatile macro, you can
|
||
specify a unique macro for each parameter situation. See the next sample.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro load</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; this message is shown if you use the macro within your code
|
||
; specifying no parameters. If your macro allows the case where
|
||
; no parameters are given, exchange .message with your code.</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.message "no parameters specified"
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; Here we define the macro "load" for the case it is being used
|
||
; with two registers as first parameter and a immediate (constant)
|
||
; value as second parameter.</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro load_16_i
|
||
ldi @0,high(@2)
|
||
ldi @1,low(@2)
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; the same case, but now with a 32 bit register value as first
|
||
; parameter</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro load_32_i
|
||
ldi @0,BYTE4(@4)
|
||
ldi @1,BYTE3(@4)
|
||
ldi @2,high(@4)
|
||
ldi @3,low(@4)
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; Now let's see how these macros are being used in the code</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>load [a:b,15] ;uses macro load_16_i to load immediate</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>load [a:b:c:d,15] ;uses macro load_32_i to load immediate</tt></pre>
|
||
</div></div>
|
||
<h3 id="_more_examples">More examples</h3><div style="clear:left"></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.dseg
|
||
counter .byte 2
|
||
.cseg</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro poke
|
||
.message "no parameters"
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro poke_i_16_i
|
||
ldi @1,high(@3)
|
||
sts @0+0,@1
|
||
ldi @2,low(@3)
|
||
sts @0+1,@2
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro poke_i_i
|
||
ldi w,@1
|
||
sts @0+0,w
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro poke_i_v_i
|
||
ldi w,high(@3)
|
||
sts @0+0,w
|
||
ldi w,low(@3)
|
||
sts @0+1,w
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro poke_i_v_v_v_i
|
||
ldi w,high(@3)
|
||
sts @0+0,w
|
||
ldi w,low(@3)
|
||
sts @0+1,w
|
||
ldi w,BYTE3(@3)
|
||
sts @0+2,w
|
||
ldi w,BYTE4(@3)
|
||
sts @0+3,w
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; this writes '9999' into the memory at 'counter'
|
||
; uses only the working register for transfering the values.</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>poke [counter,w:w,9999]</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; works same as above, but the transferred value '9999' is also
|
||
; kept in the pair of register a:b</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>poke [counter,a:b,9999]</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; in my design 'w' is always working reg. which implies that
|
||
; it cannot be used for normal variables. The following example
|
||
; uses poke_i_i because the parameter contains two immediate values.</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>poke [counter,9999] ;uses poke_i_i</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; to be able to choose between a 8,16 or 32 Bit operation, you just
|
||
; add a void parameter.</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>poke [counter,,9999] ;uses poke_i_v_i</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; and the same for 32 Bit pokes</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>poke [counter,,,,9999] ;uses poke_i_v_v_v_i</tt></pre>
|
||
</div></div>
|
||
<h3 id="_loops_within_macros">Loops within macros</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>One problem you may have experienced, is that labels defined within macros
|
||
are defined twice if you call the macro for example two times. Now you can
|
||
use labels for macro loops. Loops within macros must end with <em>_%</em>. the
|
||
"%" symbol is replaced by a running number.</p></div>
|
||
<h4 id="_loop_example">Loop example</h4>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; Definition of the macro</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.macro write_8_8
|
||
write_%:
|
||
st Z+,@0
|
||
dec @1
|
||
brne write_%
|
||
.endm</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; Use in user code</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>write [a,b]
|
||
write [c,d]</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>; After assembling this code, the result looks like this</tt></pre>
|
||
</div></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>write_1:
|
||
st Z+,a
|
||
dec b
|
||
brne write_1
|
||
write_2:
|
||
st Z+,c
|
||
dec d
|
||
brne write_2</tt></pre>
|
||
</div></div>
|
||
</div>
|
||
<h2 id="_warnings_and_errors">Warnings and Errors</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>Some errors and warnings may confuse you a little bit so we will try to
|
||
clear some frequently asked questions about such cases.</p></div>
|
||
<h3 id="_constant_out_of_range">Constant out of range</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>This warning occurs if a value exceeds the byte or word value of a assignment.
|
||
Read the comment posted by Jim Galbraith:</p></div>
|
||
<div class="paragraph"><p>The expression (~0x80) is a Bitwise Not operation. This
|
||
operator returns the input expression with all its bits
|
||
inverted. If 0x80 represents -128, then 0x7f, or +127
|
||
should be ok. If this is considered as a 32-bit expression
|
||
(AVRA internal representation), then it appears to be more
|
||
like oxffffffff-0x80 or 0xffffffff<sup>0x80. The result would then
|
||
be 0xffffff7f. The assembler would then have to be told or it
|
||
would have to decide, based on context, how much
|
||
significance to assign to the higher bits. I have also
|
||
encountered such conditions with various assemblers,
|
||
including AVRA. To make sure the assembler does what I
|
||
really want, I use a construct like 0xff-0x80 or 0xff</sup>0x80.
|
||
This way the bit significance cannot extend beyond bit-7 and
|
||
there cannot be any misunderstanding.</p></div>
|
||
<h3 id="_can_8217_t_use_db_directive_in_data_segment">Can’t use .DB directive in data segment</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><div class="title">DB and .DW is only used to assign constant data in eeprom or code space.</div><p>The reason why using it within data segment is forbidden is, that you
|
||
cannot set ram content at assembly time. The values must be programmed into
|
||
ROM area and at boot read from ROM into RAM. This is up to the user code.
|
||
You can only allocate memory for your variables using labels and the .byte
|
||
directive.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>.dseg
|
||
my_string: .byte 15</tt></pre>
|
||
</div></div>
|
||
<h3 id="_byte_directive">BYTE directive</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><div class="title">BYTE directive can only be used in data segment (.DSEG)</div><p>This directive cannot be used in code or eeprom region because this only
|
||
allocates memory without assgning distinct values to it. Please use .db
|
||
or .dw instead.</p></div>
|
||
<h3 id="_internal_assembler_error">Internal assembler error</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>If you get an "Internal assembler error" please contact the project maintainer
|
||
by sending him a code example and a description of your working enviroment.</p></div>
|
||
</div>
|
||
<h2 id="_avra_internals">AVRA internals</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>This section provides thoughts of the avra internal design. I have to admit
|
||
that the code of avra is anything else than clean and optimized. To increase
|
||
the code readability I will try to give you some standards that should improve
|
||
quality. The following standards are similar to what GNU proposes.</p></div>
|
||
<h3 id="_coding_standards">Coding standards</h3><div style="clear:left"></div>
|
||
<div class="paragraph"><p>Tab space is always 2 spaces. The Tab character (ascii 9) is not used.
|
||
if,while,for are always opened on the same line but closed on the next line.
|
||
The closing bracket is in the same column as the first letter of the loop
|
||
directive.</p></div>
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>Example:</tt></pre>
|
||
</div></div>
|
||
<div class="listingblock">
|
||
<div class="content">
|
||
<pre><tt> while(i > 0) {
|
||
do_something();
|
||
}</tt></pre>
|
||
</div></div>
|
||
</div>
|
||
<h2 id="_credits">Credits</h2>
|
||
<div class="sectionbody">
|
||
<div class="paragraph"><p>We would like to thank the following people for giving contributions,
|
||
patches and bug reports, as well as suggestions and new ideas.</p></div>
|
||
<div class="listingblock">
|
||
<div class="content">
|
||
<pre><tt> Jon Anders Haugum (project founder)
|
||
Burkhard Arenfeld (release 1.2.0)
|
||
Tobias Weber (old maintainer)
|
||
Jerry Jacobs (release 1.3.0)
|
||
Bernt Hembre
|
||
Nils Str<74>m
|
||
Roberto Biancardi
|
||
Qwerty Jones
|
||
Ben Hitchcock (Maker of the mac port)
|
||
Daniel Drotos
|
||
Laurence Boyd II
|
||
Varuzhan Danielyan
|
||
Laurence Turner
|
||
Eugene R. O'Bryan
|
||
Dmitry Dicky
|
||
Bob Harris (Maker of coff support)
|
||
Tobias Weber (enhanced macro support)
|
||
Lesha Bogdanow
|
||
Jim Galbraith
|
||
Mark Brinicombe
|
||
Igor Nikolayenko
|
||
Peter Hettkamp
|
||
Herb Poppe
|
||
David Burke
|
||
Alexey Pavluchenko
|
||
Alan Probandt
|
||
Mariusz Matuszek
|
||
Arne Rossius
|
||
Marti Tichacek
|
||
Patrick Parity
|
||
Johannes Overmann
|
||
Roland Riegel
|
||
Peter Katzmann
|
||
Donald D. Davis</tt></pre>
|
||
</div></div>
|
||
<div class="paragraph"><p>And all the anonymous people who submitted patches!</p></div>
|
||
<div class="paragraph"><p>Thank you for your work and support.</p></div>
|
||
</div>
|
||
<h2 id="_references">References</h2>
|
||
<div class="sectionbody">
|
||
<div class="literalblock">
|
||
<div class="content">
|
||
<pre><tt>http://www.suprafluid.com/avra
|
||
http://www.avrfreaks.de
|
||
http://www.atmel.com</tt></pre>
|
||
</div></div>
|
||
</div>
|
||
</div>
|
||
<div id="footnotes"><hr /></div>
|
||
<div id="footer">
|
||
<div id="footer-text">
|
||
Version 1.3.0<br />
|
||
Last updated 2010-06-28 16:04:26 CEST
|
||
</div>
|
||
<div id="footer-badges">
|
||
<a href="http://validator.w3.org/check?uri=referer">
|
||
<img style="border:0;width:88px;height:31px"
|
||
src="http://www.w3.org/Icons/valid-xhtml11-blue"
|
||
alt="Valid XHTML 1.1" height="31" width="88" />
|
||
</a>
|
||
<a href="http://jigsaw.w3.org/css-validator/">
|
||
<img style="border:0;width:88px;height:31px"
|
||
src="http://jigsaw.w3.org/css-validator/images/vcss-blue"
|
||
alt="Valid CSS!" />
|
||
</a>
|
||
<a href="http://www.mozilla.org/products/firefox/">
|
||
<img style="border:none; width:110px; height:32px;"
|
||
src="http://www.spreadfirefox.com/community/images/affiliates/Buttons/110x32/safer.gif"
|
||
alt="Get Firefox!" />
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</body>
|
||
</html>
|