X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=doc%2Fsdccman.lyx;h=c5c99e6c7d59a6b16856b734e1773e67432c496a;hb=bf919669224dcb6abe41c10cfdce48b87b42504b;hp=20b26c198fd4b3b3f68f0c6bc908d7025b40927c;hpb=170a47c784efa8f5a54d93a3b93943380d6b9aff;p=fw%2Fsdcc
diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx
index 20b26c19..c5c99e6c 100644
--- a/doc/sdccman.lyx
+++ b/doc/sdccman.lyx
@@ -1,5 +1,7 @@
-#LyX 1.3 created this file. For more info see http://www.lyx.org/
-\lyxformat 221
+#LyX 1.5.7 created this file. For more info see http://www.lyx.org/
+\lyxformat 276
+\begin_document
+\begin_header
\textclass book
\begin_preamble
\pdfoptionpdfminorversion=3
@@ -7,7 +9,7 @@
pdftitle={SDCC Compiler User Guide},
pdfauthor={SDCC development team},
pdfsubject={installation, user manual},
- pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
+ pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
pdfpagemode=UseOutlines,
colorlinks=true,
linkcolor=blue] {hyperref}
@@ -20,16 +22,23 @@
\end_preamble
\language english
\inputencoding default
-\fontscheme pslatex
+\font_roman times
+\font_sans helvet
+\font_typewriter courier
+\font_default_family default
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
\graphics default
\paperfontsize default
-\spacing single
+\spacing single
\papersize letterpaper
-\paperpackage a4
-\use_geometry 1
-\use_amsmath 0
-\use_natbib 0
-\use_numerical_citations 0
+\use_geometry true
+\use_amsmath 1
+\use_esint 0
+\cite_engine basic
+\use_bibtopic false
\paperorientation portrait
\leftmargin 30mm
\topmargin 20mm
@@ -40,105 +49,142 @@
\paragraph_separation indent
\defskip medskip
\quotes_language swedish
-\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle fancy
+\tracking_changes false
+\output_changes false
+\author ""
+\author ""
+\end_header
-\layout Comment
+\begin_body
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
+
+\begin_layout Standard
Please note: double dashed longoptions (e.g.
--version) are written this way: -
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
+
+\end_inset
-
-\layout Comment
+\end_layout
+\begin_layout Standard
Two resp.
- three consecutive dashes simply result in a long resp.
+ three consecutive dashes would otherwise result in a long resp.
extra long dash.
-\layout Comment
+\end_layout
+\begin_layout Standard
Architecture specific stuff (like memory models, code examples) should maybe
later go
-\layout Comment
+\end_layout
-into seperate sections/chapters/appendices (it is hard to document PIC or
+\begin_layout Standard
+into separate sections/chapters/appendices (it is hard to document PIC or
Z80 in
-\layout Comment
+\end_layout
+\begin_layout Standard
a 8051 centered document) - for now simply add.
-\layout Title
+\end_layout
+
+\end_inset
+
+\end_layout
+
+\begin_layout Title
SDCC Compiler User Guide
-\layout Date
+\end_layout
+\begin_layout Date
-\size normal
-SDCC 2.6.2
-\size footnotesize
+\size normal
+SDCC 2.9.0
+\size footnotesize
-\newline
-$Date$
-\newline
+\newline
+$Date:: $
+\newline
$Revision$
-\layout Comment
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
+\begin_layout Standard
The above strings enclosed in $ are automatically updated by Subversion
-\layout Standard
+\end_layout
+
+\end_inset
-\begin_inset LatexCommand \tableofcontents{}
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset LatexCommand tableofcontents
+
+\end_inset
-\layout Chapter
+\end_layout
+\begin_layout Chapter
Introduction
-\layout Section
+\end_layout
+\begin_layout Section
About SDCC
-\layout Standard
+\end_layout
+\begin_layout Standard
-\series bold
+\series bold
SDCC
-\series default
+\series default
(
-\emph on
+\emph on
S
-\emph default
+\emph default
mall
-\emph on
+\emph on
D
-\emph default
+\emph default
evice
-\emph on
+\emph on
C
-\emph default
+\emph default
-\emph on
+\emph on
C
-\emph default
-ompiler) is an open source, retargettable, optimizing ANSI-C compiler by
-
-\series bold
+\emph default
+ompiler) is free open source, retargettable, optimizing ANSI-C compiler
+ by
+\series bold
Sandeep Dutta
-\series default
+\series default
designed for 8 bit Microprocessors.
The current version targets Intel MCS51 based Microprocessors (8031, 8032,
8051, 8052
-\begin_inset LatexCommand \index{8031, 8032, 8051, 8052, mcs51 CPU}
+\begin_inset LatexCommand index
+name "8031, 8032, 8051, 8052, mcs51 CPU"
-\end_inset
+\end_inset
, etc.), Dallas DS80C390 variants, Freescale (formerly Motorola) HC08 and
Zilog Z80 based MCUs.
@@ -146,66 +192,75 @@ Sandeep Dutta
Atmel AVR is under development.
The entire source code for the compiler is distributed under GPL.
SDCC uses ASXXXX
-\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)}
+\begin_inset LatexCommand index
+name "asXXXX (as-gbz80, as-hc08, asx8051, as-z80)"
-\end_inset
+\end_inset
& ASLINK
-\begin_inset LatexCommand \index{aslink}
+\begin_inset LatexCommand index
+name "aslink"
-\end_inset
+\end_inset
, an open source retargetable assembler & linker.
SDCC has extensive language extensions suitable for utilizing various microcont
rollers and underlying hardware effectively.
-\newline
+\newline
-\newline
-In addition to the MCU specific optimizations SDCC also does a host of standard
- optimizations like:
-\layout Itemize
+\newline
+In addition to the MCU specific optimizations SDCC also does a host of
+ standard optimizations like:
+\end_layout
+\begin_layout Itemize
global sub expression elimination,
-\layout Itemize
+\end_layout
+\begin_layout Itemize
loop optimizations (loop invariant, strength reduction of induction variables
and loop reversing),
-\layout Itemize
+\end_layout
+\begin_layout Itemize
constant folding & propagation,
-\layout Itemize
+\end_layout
+\begin_layout Itemize
copy propagation,
-\layout Itemize
+\end_layout
+\begin_layout Itemize
dead code elimination
-\layout Itemize
+\end_layout
+\begin_layout Itemize
jump tables for
-\emph on
+\emph on
switch
-\emph default
+\emph default
statements.
-\layout Standard
+\end_layout
+\begin_layout Standard
For the back-end SDCC uses a global register allocation scheme which should
be well suited for other 8 bit MCUs.
-\newline
+\newline
-\newline
-The peep hole optimizer uses a rule based substitution mechanism which is
- MCU independent.
+\newline
+The peep hole optimizer uses a rule based substitution mechanism which
+ is MCU independent.
-\newline
+\newline
-\newline
+\newline
Supported data-types are:
-\layout Standard
-
+\end_layout
-\begin_inset Tabular
+\begin_layout Standard
+\begin_inset Tabular
@@ -217,441 +272,495 @@ Supported data-types are:
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
type
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
width
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
default
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed range
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
unsigned range
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
bool
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
1 bit
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
unsigned
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
-
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
0, 1
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
char
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
8 bits, 1 byte
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
-128, +127
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
0, +255
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
short
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
16 bits, 2 bytes
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
-32.768, +32.767
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
0, +65.535
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
int
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
16 bits, 2 bytes
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
-32.768, +32.767
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
0, +65.535
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
long
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
32 bits, 4 bytes
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
-2.147.483.648, +2.147.483.647
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
0, +4.294.967.295
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
float
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
4 bytes IEEE 754
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
signed
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+
+\end_layout
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
1.175494351E-38,
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
\color none
3.402823466E+38
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
pointer
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
1, 2, 3 or 4 bytes
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
generic
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+
+\end_layout
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+
+\end_layout
-\end_inset
+\end_inset
-\end_inset
+\end_inset
-\newline
+\newline
The compiler also allows
-\emph on
+\emph on
inline assembler code
-\emph default
+\emph default
to be embedded anywhere in a function.
In addition, routines developed in assembly can also be called.
-\newline
+\newline
-\newline
-SDCC also provides an option (-
+\newline
+SDCC also
+ provides an option (-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
+
+\end_inset
-cyclomatic) to report the relative complexity of a function.
These functions can then be further optimized, or hand coded in assembly
if needed.
-\newline
+\newline
-\newline
-SDCC also comes with a companion source level debugger SDCDB, the debugger
- currently uses ucSim a freeware simulator for 8051 and other micro-controllers.<
-\newline
+\newline
+SDCC also comes with a companion source level debugger SDCDB.
+ The debugger currently uses ucSim, a free open source simulator for 8051
+ and other micro-controllers.
+\newline
-\newline
-The latest version can be downloaded from
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
+\newline
+The latest SDCC version can be downloaded from
+
+\begin_inset LatexCommand url
+target "http://sdcc.sourceforge.net/snap.php"
-\end_inset
+\end_inset
.
-
-\series bold
-\series default
-\emph on
+\emph on
Please note: the compiler will probably always be some steps ahead of this
documentation
-\series bold
-\emph default
+\series bold
+\emph default
-\begin_inset LatexCommand \index{Status of documentation}
+\begin_inset LatexCommand index
+name "Status of documentation"
-\end_inset
+\end_inset
\begin_inset Foot
-collapsed false
-
-\layout Standard
+status open
+\begin_layout Standard
Obviously this has pros and cons
-\end_inset
+\end_layout
+
+\end_inset
.
-\layout Section
+\end_layout
+\begin_layout Section
Open Source
-\layout Standard
+\end_layout
+\begin_layout Standard
All packages used in this compiler system are
-\emph on
+\emph on
open source
-\emph default
+\emph default
and
-\emph on
+\emph on
freeware
-\emph default
+\emph default
; source code for all the sub-packages (pre-processor, assemblers, linkers
- etc) is distributed with the package.
- This documentation is maintained using a freeware word processor (LyX).
-\newline
-This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License
-\begin_inset LatexCommand \index{GNU General Public License, GPL}
+ etc.) is distributed with the package.
+ This documentation is maintained using a free open source word processor
+ (LyX).
+\newline
+This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License
+\begin_inset LatexCommand index
+name "GNU General Public License, GPL"
-\end_inset
+\end_inset
as published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty
-\begin_inset LatexCommand \index{warranty}
+\begin_inset LatexCommand index
+name "warranty"
-\end_inset
+\end_inset
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
@@ -662,1810 +771,1560 @@ This program is free software; you can redistribute it and/or modify it
You are forbidden to forbid anyone else to use, share and improve what
you give them.
Help stamp out software-hoarding!
-\layout Section
+\end_layout
+\begin_layout Section
Typographic conventions
-\begin_inset LatexCommand \index{Typographic conventions}
+\begin_inset LatexCommand index
+name "Typographic conventions"
-\end_inset
+\end_inset
-\layout Standard
+\end_layout
+\begin_layout Standard
Throughout this manual, we will use the following convention.
Commands you have to type in are printed in
-\family sans
-\series bold
+\family sans
+\series bold
"sans serif"
-\series default
+\series default
.
-\family default
+\family default
Code samples are printed in
-\family typewriter
+\family typewriter
typewriter font.
-\family default
+\family default
Interesting items and new terms are printed in
-\emph on
+\emph on
italic.
-\layout Section
+\end_layout
+\begin_layout Section
Compatibility
-\begin_inset LatexCommand \label{sec:Compatibility-with-previous}
+\begin_inset LatexCommand label
+name "sec:Compatibility-with-previous"
-\end_inset
+\end_inset
with previous versions
-\begin_inset LatexCommand \index{Compatibility with previous versions}
+\begin_inset LatexCommand index
+name "Compatibility with previous versions"
-\end_inset
+\end_inset
-\layout Standard
+\end_layout
-This version has numerous bug fixes compared with the previous version.
- But we also introduced some incompatibilities with older versions.
+\begin_layout Standard
+Newer versions have usually numerous bug fixes compared with the previous
+ version.
+ But we also sometimes introduce some incompatibilities with older versions.
Not just for the fun of it, but to make the compiler more stable, efficient
and ANSI compliant
-\begin_inset LatexCommand \index{ANSI-compliance}
+\begin_inset LatexCommand index
+name "ANSI-compliance"
-\end_inset
+\end_inset
(see section
-\begin_inset LatexCommand \ref{sub:ANSI-Compliance}
+\begin_inset LatexCommand ref
+reference "sub:ANSI-Compliance"
-\end_inset
+\end_inset
for ANSI-Compliance).
-\newline
+\begin_inset Note Note
+status collapsed
-\layout Itemize
+\begin_layout Standard
+It would be fine to add to each item, in which version was it changed.
+\end_layout
-short is now equivalent to int (16 bits), it used to be equivalent to char
- (8 bits) which is not ANSI compliant.
-\layout Itemize
+\end_inset
-the default directory for gcc-builds where include, library and documentation
- files are stored is now in /usr/local/share.
-\layout Itemize
-char type parameters to vararg
-\begin_inset LatexCommand \index{vararg, va\_arg}
+\newline
-\end_inset
+\end_layout
- functions are casted to int unless explicitly casted
-\begin_inset Marginal
-collapsed true
+\begin_layout Itemize
+short is now equivalent to int (16 bits), it used to be equivalent to char
+ (8 bits) which is not ANSI compliant.
+ To maintain compatibility, old programs may be compiled using the -
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-\series bold
-\SpecialChar ~
-!
-\end_inset
+\backslash
+/
+\end_layout
-, e.g.:
-\newline
+\end_inset
-\family typewriter
-\SpecialChar ~
-\SpecialChar ~
-char a=3;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-printf ("%d %c
-\backslash
-n", a, (char)a);
-\family default
+-short-is-8bits commandline option (see
+\begin_inset LatexCommand vref
+reference "lyx:--short-is-8bits"
-\newline
- will push a as an int and as a char resp.
-\layout Itemize
+\end_inset
-option -
-\begin_inset ERT
-status Collapsed
+).
+\end_layout
-\layout Standard
+\begin_layout Itemize
+the default directory for gcc-builds where include, library and documentation
+ files are stored is now in /usr/local/share.
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Itemize
+char type parameters to vararg
+\begin_inset LatexCommand index
+name "vararg, va\\_arg"
--regextend has been removed.
-\layout Itemize
+\end_inset
-option -
+ functions are casted to int unless explicitly casted and
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--noregparms has been removed.
-\layout Itemize
+\end_inset
-option -
-\begin_inset ERT
-status Collapsed
+-std-c89
+\begin_inset LatexCommand index
+name "-\\/-std-c89"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--stack-after-data has been removed.
-\layout Itemize
+\series default
+ and
+\series bold
+-
+\begin_inset ERT
+status collapsed
-bit
-\begin_inset LatexCommand \index{bit}
+\begin_layout Standard
-\end_inset
- and sbit
-\begin_inset LatexCommand \index{sbit}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-std-c99
+\begin_inset LatexCommand index
+name "-\\/-std-c99"
-\begin_inset LatexCommand \index{\_\_sbit}
+\end_inset
-\end_inset
- types now consistently behave like the C99 _Bool type with respect to type
- conversion
-\begin_inset LatexCommand \index{type conversion}
+\series default
+ command line option are not defined
+\begin_inset Marginal
+status collapsed
-\end_inset
+\begin_layout Standard
+\series bold
+\InsetSpace ~
+!
+\end_layout
-\begin_inset LatexCommand \index{type promotion}
+\end_inset
-\end_inset
+, e.g.:
+\newline
-.
- The most common incompatibility resulting from this change is related to
- bit toggling
-\begin_inset LatexCommand \index{Bit toggling}
-
-\end_inset
-
- idioms, e.g.:
-\newline
-
-\family typewriter
-\SpecialChar ~
-\SpecialChar ~
-bit b;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-b = ~
-\begin_inset LatexCommand \index{\~\/ Operator}
+\family typewriter
+\InsetSpace ~
+\InsetSpace ~
+char a=3;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+printf ("%d %c
+\backslash
+n", a, (char)a);
+\family default
-\end_inset
+\newline
+ will push a as an int and as a char resp if
+\series bold
+-
+\begin_inset ERT
+status collapsed
-b; /* equivalent to b=1 instead of toggling b */
-\begin_inset Marginal
-collapsed true
+\begin_layout Standard
-\layout Standard
+\backslash
+/
+\end_layout
-\series bold
-\SpecialChar ~
-!
-\end_inset
+\end_inset
+-std-c89
+\begin_inset LatexCommand index
+name "-\\/-std-c89"
-\newline
-\SpecialChar ~
-\SpecialChar ~
-b = !b; /* toggles b */
-\newline
+\end_inset
-\family default
-In previous versions, both forms would have toggled the bit.
-\layout Standard
+\series default
+ and
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\emph on
-
-\layout Section
+\begin_layout Standard
-System Requirements
-\layout Standard
-What do you need before you start installation of SDCC? A computer, and
- a desire to compute.
- The preferred method of installation is to compile SDCC from source using
- GNU gcc and make.
- For Windows some pre-compiled binary distributions are available for your
- convenience.
- You should have some experience with command line tools and compiler use.
-\layout Section
+\backslash
+/
+\end_layout
-Other Resources
-\layout Standard
+\end_inset
-The SDCC home page at
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/}
+-std-c99
+\begin_inset LatexCommand index
+name "-\\/-std-c99"
-\end_inset
+\end_inset
- is a great place to find distribution sets.
- You can also find links to the user mailing lists that offer help or discuss
- SDCC with other SDCC users.
- Web links to other SDCC related sites can also be found here.
- This document can be found in the DOC directory of the source package as
- a text or HTML file.
- A pdf version of this document is available at
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf}
-\end_inset
+\series default
+ command line options are not defined,
+\newline
+ will push a as two ints if
+\series bold
+-
+\begin_inset ERT
+status collapsed
-.
- Some of the other tools (simulator and assembler) included with SDCC contain
- their own documentation and can be found in the source distribution.
- If you want the latest unreleased software, the complete source package
- is available directly from Subversion on https://svn.sourceforge.net/svnroot/sdcc
-/trunk/sdcc.
-\layout Section
+\begin_layout Standard
-Wishes for the future
-\layout Standard
-There are (and always will be) some things that could be done.
- Here are some I can think of:
-\newline
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
+-std-c89
+\begin_inset LatexCommand index
+name "-\\/-std-c89"
-\family typewriter
-char KernelFunction3(char p) at 0x340;
-\newline
+\end_inset
-\layout Standard
+\series default
+ or
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-better code banking
-\begin_inset LatexCommand \index{code banking (limited support)}
+\begin_layout Standard
-\end_inset
- support for mcs51
-\newline
+\backslash
+/
+\end_layout
-\newline
+\end_inset
-\family default
-If you can think of some more, please see the section
-\begin_inset LatexCommand \ref{sub:Requesting-Features}
+-std-c99
+\begin_inset LatexCommand index
+name "-\\/-std-c99"
-\end_inset
+\end_inset
- about filing feature requests
-\begin_inset LatexCommand \index{Requesting features}
-\end_inset
+\series default
+ command line option is defined.
+\end_layout
+\begin_layout Itemize
+option -
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{Feature request}
+\begin_layout Standard
-\end_inset
-.
-\newline
+\backslash
+/
+\end_layout
-\layout Chapter
+\end_inset
-Installing SDCC
-\begin_inset LatexCommand \index{Installation}
+-regextend has been removed.
+\end_layout
-\end_inset
+\begin_layout Itemize
+option -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\layout Standard
-For most users it is sufficient to skip to either section
-\begin_inset LatexCommand \ref{sub:Building-SDCC-on-Linux}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- (Unix) or section
-\begin_inset LatexCommand \ref{sub:Windows-Install}
+-noregparms has been removed.
+\end_layout
-\end_inset
+\begin_layout Itemize
+option -
+\begin_inset ERT
+status collapsed
- (Windows).
- More detailed instructions follow below.
-\layout Section
+\begin_layout Standard
-Configure Options
-\begin_inset LatexCommand \index{Options SDCC configuration}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\layout Standard
+-stack-after-data has been removed.
+\end_layout
-The install paths, search paths and other options are defined when running
- 'configure'.
- The defaults can be overridden by:
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Itemize
+bit
+\begin_inset LatexCommand index
+name "bit"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ and sbit
+\begin_inset LatexCommand index
+name "sbit"
-\backslash
-/
-\end_inset
+\end_inset
--prefix see table below
-\layout List
-\labelwidthstring 00.00.0000
--
-\begin_inset ERT
-status Collapsed
+\begin_inset LatexCommand index
+name "\\_\\_sbit"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+ types now consistently behave like the C99 _Bool type with respect to type
+ conversion
+\begin_inset LatexCommand index
+name "type conversion"
--exec_prefix see table below
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\begin_inset LatexCommand index
+name "type promotion"
-\backslash
-/
-\end_inset
+\end_inset
--bindir see table below
-\layout List
-\labelwidthstring 00.00.0000
+.
+ The most common incompatibility resulting from this change is related to
+ bit toggling
+\begin_inset LatexCommand index
+name "Bit toggling"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ idioms, e.g.:
+\newline
-\backslash
-/
-\end_inset
+\family typewriter
+\InsetSpace ~
+\InsetSpace ~
+bit b;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+b = ~
+\begin_inset LatexCommand index
+name "\\~\\/ Operator"
--datadir see table below
-\newline
+\end_inset
-\layout List
-\labelwidthstring 00.00.0000
+b; /* equivalent to b=1 instead of toggling b */
+\begin_inset Marginal
+status collapsed
-\SpecialChar ~
-\SpecialChar ~
-docdir environment variable, see table below
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
-\SpecialChar ~
-\SpecialChar ~
-include_dir_suffix environment variable, see table below
-\layout List
-\labelwidthstring 00.00.0000
+\series bold
+\InsetSpace ~
+!
+\end_layout
-\SpecialChar ~
-\SpecialChar ~
-lib_dir_suffix environment variable, see table below
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-\SpecialChar ~
-\SpecialChar ~
-sdccconf_h_dir_separator environment variable, either / or
-\backslash
-\backslash
- makes sense here.
- This character will only be used in sdccconf.h; don't forget it's a C-header,
- therefore a double-backslash is needed there.
-\newline
+\newline
+\InsetSpace ~
+\InsetSpace ~
+b = !b; /* toggles b */
+\newline
-\layout List
-\labelwidthstring 00.00.0000
+\family default
+In previous versions, both forms would have toggled the bit.
+\end_layout
+\begin_layout Itemize
+in older versions, the preprocessor was always called with
+\series bold
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
+status collapsed
-\backslash
-/
-\end_inset
-
--disable-mcs51-port Excludes the Intel mcs51 port
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
-
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--disable-gbz80-port Excludes the Gameboy gbz80 port
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+-std-c99
+\begin_inset LatexCommand index
+name "-\\/-std-c99"
-\backslash
-/
-\end_inset
+\end_inset
--disable-z80-port Excludes the z80 port
-\layout List
-\labelwidthstring 00.00.0000
+\series default
+ regardless of the
+\series bold
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+status collapsed
--disable-avr-port Excludes the AVR port
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--disable-ds390-port Excludes the DS390 port
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+-std-xxx
+\series default
+ setting.
+ This is no longer true, and can cause compilation failures on code built
+ with
+\series bold
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--disable-hc08-port Excludes the HC08 port
-\layout List
-\labelwidthstring 00.00.0000
+status collapsed
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
-
--disable-pic-port Excludes the PIC port
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+-std-c89
+\begin_inset LatexCommand index
+name "-\\/-std-c89"
--disable-xa51-port Excludes the XA51 port
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\series default
+ but using c99 preprocessor features, such as one-line (//) comments
+\end_layout
+
+\begin_layout Itemize
+in versions older then 2.8.4 the pic16 *printf() and printf_tiny() library
+ functions supported undocumented and not standard compliant 'b' binary
+ format specifier ("%b", "%hb" and "%lb").
+ The 'b' specifier is now disabled by default.
+ It can be enabled by defining BINARY_SPECIFIER macro in files device/lib/pic16/
+libc/stdio/vfprintf.c and device/lib/pic16/libc/stdio/printf_tiny.c and recompilin
+g the library.
+\end_layout
+
+\begin_layout Itemize
+in versions older then 2.8.5 the unnamed bitfield structure members participated
+ in initialization, which is not conforming with ISO/IEC 9899:1999 standard
+ (see section Section 6.7.8 Initialization, clause 9)
+\newline
-\backslash
-/
-\end_inset
+\newline
+Old behavior, before
+ version 2.8.5:
+\family typewriter
--disable-ucsim Disables configuring and building of ucsim
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+\newline
+\InsetSpace ~
+\InsetSpace ~
+struct {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+int a : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+char\InsetSpace ~
+ : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+int b : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+} s = {1, 2, 3};
+\family default
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\family typewriter
+/* s.a = 1, s.b = 3 */
+\family default
--disable-device-lib Disables automatically building device libraries
-\layout List
-\labelwidthstring 00.00.0000
+\newline
--
-\begin_inset ERT
-status Collapsed
+\newline
+New behavior:
+\family typewriter
-\layout Standard
+\newline
+\InsetSpace ~
+\InsetSpace ~
+struct {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+int a : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+char\InsetSpace ~
+ : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+int b : 2;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+} s = {1, 2};
+\family default
-\backslash
-/
-\end_inset
+\newline
--disable-packihx Disables building packihx
-\newline
+\family typewriter
+/* s.a = 1, s.b = 2 */
+\end_layout
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Section
+System Requirements
+\end_layout
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+What do you need before you start installation of SDCC? A computer, and
+ a desire to compute.
+ The preferred method of installation is to compile SDCC from source using
+ GNU gcc and make.
+ For Windows some pre-compiled binary distributions are available for your
+ convenience.
+ You should have some experience with command line tools and compiler use.
+\end_layout
-\layout Standard
+\begin_layout Section
+Other Resources
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+The SDCC home page at
+\begin_inset LatexCommand url
+target "http://sdcc.sourceforge.net/"
--enable-doc Build pdf, html and txt files from the lyx sources
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
+ is a great place to find distribution sets.
+ You can also find links to the user mailing lists that offer help or discuss
+ SDCC with other SDCC users.
+ Web links to other SDCC related sites can also be found here.
+ This document can be found in the DOC directory of the source package as
+ a text or HTML file.
+ A pdf version of this document is available at
+\begin_inset LatexCommand url
+target "http://sdcc.sourceforge.net/doc/sdccman.pdf"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+.
+ Some of the other tools (simulator and assembler) included with SDCC contain
+ their own documentation and can be found in the source distribution.
+ If you want the latest unreleased software, the complete source package
+ is available directly from Subversion on https://sdcc.svn.sourceforge.net/svnroot/
+sdcc/trunk/sdcc.
+\end_layout
--enable-libgc Use the Bohem memory allocator.
- Lower runtime footprint.
-\layout Standard
+\begin_layout Section
+Wishes for the future
+\end_layout
-Furthermore the environment variables CC, CFLAGS, ...
- the tools and their arguments can be influenced.
- Please see `configure -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+There are (and always will be) some things that could be done.
+ Here are some I can think of:
+\newline
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--help` and the man/info pages of `configure` for details.
-\newline
+\family typewriter
+char KernelFunction3(char p) at 0x340;
+\newline
-\newline
-The names of the standard libraries STD_LIB, STD_INT_LIB, STD_LONG_LIB,
- STD_FP_LIB, STD_DS390_LIB, STD_XA51_LIB and the environment variables SDCC_DIR_
-NAME, SDCC_INCLUDE_NAME, SDCC_LIB_NAME are defined by `configure` too.
- At the moment it's not possible to change the default settings (it was
- simply never required).
-\newline
+\end_layout
-\newline
-These configure options are compiled into the binaries, and can only be
- changed by rerunning 'configure' and recompiling SDCC.
- The configure options are written in
-\emph on
-italics
-\emph default
- to distinguish them from run time environment variables (see section search
- paths).
-\newline
+\begin_layout Standard
-\newline
-The settings for
-\begin_inset Quotes sld
-\end_inset
+\family typewriter
+better code banking
+\begin_inset LatexCommand index
+name "code banking (limited support)"
-Win32 builds
-\begin_inset Quotes srd
-\end_inset
+\end_inset
- are used by the SDCC team to build the official Win32 binaries.
- The SDCC team uses Mingw32 to build the official Windows binaries, because
- it's
-\layout Enumerate
+ support for mcs51
+\newline
-open source,
-\layout Enumerate
+\newline
-a gcc compiler and last but not least
-\layout Enumerate
+\family default
+If you can think of some more, please see the section
+\begin_inset LatexCommand ref
+reference "sub:Requesting-Features"
-the binaries can be built by cross compiling on Sourceforge's compile farm.
-\layout Standard
+\end_inset
-See the examples, how to pass the Win32 settings to 'configure'.
- The other Win32 builds using Borland, VC or whatever don't use 'configure',
- but a header file sdcc_vc_in.h is the same as sdccconf.h built by 'configure'
- for Win32.
-\newline
+ about filing feature requests
+\begin_inset LatexCommand index
+name "Requesting features"
-\newline
-These defaults are:
-\newline
+\end_inset
-\layout Standard
-\align center
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "Feature request"
-\layout Standard
+\end_inset
-Variable
-\end_inset
-
-
-\begin_inset Text
+.
+\newline
-\layout Standard
+\end_layout
-default
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Chapter
+Installing SDCC
+\begin_inset LatexCommand index
+name "Installation"
-\layout Standard
+\end_inset
-Win32 builds
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
+\begin_layout Standard
+For most users it is sufficient to skip to either section
+\begin_inset LatexCommand ref
+reference "sub:Building-SDCC-on-Linux"
-\emph on
-PREFIX
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ (Unix) or section
+\begin_inset LatexCommand ref
+reference "sub:Windows-Install"
-/usr/local
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ (Windows).
+ More detailed instructions follow below.
+\end_layout
+\begin_layout Section
+Configure Options
+\begin_inset LatexCommand index
+name "Options SDCC configuration"
-\backslash
-sdcc
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+\end_layout
-\emph on
-EXEC_PREFIX
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+The install paths, search paths and other options are defined when running
+ 'configure'.
+ The defaults can be overridden by:
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-$PREFIX
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\emph on
-$PREFIX
-\end_inset
-
-
-
-
-\begin_inset Text
+-prefix see table below
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-BINDIR
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\emph on
-$EXECPREFIX
-\emph default
-/bin
-\end_inset
-
-
-\begin_inset Text
+-exec_prefix see table below
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-$EXECPREFIX
-\emph default
-\backslash
-bin
-\end_inset
-
-
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
+-bindir see table below
+\end_layout
-\emph on
-DATADIR
-\end_inset
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-\emph on
-$PREFIX
-\emph default
-/share
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
+-datadir see table below
+\end_layout
-\emph on
-$PREFIX
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-\emph on
-DOCDIR
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
+-datarootdir see table below
+\newline
-\emph on
-$DATADIR
-\emph default
-/sdcc/doc
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+\InsetSpace ~
+\InsetSpace ~
+docdir environment variable, see table below
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
+\InsetSpace ~
+\InsetSpace ~
+include_dir_suffix environment variable, see table below
+\end_layout
-\emph on
-$DATADIR
-\emph default
+\begin_layout List
+\labelwidthstring 00.00.0000
+\InsetSpace ~
+\InsetSpace ~
+lib_dir_suffix environment variable, see table below
+\end_layout
-\backslash
-doc
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+\InsetSpace ~
+\InsetSpace ~
+sdccconf_h_dir_separator environment variable, either / or
+\backslash
-\layout Standard
+\backslash
+ makes sense here.
+ This character will only be used in sdccconf.h; don't forget it's a C-header,
+ therefore a double-backslash is needed there.
+\newline
+\end_layout
-\emph on
-INCLUDE_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-sdcc/include
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-include
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-mcs51-port Excludes the Intel mcs51 port
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\emph on
-LIB_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-sdcc/lib
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-lib
-\end_inset
-
-
-
+-disable-gbz80-port Excludes the Gameboy gbz80 port
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\newline
-\layout Standard
-\noindent
-'configure' also computes relative paths.
- This is needed for full relocatability of a binary package and to complete
- search paths (see section search paths below):
-\newline
-
-\layout Standard
-\align center
+\backslash
+/
+\end_layout
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-z80-port Excludes the z80 port
+\end_layout
-Variable (computed)
-\end_inset
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-default
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-Win32 builds
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-avr-port Excludes the AVR port
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\emph on
-BIN2DATA_DIR
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-../share
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-..
-\end_inset
-
-
-
-
-\begin_inset Text
+-disable-ds390-port Excludes the DS390 port
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-PREFIX2BIN_DIR
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-bin
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-hc08-port Excludes the HC08 port
+\end_layout
-bin
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-\emph on
-PREFIX2DATA_DIR
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-share/sdcc
-\end_inset
-
-
-\begin_inset Text
+-disable-pic-port Excludes the PIC14 port
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-\end_inset
-
-
-
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\newline
+\end_inset
-\layout Standard
-\noindent
-Examples:
-\layout LyX-Code
+-disable-pic16-port Excludes the PIC16 port
+\end_layout
-./configure
-\newline
-./configure -
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--prefix=
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-/usr/bin
-\begin_inset Quotes srd
-\end_inset
+-disable-xa51-port Excludes the XA51 port
+\end_layout
- -
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--datadir=
-\begin_inset Quotes srd
-\end_inset
+\backslash
+/
+\end_layout
-/usr/share
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+-disable-ucsim Disables configuring and building of ucsim
+\end_layout
-\newline
-./configure -
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--disable-avr-port -
+\end_inset
+
+-disable-device-lib Disables automatically building device libraries
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--disable-xa51-port
-\layout Standard
+\end_inset
-To cross compile on linux for Mingw32 (see also 'sdcc/support/scripts/sdcc_mingw
-32'):
-\layout LyX-Code
+-disable-packihx Disables building packihx
+\newline
-./configure
-\backslash
+\end_layout
-\newline
-CC=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-i586-mingw32msvc-gcc
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
- CXX=
-\begin_inset Quotes srd
-\end_inset
-i586-mingw32msvc-g++
-\begin_inset Quotes srd
-\end_inset
+\backslash
+/
+\end_layout
-
-\backslash
-
-\newline
-RANLIB=
-\begin_inset Quotes srd
-\end_inset
-
-i586-mingw32msvc-ranlib
-\begin_inset Quotes srd
-\end_inset
-
-
-\backslash
-
-\newline
-STRIP=
-\begin_inset Quotes srd
-\end_inset
-
-i586-mingw32msvc-strip
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-
-\backslash
+-enable-doc Build pdf, html and txt files from the lyx sources
+\end_layout
-\newline
+\begin_layout List
+\labelwidthstring 00.00.0000
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--prefix=
-\begin_inset Quotes srd
-\end_inset
+\backslash
+/
+\end_layout
-/sdcc
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-
-\backslash
+-enable-libgc Use the Bohem memory allocator.
+ Lower runtime footprint.
+\end_layout
-\newline
+\begin_layout List
+\labelwidthstring 00.00.0000
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--datadir=
-\begin_inset Quotes srd
-\end_inset
+\backslash
+/
+\end_layout
-/sdcc
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-
-\backslash
+-without-ccache Do not use ccache even if available
+\end_layout
-\newline
-docdir=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
+Furthermore the environment variables CC, CFLAGS, ...
+ the tools and their arguments can be influenced.
+ Please see `configure -
+\begin_inset ERT
+status collapsed
-/sdcc/doc
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-
-\backslash
-\newline
-include_dir_suffix=
-\begin_inset Quotes srd
-\end_inset
+\backslash
+/
+\end_layout
-include
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-
-\backslash
+-help' and the man/info pages of `configure' for details.
+\newline
-\newline
-lib_dir_suffix=
-\begin_inset Quotes srd
-\end_inset
+\newline
+The names of the
+ standard libraries STD_LIB, STD_INT_LIB, STD_LONG_LIB, STD_FP_LIB, STD_DS390_LI
+B, STD_XA51_LIB and the environment variables SDCC_DIR_NAME, SDCC_INCLUDE_NAME,
+ SDCC_LIB_NAME are defined by `configure' too.
+ At the moment it's not possible to change the default settings (it was
+ simply never required).
+\newline
-lib
-\begin_inset Quotes srd
-\end_inset
+\newline
+These configure options are compiled into the binaries,
+ and can only be changed by rerunning 'configure' and recompiling SDCC.
+ The configure options are written in
+\emph on
+italics
+\emph default
+ to distinguish them from run time environment variables (see section search
+ paths).
+\newline
-
-\backslash
+\newline
+The settings for
+\begin_inset Quotes sld
+\end_inset
-\newline
-sdccconf_h_dir_separator=
+Win32 builds
\begin_inset Quotes srd
-\end_inset
-
+\end_inset
-\backslash
+ are used by the SDCC team to build the official Win32 binaries.
+ The SDCC team uses Mingw32 to build the official Windows binaries, because
+ it's
+\end_layout
-\backslash
+\begin_layout Enumerate
+open source,
+\end_layout
-\backslash
+\begin_layout Enumerate
+a gcc compiler and last but not least
+\end_layout
-\backslash
+\begin_layout Enumerate
+the binaries can be built by cross compiling on SDCC Distributed Compile
+ Farm.
+\end_layout
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
+See the examples, how to pass the Win32 settings to 'configure'.
+ The other Win32 builds using Borland, VC or whatever don't use 'configure',
+ but a header file sdcc_vc_in.h is the same as sdccconf.h built by 'configure'
+ for Win32.
+\newline
-
-\backslash
+\newline
+These defaults are:
+\newline
-\newline
--
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Variable
+\end_layout
--disable-device-lib
-\backslash
+\end_inset
+
+
+\begin_inset Text
-\newline
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+default
+\end_layout
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Win32 builds
+\end_layout
--host=i586-mingw32msvc
-\backslash
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\emph on
+PREFIX
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
+
+
+\begin_inset Text
--build=unknown-unknown-linux-gnu
-\layout Standard
+\begin_layout Standard
+/usr/local
+\end_layout
-To
-\begin_inset Quotes sld
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-cross
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-compile on Cygwin for Mingw32 (see also sdcc/support/scripts/sdcc_cygwin_mingw32
-):
-\layout LyX-Code
+\backslash
+sdcc
+\end_layout
-./configure -C
-\backslash
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\emph on
+EXEC_PREFIX
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
+
+
+\begin_inset Text
--prefix=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-/sdcc
-\begin_inset Quotes srd
-\end_inset
+\emph on
+$PREFIX
+\end_layout
-
-\backslash
+\end_inset
+
+
+\begin_inset Text
-\newline
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\emph on
+$PREFIX
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
--datadir=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-/sdcc
-\begin_inset Quotes srd
-\end_inset
+\emph on
+BINDIR
+\end_layout
-
-\backslash
+\end_inset
+
+
+\begin_inset Text
-\newline
-docdir=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-/sdcc/doc
-\begin_inset Quotes srd
-\end_inset
+\emph on
+$EXEC_PREFIX
+\emph default
+/bin
+\end_layout
-
-\backslash
-
-\newline
-include_dir_suffix=
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-include
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-
-\backslash
+\emph on
+$EXEC_PREFIX
+\emph default
-\newline
-lib_dir_suffix=
-\begin_inset Quotes srd
-\end_inset
+\backslash
+bin
+\end_layout
-lib
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
-
-\backslash
+\begin_layout Standard
-\newline
-sdccconf_h_dir_separator=
-\begin_inset Quotes srd
-\end_inset
+\emph on
+DATADIR
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\backslash
+\begin_layout Standard
-\backslash
+\emph on
+$DATAROOTDIR
+\end_layout
-\backslash
+\end_inset
+
+
+\begin_inset Text
-\backslash
+\begin_layout Standard
-\begin_inset Quotes srd
-\end_inset
+\emph on
+$DATAROOTDIR
+\end_layout
-
-\backslash
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
-CC=
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-gcc -mno-cygwin
-\begin_inset Quotes srd
-\end_inset
+\emph on
+DATAROOTDIR
+\end_layout
-
-\backslash
-
-\newline
-CXX=
-\begin_inset Quotes srd
-\end_inset
-
-g++ -mno-cygwin
-\begin_inset Quotes srd
-\end_inset
-
-
-\layout Standard
-
-'configure' is quite slow on Cygwin (at least on windows before Win2000/XP).
- The option '-
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--C' turns on caching, which gives a little bit extra speed.
- However if options are changed, it can be necessary to delete the config.cache
- file.
-\layout Section
-
-Install paths
-\begin_inset LatexCommand \label{sub:Install-paths}
-
-\end_inset
-
-
-\begin_inset LatexCommand \index{Install paths}
-
-\end_inset
-
-
-\layout Standard
-\added_space_top medskip \align center
-
-\begin_inset Tabular
-
-
-
-
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-
-\series bold
-Description
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-
-\series bold
-Path
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\emph on
+$PREFIX
+\emph default
+/share
+\end_layout
-\series bold
-Default
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\emph on
+$PREFIX
+\end_layout
-\series bold
-Win32 builds
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-Binary files*
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-
-\emph on
-$EXEC_PREFIX
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-/usr/local/bin
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-
-\backslash
-sdcc
-\backslash
-bin
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\emph on
+DOCDIR
+\end_layout
-Include files
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-
-\emph on
-$DATADIR/ $INCLUDE_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\emph on
+$DATAROOTDIR
+\emph default
+/sdcc/doc
+\end_layout
-/usr/local/share/sdcc/include
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\emph on
+$DATAROOTDIR
+\emph default
-\backslash
-sdcc
-\backslash
-include
-\end_inset
+\backslash
+doc
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
-Library file**
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+\emph on
+INCLUDE_DIR_SUFFIX
+\end_layout
-\emph on
-$DATADIR/$LIB_DIR_SUFFIX
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+sdcc/include
+\end_layout
-/usr/local/share/sdcc/lib
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
+include
+\end_layout
-\backslash
-sdcc
-\backslash
-lib
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-Documentation
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+\emph on
+LIB_DIR_SUFFIX
+\end_layout
-\emph on
-$DOCDIR
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+sdcc/lib
+\end_layout
-/usr/local/share/sdcc/doc
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
+lib
+\end_layout
-\backslash
-sdcc
-\backslash
-doc
-\end_inset
+\end_inset
-\end_inset
-
-
-\layout Verse
-
-
-\size footnotesize
-*compiler, preprocessor, assembler, and linker
-\newline
-**the
-\shape italic
-model
-\shape default
- is auto-appended by the compiler, e.g.
- small, large, z80, ds390 etc
-\layout Standard
-\noindent
-The install paths can still be changed during `make install` with e.g.:
-\layout LyX-Code
-
-make install prefix=$(HOME)/local/sdcc
-\layout Standard
-
-Of course this doesn't change the search paths compiled into the binaries.
-\newline
-
-\newline
-Moreover the install path can be changed by defining DESTDIR
-\begin_inset LatexCommand \index{DESTDIR}
-
-\end_inset
-
-:
-\layout LyX-Code
-
-make install DESTDIR=$(HOME)/sdcc.rpm/
-\layout Standard
-
-Please note that DESTDIR must have a trailing slash!
-\layout Section
-
-Search Paths
-\begin_inset LatexCommand \label{sub:Search-Paths}
-
-\end_inset
-
-
-\begin_inset LatexCommand \index{Search path}
+\end_inset
-\end_inset
+\newline
-\layout Standard
+\end_layout
-Some search paths or parts of them are determined by configure variables
- (in
-\emph on
-italics
-\emph default
-, see section above).
- Further search paths are determined by environment variables during runtime.
+\begin_layout Standard
+\noindent
+'configure' also computes relative paths.
+ This is needed for full relocatability of a binary package and to complete
+ search paths (see section search paths below):
+\newline
-\newline
-The paths searched when running the compiler are as follows (the first catch
- wins):
-\newline
-
-\newline
-1.
- Binary files (preprocessor, assembler and linker)
-\newline
+\end_layout
-\layout Standard
-\align center
-
-\begin_inset Tabular
+\begin_layout Standard
+\align center
+\begin_inset Tabular
@@ -2475,21443 +2334,30003 @@ The paths searched when running the compiler are as follows (the first catch
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+Variable (computed)
+\end_layout
-Search path
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
default
-\end_inset
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
Win32 builds
-\end_inset
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-$SDCC_HOME/
-\emph on
-$PPREFIX2BIN_DIR
-\end_inset
+\emph on
+BIN2DATA_DIR
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+../share
+\end_layout
-$SDCC_HOME/bin
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+..
+\end_layout
-$SDCC_HOME
-\backslash
-bin
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-Path of argv[0] (if available)
-\end_inset
+\emph on
+PREFIX2BIN_DIR
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+bin
+\end_layout
-Path of argv[0]
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+bin
+\end_layout
-Path of argv[0]
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-$PATH
-\end_inset
+\emph on
+PREFIX2DATA_DIR
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+share/sdcc
+\end_layout
-$PATH
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-$PATH
-\end_inset
+\end_layout
+
+\end_inset
-\end_inset
+\end_inset
-
-\newline
-\layout Standard
-\noindent
-2.
- Include files
-\newline
+\newline
-\layout Standard
-\align center
+\end_layout
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
+\noindent
+Examples:
+\end_layout
-\layout Standard
+\begin_layout LyX-Code
+./configure
+\newline
+./configure -
+\begin_inset ERT
+status collapsed
-Search path
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-default
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-Win32 builds
-\end_inset
-
-
-
-
-\begin_inset Text
+-prefix=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+/usr/bin
+\begin_inset Quotes srd
+\end_inset
--
+ -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--I dir
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-datarootdir=
+\begin_inset Quotes srd
+\end_inset
--
+/usr/share
+\begin_inset Quotes srd
+\end_inset
+
+
+\newline
+./configure -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--I dir
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
--
+-disable-avr-port -
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--I dir
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-xa51-port
+\end_layout
-$SDCC_INCLUDE
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+To cross compile on linux for Mingw32 (see also 'sdcc/support/scripts/sdcc_mingw
+32'):
+\end_layout
-\layout Standard
+\begin_layout LyX-Code
+./configure
+\backslash
-$SDCC_INCLUDE
-\end_inset
-
-
-\begin_inset Text
+\newline
+CC=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+i586-mingw32msvc-gcc
+\begin_inset Quotes srd
+\end_inset
-$SDCC_INCLUDE
-\end_inset
-
-
-
-
-\begin_inset Text
+ CXX=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+i586-mingw32msvc-g++
+\begin_inset Quotes srd
+\end_inset
-$SDCC_HOME/
-\newline
+
+\backslash
+
+\newline
+RANLIB=
+\begin_inset Quotes srd
+\end_inset
-\emph on
-$PREFIX2DATA_DIR/
-\newline
-$INCLUDE_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+i586-mingw32msvc-ranlib
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+
+\backslash
-$SDCC_ HOME/
-\newline
-share/sdcc/
-\newline
-include
-\end_inset
-
-
-\begin_inset Text
+\newline
+STRIP=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+i586-mingw32msvc-strip
+\begin_inset Quotes srd
+\end_inset
-$SDCC_HOME
-\backslash
-include
-\end_inset
-
-
-
-
-\begin_inset Text
+
+\backslash
-\layout Standard
+\newline
+-
+\begin_inset ERT
+status collapsed
-path(argv[0])/
-\newline
+\begin_layout Standard
-\emph on
-$BIN2DATADIR/
-\emph default
-\newline
+\backslash
+/
+\end_layout
-\emph on
-$INCLUDE_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-prefix=
+\begin_inset Quotes srd
+\end_inset
-path(argv[0])/
-\newline
-../sdcc/include
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+/sdcc
+\begin_inset Quotes srd
+\end_inset
-path(argv[0])
-\backslash
-..
-\backslash
-include
-\end_inset
-
-
-
-
-\begin_inset Text
+
+\backslash
-\layout Standard
+\newline
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-$DATADIR/
-\emph default
-\newline
+\backslash
+/
+\end_layout
-\emph on
-$INCLUDE_DIR_SUFFIX
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-datarootdir=
+\begin_inset Quotes srd
+\end_inset
-/usr/local/share/sdcc/
-\newline
-include
-\end_inset
-
-
-\begin_inset Text
+/sdcc
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+
+\backslash
+
+\newline
+docdir=
+\begin_inset Quotes srd
+\end_inset
-(not on Win32)
-\end_inset
-
-
-
-\end_inset
+\backslash
+${datarootdir}/doc
+\begin_inset Quotes srd
+\end_inset
-\newline
+\backslash
-\layout Standard
-\noindent
-The option -
-\begin_inset ERT
-status Collapsed
+\newline
+include_dir_suffix=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+include
+\begin_inset Quotes srd
+\end_inset
-\backslash
-/
-\end_inset
+
+\backslash
--nostdinc disables the last two search paths.
-\newline
+\newline
+lib_dir_suffix=
+\begin_inset Quotes srd
+\end_inset
-\newline
-3.
- Library files
-\newline
+lib
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+
+\backslash
-With the exception of
-\begin_inset Quotes sld
-\end_inset
+\newline
+sdccconf_h_dir_separator=
+\begin_inset Quotes srd
+\end_inset
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\backslash
-\backslash
-/
-\end_inset
+\backslash
+
+\backslash
+
+\backslash
--L dir
\begin_inset Quotes srd
-\end_inset
+\end_inset
- the
-\shape italic
-model
-\shape default
- is auto-appended by the compiler (e.g.
- small, large, z80, ds390 etc.).
-\newline
+\backslash
-\layout Standard
-\align center
+\newline
+-
+\begin_inset ERT
+status collapsed
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-Search path
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-default
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-Win32 builds
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--L dir
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-disable-device-lib
+\backslash
+\newline
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--L dir
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-host=i586-mingw32msvc
+\backslash
+\newline
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--L dir
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-build=unknown-unknown-linux-gnu
+\end_layout
-$SDCC_LIB/
-\newline
+\begin_layout Standard
+To
+\begin_inset Quotes sld
+\end_inset
-\emph on
-
-\end_inset
-
-
-\begin_inset Text
+cross
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+compile on Cygwin for Mingw32 (see also sdcc/support/scripts/sdcc_cygwin_mingw32
+):
+\end_layout
-$SDCC_LIB/
-\newline
+\begin_layout LyX-Code
+./configure -C
+\backslash
-\emph on
-
-\end_inset
-
-
-\begin_inset Text
+\newline
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-$SDCC_LIB
-\backslash
-\newline
+\backslash
+/
+\end_layout
-\emph on
-
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-prefix=
+\begin_inset Quotes srd
+\end_inset
-$SDCC_HOME/
-\newline
+/sdcc
+\begin_inset Quotes srd
+\end_inset
-\emph on
-$PREFIX2DATA_DIR/
-\newline
-$LIB_DIR_SUFFIX/
-\end_inset
-
-
-\begin_inset Text
+
+\backslash
-\layout Standard
+\newline
+-
+\begin_inset ERT
+status collapsed
-$SDCC_HOME/
-\newline
-share/sdcc/
-\newline
-lib/
-\emph on
-
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-$SDCC_HOME
-\backslash
-lib
-\backslash
+\backslash
+/
+\end_layout
-\emph on
+\end_inset
-\newline
-
-\end_inset
-
-
-
-
-\begin_inset Text
+-datarootdir=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+/sdcc
+\begin_inset Quotes srd
+\end_inset
-path(argv[0])/
-\newline
+
+\backslash
-\emph on
-$BIN2DATADIR/
-\emph default
+\newline
+docdir=
+\begin_inset Quotes srd
+\end_inset
-\newline
-\emph on
-$LIB_DIR_SUFFIX/
-\end_inset
-
-
-\begin_inset Text
+\backslash
+${datarootdir}/doc
+\begin_inset Quotes srd
+\end_inset
+
+
+\backslash
+
+\newline
+include_dir_suffix=
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+include
+\begin_inset Quotes srd
+\end_inset
-path(argv[0])/
-\newline
-../sdcc/lib/
-\emph on
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+
+\backslash
-path(argv[0])
-\backslash
+\newline
+lib_dir_suffix=
+\begin_inset Quotes srd
+\end_inset
-\newline
-..
-\backslash
lib
-\backslash
+\begin_inset Quotes srd
+\end_inset
-\emph on
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-
-\end_inset
-
-
-
-
-\begin_inset Text
+
+\backslash
-\layout Standard
+\newline
+sdccconf_h_dir_separator=
+\begin_inset Quotes srd
+\end_inset
-\emph on
-$DATADIR/
-\newline
-$LIB_DIR_SUFFIX/
-\end_inset
-
-
-\begin_inset Text
+\backslash
-\layout Standard
+\backslash
-/usr/local/share/sdcc/
-\newline
-lib/
-\emph on
-
-\end_inset
-
-
-\begin_inset Text
+\backslash
-\layout Standard
+\backslash
-(not on Win32)
-\end_inset
-
-
-
+\begin_inset Quotes srd
+\end_inset
-\end_inset
+
+\backslash
+\newline
+CC=
+\begin_inset Quotes srd
+\end_inset
-\newline
+gcc -mno-cygwin
+\begin_inset Quotes srd
+\end_inset
-\layout Comment
+
+\backslash
-Don't delete any of the stray spaces in the table above without checking
- the HTML output (last line)!
-\layout Standard
+\newline
+CXX=
+\begin_inset Quotes srd
+\end_inset
-\SpecialChar ~
+g++ -mno-cygwin
+\begin_inset Quotes srd
+\end_inset
-\newline
-The option -
+
+\end_layout
+
+\begin_layout Standard
+'configure' is quite slow on Cygwin (at least on windows before Win2000/XP).
+ The option '-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--nostdlib disables the last two search paths.
-\layout Section
+\end_inset
-Building SDCC
-\begin_inset LatexCommand \index{Building SDCC}
+-C' turns on caching, which gives a little bit extra speed.
+ However if options are changed, it can be necessary to delete the config.cache
+ file.
+\end_layout
-\end_inset
+\begin_layout Section
+Install paths
+\begin_inset LatexCommand label
+name "sub:Install-paths"
+\end_inset
-\layout Subsection
-Building SDCC on Linux
-\begin_inset LatexCommand \label{sub:Building-SDCC-on-Linux}
+\begin_inset LatexCommand index
+name "Install paths"
-\end_inset
+\end_inset
-\layout Enumerate
+\end_layout
+\begin_layout Standard
+\begin_inset VSpace medskip
+\end_inset
-\series medium
-Download the source package
-\series default
- either from the SDCC Subversion repository or from the nightly snapshots
-\series medium
-, it will be named something like sdcc
-\series default
-.src
-\series medium
-.t
-\series default
-ar.
-\series medium
-gz
-\series default
-
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
-\end_inset
+\end_layout
-.
-\layout Enumerate
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+
+\begin_inset Text
+\begin_layout Standard
-\series medium
-Bring up a command line terminal, such as xterm.
-\layout Enumerate
+\series bold
+Description
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\series medium
-Unpack the file using a command like:
-\family sans
-\series bold
-"tar -xvzf sdcc.src.tar.gz
-\family default
-\series default
-"
-\series medium
-, this will create a sub-directory called sdcc with all of the sources.
-\layout Enumerate
+\begin_layout Standard
-Change directory into the main SDCC directory, for example type:
-\family sans
-\series bold
-"cd sdcc
-\series default
-".
-\layout Enumerate
+\series bold
+Path
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\series medium
-Type
-\family sans
-\series bold
-"./configure
-\family default
-\series default
-".
- This configures the package for compilation on your system.
-\layout Enumerate
+\begin_layout Standard
+\series bold
+Default
+\end_layout
-\series medium
-Type
-\family sans
-\series bold
-"make
-\family default
-\series default
-"
-\series medium
-.
+\end_inset
+
+
+\begin_inset Text
-\series default
- All of the source packages will compile, this can take a while.
-\layout Enumerate
+\begin_layout Standard
+\series bold
+Win32 builds
+\end_layout
-\series medium
-Type
-\family sans
-\series bold
-"make install"
-\family default
-\series default
- as root
-\series medium
-.
+\end_inset
+
+
+
+
+\begin_inset Text
-\series default
- This copies the binary executables, the include files, the libraries and
- the documentation to the install directories.
- Proceed with section
-\begin_inset LatexCommand \ref{sec:Testing-the-SDCC}
+\begin_layout Standard
+Binary files*
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-.
-\layout Subsection
+\begin_layout Standard
-Building SDCC on OSX 2.x
-\layout Standard
+\emph on
+$EXEC_PREFIX
+\end_layout
-Follow the instruction for Linux.
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-On OSX 2.x it was reported, that the default gcc (version 3.1 20020420 (prerelease
-)) fails to compile SDCC.
- Fortunately there's also gcc 2.9.x installed, which works fine.
- This compiler can be selected by running 'configure' with:
-\layout LyX-Code
+\begin_layout Standard
+/usr/local/bin
+\end_layout
-./configure CC=gcc2 CXX=g++2
-\layout Subsection
+\end_inset
+
+
+\begin_inset Text
-Cross compiling SDCC on Linux for Windows
-\layout Standard
+\begin_layout Standard
-With the Mingw32 gcc cross compiler it's easy to compile SDCC for Win32.
- See section 'Configure Options'.
-\layout Subsection
+\backslash
+sdcc
+\backslash
+bin
+\end_layout
-Building SDCC using Cygwin and Mingw32
-\layout Standard
+\end_inset
+
+
+
+
+\begin_inset Text
-For building and installing a Cygwin executable follow the instructions
- for Linux.
-\newline
+\begin_layout Standard
+Include files
+\end_layout
-\newline
-On Cygwin a
-\begin_inset Quotes sld
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-native
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
- Win32-binary can be built, which will not need the Cygwin-DLL.
- For the necessary 'configure' options see section 'configure options' or
- the script 'sdcc/support/scripts/sdcc_cygwin_mingw32'.
-\newline
+\emph on
+$DATADIR/ $INCLUDE_DIR_SUFFIX
+\end_layout
-\newline
-In order to install Cygwin on Windows download setup.exe from
-\begin_inset LatexCommand \url[www.cygwin.com]{http://www.cygwin.com/}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+/usr/local/share/sdcc/include
+\end_layout
-.
- Run it, set the
-\begin_inset Quotes sld
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-default text file type
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
- to
-\begin_inset Quotes sld
-\end_inset
+\backslash
+sdcc
+\backslash
+include
+\end_layout
-unix
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
- and download/install at least the following packages.
- Some packages are selected by default, others will be automatically selected
- because of dependencies with the manually selected packages.
- Never deselect these packages!
-\layout Itemize
+\begin_layout Standard
+Library file**
+\end_layout
-flex
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-bison
-\layout Itemize
+\begin_layout Standard
-gcc ; version 3.x is fine, no need to use the old 2.9x
-\layout Itemize
+\emph on
+$DATADIR/$LIB_DIR_SUFFIX
+\end_layout
-binutils ; selected with gcc
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-make
-\layout Itemize
+\begin_layout Standard
+/usr/local/share/sdcc/lib
+\end_layout
-rxvt ; a nice console, which makes life much easier under windoze (see below)
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-man ; not really needed for building SDCC, but you'll miss it sooner or
- later
-\layout Itemize
+\begin_layout Standard
-less ; not really needed for building SDCC, but you'll miss it sooner or
- later
-\layout Itemize
+\backslash
+sdcc
+\backslash
+lib
+\end_layout
-svn ; only if you use Subversion access
-\layout Standard
+\end_inset
+
+
+
+
+\begin_inset Text
-If you want to develop something you'll need:
-\layout Itemize
+\begin_layout Standard
+Documentation
+\end_layout
-python ; for the regression tests
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-gdb ; the gnu debugger, together with the nice GUI
-\begin_inset Quotes sld
-\end_inset
+\begin_layout Standard
-insight
-\begin_inset Quotes srd
-\end_inset
+\emph on
+$DOCDIR
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\layout Itemize
+\begin_layout Standard
+/usr/local/share/sdcc/doc
+\end_layout
-openssh ; to access the CF or commit changes
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-autoconf and autoconf-devel ; if you want to fight with 'configure', don't
- use autoconf-stable!
-\layout Standard
+\begin_layout Standard
-rxvt is a nice console with history.
- Replace in your cygwin.bat the line
-\layout LyX-Code
+\backslash
+sdcc
+\backslash
+doc
+\end_layout
-bash -
-\begin_inset ERT
-status Collapsed
+\end_inset
+
+
+
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--login -i
-\layout Standard
+\end_layout
-with (one line):
-\layout LyX-Code
+\begin_layout Verse
-rxvt -sl 1000 -fn "Lucida Console-12" -sr -cr red
-\layout LyX-Code
+\size footnotesize
+*compiler, preprocessor, assembler, and linker
+\newline
+**the
+\shape italic
+model
+\shape default
+ is auto-appended by the compiler, e.g.
+ small, large, z80, ds390 etc
+\end_layout
- -bg black -fg white -geometry 100x65 -e bash -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+\noindent
+The install paths can still be changed during `make install' with e.g.:
+\end_layout
-\layout Standard
+\begin_layout LyX-Code
+make install prefix=$(HOME)/local/sdcc
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Of course this doesn't change the search paths compiled into the binaries.
+\newline
--login
-\layout Standard
+\newline
+Moreove
+r the install path can be changed by defining DESTDIR
+\begin_inset LatexCommand index
+name "DESTDIR"
-Text selected with the mouse is automatically copied to the clipboard, pasting
- works with shift-insert.
-\newline
+\end_inset
-\newline
-The other good tip is to make sure you have no //c/-style paths anywhere,
- use /cygdrive/c/ instead.
- Using // invokes a network lookup which is very slow.
- If you think
-\begin_inset Quotes sld
-\end_inset
+:
+\end_layout
-cygdrive
-\begin_inset Quotes srd
-\end_inset
+\begin_layout LyX-Code
+make install DESTDIR=$(HOME)/sdcc.rpm/
+\end_layout
- is too long, you can change it with e.g.
-\layout LyX-Code
+\begin_layout Standard
+Please note that DESTDIR must have a trailing slash!
+\end_layout
-mount -s -u -c /mnt
-\layout Standard
+\begin_layout Section
+Search Paths
+\begin_inset LatexCommand label
+name "sub:Search-Paths"
-SDCC sources use the unix line ending LF.
- Life is much easier, if you store the source tree on a drive which is mounted
- in binary mode.
- And use an editor which can handle LF-only line endings.
- Make sure not to commit files with windows line endings.
- The tabulator spacing
-\begin_inset LatexCommand \index{tabulator spacing (8 columns)}
+\end_inset
-\end_inset
- used in the project is 8.
- Although a tabulator spacing of 8 is a sensible choice for programmers
- (it's a power of 2 and allows to display 8/16 bit signed variables without
- loosing columns) the plan is to move towards using only spaces in the source.
-\layout Subsection
+\begin_inset LatexCommand index
+name "Search path"
-Building SDCC Using Microsoft Visual C++ 6.0/NET (MSVC)
-\layout Standard
+\end_inset
-\series medium
-Download the source package
-\series default
- either from the SDCC Subversion repository or from the
-\begin_inset LatexCommand \url[nightly snapshots]{http://sdcc.sourceforge.net/snap.php}
+\end_layout
-\end_inset
+\begin_layout Standard
+Some search paths or parts of them are determined by configure variables
+ (in
+\emph on
+italics
+\emph default
+, see section above).
+ Further search paths are determined by environment variables during runtime.
+
+\newline
+The paths searched when running the compiler are as follows (the first
+ catch wins):
+\newline
+\newline
+1.
+ Binary files (preprocessor, assembler and linker)
+\newline
-\series medium
-, it will be named something like sdcc
-\series default
-.src
-\series medium
-.tgz.
+\end_layout
-\series default
- SDCC is distributed with all the projects, workspaces, and files you need
- to build it using Visual C++ 6.0/NET (except for SDCDB and ucSim).
- The workspace name is 'sdcc.dsw'.
- Please note that as it is now, all the executables are created in a folder
- called sdcc
-\backslash
-bin_vc.
- Once built you need to copy the executables from sdcc
-\backslash
-bin_vc to sdcc
-\backslash
-bin before running SDCC.
-
-\newline
-
-\newline
-WARNING: Visual studio is very picky with line terminations; it expects
- the 0x0d, 0x0a DOS style line endings, not the 0x0a Unix style line endings.
- When using the Subversion repository it's easiest to configure the svn
- client to convert automatically for you.
- If however you are getting a message such as "This makefile was not generated
- by Developer Studio etc.
- etc.
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
- when opening the sdcc.dsw workspace or any of the *.dsp projects, then you
- need to convert the Unix style line endings to DOS style line endings.
- To do so you can use the
-\begin_inset Quotes sld
-\end_inset
+\begin_layout Standard
+Search path
+\end_layout
-unix2dos
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- utility freely available on the internet.
- Doug Hawkins reported in the sdcc-user list that this works:
-\newline
+\begin_layout Standard
+default
+\end_layout
-\newline
-C:
-\backslash
-Programming
-\backslash
-SDCC> unix2dos sdcc.dsw
-\newline
-C:
-\backslash
-Programming
-\backslash
-SDCC> for /R %I in (*.dsp) do @unix2dos "%I"
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-In order to build SDCC with MSVC you need win32 executables of bison.exe,
- flex.exe, and gawk.exe.
- One good place to get them is
-\begin_inset LatexCommand \url[here]{http://unxutils.sourceforge.net}
+\begin_layout Standard
+Win32 builds
+\end_layout
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
+\begin_layout Standard
+$SDCC_HOME/
+\emph on
+$PPREFIX2BIN_DIR
+\end_layout
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-Download the file UnxUtils
-\begin_inset LatexCommand \index{UnxUtils}
+\begin_layout Standard
+$SDCC_HOME/bin
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-.zip.
- Now you have to install the utilities and setup MSVC so it can locate the
- required programs.
- Here there are two alternatives (choose one!):
-\layout Enumerate
+\begin_layout Standard
+$SDCC_HOME
+\backslash
+bin
+\end_layout
-The easy way:
-\newline
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
-a) Extract UnxUtils.zip to your C:
-\backslash
- hard disk PRESERVING the original paths, otherwise bison won't work.
- (If you are using WinZip make certain that 'Use folder names' is selected)
-\newline
+\begin_layout Standard
+Path of argv[0] (if available)
+\end_layout
-\newline
-b) In the Visual C++ IDE click Tools, Options, select the Directory tab,
- in 'Show directories for:' select 'Executable files', and in the directories
- window add a new path: 'C:
-\backslash
-user
-\backslash
-local
-\backslash
-wbin', click ok.
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-(As a side effect, you get a bunch of Unix utilities that could be useful,
- such as diff and patch.)
-\layout Enumerate
+\begin_layout Standard
+Path of argv[0]
+\end_layout
-A more compact way:
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-This one avoids extracting a bunch of files you may not use, but requires
- some extra work:
-\newline
+\begin_layout Standard
+Path of argv[0]
+\end_layout
-\newline
-a) Create a directory were to put the tools needed, or use a directory already
- present.
- Say for example 'C:
-\backslash
-util'.
-\newline
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
-b) Extract 'bison.exe', 'bison.hairy', 'bison.simple', 'flex.exe', and gawk.exe
- to such directory WITHOUT preserving the original paths.
- (If you are using WinZip make certain that 'Use folder names' is not selected)
-\newline
+\begin_layout Standard
+$PATH
+\end_layout
-\newline
-c) Rename bison.exe to '_bison.exe'.
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-d) Create a batch file 'bison.bat' in 'C:
-\backslash
-util
-\backslash
-' and add these lines:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-set BISON_SIMPLE=C:
-\backslash
-util
-\backslash
-bison.simple
-\newline
-\SpecialChar ~
-\SpecialChar ~
-set BISON_HAIRY=C:
-\backslash
-util
-\backslash
-bison.hairy
-\newline
-\SpecialChar ~
-\SpecialChar ~
-_bison %1 %2 %3 %4 %5 %6 %7 %8 %9
-\newline
+\begin_layout Standard
+$PATH
+\end_layout
-\newline
-Steps 'c' and 'd' are needed because bison requires by default that the
- files 'bison.simple' and 'bison.hairy' reside in some weird Unix directory,
- '/usr/local/share/' I think.
- So it is necessary to tell bison where those files are located if they
- are not in such directory.
- That is the function of the environment variables BISON_SIMPLE and BISON_HAIRY.
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-e) In the Visual C++ IDE click Tools, Options, select the Directory tab,
- in 'Show directories for:' select 'Executable files', and in the directories
- window add a new path: 'c:
-\backslash
-util', click ok.
- Note that you can use any other path instead of 'c:
-\backslash
-util', even the path where the Visual C++ tools are, probably: 'C:
-\backslash
-Program Files
-\backslash
-Microsoft Visual Studio
-\backslash
-Common
-\backslash
-Tools'.
- So you don't have to execute step 'e' :)
-\layout Standard
+\begin_layout Standard
+$PATH
+\end_layout
-That is it.
- Open 'sdcc.dsw' in Visual Studio, click 'build all', when it finishes copy
- the executables from sdcc
-\backslash
-bin_vc to sdcc
-\backslash
-bin, and you can compile using SDCC.
-\layout Subsection
+\end_inset
+
+
+
-Building SDCC Using Borland
-\layout Enumerate
+\end_inset
-From the sdcc directory, run the command "make -f Makefile.bcc".
- This should regenerate all the .exe files in the bin directory except for
- SDCDB and ucSim.
-\layout Enumerate
+
+\newline
-If you modify any source files and need to rebuild, be aware that the dependenci
-es may not be correctly calculated.
- The safest option is to delete all .obj files and run the build again.
- From a Cygwin BASH prompt, this can easily be done with the command (be
- sure you are in the sdcc directory):
-\newline
+\end_layout
-\newline
+\begin_layout Standard
+\noindent
+2.
+ Include files
+\newline
-\family sans
-\series bold
-find .
-
-\backslash
-( -name '*.obj' -o -name '*.lib' -o -name '*.rul'
-\backslash
-) -print -exec rm {}
-\backslash
-;
-\family default
-\series default
+\end_layout
-\newline
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
-\newline
-or on Windows NT/2000/XP from the command prompt with the command:
-\newline
+\begin_layout Standard
+Search path
+\end_layout
-\family sans
-\series bold
+\end_inset
+
+
+\begin_inset Text
-\newline
-del /s *.obj *.lib *.rul
-\family default
-\series default
- from the sdcc directory.
-\layout Subsection
+\begin_layout Standard
+default
+\end_layout
-Windows Install Using a ZIP Package
-\layout Enumerate
+\end_inset
+
+
+\begin_inset Text
-Download the binary zip package from
-\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
+\begin_layout Standard
+Win32 builds
+\end_layout
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
- and unpack it using your favorite unpacking tool (gunzip, WinZip, etc).
- This should unpack to a group of sub-directories.
- An example directory structure after unpacking the mingw32 package is:
- c:
-\backslash
-sdcc
-\backslash
-bin for the executables, c:
-\backslash
-sdcc
-\backslash
-include and c:
-\backslash
-sdcc
-\backslash
-lib for the include and libraries.
-\layout Enumerate
+\begin_layout Standard
+-
+\begin_inset ERT
+status collapsed
-Adjust your environment variable PATH to include the location of the bin
- directory or start sdcc using the full path.
-\layout Subsection
+\begin_layout Standard
-Windows Install Using the Setup Program
-\begin_inset LatexCommand \label{sub:Windows-Install}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\layout Standard
+-I dir
+\end_layout
-Download the setup program
-\emph on
-sdcc-x.y.z-setup.exe
-\emph default
- for an official release from
-\newline
+\end_inset
+
+
+\begin_inset Text
-\begin_inset LatexCommand \url{http://sf.net/project/showfiles.php?group_id=599}
+\begin_layout Standard
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- or a setup program for one of the snapshots
-\emph on
-sdcc-yyyymmdd-xxxx-setup.exe
-\emph default
- from
-\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
-\end_inset
+\backslash
+/
+\end_layout
- and execute it.
- A windows typical installer will guide you through the installation process.
-\layout Subsection
+\end_inset
-VPATH
-\begin_inset LatexCommand \index{VPATH}
+-I dir
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- feature
-\layout Standard
+\begin_layout Standard
+-
+\begin_inset ERT
+status collapsed
-SDCC supports the VPATH feature provided by configure and make.
- It allows to separate the source and build trees.
- Here's an example:
-\layout Standard
-
-
-\family typewriter
-cd ~\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-# cd $HOME
-\layout Standard
+\begin_layout Standard
-\family typewriter
-tar -xzf sdcc.src.tar.gz\SpecialChar ~
-# extract source to directory sdcc
-\layout Standard
-
-
-\family typewriter
-mkdir sdcc.build\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-# put output in sdcc.build
-\layout Standard
-
-
-\family typewriter
-cd sdcc.build
-\layout Standard
-
-
-\family typewriter
-../sdcc/configure\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-# configure is doing all the magic!
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\family typewriter
-make
-\layout Standard
-\noindent
-That's it!
-\series bold
-configure
-\series default
- will create the directory tree will all the necessary Makefiles in ~/sdcc.build.
- It automagically computes the variables srcdir, top_srcdir and top_buildir
- for each directory.
- After running
-\series bold
-make
-\series default
- the generated files will be in ~/sdcc.build, while the source files stay
- in ~/sdcc.
-\newline
-This is not only usefull for building different binaries, e.g.
- when cross compiling.
- It also gives you a much better overview in the source tree when all the
- generated files are not scattered between the source files.
- And the best thing is: if you want to change a file you can leave the original
- file untouched in the source directory.
- Simply copy it to the build directory, edit it, enter `make clean`, `rm
- Makefile.dep` and `make`.
-
-\series bold
-make
-\series default
- will do the rest for you!
-\layout Section
+-I dir
+\end_layout
-Building the Documentation
-\layout Standard
+\end_inset
+
+
+
+
+\begin_inset Text
-Add -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+$SDCC_INCLUDE
+\end_layout
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-\backslash
-/
-\end_inset
+\begin_layout Standard
+$SDCC_INCLUDE
+\end_layout
--enable-doc to the configure arguments to build the documentation together
- with all the other stuff.
- You will need several tools (LyX, LaTeX, LaTeX2HTML, pdflatex, dvipdf,
- dvips and makeindex) to get the job done.
- Another possibility is to change to the doc directory and to type
-\family sans
-\series bold
+\end_inset
+
+
+\begin_inset Text
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
+$SDCC_INCLUDE
+\end_layout
-make
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
+\begin_layout Standard
+$SDCC_HOME/
+\newline
-\family default
-\series default
- there.
- You're invited to make changes and additions to this manual (sdcc/doc/sdccman.ly
-x).
- Using LyX
-\begin_inset LatexCommand \url{http://www.lyx.org}
+\emph on
+$PREFIX2DATA_DIR/
+\newline
+$INCLUDE_DIR_SUFFIX
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- as editor is straightforward.
- Prebuilt documentation in html and pdf format is available from
-\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
+\begin_layout Standard
+$SDCC_ HOME/
+\newline
+share/sdcc/
+\newline
+include
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-.
-\layout Section
+\begin_layout Standard
+$SDCC_HOME
+\backslash
+include
+\end_layout
-Reading the Documentation
-\begin_inset LatexCommand \index{Documentation}
+\end_inset
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+path(argv[0])/
+\newline
+\emph on
+$BIN2DATADIR/
+\emph default
-\layout Standard
+\newline
-Currently reading the document in pdf format is recommended, as for unknown
- reason the hyperlinks are working there whereas in the html version they
- are not
-\begin_inset Foot
-collapsed false
+\emph on
+$INCLUDE_DIR_SUFFIX
+\end_layout
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-If you should know why please drop us a note
-\end_inset
+\begin_layout Standard
+path(argv[0])/
+\newline
+../sdcc/include
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
-.
-
-\newline
-You'll find the pdf version
-\begin_inset LatexCommand \index{PDF version of this document}
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- at
-\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.pdf}
+\begin_layout Standard
+path(argv[0])
+\backslash
+..
+\backslash
+include
+\end_layout
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
-.
-
-\newline
-A html version
-\begin_inset LatexCommand \index{HTML version of this document}
+\begin_layout Standard
-\end_inset
+\emph on
+$DATADIR/
+\emph default
- should be online at
-\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.html/index.html}
+\newline
-\end_inset
+\emph on
+$INCLUDE_DIR_SUFFIX
+\end_layout
-.
-\newline
-This documentation is in some aspects different from a commercial documentation:
-
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-It tries to document SDCC for several processor architectures in one document
- (commercially these probably would be separate documents/products).
- This document
-\begin_inset LatexCommand \index{Status of documentation}
+\begin_layout Standard
+/usr/local/share/sdcc/
+\newline
+include
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- currently matches SDCC for mcs51 and DS390 best and does give too few informati
-on about f.e.
- Z80, PIC14, PIC16 and HC08.
-\layout Itemize
+\begin_layout Standard
+(not on Win32)
+\end_layout
-There are many references pointing away from this documentation.
- Don't let this distract you.
- If there f.e.
- was a reference like
-\begin_inset LatexCommand \url{http://www.opencores.org}
+\end_inset
+
+
+
-\end_inset
+\end_inset
- together with a statement
-\begin_inset Quotes sld
-\end_inset
+
+\newline
-some processors which are targetted by SDCC can be implemented in a
-\emph on
-f
-\emph default
-ield
-\emph on
-p
-\emph default
-rogrammable
-\emph on
-g
-\emph default
-ate
-\emph on
-a
-\emph default
-rray
-\begin_inset LatexCommand \index{FPGA (field programmable gate array)}
+\end_layout
-\end_inset
+\begin_layout Standard
+\noindent
+The option -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset Quotes srd
-\end_inset
- or
-\begin_inset LatexCommand \url{http://sf.net/projects/fpgac}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-nostdinc disables the last two search paths.
+\newline
-\begin_inset LatexCommand \index{FpgaC ((subset of) C to FPGA compiler)}
+\newline
+3.
+ Library files
+\newline
-\end_inset
+\end_layout
-
+\begin_layout Standard
+With the exception of
\begin_inset Quotes sld
-\end_inset
-
-have you ever heard of an open source compiler that compiles a subset of
- C for an FPGA?
-\begin_inset Quotes srd
-\end_inset
+\end_inset
- we expect you to have a quick look there and come back.
- If you read this you are on the right track.
-\layout Itemize
+-
+\begin_inset ERT
+status collapsed
-Some sections attribute more space to problems, restrictions and warnings
- than to the solution.
-\layout Itemize
+\begin_layout Standard
-The installation section and the section about the debugger is intimidating.
-\layout Itemize
-There are still lots of typos and there are more different writing styles
- than pictures.
-\layout Section
-
-Testing the SDCC Compiler
-\begin_inset LatexCommand \label{sec:Testing-the-SDCC}
-
-\end_inset
-
-
-\layout Standard
-
-The first thing you should do after installing your SDCC compiler is to
- see if it runs.
- Type
-\family sans
-\series bold
-"sdcc -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--version"
-\begin_inset LatexCommand \index{version}
-
-\end_inset
+\end_inset
+-L dir
+\begin_inset Quotes srd
+\end_inset
-\family default
-\series default
- at the prompt, and the program should run and output its version like:
+ the
+\shape italic
+model
+\shape default
+ is auto-appended by the compiler (e.g.
+ small, large, z80, ds390 etc.).
-\newline
-
-\family typewriter
-SDCC : mcs51/z80/avr/ds390/pic16/pic14/ds400/hc08 2.5.6 #4169 (May 8 2006)
- (UNIX)
-\layout Standard
-
-If it doesn't run, or gives a message about not finding sdcc program, then
- you need to check over your installation.
- Make sure that the sdcc bin directory is in your executable search path
- defined by the PATH environment setting (
-\series medium
-see
-\series default
-section
-\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
-
-\end_inset
-
-\SpecialChar ~
-
-\series medium
-Install trouble-shooting for suggestions
-\series default
-).
- Make sure that the sdcc program is in the bin folder, if not perhaps something
- did not install correctly.
-\newline
-
-\newline
-
-\series medium
-SDCC
-\series default
-is commonly installed as described in section
-\begin_inset Quotes sld
-\end_inset
-
-Install and search paths
-\begin_inset Quotes srd
-\end_inset
+\newline
-.
-\newline
+\end_layout
-\newline
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
-\series medium
-Make sure the compiler works on a very simple example.
- Type in the following test.c program using your favorite
-\series default
-ASCII
-\series medium
-editor:
-\layout Verse
+\begin_layout Standard
+Search path
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\family typewriter
-char test;
-\newline
+\begin_layout Standard
+default
+\end_layout
-\newline
-void main(void) {
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-test=0;
-\newline
-}
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+Win32 builds
+\end_layout
-\series medium
-Compile this using the following command:
-\family sans
-\series bold
-"sdcc -c test.c".
+\end_inset
+
+
+
+
+\begin_inset Text
-\family default
-\series default
-
-\series medium
-If all goes well, the compiler will generate a test.asm and test.rel file.
- Congratulations, you've just compiled your first program with SDCC.
- We used the -c option to tell SDCC not to link the generated code, just
- to keep things simple for this step.
-\series default
+\begin_layout Standard
+-
+\begin_inset ERT
+status collapsed
-\newline
+\begin_layout Standard
-\newline
-\series medium
-The next step is to try it with the linker.
- Type in
-\family sans
-\series bold
-"sdcc test.c
-\family default
-\series default
-"
-\series medium
-.
- If all goes well the compiler will link with the libraries and produce
- a test.ihx output file.
- If this step fails
-\series default
-
-\series medium
-(no test.ihx, and the linker generates warnings), then the problem is most
- likely that
-\series default
-SDCC
-\series medium
- cannot find the
-\series default
+\backslash
/
-\series medium
-usr/local/share/sdcc/lib directory
-\series default
-
-\series medium
-(see
-\series default
-section
-\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
+\end_layout
-\end_inset
-
-\SpecialChar ~
-
-\series medium
-Install trouble-shooting for suggestions).
-\series default
-
-\newline
-
-\newline
-
-\series medium
-The final test is to ensure
-\series default
-SDCC
-\series medium
- can use the
-\series default
-standard
-\series medium
- header files and libraries.
- Edit test.c and change it to the following:
-\layout Verse
+\end_inset
+-L dir
+\end_layout
-\family typewriter
-#include
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-char str1[10];
-\newline
+\begin_layout Standard
+-
+\begin_inset ERT
+status collapsed
-\newline
-void main(void) {
-\newline
-\SpecialChar ~
-\SpecialChar ~
-strcpy(str1, "testing");
-\newline
-}
-\layout Standard
+\begin_layout Standard
-\series medium
-Compile this by typing
-\family sans
-\series bold
-"sdcc test.c"
-\family default
-\series medium
-.
- This should generate a test.ihx output file, and it should give no warnings
- such as not finding the string.h file.
- If it cannot find the string.h file, then the problem is that
-\series default
-SDCC
-\series medium
- cannot find the /usr/local/share/sdcc/include directory
-\series default
-
-\series medium
-(see the
-\series default
-section
-\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-\SpecialChar ~
+-L dir
+\end_layout
-\series medium
-Install trouble-shooting section for suggestions).
+\end_inset
+
+
+\begin_inset Text
-\series default
- Use option
-\series bold
+\begin_layout Standard
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
-
-\backslash
-/
-\end_inset
+\begin_layout Standard
--print-search-dirs
-\series default
-\begin_inset LatexCommand \index{-\/-print-search-dirs}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- to find exactly where SDCC is looking for the include and lib files.
-\layout Section
+-L dir
+\end_layout
-Install Trouble-shooting
-\begin_inset LatexCommand \label{sub:Install-Trouble-shooting}
+\end_inset
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+$SDCC_LIB/
+\newline
+\emph on
+
+\end_layout
-\begin_inset LatexCommand \index{Install trouble-shooting}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+$SDCC_LIB/
+\newline
+\emph on
+
+\end_layout
-\layout Subsection
+\end_inset
+
+
+\begin_inset Text
-If SDCC does not build correctly
-\layout Standard
+\begin_layout Standard
+$SDCC_LIB
+\backslash
-A thing to try is starting from scratch by unpacking the .tgz source package
- again in an empty directory.
- Configure it like:
-\newline
+\newline
-\newline
+\emph on
+
+\end_layout
-\family sans
-\series bold
-./configure 2>&1 | tee configure.log
-\family default
-\series default
+\end_inset
+
+
+
+
+\begin_inset Text
-\newline
+\begin_layout Standard
+$SDCC_HOME/
+\newline
-\newline
-and build it like:
-\newline
+\emph on
+$PREFIX2DATA_DIR/
+\newline
+$LIB_DIR_SUFFIX/
+\end_layout
-\newline
+\end_inset
+
+
+\begin_inset Text
-\family sans
-\series bold
-make 2>&1 | tee make.log
-\family default
-\series default
+\begin_layout Standard
+$SDCC_HOME/
+\newline
+share/sdcc/
+\newline
+lib/
+\emph on
+
+\end_layout
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-If anything goes wrong, you can review the log files to locate the problem.
- Or a relevant part of this can be attached to an email that could be helpful
- when requesting help from the mailing list.
-\layout Subsection
+\begin_layout Standard
+$SDCC_HOME
+\backslash
+lib
+\backslash
-What the
-\begin_inset Quotes sld
-\end_inset
+\emph on
-./configure
-\begin_inset Quotes srd
-\end_inset
+\newline
+
+\end_layout
- does
-\layout Standard
+\end_inset
+
+
+
+
+\begin_inset Text
-The
-\begin_inset Quotes sld
-\end_inset
+\begin_layout Standard
+path(argv[0])/
+\newline
-./configure
-\begin_inset Quotes srd
-\end_inset
+\emph on
+$BIN2DATADIR/
+\emph default
- command is a script that analyzes your system and performs some configuration
- to ensure the source package compiles on your system.
- It will take a few minutes to run, and will compile a few tests to determine
- what compiler features are installed.
-\layout Subsection
+\newline
-What the
-\begin_inset Quotes sld
-\end_inset
+\emph on
+$LIB_DIR_SUFFIX/
+\end_layout
-make
-\begin_inset Quotes srd
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- does
-\layout Standard
+\begin_layout Standard
+path(argv[0])/
+\newline
+../sdcc/lib/
+\emph on
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
-This runs the GNU make tool, which automatically compiles all the source
- packages into the final installed binary executables.
-\layout Subsection
+\end_layout
-What the
-\begin_inset Quotes sld
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-make install
-\begin_inset Quotes erd
-\end_inset
+\begin_layout Standard
+path(argv[0])
+\backslash
- command does.
-\layout Standard
+\newline
+..
+\backslash
+lib
+\backslash
-This will install the compiler, other executables libraries and include
- files into the appropriate directories.
- See sections
-\begin_inset LatexCommand \ref{sub:Install-paths}
+\emph on
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
-\end_inset
+\end_layout
-,\SpecialChar ~
+\end_inset
+
+
+
+
+\begin_inset Text
-\begin_inset LatexCommand \ref{sub:Search-Paths}
+\begin_layout Standard
-\end_inset
+\emph on
+$DATADIR/
+\newline
+$LIB_DIR_SUFFIX/
+\end_layout
-\SpecialChar ~
-about install and search paths.
-\newline
-On most systems you will need super-user privileges to do this.
-\layout Section
+\end_inset
+
+
+\begin_inset Text
-Components of SDCC
-\layout Standard
+\begin_layout Standard
+/usr/local/share/sdcc/
+\newline
+lib/
+\emph on
+
+\end_layout
-SDCC is not just a compiler, but a collection of tools by various developers.
- These include linkers, assemblers, simulators and other components.
- Here is a summary of some of the components.
- Note that the included simulator and assembler have separate documentation
- which you can find in the source package in their respective directories.
- As SDCC grows to include support for other processors, other packages from
- various developers are included and may have their own sets of documentation.
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-You might want to look at the files which are installed in .
- At the time of this writing, we find the following programs for gcc-builds:
-\newline
-
-\newline
-In /bin:
-\layout Itemize
+\begin_layout Standard
+(not on Win32)
+\end_layout
-sdcc - The compiler.
-\layout Itemize
+\end_inset
+
+
+
-sdcpp - The C preprocessor.
-\layout Itemize
+\end_inset
-asx8051 - The assembler for 8051 type processors.
-\layout Itemize
-as-z80
-\series bold
-,
-\series default
-as-gbz80 - The Z80 and GameBoy Z80 assemblers.
-\layout Itemize
+\newline
-aslink -The linker for 8051 type processors.
-\layout Itemize
+\end_layout
-link-z80
-\series bold
-,
-\series default
-link-gbz80 - The Z80 and GameBoy Z80 linkers.
-\layout Itemize
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
-s51 - The ucSim 8051 simulator.
-\layout Itemize
+\begin_layout Standard
+Don't delete any of the stray spaces in the table above without checking
+ the HTML output (last line)!
+\end_layout
-sdcdb - The source debugger.
-\layout Itemize
+\end_inset
-packihx - A tool to pack (compress) Intel hex files.
-\layout Standard
-In /share/sdcc/include
-\layout Itemize
+\end_layout
-the include files
-\layout Standard
+\begin_layout Standard
+\InsetSpace ~
-In /share/sdcc/lib
-\layout Itemize
+\newline
+The option -
+\begin_inset ERT
+status collapsed
-the subdirs src and small, large, z80, gbz80 and ds390 with the precompiled
- relocatables.
-\layout Standard
+\begin_layout Standard
-In /share/sdcc/doc
-\layout Itemize
-the documentation
-\layout Standard
+\backslash
+/
+\end_layout
-As development for other processors proceeds, this list will expand to include
- executables to support processors like AVR, PIC, etc.
-\layout Subsection
+\end_inset
-sdcc - The Compiler
-\layout Standard
+-nostdlib disables the last two search paths.
+\end_layout
-This is the actual compiler, it in turn uses the c-preprocessor and invokes
- the assembler and linkage editor.
-\layout Subsection
+\begin_layout Section
+Building SDCC
+\begin_inset LatexCommand index
+name "Building SDCC"
-sdcpp - The C-Preprocessor
-\layout Standard
+\end_inset
-The preprocessor
-\begin_inset LatexCommand \index{sdcpp (preprocessor)}
-\end_inset
+\end_layout
- is a modified version of the GNU cpp
-\begin_inset LatexCommand \index{cpp|see{sdcpp}}
+\begin_layout Subsection
+Building SDCC on Linux
+\begin_inset LatexCommand label
+name "sub:Building-SDCC-on-Linux"
-\end_inset
+\end_inset
- preprocessor
-\begin_inset LatexCommand \url{http://gcc.gnu.org/}
-\end_inset
+\end_layout
-.
- The C preprocessor is used to pull in #include sources, process #ifdef
- statements, #defines and so on.
-\layout Subsection
+\begin_layout Enumerate
-as
-\emph on
-xxxx
-\emph default
-, aslink, link-
-\emph on
-xxx
-\emph default
- - The Assemblers and Linkage Editors
-\layout Standard
+\series medium
+Download the source package
+\series default
+ either from the SDCC Subversion repository or from snapshot builds
+\series medium
+, it will be named something like sdcc
+\series default
+-src
+\series medium
+-yyyymmdd-rrrr.t
+\series default
+ar.
+\series medium
+bz2
+\series default
+
+\begin_inset LatexCommand url
+target "http://sdcc.sourceforge.net/snap.php"
-This is retargettable assembler & linkage editor, it was developed by Alan
- Baldwin.
- John Hartman created the version for 8051, and I (Sandeep) have made some
- enhancements and bug fixes for it to work properly with SDCC.
-\layout Subsection
+\end_inset
-s51 - The Simulator
-\layout Standard
+.
+\end_layout
-S51
-\begin_inset LatexCommand \index{s51}
+\begin_layout Enumerate
-\end_inset
+\series medium
+Bring up a command line terminal, such as xterm.
+\end_layout
- is a freeware, opensource simulator developed by Daniel Drotos.
- The simulator is built as part of the build process.
- For more information visit Daniel's web site at:
-\begin_inset LatexCommand \url{http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51}
+\begin_layout Enumerate
-\end_inset
+\series medium
+Unpack the file using a command like:
+\series default
+
+\family sans
+\series bold
+"tar -xvjf sdcc-src-yyyymmdd-rrrr.tar.bz2
+\begin_inset Quotes srd
+\end_inset
-.
- It currently supports the core mcs51, the Dallas DS80C390 and the Phillips
- XA51 family.
-\layout Subsection
-sdcdb - Source Level Debugger
-\layout Standard
+\family default
+\series medium
+, this will create a sub-directory called sdcc with all of the sources.
+\end_layout
-SDCDB
-\begin_inset LatexCommand \index{SDCDB (debugger)}
+\begin_layout Enumerate
+Change directory into the main SDCC directory, for example type:
+\family sans
+\series bold
+"cd sdcc
+\series default
+".
+\end_layout
-\end_inset
+\begin_layout Enumerate
- is the companion source level debugger.
- More about SDCDB in section
-\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
+\series medium
+Type
+\series default
+
+\family sans
+\series bold
+"./configure
+\family default
+\series default
+".
+ This configures the package for compilation on your system.
+\end_layout
-\end_inset
+\begin_layout Enumerate
+\series medium
+Type
+\series default
+
+\family sans
+\series bold
+"make
+\family default
+\series default
+"
+\series medium
.
- The current version of the debugger uses Daniel's Simulator S51
-\begin_inset LatexCommand \index{s51}
-
-\end_inset
-, but can be easily changed to use other simulators.
-\layout Chapter
+\series default
+ All of the source packages will compile, this can take a while.
+\end_layout
-Using SDCC
-\layout Section
+\begin_layout Enumerate
-Compiling
-\layout Subsection
-
-Single Source File Projects
-\layout Standard
-
-For single source file 8051 projects the process is very simple.
- Compile your programs with the following command
-\family sans
-\series bold
-"sdcc sourcefile.c".
+\series medium
+Type
+\series default
+
+\family sans
+\series bold
+"make install"
+\family default
+\series default
+ as root
+\series medium
+.
-\family default
-\series default
- This will compile, assemble and link your source file.
- Output files are as follows:
-\layout Itemize
+\series default
+ This copies the binary executables, the include files, the libraries and
+ the documentation to the install directories.
+ Proceed with section
+\begin_inset LatexCommand ref
+reference "sec:Testing-the-SDCC"
-sourcefile.asm
-\begin_inset LatexCommand \index{.asm}
+\end_inset
-\end_inset
+.
+\end_layout
- - Assembler source
-\begin_inset LatexCommand \index{Assembler source}
+\begin_layout Subsection
+Building SDCC on Mac OS X
+\end_layout
-\end_inset
+\begin_layout Standard
+Follow the instruction for Linux.
+\newline
- file created by the compiler
-\layout Itemize
+\newline
+On Mac OS X 10.2.x it was reported, that the
+ default gcc (version 3.1 20020420 (prerelease)) fails to compile SDCC.
+ Fortunately there's also gcc 2.9.x installed, which works fine.
+ This compiler can be selected by running 'configure' with:
+\end_layout
-sourcefile.lst
-\begin_inset LatexCommand \index{.lst}
+\begin_layout LyX-Code
+./configure CC=gcc2 CXX=g++2
+\end_layout
-\end_inset
+\begin_layout Standard
+Universal (ppc and i386) binaries can be produced on Mac OS X 10.4.x with
+ Xcode.
+ Run 'configure' with:
+\end_layout
- - Assembler listing
-\begin_inset LatexCommand \index{Assembler listing}
+\begin_layout LyX-Code
+./configure
+\backslash
-\end_inset
+\end_layout
- file created by the Assembler
-\layout Itemize
+\begin_layout LyX-Code
+LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
+ ppc"
+\backslash
-sourcefile.rst
-\begin_inset LatexCommand \index{.rst}
+\end_layout
-\end_inset
+\begin_layout LyX-Code
+CXXFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
+ ppc"
+\backslash
- - Assembler listing
-\begin_inset LatexCommand \index{Assembler listing}
+\end_layout
-\end_inset
+\begin_layout LyX-Code
+CFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+\end_layout
- file updated with linkedit information, created by linkage editor
-\layout Itemize
+\begin_layout Subsection
+Cross compiling SDCC on Linux for Windows
+\end_layout
-sourcefile.sym
-\begin_inset LatexCommand \index{.sym}
+\begin_layout Standard
+With the Mingw32 gcc cross compiler it's easy to compile SDCC for Win32.
+ See section 'Configure Options'.
+\end_layout
-\end_inset
+\begin_layout Subsection
+Building SDCC using Cygwin and Mingw32
+\end_layout
- - symbol listing
-\begin_inset LatexCommand \index{Symbol listing}
+\begin_layout Standard
+For building and installing a Cygwin executable follow the instructions
+ for Linux.
+\newline
-\end_inset
+\newline
+On Cygwin a
+\begin_inset Quotes sld
+\end_inset
- for the sourcefile, created by the assembler
-\layout Itemize
+native
+\begin_inset Quotes srd
+\end_inset
-sourcefile.rel
-\begin_inset LatexCommand \index{.rel}
+ Win32-binary can be built, which will not need the Cygwin-DLL.
+ For the necessary 'configure' options see section 'configure options' or
+ the script 'sdcc/support/scripts/sdcc_cygwin_mingw32'.
+\newline
-\end_inset
+\newline
+In order to install
+ Cygwin on Windows download setup.exe from
+\begin_inset LatexCommand url
+name "www.cygwin.com"
+target "http://www.cygwin.com/"
- or sourcefile.o
-\begin_inset LatexCommand \index{.o}
+\end_inset
-\end_inset
+.
+ Run it, set the
+\begin_inset Quotes sld
+\end_inset
- - Object file
-\begin_inset LatexCommand \index{Object file}
+default text file type
+\begin_inset Quotes srd
+\end_inset
-\end_inset
+ to
+\begin_inset Quotes sld
+\end_inset
- created by the assembler, input to Linkage editor
-\layout Itemize
+unix
+\begin_inset Quotes srd
+\end_inset
-sourcefile.map
-\begin_inset LatexCommand \index{.map}
+ and download/install at least the following packages.
+ Some packages are selected by default, others will be automatically selected
+ because of dependencies with the manually selected packages.
+ Never deselect these packages!
+\end_layout
-\end_inset
+\begin_layout Itemize
+flex
+\end_layout
- - The memory map
-\begin_inset LatexCommand \index{Memory map}
+\begin_layout Itemize
+bison
+\end_layout
-\end_inset
+\begin_layout Itemize
+gcc ; version 3.x is fine, no need to use the old 2.9x
+\end_layout
- for the load module, created by the Linker
-\layout Itemize
+\begin_layout Itemize
+binutils ; selected with gcc
+\end_layout
-sourcefile.mem
-\begin_inset LatexCommand \index{.mem}
+\begin_layout Itemize
+make
+\end_layout
-\end_inset
+\begin_layout Itemize
+rxvt ; a nice console, which makes life much easier under windoze (see below)
+\end_layout
- - A file with a summary of the memory usage
-\layout Itemize
+\begin_layout Itemize
+man ; not really needed for building SDCC, but you'll miss it sooner or
+ later
+\end_layout
-sourcefile.ihx
-\begin_inset LatexCommand \index{.ihx}
+\begin_layout Itemize
+less ; not really needed for building SDCC, but you'll miss it sooner or
+ later
+\end_layout
-\end_inset
+\begin_layout Itemize
+svn ; only if you use Subversion access
+\end_layout
- - The load module in Intel hex format
-\begin_inset LatexCommand \index{Intel hex format}
+\begin_layout Standard
+If you want to develop something you'll need:
+\end_layout
-\end_inset
+\begin_layout Itemize
+python ; for the regression tests
+\end_layout
- (you can select the Motorola S19 format
-\begin_inset LatexCommand \index{Motorola S19 format}
+\begin_layout Itemize
+gdb ; the gnu debugger, together with the nice GUI
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+insight
+\begin_inset Quotes srd
+\end_inset
- with -
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Itemize
+openssh ; to access the CF or commit changes
+\end_layout
--out-fmt-s19
-\begin_inset LatexCommand \index{-\/-out-fmt-s19}
+\begin_layout Itemize
+autoconf and autoconf-devel ; if you want to fight with 'configure', don't
+ use autoconf-stable!
+\end_layout
-\end_inset
+\begin_layout Standard
+rxvt is a nice console with history.
+ Replace in your cygwin.bat the line
+\end_layout
-.
- If you need another format you might want to use
-\family sans
-\shape italic
-objdump
-\family default
-\shape default
+\begin_layout LyX-Code
+bash -
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{objdump (tool)}
+\begin_layout Standard
-\end_inset
- or
-\family sans
-\shape italic
- srecord
-\family default
-\shape default
+\backslash
+/
+\end_layout
-\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
+\end_inset
-\end_inset
+-login -i
+\end_layout
-).
- Both formats are documented in the documentation of srecord
-\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
+\begin_layout Standard
+with (one line):
+\end_layout
-\end_inset
+\begin_layout LyX-Code
+rxvt -sl 1000 -fn "Lucida Console-12" -sr -cr red
+\end_layout
+\begin_layout LyX-Code
+ -bg black -fg white -geometry 100x65 -e bash -
+\begin_inset ERT
+status collapsed
-\layout Itemize
+\begin_layout Standard
-sourcefile.adb
-\begin_inset LatexCommand \index{.adb}
-\end_inset
+\backslash
+/
+\end_layout
- - An intermediate file containing debug information needed to create the
- .cdb file (with -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+-login
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Text selected with the mouse is automatically copied to the clipboard, pasting
+ works with shift-insert.
+\newline
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+\newline
+The other good tip is to make sure you have no //c/-styl
+e paths anywhere, use /cygdrive/c/ instead.
+ Using // invokes a network lookup which is very slow.
+ If you think
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+cygdrive
+\begin_inset Quotes srd
+\end_inset
-)
-\layout Itemize
+ is too long, you can change it with e.g.
+\end_layout
-sourcefile.cdb
-\begin_inset LatexCommand \index{.cdb}
+\begin_layout LyX-Code
+mount -s -u -c /mnt
+\end_layout
-\end_inset
+\begin_layout Standard
+SDCC sources use the unix line ending LF.
+ Life is much easier, if you store the source tree on a drive which is mounted
+ in binary mode.
+ And use an editor which can handle LF-only line endings.
+ Make sure not to commit files with windows line endings.
+ The tabulator spacing
+\begin_inset LatexCommand index
+name "tabulator spacing (8 columns)"
- - An optional file (with -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ used in the project is 8.
+ Although a tabulator spacing of 8 is a sensible choice for programmers
+ (it's a power of 2 and allows to display 8/16 bit signed variables without
+ loosing columns) the plan is to move towards using only spaces in the source.
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Subsection
+Building SDCC Using Microsoft Visual C++ 6.0/NET (MSVC)
+\end_layout
--debug) containing debug information.
- The format is documented in cdbfileformat.pdf
-\layout Itemize
+\begin_layout Standard
-sourcefile.
- - (no extension)
-\begin_inset LatexCommand \index{ (no extension)}
+\series medium
+Download the source package
+\series default
+ either from the SDCC Subversion repository or from the
+\begin_inset LatexCommand url
+name "snapshot builds"
+target "http://sdcc.sourceforge.net/snap.php"
-\end_inset
+\end_inset
- An optional AOMF or AOMF51
-\begin_inset LatexCommand \index{AOMF, AOMF51}
-\end_inset
+\series medium
+, it will be named something like sdcc
+\series default
+-src
+\series medium
+-yyyymmdd-rrrr.tar.bz2.
+\series default
+ SDCC is distributed with all the projects, workspaces, and files you need
+ to build it using Visual C++ 6.0/NET (except for SDCDB and ucSim).
+ The workspace name is 'sdcc.dsw'.
+ Please note that as it is now, all the executables are created in a folder
+ called sdcc
+\backslash
+bin_vc.
+ Once built you need to copy the executables from sdcc
+\backslash
+bin_vc to sdcc
+\backslash
+bin before running SDCC.
-\begin_inset LatexCommand \label{OMF file}
+\newline
-\end_inset
+\newline
+WARNING: Visual studio is very picky with line terminations; it expects
+ the 0x0d, 0x0a DOS style line endings, not the 0x0a Unix style line endings.
+ When using the Subversion repository it's easiest to configure the svn
+ client to convert automatically for you.
+ If however you are getting a message such as "This makefile was not generated
+ by Developer Studio etc.
+ etc.
+\begin_inset Quotes srd
+\end_inset
-file containing debug information (generated with option -
-\begin_inset ERT
-status Collapsed
+ when opening the sdcc.dsw workspace or any of the *.dsp projects, then you
+ need to convert the Unix style line endings to DOS style line endings.
+ To do so you can use the
+\begin_inset Quotes sld
+\end_inset
-\layout Standard
+unix2dos
+\begin_inset Quotes srd
+\end_inset
-\backslash
-/
-\end_inset
+ utility freely available on the internet.
+ Doug Hawkins reported in the sdcc-user list that this works:
+\newline
--debug).
- The (Intel)
-\emph on
- a
-\emph default
-bsolute
-\emph on
-o
-\emph default
-bject
-\emph on
-m
-\emph default
-odule
-\emph on
-f
-\emph default
-ormat is commonly used by third party tools (debuggers
-\begin_inset LatexCommand \index{Debugger}
+\newline
+C:
+\backslash
+Programming
+\backslash
+SDCC> unix2dos sdcc.dsw
+\newline
+C:
+\backslash
+Programming
+\backslash
+SDCC> for /R %I in (*.dsp) do @unix2dos "%I"
+\newline
-\end_inset
+\newline
+In order to build SDCC with MSVC
+ you need win32 executables of bison.exe, flex.exe, and gawk.exe.
+ One good place to get them is
+\begin_inset LatexCommand url
+name "here"
+target "http://unxutils.sourceforge.net"
-, simulators, emulators)
-\layout Itemize
+\end_inset
-sourcefile.dump*
-\begin_inset LatexCommand \index{.dump*}
-\end_inset
+\newline
- - Dump file to debug the compiler it self (generated with option -
-\begin_inset ERT
-status Collapsed
+\newline
+Download the file UnxUtils
+\begin_inset LatexCommand index
+name "UnxUtils"
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--dumpall) (see section
-\begin_inset LatexCommand \ref{sub:Intermediate-Dump-Options}
+\end_inset
-\end_inset
+.zip.
+ Now you have to install the utilities and setup MSVC so it can locate the
+ required programs.
+ Here there are two alternatives (choose one!):
+\end_layout
-\SpecialChar ~
- and section
-\begin_inset LatexCommand \ref{sub:The-anatomy-of}
+\begin_layout Enumerate
+The easy way:
+\newline
-\end_inset
+\newline
+a) Extract UnxUtils.zip to your C:
+\backslash
+ hard disk PRESERVING the original paths, otherwise bison won't work.
+ (If you are using WinZip make certain that 'Use folder names' is selected)
+\newline
-\SpecialChar ~
+\newline
+b)
+ In the Visual C++ IDE click Tools, Options, select the Directory tab, in
+ 'Show directories for:' select 'Executable files', and in the directories
+ window add a new path: 'C:
+\backslash
+user
+\backslash
+local
+\backslash
+wbin', click ok.
+\newline
-\begin_inset Quotes sld
-\end_inset
+\newline
+(As a side effect, you get a bunch of Unix utilities that
+ could be useful, such as diff and patch.)
+\end_layout
-Anatomy of the compiler
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Enumerate
+A more compact way:
+\newline
-).
-\layout Subsection
+\newline
+This one avoids extracting a bunch of files you may not
+ use, but requires some extra work:
+\newline
-Postprocessing the Intel Hex
-\begin_inset LatexCommand \index{Intel hex format}
+\newline
+a) Create a directory were to put the
+ tools needed, or use a directory already present.
+ Say for example 'C:
+\backslash
+util'.
+\newline
-\end_inset
+\newline
+b) Extract 'bison.exe', 'bison.hairy', 'bison.simple', 'flex.exe', and
+ gawk.exe to such directory WITHOUT preserving the original paths.
+ (If you are using WinZip make certain that 'Use folder names' is not selected)
+\newline
- file
-\layout Standard
+\newline
+c
+) Rename bison.exe to '_bison.exe'.
+\newline
-In most cases this won't be needed but the Intel Hex file
-\begin_inset LatexCommand \index{.ihx}
+\newline
+d) Create a batch file 'bison.bat' in 'C:
+\backslash
+util
+\backslash
+' and add these lines:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+set BISON_SIMPLE=C:
+\backslash
+util
+\backslash
+bison.simple
+\newline
+\InsetSpace ~
+\InsetSpace ~
+set BISON_HAIRY=C:
+\backslash
+util
+\backslash
+bison.hairy
+\newline
+\InsetSpace ~
+\InsetSpace ~
+_bison %1 %2 %3 %4 %5 %6 %7 %8 %9
+\newline
-\end_inset
+\newline
+Steps 'c' and 'd' are needed
+ because bison requires by default that the files 'bison.simple' and 'bison.hairy'
+ reside in some weird Unix directory, '/usr/local/share/' I think.
+ So it is necessary to tell bison where those files are located if they
+ are not in such directory.
+ That is the function of the environment variables BISON_SIMPLE and BISON_HAIRY.
+\newline
- which is generated by SDCC might include lines of varying length and the
- addresses within the file are not guaranteed to be strictly ascending.
- If your toolchain or a bootloader does not like this you can use the tool
-
-\family typewriter
-packihx
-\family default
+\newline
+e
+) In the Visual C++ IDE click Tools, Options, select the Directory tab,
+ in 'Show directories for:' select 'Executable files', and in the directories
+ window add a new path: 'c:
+\backslash
+util', click ok.
+ Note that you can use any other path instead of 'c:
+\backslash
+util', even the path where the Visual C++ tools are, probably: 'C:
+\backslash
+Program Files
+\backslash
+Microsoft Visual Studio
+\backslash
+Common
+\backslash
+Tools'.
+ So you don't have to execute step 'e' :)
+\end_layout
-\begin_inset LatexCommand \index{packihx (tool)}
+\begin_layout Standard
+That is it.
+ Open 'sdcc.dsw' in Visual Studio, click 'build all', when it finishes copy
+ the executables from sdcc
+\backslash
+bin_vc to sdcc
+\backslash
+bin, and you can compile using SDCC.
+\end_layout
-\end_inset
+\begin_layout Subsection
+Building SDCC Using Borland
+\end_layout
- which is part of the SDCC distribution:
-\newline
+\begin_layout Enumerate
+From the sdcc directory, run the command "make -f Makefile.bcc".
+ This should regenerate all the .exe files in the bin directory except for
+ SDCDB and ucSim.
+\end_layout
-\newline
+\begin_layout Enumerate
+If you modify any source files and need to rebuild, be aware that the dependenci
+es may not be correctly calculated.
+ The safest option is to delete all .obj files and run the build again.
+ From a Cygwin BASH prompt, this can easily be done with the command (be
+ sure you are in the sdcc directory):
+\newline
-\family sans
-\series bold
- packihx sourcefile.ihx >sourcefile.hex
-\family default
-\series default
+\newline
-\newline
+\family sans
+\series bold
+find .
+
+\backslash
+( -name '*.obj' -o -name '*.lib' -o -name '*.rul'
+\backslash
+) -print -exec rm {}
+\backslash
+;
+\family default
+\series default
-\newline
-The separately available
-\emph on
- srecord
-\emph default
+\newline
-\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
+\newline
+or on Windows NT/2000/XP from the command prompt with the command:
+\newline
-\end_inset
+\family sans
+\series bold
- package additionally allows to set undefined locations to a predefined
- value, to insert checksums
-\begin_inset LatexCommand \index{checksum}
+\newline
+del /s *.obj *.lib *.rul
+\family default
+\series default
+ from the sdcc directory.
+\end_layout
-\end_inset
+\begin_layout Subsection
+Windows Install Using a ZIP Package
+\end_layout
- of various flavours (crc, add, xor) and to perform other manipulations
- (convert, split, crop, offset, ...).
-
-\newline
+\begin_layout Enumerate
+Download the binary zip package from
+\begin_inset LatexCommand url
+target "http://sdcc.sf.net/snap.php"
-\newline
+\end_inset
-\family sans
-\series bold
-srec_cat\SpecialChar ~
-\SpecialChar ~
-sourcefile.ihx -intel\SpecialChar ~
-\SpecialChar ~
--o sourcefile.hex -intel
-\newline
+ and unpack it using your favorite unpacking tool (gunzip, WinZip, etc).
+ This should unpack to a group of sub-directories.
+ An example directory structure after unpacking the mingw32 package is:
+ c:
+\backslash
+sdcc
+\backslash
+bin for the executables, c:
+\backslash
+sdcc
+\backslash
+include and c:
+\backslash
+sdcc
+\backslash
+lib for the include and libraries.
+\end_layout
-\newline
+\begin_layout Enumerate
+Adjust your environment variable PATH to include the location of the bin
+ directory or start sdcc using the full path.
+\end_layout
-\family default
-\series default
-An example for a more complex command line
-\begin_inset Foot
-collapsed false
+\begin_layout Subsection
+Windows Install Using the Setup Program
+\begin_inset LatexCommand label
+name "sub:Windows-Install"
-\layout Standard
+\end_inset
-the command backfills
-\begin_inset LatexCommand \index{backfill unused memory}
-\end_inset
+\end_layout
- unused memory with 0x12 and the overall 16 bit sum of the complete 64 kByte
- block is zero.
- If the program counter on an mcs51 runs wild the backfill pattern 0x12
- will be interpreted as an
-\family typewriter
-lcall
-\family default
- to address
-\family typewriter
-0x1212
-\family default
- (where an emergency routine could sit).
-\end_inset
+\begin_layout Standard
+Download the setup program
+\emph on
+sdcc-x.y.z-setup.exe
+\emph default
+ for an official release from
+\newline
- could look like:
-\newline
+\begin_inset LatexCommand url
+target "http://sf.net/project/showfiles.php?group_id=599"
-\newline
+\end_inset
-\family sans
-\series bold
-\size footnotesize
-srec_cat\SpecialChar ~
-sourcefile.ihx -intel\SpecialChar ~
-\SpecialChar ~
--fill 0x12 0x0000 0xfffe\SpecialChar ~
--little-endian-checksum-nega
-tive 0xfffe 0x02 0x02\SpecialChar ~
-\SpecialChar ~
--o sourcefile.hex -intel
-\size default
+ or a setup program for one of the snapshots
+\emph on
+sdcc-yyyymmdd-xxxx-setup.exe
+\emph default
+ from
+\begin_inset LatexCommand url
+target "http://sdcc.sf.net/snap.php"
-\newline
+\end_inset
-\newline
+ and execute it.
+ A windows typical installer will guide you through the installation process.
+\end_layout
-\family default
-\series default
-The srecord package is available at
-\begin_inset LatexCommand \url{http://sf.net/projects/srecord}
+\begin_layout Subsection
+VPATH
+\begin_inset LatexCommand index
+name "VPATH"
-\end_inset
+\end_inset
- .
-\layout Subsection
+ feature
+\end_layout
-Projects with Multiple Source Files
-\layout Standard
+\begin_layout Standard
+SDCC supports the VPATH feature provided by configure and make.
+ It allows to separate the source and build trees.
+ Here's an example:
+\end_layout
-SDCC can compile only ONE file at a time.
- Let us for example assume that you have a project containing the following
- files:
-\newline
+\begin_layout Standard
-\newline
-foo1.c (contains some functions)
-\newline
-foo2.c (contains some more functions)
-\newline
-foomain.c (contains more functions and the function main)
-\newline
+\family typewriter
+cd ~\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+# cd $HOME
+\end_layout
-\size footnotesize
+\begin_layout Standard
-\newline
+\family typewriter
+tar -xjf sdcc-src-yyyymmdd-rrrr.tar.bz2\InsetSpace ~
+# extract source to directory sdcc
+\end_layout
-\size default
-The first two files will need to be compiled separately with the commands:
-\size footnotesize
-
-\size default
+\begin_layout Standard
-\newline
+\family typewriter
+mkdir sdcc.build\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+# put output in sdcc.build
+\end_layout
-\newline
+\begin_layout Standard
-\family sans
-\series bold
-sdcc\SpecialChar ~
--c\SpecialChar ~
-foo1.c
-\family default
-\series default
-\size footnotesize
+\family typewriter
+cd sdcc.build
+\end_layout
-\newline
+\begin_layout Standard
-\family sans
-\series bold
-\size default
-sdcc\SpecialChar ~
--c\SpecialChar ~
-foo2.c
-\family default
-\series default
+\family typewriter
+../sdcc/configure\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+# configure is doing all the magic!
+\end_layout
-\newline
+\begin_layout Standard
-\newline
-Then compile the source file containing the
-\emph on
-main()
-\emph default
- function and link
-\begin_inset LatexCommand \index{Linker}
+\family typewriter
+make
+\end_layout
-\end_inset
+\begin_layout Standard
+\noindent
+That's it!
+\series bold
+configure
+\series default
+ will create the directory tree will all the necessary Makefiles in ~/sdcc.build.
+ It automagically computes the variables srcdir, top_srcdir and top_buildir
+ for each directory.
+ After running
+\series bold
+make
+\series default
+ the generated files will be in ~/sdcc.build, while the source files stay
+ in ~/sdcc.
+\newline
+This is not only usefull for building different binaries, e.g.
+ when cross compiling.
+ It also gives you a much better overview in the source tree when all the
+ generated files are not scattered between the source files.
+ And the best thing is: if you want to change a file you can leave the original
+ file untouched in the source directory.
+ Simply copy it to the build directory, edit it, enter `make clean', `rm
+ Makefile.dep' and `make'.
+
+\series bold
+make
+\series default
+ will do the rest for you!
+\end_layout
- the files together with the following command:
-\newline
+\begin_layout Section
+Building the Documentation
+\end_layout
-\newline
+\begin_layout Standard
+Add -
+\begin_inset ERT
+status collapsed
-\family sans
-\series bold
-sdcc\SpecialChar ~
-foomain.c\SpecialChar ~
-foo1.rel\SpecialChar ~
-foo2.rel
-\family default
-\series default
+\begin_layout Standard
-\begin_inset LatexCommand \index{.rel}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\newline
+-enable-doc to the configure arguments to build the documentation together
+ with all the other stuff.
+ You will need several tools (LyX, LaTeX, LaTeX2HTML, pdflatex, dvipdf,
+ dvips and makeindex) to get the job done.
+ Another possibility is to change to the doc directory and to type
+\family sans
+\series bold
-\newline
-Alternatively,
-\emph on
-foomain.c
-\emph default
-can be separately compiled as well:
-\family sans
-\series bold
-
-\newline
-
-\newline
-sdcc\SpecialChar ~
--c\SpecialChar ~
-foomain.c
-\newline
-sdcc foomain.rel foo1.rel foo2.rel
-\newline
+\begin_inset Quotes srd
+\end_inset
-\newline
+make
+\begin_inset Quotes srd
+\end_inset
-\family default
-\series default
-The file containing the
-\emph on
-main()
-\emph default
- function
-\emph on
-
-\emph default
-\noun on
-must
-\noun default
- be the
-\noun on
-first
-\noun default
- file specified in the command line, since the linkage editor processes
- file in the order they are presented to it.
- The linker is invoked from SDCC using a script file with extension .lnk
-\begin_inset LatexCommand \index{.lnk}
-\end_inset
+\family default
+\series default
+ there.
+ You're invited to make changes and additions to this manual (sdcc/doc/sdccman.ly
+x).
+ Using LyX
+\begin_inset LatexCommand url
+target "http://www.lyx.org"
-.
- You can view this file to troubleshoot linking problems such as those arising
- from missing libraries.
-\layout Subsection
+\end_inset
-Projects with Additional Libraries
-\begin_inset LatexCommand \index{Libraries}
+ as editor is straightforward.
+ Prebuilt documentation in html and pdf format is available from
+\begin_inset LatexCommand url
+target "http://sdcc.sf.net/snap.php"
-\end_inset
+\end_inset
+.
+\end_layout
-\layout Standard
+\begin_layout Section
+Reading the Documentation
+\begin_inset LatexCommand index
+name "Documentation"
-Some reusable routines may be compiled into a library, see the documentation
- for the assembler and linkage editor (which are in /share/sdcc/doc)
- for how to create a
-\emph on
-.lib
-\begin_inset LatexCommand \index{.lib}
+\end_inset
-\end_inset
+\end_layout
-\emph default
- library file.
- Libraries created in this manner can be included in the command line.
- Make sure you include the -L option to tell the linker where
- to look for these files if they are not in the current directory.
- Here is an example, assuming you have the source file
-\emph on
-foomain.c
-\emph default
- and a library
-\emph on
- foolib.lib
-\emph default
- in the directory
-\emph on
-mylib
-\emph default
- (if that is not the same as your current project):
-\newline
+\begin_layout Standard
+Currently reading the document in pdf format is recommended, as for unknown
+ reason the hyperlinks are working there whereas in the html version they
+ are not
+\begin_inset Foot
+status open
-\newline
+\begin_layout Standard
+If you should know why please drop us a note
+\end_layout
-\family sans
-\series bold
-sdcc foomain.c foolib.lib -L mylib
-\newline
+\end_inset
-\newline
+.
+
+\newline
+You'll find the pdf version
+\begin_inset LatexCommand index
+name "PDF version of this document"
-\family default
-\series default
-Note here that
-\emph on
- mylib
-\emph default
- must be an absolute path name.
-\newline
+\end_inset
-\newline
-The most efficient way to use libraries is to keep separate modules in separate
- source files.
- The lib file now should name all the modules.rel
-\begin_inset LatexCommand \index{.rel}
+ at
+\begin_inset LatexCommand url
+target "http://sdcc.sf.net/doc/sdccman.pdf"
-\end_inset
+\end_inset
- files.
- For an example see the standard library file
-\emph on
-libsdcc.lib
-\emph default
- in the directory /share/lib/small.
-\layout Subsection
+.
+
+\newline
+A html version
+\begin_inset LatexCommand index
+name "HTML version of this document"
-Using sdcclib to Create and Manage Libraries
-\begin_inset LatexCommand \index{sdcclib}
+\end_inset
-\end_inset
+ should be online at
+\begin_inset LatexCommand url
+target "http://sdcc.sf.net/doc/sdccman.html/index.html"
+\end_inset
-\layout Standard
+.
+\newline
+This documentation is in some aspects different from a commercial documentation:
+
+\end_layout
-Alternatively, instead of having a .rel file for each entry on the library
- file as described in the preceding section, sdcclib can be used to embed
- all the modules belonging to such library in the library file itself.
- This results in a larger library file, but it greatly reduces the number
- of disk files accessed by the linker.
- Additionally, the packed library file contains an index of all include
- modules and symbols that significantly speeds up the linking process.
- To display a list of options supported by sdcclib type:
-\newline
+\begin_layout Itemize
+It tries to document SDCC for several processor architectures in one document
+ (commercially these probably would be separate documents/products).
+ This document
+\begin_inset LatexCommand index
+name "Status of documentation"
-\layout Standard
+\end_inset
+ currently matches SDCC for mcs51 and DS390 best and does give too few informati
+on about f.e.
+ Z80, PIC14, PIC16 and HC08.
+\end_layout
-\family sans
-\series bold
-sdcclib -?
-\begin_inset LatexCommand \index{sdcclib}
+\begin_layout Itemize
+There are many references pointing away from this documentation.
+ Don't let this distract you.
+ If there f.e.
+ was a reference like
+\begin_inset LatexCommand url
+target "http://www.opencores.org"
-\end_inset
+\end_inset
+ together with a statement
+\begin_inset Quotes sld
+\end_inset
-\newline
+some processors which are targetted by SDCC can be implemented in a
+\emph on
+f
+\emph default
+ield
+\emph on
+p
+\emph default
+rogrammable
+\emph on
+g
+\emph default
+ate
+\emph on
+a
+\emph default
+rray
+\begin_inset LatexCommand index
+name "FPGA (field programmable gate array)"
-\newline
+\end_inset
-\family default
-\series default
-To create a new library file, start by compiling all the required modules.
- For example:
-\newline
-\layout Standard
+\begin_inset Quotes srd
+\end_inset
+ or
+\begin_inset LatexCommand url
+target "http://sf.net/projects/fpgac"
-\family sans
-\series bold
-sdcc -c _divsint.c
-\layout Standard
+\end_inset
-\family sans
-\series bold
-sdcc -c _divuint.c
-\layout Standard
+\begin_inset LatexCommand index
+name "FpgaC ((subset of) C to FPGA compiler)"
+\end_inset
-\family sans
-\series bold
-sdcc -c _modsint.c
-\layout Standard
+
+\begin_inset Quotes sld
+\end_inset
+have you ever heard of an open source compiler that compiles a subset of
+ C for an FPGA?
+\begin_inset Quotes srd
+\end_inset
-\family sans
-\series bold
-sdcc -c _moduint.c
-\layout Standard
+ we expect you to have a quick look there and come back.
+ If you read this you are on the right track.
+\end_layout
+\begin_layout Itemize
+Some sections attribute more space to problems, restrictions and warnings
+ than to the solution.
+\end_layout
-\family sans
-\series bold
-sdcc -c _mulint.c
-\newline
+\begin_layout Itemize
+The installation section and the section about the debugger is intimidating.
+\end_layout
-\layout Standard
+\begin_layout Itemize
+There are still lots of typos and there are more different writing styles
+ than pictures.
+\end_layout
-This will create files _divsint.rel, _divuint.rel, _modsint.rel, _moduint.rel,
- and _mulint.rel.
- The next step is to add the .rel files to the library file:
-\newline
+\begin_layout Section
+Testing the SDCC Compiler
+\begin_inset LatexCommand label
+name "sec:Testing-the-SDCC"
-\layout Standard
+\end_inset
-\family sans
-\series bold
-sdcclib libint.lib _divsint.rel
-\family default
+\end_layout
-\begin_inset LatexCommand \index{sdcclib}
+\begin_layout Standard
+The first thing you should do after installing your SDCC compiler is to
+ see if it runs.
+ Type
+\family sans
+\series bold
+"sdcc -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\family sans
-\series bold
-sdcclib libint.lib _divuint.rel
-\layout Standard
+-version"
+\begin_inset LatexCommand index
+name "version"
+\end_inset
-\family sans
-\series bold
-sdcclib libint.lib _modsint.rel
-\layout Standard
+\family default
+\series default
+ at the prompt, and the program should run and output its version like:
+
+\newline
-\family sans
-\series bold
-sdcclib libint.lib _moduint.rel
-\layout Standard
+\family typewriter
+SDCC : mcs51/z80/avr/ds390/pic16/pic14/ds400/hc08 2.5.6 #4169 (May 8 2006)
+ (UNIX)
+\end_layout
+\begin_layout Standard
+If it doesn't run, or gives a message about not finding sdcc program, then
+ you need to check over your installation.
+ Make sure that the sdcc bin directory is in your executable search path
+ defined by the PATH environment setting (
+\series medium
+see
+\series default
+ section
+\begin_inset LatexCommand ref
+reference "sub:Install-Trouble-shooting"
-\family sans
-\series bold
-sdcclib libint.lib _mulint.rel
-\series default
+\end_inset
-\newline
+\InsetSpace ~
-\layout Standard
+\series medium
+Install trouble-shooting for suggestions
+\series default
+).
+ Make sure that the sdcc program is in the bin folder, if not perhaps something
+ did not install correctly.
+\newline
-If the file already exists in the library, it will be replaced.
- To see what modules and symbols are included in the library, options -s
- and -m are available.
- For example:
-\newline
+\newline
-\newline
+\series medium
+SDCC
+\series default
+ is commonly installed as described in section
+\begin_inset Quotes sld
+\end_inset
-\family sans
-\series bold
-sdcclib -s libint.lib
-\family default
+Install and search paths
+\begin_inset Quotes srd
+\end_inset
-\begin_inset LatexCommand \index{sdcclib}
+.
+\newline
-\end_inset
+\newline
+\series medium
+Make sure the compiler works on a very simple example.
+ Type in the following test.c program using your favorite
+\series default
+ ASCII
+\series medium
+editor:
+\end_layout
-\newline
+\begin_layout Verse
-\family typewriter
-\series default
-_divsint.rel:
-\layout Standard
+\family typewriter
+char test;
+\newline
+\newline
+void main(void) {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+test=0;
+\newline
+}
+\end_layout
-\family typewriter
-__divsint_a_1_1
-\layout Standard
+\begin_layout Standard
+\series medium
+Compile this using the following command:
+\series default
+
+\family sans
+\series bold
+"sdcc -c test.c".
-\family typewriter
-__divsint_PARM_2
-\layout Standard
+\family default
+\series default
+
+\series medium
+If all goes well, the compiler will generate a test.asm and test.rel file.
+ Congratulations, you've just compiled your first program with SDCC.
+ We used the -c option to tell SDCC not to link the generated code, just
+ to keep things simple for this step.
+\series default
+\newline
-\family typewriter
-__divsint
-\newline
-_divuint.rel:
-\layout Standard
+\newline
+\series medium
+The next step is to try it with the linker.
+ Type in
+\series default
+
+\family sans
+\series bold
+"sdcc test.c
+\family default
+\series default
+"
+\series medium
+.
+ If all goes well the compiler will link with the libraries and produce
+ a test.ihx output file.
+ If this step fails
+\series default
+
+\series medium
+(no test.ihx, and the linker generates warnings), then the problem is most
+ likely that
+\series default
+ SDCC
+\series medium
+cannot find the
+\series default
+ /
+\series medium
+usr/local/share/sdcc/lib directory
+\series default
+
+\series medium
+(see
+\series default
+ section
+\begin_inset LatexCommand ref
+reference "sub:Install-Trouble-shooting"
-\family typewriter
-__divuint_a_1_1
-\layout Standard
+\end_inset
+\InsetSpace ~
-\family typewriter
-__divuint_PARM_2
-\layout Standard
+\series medium
+Install trouble-shooting for suggestions).
+\series default
+\newline
-\family typewriter
-__divuint_reste_1_1
-\layout Standard
+\newline
+\series medium
+The final test is to ensure
+\series default
+ SDCC
+\series medium
+can use the
+\series default
+ standard
+\series medium
+header files and libraries.
+ Edit test.c and change it to the following:
+\end_layout
-\family typewriter
-__divuint_count_1_1
-\layout Standard
+\begin_layout Verse
+\family typewriter
+#include
+\newline
-\family typewriter
-__divuint
-\newline
-_modsint.rel:
-\layout Standard
+\newline
+char str1[10];
+\newline
+\newline
+void main(void) {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+strcpy(str1, "testing");
+\newline
+}
+\end_layout
-\family typewriter
-__modsint_a_1_1
-\layout Standard
+\begin_layout Standard
+\series medium
+Compile this by typing
+\series default
+
+\family sans
+\series bold
+"sdcc test.c"
+\family default
+\series medium
+.
+ This should generate a test.ihx output file, and it should give no warnings
+ such as not finding the string.h file.
+ If it cannot find the string.h file, then the problem is that
+\series default
+ SDCC
+\series medium
+cannot find the /usr/local/share/sdcc/include directory
+\series default
+
+\series medium
+(see the
+\series default
+ section
+\begin_inset LatexCommand ref
+reference "sub:Install-Trouble-shooting"
-\family typewriter
-__modsint_PARM_2
-\layout Standard
+\end_inset
+\InsetSpace ~
-\family typewriter
-__modsint
-\newline
-_moduint.rel:
-\layout Standard
+\series medium
+Install trouble-shooting section for suggestions).
+\series default
+ Use option
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-__moduint_a_1_1
-\layout Standard
+\begin_layout Standard
-\family typewriter
-__moduint_PARM_2
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\family typewriter
-__moduint_count_1_1
-\layout Standard
+-print-search-dirs
+\series default
+\begin_inset LatexCommand index
+name "-\\/-print-search-dirs"
-\family typewriter
-__moduint
-\newline
-_mulint.rel:
-\layout Standard
+\end_inset
+ to find exactly where SDCC is looking for the include and lib files.
+\end_layout
-\family typewriter
-__mulint_PARM_2
-\layout Standard
+\begin_layout Section
+Install Trouble-shooting
+\begin_inset LatexCommand label
+name "sub:Install-Trouble-shooting"
+\end_inset
-\family typewriter
-__mulint
-\family default
-\series bold
-\newline
+\begin_inset LatexCommand index
+name "Install trouble-shooting"
-\layout Standard
-\added_space_bottom bigskip
-If the source files are compiled using -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\end_layout
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+\begin_layout Subsection
+If SDCC does not build correctly
+\end_layout
-\end_inset
+\begin_layout Standard
+A thing to try is starting from scratch by unpacking the .tgz source package
+ again in an empty directory.
+ Configure it like:
+\newline
-, the corresponding debug information file .adb will be include in the library
- file as well.
- The library files created with sdcclib are plain text files, so they can
- be viewed with a text editor.
- It is not recomended to modify a library file created with sdcclib using
- a text editor, as there are file indexes numbers located accross the file
- used by the linker to quickly locate the required module to link.
- Once a .rel file (as well as a .adb file) is added to a library using sdcclib,
- it can be safely deleted, since all the information required for linking
- is embedded in the library file itself.
- Library files created using sdcclib are used as described in the preceding
- sections.
-\layout Section
+\newline
-Command Line Options
-\begin_inset LatexCommand \index{Command Line Options}
+\family sans
+\series bold
+./configure 2>&1 | tee configure.log
+\family default
+\series default
-\end_inset
+\newline
+\newline
+and build it like:
+\newline
-\layout Subsection
+\newline
-Processor Selection Options
-\begin_inset LatexCommand \index{Options processor selection}
+\family sans
+\series bold
+make 2>&1 | tee make.log
+\family default
+\series default
-\end_inset
+\newline
+\newline
+If anything goes wrong, you can review the log files to locate the problem.
+ Or a relevant part of this can be attached to an email that could be helpful
+ when requesting help from the mailing list.
+\end_layout
-\begin_inset LatexCommand \index{Processor selection options}
+\begin_layout Subsection
+What the
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+./configure
+\begin_inset Quotes srd
+\end_inset
+ does
+\end_layout
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+The
+\begin_inset Quotes sld
+\end_inset
+./configure
+\begin_inset Quotes srd
+\end_inset
-\series bold
--mmcs51
-\begin_inset LatexCommand \index{-mmcs51}
+ command is a script that analyzes your system and performs some configuration
+ to ensure the source package compiles on your system.
+ It will take a few minutes to run, and will compile a few tests to determine
+ what compiler features are installed.
+\end_layout
-\end_inset
+\begin_layout Subsection
+What the
+\begin_inset Quotes sld
+\end_inset
+make
+\begin_inset Quotes srd
+\end_inset
-\series default
- Generate code for the Intel MCS51
-\begin_inset LatexCommand \index{MCS51}
+ does
+\end_layout
-\end_inset
+\begin_layout Standard
+This runs the GNU make tool, which automatically compiles all the source
+ packages into the final installed binary executables.
+\end_layout
- family of processors.
- This is the default processor target.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Subsection
+What the
+\begin_inset Quotes sld
+\end_inset
+make install
+\begin_inset Quotes erd
+\end_inset
-\series bold
--mds390
-\begin_inset LatexCommand \index{-mds390}
+ command does.
+\end_layout
-\end_inset
+\begin_layout Standard
+This will install the compiler, other executables libraries and include
+ files into the appropriate directories.
+ See sections
+\begin_inset LatexCommand ref
+reference "sub:Install-paths"
+\end_inset
-\series default
- Generate code for the Dallas DS80C390
-\begin_inset LatexCommand \index{DS80C390}
+,\InsetSpace ~
-\end_inset
+\begin_inset LatexCommand ref
+reference "sub:Search-Paths"
- processor.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+\InsetSpace ~
+about install and search paths.
+\newline
+On most systems you will need super-user privilege
+s to do this.
+\end_layout
-\series bold
--mds400
-\begin_inset LatexCommand \index{-mds400}
+\begin_layout Section
+Components of SDCC
+\end_layout
-\end_inset
+\begin_layout Standard
+SDCC is not just a compiler, but a collection of tools by various developers.
+ These include linkers, assemblers, simulators and other components.
+ Here is a summary of some of the components.
+ Note that the included simulator and assembler have separate documentation
+ which you can find in the source package in their respective directories.
+ As SDCC grows to include support for other processors, other packages from
+ various developers are included and may have their own sets of documentation.
+\newline
+\newline
+You
+ might want to look at the files which are installed in .
+ At the time of this writing, we find the following programs for gcc-builds:
+\newline
-\series default
- Generate code for the Dallas DS80C400
-\begin_inset LatexCommand \index{DS80C400}
+
+\newline
+In /bin:
+\end_layout
-\end_inset
+\begin_layout Itemize
+sdcc - The compiler.
+\end_layout
- processor.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Itemize
+sdcpp - The C preprocessor.
+\end_layout
+\begin_layout Itemize
+asx8051 - The assembler for 8051 type processors.
+\end_layout
-\series bold
--mhc08
-\begin_inset LatexCommand \index{-mhc08}
+\begin_layout Itemize
+as-z80
+\series bold
+,
+\series default
+ as-gbz80 - The Z80 and GameBoy Z80 assemblers.
+\end_layout
-\end_inset
+\begin_layout Itemize
+aslink -The linker for 8051 type processors.
+\end_layout
+\begin_layout Itemize
+link-z80
+\series bold
+,
+\series default
+ link-gbz80 - The Z80 and GameBoy Z80 linkers.
+\end_layout
-\series default
- Generate code for the Freescale/Motorola HC08
-\begin_inset LatexCommand \index{HC08}
+\begin_layout Itemize
+s51 - The ucSim 8051 simulator.
+\end_layout
-\end_inset
+\begin_layout Itemize
+sdcdb - The source debugger.
+\end_layout
- family of processors.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Itemize
+packihx - A tool to pack (compress) Intel hex files.
+\end_layout
+\begin_layout Standard
+In /share/sdcc/include
+\end_layout
-\series bold
--mz80
-\begin_inset LatexCommand \index{-mz80}
+\begin_layout Itemize
+the include files
+\end_layout
-\end_inset
+\begin_layout Standard
+In /share/sdcc/lib
+\end_layout
+\begin_layout Itemize
+the subdirs src and small, large, z80, gbz80 and ds390 with the precompiled
+ relocatables.
+\end_layout
-\series default
- Generate code for the Zilog Z80
-\begin_inset LatexCommand \index{Z80}
+\begin_layout Standard
+In /share/sdcc/doc
+\end_layout
-\end_inset
+\begin_layout Itemize
+the documentation
+\end_layout
- family of processors.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+As development for other processors proceeds, this list will expand to include
+ executables to support processors like AVR, PIC, etc.
+\end_layout
+\begin_layout Subsection
+sdcc - The Compiler
+\end_layout
-\series bold
--mgbz80
-\begin_inset LatexCommand \index{-mgbz80}
+\begin_layout Standard
+This is the actual compiler, it in turn uses the c-preprocessor and invokes
+ the assembler and linkage editor.
+\end_layout
-\end_inset
+\begin_layout Subsection
+sdcpp - The C-Preprocessor
+\end_layout
+\begin_layout Standard
+The preprocessor
+\begin_inset LatexCommand index
+name "sdcpp (preprocessor)"
-\series default
- Generate code for the GameBoy Z80
-\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)}
+\end_inset
-\end_inset
+ is a modified version of the GNU cpp
+\begin_inset LatexCommand index
+name "cpp|see{sdcpp}"
- processor (Not actively maintained).
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ preprocessor
+\begin_inset LatexCommand url
+target "http://gcc.gnu.org/"
-\series bold
--mavr
-\begin_inset LatexCommand \index{-mavr}
+\end_inset
-\end_inset
+.
+ The C preprocessor is used to pull in #include sources, process #ifdef
+ statements, #defines and so on.
+\end_layout
+\begin_layout Subsection
+as
+\emph on
+xxxx
+\emph default
+, aslink, link-
+\emph on
+xxx
+\emph default
+ - The Assemblers and Linkage Editors
+\end_layout
-\series default
- Generate code for the Atmel AVR
-\begin_inset LatexCommand \index{AVR}
+\begin_layout Standard
+This is retargettable assembler & linkage editor, it was developed by Alan
+ Baldwin.
+ John Hartman created the version for 8051, and I (Sandeep) have made some
+ enhancements and bug fixes for it to work properly with SDCC.
+\end_layout
-\end_inset
+\begin_layout Subsection
+s51 - The Simulator
+\end_layout
- processor (Not maintained, not complete).
- AVR users should probably have a look at winavr
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/winavr}
+\begin_layout Standard
+S51
+\begin_inset LatexCommand index
+name "s51"
-\end_inset
+\end_inset
- or
-\begin_inset LatexCommand \url{http://www.avrfreaks.net/index.php?name=PNphpBB2&file=index}
+ is a free open source simulator developed by Daniel Drotos.
+ The simulator is built as part of the build process.
+ For more information visit Daniel's web site at:
+\begin_inset LatexCommand url
+target "http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51"
-\end_inset
+\end_inset
.
-\layout Comment
+ It currently supports the core mcs51, the Dallas DS80C390 and the Phillips
+ XA51 family.
+\end_layout
-I think it is fair to direct users there for now.
- Open source is also about avoiding unnecessary work .
- But I didn't find the 'official' link.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Subsection
+sdcdb - Source Level Debugger
+\end_layout
+\begin_layout Standard
+SDCDB
+\begin_inset LatexCommand index
+name "SDCDB (debugger)"
-\series bold
--mpic14
-\begin_inset LatexCommand \index{-mpic14}
+\end_inset
-\end_inset
+ is the companion source level debugger.
+ More about SDCDB in section
+\begin_inset LatexCommand ref
+reference "cha:Debugging-with-SDCDB"
+\end_inset
-\series default
- Generate code for the Microchip PIC 14
-\begin_inset LatexCommand \index{PIC14}
+.
+ The current version of the debugger uses Daniel's Simulator S51
+\begin_inset LatexCommand index
+name "s51"
-\end_inset
+\end_inset
--bit processors (p16f84 and variants.
- In development, not complete).
-\layout Comment
+, but can be easily changed to use other simulators.
+\end_layout
-p16f627 p16f628 p16f84 p16f873 p16f877?
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Chapter
+Using SDCC
+\end_layout
+\begin_layout Section
+Compiling
+\end_layout
-\series bold
--mpic16
-\begin_inset LatexCommand \index{-mpic16}
+\begin_layout Subsection
+Single Source File Projects
+\end_layout
-\end_inset
+\begin_layout Standard
+For single source file 8051 projects the process is very simple.
+ Compile your programs with the following command
+\family sans
+\series bold
+"sdcc sourcefile.c".
+\family default
+\series default
+ This will compile, assemble and link your source file.
+ Output files are as follows:
+\end_layout
-\series default
- Generate code for the Microchip PIC 16
-\begin_inset LatexCommand \index{PIC16}
+\begin_layout Itemize
+sourcefile.asm
+\begin_inset LatexCommand index
+name ".asm"
-\end_inset
+\end_inset
--bit processors (p18f452 and variants.
- In development, not complete).
-\layout List
-\labelwidthstring 00.00.0000
+ - Assembler source
+\begin_inset LatexCommand index
+name "Assembler source"
+\end_inset
-\series bold
--mtlcs900h
-\series default
- Generate code for the Toshiba TLCS-900H
-\begin_inset LatexCommand \index{TLCS-900H}
+ file created by the compiler
+\end_layout
-\end_inset
+\begin_layout Itemize
+sourcefile.lst
+\begin_inset LatexCommand index
+name ".lst"
- processor (Not maintained, not complete).
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\end_inset
+ - Assembler listing
+\begin_inset LatexCommand index
+name "Assembler listing"
-\series bold
--mxa51
-\begin_inset LatexCommand \index{-mxa51}
+\end_inset
-\end_inset
+ file created by the Assembler
+\end_layout
+\begin_layout Itemize
+sourcefile.rst
+\begin_inset LatexCommand index
+name ".rst"
-\series default
- Generate code for the Phillips XA51
-\begin_inset LatexCommand \index{XA51}
+\end_inset
-\end_inset
+ - Assembler listing
+\begin_inset LatexCommand index
+name "Assembler listing"
- processor (Not maintained, not complete).
-\layout Subsection
+\end_inset
-Preprocessor Options
-\begin_inset LatexCommand \index{Options preprocessor}
+ file updated with linkedit information, created by linkage editor
+\end_layout
-\end_inset
+\begin_layout Itemize
+sourcefile.sym
+\begin_inset LatexCommand index
+name ".sym"
+\end_inset
-\begin_inset LatexCommand \index{Preprocessor options}
+ - symbol listing
+\begin_inset LatexCommand index
+name "Symbol listing"
-\end_inset
+\end_inset
+ for the sourcefile, created by the assembler
+\end_layout
-\begin_inset LatexCommand \index{sdcpp (preprocessor)}
+\begin_layout Itemize
+sourcefile.rel
+\begin_inset LatexCommand index
+name ".rel"
-\end_inset
+\end_inset
+ or sourcefile.o
+\begin_inset LatexCommand index
+name ".o"
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ - Object file
+\begin_inset LatexCommand index
+name "Object file"
-\series bold
--I
-\begin_inset LatexCommand \index{-I}
+\end_inset
-\end_inset
+ created by the assembler, input to Linkage editor
+\end_layout
+\begin_layout Itemize
+sourcefile.map
+\begin_inset LatexCommand index
+name ".map"
-\series default
- The additional location where the pre processor will look for <..h> or
-\begin_inset Quotes eld
-\end_inset
+\end_inset
-..h
-\begin_inset Quotes erd
-\end_inset
+ - The memory map
+\begin_inset LatexCommand index
+name "Memory map"
- files.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ for the load module, created by the Linker
+\end_layout
-\series bold
--D
-\begin_inset LatexCommand \index{-D}
+\begin_layout Itemize
+sourcefile.mem
+\begin_inset LatexCommand index
+name ".mem"
-\end_inset
+\end_inset
+ - A file with a summary of the memory usage
+\end_layout
-\series default
- Command line definition of macros.
- Passed to the preprocessor.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Itemize
+sourcefile.ihx
+\begin_inset LatexCommand index
+name ".ihx"
+\end_inset
-\series bold
--M
-\begin_inset LatexCommand \index{-M}
+ - The load module in Intel hex format
+\begin_inset LatexCommand index
+name "Intel hex format"
-\end_inset
+\end_inset
+ (you can select the Motorola S19 format
+\begin_inset LatexCommand index
+name "Motorola S19 format"
-\series default
- Tell the preprocessor to output a rule suitable for make describing the
- dependencies of each object file.
- For each source file, the preprocessor outputs one make-rule whose target
- is the object file name for that source file and whose dependencies are
- all the files `#include'd in it.
- This rule may be a single line or may be continued with `
-\backslash
-'-newline if it is long.
- The list of rules is printed on standard output instead of the preprocessed
- C program.
- `-M' implies `-E
-\begin_inset LatexCommand \index{-E}
+\end_inset
-\end_inset
+ with -
+\begin_inset ERT
+status collapsed
-'.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
-\series bold
--C
-\begin_inset LatexCommand \index{-C}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-out-fmt-s19
+\begin_inset LatexCommand index
+name "-\\/-out-fmt-s19"
-\series default
- Tell the preprocessor not to discard comments.
- Used with the `-E' option.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+.
+ If you need another format you might want to use
+\family sans
+\shape italic
+objdump
+\family default
+\shape default
-\series bold
--MM
-\begin_inset LatexCommand \index{-MM}
+\begin_inset LatexCommand index
+name "objdump (tool)"
-\end_inset
+\end_inset
+ or
+\family sans
+\shape italic
+srecord
+\family default
+\shape default
-\size large
-\bar under
-
-\series default
-\size default
-\bar default
-Like `-M' but the output mentions only the user header files included with
- `#include
-\begin_inset Quotes eld
-\end_inset
+\begin_inset LatexCommand index
+name "srecord (bin, hex, ... tool)"
-file"'.
- System header files included with `#include ' are omitted.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-\series bold
--Aquestion(answer)
-\begin_inset LatexCommand \index{-Aquestion(answer)}
+\begin_inset Note Note
+status collapsed
-\end_inset
+\begin_layout Standard
+hyperlinks needed
+\end_layout
+\end_inset
-\series default
- Assert the answer answer for question, in case it is tested with a preprocessor
- conditional such as `#if #question(answer)'.
- `-A-' disables the standard assertions that normally describe the target
- machine.
-\layout List
-\labelwidthstring 00.00.0000
+ - see also section
+\begin_inset LatexCommand vref
+reference "sub:Postprocessing-the-Intel"
+\end_inset
-\series bold
--Umacro
-\begin_inset LatexCommand \index{-Umacro}
+).
+ Both formats are documented in the documentation of srecord
+\begin_inset LatexCommand index
+name "srecord (bin, hex, ... tool)"
-\end_inset
+\end_inset
-\series default
- Undefine macro macro.
- `-U' options are evaluated after all `-D' options, but before any `-include'
- and `-imacros' options.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
+\begin_layout Itemize
+sourcefile.adb
+\begin_inset LatexCommand index
+name ".adb"
-\series bold
--dM
-\begin_inset LatexCommand \index{-dM}
+\end_inset
-\end_inset
+ - An intermediate file containing debug information needed to create the
+ .cdb file (with -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\series default
- Tell the preprocessor to output only a list of the macro definitions that
- are in effect at the end of preprocessing.
- Used with the `-E' option.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
-\series bold
--dD
-\begin_inset LatexCommand \index{-dD}
+\end_inset
-\end_inset
+-debug
+\begin_inset LatexCommand index
+name "-\\/-debug"
+\end_inset
-\series default
- Tell the preprocessor to pass all macro definitions into the output, in
- their proper sequence in the rest of the output.
-\layout List
-\labelwidthstring 00.00.0000
+)
+\end_layout
+\begin_layout Itemize
+sourcefile.cdb
+\begin_inset LatexCommand index
+name ".cdb"
-\series bold
--dN
-\begin_inset LatexCommand \index{-dN}
+\end_inset
-\end_inset
+ - An optional file (with -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\size large
-\bar under
-
-\series default
-\size default
-\bar default
-Like `-dD' except that the macro arguments and contents are omitted.
- Only `#define name' is included in the output.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
-\series bold
--pedantic-parse-number
-\begin_inset LatexCommand \index{-pedantic-parse-number}
+\end_inset
-\end_inset
+-debug) containing debug information.
+ The format is documented in cdbfileformat.pdf
+\end_layout
+\begin_layout Itemize
+sourcefile.
+ - (no extension)
+\begin_inset LatexCommand index
+name " (no extension)"
-\size large
-\bar under
-
-\series default
-\size default
-\bar default
-Pedentic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly
- and the macro LO_B(3) gets expanded.
- See also #pragma pedantic_parse_number in section
-\begin_inset LatexCommand \ref{sec:Pragmas}
+\end_inset
-\end_inset
+ An optional AOMF or AOMF51
+\begin_inset LatexCommand index
+name "AOMF, AOMF51"
-
-\emph on
-Note: this functionality is not in conformance with standard!
+\end_inset
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+
+\begin_inset LatexCommand label
+name "OMF file"
+\end_inset
-\series bold
--Wp\SpecialChar ~
-preprocessorOption[,preprocessorOption]
-\series default
+file containing debug information (generated with option -
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{-Wp preprocessorOption[,preprocessorOption]}
+\begin_layout Standard
-\end_inset
-...
- Pass the preprocessorOption to the preprocessor
-\family typewriter
-sdcpp
-\family default
+\backslash
+/
+\end_layout
-\begin_inset LatexCommand \index{sdcpp (preprocessor)}
+\end_inset
-\end_inset
+-debug).
+ The (Intel)
+\emph on
+a
+\emph default
+bsolute
+\emph on
+o
+\emph default
+bject
+\emph on
+m
+\emph default
+odule
+\emph on
+f
+\emph default
+ormat is a subformat of the OMF51 format and is commonly used by third party
+ tools (debuggers
+\begin_inset LatexCommand index
+name "Debugger"
-.
- SDCC uses an adapted version of the preprocessor
-\emph on
-cpp
-\emph default
- of the GNU Compiler Collection
-\begin_inset LatexCommand \index{gcc (GNU Compiler Collection)}
+\end_inset
-\end_inset
+, simulators, emulators).
+\end_layout
- (
-\emph on
-gcc
-\emph default
-
-\begin_inset LatexCommand \url{http://gcc.gnu.org/}
+\begin_layout Itemize
+sourcefile.dump*
+\begin_inset LatexCommand index
+name ".dump*"
-\end_inset
+\end_inset
-), if you need more dedicated options please refer to the GCC\SpecialChar ~
-4.1.1\SpecialChar ~
-CPP\SpecialChar ~
-Manual
- at
-\begin_inset LatexCommand \htmlurl{http://www.gnu.org/software/gcc/onlinedocs/}
+ - Dump file to debug the compiler it self (generated with option -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-.
-\layout Subsection
-Linker Options
-\begin_inset LatexCommand \index{Options linker}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-dumpall) (see section
+\begin_inset LatexCommand ref
+reference "sub:Intermediate-Dump-Options"
-\begin_inset LatexCommand \index{Linker options}
+\end_inset
-\end_inset
+\InsetSpace ~
+ and section
+\begin_inset LatexCommand ref
+reference "sub:The-anatomy-of"
+\end_inset
-\layout List
-\labelwidthstring 00.00.0000
+\InsetSpace ~
+\begin_inset Quotes sld
+\end_inset
-\series bold
--L\SpecialChar ~
--
-\series default
+Anatomy of the compiler
+\begin_inset Quotes srd
+\end_inset
-\begin_inset ERT
-status Collapsed
+).
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Postprocessing the Intel Hex
+\begin_inset LatexCommand index
+name "Intel hex format"
-\backslash
-/
-\end_inset
+\end_inset
+ file
+\begin_inset LatexCommand label
+name "sub:Postprocessing-the-Intel"
-\series bold
--lib-path
-\begin_inset LatexCommand \index{-\/-lib-path }
+\end_inset
-\end_inset
+\end_layout
-\begin_inset LatexCommand \index{-L -\/-lib-path}
+\begin_layout Standard
+In most cases this won't be needed but the Intel Hex file
+\begin_inset LatexCommand index
+name ".ihx"
-\end_inset
+\end_inset
+ which is generated by SDCC might include lines of varying length and the
+ addresses within the file are not guaranteed to be strictly ascending.
+ If your toolchain or a bootloader does not like this you can use the tool
+
+\family typewriter
+packihx
+\family default
-\series default
-\SpecialChar ~
- This option is passed to the linkage
- editor's additional libraries
-\begin_inset LatexCommand \index{Libraries}
+\begin_inset LatexCommand index
+name "packihx (tool)"
-\end_inset
+\end_inset
- search path.
- The path name must be absolute.
- Additional library files may be specified in the command line.
- See section Compiling programs for more details.
-\layout List
-\labelwidthstring 00.00.0000
+ which is part of the SDCC distribution:
+\newline
+\newline
+
+\family sans
+\series bold
+packihx sourcefile.ihx >sourcefile.hex
+\family default
+\series default
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\newline
+The separately available
+\emph on
+srecord
+\emph default
-\backslash
-/
-\end_inset
+\begin_inset LatexCommand index
+name "srecord (bin, hex, ... tool)"
--xram-loc
-\series default
+\end_inset
-\begin_inset LatexCommand \index{-\/-xram-loc }
+ package additionally allows to set undefined locations to a predefined
+ value, to insert checksums
+\begin_inset LatexCommand index
+name "checksum"
-\end_inset
+\end_inset
-\SpecialChar ~
- The start location of the external ram
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+ of various flavours (crc, add, xor) and to perform other manipulations
+ (convert, split, crop, offset, ...).
+
+\newline
-\end_inset
+\newline
-, default value is 0.
- The value entered can be in Hexadecimal or Decimal format, e.g.: -
-\begin_inset ERT
-status Collapsed
+\family sans
+\series bold
+srec_cat\InsetSpace ~
+\InsetSpace ~
+sourcefile.ihx -intel\InsetSpace ~
+\InsetSpace ~
+-o sourcefile.hex -intel
+\newline
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\family default
+\series default
+An example for a more complex command line
+\begin_inset Foot
+status open
--xram-loc 0x8000 or -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+the command backfills
+\begin_inset LatexCommand index
+name "backfill unused memory"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+ unused memory with 0x12 and the overall 16 bit sum of the complete 64 kByte
+ block is zero.
+ If the program counter on an mcs51 runs wild the backfill pattern 0x12
+ will be interpreted as an
+\family typewriter
+lcall
+\family default
+ to address
+\family typewriter
+0x1212
+\family default
+ (where an emergency routine could sit).
+\end_layout
--xram-loc 32768.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ could look like:
+\newline
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\family sans
+\series bold
+\size footnotesize
+srec_cat\InsetSpace ~
+sourcefile.ihx -intel\InsetSpace ~
+\InsetSpace ~
+-fill 0x12 0x0000 0xfffe\InsetSpace ~
+-little-endian-checksum-nega
+tive 0xfffe 0x02 0x02\InsetSpace ~
+\InsetSpace ~
+-o sourcefile.hex -intel
+\size default
-\backslash
-/
-\end_inset
+\newline
--code-loc
-\series default
+\newline
-\begin_inset LatexCommand \index{-\/-code-loc }
+\family default
+\series default
+The srecord package is available at
+\begin_inset LatexCommand url
+target "http://sf.net/projects/srecord"
-\end_inset
+\end_inset
-\SpecialChar ~
- The start location of the code
-\begin_inset LatexCommand \index{code}
+ .
+\end_layout
-\end_inset
+\begin_layout Subsection
+Projects with Multiple Source Files
+\end_layout
- segment, default value 0.
- Note when this option is used the interrupt vector table
-\begin_inset LatexCommand \index{interrupt vector table}
+\begin_layout Standard
+SDCC can compile only ONE file at a time.
+ Let us for example assume that you have a project containing the following
+ files:
+\newline
-\end_inset
+\newline
+foo1.c (contains some functions)
+\newline
+foo2.c (contains some more functions)
+\newline
+foomai
+n.c (contains more functions and the function main)
+\newline
- is also relocated to the given address.
- The value entered can be in Hexadecimal or Decimal format, e.g.: -
-\begin_inset ERT
-status Collapsed
+\size footnotesize
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\size default
+The first two files will need to be compiled separately with the commands:
+\size footnotesize
+
+\size default
--code-loc 0x8000 or -
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\family sans
+\series bold
+sdcc\InsetSpace ~
+-c\InsetSpace ~
+foo1.c
+\family default
+\series default
+\size footnotesize
--code-loc 32768.
-\layout List
-\labelwidthstring 00.00.0000
+\newline
+\family sans
+\series bold
+\size default
+sdcc\InsetSpace ~
+-c\InsetSpace ~
+foo2.c
+\family default
+\series default
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\newline
+Then compile the source file containing the
+\emph on
+main()
+\emph default
+ function and link
+\begin_inset LatexCommand index
+name "Linker"
-\backslash
-/
-\end_inset
+\end_inset
--stack-loc
-\series default
+ the files together with the following command:
+\newline
-\begin_inset LatexCommand \index{-\/-stack-loc }
+\newline
-\end_inset
+\family sans
+\series bold
+sdcc\InsetSpace ~
+foomain.c\InsetSpace ~
+foo1.rel\InsetSpace ~
+foo2.rel
+\family default
+\series default
-\SpecialChar ~
- By default the stack
-\begin_inset LatexCommand \index{stack}
+\begin_inset LatexCommand index
+name ".rel"
-\end_inset
+\end_inset
- is placed after the data segment.
- Using this option the stack can be placed anywhere in the internal memory
- space of the 8051.
- The value entered can be in Hexadecimal or Decimal format, e.g.
- -
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\newline
+Alternatively,
+\emph on
+foomain.c
+\emph default
+ can be separately compiled as well:
+\family sans
+\series bold
--stack-loc 0x20 or -
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\newline
+sdcc\InsetSpace ~
+-c\InsetSpace ~
+foomain.c
+\newline
+sdcc foomain.rel foo1.rel foo2.rel
+\newline
-\backslash
-/
-\end_inset
+\newline
--stack-loc 32.
- Since the sp register is incremented before a push or call, the initial
- sp will be set to one byte prior the provided value.
- The provided value should not overlap any other memory areas such as used
- register banks or the data segment and with enough space for the current
- application.
- The
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\family default
+\series default
+The file containing the
+\emph on
+main()
+\emph default
+ function
+\noun on
+must
+\noun default
+ be the
+\noun on
+first
+\noun default
+ file specified in the command line, since the linkage editor processes
+ file in the order they are presented to it.
+ The linker is invoked from SDCC using a script file with extension .lnk
+\begin_inset LatexCommand index
+name ".lnk"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+.
+ You can view this file to troubleshoot linking problems such as those arising
+ from missing libraries.
+\end_layout
--pack-iram
-\series default
-\SpecialChar ~
+\begin_layout Subsection
+Projects with Additional Libraries
+\begin_inset LatexCommand index
+name "Libraries"
-\begin_inset LatexCommand \index{-\/-pack-iram}
+\end_inset
-\end_inset
- option (which is now a default setting) will override this setting, so
- you should also specify the
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\begin_layout Standard
+Some reusable routines may be compiled into a library, see the documentation
+ for the assembler and linkage editor (which are in /share/sdcc/doc)
+ for how to create a
+\emph on
+.lib
+\begin_inset LatexCommand index
+name ".lib"
-\backslash
-/
-\end_inset
+\end_inset
--no-pack-iram
-\series default
-\SpecialChar ~
-\begin_inset LatexCommand \index{-\/-no-pack-iram}
+\emph default
+ library file.
+ Libraries created in this manner can be included in the command line.
+ Make sure you include the -L option to tell the linker where
+ to look for these files if they are not in the current directory.
+ Here is an example, assuming you have the source file
+\emph on
+foomain.c
+\emph default
+ and a library
+\emph on
+foolib.lib
+\emph default
+ in the directory
+\emph on
+mylib
+\emph default
+ (if that is not the same as your current project):
+\newline
-\end_inset
+\newline
- option if you need to manually place the stack.
-\layout List
-\labelwidthstring 00.00.0000
+\family sans
+\series bold
+sdcc foomain.c foolib.lib -L mylib
+\newline
+\newline
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\family default
+\series default
+Note here that
+\emph on
+mylib
+\emph default
+ must be an absolute path name.
+\newline
-\layout Standard
+\newline
+The most efficient way to use libraries is
+ to keep separate modules in separate source files.
+ The lib file now should name all the modules.rel
+\begin_inset LatexCommand index
+name ".rel"
-\backslash
-/
-\end_inset
+\end_inset
--xstack-loc
-\series default
+ files.
+ For an example see the standard library file
+\emph on
+libsdcc.lib
+\emph default
+ in the directory /share/lib/small.
+\end_layout
-\begin_inset LatexCommand \index{-\/-xstack-loc }
+\begin_layout Subsection
+Using sdcclib to Create and Manage Libraries
+\begin_inset LatexCommand index
+name "sdcclib"
-\end_inset
+\end_inset
-\SpecialChar ~
- By default the external stack
-\begin_inset LatexCommand \index{xstack}
-\end_inset
+\end_layout
- is placed after the pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
+\begin_layout Standard
+Alternatively, instead of having a .rel file for each entry on the library
+ file as described in the preceding section, sdcclib can be used to embed
+ all the modules belonging to such library in the library file itself.
+ This results in a larger library file, but it greatly reduces the number
+ of disk files accessed by the linker.
+ Additionally, the packed library file contains an index of all include
+ modules and symbols that significantly speeds up the linking process.
+ To display a list of options supported by sdcclib type:
+\newline
-\end_inset
+\end_layout
- segment.
- Using this option the xstack can be placed anywhere in the external memory
- space of the 8051.
- The value entered can be in Hexadecimal or Decimal format, e.g.
- -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+sdcclib -?
+\begin_inset LatexCommand index
+name "sdcclib"
-\backslash
-/
-\end_inset
+\end_inset
--xstack-loc 0x8000 or -
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\newline
--stack-loc 32768.
- The provided value should not overlap any other memory areas such as the
- pdata or xdata segment and with enough space for the current application.
-\layout List
-\labelwidthstring 00.00.0000
+\family default
+\series default
+To create a new library file, start by compiling all the required modules.
+ For example:
+\newline
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+sdcc -c _divsint.c
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--data-loc
-\series default
+\family sans
+\series bold
+sdcc -c _divuint.c
+\end_layout
-\begin_inset LatexCommand \index{-\/-data-loc }
+\begin_layout Standard
-\end_inset
+\family sans
+\series bold
+sdcc -c _modsint.c
+\end_layout
-\SpecialChar ~
- The start location of the internal ram data
-\begin_inset LatexCommand \index{data (mcs51, ds390 storage class)}
+\begin_layout Standard
-\end_inset
+\family sans
+\series bold
+sdcc -c _moduint.c
+\end_layout
- segment.
- The value entered can be in Hexadecimal or Decimal format, eg.
- -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+sdcc -c _mulint.c
+\newline
-\backslash
-/
-\end_inset
+\end_layout
--data-loc 0x20 or -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+This will create files _divsint.rel, _divuint.rel, _modsint.rel, _moduint.rel,
+ and _mulint.rel.
+ The next step is to add the .rel files to the library file:
+\newline
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--data-loc 32.
- (By default, the start location of the internal ram data segment is set
- as low as possible in memory, taking into account the used register banks
- and the bit segment at address 0x20.
- For example if register banks 0 and 1 are used without bit variables, the
- data segment will be set, if -
-\begin_inset ERT
-status Collapsed
+\family sans
+\series bold
+sdcclib libint.lib _divsint.rel
+\family default
-\layout Standard
+\begin_inset LatexCommand index
+name "sdcclib"
-\backslash
-/
-\end_inset
+\end_inset
--data-loc is not used, to location 0x10.)
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+sdcclib libint.lib _divuint.rel
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--idata-loc
-\series default
+\family sans
+\series bold
+sdcclib libint.lib _modsint.rel
+\end_layout
-\begin_inset LatexCommand \index{-\/-idata-loc }
+\begin_layout Standard
-\end_inset
+\family sans
+\series bold
+sdcclib libint.lib _moduint.rel
+\end_layout
-\SpecialChar ~
- The start location of the indirectly addressable internal ram
-\begin_inset LatexCommand \index{idata (mcs51, ds390 storage class)}
+\begin_layout Standard
-\end_inset
+\family sans
+\series bold
+sdcclib libint.lib _mulint.rel
+\family default
+\series default
- of the 8051, default value is 0x80.
- The value entered can be in Hexadecimal or Decimal format, eg.
- -
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Or, if you preffer:
+\family sans
+\series bold
--idata-loc 0x88 or -
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--idata-loc 136.
-\layout List
-\labelwidthstring 00.00.0000
+\family sans
+\series bold
+sdcclib libint.lib _divsint.rel _divuint.rel _modsint.rel _moduint.rel _mulint.rel
+\family default
+\series default
+\newline
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\begin_layout Standard
+If the file already exists in the library, it will be replaced.
+ If a list of .rel files is available, you can tell sdcclib to add those
+ files to a library.
+ For example, if the file 'myliblist.txt' contains
+\family sans
+\series bold
-\backslash
-/
-\end_inset
+\newline
--bit-loc
-\series default
-\SpecialChar ~
- The start location of the bit
-\begin_inset LatexCommand \index{bit}
+\end_layout
-\end_inset
+\begin_layout Standard
- addressable internal ram of the 8051.
- This is
-\emph on
-not
-\emph default
- implemented yet.
- Instead an option can be passed directly to the linker: -Wl\SpecialChar ~
--bBSEG=.
-\layout List
-\labelwidthstring 00.00.0000
+\family sans
+\series bold
+_divsint.rel
+\end_layout
+\begin_layout Standard
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\family sans
+\series bold
+_divuint.rel
+\end_layout
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
+\family sans
+\series bold
+_modsint.rel
+\end_layout
--out-fmt-ihx
-\begin_inset LatexCommand \index{-\/-out-fmt-ihx}
+\begin_layout Standard
-\end_inset
+\family sans
+\series bold
+_moduint.rel
+\end_layout
+\begin_layout Standard
-\bar under
-
-\series default
-\bar default
-The linker output (final object code) is in Intel Hex format.
-\begin_inset LatexCommand \index{Intel hex format}
+\family sans
+\series bold
+_mulint.rel
+\family default
+\series default
-\end_inset
+\newline
- This is the default option.
- The format itself is documented in the documentation of srecord
-\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
+\end_layout
-\end_inset
+\begin_layout Standard
+Use
+\family sans
+\series bold
-.
-\layout List
-\labelwidthstring 00.00.0000
+\newline
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+sdcclib -l libint.lib myliblist.txt
+\family default
+\series default
-\backslash
-/
-\end_inset
+\newline
--out-fmt-s19
-\begin_inset LatexCommand \index{-\/-out-fmt-s19}
+\end_layout
-\end_inset
+\begin_layout Standard
+Additionally, you can instruct sdcclib to compiles the files before adding
+ them to the library.
+ This is achieved using the environment variables SDCCLIB_CC and/or SDCCLIB_AS.
+ For example:
+\family sans
+\series bold
+\newline
-\bar under
-
-\series default
-\bar default
-The linker output (final object code) is in Motorola S19 format
-\begin_inset LatexCommand \index{Motorola S19 format}
+\end_layout
-\end_inset
+\begin_layout Standard
-.
- The format itself is documented in the documentation of srecord.
-\layout List
-\labelwidthstring 00.00.0000
+\family sans
+\series bold
+set SDCCLIB_CC=sdcc -c
+\end_layout
+\begin_layout Standard
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\family sans
+\series bold
+sdcclib -l libint.lib myliblist.txt
+\family default
+\series default
-\layout Standard
+\newline
-\backslash
-/
-\end_inset
+\end_layout
--out-fmt-elf
-\begin_inset LatexCommand \index{-\/-out-fmt-s19}
+\begin_layout Standard
+To see what modules and symbols are included in the library, options -s
+ and -m are available.
+ For example:
+\newline
-\end_inset
+\newline
+\family sans
+\series bold
+sdcclib -s libint.lib
+\family default
-\begin_inset LatexCommand \index{HC08!Options!-\/-out-fmt-elf}
+\begin_inset LatexCommand index
+name "sdcclib"
-\end_inset
+\end_inset
-\bar under
-
-\series default
-\bar default
-The linker output (final object code) is in ELF format
-\begin_inset LatexCommand \index{ELF format}
+\newline
-\end_inset
+\family typewriter
+\series default
+_divsint.rel:
+\end_layout
-.
- (Currently only supported for the HC08
-\begin_inset LatexCommand \index{HC08}
+\begin_layout Standard
-\end_inset
+\family typewriter
+__divsint_a_1_1
+\end_layout
- processors)
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\begin_layout Standard
+\family typewriter
+__divsint_PARM_2
+\end_layout
-\series bold
--Wl\SpecialChar ~
-linkOption[,linkOption]
-\series default
+\begin_layout Standard
-\begin_inset LatexCommand \index{-Wl linkOption[,linkOption]}
+\family typewriter
+__divsint
+\newline
+_divuint.rel:
+\end_layout
-\end_inset
+\begin_layout Standard
-...
- Pass the linkOption to the linker.
- If a bootloader is used an option like
-\begin_inset Quotes sld
-\end_inset
+\family typewriter
+__divuint_a_1_1
+\end_layout
--Wl\SpecialChar ~
--bCSEG=0x1000
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
- would be typical to set the start of the code segment.
- See also #pragma constseg and #pragma codeseg in section
-\begin_inset LatexCommand \ref{sec:Pragmas}
+\family typewriter
+__divuint_PARM_2
+\end_layout
-\end_inset
+\begin_layout Standard
- .
- File sdcc/as/doc/asxhtm.html has more on linker options.
-\layout Subsection
+\family typewriter
+__divuint_reste_1_1
+\end_layout
-MCS51 Options
-\begin_inset LatexCommand \index{Options MCS51}
+\begin_layout Standard
-\end_inset
+\family typewriter
+__divuint_count_1_1
+\end_layout
+\begin_layout Standard
-\begin_inset LatexCommand \index{MCS51 options}
+\family typewriter
+__divuint
+\newline
+_modsint.rel:
+\end_layout
-\end_inset
+\begin_layout Standard
+\family typewriter
+__modsint_a_1_1
+\end_layout
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+\family typewriter
+__modsint_PARM_2
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family typewriter
+__modsint
+\newline
+_moduint.rel:
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--model-small
-\begin_inset LatexCommand \index{-\/-model-small}
+\family typewriter
+__moduint_a_1_1
+\end_layout
-\end_inset
+\begin_layout Standard
+\family typewriter
+__moduint_PARM_2
+\end_layout
-\series default
-\size large
-\emph on
-
-\size default
-\emph default
-Generate code for Small Model programs, see section Memory Models for more
- details.
- This is the default model.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+\family typewriter
+__moduint_count_1_1
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family typewriter
+__moduint
+\newline
+_mulint.rel:
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--model-medium
-\begin_inset LatexCommand \index{-\/-model-medium}
+\family typewriter
+__mulint_PARM_2
+\end_layout
-\end_inset
+\begin_layout Standard
+\family typewriter
+__mulint
+\family default
+\series bold
-\series default
- Generate code for Medium model programs, see section Memory Models for
- more details.
- If this option is used all source files in the project have to be compiled
- with this option.
- It must also be used when invoking the linker.
-\layout List
-\labelwidthstring 00.00.0000
+\newline
+\end_layout
-\series bold
--
+\begin_layout Standard
+If the source files are compiled using -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--model-large
-\begin_inset LatexCommand \index{-\/-model-large}
+\end_inset
-\end_inset
+-debug
+\begin_inset LatexCommand index
+name "-\\/-debug"
+\end_inset
-\series default
- Generate code for Large model programs, see section Memory Models for more
- details.
- If this option is used all source files in the project have to be compiled
- with this option.
- It must also be used when invoking the linker.
-\layout List
-\labelwidthstring 00.00.0000
+, the corresponding debug information file .adb will be include in the library
+ file as well.
+ The library files created with sdcclib are plain text files, so they can
+ be viewed with a text editor.
+ It is not recommended to modify a library file created with sdcclib using
+ a text editor, as there are file indexes numbers located across the file
+ used by the linker to quickly locate the required module to link.
+ Once a .rel file (as well as a .adb file) is added to a library using sdcclib,
+ it can be safely deleted, since all the information required for linking
+ is embedded in the library file itself.
+ Library files created using sdcclib are used as described in the preceding
+ sections.
+\end_layout
+\begin_layout Subsection
+Using ar to Create and Manage Libraries
+\begin_inset LatexCommand index
+name "ar"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\end_layout
--xstack
-\begin_inset LatexCommand \index{-\/-xstack}
+\begin_layout Standard
+Support for ar format libraries was introduced in sdcc 2.9.0.
+ Ar is a standard archive managing utility on unices (Linux, Mac OS X, several
+ unix flavors) so it is not included in the sdcc package.
+\series bold
-\end_inset
+\newline
+\newline
-\series default
- Uses a pseudo stack in the pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
+\series default
+For Windows platform you can find ar utility in GNU binutils package included
+ in several projects: Cygwin at
+\begin_inset LatexCommand url
+target "http://www.cygwin.com/"
-\end_inset
+\end_inset
- area (usually the first 256 bytes in the external ram) for allocating variables
- and passing parameters.
- See section
-\begin_inset LatexCommand \ref{sub:External-Stack}
+, MinGW at
+\begin_inset LatexCommand url
+target "http://www.mingw.org/"
-\end_inset
+\end_inset
-\SpecialChar ~
- External Stack for more details.
-\layout List
-\labelwidthstring 00.00.0000
+.
+\series bold
+\newline
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\newline
-\layout Standard
+\series default
+Both the GNU and BSD ar format variants are suppurated by asxxxx linkers.
+ Ar doesn't understand the asxxxx object file format, so there is a special
+ version of ranlib distributed with sdcc, called asranlib, which produces
+ the ar symbol lookup table.
+\series bold
-\backslash
-/
-\end_inset
+\newline
--iram-size
-\series default
-\SpecialChar ~
-
-\begin_inset LatexCommand \index{-\/-iram-size }
+\newline
-\end_inset
+\series default
+To create a library containing asxxxx object files, you should use the following
+ sequence:
+\series bold
- Causes the linker to check if the internal ram usage is within limits of
- the given value.
-\layout List
-\labelwidthstring 00.00.0000
+\newline
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
+\family sans
+\series bold
+ar -Sq .lib
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
--xram-size
-\series default
-\SpecialChar ~
-
-\begin_inset LatexCommand \index{-\/-xram-size }
+\family sans
+\series bold
+asranlib .lib
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
- Causes the linker to check if the external ram usage is within limits of
- the given value.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Section
+Command Line Options
+\begin_inset LatexCommand index
+name "Command Line Options"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--code-size
-\series default
-\SpecialChar ~
-
-\begin_inset LatexCommand \index{-\/-code-size }
+\begin_inset LatexCommand label
+name "sec:Command-Line-Options"
-\end_inset
+\end_inset
- Causes the linker to check if the code memory usage is within limits of
- the given value.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Subsection
+Processor Selection Options
+\begin_inset LatexCommand index
+name "Options processor selection"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--stack-size
-\series default
-\SpecialChar ~
-
-\begin_inset LatexCommand \index{-\/-stack-size }
+\begin_inset LatexCommand index
+name "Processor selection options"
-\end_inset
+\end_inset
- Causes the linker to check if there is at minimum bytes for stack.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+-mmcs51
+\begin_inset LatexCommand index
+name "-mmcs51"
-\backslash
-/
-\end_inset
+\end_inset
--pack-iram
-\series default
-\SpecialChar ~
-\begin_inset LatexCommand \index{-\/-pack-iram}
+\series default
+ Generate code for the Intel MCS51
+\begin_inset LatexCommand index
+name "MCS51"
-\end_inset
+\end_inset
- Causes the linker to use unused register banks for data variables and pack
- data, idata and stack together.
- This is the default now.
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+ family of processors.
+ This is the default processor target.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\series bold
+-mds390
+\begin_inset LatexCommand index
+name "-mds390"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--no-pack-iram
-\series default
-\SpecialChar ~
+\series default
+ Generate code for the Dallas DS80C390
+\begin_inset LatexCommand index
+name "DS80C390"
-\begin_inset LatexCommand \index{-\/-no-pack-iram}
+\end_inset
-\end_inset
+ processor.
+\end_layout
- Causes the linker to use old style for allocating memory areas.
-\layout Subsection
+\begin_layout List
+\labelwidthstring 00.00.0000
-DS390 / DS400 Options
-\begin_inset LatexCommand \index{Options DS390}
+\series bold
+-mds400
+\begin_inset LatexCommand index
+name "-mds400"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{DS390}
+\series default
+ Generate code for the Dallas DS80C400
+\begin_inset LatexCommand index
+name "DS80C400"
-\end_inset
+\end_inset
+ processor.
+\end_layout
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-mhc08
+\begin_inset LatexCommand index
+name "-mhc08"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+ Generate code for the Freescale/Motorola HC08
+\begin_inset LatexCommand index
+name "HC08"
--model-flat24
-\series default
+\end_inset
-\begin_inset LatexCommand \index{DS390!Options!-\/-model-flat24}
+ family of processors.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-mz80
+\begin_inset LatexCommand index
+name "-mz80"
-\size large
-\emph on
-
-\size default
-\emph default
-Generate 24-bit flat mode code.
- This is the one and only that the ds390 code generator supports right now
- and is default when using
-\emph on
--mds390
-\emph default
-.
- See section Memory Models for more details.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-\series bold
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--protect-sp-update
-\begin_inset LatexCommand \index{DS390!Options!-\/-protect-sp-update}
+\series default
+ Generate code for the Zilog Z80
+\begin_inset LatexCommand index
+name "Z80"
-\end_inset
+\end_inset
+ family of processors.
+\end_layout
-\series default
- disable interrupts during ESP:SP updates.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-mgbz80
+\begin_inset LatexCommand index
+name "-mgbz80"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+ Generate code for the GameBoy Z80
+\begin_inset LatexCommand index
+name "gbz80 (GameBoy Z80)"
--stack-10bit
-\series default
+\end_inset
-\begin_inset LatexCommand \index{DS390!Options!-\/-stack-10bit}
+ processor (Not actively maintained).
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- Generate code for the 10 bit stack mode of the Dallas DS80C390 part.
- This is the one and only that the ds390 code generator supports right now
- and is default when using
-\emph on
--mds390
-\emph default
-.
- In this mode, the stack is located in the lower 1K of the internal RAM,
- which is mapped to 0x400000.
- Note that the support is incomplete, since it still uses a single byte
- as the stack pointer.
- This means that only the lower 256 bytes of the potential 1K stack space
- will actually be used.
- However, this does allow you to reclaim the precious 256 bytes of low RAM
- for use for the DATA and IDATA segments.
- The compiler will not generate any code to put the processor into 10 bit
- stack mode.
- It is important to ensure that the processor is in this mode before calling
- any re-entrant functions compiled with this option.
- In principle, this should work with the
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\series bold
+-mavr
+\begin_inset LatexCommand index
+name "-mavr"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\series default
+ Generate code for the Atmel AVR
+\begin_inset LatexCommand index
+name "AVR"
-\end_inset
+\end_inset
+ processor (Not maintained, not complete).
+ AVR users should probably have a look at winavr
+\begin_inset LatexCommand url
+target "http://sourceforge.net/projects/winavr"
-\emph default
- option, but that has not been tested.
- It is incompatible with the
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ or
+\begin_inset LatexCommand url
+target "http://www.avrfreaks.net/index.php?name=PNphpBB2&file=index"
-\backslash
-/
-\end_inset
+\end_inset
--xstack
-\begin_inset LatexCommand \index{-\/-xstack}
+, which is based on AVR-port of the gcc compiler.
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
+\begin_layout Standard
+I think it is fair to direct users there for now.
+ Open source is also about avoiding unnecessary work .
+ But I didn't find the 'official' link.
+\end_layout
-\emph default
- option.
- It also only makes sense if the processor is in 24 bit contiguous addressing
- mode (see the
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\end_layout
--model-flat24 option
-\emph default
-).
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-mpic14
+\begin_inset LatexCommand index
+name "-mpic14"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+ Generate code for the Microchip PIC 14
+\begin_inset LatexCommand index
+name "PIC14"
--stack-probe
-\begin_inset LatexCommand \index{DS390!Options!-\/-stack-probe}
+\end_inset
-\end_inset
+-bit processors (p16f84 and variants.
+ In development, not complete).
+\end_layout
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
-\series default
- insert call to function __stack_probe at each function prologue.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+p16f627 p16f628 p16f84 p16f873 p16f877?
+\end_layout
+\end_inset
-\series bold
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
--tini-libid
-\begin_inset LatexCommand \index{DS390!Options!-\/-tini-libid}
+\series bold
+-mpic16
+\begin_inset LatexCommand index
+name "-mpic16"
-\end_inset
+\end_inset
-\series default
- LibraryID used in -mTININative.
-
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\series default
+ Generate code for the Microchip PIC 16
+\begin_inset LatexCommand index
+name "PIC16"
+\end_inset
-\series bold
--
-\begin_inset ERT
-status Collapsed
+-bit processors (p18f452 and variants.
+ In development, not complete).
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-\backslash
-/
-\end_inset
+\series bold
+-mtlcs900h
+\series default
+ Generate code for the Toshiba TLCS-900H
+\begin_inset LatexCommand index
+name "TLCS-900H"
--use-accelerator
-\begin_inset LatexCommand \index{DS390!Options!-\/-use-accelerator}
+\end_inset
-\end_inset
+ processor (Not maintained, not complete).
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series default
- generate code for DS390 Arithmetic Accelerator.
-
-\layout Subsection
+\series bold
+-mxa51
+\begin_inset LatexCommand index
+name "-mxa51"
-Z80 Options
-\begin_inset LatexCommand \index{Options Z80}
+\end_inset
-\end_inset
+\series default
+ Generate code for the Phillips XA51
+\begin_inset LatexCommand index
+name "XA51"
-\begin_inset LatexCommand \index{Z80}
+\end_inset
-\end_inset
+ processor (Not maintained, not complete).
+\end_layout
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Subsection
+Preprocessor Options
+\begin_inset LatexCommand index
+name "Options preprocessor"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--callee-saves-bc
-\series default
+\begin_inset LatexCommand index
+name "Preprocessor options"
-\begin_inset LatexCommand \index{Z80!Options!-\/-callee-saves-bc}
+\end_inset
-\end_inset
+\begin_inset LatexCommand index
+name "sdcpp (preprocessor)"
-\size large
-\emph on
-
-\size default
-\emph default
-Force a called function to always save BC.
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\end_inset
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-\backslash
-/
-\end_inset
+\series bold
+-I
+\begin_inset LatexCommand index
+name "-I"
--no-std-crt0
-\series default
+\end_inset
-\begin_inset LatexCommand \index{Z80!Options!-\/-no-std-crt0}
-\end_inset
+\series default
+ The additional location where the preprocessor will look for <..h> or
+\begin_inset Quotes eld
+\end_inset
- When linking, skip the standard crt0.o object file.
- You must provide your own crt0.o for your system when linking.
-
-\layout Subsection
+..h
+\begin_inset Quotes erd
+\end_inset
-Optimization Options
-\begin_inset LatexCommand \index{Options optimization}
+ files.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-D
+\begin_inset LatexCommand index
+name "-D"
-\begin_inset LatexCommand \index{Optimization options}
+\end_inset
-\end_inset
+\series default
+ Command line definition of macros.
+ Passed to the preprocessor.
+\end_layout
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-M
+\begin_inset LatexCommand index
+name "-M"
-\series bold
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+\end_inset
--nogcse
-\begin_inset LatexCommand \index{-\/-nogcse}
-\end_inset
+\series default
+ Tell the preprocessor to output a rule suitable for make describing the
+ dependencies of each object file.
+ For each source file, the preprocessor outputs one make-rule whose target
+ is the object file name for that source file and whose dependencies are
+ all the files `#include'd in it.
+ This rule may be a single line or may be continued with `
+\backslash
+'-newline if it is long.
+ The list of rules is printed on standard output instead of the preprocessed
+ C program.
+ `-M' implies `-E
+\begin_inset LatexCommand index
+name "-E"
+\end_inset
-\series default
- Will not do global subexpression elimination, this option may be used when
- the compiler creates undesirably large stack/data spaces to store compiler
- temporaries (
-\emph on
-s
-\emph default
-pill
-\emph on
-loc
-\emph default
-ations, sloc
-\begin_inset LatexCommand \index{sloc (spill location)}
+'.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
-).
- A warning message will be generated when this happens and the compiler
- will indicate the number of extra bytes it allocated.
- It is recommended that this option NOT be used, #pragma\SpecialChar ~
-nogcse
-\begin_inset LatexCommand \index{\#pragma nogcse}
+\series bold
+-C
+\begin_inset LatexCommand index
+name "-C"
-\end_inset
+\end_inset
- can be used to turn off global subexpression elimination
-\begin_inset LatexCommand \index{Subexpression elimination}
-\end_inset
+\series default
+ Tell the preprocessor not to discard comments.
+ Used with the `-E' option.
+\end_layout
- for a given function only.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-MM
+\begin_inset LatexCommand index
+name "-MM"
-\series bold
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--noinvariant
-\begin_inset LatexCommand \index{-\/-noinvariant}
+\series default
+\size large
+
+\size default
+Like `-M' but the output mentions only the user header files included with
+ `#include
+\begin_inset Quotes eld
+\end_inset
-\end_inset
+file"'.
+ System header files included with `#include ' are omitted.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series default
- Will not do loop invariant optimizations, this may be turned off for reasons
- explained for the previous option.
- For more details of loop optimizations performed see Loop Invariants in
- section
-\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
+\series bold
+-Aquestion(answer)
+\begin_inset LatexCommand index
+name "-Aquestion(answer)"
-\end_inset
+\end_inset
-.
- It is recommended that this option NOT be used, #pragma\SpecialChar ~
-noinvariant
-\begin_inset LatexCommand \index{\#pragma noinvariant}
-\end_inset
+\series default
+ Assert the answer answer for question, in case it is tested with a preprocessor
+ conditional such as `#if #question(answer)'.
+ `-A-' disables the standard assertions that normally describe the target
+ machine.
+\end_layout
- can be used to turn off invariant optimizations for a given function only.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-Umacro
+\begin_inset LatexCommand index
+name "-Umacro"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+ Undefine macro macro.
+ `-U' options are evaluated after all `-D' options, but before any `-include'
+ and `-imacros' options.
+\end_layout
--noinduction
-\begin_inset LatexCommand \index{-\/-noinduction}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-dM
+\begin_inset LatexCommand index
+name "-dM"
+\end_inset
-\series default
- Will not do loop induction optimizations, see section strength reduction
- for more details.
- It is recommended that this option is NOT used, #pragma\SpecialChar ~
-noinduction
-\begin_inset LatexCommand \index{\#pragma noinduction}
-\end_inset
+\series default
+ Tell the preprocessor to output only a list of the macro definitions that
+ are in effect at the end of preprocessing.
+ Used with the `-E' option.
+\end_layout
- can be used to turn off induction optimizations for a given function only.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-dD
+\begin_inset LatexCommand index
+name "-dD"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+ Tell the preprocessor to pass all macro definitions into the output, in
+ their proper sequence in the rest of the output.
+\end_layout
--nojtbound
-\begin_inset LatexCommand \index{-\/-nojtbound}
+\begin_layout List
+\labelwidthstring 00.00.0000
+
+\series bold
+-dN
+\begin_inset LatexCommand index
+name "-dN"
-\end_inset
+\end_inset
-\size large
-\bar under
+\series default
+\size large
-\series default
-\size default
-\bar default
- Will not generate boundary condition check when switch statements
-\begin_inset LatexCommand \index{switch statement}
+\size default
+Like `-dD' except that the macro arguments and contents are omitted.
+ Only `#define name' is included in the output.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- are implemented using jump-tables.
- See section
-\begin_inset LatexCommand \ref{sub:'switch'-Statements}
+\series bold
+-pedantic-parse-number
+\begin_inset LatexCommand index
+name "pedantic"
-\end_inset
+\end_inset
-\SpecialChar ~
-Switch Statements for more details.
- It is recommended that this option is NOT used, #pragma\SpecialChar ~
-nojtbound
-\begin_inset LatexCommand \index{\#pragma nojtbound}
-\end_inset
+\begin_inset LatexCommand index
+name "-pedantic-parse-number"
- can be used to turn off boundary checking for jump tables for a given function
- only.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\size large
+\bar under
-\layout Standard
+\begin_inset LatexCommand label
+name "lyx:-pedantic-parse-number"
-\backslash
-/
-\end_inset
+\end_inset
--noloopreverse
-\begin_inset LatexCommand \index{-\/-noloopreverse}
-\end_inset
+\series default
+\bar default
+
+\size default
+Pedantic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly
+ and the macro LO_B(3) gets expanded.
+ See also #pragma pedantic_parse_number
+\begin_inset LatexCommand vpageref
+reference "ite:pedantic_parse_number"
+
+\end_inset
+ in section
+\begin_inset LatexCommand ref
+reference "sec:Pragmas"
-\series default
-\size large
-
-\size default
-Will not do loop reversal
-\begin_inset LatexCommand \index{Loop reversing}
+\end_inset
-\end_inset
+
+\emph on
+Note: this functionality is not in conformance with C99 standard!
+\end_layout
-optimization.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
--
-\begin_inset ERT
-status Collapsed
+\series bold
+-Wp\InsetSpace ~
+preprocessorOption[,preprocessorOption]
+\series default
-\layout Standard
+\begin_inset LatexCommand index
+name "-Wp preprocessorOption[,preprocessorOption]"
-\backslash
-/
-\end_inset
+\end_inset
--
-\series bold
-nolabelopt
-\series default
-
-\begin_inset LatexCommand \index{-\/-nolabelopt }
+...
+ Pass the preprocessorOption to the preprocessor
+\family typewriter
+sdcpp
+\family default
-\end_inset
+\begin_inset LatexCommand index
+name "sdcpp (preprocessor)"
-Will not optimize labels (makes the dumpfiles more readable).
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+.
+ SDCC uses an adapted version of the GNU Compiler Collection
+\begin_inset LatexCommand index
+name "gcc (GNU Compiler Collection)"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ preprocessor
+\emph on
+cpp
+\emph default
+ (
+\emph on
+gcc
+\emph default
+
+\begin_inset LatexCommand url
+target "http://gcc.gnu.org/"
-\backslash
-/
-\end_inset
+\end_inset
--no-xinit-opt
-\begin_inset LatexCommand \index{-\/-no-xinit-opt}
+).
+ If you need more dedicated options please refer to the GCC\InsetSpace ~
+CPP\InsetSpace ~
+Manual at
+
+\begin_inset LatexCommand htmlurl
+target "http://www.gnu.org/software/gcc/onlinedocs/"
-\end_inset
+\end_inset
+.
+\end_layout
-\series default
- Will not memcpy initialized data from code space into xdata space.
- This saves a few bytes in code space if you don't have initialized data
-\begin_inset LatexCommand \index{Variable initialization}
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
-.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
+\begin_layout Subsection
+Linker Options
+\begin_inset LatexCommand index
+name "Options linker"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\begin_inset LatexCommand index
+name "Linker options"
--nooverlay
-\begin_inset LatexCommand \index{-\/-nooverlay}
+\end_inset
-\end_inset
+\end_layout
-\series default
- The compiler will not overlay parameters and local variables of any function,
- see section Parameters and local variables for more details.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
+-L\InsetSpace ~
-
-\begin_inset ERT
-status Collapsed
+\series default
-\layout Standard
+\begin_inset ERT
+status collapsed
-\backslash
-/
-\end_inset
+\begin_layout Standard
--no-peep
-\begin_inset LatexCommand \index{-\/-no-peep}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\series default
- Disable peep-hole optimization with built-in rules.
-\layout List
-\labelwidthstring 00.00.0000
+\series bold
+-lib-path
+\begin_inset LatexCommand index
+name "-\\/-lib-path "
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\begin_inset LatexCommand index
+name "-L "
--peep-file
-\series default
+\end_inset
-\begin_inset LatexCommand \index{-\/-peep-file}
-\end_inset
+\series default
+\InsetSpace ~
+ This option is passed to the linkage
+ editor's additional libraries
+\begin_inset LatexCommand index
+name "Libraries"
-\SpecialChar ~
- This option can be used to use additional rules to be used by
- the peep hole optimizer.
- See section
-\begin_inset LatexCommand \ref{sub:Peephole-Optimizer}
+\end_inset
-\end_inset
+ search path.
+ The path name must be absolute.
+ Additional library files may be specified in the command line.
+ See section Compiling programs for more details.
+\end_layout
-\SpecialChar ~
-Peep Hole optimizations for details on how to write these rules.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--peep-asm
-\begin_inset LatexCommand \index{-\/-peep-asm}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-xram-loc
+\series default
-\series default
- Pass the inline assembler code through the peep hole optimizer.
- This can cause unexpected changes to inline assembler code, please go through
- the peephole optimizer
-\begin_inset LatexCommand \index{Peephole optimizer}
+\begin_inset LatexCommand index
+name "-\\/-xram-loc "
-\end_inset
+\end_inset
- rules defined in the source file tree '/peeph.def' before using
- this option.
-\layout List
-\labelwidthstring 00.00.0000
+\InsetSpace ~
+ The start location of the external ram
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
+\end_inset
-\series bold
--
+, default value is 0.
+ The value entered can be in Hexadecimal or Decimal format, e.g.: -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--opt-code-speed
-\begin_inset LatexCommand \index{-\/-opt-code-speed}
+\end_inset
-\end_inset
+-xram-loc 0x8000 or -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\series default
- The compiler will optimize code generation towards fast code, possibly
- at the expense of code size.
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-xram-loc 32768.
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--opt-code-size
-\begin_inset LatexCommand \index{-\/-opt-code-size}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-code-loc
+\series default
-\series default
- The compiler will optimize code generation towards compact code, possibly
- at the expense of code speed.
-\layout Subsection
+\begin_inset LatexCommand index
+name "-\\/-code-loc "
-Other Options
-\begin_inset LatexCommand \index{Options other}
+\end_inset
-\end_inset
+\InsetSpace ~
+ The start location of the code
+\begin_inset LatexCommand index
+name "code"
+\end_inset
-\layout List
-\labelwidthstring 00.00.0000
+ segment, default value 0.
+ Note when this option is used the interrupt vector table
+\begin_inset LatexCommand index
+name "interrupt vector table"
+\end_inset
-\series bold
--c\SpecialChar ~
--
+ is also relocated to the given address.
+ The value entered can be in Hexadecimal or Decimal format, e.g.: -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--compile-only
-\begin_inset LatexCommand \index{-\/-compile-only}
+\end_inset
-\end_inset
+-code-loc 0x8000 or -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset LatexCommand \index{-c -\/-compile-only}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\series default
- will compile and assemble the source, but will not call the linkage editor.
-\layout List
-\labelwidthstring 00.00.0000
+-code-loc 32768.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
-\series default
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+status collapsed
+\begin_layout Standard
-\series bold
--c1mode
-\begin_inset LatexCommand \index{-\/-c1mode}
-
-\end_inset
+\backslash
+/
+\end_layout
-\series default
- reads the preprocessed source from standard input and compiles it.
- The file name for the assembler output must be specified using the -o option.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+-stack-loc
+\series default
-\series bold
--E
-\begin_inset LatexCommand \index{-E}
+\begin_inset LatexCommand index
+name "-\\/-stack-loc "
-\end_inset
+\end_inset
+\InsetSpace ~
+ By default the stack
+\begin_inset LatexCommand index
+name "stack"
-\series default
- Run only the C preprocessor.
- Preprocess all the C source files specified and output the results to standard
- output.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ is placed after the data segment.
+ Using this option the stack can be placed anywhere in the internal memory
+ space of the 8051.
+ The value entered can be in Hexadecimal or Decimal format, e.g.
+ -
+\begin_inset ERT
+status collapsed
-\series bold
--o\SpecialChar ~
-
-\begin_inset LatexCommand \index{-o }
+\begin_layout Standard
-\end_inset
-
-\series default
-The output path resp.
- file where everything will be placed.
- If the parameter is a path, it must have a trailing slash (or backslash
- for the Windows binaries) to be recognized as a path.
-
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
+\end_inset
-\series bold
--
+-stack-loc 0x20 or -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\end_inset
-\end_inset
-
-
-\series default
-\size large
-\emph on
-
-\size default
-\emph default
-All functions in the source file will be compiled as
-\emph on
-reentrant
-\emph default
-
-\begin_inset LatexCommand \index{reentrant}
+-stack-loc 32.
+ Since the sp register is incremented before a push or call, the initial
+ sp will be set to one byte prior the provided value.
+ The provided value should not overlap any other memory areas such as used
+ register banks or the data segment and with enough space for the current
+ application.
+ The
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-, i.e.
- the parameters and local variables will be allocated on the stack
-\begin_inset LatexCommand \index{stack}
-\end_inset
+\backslash
+/
+\end_layout
-.
- See section
-\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
+\end_inset
-\end_inset
+-pack-iram
+\series default
+\InsetSpace ~
- Parameters and Local Variables for more details.
- If this option is used all source files in the project should be compiled
- with this option.
- It automatically implies --int-long-reent and --float-reent.
-
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand index
+name "-\\/-pack-iram"
+\end_inset
-\series bold
+ option (which is now a default setting) will override this setting, so
+ you should also specify the
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--callee-saves
-\begin_inset LatexCommand \index{-\/-callee-saves}
+\end_inset
-\end_inset
+-no-pack-iram
+\series default
+\InsetSpace ~
- function1[,function2][,function3]....
+\begin_inset LatexCommand index
+name "-\\/-no-pack-iram"
-\series default
- The compiler by default uses a caller saves convention for register saving
- across function calls, however this can cause unnecessary register pushing
- & popping when calling small functions from larger functions.
- This option can be used to switch the register saving convention for the
- function names specified.
- The compiler will not save registers when calling these functions, no extra
- code will be generated at the entry & exit (function prologue
-\series bold
+\end_inset
-\begin_inset LatexCommand \index{function prologue}
+ option if you need to manually place the stack.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\series default
- & epilogue
-\series bold
+\begin_layout Standard
-\begin_inset LatexCommand \index{function epilogue}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\series default
-) for these functions to save & restore the registers used by these functions,
- this can SUBSTANTIALLY reduce code & improve run time performance of the
- generated code.
- In the future the compiler (with inter procedural analysis) will be able
- to determine the appropriate scheme to use for each function call.
- DO NOT use this option for built-in functions such as _mulint..., if this
- option is used for a library function the appropriate library function
- needs to be recompiled with the same option.
- If the project consists of multiple source files then all the source file
- should be compiled with the same -
-\begin_inset ERT
-status Collapsed
+-xstack-loc
+\series default
-\layout Standard
+\begin_inset LatexCommand index
+name "-\\/-xstack-loc "
-\backslash
-/
-\end_inset
+\end_inset
--callee-saves option string.
- Also see #pragma\SpecialChar ~
-callee_saves
-\begin_inset LatexCommand \index{\#pragma callee\_saves}
+\InsetSpace ~
+ By default the external stack
+\begin_inset LatexCommand index
+name "xstack"
-\end_inset
+\end_inset
-.
-\layout List
-\labelwidthstring 00.00.0000
+ is placed after the pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
+\end_inset
-\series bold
--
+ segment.
+ Using this option the xstack can be placed anywhere in the external memory
+ space of the 8051.
+ The value entered can be in Hexadecimal or Decimal format, e.g.
+ -
\begin_inset ERT
-status Collapsed
-
-\layout Standard
+status collapsed
-\backslash
-/
-\end_inset
-
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\bar under
-
-\series default
-\bar default
-When this option is used the compiler will generate debug information.
- The debug information collected in a file with .cdb extension can be used
- with the SDCDB.
- For more information see documentation for SDCDB.
- Another file with no extension contains debug information in AOMF or AOMF51
-\begin_inset LatexCommand \index{AOMF, AOMF51}
+\end_inset
-\end_inset
+-xstack-loc 0x8000 or -
+\begin_inset ERT
+status collapsed
- format which is commonly used by third party tools.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
-\series bold
--S
-\begin_inset LatexCommand \index{-S}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-stack-loc 32768.
+ The provided value should not overlap any other memory areas such as the
+ pdata or xdata segment and with enough space for the current application.
+\end_layout
-\size large
-\bar under
-
-\series default
-\size default
-\bar default
-Stop after the stage of compilation proper; do not assemble.
- The output is an assembler code file for the input file specified.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--int-long-reent
-\begin_inset LatexCommand \index{-\/-int-long-reent}
+\end_inset
-\end_inset
+-data-loc
+\series default
+\begin_inset LatexCommand index
+name "-\\/-data-loc "
-\series default
- Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant.
- Note by default these libraries are compiled as non-reentrant.
- See section Installation for more details.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+\InsetSpace ~
+ The start location of the internal ram data
+\begin_inset LatexCommand index
+name "data (mcs51, ds390 storage class)"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ segment.
+ The value entered can be in Hexadecimal or Decimal format, eg.
+ -
+\begin_inset ERT
+status collapsed
-\backslash
-/
-\end_inset
+\begin_layout Standard
--cyclomatic
-\begin_inset LatexCommand \index{-\/-cyclomatic}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\bar under
-
-\series default
-\bar default
-This option will cause the compiler to generate an information message for
- each function in the source file.
- The message contains some
-\emph on
-important
-\emph default
- information about the function.
- The number of edges and nodes the compiler detected in the control flow
- graph of the function, and most importantly the
-\emph on
-cyclomatic complexity
-\begin_inset LatexCommand \index{Cyclomatic complexity}
+-data-loc 0x20 or -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\emph default
- see section on Cyclomatic Complexity for more details.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
+\end_inset
-\series bold
--
+-data-loc 32.
+ (By default, the start location of the internal ram data segment is set
+ as low as possible in memory, taking into account the used register banks
+ and the bit segment at address 0x20.
+ For example if register banks 0 and 1 are used without bit variables, the
+ data segment will be set, if -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
-
--float-reent
-\begin_inset LatexCommand \index{-\/-float-reent}
-
-\end_inset
+\backslash
+/
+\end_layout
-\series default
- Floating point library is compiled as reentrant
-\begin_inset LatexCommand \index{reentrant}
+\end_inset
-\end_inset
+-data-loc is not used, to location 0x10.)
+\end_layout
-.
- See section Installation for more details.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--main-return
-\begin_inset LatexCommand \index{-\/-main-return}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-idata-loc
+\series default
-\series default
- This option can be used if the code generated is called by a monitor program
- or if the main routine includes an endless loop.
- This option results in slightly smaller code and saves two bytes of stack
- space.
- The return from the 'main'
-\begin_inset LatexCommand \index{main return}
+\begin_inset LatexCommand index
+name "-\\/-idata-loc "
-\end_inset
+\end_inset
- function will return to the function calling main.
- The default setting is to lock up i.e.
- generate a '
-\family typewriter
-sjmp .
-\family default
-'.
-\layout List
-\labelwidthstring 00.00.0000
+\InsetSpace ~
+ The start location of the indirectly addressable internal ram
+\begin_inset LatexCommand index
+name "idata (mcs51, ds390 storage class)"
+\end_inset
-\series bold
--
+ of the 8051, default value is 0x80.
+ The value entered can be in Hexadecimal or Decimal format, eg.
+ -
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--nostdinc
-\begin_inset LatexCommand \index{-\/-nostdinc}
+\end_inset
-\end_inset
+-idata-loc 0x88 or -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\series default
- This will prevent the compiler from passing on the default include path
- to the preprocessor.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-idata-loc 136.
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--nostdlib
-\begin_inset LatexCommand \index{-\/-nostdlib}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-bit-loc
+\series default
+\InsetSpace ~
+ The start location of the bit
+\begin_inset LatexCommand index
+name "bit"
-\series default
- This will prevent the compiler from passing on the default library
-\begin_inset LatexCommand \index{Libraries}
+\end_inset
-\end_inset
+ addressable internal ram of the 8051.
+ This is
+\emph on
+not
+\emph default
+ implemented yet.
+ Instead an option can be passed directly to the linker: -Wl\InsetSpace ~
+-bBSEG=.
+\end_layout
- path to the linker.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--verbose
-\begin_inset LatexCommand \index{-\/-verbose}
+\end_inset
-\end_inset
+-out-fmt-ihx
+\begin_inset LatexCommand index
+name "-\\/-out-fmt-ihx"
+\end_inset
-\series default
- Shows the various actions the compiler is performing.
-\layout List
-\labelwidthstring 00.00.0000
+
+\series default
+The linker output (final object code) is in Intel Hex format.
+\begin_inset LatexCommand index
+name "Intel hex format"
+\end_inset
-\series bold
--V
-\begin_inset LatexCommand \index{-V}
+ This is the default option.
+ The format itself is documented in the documentation of srecord
+\begin_inset LatexCommand index
+name "srecord (bin, hex, ... tool)"
-\end_inset
+\end_inset
+.
+\end_layout
-\series default
- Shows the actual commands the compiler is executing.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--no-c-code-in-asm
-\begin_inset LatexCommand \index{-\/-no-c-code-in-asm}
+\end_inset
-\end_inset
+-out-fmt-s19
+\begin_inset LatexCommand index
+name "-\\/-out-fmt-s19"
+\end_inset
-\series default
- Hides your ugly and inefficient c-code from the asm file, so you can always
- blame the compiler :)
-\layout List
-\labelwidthstring 00.00.0000
+
+\series default
+The linker output (final object code) is in Motorola S19 format
+\begin_inset LatexCommand index
+name "Motorola S19 format"
+
+\end_inset
+
+.
+ The format itself is documented in the documentation of srecord.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--no-peep-comments
-\begin_inset LatexCommand \index{-\/-no-peep-comments}
+\end_inset
-\end_inset
+-out-fmt-elf
+\begin_inset LatexCommand index
+name "-\\/-out-fmt-s19"
+\end_inset
-\series default
- Will not include peep-hole comments in the generated files.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand index
+name "HC08!Options!-\\/-out-fmt-elf"
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+
+\series default
+The linker output (final object code) is in ELF format
+\begin_inset LatexCommand index
+name "ELF format"
-\backslash
-/
-\end_inset
+\end_inset
--i-code-in-asm
-\begin_inset LatexCommand \index{-\/-i-code-in-asm}
+.
+ (Currently only supported for the HC08
+\begin_inset LatexCommand index
+name "HC08"
-\end_inset
+\end_inset
+ processors)
+\end_layout
-\series default
- Include i-codes in the asm file.
- Sounds like noise but is most helpful for debugging the compiler itself.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-Wl\InsetSpace ~
+linkOption[,linkOption]
+\series default
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_inset LatexCommand index
+name "-Wl linkOption[,linkOption]"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--less-pedantic
-\begin_inset LatexCommand \index{-\/-less-pedantic}
+\begin_inset LatexCommand label
+name "lyx:-Wl option"
-\end_inset
+\end_inset
+...
+ Pass the linkOption to the linker.
+ If a bootloader is used an option like
+\begin_inset Quotes sld
+\end_inset
-\series default
- Disable some of the more pedantic warnings
-\begin_inset LatexCommand \index{Warnings}
+-Wl\InsetSpace ~
+-bCSEG=0x1000
+\begin_inset Quotes srd
+\end_inset
-\end_inset
+ would be typical to set the start of the code segment.
+ Either use the double quotes around this option or use no space (e.g.
+ -Wl-bCSEG=0x1000).
+ See also #pragma constseg and #pragma codeseg in section
+\begin_inset LatexCommand ref
+reference "sec:Pragmas"
- (jwk burps: please be more specific here, please!).
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+ .
+ File sdcc/as/doc/asxhtm.html has more on linker options.
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\end_layout
--disable-warning\SpecialChar ~
-
-\begin_inset LatexCommand \index{-\/-disable-warning}
+\begin_layout Subsection
+MCS51 Options
+\begin_inset LatexCommand index
+name "Options MCS51"
-\end_inset
+\end_inset
-\series default
- Disable specific warning with number .
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand index
+name "MCS51 options"
+
+\end_inset
+
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--print-search-dirs
-\begin_inset LatexCommand \index{-\/-print-search-dirs}
+\end_inset
-\end_inset
+-model-small
+\begin_inset LatexCommand index
+name "-\\/-model-small"
+\end_inset
-\series default
- Display the directories in the compiler's search path
-\layout List
-\labelwidthstring 00.00.0000
+\series default
+\size large
+
+\size default
+Generate code for Small Model programs, see section Memory Models for more
+ details.
+ This is the default model.
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
+status collapsed
-\backslash
-/
-\end_inset
+\begin_layout Standard
--vc
-\begin_inset LatexCommand \index{-\/-vc}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\series default
- Display errors and warnings using MSVC style, so you can use SDCC with
- the visual studio IDE
-\begin_inset LatexCommand \index{IDE}
+-model-medium
+\begin_inset LatexCommand index
+name "-\\/-model-medium"
-\end_inset
+\end_inset
-.
- With SDCC both offering a GCC-like (the default) and a MSVC-like
-\begin_inset LatexCommand \index{MSVC output style}
-\end_inset
+\series default
+ Generate code for Medium model programs, see section Memory Models for
+ more details.
+ If this option is used all source files in the project have to be compiled
+ with this option.
+ It must also be used when invoking the linker.
+\end_layout
- output style, integration into most programming editors should be straightforwa
-rd.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--use-stdout
-\begin_inset LatexCommand \index{-\/-use-stdout}
+\end_inset
+
+-model-large
+\begin_inset LatexCommand index
+name "-\\/-model-large"
-\end_inset
+\end_inset
-\series default
- Send errors and warnings to stdout instead of stderr.
-\layout List
+\series default
+ Generate code for Large model programs, see section Memory Models for more
+ details.
+ If this option is used all source files in the project have to be compiled
+ with this option.
+ It must also be used when invoking the linker.
+\end_layout
+
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
-\series bold
--Wa\SpecialChar ~
-asmOption[,asmOption]
-\series default
-\begin_inset LatexCommand \index{-Wa asmOption[,asmOption]}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-...
- Pass the asmOption to the assembler
-\begin_inset LatexCommand \index{Options assembler}
+-xstack
+\begin_inset LatexCommand index
+name "-\\/-xstack"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{Assembler options}
+\series default
+ Uses a pseudo stack in the pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
-\end_inset
+\end_inset
-.
- See file sdcc/as/doc/asxhtm.html for assembler options.cd
-\layout List
-\labelwidthstring 00.00.0000
+ area (usually the first 256 bytes in the external ram) for allocating variables
+ and passing parameters.
+ See section
+\begin_inset LatexCommand ref
+reference "sub:External-Stack"
+
+\end_inset
+
+\InsetSpace ~
+ External Stack for more details.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--std-sdcc89
-\begin_inset LatexCommand \index{-\/-std-sdcc89}
+\end_inset
-\end_inset
+-iram-size
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-\\/-iram-size "
+\end_inset
-\series default
- Generally follow the C89 standard, but allow SDCC features that conflict
- with the standard (default).
-\layout List
-\labelwidthstring 00.00.0000
+ Causes the linker to check if the internal ram usage is within limits of
+ the given value.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--std-c89
-\begin_inset LatexCommand \index{-\/-std-c89}
+\end_inset
-\end_inset
+-xram-size
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-\\/-xram-size "
+\end_inset
-\series default
- Follow the C89 standard and disable SDCC features that conflict with the
- standard.
-\layout List
-\labelwidthstring 00.00.0000
+ Causes the linker to check if the external ram usage is within limits of
+ the given value.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--std-sdcc99
-\begin_inset LatexCommand \index{-\/-std-sdcc99}
+\end_inset
-\end_inset
+-code-size
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-\\/-code-size "
+\end_inset
-\series default
- Generally follow the C99 standard, but allow SDCC features that conflict
- with the standard (incomplete support).
-\layout List
-\labelwidthstring 00.00.0000
+ Causes the linker to check if the code memory usage is within limits of
+ the given value.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--std-c99
-\begin_inset LatexCommand \index{-\/-std-sdcc99}
+\end_inset
+
+-stack-size
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-\\/-stack-size "
-\end_inset
+\end_inset
+ Causes the linker to check if there is at minimum bytes for stack.
+\end_layout
-\series default
- Follow the C99 standard and disable SDCC features that conflict with the
- standard (incomplete support).
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--codeseg
-\series default
+\end_inset
-\begin_inset LatexCommand \index{-\/-codeseg }
+-pack-iram
+\series default
+\InsetSpace ~
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-pack-iram"
-\SpecialChar ~
- The name to be used for the code
-\begin_inset LatexCommand \index{code}
+\end_inset
-\end_inset
+ Causes the linker to use unused register banks for data variables and pack
+ data, idata and stack together.
+ This is the default now.
+\end_layout
- segment, default CSEG.
- This is useful if you need to tell the compiler to put the code in a special
- segment so you can later on tell the linker to put this segment in a special
- place in memory.
- Can be used for instance when using bank switching to put the code in a
- bank.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--constseg
-\series default
+\end_inset
-\begin_inset LatexCommand \index{-\/-constseg }
+-no-pack-iram
+\series default
+\InsetSpace ~
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-no-pack-iram"
-\SpecialChar ~
- The name to be used for the const
-\begin_inset LatexCommand \index{code}
+\end_inset
-\end_inset
-
- segment, default CONST.
- This is useful if you need to tell the compiler to put the const data in
- a special segment so you can later on tell the linker to put this segment
- in a special place in memory.
- Can be used for instance when using bank switching to put the const data
- in a bank.
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+ Causes the linker to use old style for allocating memory areas.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
-more-pedantic
-\series default
- Actually this is
-\series bold
-\emph on
-not
-\series default
-\emph default
- a SDCC compiler option but if you want
-\emph on
-more
-\emph default
- warnings you can use a separate tool dedicated to syntax checking like
- splint
-\begin_inset LatexCommand \label{lyx:more-pedantic-SPLINT}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{lint (syntax checking tool)}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-
-\begin_inset LatexCommand \url{http://www.splint.org}
+-acall-ajmp
+\series default
+\InsetSpace ~
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-acall-ajmp"
-.
- To make your source files parseable by splint you will have to include
-
-\family sans
-lint.h
-\family default
+\end_inset
-\begin_inset LatexCommand \index{splint (syntax checking tool)}
+ Replaces the three byte instructions lcall/ljmp with the two byte instructions
+ acall/ajmp.
+ Only use this option if your code is in the same 2k block of memory.
+ You may need to use this option for some 8051 derivatives which lack the
+ lcall/ljmp instructions..
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
- in your source file and add brackets around extended keywords (like
-\family sans
-\begin_inset Quotes sld
-\end_inset
+\end_layout
-__at\SpecialChar ~
+\begin_layout Subsection
+DS390 / DS400 Options
+\begin_inset LatexCommand index
+name "Options DS390"
-\series bold
-(
-\series default
-0xab
-\series bold
-)
-\series default
+\end_inset
-\begin_inset Quotes srd
-\end_inset
+\begin_inset LatexCommand index
+name "DS390"
-\family default
- and
-\family sans
+\end_inset
-\begin_inset Quotes sld
-\end_inset
-__interrupt\SpecialChar ~
-(2)
-\begin_inset Quotes srd
-\end_inset
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\family default
-).
-
-\newline
-Splint has an excellent on line manual at
-\begin_inset LatexCommand \url{http://www.splint.org/manual/}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- and it's capabilities go beyond pure syntax checking.
- You'll need to tell splint the location of SDCC's include files so a typical
- command line could look like this:
-\newline
-\family sans
-splint\SpecialChar ~
--I\SpecialChar ~
-/usr/local/share/sdcc/include/mcs51/\SpecialChar ~
-\SpecialChar ~
-myprogram.c
-\layout Subsection
+\backslash
+/
+\end_layout
-Intermediate Dump Options
-\begin_inset LatexCommand \label{sub:Intermediate-Dump-Options}
+\end_inset
-\end_inset
+-model-flat24
+\series default
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-model-flat24"
-\begin_inset LatexCommand \index{Options intermediate dump}
+\end_inset
-\end_inset
+\size large
+
+\size default
+Generate 24-bit flat mode code.
+ This is the one and only that the ds390 code generator supports right now
+ and is default when using
+\emph on
+-mds390
+\emph default
+.
+ See section Memory Models for more details.
+\end_layout
-\begin_inset LatexCommand \index{Intermediate dump options}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\layout Standard
-The following options are provided for the purpose of retargetting and debugging
- the compiler.
- They provide a means to dump the intermediate code (iCode
-\begin_inset LatexCommand \index{iCode}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-) generated by the compiler in human readable form at various stages of
- the compilation process.
- More on iCodes see chapter
-\begin_inset LatexCommand \ref{sub:The-anatomy-of}
+-protect-sp-update
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-protect-sp-update"
-\end_inset
+\end_inset
-
-\begin_inset Quotes srd
-\end_inset
-The anatomy of the compiler
-\begin_inset Quotes srd
-\end_inset
+\series default
+ disable interrupts during ESP:SP updates.
+\end_layout
-.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
+status collapsed
-\backslash
-/
-\end_inset
-
--dumpraw
-\begin_inset LatexCommand \index{-\/-dumpraw}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\series default
- This option will cause the compiler to dump the intermediate code into
- a file of named
-\emph on
-.dumpraw
-\emph default
- just after the intermediate code has been generated for a function, i.e.
- before any optimizations are done.
- The basic blocks
-\begin_inset LatexCommand \index{Basic blocks}
+\end_inset
-\end_inset
+-stack-10bit
+\series default
- at this stage ordered in the depth first number, so they may not be in
- sequence of execution.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-stack-10bit"
+\end_inset
-\series bold
+ Generate code for the 10 bit stack mode of the Dallas DS80C390 part.
+ This is the one and only that the ds390 code generator supports right now
+ and is default when using
+\emph on
+-mds390
+\emph default
+.
+ In this mode, the stack is located in the lower 1K of the internal RAM,
+ which is mapped to 0x400000.
+ Note that the support is incomplete, since it still uses a single byte
+ as the stack pointer.
+ This means that only the lower 256 bytes of the potential 1K stack space
+ will actually be used.
+ However, this does allow you to reclaim the precious 256 bytes of low RAM
+ for use for the DATA and IDATA segments.
+ The compiler will not generate any code to put the processor into 10 bit
+ stack mode.
+ It is important to ensure that the processor is in this mode before calling
+ any re-entrant functions compiled with this option.
+ In principle, this should work with the
+\emph on
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--dumpgcse
-\begin_inset LatexCommand \index{-\/-dumpgcse}
+\end_inset
-\end_inset
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
+\end_inset
-\series default
- Will create a dump of iCode's, after global subexpression elimination
-\begin_inset LatexCommand \index{Global subexpression elimination}
-\end_inset
+\emph default
+ option, but that has not been tested.
+ It is incompatible with the
+\emph on
+-
+\begin_inset ERT
+status collapsed
-, into a file named
-\emph on
-.dumpgcse.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
-\series bold
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-xstack
+\begin_inset LatexCommand index
+name "-\\/-xstack"
+
+\end_inset
+
+
+\emph default
+ option.
+ It also only makes sense if the processor is in 24 bit contiguous addressing
+ mode (see the
+\emph on
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
-
-\backslash
-/
-\end_inset
+\begin_layout Standard
--dumpdeadcode
-\begin_inset LatexCommand \index{-\/-dumpdeadcode}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\series default
- Will create a dump of iCode's, after deadcode elimination
-\begin_inset LatexCommand \index{Dead-code elimination}
+-model-flat24 option
+\emph default
+).
+\series bold
-\end_inset
+\begin_inset Note Note
+status collapsed
-, into a file named
-\emph on
-.dumpdeadcode.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status open
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--dumploop
-\begin_inset LatexCommand \index{-\/-dumploop}
+\end_inset
-\end_inset
+-stack-8-bit - switches off the 10-bit mode
+\end_layout
+\end_inset
-\series default
-\size large
-
-\size default
-Will create a dump of iCode's, after loop optimizations
-\begin_inset LatexCommand \index{Loop optimization}
-\end_inset
+\end_layout
-, into a file named
-\emph on
-.dumploop.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--dumprange
-\begin_inset LatexCommand \index{-\/-dumprange}
+\end_inset
-\end_inset
+-stack-probe
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-stack-probe"
+\end_inset
-\series default
-\size large
-
-\size default
-Will create a dump of iCode's, after live range analysis
-\begin_inset LatexCommand \index{Live range analysis}
-\end_inset
+\series default
+ insert call to function __stack_probe at each function prologue.
+\end_layout
-, into a file named
-\emph on
-.dumprange.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status open
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--dumlrange
-\begin_inset LatexCommand \index{-\/-dumlrange}
+\end_inset
-\end_inset
+-tini-libid
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-tini-libid"
+\end_inset
-\series default
- Will dump the life ranges
-\begin_inset LatexCommand \index{Live range analysis}
-\end_inset
+\series default
+ LibraryID used in -mTININative.
+
+\end_layout
- for all symbols.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
-
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--dumpregassign
-\begin_inset LatexCommand \index{-\/-dumpregassign}
+\end_inset
+
+-use-accelerator
+\begin_inset LatexCommand index
+name "DS390!Options!-\\/-use-accelerator"
-\end_inset
+\end_inset
-\bar under
+\series default
+ generate code for DS390 Arithmetic Accelerator.
-\series default
-\bar default
-Will create a dump of iCode's, after register assignment
-\begin_inset LatexCommand \index{Register assignment}
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-, into a file named
-\emph on
-.dumprassgn.
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-\series bold
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Subsection
+Z80 Options
+\begin_inset LatexCommand index
+name "Options Z80"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--dumplrange
-\begin_inset LatexCommand \index{-\/-dumplrange}
+\begin_inset LatexCommand index
+name "Z80"
-\end_inset
+\end_inset
-\series default
- Will create a dump of the live ranges of iTemp's
-\layout List
-\added_space_bottom bigskip \labelwidthstring 00.00.0000
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
--dumpall
-\begin_inset LatexCommand \index{-\/-dumpall}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-callee-saves-bc
+\series default
-\size large
-\bar under
-
-\series default
-\size default
-\bar default
-Will cause all the above mentioned dumps to be created.
-\layout Subsection
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-callee-saves-bc"
-Redirecting output on Windows Shells
-\layout Standard
-\added_space_bottom bigskip
-By default SDCC writes it's error messages to
-\begin_inset Quotes sld
-\end_inset
+\end_inset
-standard error
-\begin_inset Quotes srd
-\end_inset
-.
- To force all messages to
-\begin_inset Quotes sld
-\end_inset
+\size large
+
+\size default
+Force a called function to always save BC.
+\end_layout
-standard output
-\begin_inset Quotes srd
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- use
-\series bold
+\series bold
-
-\series default
-\emph on
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
+\backslash
+/
+\end_layout
-\series bold
-\emph default
--
-\series default
-use-stdout
-\begin_inset LatexCommand \index{-\/-use-stdout}
+\end_inset
-\end_inset
+-no-std-crt0
+\series default
-.
- Additionally, if you happen to have visual studio installed in your windows
- machine, you can use it to compile your sources using a custom build and
- the SDCC -
-\emph on
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-no-std-crt0"
+
+\end_inset
+
+ When linking, skip the standard crt0.o object file.
+ You must provide your own crt0.o for your system when linking.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
+
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
+\backslash
+/
+\end_layout
-\emph default
--vc
-\begin_inset LatexCommand \index{-\/-vc}
+\end_inset
-\end_inset
+-portmode=
+\series default
+
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-portmode="
- option.
- Something like this should work:
-\newline
+\end_inset
-\newline
+ Determinate PORT I/O mode ( is z80 or z180).
+\end_layout
-\series bold
-c:
-\backslash
-sdcc
-\backslash
-bin
-\backslash
-sdcc.exe -
-\series default
-\emph on
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
-/
-\end_inset
+\backslash
+/
+\end_layout
-\series bold
-\emph default
--vc -
-\series default
-\emph on
+\end_inset
-\begin_inset ERT
-status Collapsed
+-asm=
+\series default
+
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-asm="
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+ Define assembler name ( is rgbds, asxxxx, isas or z80asm).
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
-\emph default
--model-large -c $(InputPath)
-\layout Section
+\series bold
+-
+\begin_inset ERT
+status collapsed
-Environment variables
-\begin_inset LatexCommand \index{Environment variables}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-SDCC recognizes the following environment variables:
-\layout List
-\labelwidthstring 00.00.0000
+-codeseg
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-codeseg "
+\end_inset
-\series bold
-SDCC_LEAVE_SIGNALS
-\begin_inset LatexCommand \index{SDCC\_LEAVE\_SIGNALS}
+ Use for the code segment name.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\series default
- SDCC installs a signal handler
-\begin_inset LatexCommand \index{signal handler}
+\begin_layout Standard
-\end_inset
- to be able to delete temporary files after an user break (^C) or an exception.
- If this environment variable is set, SDCC won't install the signal handler
- in order to be able to debug SDCC.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash
+/
+\end_layout
+\end_inset
-\series bold
-TMP,\SpecialChar ~
-TEMP,\SpecialChar ~
-TMPDIR
-\begin_inset LatexCommand \index{TMP, TEMP, TMPDIR}
+-constseg
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-constseg "
-\end_inset
+\end_inset
+ Use for the const segment name.
+\end_layout
-\series default
- Path, where temporary files will be created.
- The order of the variables is the search order.
- In a standard *nix environment these variables are not set, and there's
- no need to set them.
- On Windows it's recommended to set one of them.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\begin_inset VSpace bigskip
+\end_inset
-\series bold
-SDCC_HOME
-\begin_inset LatexCommand \index{SDCC\_HOME}
+\end_layout
-\end_inset
+\begin_layout Subsection
+GBZ80 Options
+\begin_inset LatexCommand index
+name "Options GBZ80"
+\end_inset
-\series default
- Path, see section
-\begin_inset LatexCommand \ref{sub:Install-paths}
-\end_inset
+\begin_inset LatexCommand index
+name "GBZ80"
-\SpecialChar ~
+\end_inset
-\begin_inset Quotes sld
-\end_inset
- Install Paths
-\begin_inset Quotes srd
-\end_inset
+\end_layout
-.
-\layout List
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\series bold
-SDCC_INCLUDE
-\begin_inset LatexCommand \index{SDCC\_INCLUDE}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\series default
- Path, see section
-\begin_inset LatexCommand \ref{sub:Search-Paths}
+\end_inset
-\end_inset
+-callee-saves-bc
+\series default
-\SpecialChar ~
+\begin_inset LatexCommand index
+name "GBZ80!Options!-\\/-callee-saves-bc"
-\begin_inset Quotes sld
-\end_inset
+\end_inset
-Search Paths
-\begin_inset Quotes srd
-\end_inset
-.
-\layout List
+\size large
+
+\size default
+Force a called function to always save BC.
+\end_layout
+
+\begin_layout List
\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\series bold
-SDCC_LIB
-\begin_inset LatexCommand \index{SDCC\_LIB}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\series default
- Path, see section
-\begin_inset LatexCommand \ref{sub:Search-Paths}
+\end_inset
-\end_inset
+-no-std-crt0
+\series default
-\SpecialChar ~
+\begin_inset LatexCommand index
+name "Z80!Options!-\\/-no-std-crt0"
-\begin_inset Quotes sld
-\end_inset
+\end_inset
-Search Paths
-\begin_inset Quotes srd
-\end_inset
+ When linking, skip the standard crt0.o object file.
+ You must provide your own crt0.o for your system when linking.
+\end_layout
-..
-\layout Standard
-\added_space_bottom bigskip
-There are some more environment variables recognized by SDCC, but these
- are solely used for debugging purposes.
- They can change or disappear very quickly, and will never be documented.
-\layout Section
+\begin_layout List
+\labelwidthstring 00.00.0000
-Storage Class Language Extensions
-\layout Subsection
+\series bold
+-bo
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "GBZ80!Options!-bo "
-MCS51/DS390 Storage Class
-\begin_inset LatexCommand \index{Storage class}
+\end_inset
-\end_inset
+ Use code bank .
+\end_layout
- Language Extensions
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-In addition to the ANSI storage classes SDCC allows the following MCS51
- specific storage classes:
-\layout Subsubsection
+\series bold
+-ba
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "GBZ80!Options!-ba "
-data
-\begin_inset LatexCommand \index{data (mcs51, ds390 storage class)}
+\end_inset
-\end_inset
+ Use data bank .
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\begin_inset LatexCommand \index{\_\_data (mcs51, ds390 storage class)}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- / near
-\begin_inset LatexCommand \index{near (storage class)}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\begin_inset LatexCommand \index{\_\_near (storage class)}
+-codeseg
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "GBZ80!Options!-\\/-codeseg "
-\end_inset
+\end_inset
+ Use for the code segment name.
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-This is the
-\series bold
-default
-\series default
- storage class for the Small Memory model (
-\emph on
-data
-\emph default
- and
-\emph on
-near
-\emph default
- or the more ANSI-C compliant forms
-\emph on
-__data
-\emph default
- and
-\emph on
-__near
-\emph default
- can be used synonymously).
- Variables declared with this storage class will be allocated in the directly
- addressable portion of the internal RAM of a 8051, e.g.:
-\layout Verse
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\family typewriter
-__data unsigned char test_data;
-\layout Standard
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
+\backslash
+/
+\end_layout
+\end_inset
-\family typewriter
-75*00 01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-_test_data,#0x01
-\layout Subsubsection
+-constseg
+\series default
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "GBZ80!Options!-\\/-constseg "
-xdata
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+\end_inset
-\end_inset
+ Use for the const segment name.
+\end_layout
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\begin_inset LatexCommand \index{\_\_xdata (mcs51, ds390 storage class)}
-\end_inset
+\end_layout
- / far
-\begin_inset LatexCommand \index{far (storage class)}
+\begin_layout Subsection
+Optimization Options
+\begin_inset LatexCommand index
+name "Options optimization"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_far (storage class)}
+\begin_inset LatexCommand index
+name "Optimization options"
-\end_inset
+\end_inset
-\layout Standard
+\end_layout
-Variables declared with this storage class will be placed in the external
- RAM.
- This is the
-\series bold
-default
-\series default
- storage class for the Large Memory model, e.g.:
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-__xdata unsigned char test_xdata;
-\layout Standard
+\begin_layout Standard
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-90s00r00\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-dptr,#_test_xdata
-\newline
-74\SpecialChar ~
-01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-a,#0x01
-\newline
-F0\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movx\SpecialChar ~
-@dptr,a
-\layout Subsubsection
+\end_inset
-idata
-\begin_inset LatexCommand \index{idata (mcs51, ds390 storage class)}
+-nogcse
+\begin_inset LatexCommand index
+name "-\\/-nogcse"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_idata (mcs51, ds390 storage class)}
+\series default
+ Will not do global subexpression elimination, this option may be used when
+ the compiler creates undesirably large stack/data spaces to store compiler
+ temporaries (
+\emph on
+s
+\emph default
+pill
+\emph on
+loc
+\emph default
+ations, sloc
+\begin_inset LatexCommand index
+name "sloc (spill location)"
-\end_inset
+\end_inset
+).
+ A warning message will be generated when this happens and the compiler
+ will indicate the number of extra bytes it allocated.
+ It is recommended that this option NOT be used, #pragma\InsetSpace ~
+nogcse
+\begin_inset LatexCommand index
+name "\\#pragma nogcse"
-\layout Standard
+\end_inset
-Variables declared with this storage class will be allocated into the indirectly
- addressable portion of the internal ram of a 8051, e.g.:
-\layout Verse
+ can be used to turn off global subexpression elimination
+\begin_inset LatexCommand index
+name "Subexpression elimination"
+\end_inset
-\family typewriter
-__idata unsigned char test_idata;
-\layout Standard
+ for a given function only.
+\end_layout
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
-
-
-\family typewriter
-78r00\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-r0,#_test_idata
-\newline
-76\SpecialChar ~
-01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-@r0,#0x01
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-Please note, the first 128 byte of idata physically access the same RAM
- as the data memory.
- The original 8051 had 128 byte idata memory, nowadays most devices have
- 256 byte idata memory.
- The stack
-\begin_inset LatexCommand \index{stack}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- is located in idata memory.
-\layout Subsubsection
-pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-noinvariant
+\begin_inset LatexCommand index
+name "-\\/-noinvariant"
-\begin_inset LatexCommand \index{\_\_pdata (mcs51, ds390 storage class)}
-
-\end_inset
+\end_inset
-\layout Standard
+\series default
+ Will not do loop invariant optimizations, this may be turned off for reasons
+ explained for the previous option.
+ For more details of loop optimizations performed see Loop Invariants in
+ section
+\begin_inset LatexCommand ref
+reference "sub:Loop-Optimizations"
-Paged xdata access is just as straightforward as using the other addressing
- modes of a 8051.
- It is typically located at the start of xdata and has a maximum size of
- 256 bytes.
- The following example writes 0x01 to the pdata variable.
- Please note, pdata access physically accesses xdata memory.
- The high byte of the address is determined by port P2
-\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
+\end_inset
-\end_inset
+.
+ It is recommended that this option NOT be used, #pragma\InsetSpace ~
+noinvariant
+\begin_inset LatexCommand index
+name "\\#pragma noinvariant"
-(or in case of some 8051 variants by a separate Special Function Register,
- see section
-\begin_inset LatexCommand \ref{sub:MCS51-variants}
+\end_inset
-\end_inset
+ can be used to turn off invariant optimizations for a given function only.
+\end_layout
-).
- This is the
-\series bold
-default
-\series default
- storage class for the Medium Memory model, e.g.:
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-__pdata unsigned char test_pdata;
-\layout Standard
+\begin_layout Standard
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-78r00\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov r0,#_test_pdata
-\newline
-74 01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov a,#0x01
-\newline
-F2\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movx @r0,a
-\layout Standard
+\end_inset
-If the -
-\begin_inset ERT
-status Collapsed
+-noinduction
+\begin_inset LatexCommand index
+name "-\\/-noinduction"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--xstack
-\begin_inset LatexCommand \index{-\/-xstack}
+\series default
+ Will not do loop induction optimizations, see section strength reduction
+ for more details.
+ It is recommended that this option is NOT used, #pragma\InsetSpace ~
+noinduction
+\begin_inset LatexCommand index
+name "\\#pragma noinduction"
-\end_inset
+\end_inset
- option is used the pdata memory area is followed by the xstack memory area
- and the sum of their sizes is limited to 256 bytes.
-\layout Subsubsection
+ can be used to turn off induction optimizations for a given function only.
+\end_layout
-code
-\begin_inset LatexCommand \index{code}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_code}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\layout Standard
+-nojtbound
+\begin_inset LatexCommand index
+name "-\\/-nojtbound"
-'Variables' declared with this storage class will be placed in the code
- memory:
-\layout Verse
+\end_inset
-\family typewriter
-__code unsigned char test_code;
-\layout Standard
+\size large
+
+\series default
+\size default
+ Will not generate boundary condition check when switch statements
+\begin_inset LatexCommand index
+name "switch statement"
-Read access to this variable generates the assembly code:
-\layout Verse
+\end_inset
+ are implemented using jump-tables.
+ See section
+\begin_inset LatexCommand ref
+reference "sub:'switch'-Statements"
-\family typewriter
-90s00r6F\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov dptr,#_test_code
-\newline
-E4\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-clr a
-\newline
-93\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movc a,@a+dptr
-\layout Standard
+\end_inset
+\InsetSpace ~
+Switch Statements for more details.
+ It is recommended that this option is NOT used, #pragma\InsetSpace ~
+nojtbound
+\begin_inset LatexCommand index
+name "\\#pragma nojtbound"
-\family typewriter
-char
-\family default
- indexed arrays of characters in code memory can be accessed efficiently:
-\layout Verse
+\end_inset
+ can be used to turn off boundary checking for jump tables for a given function
+ only.
+\end_layout
-\family typewriter
-__code char test_array[] = {'c','h','e','a','p'};
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-Read access to this array using an 8-bit unsigned index generates the assembly
- code:
-\layout Verse
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\family typewriter
-E5*00\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov a,_index
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-90s00r41\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov dptr,#_test_array
-\layout Verse
-
-
-\family typewriter
-93\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movc a,@a+dptr
-\layout Subsubsection
+\end_inset
-bit
-\begin_inset LatexCommand \index{bit}
+-noloopreverse
+\begin_inset LatexCommand index
+name "-\\/-noloopreverse"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_bit}
+\series default
+\size large
+
+\size default
+Will not do loop reversal
+\begin_inset LatexCommand index
+name "Loop reversing"
-\end_inset
+\end_inset
+optimization.
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
+-
+\begin_inset ERT
+status collapsed
-This is a data-type and a storage class specifier.
- When a variable is declared as a bit, it is allocated into the bit addressable
- memory of 8051, e.g.:
-\layout Verse
+\begin_layout Standard
-\family typewriter
-__bit test_bit;
-\layout Standard
+\backslash
+/
+\end_layout
-Writing 1 to this variable generates the assembly code:
-\layout Verse
-
-
-\family typewriter
-D2*00\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-setb\SpecialChar ~
-_test_bit
-\layout Standard
+\end_inset
-The bit addressable memory consists of 128 bits which are located from 0x20
- to 0x2f in data memory.
+-
+\series bold
+nolabelopt
+\series default
-\newline
-Apart from this 8051 specific storage class most architectures support ANSI-C
- bitfields
-\begin_inset LatexCommand \index{bitfields}
+\begin_inset LatexCommand index
+name "-\\/-nolabelopt "
-\end_inset
+\end_inset
+Will not optimize labels (makes the dumpfiles more readable).
+\end_layout
-\begin_inset Foot
-collapsed false
+\begin_layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+-
+\begin_inset ERT
+status collapsed
-Not really meant as examples, but nevertheless showing what bitfields are
- about: device/include/mc68hc908qy.h and support/regression/tests/bitfields.c
-\end_inset
+\begin_layout Standard
-.
- In accordance with ISO/IEC 9899 bits and bitfields without an explicit
- signed modifier are implemented as unsigned.
-\layout Subsubsection
-sfr
-\begin_inset LatexCommand \index{sfr}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-no-xinit-opt
+\begin_inset LatexCommand index
+name "-\\/-no-xinit-opt"
-\begin_inset LatexCommand \index{\_\_sfr}
+\end_inset
-\end_inset
- / sfr16
-\begin_inset LatexCommand \index{sfr16}
+\series default
+ Will not memcpy initialized data from code space into xdata space.
+ This saves a few bytes in code space if you don't have initialized data
+\begin_inset LatexCommand index
+name "Variable initialization"
-\end_inset
+\end_inset
+.
+\end_layout
-\begin_inset LatexCommand \index{\_\_sfr16}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- / sfr32
-\begin_inset LatexCommand \index{sfr32}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\begin_inset LatexCommand \index{\_\_sfr32}
+\end_inset
-\end_inset
+-nooverlay
+\begin_inset LatexCommand index
+name "-\\/-nooverlay"
- / sbit
-\begin_inset LatexCommand \index{\_\_sbit}
+\end_inset
-\end_inset
+\series default
+ The compiler will not overlay parameters and local variables of any function,
+ see section Parameters and local variables for more details.
+\end_layout
-\begin_inset LatexCommand \index{sbit}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\layout Standard
-Like the bit keyword,
-\emph on
-sfr / sfr16 / sfr32 / sbit
-\emph default
-signify both a data-type and storage class, they are used to describe the
-
-\emph on
-s
-\emph default
-pecial
-\emph on
-f
-\emph default
-unction
-\emph on
-r
-\emph default
-egisters and
-\emph on
-s
-\emph default
-pecial
-\emph on
-bit
-\emph default
- variables of a 8051, eg:
-\layout Verse
+\backslash
+/
+\end_layout
+\end_inset
-\family typewriter
-__sfr __at
-\begin_inset LatexCommand \index{at}
+-no-peep
+\begin_inset LatexCommand index
+name "-\\/-no-peep"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_at}
+\series default
+ Disable peep-hole optimization with built-in rules.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- (0x80) P0;\SpecialChar ~
- /* special function register P0 at location 0x80 */
-\newline
-
-\newline
-/* 16 bit special function register combination for timer 0
-\newline
-\SpecialChar ~
-\SpecialChar ~
- with the high byte at location 0x8C and the low byte at location 0x8A */
-\newline
-__sfr16 __at (0x8C8A) TMR0;
-\newline
-
-\newline
-__sbit __at
-\begin_inset LatexCommand \index{at}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_at}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- (0xd7) CY;\SpecialChar ~
- /* CY (Carry Flag
-\begin_inset LatexCommand \index{Flags}
+-peep-file
+\series default
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-peep-file"
+\end_inset
-\begin_inset LatexCommand \index{Carry flag}
+\InsetSpace ~
+ This option can be used to use additional rules to be used by
+ the peep hole optimizer.
+ See section
+\begin_inset LatexCommand ref
+reference "sub:Peephole-Optimizer"
-\end_inset
+\end_inset
-) */
-\layout Standard
+\InsetSpace ~
+Peep Hole optimizations for details on how to write these rules.
+\end_layout
-Special function registers which are located on an address dividable by
- 8 are bit-addressable, an
-\emph on
- sbit
-\emph default
- addresses a specific bit within these sfr.
-\newline
-16 Bit and 32 bit special function register combinations which require a
- certain access order are better not declared using
-\emph on
-sfr16
-\emph default
- or
-\emph on
-sfr32.
+\begin_layout List
+\labelwidthstring 00.00.0000
-\emph default
- Allthough SDCC usually accesses them Least Significant Byte (LSB) first,
- this is not guaranteed.
-\newline
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-Please note, if you use a header file which was written for another compiler
- then the sfr / sfr16 / sfr32 / sbit Storage Class extensions will most
- likely be
-\emph on
-not
-\emph default
-compatible.
- Specifically the syntax
-\family typewriter
-\SpecialChar ~
-sfr P0 = 0x80;\SpecialChar ~
-\family default
- is compiled
-\emph on
-without warning
-\emph default
- by SDCC to an assignment of 0x80 to a variable called P0
-\family typewriter
+\backslash
+/
+\end_layout
-\begin_inset Marginal
-collapsed true
+\end_inset
-\layout Standard
+-peep-asm
+\begin_inset LatexCommand index
+name "-\\/-peep-asm"
+\end_inset
-\series bold
-\SpecialChar ~
-!
-\end_inset
-.
-
-\family default
-Nevertheless it is possible to write header files
-\begin_inset LatexCommand \index{Header files}
+\series default
+ Pass the inline assembler code through the peep hole optimizer.
+ This can cause unexpected changes to inline assembler code, please go through
+ the peephole optimizer
+\begin_inset LatexCommand index
+name "Peephole optimizer"
-\end_inset
+\end_inset
+ rules defined in the source file tree '/peeph.def' before using
+ this option.
+\end_layout
-\begin_inset LatexCommand \index{Include files}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- which can be shared among different compilers (see section
-\begin_inset LatexCommand \ref{sec:Porting-code-to-other-compilers}
+\begin_layout Standard
-\end_inset
-).
-
-\layout Subsubsection
+\backslash
+/
+\end_layout
-Pointers
-\begin_inset LatexCommand \index{Pointer}
+\end_inset
-\end_inset
+-opt-code-speed
+\begin_inset LatexCommand index
+name "-\\/-opt-code-speed"
- to MCS51/DS390 specific memory spaces
-\layout Standard
+\end_inset
-SDCC allows (via language extensions) pointers to explicitly point to any
- of the memory spaces
-\begin_inset LatexCommand \index{Memory model}
-\end_inset
+\series default
+ The compiler will optimize code generation towards fast code, possibly
+ at the expense of code size.
+\end_layout
- of the 8051.
- In addition to the explicit pointers, the compiler uses (by default) generic
- pointers which can be used to point to any of the memory spaces.
-\newline
+\begin_layout List
+\labelwidthstring 00.00.0000
-\newline
-Pointer declaration examples:
-\layout Verse
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\family typewriter
-/* pointer physically in internal ram pointing to object in external ram
- */
-\newline
-__xdata unsigned char * __data p;
-\newline
-\newline
-/* pointer physically in external ram pointing to object in internal ram
- */
-\newline
-__data unsigned char * __xdata p;
-\newline
+\backslash
+/
+\end_layout
-\newline
-/* pointer physically in code rom pointing to data in xdata space */
-\newline
-__xdata unsigned char * __code p;
-\newline
+\end_inset
-\newline
-/* pointer physically in code space pointing to data in code space */
-\newline
-__code unsigned char * __code p;
-\newline
+-opt-code-size
+\begin_inset LatexCommand index
+name "-\\/-opt-code-size"
-\newline
-/* generic pointer physically located in xdata space */
-\newline
-unsigned char * __xdata p;
-\newline
+\end_inset
-\newline
-/* generic pointer physically located in default memory space */
-\newline
-unsigned char * p;
-\newline
-\newline
-/* the following is a function pointer
-\begin_inset LatexCommand \index{function pointer}
+\series default
+ The compiler will optimize code generation towards compact code, possibly
+ at the expense of code speed.
+\end_layout
-\end_inset
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
- physically located in data space */
-\newline
-char (* __data fp)(void);
-\layout Standard
-Well you get the idea.
-
-\newline
+\end_layout
-\newline
-All unqualified pointers are treated as 3-byte (4-byte for the ds390)
-\emph on
-generic
-\emph default
- pointers.
-
-\size small
+\begin_layout Subsection
+Other Options
+\begin_inset LatexCommand index
+name "Options other"
-\newline
+\end_inset
-\newline
-\size default
-The highest order byte of the
-\emph on
-generic
-\emph default
- pointers contains the data space information.
- Assembler support routines are called whenever data is stored or retrieved
- using
-\emph on
-generic
-\emph default
- pointers.
- These are useful for developing reusable library
-\begin_inset LatexCommand \index{Libraries}
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- routines.
- Explicitly specifying the pointer
-\begin_inset LatexCommand \index{pointer}
+\series bold
+-v\InsetSpace ~
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- type will generate the most efficient code.
-\layout Subsubsection
-Notes on MCS51 memory
-\begin_inset LatexCommand \index{MCS51 memory}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- layout
-\layout Standard
+-version
+\begin_inset LatexCommand index
+name "-\\/-version"
-The 8051 family of microcontrollers have a minimum of 128 bytes of internal
- RAM memory which is structured as follows:
-\newline
+\end_inset
-\newline
-- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R0 to R7,
-
-\newline
-- Bytes 20-2F - 16 bytes to hold 128 bit
-\begin_inset LatexCommand \index{bit}
-\end_inset
+\begin_inset LatexCommand index
+name "-v"
- variables and,
-\newline
-- Bytes 30-7F - 80 bytes for general purpose use.
-\newline
+\end_inset
-\layout Standard
-Additionally some members of the MCS51 family may have up to 128 bytes of
- additional, indirectly addressable, internal RAM memory (
-\emph on
-idata
-\emph default
+\series default
+ displays the sdcc version.
+\end_layout
-\begin_inset LatexCommand \index{idata (mcs51, ds390 storage class)}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-c\InsetSpace ~
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_idata (mcs51, ds390 storage class)}
-\end_inset
+\backslash
+/
+\end_layout
-).
- Furthermore, some chips may have some built in external memory (
-\emph on
-xdata
-\emph default
+\end_inset
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+-compile-only
+\begin_inset LatexCommand index
+name "-\\/-compile-only"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_xdata (mcs51, ds390 storage class)}
+\begin_inset LatexCommand index
+name "-c"
-\end_inset
+\end_inset
-) which should not be confused with the internal, directly addressable RAM
- memory (
-\emph on
-data
-\emph default
-\begin_inset LatexCommand \index{data (mcs51, ds390 storage class)}
+\series default
+ will compile and assemble the source, but will not call the linkage editor.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\series default
-\begin_inset LatexCommand \index{\_\_data (mcs51, ds390 storage class)}
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-).
- Sometimes this built in
-\emph on
-xdata
-\emph default
- memory has to be activated before using it (you can probably find this
- information on the datasheet of the microcontroller your are using, see
- also section
-\begin_inset LatexCommand \ref{sub:Startup-Code}
-\end_inset
+\backslash
+/
+\end_layout
-\SpecialChar ~
-Startup-Code).
-\layout Standard
+\end_inset
-Normally SDCC will only use the first bank
-\begin_inset LatexCommand \index{register bank (mcs51, ds390)}
-\end_inset
+\series bold
+-c1mode
+\begin_inset LatexCommand index
+name "-\\/-c1mode"
- of registers (register bank 0), but it is possible to specify that other
- banks of registers (keyword
-\emph on
-using
-\emph default
-
-\emph on
+\end_inset
-\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
-\end_inset
+\series default
+ reads the preprocessed source from standard input and compiles it.
+ The file name for the assembler output must be specified using the -o option.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\begin_inset LatexCommand \index{\_\_using (mcs51, ds390 register bank)}
+\series bold
+-E
+\begin_inset LatexCommand index
+name "-E"
-\end_inset
+\end_inset
-\emph default
-) should be used in interrupt
-\begin_inset LatexCommand \index{interrupt}
+\series default
+ Run only the C preprocessor.
+ Preprocess all the C source files specified and output the results to standard
+ output.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-o\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-o "
-\begin_inset LatexCommand \index{\_\_interrupt}
+\end_inset
-\end_inset
- routines.
- By default, the compiler will place the stack after the last byte of allocated
- memory for variables.
- For example, if the first 2 banks of registers are used, and only four
- bytes are used for
-\emph on
-data
-\emph default
- variables, it will position the base of the internal stack at address 20
- (0x14).
- This implies that as the stack
-\begin_inset LatexCommand \index{stack}
+\series default
+ The output path where everything will be placed or the file name used for
+ all generated output files.
+ If the parameter is a path, it must have a trailing slash (or backslash
+ for the Windows binaries) to be recognized as a path.
+ Note for Windows users: if the path contains spaces, it should be surrounded
+ by quotes.
+ The trailing backslash should be doubled in order to prevent escaping the
+ final quote, for example:
+\emph on
+-o
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+F:
+\backslash
+Projects
+\backslash
+test3
+\backslash
+output 1
+\backslash
- grows, it will use up the remaining register banks, and the 16 bytes used
- by the 128 bit variables, and 80 bytes for general purpose use.
- If any bit variables are used, the data variables will be placed in unused
- register banks and after the byte holding the last bit variable.
- For example, if register banks 0 and 1 are used, and there are 9 bit variables
- (two bytes used),
-\emph on
-data
-\emph default
- variables will be placed starting from address 0x10 to 0x20 and continue
- at address 0x22.
- You can also use -
-\begin_inset ERT
-status Collapsed
+\backslash
-\layout Standard
+\begin_inset Quotes srd
+\end_inset
-\backslash
-/
-\end_inset
--data-loc
-\begin_inset LatexCommand \index{-\/-data-loc }
+\emph default
+ or put after the final quote, for example:
+\emph on
+-o
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+F:
+\backslash
+Projects
+\backslash
+test3
+\backslash
+output 1
+\begin_inset Quotes srd
+\end_inset
- to specify the start address of the
-\emph on
-data
-\emph default
- and -
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\backslash
-\backslash
-/
-\end_inset
+\emph default
+.
+ The path using slashes for directory delimiters can be used too, for example:
+
+\emph on
+-o
+\begin_inset Quotes sld
+\end_inset
--iram-size
-\begin_inset LatexCommand \index{-\/-iram-size }
+F:/Projects/test3/output 1/
+\begin_inset Quotes srd
+\end_inset
-\end_inset
- to specify the size of the total internal RAM (
-\emph on
-data
-\emph default
-+
-\emph on
-idata
-\emph default
-).
-
-\newline
+\emph default
+.
+\end_layout
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-By default the 8051 linker will place the stack after the last byte of (i)data
- variables.
- Option -
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--stack-loc
-\begin_inset LatexCommand \index{-\/-stack-loc }
+\end_inset
-\end_inset
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
- allows you to specify the start of the stack, i.e.
- you could start it after any data in the general purpose area.
- If your microcontroller has additional indirectly addressable internal
- RAM (
-\emph on
-idata
-\emph default
-) you can place the stack on it.
- You may also need to use -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\series default
+\size large
+
+\size default
+All functions in the source file will be compiled as
+\emph on
+reentrant
+\emph default
--xdata-loc
-\begin_inset LatexCommand \index{-\/-xdata-loc}
+\begin_inset LatexCommand index
+name "reentrant"
-\end_inset
+\end_inset
- to set the start address of the external RAM (
-\emph on
-xdata
-\emph default
-) and -
-\begin_inset ERT
-status Collapsed
+, i.e.
+ the parameters and local variables will be allocated on the stack
+\begin_inset LatexCommand index
+name "stack"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+.
+ See section
+\begin_inset LatexCommand ref
+reference "sec:Parameters-and-Local-Variables"
--xram-size
-\begin_inset LatexCommand \index{-\/-xram-size }
+\end_inset
-\end_inset
+ Parameters and Local Variables for more details.
+ If this option is used all source files in the project should be compiled
+ with this option.
+ It automatically implies -
+\series bold
- to specify its size.
- Same goes for the code memory, using -
\begin_inset ERT
-status Collapsed
+status open
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--code-loc
-\begin_inset LatexCommand \index{-\/-code-loc }
+\end_inset
-\end_inset
- and -
+\series default
+-int-long-reent and -
+\series bold
+
\begin_inset ERT
-status Collapsed
+status open
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--code-size
-\begin_inset LatexCommand \index{-\/-code-size }
+\end_inset
-\end_inset
-.
- If in doubt, don't specify any options and see if the resulting memory
- layout is appropriate, then you can adjust it.
-\layout Standard
-\added_space_bottom bigskip
-The linker generates two files with memory allocation information.
- The first, with extension .map
-\begin_inset LatexCommand \index{.map}
+\series default
+-float-reent.
+
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- shows all the variables and segments.
- The second with extension .mem
-\begin_inset LatexCommand \index{.mem}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- shows the final memory layout.
- The linker will complain either if memory segments overlap, there is not
- enough memory, or there is not enough space for stack.
- If you get any linking warnings and/or errors related to stack or segments
- allocation, take a look at either the .map or .mem files to find out what
- the problem is.
- The .mem file may even suggest a solution to the problem.
-\layout Subsection
-Z80/Z180 Storage Class
-\begin_inset LatexCommand \index{Z80!Storage class}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- Language Extensions
-\layout Subsubsection
+-callee-saves
+\begin_inset LatexCommand index
+name "-\\/-callee-saves"
-sfr
-\begin_inset LatexCommand \index{sfr}
+\end_inset
-\end_inset
+
+\begin_inset LatexCommand label
+name "lyx:--callee-saves-function1[,function2][,function3]..."
+\end_inset
-\begin_inset LatexCommand \index{\_\_sfr}
+function1[,function2][,function3]....
-\end_inset
+\series default
+ The compiler by default uses a caller saves convention for register saving
+ across function calls, however this can cause unnecessary register pushing
+ and popping when calling small functions from larger functions.
+ This option can be used to switch the register saving convention for the
+ function names specified.
+ The compiler will not save registers when calling these functions, no extra
+ code will be generated at the entry and exit (function prologue
+\series bold
- (in/out to 8-bit addresses)
-\layout Standard
+\begin_inset LatexCommand index
+name "function prologue"
-The Z80
-\begin_inset LatexCommand \index{Z80}
+\end_inset
-\end_inset
- family has separate address spaces for memory and
-\emph on
-i
-\emph default
-nput/
-\emph on
-o
-\emph default
-utput memory.
- I/O memory
-\begin_inset LatexCommand \index{I/O memory (Z80, Z180)}
+\series default
+ and epilogue
+\series bold
-\end_inset
+\begin_inset LatexCommand index
+name "function epilogue"
+
+\end_inset
-\begin_inset LatexCommand \index{Z80!I/O memory}
+\series default
+) for these functions to save and restore the registers used by these functions,
+ this can SUBSTANTIALLY reduce code and improve run time performance of
+ the generated code.
+ In the future the compiler (with inter procedural analysis) will be able
+ to determine the appropriate scheme to use for each function call.
+ DO NOT use this option for built-in functions such as _mulint..., if this
+ option is used for a library function the appropriate library function
+ needs to be recompiled with the same option.
+ If the project consists of multiple source files then all the source file
+ should be compiled with the same -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{Z180!I/O memory}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- is accessed with special instructions, e.g.:
-\layout Verse
+-callee-saves option string.
+ Also see #pragma\InsetSpace ~
+callee_saves
+\begin_inset LatexCommand index
+name "\\#pragma callee\\_saves"
+\end_inset
-\family typewriter
-sfr at 0x78 IoPort;\SpecialChar ~
-\SpecialChar ~
-/* define a var in I/O space at 78h called IoPort */
-\layout Standard
+\begin_inset LatexCommand vpageref
+reference "ite:callee_saves-function1[,function2[,function3...]]--"
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
+\end_inset
+.
+\end_layout
-\family typewriter
-3E 01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ld a,#0x01
-\newline
-D3 78\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-out (_IoPort),a
-\layout Subsubsection
+\begin_layout List
+\labelwidthstring 00.00.0000
-banked sfr
-\begin_inset LatexCommand \index{sfr}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_sfr}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- (in/out to 16-bit addresses)
-\layout Standard
+-all-callee-saves
+\begin_inset LatexCommand index
+name "-\\/-all-callee-saves"
-The keyword
-\emph on
-banked
-\emph default
- is used to support 16 bit addresses in I/O memory e.g.:
-\layout Verse
+\end_inset
-\family typewriter
-sfr banked at
-\begin_inset LatexCommand \index{at}
+\series default
+ Function of -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_at}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- 0x123 IoPort;
-\layout Standard
+-callee-saves will be applied to all functions by default.
+\end_layout
-Writing 0x01 to this variable generates the assembly code:
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-01 23 01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ld bc,#_IoPort
-\newline
-3E 01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ld a,#0x01
-\newline
-ED 79\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-out (c),a
-\layout Subsubsection
+\begin_layout Standard
-sfr
-\begin_inset LatexCommand \index{sfr}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\begin_inset LatexCommand \index{\_\_sfr}
+-debug
+\begin_inset LatexCommand index
+name "-\\/-debug"
-\end_inset
+\end_inset
- (in0/out0 to 8 bit addresses on Z180
-\begin_inset LatexCommand \index{Z180}
+
+\series default
+When this option is used the compiler will generate debug information.
+ The debug information collected in a file with .cdb extension can be used
+ with the SDCDB.
+ For more information see documentation for SDCDB.
+ Another file with no extension contains debug information in AOMF or AOMF51
+\begin_inset LatexCommand index
+name "AOMF, AOMF51"
-\end_inset
+\end_inset
-/HD64180
-\begin_inset LatexCommand \index{HD64180 (see Z180)}
+ format which is commonly used by third party tools.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
-)
-\layout Standard
-\added_space_bottom bigskip
-The compiler option -
-\begin_inset ERT
-status Collapsed
+\series bold
+-S
+\begin_inset LatexCommand index
+name "-S"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--portmode
-\begin_inset LatexCommand \index{Z180!Options!-\/-portmode}
+\series default
+\size large
+
+\size default
+Stop after the stage of compilation proper; do not assemble.
+ The output is an assembler code file for the input file specified.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
-=180 (80) and a compiler #pragma\SpecialChar ~
-portmode
-\begin_inset LatexCommand \index{Z180!Pragmas!\#pragma portmode}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
-ns
-\family typewriter
-in0/out0
-\family default
- instead of
-\family typewriter
-in/out
-\family default
-.
- If you include the file z180.h this will be set automatically.
-\layout Subsection
-HC08 Storage Class
-\begin_inset LatexCommand \index{HC08!Storage class}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- Language Extensions
-\layout Subsubsection
+-int-long-reent
+\begin_inset LatexCommand index
+name "-\\/-int-long-reent"
-data
-\begin_inset LatexCommand \index{data (hc08 storage class)}
+\end_inset
-\end_inset
+\series default
+ Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant.
+ Note by default these libraries are compiled as non-reentrant.
+ See section Installation for more details.
+\end_layout
-\begin_inset LatexCommand \index{\_\_data (hc08 storage class)}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
-
-\layout Standard
+\begin_layout Standard
-The data storage class declares a variable that resides in the first 256
- bytes of memory (the direct page).
- The HC08
-\begin_inset LatexCommand \index{HC08}
-\end_inset
+\backslash
+/
+\end_layout
- is most efficient at accessing variables (especially pointers) stored here.
-\layout Subsubsection
+\end_inset
-xdata
-\begin_inset LatexCommand \index{xdata (hc08 storage class)}
+-cyclomatic
+\begin_inset LatexCommand index
+name "-\\/-cyclomatic"
-\end_inset
+\end_inset
+
+\series default
+This option will cause the compiler to generate an information message for
+ each function in the source file.
+ The message contains some
+\emph on
+important
+\emph default
+ information about the function.
+ The number of edges and nodes the compiler detected in the control flow
+ graph of the function, and most importantly the
+\emph on
+cyclomatic complexity
+\begin_inset LatexCommand index
+name "Cyclomatic complexity"
-\begin_inset LatexCommand \index{\_\_xdata (hc08 storage class)}
+\end_inset
-\end_inset
-
-\layout Standard
-\added_space_bottom bigskip
-The xdata storage class declares a variable that can reside anywhere in
- memory.
- This is the default if no storage class is specified.
-
-\layout Section
+\emph default
+ see section on Cyclomatic Complexity for more details.
+\end_layout
-Absolute Addressing
-\begin_inset LatexCommand \index{Absolute addressing}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\layout Standard
-Data items can be assigned an absolute address with the
-\emph on
-at
-\begin_inset LatexCommand \index{at}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-float-reent
+\begin_inset LatexCommand index
+name "-\\/-float-reent"
-\begin_inset LatexCommand \index{\_\_at}
+\end_inset
-\end_inset
-
-\emph default
- keyword, in addition to a storage class, e.g.:
-\layout Verse
+\series default
+ Floating point library is compiled as reentrant
+\begin_inset LatexCommand index
+name "reentrant"
+\end_inset
-\family typewriter
-xdata
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+.
+ See section Installation for more details.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{\_\_xdata (mcs51, ds390 storage class)}
+\begin_layout Standard
-\end_inset
- at
-\begin_inset LatexCommand \index{at}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-funsigned-char
+\begin_inset LatexCommand index
+name "-\\/-funsigned-char"
-\begin_inset LatexCommand \index{\_\_at}
+\end_inset
-\end_inset
- 0x7ffe unsigned int chksum;
-\layout Standard
+\series default
+ The default signedness for every type is
+\family typewriter
+signed
+\family default
+.
+ In some embedded environments the default signedness of
+\family typewriter
+char
+\family default
+ is
+\family typewriter
+unsigned
+\family default
+.
+ To set the signess for characters to unsigned, use the option -
+\series bold
-or, better conforming to ISO/IEC 9899 C:
-\layout Verse
+\begin_inset ERT
+status open
+\begin_layout Standard
-\family typewriter
-__xdata __at (0x7ffe) unsigned int chksum;
-\layout Standard
-In the above example the variable chksum will be located at 0x7ffe and 0x7fff
- of the external ram.
- The compiler does
-\emph on
-not
-\emph default
- reserve any space for variables declared in this way
-\begin_inset Marginal
-collapsed true
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-\series bold
-\SpecialChar ~
-!
-\end_inset
+\series default
+-funsigned-char.
+ If this option is set and no signedness keyword (unsigned/signed) is given,
+ a char will be signed.
+ All other types are unaffected.
+\end_layout
- (they are implemented with an equate in the assembler).
- Thus it is left to the programmer to make sure there are no overlaps with
- other variables that are declared without the absolute address.
- The assembler listing file (.lst
-\begin_inset LatexCommand \index{.lst}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
-) and the linker output files (.rst
-\begin_inset LatexCommand \index{.rst}
+\begin_layout Standard
-\end_inset
-) and (.map
-\begin_inset LatexCommand \index{.map}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-) are good places to look for such overlaps.
- Variables with an absolute address are
-\emph on
-not
-\begin_inset Marginal
-collapsed true
+-main-return
+\begin_inset LatexCommand index
+name "-\\/-main-return"
-\layout Standard
+\end_inset
-\series bold
-\SpecialChar ~
-!
-\end_inset
-
-
-\emph default
- initialized
-\begin_inset LatexCommand \index{Variable initialization}
-
-\end_inset
-
-.
-\layout Standard
-
-In case of memory mapped I/O devices the keyword
-\emph on
-volatile
-\emph default
- has to be used to tell the compiler that accesses might not be removed:
-\layout Verse
-
+\series default
+ This option can be used if the code generated is called by a monitor program
+ or if the main routine includes an endless loop.
+ This option results in slightly smaller code and saves two bytes of stack
+ space.
+ The return from the 'main'
+\begin_inset LatexCommand index
+name "main return"
-\family typewriter
-volatile
-\begin_inset LatexCommand \index{volatile}
+\end_inset
-\end_inset
+ function will return to the function calling main.
+ The default setting is to lock up i.e.
+ generate a '
+\family typewriter
+sjmp .
+\family default
+'.
+\end_layout
- __xdata
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- __at
-\begin_inset LatexCommand \index{at}
+\begin_layout Standard
-\end_inset
- (0x8000) unsigned char PORTA_8255;
-\layout Standard
+\backslash
+/
+\end_layout
-For some architectures (mcs51) array accesses are more efficient if an (xdata/fa
-r) array
-\family typewriter
-\size footnotesize
+\end_inset
-\begin_inset LatexCommand \index{Aligned array}
+-nostdinc
+\begin_inset LatexCommand index
+name "-\\/-nostdinc"
-\end_inset
+\end_inset
-\family default
-\size default
- starts at a block (256 byte) boundary
-\begin_inset LatexCommand \index{block boundary}
+\series default
+ This will prevent the compiler from passing on the default include path
+ to the preprocessor.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- (section
-\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- has an example).
-\newline
-Absolute addresses can be specified for variables in all storage classes,
- e.g.:
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-__bit
-\begin_inset LatexCommand \index{bit}
+\end_inset
-\end_inset
+-nostdlib
+\begin_inset LatexCommand index
+name "-\\/-nostdlib"
- __at
-\begin_inset LatexCommand \index{at}
+\end_inset
-\end_inset
- (0x02) bvar;
-\layout Standard
+\series default
+ This will prevent the compiler from passing on the default library
+\begin_inset LatexCommand index
+name "Libraries"
-The above example will allocate the variable at offset 0x02 in the bit-addressab
-le space.
- There is no real advantage to assigning absolute addresses to variables
- in this manner, unless you want strict control over all the variables allocated.
- One possible use would be to write hardware portable code.
- For example, if you have a routine that uses one or more of the microcontroller
- I/O pins, and such pins are different for two different hardwares, you
- can declare the I/O pins in your routine using:
-\layout Verse
+\end_inset
+ path to the linker.
+\end_layout
-\family typewriter
-extern volatile
-\begin_inset LatexCommand \index{volatile}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- __bit MOSI;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* master out, slave in */
-\newline
-extern volatile __bit MISO;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* master in, slave out */
-\newline
-extern volatile __bit MCLK;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* master clock */
-\newline
-
-\newline
-/* Input and Output of a byte on a 3-wire serial bus.
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-If needed adapt polarity of clock, polarity of data and bit order
-\newline
-\SpecialChar ~
-*/
-\newline
-unsigned char spi_io(unsigned char out_byte)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-unsigned char i=8;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-do {
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-MOSI = out_byte & 0x80;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-out_byte <<= 1;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-MCLK = 1;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* _asm nop _endasm; */\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* for slow peripherals */
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-if(MISO)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-out_byte += 1;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-MCLK = 0;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-} while(--i);
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-return out_byte;
-\newline
-}
-\layout Standard
+\begin_layout Standard
-Then, someplace in the code for the first hardware you would use
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-__bit __at
-\begin_inset LatexCommand \index{at}
+\end_inset
-\end_inset
+-verbose
+\begin_inset LatexCommand index
+name "-\\/-verbose"
+\end_inset
-\begin_inset LatexCommand \index{\_\_at}
-\end_inset
+\series default
+ Shows the various actions the compiler is performing.
+\end_layout
- (0x80) MOSI;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 0, bit 0 */
-\newline
-__bit __at (0x81) MISO;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 0, bit 1 */
-\newline
-__bit __at (0x82) MCLK;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 0, bit 2 */
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-Similarly, for the second hardware you would use
-\layout Verse
+\series bold
+-V
+\begin_inset LatexCommand index
+name "-V"
+\end_inset
-\family typewriter
-__bit __at (0x83) MOSI;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 0, bit 3 */
-\newline
-__bit __at (0x91) MISO;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 1, bit 1 */
-\newline
-__bit
-\begin_inset LatexCommand \index{bit}
-\end_inset
+\series default
+ Shows the actual commands the compiler is executing.
+\end_layout
- __at (0x92) MCLK;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* I/O port 1, bit 2 */
-\layout Standard
-\added_space_bottom bigskip
-and you can use the same hardware dependent routine without changes, as
- for example in a library.
- This is somehow similar to sbit, but only one absolute address has to be
- specified in the whole project.
-\layout Section
+\begin_layout List
+\labelwidthstring 00.00.0000
-Parameters
-\begin_inset LatexCommand \index{Parameters}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-\begin_inset LatexCommand \index{function parameter}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- & Local Variables
-\begin_inset LatexCommand \index{local variables}
+-no-c-code-in-asm
+\begin_inset LatexCommand index
+name "-\\/-no-c-code-in-asm"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \label{sec:Parameters-and-Local-Variables}
+\series default
+ Hides your ugly and inefficient c-code from the asm file, so you can always
+ blame the compiler :)
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-Automatic (local) variables and parameters to functions can either be placed
- on the stack or in data-space.
- The default action of the compiler is to place these variables in the internal
- RAM (for small model) or external RAM (for large model).
- This in fact makes them similar to
-\emph on
-static
-\begin_inset LatexCommand \index{static}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\emph default
- so by default functions are non-reentrant
-\begin_inset LatexCommand \index{reentrant}
+-fverbose-asm
+\begin_inset LatexCommand index
+name "-\\/-no-gen-comments"
-\end_inset
+\end_inset
-.
-
-\newline
-\newline
-They can be placed on the stack
-\begin_inset LatexCommand \index{stack}
+\series default
+ Include code generator and peep-hole comments in the generated asm files.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- by using the
-\emph on
- -
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\end_inset
+
+-no-peep-comments
+\begin_inset LatexCommand index
+name "-\\/-no-peep-comments"
-\end_inset
+\end_inset
-\emph default
- option, by using
-\emph on
-#pragma\SpecialChar ~
-stackauto
-\emph default
+\series default
+ Don't include peep-hole comments in the generated asm files even if -
+\series bold
-\begin_inset LatexCommand \index{\#pragma stackauto}
+\begin_inset ERT
+status open
-\end_inset
+\begin_layout Standard
- or by using the
-\emph on
-reentrant
-\begin_inset LatexCommand \index{reentrant}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\emph default
- keyword in the function declaration, e.g.:
-\layout Verse
+\series default
+-fverbose-asm option is specified.
+\end_layout
-\family typewriter
-unsigned char foo(char i) __reentrant
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-Since stack space on 8051 is limited, the
-\emph on
-reentrant
-\emph default
-keyword or the
-\emph on
- -
+\series bold
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--stack-auto
-\emph default
- option should be used sparingly.
- Note that the reentrant keyword just means that the parameters & local
- variables will be allocated to the stack, it
-\emph on
-does not
-\emph default
- mean that the function is register bank
-\begin_inset LatexCommand \index{register bank (mcs51, ds390)}
+\end_inset
-\end_inset
+-i-code-in-asm
+\begin_inset LatexCommand index
+name "-\\/-i-code-in-asm"
- independent.
-\newline
+\end_inset
-\newline
-Local variables
-\begin_inset LatexCommand \index{local variables}
-\end_inset
+\series default
+ Include i-codes in the asm file.
+ Sounds like noise but is most helpful for debugging the compiler itself.
+\end_layout
- can be assigned storage classes and absolute
-\begin_inset LatexCommand \index{Absolute addressing}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- addresses, e.g.:
-\layout Verse
+\begin_layout Standard
-\family typewriter
-unsigned char foo()
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-__xdata unsigned char i;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-__bit bvar;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-__data __at
-\begin_inset LatexCommand \index{at}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- (0x31) unsigned char j;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
+-less-pedantic
+\begin_inset LatexCommand index
+name "pedantic"
-In the above example the variable
-\emph on
-i
-\emph default
- will be allocated in the external ram,
-\emph on
-bvar
-\emph default
- in bit addressable space and
-\emph on
- j
-\emph default
- in internal ram.
- When compiled with
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-less-pedantic"
--stack-auto
-\emph default
- or when a function is declared as
-\emph on
-reentrant
-\emph default
- this should only be done for static variables.
-\layout Standard
+\end_inset
-Parameters
-\begin_inset LatexCommand \index{function parameter}
-\end_inset
+\series default
- however are not allowed any storage class
-\begin_inset LatexCommand \index{Storage class}
+\begin_inset LatexCommand label
+name "lyx:--less-pedantic"
-\end_inset
+\end_inset
-, (storage classes for parameters will be ignored), their allocation is
- governed by the memory model in use, and the reentrancy options.
-\layout Standard
+ Disable some of the more pedantic warnings
+\begin_inset LatexCommand index
+name "Warnings"
-It is however allowed to use bit parameters in reentrant functions and also
- non-static local bit variables are supported.
- Efficient use is limited to 8 semi-bitregisters in bit space.
- They are pushed and popped to stack
-\begin_inset LatexCommand \index{stack}
+\end_inset
-\end_inset
+.
+ For more details, see the less_pedantic pragma
+\begin_inset LatexCommand vpageref
+reference "ite:less_pedantic"
- as a single byte just like the normal registers.
-\layout Section
+\end_inset
-Overlaying
-\begin_inset LatexCommand \label{sub:Overlaying}
+.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{Overlaying}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-For non-reentrant
-\begin_inset LatexCommand \index{reentrant}
+-disable-warning\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "-\\/-disable-warning"
-\end_inset
+\end_inset
- functions SDCC will try to reduce internal ram space usage by overlaying
- parameters and local variables of a function (if possible).
- Parameters and local variables
-\begin_inset LatexCommand \index{local variables}
-\end_inset
+\series default
+ Disable specific warning with number .
+\end_layout
- of a function will be allocated to an overlayable segment if the function
- has
-\emph on
-no other function calls and the function is non-reentrant and the memory
- model
-\begin_inset LatexCommand \index{Memory model}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- is small.
+\begin_layout Standard
-\emph default
- If an explicit storage class
-\begin_inset LatexCommand \index{Storage class}
-\end_inset
+\backslash
+/
+\end_layout
- is specified for a local variable, it will NOT be overlayed.
-\layout Standard
+\end_inset
-Note that the compiler (not the linkage editor) makes the decision for overlayin
-g the data items.
- Functions that are called from an interrupt service routine
-\begin_inset Marginal
-collapsed true
+-Werror
+\begin_inset LatexCommand index
+name "-\\/-Werror"
-\layout Standard
+\end_inset
-\series bold
-!
-\end_inset
+\series default
+ Treat all warnings as errors.
+\end_layout
- should be preceded by a #pragma\SpecialChar ~
-nooverlay
-\begin_inset LatexCommand \index{\#pragma nooverlay}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- if they are not reentrant.
-\layout Standard
+\begin_layout Standard
-Also note that the compiler does not do any processing of inline assembler
- code, so the compiler might incorrectly assign local variables and parameters
- of a function into the overlay segment if the inline assembler code calls
- other c-functions that might use the overlay.
- In that case the #pragma\SpecialChar ~
-nooverlay should be used.
-\layout Standard
-Parameters and local variables of functions that contain 16 or 32 bit multiplica
-tion
-\begin_inset LatexCommand \index{Multiplication}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- or division
-\begin_inset LatexCommand \index{Division}
+-print-search-dirs
+\begin_inset LatexCommand index
+name "-\\/-print-search-dirs"
-\end_inset
+\end_inset
- will NOT be overlayed since these are implemented using external functions,
- e.g.:
-\layout Verse
+\series default
+ Display the directories in the compiler's search path
+\end_layout
-\family typewriter
-#pragma save
-\newline
-#pragma nooverlay
-\begin_inset LatexCommand \index{\#pragma nooverlay}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
-
-\newline
-void set_error(unsigned char errcd)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-P3 = errcd;
-\newline
-}
-\newline
-#pragma restore
-\newline
+\begin_layout Standard
-\newline
-void some_isr () __interrupt
-\begin_inset LatexCommand \index{interrupt}
-\end_inset
+\backslash
+/
+\end_layout
- (2)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-set_error(10);
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
-\added_space_bottom bigskip
-In the above example the parameter
-\emph on
-errcd
-\emph default
- for the function
-\emph on
-set_error
-\emph default
- would be assigned to the overlayable segment if the #pragma\SpecialChar ~
-nooverlay was
- not present, this could cause unpredictable runtime behavior when called
- from an interrupt service routine.
- The #pragma\SpecialChar ~
-nooverlay ensures that the parameters and local variables for
- the function are NOT overlayed.
-\layout Section
+\end_inset
-Interrupt Service Routines
-\begin_inset LatexCommand \label{sub:Interrupt-Service-Routines}
+-vc
+\begin_inset LatexCommand index
+name "-\\/-vc"
-\end_inset
+\end_inset
-\layout Subsection
+\series default
+ Display errors and warnings using MSVC style, so you can use SDCC with
+ the visual studio IDE
+\begin_inset LatexCommand index
+name "IDE"
-General Information
-\layout Standard
+\end_inset
-SDCC allows
-\emph on
-i
-\emph default
-nterrupt
-\emph on
-s
-\emph default
-ervice
-\emph on
-r
-\emph default
-outines to be coded in C, with some extended keywords.
-\layout Verse
+.
+ With SDCC both offering a GCC-like (the default) and a MSVC-like
+\begin_inset LatexCommand index
+name "MSVC output style"
+\end_inset
-\family typewriter
-void timer_isr (void) __interrupt (1) __using (1)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
+ output style, integration into most programming editors should be straightforwa
+rd.
+\end_layout
-The optional number following the
-\emph on
-interrupt
-\begin_inset LatexCommand \index{interrupt}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset LatexCommand \index{\_\_interrupt}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\emph default
- keyword is the interrupt number this routine will service.
- When present, the compiler will insert a call to this routine in the interrupt
- vector table
-\begin_inset LatexCommand \index{interrupt vector table}
+-use-stdout
+\begin_inset LatexCommand index
+name "-\\/-use-stdout"
-\end_inset
+\end_inset
- for the interrupt number specified.
- If you have multiple source files in your project, interrupt service routines
- can be present in any of them, but a prototype of the isr MUST be present
- or included in the file that contains the function
-\emph on
-main
-\emph default
-.
- The optional (8051 specific) keyword
-\emph on
-using
-\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
-\end_inset
+\series default
+ Send errors and warnings to stdout instead of stderr.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\begin_inset LatexCommand \index{\_\_using (mcs51, ds390 register bank)}
+\series bold
+-Wa\InsetSpace ~
+asmOption[,asmOption]
+\series default
-\end_inset
+\begin_inset LatexCommand index
+name "-Wa asmOption[,asmOption]"
+\end_inset
-\emph default
- can be used to tell the compiler to use the specified register bank when
- generating code for this function.
-
-\newline
-Interrupt service routines open the door for some very interesting bugs:
-\layout Subsubsection
+...
+ Pass the asmOption to the assembler
+\begin_inset LatexCommand index
+name "Options assembler"
+\end_inset
-\begin_inset LatexCommand \label{sub:Common-interrupt-pitfall-volatile}
-\end_inset
+\begin_inset LatexCommand index
+name "Assembler options"
-Common interrupt pitfall: variable not declared
-\emph on
-volatile
-\layout Standard
+\end_inset
-If an interrupt service routine changes variables which are accessed by
- other functions these variables have to be declared
-\emph on
-volatile
-\emph default
+.
+ See file sdcc/as/doc/asxhtm.html for assembler options.cd
+\end_layout
-\begin_inset LatexCommand \index{volatile}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
-.
- See
-\begin_inset LatexCommand \url{http://en.wikipedia.org/wiki/Volatile_variable}
+\begin_layout Standard
-\end_inset
- .
-\layout Subsubsection
+\backslash
+/
+\end_layout
+\end_inset
-\begin_inset LatexCommand \label{sub:Common-interrupt-pitfall-non-atomic}
+-std-sdcc89
+\begin_inset LatexCommand index
+name "-\\/-std-sdcc89"
-\end_inset
+\end_inset
-Common interrupt pitfall:
-\emph on
-non-atomic access
-\layout Standard
-If the access to these variables is not
-\emph on
-atomic
-\begin_inset LatexCommand \index{atomic}
+\series default
+ Generally follow the C89 standard, but allow SDCC features that conflict
+ with the standard (default).
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\emph default
- (i.e.
- the processor needs more than one instruction for the access and could
- be interrupted while accessing the variable) the interrupt must be disabled
- during the access to avoid inconsistent data.
-
-\newline
-Access to 16 or 32 bit variables is obviously not atomic on 8 bit CPUs and
- should be protected by disabling interrupts.
- You're not automatically on the safe side if you use 8 bit variables though.
- We need an example here: f.e.
- on the 8051 the harmless looking
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
-\family typewriter
-flags\SpecialChar ~
-|=\SpecialChar ~
-0x80;
-\family default
+\backslash
+/
+\end_layout
-\begin_inset Quotes sld
-\end_inset
+\end_inset
- is not atomic if
-\family typewriter
-flags
-\family default
- resides in xdata.
- Setting
-\begin_inset Quotes srd
-\end_inset
+-std-c89
+\begin_inset LatexCommand index
+name "-\\/-std-c89"
+\end_inset
-\family typewriter
-flags\SpecialChar ~
-|=\SpecialChar ~
-0x40;
-\family default
-\begin_inset Quotes sld
-\end_inset
+\series default
+ Follow the C89 standard and disable SDCC features that conflict with the
+ standard.
+\end_layout
- from within an interrupt routine might get lost if the interrupt occurs
- at the wrong time.
-
-\begin_inset Quotes sld
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-counter\SpecialChar ~
-+=\SpecialChar ~
-8;
-\family default
+\begin_layout Standard
-\begin_inset Quotes srd
-\end_inset
- is not atomic on the 8051 even if
-\family typewriter
-counter
-\family default
- is located in data memory.
-\newline
-Bugs like these are hard to reproduce and can cause a lot of trouble.
-
-\layout Subsubsection
+\backslash
+/
+\end_layout
+\end_inset
-\begin_inset LatexCommand \label{sub:Common-interrupt-pitfall-stack-overflow}
+-std-sdcc99
+\begin_inset LatexCommand index
+name "-\\/-std-sdcc99"
-\end_inset
+\end_inset
-Common interrupt pitfall:
-\emph on
-stack overflow
-\layout Standard
-The return address and the registers used in the interrupt service routine
- are saved on the stack
-\begin_inset LatexCommand \index{stack}
+\series default
+ Generally follow the C99 standard, but allow SDCC features that conflict
+ with the standard (incomplete support).
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- so there must be sufficient stack space.
- If there isn't variables or registers (or even the return address itself)
- will be corrupted.
- This
-\emph on
-stack overflow
-\emph default
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{stack overflow}
+\begin_layout Standard
-\end_inset
- is most likely to happen if the interrupt occurs during the
-\begin_inset Quotes sld
-\end_inset
+\backslash
+/
+\end_layout
-deepest
-\begin_inset Quotes srd
-\end_inset
+\end_inset
- subroutine when the stack is already in use for f.e.
- many return addresses.
-\layout Subsubsection
+-std-c99
+\begin_inset LatexCommand index
+name "-\\/-std-sdcc99"
+\end_inset
-\begin_inset LatexCommand \label{sub:Common-interrupt-pitfall-non-reentrant}
-\end_inset
+\series default
+ Follow the C99 standard and disable SDCC features that conflict with the
+ standard (incomplete support).
+\end_layout
-Common interrupt pitfall:
-\emph on
-use of non-reentrant functions
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-A special note here, int (16 bit) and long (32 bit) integer division
-\begin_inset LatexCommand \index{Division}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-, multiplication
-\begin_inset LatexCommand \index{Multiplication}
-\end_inset
+\backslash
+/
+\end_layout
- & modulus
-\begin_inset LatexCommand \index{Modulus}
+\end_inset
-\end_inset
+-codeseg
+\series default
- and floating-point
-\begin_inset LatexCommand \index{Floating point support}
+\begin_inset LatexCommand index
+name "-\\/-codeseg "
-\end_inset
+\end_inset
- operations are implemented using external support routines.
- If an interrupt service routine needs to do any of these operations then
- the support routines (as mentioned in a following section) will have to
- be recompiled using the
-\emph on
- -
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\begin_inset LatexCommand label
+name "lyx:-codeseg"
-\backslash
-/
-\end_inset
+\end_inset
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\InsetSpace ~
+ The name to be used for the code
+\begin_inset LatexCommand index
+name "code"
+
+\end_inset
-\end_inset
+ segment, default CSEG.
+ This is useful if you need to tell the compiler to put the code in a special
+ segment so you can later on tell the linker to put this segment in a special
+ place in memory.
+ Can be used for instance when using bank switching to put the code in a
+ bank.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\emph default
- option and the source file will need to be compiled using the
-\emph on
+\series bold
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--int-long-reent
-\emph default
+\end_inset
-\begin_inset LatexCommand \index{-\/-int-long-reent}
+-constseg
+\series default
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-constseg "
- compiler option.
-
-\newline
-Note, the type promotion
-\begin_inset LatexCommand \index{type promotion}
+\end_inset
-\end_inset
+\InsetSpace ~
+ The name to be used for the const
+\begin_inset LatexCommand index
+name "const"
- required by ANSI C can cause 16 bit routines to be used
-\begin_inset Marginal
-collapsed true
+\end_inset
-\layout Standard
+ segment, default CONST.
+ This is useful if you need to tell the compiler to put the const data in
+ a special segment so you can later on tell the linker to put this segment
+ in a special place in memory.
+ Can be used for instance when using bank switching to put the const data
+ in a bank.
+\end_layout
+\begin_layout List
+\labelwidthstring 00.00.0000
-\series bold
-\SpecialChar ~
-!
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- without the programmer being aware of it.
- See f.e.
- the cast
-\family typewriter
-(unsigned char)(tail-1)
-\family default
- within the if clause in section
-\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
+\begin_layout Standard
-\end_inset
-.
-\layout Standard
-\added_space_bottom bigskip
-Calling other functions from an interrupt service routine is not recommended,
- avoid it if possible.
- Note that when some function is called from an interrupt service routine
- it should be preceded by a #pragma\SpecialChar ~
-nooverlay
-\begin_inset LatexCommand \index{\#pragma nooverlay}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- if it is not reentrant.
- Furthermore nonreentrant functions should not be called from the main program
- while the interrupt service routine might be active.
- They also must not be called from low priority interrupt service routines
- while a high priority interrupt service routine might be active.
- You could use semaphores or make the function
-\emph on
- critical
-\emph default
- if all parameters are passed in registers.
-\newline
- Also see section
-\begin_inset LatexCommand \ref{sub:Overlaying}
+-fdollars-in-identifiers
+\begin_inset LatexCommand index
+name "-\\/-fdollars-in-identifiers"
-\end_inset
+\end_inset
-\SpecialChar ~
-about Overlaying and section
-\begin_inset LatexCommand \ref{sub:Functions-using-private-banks}
-\end_inset
+\series default
+ Permit '$' as an identifier character.
+\end_layout
-\SpecialChar ~
-about Functions using private register banks.
-\layout Subsection
+\begin_layout List
+\labelwidthstring 00.00.0000
-MCS51/DS390 Interrupt Service Routines
-\layout Standard
+\series bold
+-
+\begin_inset ERT
+status collapsed
-Interrupt
-\begin_inset LatexCommand \index{interrupt}
+\begin_layout Standard
-\end_inset
- numbers and the corresponding address & descriptions for the Standard 8051/8052
- are listed below.
- SDCC will automatically adjust the
-\begin_inset LatexCommand \index{interrupt vector table}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- to the maximum interrupt number specified.
-\newline
+-more-pedantic
+\series default
-\layout Standard
-\align center
+\begin_inset LatexCommand index
+name "-\\/-more-pedantic"
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-Interrupt #
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "pedantic"
-\layout Standard
+\end_inset
-Description
-\end_inset
-
-
-\begin_inset Text
+ Actually this is
+\series bold
+\emph on
+not
+\series default
+\emph default
+ a SDCC compiler option but if you want
+\emph on
+more
+\emph default
+ warnings you can use a separate tool dedicated to syntax checking like
+ splint
+\begin_inset LatexCommand label
+name "lyx:more-pedantic-SPLINT"
-\layout Standard
+\end_inset
-Vector Address
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "lint (syntax checking tool)"
-0
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+
+\begin_inset LatexCommand url
+target "http://www.splint.org"
-External 0
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+.
+ To make your source files parseable by splint you will have to include
+
+\family sans
+lint.h
+\family default
-0x0003
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "splint (syntax checking tool)"
-\layout Standard
+\end_inset
-1
-\end_inset
-
-
-\begin_inset Text
+ in your source file and add brackets around extended keywords (like
+\family sans
-\layout Standard
+\begin_inset Quotes sld
+\end_inset
-Timer 0
-\end_inset
-
-
-\begin_inset Text
+__at\InsetSpace ~
-\layout Standard
+\series bold
+(
+\series default
+0xab
+\series bold
+)
+\series default
-0x000b
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
-2
-\end_inset
-
-
-\begin_inset Text
+\family default
+ and
+\family sans
-\layout Standard
+\begin_inset Quotes sld
+\end_inset
-External 1
-\end_inset
-
-
-\begin_inset Text
+__interrupt\InsetSpace ~
+(2)
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
-0x0013
-\end_inset
-
-
-
-
-\begin_inset Text
+\family default
+).
+
+\newline
+Splint has an excellent on line manual at
+\begin_inset LatexCommand url
+target "http://www.splint.org/manual/"
-\layout Standard
+\end_inset
-3
-\end_inset
-
-
-\begin_inset Text
+ and it's capabilities go beyond pure syntax checking.
+ You'll need to tell splint the location of SDCC's include files so a typical
+ command line could look like this:
+\newline
-\layout Standard
+\family sans
+splint\InsetSpace ~
+-I\InsetSpace ~
+/usr/local/share/sdcc/include/mcs51/\InsetSpace ~
+\InsetSpace ~
+myprogram.c
+\end_layout
-Timer 1
-\end_inset
-
-
-\begin_inset Text
+\begin_layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+-
+\begin_inset ERT
+status collapsed
-0x001b
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-4
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-Serial
-\end_inset
-
-
-\begin_inset Text
+-short-is-8bits
+\series default
-\layout Standard
+\begin_inset LatexCommand index
+name "-\\/-short-is-8bits"
-0x0023
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-5
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand label
+name "lyx:--short-is-8bits"
-\layout Standard
+\end_inset
-Timer 2 (8052)
-\end_inset
-
-
-\begin_inset Text
+ Treat short as 8-bit (for backward compatibility with older versions of
+ compiler - see section
+\begin_inset LatexCommand ref
+reference "sec:Compatibility-with-previous"
-\layout Standard
+\end_inset
-0x002b
-\end_inset
-
-
-
-
-\begin_inset Text
+)
+\end_layout
-\layout Standard
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-...
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Subsection
+Intermediate Dump Options
+\begin_inset LatexCommand label
+name "sub:Intermediate-Dump-Options"
-\layout Standard
+\end_inset
-...
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "Options intermediate dump"
-n
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "Intermediate dump options"
-\layout Standard
+\end_inset
-0x0003 + 8*n
-\end_inset
-
-
-
-\end_inset
+\end_layout
+\begin_layout Standard
+The following options are provided for the purpose of retargetting and debugging
+ the compiler.
+ They provide a means to dump the intermediate code (iCode
+\begin_inset LatexCommand index
+name "iCode"
-\newline
+\end_inset
-\layout Standard
+) generated by the compiler in human readable form at various stages of
+ the compilation process.
+ More on iCodes see chapter
+\begin_inset LatexCommand ref
+reference "sub:The-anatomy-of"
-If the interrupt service routine is defined without
-\emph on
-using
-\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
+\end_inset
-\end_inset
+
+\begin_inset Quotes srd
+\end_inset
+The anatomy of the compiler
+\begin_inset Quotes srd
+\end_inset
-\begin_inset LatexCommand \index{\_\_using (mcs51, ds390 register bank)}
+.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\emph default
- a register bank or with register bank 0 (
-\emph on
-using
-\emph default
- 0), the compiler will save the registers used by itself on the stack upon
- entry and restore them at exit, however if such an interrupt service routine
- calls another function then the entire register bank will be saved on the
- stack.
- This scheme may be advantageous for small interrupt service routines which
- have low register usage.
-\layout Standard
-\added_space_bottom bigskip
-If the interrupt service routine is defined to be using a specific register
- bank then only
-\emph on
-a, b, dptr
-\emph default
- & psw are saved and restored, if such an interrupt service routine calls
- another function (using another register bank) then the entire register
- bank of the called function will be saved on the stack
-\begin_inset LatexCommand \index{stack}
+\begin_layout Standard
-\end_inset
-.
- This scheme is recommended for larger interrupt service routines.
-\layout Subsection
+\backslash
+/
+\end_layout
-HC08
-\begin_inset LatexCommand \index{HC08}
+\end_inset
-\end_inset
+-dumpraw
+\begin_inset LatexCommand index
+name "-\\/-dumpraw"
- Interrupt Service Routines
-\layout Standard
-\added_space_bottom bigskip
-Since the number of interrupts
-\begin_inset LatexCommand \index{HC08!interrupt}
+\end_inset
-\end_inset
- available is chip specific and the interrupt vector table always ends at
- the last byte of memory, the interrupt numbers corresponds to the interrupt
- vectors in reverse order of address.
- For example, interrupt 1 will use the interrupt vector at 0xfffc, interrupt
- 2 will use the interrupt vector at 0xfffa, and so on.
- However, interrupt 0 (the reset vector at 0xfffe) is not redefinable in
- this way; instead see section
-\begin_inset LatexCommand \ref{sub:Startup-Code}
+\series default
+ This option will cause the compiler to dump the intermediate code into
+ a file of named
+\emph on
+.dumpraw
+\emph default
+ just after the intermediate code has been generated for a function, i.e.
+ before any optimizations are done.
+ The basic blocks
+\begin_inset LatexCommand index
+name "Basic blocks"
-\end_inset
+\end_inset
- for details on customizing startup.
-\layout Subsection
+ at this stage ordered in the depth first number, so they may not be in
+ sequence of execution.
+\end_layout
-Z80 Interrupt Service Routines
-\layout Standard
+\begin_layout List
+\labelwidthstring 00.00.0000
-The Z80
-\begin_inset LatexCommand \index{Z80}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- uses several different methods for determining the correct interrupt
-\begin_inset LatexCommand \index{Z80!interrupt}
-\end_inset
+\backslash
+/
+\end_layout
- vector depending on the hardware implementation.
- Therefore, SDCC ignores the optional interrupt number and does not attempt
- to generate an interrupt vector table.
-\layout Standard
+\end_inset
-By default, SDCC generates code for a maskable interrupt, which uses a RETI
- instruction to return from the interrupt.
- To write an interrupt handler for the non-maskable interrupt, which needs
- a RETN instruction instead, add the
-\emph on
-critical
-\emph default
- keyword:
-\layout Verse
+-dumpgcse
+\begin_inset LatexCommand index
+name "-\\/-dumpgcse"
+\end_inset
-\family typewriter
-void nmi_isr (void) critical interrupt
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
-\added_space_bottom bigskip
-However if you need to create a non-interruptable interrupt service routine
- you would also require the
-\emph on
-critical
-\emph default
- keyword.
- To distinguish between this and an nmi_isr you must provide an interrupt
- number.
-\layout Section
-Enabling and Disabling Interrupts
-\layout Subsection
+\series default
+ Will create a dump of iCodes, after global subexpression elimination
+\begin_inset LatexCommand index
+name "Global subexpression elimination"
-Critical Functions and Critical Statements
-\layout Standard
+\end_inset
-A special keyword may be associated with a block or a function declaring
- it as
-\emph on
-critical
-\emph default
-.
- SDCC will generate code to disable all interrupts
-\begin_inset LatexCommand \index{interrupt}
+, into a file named
+\emph on
+.dumpgcse.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- upon entry to a critical function and restore the interrupt enable to the
- previous state before returning.
- Nesting critical functions will need one additional byte on the stack
-\begin_inset LatexCommand \index{stack}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- for each call.
-\layout Verse
+\backslash
+/
+\end_layout
-\family typewriter
-int foo () __critical
-\begin_inset LatexCommand \index{critical}
+\end_inset
-\end_inset
+-dumpdeadcode
+\begin_inset LatexCommand index
+name "-\\/-dumpdeadcode"
+\end_inset
-\begin_inset LatexCommand \index{\_\_critical}
-\end_inset
+\series default
+ Will create a dump of iCodes, after deadcode elimination
+\begin_inset LatexCommand index
+name "Dead-code elimination"
-
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-}
-\layout Standard
+\end_inset
-The critical attribute maybe used with other attributes like
-\emph on
-reentrant.
-\emph default
+, into a file named
+\emph on
+.dumpdeadcode.
+\end_layout
-\newline
-The keyword
-\emph on
-critical
-\emph default
- may also be used to disable interrupts more locally:
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-__critical{ i++; }
-\layout Standard
+\begin_layout Standard
-More than one statement could have been included in the block.
-\layout Subsection
-Enabling and Disabling Interrupts directly
-\layout Standard
+\backslash
+/
+\end_layout
-Interrupts
-\begin_inset LatexCommand \index{interrupt}
+\end_inset
-\end_inset
+-dumploop
+\begin_inset LatexCommand index
+name "-\\/-dumploop"
- can also be disabled and enabled directly (8051):
-\layout Verse
-
-
-\family typewriter
-EA = 0;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-or:\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-EA_SAVE = EA;
-\layout Verse
-
-
-\family typewriter
-...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-EA = 0;
-\layout Verse
-
-
-\family typewriter
-EA = 1;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-\layout Verse
-
-
-\family typewriter
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-EA = EA_SAVE;
-\layout Standard
+\end_inset
-On other architectures which have seperate opcodes for enabling and disabling
- interrupts you might want to make use of defines with inline assembly
-\begin_inset LatexCommand \index{Assembler routines}
-\end_inset
+\series default
+\size large
+
+\size default
+Will create a dump of iCodes, after loop optimizations
+\begin_inset LatexCommand index
+name "Loop optimization"
- (HC08
-\begin_inset LatexCommand \index{HC08!interrupt}
+\end_inset
-\end_inset
+, into a file named
+\emph on
+.dumploop.
+\end_layout
-):
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\family typewriter
-#define CLI _asm
-\begin_inset LatexCommand \index{\_asm}
+\begin_layout Standard
-\end_inset
-\SpecialChar ~
-\SpecialChar ~
-cli\SpecialChar ~
-\SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-;
-\layout Verse
+-dumprange
+\begin_inset LatexCommand index
+name "-\\/-dumprange"
+\end_inset
-\family typewriter
-#define SEI _asm\SpecialChar ~
-\SpecialChar ~
-sei\SpecialChar ~
-\SpecialChar ~
-_endasm;
-\layout Verse
+\series default
+\size large
+
+\size default
+Will create a dump of iCodes, after live range analysis
+\begin_inset LatexCommand index
+name "Live range analysis"
-\family typewriter
-...
-\layout Standard
+\end_inset
-Note: it is sometimes sufficient to disable only a specific interrupt source
- like f.e.
- a timer or serial interrupt by manipulating an
-\emph on
-interrupt mask
-\begin_inset LatexCommand \index{interrupt mask}
+, into a file named
+\emph on
+.dumprange.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\emph default
- register.
-
-\layout Standard
+\begin_layout Standard
-Usually the time during which interrupts are disabled should be kept as
- short as possible.
- This minimizes both
-\emph on
-interrupt latency
-\emph default
-\begin_inset LatexCommand \index{interrupt latency}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- (the time between the occurrence of the interrupt and the execution of
- the first code in the interrupt routine) and
-\emph on
-interrupt jitter
-\emph default
+-dumlrange
+\begin_inset LatexCommand index
+name "-\\/-dumlrange"
-\begin_inset LatexCommand \index{interrupt jitter}
+\end_inset
-\end_inset
- (the difference between the shortest and the longest interrupt latency).
- These really are something different, f.e.
- a serial interrupt has to be served before its buffer overruns so it cares
- for the maximum interrupt latency, whereas it does not care about jitter.
- On a loudspeaker driven via a digital to analog converter which is fed
- by an interrupt a latency of a few milliseconds might be tolerable, whereas
- a much smaller jitter will be very audible.
-\layout Standard
+\series default
+ Will dump the life ranges
+\begin_inset LatexCommand index
+name "Live range analysis"
-You can reenable interrupts within an interrupt routine and on some architecture
-s you can make use of two (or more) levels of
-\emph on
-interrupt priorities
-\emph default
+\end_inset
-\begin_inset LatexCommand \index{interrupt priority}
+ for all symbols.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
-.
- On some architectures which don't support interrupt priorities these can
- be implemented by manipulating the interrupt mask and reenabling interrupts
- within the interrupt routine.
- Check there is sufficient space on the stack
-\begin_inset LatexCommand \index{stack}
-
-\end_inset
+\series bold
+-
+\begin_inset ERT
+status collapsed
- and don't add complexity unless you have to.
-
-\layout Subsection
+\begin_layout Standard
-Semaphore
-\begin_inset LatexCommand \index{semaphore}
-\end_inset
+\backslash
+/
+\end_layout
- locking (mcs51/ds390)
-\layout Standard
+\end_inset
-Some architectures (mcs51/ds390) have an atomic
-\begin_inset LatexCommand \index{atomic}
+-dumpregassign
+\begin_inset LatexCommand index
+name "-\\/-dumpregassign"
-\end_inset
+\end_inset
- bit test and
-\emph on
-
-\emph default
-clear
-\emph on
-\emph default
-instruction.
- These type of instructions are typically used in preemptive multitasking
- systems, where a routine f.e.
- claims the use of a data structure ('acquires a lock
-\begin_inset LatexCommand \index{lock}
+\series default
+Will create a dump of iCodes, after register assignment
+\begin_inset LatexCommand index
+name "Register assignment"
-\end_inset
+\end_inset
- on it'), makes some modifications and then releases the lock when the data
- structure is consistent again.
- The instruction may also be used if interrupt and non-interrupt code have
- to compete for a resource.
- With the atomic bit test and clear instruction interrupts
-\begin_inset LatexCommand \index{interrupt}
+, into a file named
+\emph on
+.dumprassgn.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- don't have to be disabled for the locking operation.
-
-\layout Standard
+\series bold
+-
+\begin_inset ERT
+status collapsed
-SDCC generates this instruction if the source follows this pattern:
-\layout Verse
+\begin_layout Standard
-\family typewriter
-volatile
-\begin_inset LatexCommand \index{volatile}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- bit resource_is_free;
-\newline
+-dumplrange
+\begin_inset LatexCommand index
+name "-\\/-dumplrange"
-\newline
-if (resource_is_free)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-resource_is_free=0;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-resource_is_free=1;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-}
-\layout Standard
+\end_inset
-Note, mcs51 and ds390 support only an atomic
-\begin_inset LatexCommand \index{atomic}
-\end_inset
+\series default
+ Will create a dump of the live ranges of iTemp's
+\end_layout
- bit test and
-\emph on
-clear
-\emph default
- instruction (as opposed to atomic bit test and
-\emph on
-set).
-\layout Section
+\begin_layout List
+\labelwidthstring 00.00.0000
-Functions using private register banks
-\begin_inset LatexCommand \label{sub:Functions-using-private-banks}
+\series bold
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- (mcs51/ds390)
-\layout Standard
-Some architectures have support for quickly changing register sets.
- SDCC supports this feature with the
-\emph on
-using
-\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
+-dumpall
+\begin_inset LatexCommand index
+name "-\\/-dumpall"
-\begin_inset LatexCommand \index{\_\_using (mcs51, ds390 register bank)}
+\end_inset
-\end_inset
+\size large
+
+\series default
+\size default
+Will cause all the above mentioned dumps to be created.
+\end_layout
-\emph default
- attribute (which tells the compiler to use a register bank
-\begin_inset LatexCommand \index{register bank (mcs51, ds390)}
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
- other than the default bank zero).
- It should only be applied to
-\emph on
-interrupt
-\begin_inset LatexCommand \index{interrupt}
+\end_layout
-\end_inset
+\begin_layout Subsection
+Redirecting output on Windows Shells
+\end_layout
+\begin_layout Standard
+By default SDCC writes its error messages to
+\begin_inset Quotes sld
+\end_inset
-\emph default
- functions (see footnote below).
- This will in most circumstances make the generated ISR code more efficient
- since it will not have to save registers on the stack.
-\layout Standard
+standard error
+\begin_inset Quotes srd
+\end_inset
-The
-\emph on
-using
-\emph default
- attribute will have no effect on the generated code for a
-\emph on
-non-interrupt
-\emph default
- function (but may occasionally be useful anyway
-\begin_inset Foot
-collapsed false
+.
+ To force all messages to
+\begin_inset Quotes sld
+\end_inset
-\layout Standard
+standard output
+\begin_inset Quotes srd
+\end_inset
-possible exception: if a function is called ONLY from 'interrupt' functions
- using a particular bank, it can be declared with the same 'using' attribute
- as the calling 'interrupt' functions.
- For instance, if you have several ISRs using bank one, and all of them
- call memcpy(), it might make sense to create a specialized version of memcpy()
- 'using 1', since this would prevent the ISR from having to save bank zero
- to the stack on entry and switch to bank zero before calling the function
-\end_inset
+ use
+\series bold
+-
+\series default
+\emph on
-).
-\newline
+\begin_inset ERT
+status collapsed
-\emph on
-(pending: Note, nowadays the
-\emph default
-using
-\emph on
- attribute has an effect on
-\emph default
-
-\emph on
-the generated code for a
-\emph default
-non-interrupt
-\emph on
- function
-\emph default
-.
-\emph on
-)
-\layout Standard
+\begin_layout Standard
-An
-\emph on
-interrupt
-\emph default
- function using a non-zero bank will assume that it can trash that register
- bank, and will not save it.
- Since high-priority interrupts
-\begin_inset LatexCommand \index{interrupts}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\begin_inset LatexCommand \index{interrupt priority}
-\end_inset
+\series bold
+\emph default
+-
+\series default
+use-stdout
+\begin_inset LatexCommand index
+name "-\\/-use-stdout"
- can interrupt low-priority ones on the 8051 and friends, this means that
- if a high-priority ISR
-\emph on
-using
-\emph default
- a particular bank occurs while processing a low-priority ISR
-\emph on
-using
-\emph default
- the same bank, terrible and bad things can happen.
- To prevent this, no single register bank should be
-\emph on
-used
-\emph default
- by both a high priority and a low priority ISR.
- This is probably most easily done by having all high priority ISRs use
- one bank and all low priority ISRs use another.
- If you have an ISR which can change priority at runtime, you're on your
- own: I suggest using the default bank zero and taking the small performance
- hit.
-\layout Standard
-\added_space_bottom bigskip
-It is most efficient if your ISR calls no other functions.
- If your ISR must call other functions, it is most efficient if those functions
- use the same bank as the ISR (see note 1 below); the next best is if the
- called functions use bank zero.
- It is very inefficient to call a function using a different, non-zero bank
- from an ISR.
-
-\layout Section
+\end_inset
-Startup Code
-\begin_inset LatexCommand \label{sub:Startup-Code}
+.
+ Additionally, if you happen to have visual studio installed in your windows
+ machine, you can use it to compile your sources using a custom build and
+ the SDCC -
+\emph on
-\end_inset
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\begin_inset LatexCommand \index{Startup code}
-\end_inset
+\backslash
+/
+\end_layout
+\end_inset
-\layout Subsection
-MCS51/DS390 Startup Code
-\layout Standard
+\emph default
+-vc
+\begin_inset LatexCommand index
+name "-\\/-vc"
-The compiler inserts a call to the C routine
-\emph on
-_sdcc_external_startup()
-\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
+\end_inset
-\end_inset
+ option.
+ Something like this should work:
+\newline
+\newline
-\series bold
-\emph default
-
-\series default
-at the start of the CODE area.
- This routine is in the runtime library
-\begin_inset LatexCommand \index{Runtime library}
+\series bold
+c:
+\backslash
+sdcc
+\backslash
+bin
+\backslash
+sdcc.exe -
+\series default
+\emph on
-\end_inset
+\begin_inset ERT
+status collapsed
-.
- By default this routine returns 0, if this routine returns a non-zero value,
- the static & global variable initialization will be skipped and the function
- main will be invoked.
- Otherwise static & global variables will be initialized before the function
- main is invoked.
- You could add a
-\emph on
-_sdcc_external_startup()
-\emph default
- routine to your program to override the default if you need to setup hardware
- or perform some other critical operation prior to static & global variable
- initialization
-\begin_inset LatexCommand \index{Variable initialization}
+\begin_layout Standard
-\end_inset
-.
- On some mcs51 variants xdata
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- memory has to be explicitly enabled before it can be accessed or if the
- watchdog
-\begin_inset LatexCommand \index{watchdog}
-\end_inset
+\series bold
+\emph default
+-vc -
+\series default
+\emph on
- needs to be disabled, this is the place to do it.
- The startup code clears all internal data memory, 256 bytes by default,
- but from 0 to n-1 if
-\emph on
--
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--iram-size
-\begin_inset LatexCommand \index{-\/-iram-size }
+\end_inset
-\end_inset
-n
-\emph default
- is used.
- (recommended for Chipcon CC1010).
-\layout Standard
-\added_space_bottom bigskip
-See also the compiler options
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\series bold
+\emph default
+-model-large -c $(InputPath)
+\series default
-\layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\backslash
-/
-\end_inset
--no-xinit
-\emph default
--
-\emph on
-opt
-\emph default
+\end_layout
-\begin_inset LatexCommand \index{-\/-no-xinit-opt}
+\begin_layout Section
+Environment variables
+\begin_inset LatexCommand index
+name "Environment variables"
-\end_inset
+\end_inset
-,
-\emph on
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+SDCC recognizes the following environment variables:
+\end_layout
--main-return
-\emph default
+\begin_layout List
+\labelwidthstring 00.00.0000
-\begin_inset LatexCommand \index{-\/-main-return}
+\series bold
+SDCC_LEAVE_SIGNALS
+\begin_inset LatexCommand index
+name "SDCC\\_LEAVE\\_SIGNALS"
-\end_inset
+\end_inset
- and section
-\begin_inset LatexCommand \ref{sub:MCS51-variants}
-\end_inset
+\series default
+ SDCC installs a signal handler
+\begin_inset LatexCommand index
+name "signal handler"
- about MCS51-variants.
-\layout Subsection
+\end_inset
-HC08 Startup Code
-\layout Standard
-\added_space_bottom bigskip
-The HC08
-\begin_inset LatexCommand \index{HC08}
+ to be able to delete temporary files after an user break (^C) or an exception.
+ If this environment variable is set, SDCC won't install the signal handler
+ in order to be able to debug SDCC.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- startup code follows the same scheme as the MCS51 startup code.
-\layout Subsection
-
-Z80 Startup Code
-\layout Standard
-\added_space_bottom bigskip
-On the Z80
-\begin_inset LatexCommand \index{Z80}
-
-\end_inset
-
- the startup code is inserted by linking with crt0.o which is generated from
- sdcc/device/lib/z80/crt0.s.
- If you need a different startup code you can use the compiler option
-\emph on
--
-\series bold
-\emph default
-
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+\series bold
+TMP,\InsetSpace ~
+TEMP,\InsetSpace ~
+TMPDIR
+\begin_inset LatexCommand index
+name "TMP, TEMP, TMPDIR"
+\end_inset
-\series default
-\emph on
--no-std-crt0
-\emph default
-\begin_inset LatexCommand \index{-\/-no-std-crt0}
+\series default
+ Path, where temporary files will be created.
+ The order of the variables is the search order.
+ In a standard *nix environment these variables are not set, and there's
+ no need to set them.
+ On Windows it's recommended to set one of them.
+\end_layout
-\end_inset
+\begin_layout List
+\labelwidthstring 00.00.0000
- and provide your own crt0.o.
-
-\layout Section
+\series bold
+SDCC_HOME
+\begin_inset LatexCommand index
+name "SDCC\\_HOME"
-Inline Assembler Code
-\begin_inset LatexCommand \index{Assembler routines}
+\end_inset
-\end_inset
+\series default
+ Path, see section
+\begin_inset LatexCommand ref
+reference "sub:Install-paths"
-\layout Subsection
+\end_inset
-A Step by Step Introduction
-\begin_inset LatexCommand \label{sub:A-Step-by Assembler Introduction}
+\InsetSpace ~
-\end_inset
+\begin_inset Quotes sld
+\end_inset
+ Install Paths
+\begin_inset Quotes srd
+\end_inset
-\layout Standard
+.
+\end_layout
-Starting from a small snippet of c-code this example shows for the MCS51
- how to use inline assembly, access variables, a function parameter and
- an array in xdata memory.
- The example uses an MCS51 here but is easily adapted for other architectures.
- This is a buffer routine which should be optimized:
-\layout Verse
+\begin_layout List
+\labelwidthstring 00.00.0000
+\series bold
+SDCC_INCLUDE
+\begin_inset LatexCommand index
+name "SDCC\\_INCLUDE"
-\family typewriter
-\size footnotesize
-unsigned char __far
-\begin_inset LatexCommand \index{far (storage class)}
+\end_inset
-\end_inset
+\series default
+ Path, see section
+\begin_inset LatexCommand ref
+reference "sub:Search-Paths"
-\begin_inset LatexCommand \index{\_\_far (storage class)}
+\end_inset
-\end_inset
+\InsetSpace ~
- __at
-\begin_inset LatexCommand \index{at}
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+Search Paths
+\begin_inset Quotes srd
+\end_inset
+.
+\end_layout
-\begin_inset LatexCommand \index{\_\_at}
+\begin_layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+SDCC_LIB
+\begin_inset LatexCommand index
+name "SDCC\\_LIB"
-(0x7f00) buf[0x100];
-\begin_inset LatexCommand \index{Aligned array}
-
-\end_inset
-
-
-\newline
-unsigned char head, tail;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* if interrupts
-\begin_inset LatexCommand \index{interrupt}
+\end_inset
-\end_inset
- are involved see
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-section
-\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
+\series default
+ Path, see section
+\begin_inset LatexCommand ref
+reference "sub:Search-Paths"
-\end_inset
+\end_inset
- about
-\series bold
- volatile
-\series default
- */
-\newline
+\InsetSpace ~
-\newline
-void to_buffer( unsigned char c )
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-if( head != (unsigned char)(tail-1) )\SpecialChar ~
-/* cast
-\series bold
-needed
-\series default
- to avoid promotion
-\begin_inset LatexCommand \index{promotion to signed int}
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+Search Paths
+\begin_inset Quotes srd
+\end_inset
+..
+\end_layout
-\begin_inset LatexCommand \index{type promotion}
+\begin_layout Standard
+There are some more environment variables recognized by SDCC, but these
+ are solely used for debugging purposes.
+ They can change or disappear very quickly, and will never be documented.
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
- to integer */
-\begin_inset Marginal
-collapsed true
+\end_layout
-\layout Standard
+\begin_layout Section
+Storage Class Language Extensions
+\end_layout
+\begin_layout Subsection
+MCS51/DS390 Storage Class
+\begin_inset LatexCommand index
+name "Storage class"
-\series bold
-\SpecialChar ~
-!
-\end_inset
-
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-buf[ head++ ] = c;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* access to a 256 byte aligned array */
-\newline
-}
-\layout Standard
+\end_inset
-If the code snippet (assume it is saved in buffer.c) is compiled with SDCC
- then a corresponding buffer.asm file is generated.
- We define a new function
-\family typewriter
-to_buffer_asm()
-\family default
- in file buffer.c in which we cut and paste the generated code, removing
- unwanted comments and some ':'.
- Then add
-\begin_inset Quotes sld
-\end_inset
+ Language Extensions
+\end_layout
-_asm
-\begin_inset Quotes srd
-\end_inset
+\begin_layout Standard
+In addition to the ANSI storage classes SDCC allows the following MCS51
+ specific storage classes:
+\end_layout
- and
-\begin_inset Quotes sld
-\end_inset
+\begin_layout Subsubsection
+data
+\begin_inset LatexCommand index
+name "data (mcs51, ds390 storage class)"
-_endasm;
-\begin_inset Quotes srd
-\end_inset
+\end_inset
- to the beginning and the end of the function body:
-\layout Verse
+\begin_inset LatexCommand index
+name "\\_\\_data (mcs51, ds390 storage class)"
-\family typewriter
-\size footnotesize
-/* With a cut and paste from the .asm file, we have something to start with.
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-The function is not yet OK! (registers aren't saved) */
-\newline
-void to_buffer_asm( unsigned char c )
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\end_inset
-\end_inset
+ / near
+\begin_inset LatexCommand index
+name "near (storage class)"
+\end_inset
-\begin_inset LatexCommand \index{\_\_asm}
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_near (storage class)"
+\end_inset
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-r2,dpl
-\newline
-;buffer.c if( head != (unsigned char)(tail-1) ) \SpecialChar ~
-/* cast
-\series bold
-needed
-\series default
- to avoid promotion
-\begin_inset LatexCommand \index{promotion to signed int}
-\end_inset
+\end_layout
+\begin_layout Standard
+This is the
+\series bold
+default
+\series default
+ storage class for the Small Memory model (
+\emph on
+data
+\emph default
+ and
+\emph on
+near
+\emph default
+ or the more ANSI-C compliant forms
+\emph on
+__data
+\emph default
+ and
+\emph on
+__near
+\emph default
+ can be used synonymously).
+ Variables declared with this storage class will be allocated in the directly
+ addressable portion of the internal RAM of a 8051, e.g.:
+\end_layout
-\begin_inset LatexCommand \index{type promotion}
+\begin_layout Verse
-\end_inset
+\family typewriter
+__data unsigned char test_data;
+\end_layout
- to integer */
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-a,_tail
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dec\SpecialChar ~
-\SpecialChar ~
-a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-r3,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-a,_head
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-cjne a,ar3,00106$
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ret
-\newline
-00106$:
-\newline
-;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */
-\begin_inset LatexCommand \index{Aligned array}
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+75*00 01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+_test_data,#0x01
+\end_layout
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-r3,_head
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-inc\SpecialChar ~
-\SpecialChar ~
-_head
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-dpl,r3
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-dph,#(_buf >> 8)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-a,r2
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movx @dptr,a
-\newline
-00103$:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ret
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\begin_layout Subsubsection
+xdata
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_endasm}
+\begin_inset LatexCommand index
+name "\\_\\_xdata (mcs51, ds390 storage class)"
-\end_inset
+\end_inset
-;
-\newline
-}
-\layout Standard
+ / far
+\begin_inset LatexCommand index
+name "far (storage class)"
-The new file buffer.c should compile with only one warning about the unreferenced
- function argument 'c'.
- Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY
- (1) and finally have:
-\layout Verse
+\end_inset
-\family typewriter
-\size footnotesize
-unsigned char __far __at(0x7f00) buf[0x100];
-\newline
-unsigned char head, tail;
-\newline
-#define USE_ASSEMBLY (1)
-\newline
+\begin_inset LatexCommand index
+name "\\_\\_far (storage class)"
-\newline
-#if !USE_ASSEMBLY
-\newline
+\end_inset
-\newline
-void to_buffer( unsigned char c )
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-if( head != (unsigned char)(tail-1) )
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-buf[ head++ ] = c;
-\newline
-}
-\newline
-\newline
-#else
-\newline
+\end_layout
-\newline
-void to_buffer( unsigned char c )
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-c; // to avoid warning: unreferenced function argument
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\begin_layout Standard
+Variables declared with this storage class will be placed in the external
+ RAM.
+ This is the
+\series bold
+default
+\series default
+ storage class for the Large Memory model, e.g.:
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+__xdata unsigned char test_xdata;
+\end_layout
-\begin_inset LatexCommand \index{\_\_asm}
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+90s00r00\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+dptr,#_test_xdata
+\newline
+74\InsetSpace ~
+01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,#0x01
+\newline
+F0\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movx\InsetSpace ~
+@dptr,a
+\end_layout
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; save used registers here.
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; If we were still using r2,r3 we would have to push them here.
-
-\newline
-; if( head != (unsigned char)(tail-1) )
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
- a,_tail
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dec\SpecialChar ~
- a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-xrl\SpecialChar ~
- a,_head
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; we could do an ANL a,#0x0f here to use a smaller buffer (see below)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-jz\SpecialChar ~
-\SpecialChar ~
- t_b_end$
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-;
-\newline
-; buf[ head++ ] = c;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
- a,dpl \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; dpl holds lower byte of function argument
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
- dpl,_head \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; buf is 0x100 byte aligned so head can be used directly
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
- dph,#(_buf>>8)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-movx @dptr,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-inc \SpecialChar ~
-_head
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; we could do an ANL _head,#0x0f here to use a smaller buffer (see above)
-\newline
-t_b_end$:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; restore used registers here
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\begin_layout Subsubsection
+idata
+\begin_inset LatexCommand index
+name "idata (mcs51, ds390 storage class)"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_endasm}
+\begin_inset LatexCommand index
+name "\\_\\_idata (mcs51, ds390 storage class)"
-\end_inset
+\end_inset
-;
-\newline
-}
-\newline
-#endif
-\layout Standard
-The inline assembler code can contain any valid code understood by the assembler
-, this includes any assembler directives and comment lines.
- The assembler does not like some characters like ':' or ''' in comments.
- You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html
-\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)}
+\end_layout
-\end_inset
+\begin_layout Standard
+Variables declared with this storage class will be allocated into the indirectly
+ addressable portion of the internal ram of a 8051, e.g.:
+\end_layout
+\begin_layout Verse
-\begin_inset LatexCommand \index{Assembler documentation}
+\family typewriter
+__idata unsigned char test_idata;
+\end_layout
-\end_inset
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
- or online at
-\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
+\begin_layout Verse
-\end_inset
+\family typewriter
+78r00\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r0,#_test_idata
+\newline
+76\InsetSpace ~
+01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+@r0,#0x01
+\end_layout
-\SpecialChar ~
-.
-\layout Standard
+\begin_layout Standard
+Please note, the first 128 byte of idata physically access the same RAM
+ as the data memory.
+ The original 8051 had 128 byte idata memory, nowadays most devices have
+ 256 byte idata memory.
+ The stack
+\begin_inset LatexCommand index
+name "stack"
-The compiler does not do any validation of the code within the
-\family typewriter
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\end_inset
-\end_inset
+ is located in idata memory.
+\end_layout
+\begin_layout Subsubsection
+pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
-\begin_inset LatexCommand \index{\_\_asm}
+\end_inset
-\end_inset
- ...
- _endasm
-\size footnotesize
+\begin_inset LatexCommand index
+name "\\_\\_pdata (mcs51, ds390 storage class)"
-\begin_inset LatexCommand \index{\_endasm}
+\end_inset
-\end_inset
+\end_layout
-\begin_inset LatexCommand \index{\_\_endasm}
+\begin_layout Standard
+Paged xdata access is just as straightforward as using the other addressing
+ modes of a 8051.
+ It is typically located at the start of xdata and has a maximum size of
+ 256 bytes.
+ The following example writes 0x01 to the pdata variable.
+ Please note, pdata access physically accesses xdata memory.
+ The high byte of the address is determined by port P2
+\begin_inset LatexCommand index
+name "P2 (mcs51 sfr)"
-\end_inset
+\end_inset
+(or in case of some 8051 variants by a separate Special Function Register,
+ see section
+\begin_inset LatexCommand ref
+reference "sub:MCS51-variants"
-\size default
-;
-\family default
- keyword pair.
- Specifically it will not know which registers are used and thus register
- pushing/popping
-\begin_inset LatexCommand \index{push/pop}
+\end_inset
-\end_inset
+).
+ This is the
+\series bold
+default
+\series default
+ storage class for the Medium Memory model, e.g.:
+\end_layout
- has to be done manually.
-
-\layout Standard
+\begin_layout Verse
-It is recommended that each assembly instruction (including labels) be placed
- in a separate line (as the example shows).
- When the -
-\begin_inset ERT
-status Collapsed
+\family typewriter
+__pdata unsigned char test_pdata;
+\end_layout
-\layout Standard
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Verse
--
-\emph on
-peep-asm
-\begin_inset LatexCommand \index{-\/-peep-asm}
+\family typewriter
+78r00\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r0,#_test_pdata
+\newline
+74 01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,#0x01
+\newline
+F2\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movx @r0,a
+\end_layout
-\end_inset
+\begin_layout Standard
+If the -
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph default
- command line option is used, the inline assembler code will be passed through
- the peephole optimizer
-\begin_inset LatexCommand \index{Peephole optimizer}
-\end_inset
+\backslash
+/
+\end_layout
-.
- There are only a few (if any) cases where this option makes sense, it might
- cause some unexpected changes in the inline assembler code.
- Please go through the peephole optimizer rules defined in file
-\emph on
-SDCCpeeph.def
-\emph default
- before using this option.
-\layout Subsection
+\end_inset
-Naked Functions
-\begin_inset LatexCommand \label{sub:Naked-Functions}
+-xstack
+\begin_inset LatexCommand index
+name "-\\/-xstack"
-\end_inset
+\end_inset
+ option is used the pdata memory area is followed by the xstack memory area
+ and the sum of their sizes is limited to 256 bytes.
+\end_layout
-\begin_inset LatexCommand \index{Naked functions}
+\begin_layout Subsubsection
+code
+\begin_inset LatexCommand index
+name "code"
-\end_inset
+\end_inset
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_code"
-A special keyword may be associated with a function declaring it as
-\emph on
-_naked
-\begin_inset LatexCommand \index{\_naked}
+\end_inset
-\end_inset
+\end_layout
-\begin_inset LatexCommand \index{\_\_naked}
+\begin_layout Standard
+'Variables' declared with this storage class will be placed in the code
+ memory:
+\end_layout
-\end_inset
+\begin_layout Verse
-.
-
-\emph default
-The
-\emph on
-_naked
-\emph default
- function modifier attribute prevents the compiler from generating prologue
-\begin_inset LatexCommand \index{function prologue}
+\family typewriter
+__code unsigned char test_code;
+\end_layout
-\end_inset
+\begin_layout Standard
+Read access to this variable generates the assembly code:
+\end_layout
- and epilogue
-\begin_inset LatexCommand \index{function epilogue}
+\begin_layout Verse
-\end_inset
+\family typewriter
+90s00r6F\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov dptr,#_test_code
+\newline
+E4\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+clr a
+\newline
+93\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movc a,@a+dptr
+\end_layout
- code for that function.
- This means that the user is entirely responsible for such things as saving
- any registers that may need to be preserved, selecting the proper register
- bank, generating the
-\emph on
-return
-\emph default
- instruction at the end, etc.
- Practically, this means that the contents of the function must be written
- in inline assembler.
- This is particularly useful for interrupt functions, which can have a large
- (and often unnecessary) prologue/epilogue.
- For example, compare the code generated by these two functions:
-\layout Verse
+\begin_layout Standard
+\family typewriter
+char
+\family default
+ indexed arrays of characters in code memory can be accessed efficiently:
+\end_layout
-\family typewriter
-volatile
-\begin_inset LatexCommand \index{volatile}
+\begin_layout Verse
-\end_inset
+\family typewriter
+__code char test_array[] = {'c','h','e','a','p'};
+\end_layout
- data unsigned char counter;
-\newline
+\begin_layout Standard
+Read access to this array using an 8-bit unsigned index generates the assembly
+ code:
+\end_layout
-\newline
-void simpleInterrupt(void) __interrupt
-\begin_inset LatexCommand \index{interrupt}
+\begin_layout Verse
-\end_inset
+\family typewriter
+E5*00\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,_index
+\end_layout
+\begin_layout Verse
-\begin_inset LatexCommand \index{\_\_interrupt}
+\family typewriter
+90s00r41\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov dptr,#_test_array
+\end_layout
-\end_inset
+\begin_layout Verse
- (1)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-counter++;
-\newline
-}
-\newline
+\family typewriter
+93\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movc a,@a+dptr
+\end_layout
-\newline
-void nakedInterrupt(void) __interrupt (2) __naked
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\begin_layout Subsubsection
+bit
+\begin_inset LatexCommand index
+name "bit"
-\end_inset
+\end_inset
-\begin_inset LatexCommand \index{\_\_asm}
+\begin_inset LatexCommand index
+name "\\_\\_bit"
-\end_inset
+\end_inset
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-inc\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_counter ; does not change flags, no need to save psw
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-reti\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; MUST explicitly include ret or reti in _naked function.
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\end_layout
-\end_inset
+\begin_layout Standard
+This is a data-type and a storage class specifier.
+ When a variable is declared as a bit, it is allocated into the bit addressable
+ memory of 8051, e.g.:
+\end_layout
+\begin_layout Verse
-\begin_inset LatexCommand \index{\_\_endasm}
+\family typewriter
+__bit test_bit;
+\end_layout
-\end_inset
+\begin_layout Standard
+Writing 1 to this variable generates the assembly code:
+\end_layout
-;
-\newline
-}
-\layout Standard
+\begin_layout Verse
-For an 8051 target, the generated simpleInterrupt looks like:
-\layout Verse
+\family typewriter
+D2*00\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+setb\InsetSpace ~
+_test_bit
+\end_layout
+\begin_layout Standard
+The bit addressable memory consists of 128 bits which are located from 0x20
+ to 0x2f in data memory.
+
+\newline
+Apart from this 8051 specific storage class most architectures support
+ ANSI-C bitfields
+\begin_inset LatexCommand index
+name "bitfields"
-\family typewriter
-Note, this is an
-\emph on
-outdated
-\emph default
- example, recent versions of SDCC generate
-\newline
-the
-\emph on
-same
-\emph default
- code for simpleInterrupt() and nakedInterrupt()!
-\newline
+\end_inset
-\newline
-_simpleInterrupt:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-acc
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dpl
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dph
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-psw
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-psw,#0x00
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-inc\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_counter
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-psw
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dph
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dpl
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-acc
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-reti
-\layout Standard
-whereas nakedInterrupt looks like:
-\layout Verse
+\begin_inset Foot
+status open
+\begin_layout Standard
+Not really meant as examples, but nevertheless showing what bitfields are
+ about: device/include/mc68hc908qy.h and support/regression/tests/bitfields.c
+\end_layout
-\family typewriter
-_nakedInterrupt:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-inc\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_counter ; does not change flags, no need to save psw
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-reti\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; MUST explicitly include ret or reti in _naked function
-\layout Standard
+\end_inset
-The related directive #pragma exclude
-\begin_inset LatexCommand \index{\#pragma exclude}
+.
+ In accordance with ISO/IEC 9899 bits and bitfields without an explicit
+ signed modifier are implemented as unsigned.
+\end_layout
-\end_inset
+\begin_layout Subsubsection
+sfr
+\begin_inset LatexCommand index
+name "sfr"
- allows a more fine grained control over pushing & popping
-\begin_inset LatexCommand \index{push/pop}
+\end_inset
-\end_inset
- the registers.
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_sfr"
-While there is nothing preventing you from writing C code inside a
-\family typewriter
-_naked
-\family default
- function, there are many ways to shoot yourself in the foot doing this,
- and it is recommended that you stick to inline assembler.
-\layout Subsection
+\end_inset
-Use of Labels within Inline Assembler
-\layout Standard
+ / sfr16
+\begin_inset LatexCommand index
+name "sfr16"
-SDCC allows the use of in-line assembler with a few restrictions regarding
- labels.
- In older versions of the compiler all labels defined within inline assembler
- code
-\emph on
-had to be
-\emph default
- of the form
-\emph on
-nnnnn$
-\emph default
- where nnnn is a number less than 100 (which implies a limit of utmost 100
- inline assembler labels
-\emph on
-per function
-\emph default
-\noun on
-)
-\noun default
-.
-
-\layout Verse
+\end_inset
-\family typewriter
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\begin_inset LatexCommand index
+name "\\_\\_sfr16"
-\end_inset
+\end_inset
+ / sfr32
+\begin_inset LatexCommand index
+name "sfr32"
-\begin_inset LatexCommand \index{\_\_asm}
+\end_inset
-\end_inset
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b,#10
-\newline
-00001$:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-djnz\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b,00001$
-\newline
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\begin_inset LatexCommand index
+name "\\_\\_sfr32"
-\end_inset
+\end_inset
+ / sbit
+\begin_inset LatexCommand index
+name "\\_\\_sbit"
-\begin_inset LatexCommand \index{\_\_endasm}
+\end_inset
-\end_inset
- ;
-\layout Standard
+\begin_inset LatexCommand index
+name "sbit"
-Inline assembler code cannot reference any C-Labels, however it can reference
- labels
-\begin_inset LatexCommand \index{Labels}
+\end_inset
-\end_inset
- defined by the inline assembler, e.g.:
-\layout Verse
+\end_layout
+\begin_layout Standard
+Like the bit keyword,
+\emph on
+sfr / sfr16 / sfr32 / sbit
+\emph default
+ signify both a data-type and storage class, they are used to describe the
+
+\emph on
+s
+\emph default
+pecial
+\emph on
+f
+\emph default
+unction
+\emph on
+r
+\emph default
+egisters and
+\emph on
+s
+\emph default
+pecial
+\emph on
+bit
+\emph default
+ variables of a 8051, eg:
+\end_layout
-\family typewriter
-foo() {
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* some c code */
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_asm
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-; some assembler code
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ljmp $0003
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_endasm;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* some more c code */
-\newline
-clabel:\SpecialChar ~
-\SpecialChar ~
-/* inline assembler cannot reference this label */
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_asm
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-$0003: ;label (can be referenced by inline assembler only)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\begin_layout Verse
-\end_inset
+\family typewriter
+__sfr __at
+\begin_inset LatexCommand index
+name "at"
+\end_inset
-\begin_inset LatexCommand \index{\_\_endasm}
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_at"
- ;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* some more c code */
-\newline
-}
-\layout Standard
+\end_inset
-In other words inline assembly code can access labels defined in inline
- assembly within the scope of the function.
- The same goes the other way, i.e.
- labels defines in inline assembly can not be accessed by C statements.
-\layout Section
+ (0x80) P0;\InsetSpace ~
+ /* special function register P0 at location 0x80 */
+\newline
-Interfacing with Assembler Code
-\begin_inset LatexCommand \index{Assembler routines}
+\newline
+/* 16 bit
+ special function register combination for timer 0
+\newline
+\InsetSpace ~
+\InsetSpace ~
+ with the high byte at
+ location 0x8C and the low byte at location 0x8A */
+\newline
+__sfr16 __at (0x8C8A)
+ TMR0;
+\newline
+
+\newline
+__sbit __at
+\begin_inset LatexCommand index
+name "at"
-\end_inset
+\end_inset
-\layout Subsection
+\begin_inset LatexCommand index
+name "\\_\\_at"
-Global Registers used for Parameter Passing
-\begin_inset LatexCommand \index{Parameter passing}
+\end_inset
-\end_inset
+ (0xd7) CY;\InsetSpace ~
+ /* CY (Carry Flag
+\begin_inset LatexCommand index
+name "Flags"
+\end_inset
-\layout Standard
-The compiler always uses the global registers
-\emph on
-DPL, DPH
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
+\begin_inset LatexCommand index
+name "Carry flag"
-\end_inset
+\end_inset
+) */
+\end_layout
-\begin_inset LatexCommand \index{DPTR}
+\begin_layout Standard
+Special function registers which are located on an address dividable by
+ 8 are bit-addressable, an
+\emph on
+sbit
+\emph default
+ addresses a specific bit within these sfr.
+\newline
+16 Bit and 32 bit special function
+ register combinations which require a certain access order are better not
+ declared using
+\emph on
+sfr16
+\emph default
+ or
+\emph on
+sfr32.
-\end_inset
+\emph default
+ Allthough SDCC usually accesses them Least Significant Byte (LSB) first,
+ this is not guaranteed.
+\newline
-, B
-\begin_inset LatexCommand \index{B (mcs51, ds390 register)}
+\end_layout
-\end_inset
+\begin_layout Standard
+Please note, if you use a header file which was written for another compiler
+ then the sfr / sfr16 / sfr32 / sbit Storage Class extensions will most
+ likely be
+\emph on
+not
+\emph default
+ compatible.
+ Specifically the syntax
+\family typewriter
+\InsetSpace ~
+sfr P0 = 0x80;\InsetSpace ~
-
-\emph default
-and
-\emph on
- ACC
-\begin_inset LatexCommand \index{ACC (mcs51, ds390 register)}
+\family default
+ is compiled
+\emph on
+without warning
+\emph default
+ by SDCC to an assignment of 0x80 to a variable called P0
+\family typewriter
-\end_inset
+\begin_inset Marginal
+status collapsed
+\begin_layout Standard
-\emph default
- to pass the first parameter to a routine.
- The second parameter onwards is either allocated on the stack (for reentrant
- routines or if -
-\begin_inset ERT
-status Collapsed
+\series bold
+\InsetSpace ~
+!
+\end_layout
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+.
--stack-auto is used) or in data / xdata memory (depending on the memory
- model).
+\family default
-\layout Subsection
+\series bold
+Nevertheless it is possible to write header files
+\begin_inset LatexCommand index
+name "Header files"
-Assembler Routine (non-reentrant)
-\layout Standard
+\end_inset
-In the following example
-\begin_inset LatexCommand \index{reentrant}
-\end_inset
+\begin_inset LatexCommand index
+name "Include files"
+\end_inset
-\begin_inset LatexCommand \index{Assembler routines (non-reentrant)}
+ which can be shared among different compilers (see section
+\begin_inset LatexCommand ref
+reference "sec:Porting-code-to-other-compilers"
-\end_inset
+\end_inset
- the function c_func calls an assembler routine asm_func, which takes two
- parameters
-\begin_inset LatexCommand \index{function parameter}
+).
+
+\end_layout
-\end_inset
+\begin_layout Subsubsection
+Pointers
+\begin_inset LatexCommand index
+name "Pointer"
-.
-\layout Verse
+\end_inset
+ to MCS51/DS390 specific memory spaces
+\end_layout
-\family typewriter
-extern int asm_func(unsigned char, unsigned char);
-\newline
+\begin_layout Standard
+SDCC allows (via language extensions) pointers to explicitly point to any
+ of the memory spaces
+\begin_inset LatexCommand index
+name "Memory model"
-\newline
-int c_func (unsigned char i, unsigned char j)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-return asm_func(i,j);
-\newline
-}
-\newline
+\end_inset
-\newline
-int main()
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-return c_func(10,9);
-\newline
-}
-\layout Standard
+ of the 8051.
+ In addition to the explicit pointers, the compiler uses (by default) generic
+ pointers which can be used to point to any of the memory spaces.
+\newline
-The corresponding assembler function is:
-\layout Verse
+\newline
+Pointer
+ declaration examples:
+\end_layout
+\begin_layout Verse
-\family typewriter
-.globl _asm_func_PARM_2
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-.globl _asm_func
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-.area OSEG
-\newline
-_asm_func_PARM_2:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-.ds 1
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-.area CSEG
-\newline
-_asm_func:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-a,dpl
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-add\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-a,_asm_func_PARM_2
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dpl,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dph
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
+\family typewriter
+/* pointer physically in internal ram pointing to object in external ram
+ */
+\newline
+__xdata unsigned char * __data p;
+\newline
-\end_inset
+\newline
+/* pointer physically in external ram
+ pointing to object in internal ram */
+\newline
+__data unsigned char * __xdata p;
+\newline
-,#0x00
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ret
-\layout Standard
+\newline
+/*
+ pointer physically in code rom pointing to data in xdata space */
+\newline
+__xdata
+ unsigned char * __code p;
+\newline
-Note here that the return values
-\begin_inset LatexCommand \index{return value}
+\newline
+/* pointer physically in code space pointing to
+ data in code space */
+\newline
+__code unsigned char * __code p;
+\newline
-\end_inset
+\newline
+/* generic pointer
+ physically located in xdata space */
+\newline
+unsigned char * __xdata p;
+\newline
- are placed in 'dpl' - One byte return value, 'dpl' LSB & 'dph' MSB for
- two byte values.
- 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph','
-b' & 'acc' for four byte values.
-\layout Standard
+\newline
+/* generic
+ pointer physically located in default memory space */
+\newline
+unsigned char * p;
+\newline
-The parameter naming convention is __PARM_, where n is
- the parameter number starting from 1, and counting from the left.
- The first parameter is passed in
-\begin_inset Quotes eld
-\end_inset
+\newline
+/*
+ the following is a function pointer
+\begin_inset LatexCommand index
+name "function pointer"
-dpl
-\begin_inset Quotes erd
-\end_inset
+\end_inset
- for a one byte parameter,
-\begin_inset Quotes eld
-\end_inset
+ physically located in data space */
+\newline
+char (* __data fp)(void);
+\end_layout
-dptr
-\begin_inset Quotes erd
-\end_inset
+\begin_layout Standard
+Well you get the idea.
+
+\newline
- for two bytes,
-\begin_inset Quotes eld
-\end_inset
+\newline
+All unqualified pointers are treated as 3-byte (4-byte for the ds390)
+\emph on
+generic
+\emph default
+ pointers.
+
+\size small
-b,dptr
-\begin_inset Quotes erd
-\end_inset
+\newline
- for three bytes and
-\begin_inset Quotes eld
-\end_inset
+\newline
-acc,b,dptr
-\begin_inset Quotes erd
-\end_inset
+\size default
+The highest order byte of the
+\emph on
+generic
+\emph default
+ pointers contains the data space information.
+ Assembler support routines are called whenever data is stored or retrieved
+ using
+\emph on
+generic
+\emph default
+ pointers.
+ These are useful for developing reusable library
+\begin_inset LatexCommand index
+name "Libraries"
- for a four bytes parameter.
- The variable name for the second parameter will be __PARM_2.
-\newline
+\end_inset
-\newline
-Assemble the assembler routine with the following command:
-\newline
+ routines.
+ Explicitly specifying the pointer
+\begin_inset LatexCommand index
+name "pointer"
-\newline
+\end_inset
-\family sans
-\series bold
-asx8051 -losg asmfunc.asm
-\newline
+ type will generate the most efficient code.
+\end_layout
-\newline
+\begin_layout Subsubsection
+Notes on MCS51 memory
+\begin_inset LatexCommand index
+name "MCS51 memory"
-\family default
-\series default
-Then compile and link the assembler routine to the C source file with the
- following command:
-\newline
+\end_inset
-\newline
+ layout
+\end_layout
-\family sans
-\series bold
-sdcc cfunc.c asmfunc.rel
-\layout Subsection
+\begin_layout Standard
+The 8051 family of microcontrollers have a minimum of 128 bytes of internal
+ RAM memory which is structured as follows:
+\newline
-Assembler Routine (reentrant)
-\layout Standard
+\newline
+- Bytes 00-1F - 32 bytes to hold
+ up to 4 banks of the registers R0 to R7,
+\newline
+- Bytes 20-2F - 16 bytes to hold
+ 128 bit
+\begin_inset LatexCommand index
+name "bit"
-In this case
-\begin_inset LatexCommand \index{reentrant}
+\end_inset
-\end_inset
+ variables and,
+\newline
+- Bytes 30-7F - 80 bytes for general purpose use.
+\newline
+\end_layout
-\begin_inset LatexCommand \index{Assembler routines (reentrant)}
+\begin_layout Standard
+Additionally some members of the MCS51 family may have up to 128 bytes of
+ additional, indirectly addressable, internal RAM memory (
+\emph on
+idata
+\emph default
-\end_inset
+\begin_inset LatexCommand index
+name "idata (mcs51, ds390 storage class)"
- the second parameter
-\begin_inset LatexCommand \index{function parameter}
+\end_inset
-\end_inset
- onwards will be passed on the stack, the parameters are pushed from right
- to left i.e.
- after the call the leftmost parameter will be on the top of the stack.
- Here is an example:
-\layout Verse
+\begin_inset LatexCommand index
+name "\\_\\_idata (mcs51, ds390 storage class)"
+\end_inset
-\family typewriter
-extern int asm_func(unsigned char, unsigned char);
-\newline
+).
+ Furthermore, some chips may have some built in external memory (
+\emph on
+xdata
+\emph default
-\newline
-int c_func (unsigned char i, unsigned char j) reentrant
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-return asm_func(i,j);
-\newline
-}
-\newline
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
-\newline
-int main()
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-return c_func(10,9);
-\newline
-}
-\layout Standard
+\end_inset
-The corresponding assembler routine is:
-\layout Verse
+\begin_inset LatexCommand index
+name "\\_\\_xdata (mcs51, ds390 storage class)"
-\family typewriter
-.globl _asm_func
-\newline
-_asm_func:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push _bp
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov _bp,sp
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov r2,dpl
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov a,_bp
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-add a,#0xfd
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov r0,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-add a,#0xfc ;?
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov r1,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov a,@r0
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-add a,r2 ;?
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov dpl,a
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov dph,#0x00
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mov sp,_bp
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-pop _bp
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ret
-\layout Standard
-\added_space_bottom bigskip
-The compiling and linking procedure remains the same, however note the extra
- entry & exit linkage required for the assembler code, _bp is the stack
- frame pointer and is used to compute the offset into the stack for parameters
- and local variables.
-\layout Section
+\end_inset
-int (16 bit)
-\begin_inset LatexCommand \index{int (16 bit)}
+) which should not be confused with the internal, directly addressable RAM
+ memory (
+\emph on
+data
+\emph default
-\end_inset
+\begin_inset LatexCommand index
+name "data (mcs51, ds390 storage class)"
- and long (32 bit)
-\begin_inset LatexCommand \index{long (32 bit)}
+\end_inset
-\end_inset
- Support
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_data (mcs51, ds390 storage class)"
-For signed & unsigned int (16 bit) and long (32 bit) variables, division,
- multiplication and modulus operations are implemented by support routines.
- These support routines are all developed in ANSI-C to facilitate porting
- to other MCUs, although some model specific assembler optimizations are
- used.
- The following files contain the described routines, all of them can be
- found in /share/sdcc/lib.
-\newline
+\end_inset
-\layout Standard
-\align center
+).
+ Sometimes this built in
+\emph on
+xdata
+\emph default
+ memory has to be activated before using it (you can probably find this
+ information on the datasheet of the microcontroller your are using, see
+ also section
+\begin_inset LatexCommand ref
+reference "sub:Startup-Code"
-\begin_inset Tabular
-
-
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+\InsetSpace ~
+Startup-Code).
+\end_layout
+\begin_layout Standard
+Normally SDCC will only use the first bank
+\begin_inset LatexCommand index
+name "register bank (mcs51, ds390)"
-\series bold
-Function
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ of registers (register bank 0), but it is possible to specify that other
+ banks of registers (keyword
+\emph on
+using
+\emph default
+
+\emph on
+\begin_inset LatexCommand index
+name "using (mcs51, ds390 register bank)"
-\series bold
-Description
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-_mulint.c
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "\\_\\_using (mcs51, ds390 register bank)"
-\layout Standard
+\end_inset
-16 bit multiplication
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\emph default
+) should be used for example in interrupt
+\begin_inset LatexCommand index
+name "interrupt"
-_divsint.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
- signed 16 bit division (calls _divuint)
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "\\_\\_interrupt"
-\layout Standard
+\end_inset
-_divuint.c
-\end_inset
-
-
-\begin_inset Text
+ routines.
+ By default, the compiler will place the stack after the last byte of allocated
+ memory for variables.
+ For example, if the first 2 banks of registers are used, and only four
+ bytes are used for
+\emph on
+data
+\emph default
+ variables, it will position the base of the internal stack at address 20
+ (0x14).
+ This implies that as the stack
+\begin_inset LatexCommand index
+name "stack"
-\layout Standard
+\end_inset
- unsigned 16 bit division
-\end_inset
-
-
-
-
-\begin_inset Text
+ grows, it will use up the remaining register banks, and the 16 bytes used
+ by the 128 bit variables, and 80 bytes for general purpose use.
+ If any bit variables are used, the data variables will be placed in unused
+ register banks and after the byte holding the last bit variable.
+ For example, if register banks 0 and 1 are used, and there are 9 bit variables
+ (two bytes used),
+\emph on
+data
+\emph default
+ variables will be placed starting from address 0x10 to 0x20 and continue
+ at address 0x22.
+ You can also use -
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-_modsint.c
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-signed 16 bit modulus (calls _moduint)
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-data-loc
+\begin_inset LatexCommand index
+name "-\\/-data-loc "
-_moduint.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ to specify the start address of the
+\emph on
+data
+\emph default
+ and -
+\begin_inset ERT
+status collapsed
-unsigned 16 bit modulus
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-_mullong.c
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-32 bit multiplication
-\end_inset
-
-
-
-
-\begin_inset Text
+-iram-size
+\begin_inset LatexCommand index
+name "-\\/-iram-size "
-\layout Standard
+\end_inset
-_divslong.c
-\end_inset
-
-
-\begin_inset Text
+ to specify the size of the total internal RAM (
+\emph on
+data
+\emph default
++
+\emph on
+idata
+\emph default
+).
+
+\newline
-\layout Standard
+\end_layout
- signed 32 division (calls _divulong)
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
+By default the 8051 linker will place the stack after the last byte of (i)data
+ variables.
+ Option -
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-_divulong.c
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-unsigned 32 division
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-stack-loc
+\begin_inset LatexCommand index
+name "-\\/-stack-loc "
-_modslong.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ allows you to specify the start of the stack, i.e.
+ you could start it after any data in the general purpose area.
+ If your microcontroller has additional indirectly addressable internal
+ RAM (
+\emph on
+idata
+\emph default
+) you can place the stack on it.
+ You may also need to use -
+\begin_inset ERT
+status collapsed
- signed 32 bit modulus (calls _modulong)
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-_modulong.c
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-unsigned 32 bit modulus
-\end_inset
-
-
-
-
-\end_inset
+-xdata-loc
+\begin_inset LatexCommand index
+name "-\\/-xdata-loc"
+\end_inset
-\newline
+ to set the start address of the external RAM (
+\emph on
+xdata
+\emph default
+) and -
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-Since they are compiled as
-\emph on
-non-reentrant
-\emph default
-\begin_inset LatexCommand \index{reentrant}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-, interrupt
-\begin_inset LatexCommand \index{interrupt}
+-xram-size
+\begin_inset LatexCommand index
+name "-\\/-xram-size "
-\end_inset
+\end_inset
- service routines should not do any of the above operations.
- If this is unavoidable then the above routines will need to be compiled
- with the
-\emph on
--
+ to specify its size.
+ Same goes for the code memory, using -
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\end_inset
-\end_inset
+-code-loc
+\begin_inset LatexCommand index
+name "-\\/-code-loc "
+\end_inset
-\emph default
- option, after which the source program will have to be compiled with
-\emph on
--
+ and -
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--int-long-reent
-\begin_inset LatexCommand \index{-\/-int-long-reent}
+\end_inset
-\end_inset
+-code-size
+\begin_inset LatexCommand index
+name "-\\/-code-size "
+\end_inset
-\emph default
- option.
- Notice that you don't have to call these routines directly.
- The compiler will use them automatically every time an integer operation
- is required.
-\layout Section
+.
+ If in doubt, don't specify any options and see if the resulting memory
+ layout is appropriate, then you can adjust it.
+\end_layout
-Floating Point Support
-\begin_inset LatexCommand \index{Floating point support}
+\begin_layout Standard
+The linker generates two files with memory allocation information.
+ The first, with extension .map
+\begin_inset LatexCommand index
+name ".map"
-\end_inset
+\end_inset
+ shows all the variables and segments.
+ The second with extension .mem
+\begin_inset LatexCommand index
+name ".mem"
-\layout Standard
+\end_inset
-SDCC supports IEEE (single precision 4 bytes) floating point numbers.
- The floating point support routines are derived from gcc's floatlib.c and
- consist of the following routines:
-\newline
+ shows the final memory layout.
+ The linker will complain either if memory segments overlap, there is not
+ enough memory, or there is not enough space for stack.
+ If you get any linking warnings and/or errors related to stack or segments
+ allocation, take a look at either the .map or .mem files to find out what
+ the problem is.
+ The .mem file may even suggest a solution to the problem.
+\begin_inset VSpace bigskip
+\end_inset
-\layout Standard
-\align center
-\size footnotesize
+\end_layout
-\begin_inset Tabular
-
-
-
-
-
-
-\begin_inset Text
+\begin_layout Subsection
+Z80/Z180 Storage Class
+\begin_inset LatexCommand index
+name "Z80!Storage class"
-\layout Standard
+\end_inset
+ Language Extensions
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-Function
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Subsubsection
+sfr
+\begin_inset LatexCommand index
+name "sfr"
-\layout Standard
+\end_inset
-Description
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_sfr"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fsadd.c
-\end_inset
-
-
-\begin_inset Text
+ (in/out to 8-bit addresses)
+\end_layout
-\layout Standard
+\begin_layout Standard
+The Z80
+\begin_inset LatexCommand index
+name "Z80"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-add floating point numbers
-\end_inset
-
-
-
-
-\begin_inset Text
+ family has separate address spaces for memory and
+\emph on
+i
+\emph default
+nput/
+\emph on
+o
+\emph default
+utput memory.
+ I/O memory
+\begin_inset LatexCommand index
+name "I/O memory (Z80, Z180)"
-\layout Standard
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fssub.c
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "Z80!I/O memory"
-\layout Standard
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-subtract floating point numbers
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "Z180!I/O memory"
-\layout Standard
+\end_inset
+ is accessed with special instructions, e.g.:
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fsdiv.c
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Verse
-\layout Standard
+\family typewriter
+sfr at 0x78 IoPort;\InsetSpace ~
+\InsetSpace ~
+/* define a var in I/O space at 78h called IoPort */
+
+\end_layout
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-divide floating point numbers
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Verse
-\layout Standard
+\family typewriter
+3E 01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ld a,#0x01
+\newline
+D3 78\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+out (_IoPort),a
+\end_layout
+\begin_layout Subsubsection
+banked sfr
+\begin_inset LatexCommand index
+name "sfr"
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fsmul.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_sfr"
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-multiply floating point numbers
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ (in/out to 16-bit addresses)
+\end_layout
+\begin_layout Standard
+The keyword
+\emph on
+banked
+\emph default
+ is used to support 16 bit addresses in I/O memory e.g.:
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2uchar.c
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Verse
-\layout Standard
+\family typewriter
+sfr banked at
+\begin_inset LatexCommand index
+name "at"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to unsigned char
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_at"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2char.c
-\end_inset
-
-
-\begin_inset Text
+ 0x123 IoPort;
+\end_layout
-\layout Standard
+\begin_layout Standard
+Writing 0x01 to this variable generates the assembly code:
+\end_layout
+\begin_layout Verse
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to signed char
-\end_inset
-
-
-
-
-\begin_inset Text
+\family typewriter
+01 23 01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ld bc,#_IoPort
+\newline
+3E 01\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ld a,#0x01
+\newline
+ED 79\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+out (c),a
+\end_layout
-\layout Standard
+\begin_layout Subsubsection
+sfr
+\begin_inset LatexCommand index
+name "sfr"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2uint.c
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_sfr"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to unsigned int
-\end_inset
-
-
-
-
-\begin_inset Text
+ (in0/out0 to 8 bit addresses on Z180
+\begin_inset LatexCommand index
+name "Z180"
-\layout Standard
+\end_inset
+/HD64180
+\begin_inset LatexCommand index
+name "HD64180 (see Z180)"
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2int.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+)
+\end_layout
+\begin_layout Standard
+The compiler option -
+\begin_inset ERT
+status collapsed
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to signed int
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2ulong.
-\family default
-\series default
-\shape default
-\size default
-\emph default
-\bar default
-\noun default
-\color default
-c
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to unsigned long
-\end_inset
-
-
-
-
-\begin_inset Text
+-portmode
+\begin_inset LatexCommand index
+name "Z180!Options!-\\/-portmode"
-\layout Standard
+\end_inset
+=180 (80) and a compiler #pragma\InsetSpace ~
+portmode
+\begin_inset LatexCommand index
+name "Z180!Pragmas!\\#pragma portmode"
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_fs2long.c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
+ns
+\family typewriter
+in0/out0
+\family default
+ instead of
+\family typewriter
+in/out
+\family default
+.
+ If you include the file z180.h this will be set automatically.
+\begin_inset VSpace bigskip
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert floating point to signed long
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Subsection
+HC08 Storage Class
+\begin_inset LatexCommand index
+name "HC08!Storage class"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_uchar2fs.c
-\end_inset
-
-
-\begin_inset Text
+ Language Extensions
+\end_layout
-\layout Standard
+\begin_layout Subsubsection
+data
+\begin_inset LatexCommand index
+name "data (hc08 storage class)"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert unsigned char to floating point
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_data (hc08 storage class)"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_char2fs.c
-\end_inset
-
-
-\begin_inset Text
+
+\end_layout
-\layout Standard
+\begin_layout Standard
+The data storage class declares a variable that resides in the first 256
+ bytes of memory (the direct page).
+ The HC08
+\begin_inset LatexCommand index
+name "HC08"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert char to floating point number
-\end_inset
-
-
-
-
-\begin_inset Text
+ is most efficient at accessing variables (especially pointers) stored here.
+\end_layout
-\layout Standard
+\begin_layout Subsubsection
+xdata
+\begin_inset LatexCommand index
+name "xdata (hc08 storage class)"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_uint2fs.c
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_xdata (hc08 storage class)"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert unsigned int to floating point
-\end_inset
-
-
-
-
-\begin_inset Text
+
+\end_layout
-\layout Standard
+\begin_layout Standard
+The xdata storage class declares a variable that can reside anywhere in
+ memory.
+ This is the default if no storage class is specified.
+
+\begin_inset VSpace bigskip
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_int2fs.c
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Section
+Other SDCC language extensions
+\begin_inset LatexCommand index
+name "Other SDCC language extensions"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert int to floating point numbers
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
+\begin_layout Subsection
+Binary constants
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_ulong2fs.c
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+SDCC supports the use of binary constants, such as 0b01100010.
+ This feature is only enabled when the compiler is invoked using --std-sdccxx.
+\end_layout
-\layout Standard
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert unsigned long to floating point number
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Section
+Absolute Addressing
+\begin_inset LatexCommand index
+name "Absolute addressing"
+\end_inset
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-_long2fs.c
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
+\begin_layout Standard
+Data items can be assigned an absolute address with the
+\emph on
+at
+\begin_inset LatexCommand index
+name "at"
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-convert long to floating point number
-\end_inset
-
-
-
+\end_inset
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_at"
-\newline
+\end_inset
-\layout Standard
-\added_space_bottom bigskip
-These support routines are developed in ANSI-C so there is room for space
- and speed improvement
-\begin_inset Foot
-collapsed false
+
+\emph default
+ keyword, in addition to a storage class, e.g.:
+\end_layout
-\layout Standard
+\begin_layout Verse
-These floating point routines (
-\emph on
-not
-\emph default
- sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
-
-\end_inset
+\family typewriter
+xdata
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
-.
- Note if all these routines are used simultaneously the data space might
- overflow.
- For serious floating point usage the large model might be needed.
- Also notice that you don't have to call this routines directly.
- The compiler will use them automatically every time a floating point operation
- is required.
-\layout Section
+\end_inset
-Library Routines
-\begin_inset LatexCommand \index{Libraries}
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_xdata (mcs51, ds390 storage class)"
+\end_inset
-\layout Standard
+ at
+\begin_inset LatexCommand index
+name "at"
+\end_inset
-\emph on
-
-\layout Subsection
-Compiler support routines (_gptrget, _mulint etc.)
-\layout Subsection
+\begin_inset LatexCommand index
+name "\\_\\_at"
-Stdclib functions (puts, printf, strcat etc.)
-\layout Subsubsection
+\end_inset
-
-\layout Standard
+ 0x7ffe unsigned int chksum;
+\end_layout
+\begin_layout Standard
+or, better conforming to ISO/IEC 9899 C:
+\end_layout
-\begin_inset LatexCommand \index{}
+\begin_layout Verse
-\end_inset
+\family typewriter
+__xdata __at (0x7ffe) unsigned int chksum;
+\end_layout
-As usual on embedded systems you have to provide your own
-\family typewriter
-getchar()
-\begin_inset LatexCommand \index{getchar()}
+\begin_layout Standard
+In the above example the variable chksum will be located at 0x7ffe and 0x7fff
+ of the external ram.
+ The compiler does
+\emph on
+not
+\emph default
+ reserve any space for variables declared in this way
+\begin_inset Marginal
+status collapsed
-\end_inset
+\begin_layout Standard
-
-\family default
-and
-\family typewriter
-putchar()
-\begin_inset LatexCommand \index{putchar()}
+\series bold
+\InsetSpace ~
+!
+\end_layout
-\end_inset
+\end_inset
+ (they are implemented with an equate in the assembler).
+ Thus it is left to the programmer to make sure there are no overlaps with
+ other variables that are declared without the absolute address.
+ The assembler listing file (.lst
+\begin_inset LatexCommand index
+name ".lst"
-\family default
- routines.
- SDCC does not know whether the system connects to a serial line with or
- without handshake, LCD, keyboard or other device.
- And whether a
-\family typewriter
-lf
-\family default
- to
-\family typewriter
-crlf
-\family default
- conversion within
-\family typewriter
-putchar()
-\family default
- is intended.
- You'll find examples for serial routines f.e.
- in sdcc/device/lib.
-\layout Standard
+\end_inset
-The default
-\family typewriter
- printf()
-\begin_inset LatexCommand \index{printf()}
+) and the linker output files (.rst
+\begin_inset LatexCommand index
+name ".rst"
-\end_inset
+\end_inset
+) and (.map
+\begin_inset LatexCommand index
+name ".map"
-\family default
-implementation in
-\family typewriter
- printf_large.c
-\family default
- does not support float (except on ds390).
- To enable this recompile it with the option
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+) are good places to look for such overlaps.
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+If however you provide an initializer
+\begin_inset LatexCommand index
+name "Variable initialization"
-DUSE_FLOATS=1
-\begin_inset LatexCommand \index{USE\_FLOATS}
+\end_inset
-\end_inset
+ actual memory allocation will take place and overlaps will be detected
+ by the linker.
+ E.g.:
+\end_layout
+\begin_layout Verse
-\emph default
- on the command line.
- Use
-\emph on
- -
-\begin_inset ERT
-status Collapsed
+\family typewriter
+__code __at (0x7ff0) char Id[5] =
+\begin_inset Quotes sld
+\end_inset
-\layout Standard
+SDCC
+\begin_inset Quotes srd
+\end_inset
-\backslash
-/
-\end_inset
+;
+\end_layout
--model-large
-\begin_inset LatexCommand \index{-\/-model-large}
+\begin_layout Standard
+In the above example the variable Id will be located from 0x7ff0 to 0x7ff4
+ in code memory.
+\end_layout
-\end_inset
+\begin_layout Standard
+In case of memory mapped I/O devices the keyword
+\emph on
+volatile
+\emph default
+ has to be used to tell the compiler that accesses might not be removed:
+\end_layout
+\begin_layout Verse
-\emph default
- for the mcs51 port, since this uses a lot of memory.
-\layout Standard
+\family typewriter
+volatile
+\begin_inset LatexCommand index
+name "volatile"
-If you're short on memory you might want to use
-\family typewriter
-printf_small()
-\begin_inset LatexCommand \index{printf\_small()}
+\end_inset
-\end_inset
+ __xdata
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
+\end_inset
-\family default
-
-\emph on
-instead
-\emph default
- of
-\family typewriter
- printf().
+ __at
+\begin_inset LatexCommand index
+name "at"
-\family default
- For the mcs51 there additionally are assembly versions
-\family typewriter
-printf_tiny()
-\begin_inset LatexCommand \index{printf\_tiny() (mcs51)}
+\end_inset
-\end_inset
+ (0x8000) unsigned char PORTA_8255;
+\end_layout
+\begin_layout Standard
+For some architectures (mcs51) array accesses are more efficient if an (xdata/fa
+r) array
+\family typewriter
+\size footnotesize
-\family default
- (subset of printf using less than 270 bytes) and
-\family typewriter
-printf_fast()
-\begin_inset LatexCommand \index{printf\_fast() (mcs51)}
+\begin_inset LatexCommand index
+name "Aligned array"
-\end_inset
+\end_inset
-
-\family default
-and
-\family typewriter
- printf_fast_f()
-\begin_inset LatexCommand \index{printf\_fast\_f() (mcs51)}
-\end_inset
+\family default
+\size default
+ starts at a block (256 byte) boundary
+\begin_inset LatexCommand index
+name "block boundary"
+\end_inset
-\family default
- (floating-point aware version of printf_fast) which should fit the requirements
- of many embedded systems (printf_fast() can be customized by unsetting
- #defines to
-\emph on
-not
-\emph default
- support long variables and field widths).
-\layout Subsubsection
+ (section
+\begin_inset LatexCommand ref
+reference "sub:A-Step-by Assembler Introduction"
-
-\begin_inset LatexCommand \index{malloc.h}
+\end_inset
-\end_inset
+ has an example).
+\newline
+Absolute addresses can be specified for variables in all
+ storage classes, e.g.:
+\end_layout
+\begin_layout Verse
-\layout Standard
+\family typewriter
+__bit
+\begin_inset LatexCommand index
+name "bit"
-As of SDCC 2.6.2 you no longer need to call an initialization routine before
- using dynamic memory allocation
-\begin_inset LatexCommand \index{dynamic memory allocation (malloc)}
+\end_inset
-\end_inset
+ __at
+\begin_inset LatexCommand index
+name "at"
- and a default heap
-\begin_inset LatexCommand \index{heap (malloc)}
+\end_inset
-\end_inset
+ (0x02) bvar;
+\end_layout
- space of 1024 bytes is provided for malloc to allocate memory from.
- If you need a different heap size you need to recompile _heap.c with the
- required size defined in HEAP_SIZE.
- It is recommended to make a copy of this file into your project directory
- and compile it there with:
-\layout Verse
+\begin_layout Standard
+The above example will allocate the variable at offset 0x02 in the bit-addressab
+le space.
+ There is no real advantage to assigning absolute addresses to variables
+ in this manner, unless you want strict control over all the variables allocated.
+ One possible use would be to write hardware portable code.
+ For example, if you have a routine that uses one or more of the microcontroller
+ I/O pins, and such pins are different for two different hardwares, you
+ can declare the I/O pins in your routine using:
+\end_layout
+\begin_layout Verse
-\family typewriter
-sdcc -c _heap.c -D HEAD_SIZE=2048
-\newline
+\family typewriter
+extern volatile
+\begin_inset LatexCommand index
+name "volatile"
-\family default
-And then link it with:
-\layout Verse
+\end_inset
+ __bit MOSI;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* master out, slave in */
+\newline
+extern volatile __bit MISO;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* master
+ in, slave out */
+\newline
+extern volatile __bit MCLK;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* master clock */
+\newline
-\family typewriter
-sdcc main.rel _heap.rel
-\newline
+\newline
+/* Input and
+ Output of a byte on a 3-wire serial bus.
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+If needed adapt polarity of clock,
+ polarity of data and bit order
+\newline
+\InsetSpace ~
+*/
+\newline
+unsigned char spi_io(unsigned char out_byte)
+
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+unsigned char i=8;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+do {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+MOSI = out_byte & 0x80;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+out_byte <<= 1;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+MCLK =
+ 1;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* _asm nop _endasm; */\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* for slow peripherals */
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+if(MISO)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+out_byte +=
+ 1;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+MCLK = 0;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+} while(--i);
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return out_byte;
+\newline
+}
+\end_layout
-\layout Subsection
+\begin_layout Standard
+Then, someplace in the code for the first hardware you would use
+\end_layout
-Math functions (sinf, powf, sqrtf etc.)
-\layout Subsubsection
+\begin_layout Verse
-
-\layout Standard
+\family typewriter
+__bit __at
+\begin_inset LatexCommand index
+name "at"
-See definitions in file .
-\layout Subsection
+\end_inset
-Other libraries
-\layout Standard
-Libraries
-\begin_inset LatexCommand \index{Libraries}
+\begin_inset LatexCommand index
+name "\\_\\_at"
-\end_inset
+\end_inset
- included in SDCC should have a license at least as liberal as the GNU Lesser
- General Public License
-\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL}
+ (0x80) MOSI;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* I/O port 0, bit 0 */
+\newline
+__bit __at (0x81) MISO;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* I/O port 0,
+ bit 1 */
+\newline
+__bit __at (0x82) MCLK;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* I/O port 0, bit 2 */
+\end_layout
-\end_inset
+\begin_layout Standard
+Similarly, for the second hardware you would use
+\end_layout
-
-\emph on
-LGPL
-\emph default
-.
-\layout Comment
+\begin_layout Verse
-license statements for the libraries are missing.
- sdcc/device/lib/ser_ir.c
-\layout Comment
+\family typewriter
+__bit __at (0x83) MOSI;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* I/O port 0, bit 3 */
+\newline
+__bit __at (0x91) MISO;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/*
+ I/O port 1, bit 1 */
+\newline
+__bit
+\begin_inset LatexCommand index
+name "bit"
-or _decdptr f.e.
- come with a GPL (as opposed to LGPL) License - this will not be liberal
- enough for many embedded programmers.
-\layout Standard
+\end_inset
-If you have ported some library or want to share experience about some code
- which f.e.
- falls into any of these categories Busses (I
-\begin_inset Formula $^{\textrm{2}}$
-\end_inset
+ __at (0x92) MCLK;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* I/O port 1, bit 2 */
+\end_layout
-C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory
- cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel,
- Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list
-\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599}
+\begin_layout Standard
+and you can use the same hardware dependent routine without changes, as
+ for example in a library.
+ This is somehow similar to sbit, but only one absolute address has to be
+ specified in the whole project.
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
-\SpecialChar ~
-would certainly like to hear about it.
-\layout Standard
-\added_space_bottom bigskip
-Programmers coding for embedded systems are not especially famous for being
- enthusiastic, so don't expect a big hurray but as the mailing list is searchabl
-e these references are very valuable.
- Let's help to create a climate where information is shared.
-\layout Section
+\end_layout
-Memory Models
-\layout Subsection
+\begin_layout Section
+Parameters
+\begin_inset LatexCommand index
+name "Parameters"
-MCS51 Memory Models
-\begin_inset LatexCommand \index{Memory model}
+\end_inset
-\end_inset
+\begin_inset LatexCommand index
+name "function parameter"
-\begin_inset LatexCommand \index{MCS51 memory model}
+\end_inset
-\end_inset
+ & Local Variables
+\begin_inset LatexCommand index
+name "local variables"
+\end_inset
-\layout Subsubsection
-Small, Medium and Large
-\layout Standard
+\begin_inset LatexCommand label
+name "sec:Parameters-and-Local-Variables"
-SDCC allows three memory models for MCS51 code,
-\shape slanted
-small, medium
-\shape default
- and
-\shape slanted
-large
-\shape default
-.
- Modules compiled with different memory models should
-\emph on
-never
-\emph default
- be combined together or the results would be unpredictable.
- The library routines supplied with the compiler are compiled as small,
- medium and large.
- The compiled library modules are contained in separate directories as small,
- medium and large so that you can link to the appropriate set.
-\layout Standard
-
-When the medium or large model is used all variables declared without a
- storage class will be allocated into the external ram, this includes all
- parameters and local variables (for non-reentrant
-\begin_inset LatexCommand \index{reentrant}
+\end_inset
-\end_inset
- functions).
- When the small model is used variables without storage class are allocated
- in the internal ram.
-\layout Standard
+\end_layout
-Judicious usage of the processor specific storage classes
-\begin_inset LatexCommand \index{Storage class}
+\begin_layout Standard
+Automatic (local) variables and parameters to functions can either be placed
+ on the stack or in data-space.
+ The default action of the compiler is to place these variables in the internal
+ RAM (for small model) or external RAM (for medium or large model).
+ This in fact makes them similar to
+\emph on
+static
+\begin_inset LatexCommand index
+name "static"
-\end_inset
+\end_inset
- and the 'reentrant' function type will yield much more efficient code,
- than using the large model.
- Several optimizations are disabled when the program is compiled using the
- large model, it is therefore recommended that the small model be used unless
- absolutely required.
-\layout Subsubsection
-External Stack
-\begin_inset LatexCommand \label{sub:External-Stack}
+\emph default
+ so by default functions are non-reentrant
+\begin_inset LatexCommand index
+name "reentrant"
-\end_inset
+\end_inset
+.
+
+\newline
-\begin_inset LatexCommand \index{stack}
+\newline
+They can be placed on the stack
+\begin_inset LatexCommand index
+name "stack"
-\end_inset
+\end_inset
+ by using the
+\emph on
+-
+\begin_inset ERT
+status collapsed
-\begin_inset LatexCommand \index{External stack (mcs51)}
+\begin_layout Standard
-\end_inset
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-The external stack (-
-\begin_inset ERT
-status Collapsed
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--xstack option
-\begin_inset LatexCommand \index{-\/-xstack}
+\emph default
+ option, by using
+\emph on
+#pragma\InsetSpace ~
+stackauto
+\emph default
-\end_inset
+\begin_inset LatexCommand index
+name "\\#pragma stackauto"
-) is located in pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
+\end_inset
-\end_inset
+ or by using the
+\emph on
+reentrant
+\begin_inset LatexCommand index
+name "reentrant"
- memory (usually at the start of the external ram segment) and uses all
- unused space in pdata (max.
- 256 bytes).
- When -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
-\backslash
-/
-\end_inset
+\emph default
+ keyword in the function declaration, e.g.:
+\end_layout
--xstack option is used to compile the program, the parameters and local
- variables
-\begin_inset LatexCommand \index{local variables}
+\begin_layout Verse
-\end_inset
+\family typewriter
+unsigned char foo(char i) __reentrant
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+}
+\end_layout
- of all reentrant functions are allocated in this area.
- This option is provided for programs with large stack space requirements.
- When used with the -
+\begin_layout Standard
+Since stack space on 8051 is limited, the
+\emph on
+reentrant
+\emph default
+ keyword or the
+\emph on
+-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
+
+\end_inset
-stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\emph default
+ option should be used sparingly.
+ Note that the reentrant keyword just means that the parameters & local
+ variables will be allocated to the stack, it
+\emph on
+does not
+\emph default
+ mean that the function is register bank
+\begin_inset LatexCommand index
+name "register bank (mcs51, ds390)"
-\end_inset
+\end_inset
- option, all parameters and local variables are allocated on the external
- stack (note: support libraries will need to be recompiled with the same
- options.
- There is a predefined target in the library makefile).
-\layout Standard
+ independent.
+\newline
-The compiler outputs the higher order address byte of the external ram segment
- into port P2
-\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
+\newline
+Local variables
+\begin_inset LatexCommand index
+name "local variables"
-\end_inset
+\end_inset
- (see also section
-\begin_inset LatexCommand \ref{sub:MCS51-variants}
+ can be assigned storage classes and absolute
+\begin_inset LatexCommand index
+name "Absolute addressing"
-\end_inset
+\end_inset
-), therefore when using the External Stack option, this port
-\emph on
-may not
-\emph default
- be used by the application program.
-\layout Subsection
+ addresses, e.g.:
+\end_layout
-DS390 Memory Model
-\begin_inset LatexCommand \index{Memory model}
+\begin_layout Verse
-\end_inset
+\family typewriter
+unsigned char foo()
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+__xdata unsigned char i;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+__bit bvar;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+__data __at
+\begin_inset LatexCommand index
+name "at"
+\end_inset
-\begin_inset LatexCommand \index{DS390 memory model}
+ (0x31) unsigned char j;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+}
+\end_layout
-\end_inset
+\begin_layout Standard
+In the above example the variable
+\emph on
+i
+\emph default
+ will be allocated in the external ram,
+\emph on
+bvar
+\emph default
+ in bit addressable space and
+\emph on
+j
+\emph default
+ in internal ram.
+ When compiled with
+\emph on
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\layout Standard
-The only model supported is Flat 24
-\begin_inset LatexCommand \index{Flat 24 (DS390 memory model)}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-.
- This generates code for the 24 bit contiguous addressing mode of the Dallas
- DS80C390 part.
- In this mode, up to four meg of external RAM or code space can be directly
- addressed.
- See the data sheets at www.dalsemi.com for further information on this part.
-\newline
+-stack-auto
+\emph default
+ or when a function is declared as
+\emph on
+reentrant
+\emph default
+ this should only be done for static variables.
+\end_layout
-\newline
-Note that the compiler does not generate any code to place the processor
- into 24 bitmode (although
-\emph on
-tinibios
-\emph default
- in the ds390 libraries will do that for you).
- If you don't use
-\emph on
-tinibios
-\emph default
+\begin_layout Standard
+Parameters
+\begin_inset LatexCommand index
+name "function parameter"
-\begin_inset LatexCommand \index{Tinibios (DS390)}
+\end_inset
-\end_inset
+ however are not allowed any storage class
+\begin_inset LatexCommand index
+name "Storage class"
-, the boot loader or similar code must ensure that the processor is in 24
- bit contiguous addressing mode before calling the SDCC startup code.
-\newline
+\end_inset
-\newline
-Like the
-\emph on
--
-\begin_inset ERT
-status Collapsed
+, (storage classes for parameters will be ignored), their allocation is
+ governed by the memory model in use, and the reentrancy options.
+\end_layout
-\layout Standard
+\begin_layout Standard
+It is however allowed to use bit parameters in reentrant functions and also
+ non-static local bit variables are supported.
+ Efficient use is limited to 8 semi-bitregisters in bit space.
+ They are pushed and popped to stack
+\begin_inset LatexCommand index
+name "stack"
-\backslash
-/
-\end_inset
+\end_inset
--model-large
-\emph default
- option, variables will by default be placed into the XDATA segment.
-
-\newline
+ as a single byte just like the normal registers.
+\end_layout
-\newline
-Segments may be placed anywhere in the 4 meg address space using the usual
- -
-\begin_inset ERT
-status Collapsed
+\begin_layout Section
+Overlaying
+\begin_inset LatexCommand label
+name "sub:Overlaying"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--*-loc options.
- Note that if any segments are located above 64K, the -r flag must be passed
- to the linker to generate the proper segment relocations, and the Intel
- HEX output format must be used.
- The -r flag can be passed to the linker by using the option
-\emph on
--Wl-r
-\emph default
- on the SDCC command line.
- However, currently the linker can not handle code segments > 64k.
-\layout Section
+\begin_inset LatexCommand index
+name "Overlaying"
-Pragmas
-\begin_inset LatexCommand \label{sec:Pragmas}
+\end_inset
-\end_inset
+\end_layout
-\begin_inset LatexCommand \index{Pragmas}
+\begin_layout Standard
+For non-reentrant
+\begin_inset LatexCommand index
+name "reentrant"
-\end_inset
+\end_inset
+ functions SDCC will try to reduce internal ram space usage by overlaying
+ parameters and local variables of a function (if possible).
+ Parameters and local variables
+\begin_inset LatexCommand index
+name "local variables"
-\layout Standard
+\end_inset
-SDCC supports the following #pragma directives:
-\layout Itemize
+ of a function will be allocated to an overlayable segment if the function
+ has
+\emph on
+no other function calls and the function is non-reentrant and the memory
+ model
+\begin_inset LatexCommand index
+name "Memory model"
+\end_inset
-\series bold
-save
-\series default
+ is small.
-\begin_inset LatexCommand \index{\#pragma save}
+\emph default
+ If an explicit storage class
+\begin_inset LatexCommand index
+name "Storage class"
-\end_inset
+\end_inset
- - this will save most current options to the save/restore stack.
- See #pragma\SpecialChar ~
-restore.
-\layout Itemize
+ is specified for a local variable, it will NOT be overlaid.
+\end_layout
+\begin_layout Standard
+Note that the compiler (not the linkage editor) makes the decision for overlayin
+g the data items.
+ Functions that are called from an interrupt service routine
+\begin_inset Marginal
+status collapsed
-\series bold
-restore
-\series default
+\begin_layout Standard
-\begin_inset LatexCommand \index{\#pragma restore}
+\series bold
+!
+\end_layout
-\end_inset
+\end_inset
- - will restore saved options from the last save.
- saves & restores can be nested.
- SDCC uses a save/restore stack: save pushes current options to the stack,
- restore pulls current options from the stack.
- See #pragma\SpecialChar ~
-save.
-\newline
+ should be preceded by a #pragma\InsetSpace ~
+nooverlay
+\begin_inset LatexCommand index
+name "\\#pragma nooverlay"
-\layout Itemize
+\end_inset
+ if they are not reentrant.
+\end_layout
-\series bold
-callee_saves
-\series default
-
-\begin_inset LatexCommand \index{\#pragma callee\_saves}
+\begin_layout Standard
+Also note that the compiler does not do any processing of inline assembler
+ code, so the compiler might incorrectly assign local variables and parameters
+ of a function into the overlay segment if the inline assembler code calls
+ other c-functions that might use the overlay.
+ In that case the #pragma\InsetSpace ~
+nooverlay should be used.
+\end_layout
-\end_inset
+\begin_layout Standard
+Parameters and local variables of functions that contain 16 or 32 bit multiplica
+tion
+\begin_inset LatexCommand index
+name "Multiplication"
+\end_inset
-\begin_inset LatexCommand \index{function prologue}
+ or division
+\begin_inset LatexCommand index
+name "Division"
-\end_inset
+\end_inset
- function1[,function2[,function3...]] - The compiler by default uses a caller
- saves convention for register saving across function calls, however this
- can cause unnecessary register pushing & popping
-\begin_inset LatexCommand \index{push/pop}
+ will NOT be overlaid since these are implemented using external functions,
+ e.g.:
+\end_layout
-\end_inset
+\begin_layout Verse
- when calling small functions from larger functions.
- This option can be used to switch off the register saving convention for
- the function names specified.
- The compiler will not save registers when calling these functions, extra
- code need to be manually inserted at the entry & exit for these functions
- to save & restore the registers used by these functions, this can SUBSTANTIALLY
- reduce code & improve run time performance of the generated code.
- In the future the compiler (with inter procedural analysis) may be able
- to determine the appropriate scheme to use for each function call.
- If -
-\begin_inset ERT
-status Collapsed
+\family typewriter
+#pragma save
+\newline
+#pragma nooverlay
+\begin_inset LatexCommand index
+name "\\#pragma nooverlay"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+
+\newline
+void set_error(unsigned char errcd)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+P3 = errcd;
+\newline
+}
+\newline
+#pragma restore
+\newline
--callee-saves command line option is used, the function names specified
- in #pragma\SpecialChar ~
-callee_saves
-\begin_inset LatexCommand \index{\#pragma callee\_saves}
+\newline
+void
+ some_isr () __interrupt
+\begin_inset LatexCommand index
+name "interrupt"
-\end_inset
+\end_inset
- is appended to the list of functions specified in the command line.
-\layout Itemize
+ (2)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+set_error(10);
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+}
+\end_layout
+\begin_layout Standard
+In the above example the parameter
+\emph on
+errcd
+\emph default
+ for the function
+\emph on
+set_error
+\emph default
+ would be assigned to the overlayable segment if the #pragma\InsetSpace ~
+nooverlay was
+ not present, this could cause unpredictable runtime behavior when called
+ from an interrupt service routine.
+ The #pragma\InsetSpace ~
+nooverlay ensures that the parameters and local variables for
+ the function are NOT overlaid.
+\begin_inset VSpace bigskip
+\end_inset
-\series bold
-exclude
-\series default
-\begin_inset LatexCommand \index{\#pragma exclude}
+\end_layout
-\end_inset
+\begin_layout Section
+Interrupt Service Routines
+\begin_inset LatexCommand label
+name "sub:Interrupt-Service-Routines"
- none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation
- of pairs of push/pop
-\begin_inset LatexCommand \index{push/pop}
+\end_inset
-\end_inset
- instructions in
-\emph on
-I
-\emph default
-nterrupt
-\begin_inset LatexCommand \index{interrupt}
+\end_layout
-\end_inset
+\begin_layout Subsection
+General Information
+\end_layout
-
-\emph on
-S
-\emph default
+\begin_layout Standard
+SDCC allows
+\emph on
+i
+\emph default
+nterrupt
+\emph on
+s
+\emph default
ervice
-\emph on
-R
-\emph default
-outines.
- The directive should be placed immediately before the ISR function definition
- and it affects ALL ISR functions following it.
- To enable the normal register saving for ISR functions use #pragma\SpecialChar ~
-exclude\SpecialChar ~
-none
-\begin_inset LatexCommand \index{\#pragma exclude}
+\emph on
+r
+\emph default
+outines to be coded in C, with some extended keywords.
+\end_layout
-\end_inset
+\begin_layout Verse
-.
- See also the related keyword _naked
-\begin_inset LatexCommand \index{\_naked}
+\family typewriter
+void timer_isr (void) __interrupt (1) __using (1)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+}
+\end_layout
-\end_inset
+\begin_layout Standard
+The optional number following the
+\emph on
+interrupt
+\begin_inset LatexCommand index
+name "interrupt"
+\end_inset
-\begin_inset LatexCommand \index{\_\_naked}
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_interrupt"
-.
-\layout Itemize
+\end_inset
-\series bold
-less_pedantic
-\series default
+\emph default
+ keyword is the interrupt number this routine will service.
+ When present, the compiler will insert a call to this routine in the interrupt
+ vector table
+\begin_inset LatexCommand index
+name "interrupt vector table"
-\begin_inset LatexCommand \index{\#pragma less\_pedantic}
+\end_inset
-\end_inset
+ for the interrupt number specified.
+ If you have multiple source files in your project, interrupt service routines
+ can be present in any of them, but a prototype of the isr MUST be present
+ or included in the file that contains the function
+\emph on
+main
+\emph default
+.
+ The optional (8051 specific) keyword
+\emph on
+using
+\begin_inset LatexCommand index
+name "using (mcs51, ds390 register bank)"
- - the compiler will not warn you anymore for obvious mistakes, you'r on
- your own now ;-(
-\layout Itemize
+\end_inset
-\series bold
-disable_warning
-\series default
-
-\begin_inset LatexCommand \index{\#pragma disable\_warning}
+\begin_inset LatexCommand index
+name "\\_\\_using (mcs51, ds390 register bank)"
-\end_inset
+\end_inset
- - the compiler will not warn you anymore about warning number .
-\layout Itemize
+\emph default
+ can be used to tell the compiler to use the specified register bank when
+ generating code for this function.
+
+\newline
+Interrupt service routines open the door for some very interesting bugs:
+\end_layout
-\series bold
-nogcse
-\series default
+\begin_layout Subsubsection
+\begin_inset LatexCommand label
+name "sub:Common-interrupt-pitfall-volatile"
-\begin_inset LatexCommand \index{\#pragma nogcse}
+\end_inset
-\end_inset
+Common interrupt pitfall: variable not declared
+\emph on
+volatile
+\end_layout
- - will stop global common subexpression elimination.
-\layout Itemize
+\begin_layout Standard
+If an interrupt service routine changes variables which are accessed by
+ other functions these variables have to be declared
+\emph on
+volatile
+\emph default
+\begin_inset LatexCommand index
+name "volatile"
-\series bold
-noinduction
-\series default
+\end_inset
-\begin_inset LatexCommand \index{\#pragma noinduction}
+.
+ See
+\begin_inset LatexCommand url
+target "http://en.wikipedia.org/wiki/Volatile_variable"
-\end_inset
+\end_inset
- - will stop loop induction optimizations.
-\layout Itemize
+ .
+\end_layout
+\begin_layout Subsubsection
+\begin_inset LatexCommand label
+name "sub:Common-interrupt-pitfall-non-atomic"
-\series bold
-noinvariant
-\series default
+\end_inset
-\begin_inset LatexCommand \index{\#pragma noinvariant}
+Common interrupt pitfall:
+\emph on
+non-atomic access
+\end_layout
-\end_inset
+\begin_layout Standard
+If the access to these variables is not
+\emph on
+atomic
+\begin_inset LatexCommand index
+name "atomic"
- - will not do loop invariant optimizations.
- For more details see Loop Invariants in section
-\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
+\end_inset
-\end_inset
-.
-\layout Itemize
+\emph default
+ (i.e.
+ the processor needs more than one instruction for the access and could
+ be interrupted while accessing the variable) the interrupt must be disabled
+ during the access to avoid inconsistent data.
+
+\newline
+Access to 16 or 32 bit variables is obviously not atomic on 8 bit CPUs
+ and should be protected by disabling interrupts.
+ You're not automatically on the safe side if you use 8 bit variables though.
+ We need an example here: f.e.
+ on the 8051 the harmless looking
+\begin_inset Quotes srd
+\end_inset
-\series bold
-noiv
-\series default
+\family typewriter
+flags\InsetSpace ~
+|=\InsetSpace ~
+0x80;
+\family default
-\begin_inset LatexCommand \index{\#pragma noiv}
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+ is not atomic if
+\family typewriter
+flags
+\family default
+ resides in xdata.
+ Setting
+\begin_inset Quotes srd
+\end_inset
- - Do not generate interrupt
-\begin_inset LatexCommand \index{interrupt}
-\end_inset
+\family typewriter
+flags\InsetSpace ~
+|=\InsetSpace ~
+0x40;
+\family default
- vector table
-\begin_inset LatexCommand \index{interrupt vector table}
+\begin_inset Quotes sld
+\end_inset
-\end_inset
+ from within an interrupt routine might get lost if the interrupt occurs
+ at the wrong time.
+
+\begin_inset Quotes sld
+\end_inset
- entries for all ISR functions defined after the pragma.
- This is useful in cases where the interrupt vector table must be defined
- manually, or when there is a secondary, manually defined interrupt vector
- table (e.g.
- for the autovector feature of the Cypress EZ-USB FX2).
- More elegantly this can be achieved by obmitting the optional interrupt
- number after the interrupt keyword, see section
-\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines}
-\end_inset
+\family typewriter
+counter\InsetSpace ~
++=\InsetSpace ~
+8;
+\family default
-\SpecialChar ~
-about interrupts.
-\layout Itemize
+\begin_inset Quotes srd
+\end_inset
+ is not atomic on the 8051 even if
+\family typewriter
+counter
+\family default
+ is located in data memory.
+\newline
+Bugs like these are hard to reproduce and can
+ cause a lot of trouble.
+
+\end_layout
-\series bold
-nojtbound
-\series default
+\begin_layout Subsubsection
+\begin_inset LatexCommand label
+name "sub:Common-interrupt-pitfall-stack-overflow"
-\begin_inset LatexCommand \index{\#pragma nojtbound}
+\end_inset
-\end_inset
+Common interrupt pitfall:
+\emph on
+stack overflow
+\end_layout
- - will not generate code for boundary value checking, when switch statements
- are turned into jump-tables (dangerous).
- For more details see section
-\begin_inset LatexCommand \ref{sub:'switch'-Statements}
+\begin_layout Standard
+The return address and the registers used in the interrupt service routine
+ are saved on the stack
+\begin_inset LatexCommand index
+name "stack"
-\end_inset
+\end_inset
-.
-\layout Itemize
+ so there must be sufficient stack space.
+ If there isn't variables or registers (or even the return address itself)
+ will be corrupted.
+ This
+\emph on
+stack overflow
+\emph default
+\begin_inset LatexCommand index
+name "stack overflow"
-\series bold
-noloopreverse
-\series default
-
-\begin_inset LatexCommand \index{\#pragma noloopreverse}
+\end_inset
-\end_inset
+ is most likely to happen if the interrupt occurs during the
+\begin_inset Quotes sld
+\end_inset
- - Will not do loop reversal optimization
-\layout Itemize
+deepest
+\begin_inset Quotes srd
+\end_inset
+ subroutine when the stack is already in use for f.e.
+ many return addresses.
+\end_layout
-\series bold
-nooverlay
-\series default
+\begin_layout Subsubsection
+\begin_inset LatexCommand label
+name "sub:Common-interrupt-pitfall-non-reentrant"
-\begin_inset LatexCommand \index{\#pragma nooverlay}
+\end_inset
-\end_inset
+Common interrupt pitfall:
+\emph on
+use of non-reentrant functions
+\end_layout
- - the compiler will not overlay the parameters and local variables of a
- function.
-\layout Itemize
+\begin_layout Standard
+A special note here, int (16 bit) and long (32 bit) integer division
+\begin_inset LatexCommand index
+name "Division"
+\end_inset
-\series bold
-stackauto
-\series default
+, multiplication
+\begin_inset LatexCommand index
+name "Multiplication"
-\begin_inset LatexCommand \index{\#pragma stackauto}
+\end_inset
-\end_inset
+ & modulus
+\begin_inset LatexCommand index
+name "Modulus"
-- See option -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ and floating-point
+\begin_inset LatexCommand index
+name "Floating point support"
-\backslash
-/
-\end_inset
+\end_inset
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+ operations are implemented using external support routines.
+ If an interrupt service routine needs to do any of these operations then
+ the support routines (as mentioned in a following section) will have to
+ be recompiled using the
+\emph on
+-
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
- and section
-\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
-\end_inset
+\backslash
+/
+\end_layout
- Parameters and Local Variables.
-\layout Itemize
+\end_inset
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
-\series bold
-opt_code_speed
-\series default
-
-\begin_inset LatexCommand \index{\#pragma opt\_code\_speed}
+\end_inset
-\end_inset
-- The compiler will optimize code generation towards fast code, possibly
- at the expense of code size.
- Currently this has little effect.
-\layout Itemize
+\emph default
+ option and the source file will need to be compiled using the
+\emph on
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\series bold
-opt_code_size
-\series default
-
-\begin_inset LatexCommand \index{\#pragma opt\_code\_size}
-\end_inset
+\backslash
+/
+\end_layout
-- The compiler will optimize code generation towards compact code, possibly
- at the expense of code speed.
- Currently this has little effect.
-\layout Itemize
+\end_inset
+-int-long-reent
+\emph default
-\series bold
-opt_code_balanced
-\series default
-
-\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced}
+\begin_inset LatexCommand index
+name "-\\/-int-long-reent"
-\end_inset
+\end_inset
-- The compiler will attempt to generate code that is both compact and fast,
- as long as meeting one goal is not a detriment to the other (this is the
- default).
+ compiler option.
-\layout Itemize
+\newline
+Note, the type promotion
+\begin_inset LatexCommand index
+name "type promotion"
+\end_inset
-\series bold
-std_sdcc89
-\series default
-
-\begin_inset LatexCommand \index{\#pragma std\_sdcc89}
+ required by ANSI C can cause 16 bit routines to be used
+\begin_inset Marginal
+status collapsed
-\end_inset
+\begin_layout Standard
-- Generally follow the C89 standard, but allow SDCC features that conflict
- with the standard (default).
-\layout Itemize
+\series bold
+\InsetSpace ~
+!
+\end_layout
+\end_inset
-\series bold
-std_c89
-\series default
+ without the programmer being aware of it.
+ See f.e.
+ the cast
+\family typewriter
+\series bold
+(unsigned char)(tail-1)
+\family default
+\series default
-\begin_inset LatexCommand \index{\#pragma std\_c89}
+\series bold
+within the if clause in section
+\begin_inset LatexCommand ref
+reference "sub:A-Step-by Assembler Introduction"
-\end_inset
+\end_inset
-- Follow the C89 standard and disable SDCC features that conflict with the
- standard.
-\layout Itemize
+.
+\end_layout
+\begin_layout Standard
+Calling other functions from an interrupt service routine is not recommended,
+ avoid it if possible.
+ Note that when some function is called from an interrupt service routine
+ it should be preceded by a #pragma\InsetSpace ~
+nooverlay
+\begin_inset LatexCommand index
+name "\\#pragma nooverlay"
-\series bold
-std_sdcc99
-\series default
-
-\begin_inset LatexCommand \index{\#pragma std\_sdcc99}
+\end_inset
-\end_inset
+ if it is not reentrant.
+ Furthermore nonreentrant functions should not be called from the main program
+ while the interrupt service routine might be active.
+ They also must not be called from low priority interrupt service routines
+ while a high priority interrupt service routine might be active.
+ You could use semaphores or make the function
+\emph on
+critical
+\emph default
+ if all parameters are passed in registers.
+\newline
+ Also see section
+\begin_inset LatexCommand ref
+reference "sub:Overlaying"
-- Generally follow the C99 standard, but allow SDCC features that conflict
- with the standard (incomplete support).
-\layout Itemize
+\end_inset
+\InsetSpace ~
+about Overlaying and section
+\begin_inset LatexCommand ref
+reference "sub:Functions-using-private-banks"
-\series bold
-std_c99
-\series default
-
-\begin_inset LatexCommand \index{\#pragma std\_c99}
+\end_inset
-\end_inset
+\InsetSpace ~
+about Functions using private register banks.
+\begin_inset VSpace bigskip
+\end_inset
-- Follow the C99 standard and disable SDCC features that conflict with the
- standard (incomplete support).
-\layout Itemize
+\end_layout
-\series bold
-codeseg
-\series default
-
-\begin_inset LatexCommand \index{\#pragma codeseg}
+\begin_layout Subsection
+MCS51/DS390 Interrupt Service Routines
+\end_layout
-\end_inset
+\begin_layout Standard
+Interrupt
+\begin_inset LatexCommand index
+name "interrupt"
-- Use this name (max.
- 8 characters) for the code segment.
- See option -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ numbers and the corresponding address & descriptions for the Standard 8051/8052
+ are listed below.
+ SDCC will automatically adjust the
+\begin_inset LatexCommand index
+name "interrupt vector table"
-\backslash
-/
-\end_inset
+\end_inset
--codeseg.
-\layout Itemize
+ to the maximum interrupt number specified.
+\newline
+\end_layout
-\series bold
-constseg
-\series default
-
-\begin_inset LatexCommand \index{\#pragma constseg}
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+Interrupt #
+\end_layout
-- Use this name (max.
- 8 characters) for the const segment.
- See option -
-\begin_inset ERT
-status Collapsed
+\end_inset
+
+
+\begin_inset Text
-\layout Standard
+\begin_layout Standard
+Description
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
+
+
+\begin_inset Text
--constseg.
-\layout Standard
+\begin_layout Standard
+Vector Address
+\end_layout
-The preprocessor SDCPP
-\begin_inset LatexCommand \index{sdcpp (preprocessor)}
+\end_inset
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0
+\end_layout
- supports the following #pragma directives:
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+External 0
+\end_layout
-\series bold
-pedantic_parse_number
-\series default
+\end_inset
+
+
+\begin_inset Text
-\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number}
+\begin_layout Standard
+0x0003
+\end_layout
\end_inset
+
+
+
+
+\begin_inset Text
- (+ | -) - Pedantic parse numbers so that situations like 0xfe-LO_B(3) are
- parsed properly and the macro LO_B(3) gets expanded.
- Default is off.
- Below is an example on how to use this pragma.
+\begin_layout Standard
+1
+\end_layout
-\emph on
- Note: this functionality is not in conformance with standard!
+\end_inset
+
+
+\begin_inset Text
-\layout Verse
+\begin_layout Standard
+Timer 0
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\family typewriter
-#pragma pedantic_parse_number +
-\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number}
+\begin_layout Standard
+0x000b
+\end_layout
\end_inset
+
+
+
+
+\begin_inset Text
+\begin_layout Standard
+2
+\end_layout
-\newline
-\newline
-#define LO_B(x) ((x) & 0xff)
-\newline
-\newline
-unsigned char foo(void)
-\newline
-\InsetSpace ~
-\InsetSpace ~
-\InsetSpace ~
-unsigned char c=0xfe-LO_B(3);
-\newline
-\newline
-\InsetSpace ~
-\InsetSpace ~
-\InsetSpace ~
+\end_inset
+
+
+\begin_inset Text
-return c;
-\newline
-}
-\newline
+\begin_layout Standard
+External 1
+\end_layout
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+0x0013
+\end_layout
-\series bold
-preproc_asm
-\series default
+\end_inset
+
+
+
+
+\begin_inset Text
-\begin_inset LatexCommand \index{\#pragma preproc\_asm}
-
-\end_inset
-
- (+ | -) - switch _asm _endasm block preprocessing on / off.
- Default is on.
- You use this prama to define multilines of assembly code.
- This will prevent the preprocessor from changing the formating required
- by assembly code.
- Below is an example on how to use this pragma.
-\layout Verse
-
-
-\family typewriter
-#pragma preproc_asm -
-\begin_inset LatexCommand \index{\#pragma preproc\_asm}
-
-\end_inset
-
-
-\newline
-#define MYDELAY _asm
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop ;my assembly comment...
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop
-\newline
-_endasm
-\newline
-#pragma preproc_asm +
-\newline
-
-\newline
-void foo (void)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- ...
-
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- MYDELAY;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- ...
-
-\newline
-}
-\newline
-
-\layout Itemize
-
-
-\series bold
-sdcc_hash
-\series default
-
-\begin_inset LatexCommand \index{\#pragma sdcc\_hash}
-
-\end_inset
-
- (+ | -) - Allow "naked" hash in macro definition, for example:
-\newline
-\family typewriter
-#define DIR_LO(x) #(x & 0xff)
-\family default
-\newline
-Default is off.
- Below is an example on how to use this pragma.
-\layout Verse
-
-
-\family typewriter
-#pragma preproc_asm +
-\newline
-#pragma sdcc_hash +
-\begin_inset LatexCommand \index{\#pragma sdcc\_hash}
+\begin_layout Standard
+3
+\end_layout
\end_inset
-
-
-\newline
-\newline
-#define ROMCALL(x)
-\backslash
-\newline
-\InsetSpace ~
-\InsetSpace ~
-\InsetSpace ~
-mov R6_B3, #(x & 0xff)
-\backslash
-\newline
-\InsetSpace ~
-\InsetSpace ~
-\InsetSpace ~
-mov R7_B3, #((x >> 8) & 0xff)
-\backslash
-\newline
-\InsetSpace ~
-\InsetSpace ~
-\InsetSpace ~
-lcall __romcall
-\newline
-\newline
-...
-\newline
-_asm
-\newline
-ROMCALL(72)
-\newline
-_endasm;
-\newline
-...
-\newline
-
-\layout Standard
-
-The pragma's are intended to be used to turn-on or off certain optimizations
- which might cause the compiler to generate extra stack / data space to
- store compiler generated temporary variables.
- This usually happens in large functions.
- Pragma directives should be used as shown in the following example, they
- are used to control options & optimizations for a given function; pragmas
- should be placed before and/or after a function, placing pragma's inside
- a function body could have unpredictable results.
-\layout Verse
-
-
-\family typewriter
-#pragma save
-\begin_inset LatexCommand \index{\#pragma save}
-
-\end_inset
-
- \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* save the current settings */
-\newline
-#pragma nogcse
-\begin_inset LatexCommand \index{\#pragma nogcse}
-
-\end_inset
-
- \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* turnoff global subexpression elimination */
-\newline
-#pragma noinduction
-\begin_inset LatexCommand \index{\#pragma noinduction}
-
-\end_inset
-
- /* turn off induction optimizations */
-\newline
-int foo ()
-\newline
-{
-\newline
-\SpecialChar ~
- \SpecialChar ~
- ...
-
-\newline
-\SpecialChar ~
- \SpecialChar ~
- /* large code */
-\newline
-\SpecialChar ~
- \SpecialChar ~
- ...
-
-\newline
-}
-\newline
-#pragma restore
-\begin_inset LatexCommand \index{\#pragma restore}
-
-\end_inset
-
- /* turn the optimizations back on */
-\layout Standard
-
-The compiler will generate a warning message when extra space is allocated.
- It is strongly recommended that the save and restore pragma's be used when
- changing options for a function.
-\newline
-
-\newline
-
-\newline
-
-\layout Section
-
-Defines Created by the Compiler
-\layout Standard
-
-The compiler creates the following #defines
-\begin_inset LatexCommand \index{\#defines}
-
-\end_inset
-
-
-\begin_inset LatexCommand \index{Defines created by the compiler}
-
-\end_inset
-
-:
-\newline
-
-\layout Standard
-
-
-\begin_inset Tabular
-
-
-
-
-
+
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
+Timer 1
+\end_layout
-\series bold
-#define
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
+0x001b
+\end_layout
-\series bold
-Description
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+4
+\end_layout
-SDCC
-\begin_inset LatexCommand \index{SDCC}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+Serial
+\end_layout
-
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+0x0023
+\end_layout
-Always defined.
- Since version 2.5.6 the version number as an int (ex.
- 256)
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
-
-SDCC_mcs51
-\begin_inset LatexCommand \index{SDCC\_mcs51}
-
-\end_inset
-
- or SDCC_ds390
-\begin_inset LatexCommand \index{SDCC\_ds390}
-
-\end_inset
+\begin_layout Standard
+5
+\end_layout
- or SDCC_z80
-\begin_inset LatexCommand \index{SDCC\_z80}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+Timer 2 (8052)
+\end_layout
-, etc.
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+0x002b
+\end_layout
-depending on the model used (e.g.: -mds390)
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-__mcs51
-\begin_inset LatexCommand \index{\_\_mcs51}
-
-\end_inset
-
-, __ds390
-\begin_inset LatexCommand \index{\_\_ds390}
-
-\end_inset
-
-, __hc08
-\begin_inset LatexCommand \index{\_\_hc08}
+\begin_layout Standard
+...
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-, __z80
-\begin_inset LatexCommand \index{\_\_z80}
+\begin_layout Standard
-\end_inset
+\end_layout
-, etc
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+...
+\end_layout
-depending on the model used (e.g.
- -mz80)
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+n
+\end_layout
-SDCC_STACK_AUTO
-\begin_inset LatexCommand \index{SDCC\_STACK\_AUTO}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+\end_layout
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-when
-\emph on
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+\begin_layout Standard
+0x0003 + 8*n
+\end_layout
--stack-auto
-\emph default
- option is used
-\end_inset
+\end_inset
-
-
-\begin_inset Text
+
-\layout Standard
+\end_inset
-SDCC_MODEL_SMALL
-\begin_inset LatexCommand \index{SDCC\_MODEL\_SMALL}
-\end_inset
+\newline
+\end_layout
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+If the interrupt service routine is defined without
+\emph on
+using
+\begin_inset LatexCommand index
+name "using (mcs51, ds390 register bank)"
-\layout Standard
+\end_inset
-when
-\emph on
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_using (mcs51, ds390 register bank)"
-\backslash
-/
-\end_inset
+\end_inset
--model-small
-\emph default
- is used
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\emph default
+ a register bank or with register bank 0 (
+\emph on
+using
+\emph default
+ 0), the compiler will save the registers used by itself on the stack upon
+ entry and restore them at exit, however if such an interrupt service routine
+ calls another function then the entire register bank will be saved on the
+ stack.
+ This scheme may be advantageous for small interrupt service routines which
+ have low register usage.
+\end_layout
-SDCC_MODEL_MEDIUM
-\begin_inset LatexCommand \index{SDCC\_MODEL\_MEDIUM}
-
-\end_inset
-
-
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-when
-\emph on
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--model-medium
-\emph default
- is used
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+If the interrupt service routine is defined to be using a specific register
+ bank then only
+\emph on
+a, b, dptr
+\emph default
+ & psw are saved and restored, if such an interrupt service routine calls
+ another function (using another register bank) then the entire register
+ bank of the called function will be saved on the stack
+\begin_inset LatexCommand index
+name "stack"
-SDCC_MODEL_LARGE
-\begin_inset LatexCommand \index{SDCC\_MODEL\_LARGE}
+\end_inset
-\end_inset
+.
+ This scheme is recommended for larger interrupt service routines.
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Subsection
+HC08
+\begin_inset LatexCommand index
+name "HC08"
-when
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ Interrupt Service Routines
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Since the number of interrupts
+\begin_inset LatexCommand index
+name "HC08!interrupt"
--model-large
-\emph default
- is used
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ available is chip specific and the interrupt vector table always ends at
+ the last byte of memory, the interrupt numbers corresponds to the interrupt
+ vectors in reverse order of address.
+ For example, interrupt 1 will use the interrupt vector at 0xfffc, interrupt
+ 2 will use the interrupt vector at 0xfffa, and so on.
+ However, interrupt 0 (the reset vector at 0xfffe) is not redefinable in
+ this way; instead see section
+\begin_inset LatexCommand ref
+reference "sub:Startup-Code"
-SDCC_USE_XSTACK
-\begin_inset LatexCommand \index{SDCC\_USE\_XSTACK}
+\end_inset
-\end_inset
+ for details on customizing startup.
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Z80 Interrupt Service Routines
+\end_layout
-when
-\emph on
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+The Z80
+\begin_inset LatexCommand index
+name "Z80"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
+ uses several different methods for determining the correct interrupt
+\begin_inset LatexCommand index
+name "Z80!interrupt"
--xstack
-\emph default
- option is used
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ vector depending on the hardware implementation.
+ Therefore, SDCC ignores the optional interrupt number and does not attempt
+ to generate an interrupt vector table.
+\end_layout
-SDCC_STACK_TENBIT
-\begin_inset LatexCommand \index{SDCC\_STACK\_TENBIT}
+\begin_layout Standard
+By default, SDCC generates code for a maskable interrupt, which uses a RETI
+ instruction to return from the interrupt.
+ To write an interrupt handler for the non-maskable interrupt, which needs
+ a RETN instruction instead, add the
+\emph on
+critical
+\emph default
+ keyword:
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+void nmi_isr (void) critical interrupt
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-when
-\emph on
--mds390
-\emph default
- is used
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-SDCC_MODEL_FLAT24
-\begin_inset LatexCommand \index{SDCC\_MODEL\_FLAT24}
+\newline
+}
+\end_layout
-\end_inset
+\begin_layout Standard
+However if you need to create a non-interruptable interrupt service routine
+ you would also require the
+\emph on
+critical
+\emph default
+ keyword.
+ To distinguish between this and an nmi_isr you must provide an interrupt
+ number.
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Section
+Enabling and Disabling Interrupts
+\end_layout
-when
-\emph on
--mds390
-\emph default
- is used
-\end_inset
-
-
-
+\begin_layout Subsection
+Critical Functions and Critical Statements
+\end_layout
-\end_inset
+\begin_layout Standard
+A special keyword may be associated with a block or a function declaring
+ it as
+\emph on
+critical
+\emph default
+.
+ SDCC will generate code to disable all interrupts
+\begin_inset LatexCommand index
+name "interrupt"
+\end_inset
-\layout Chapter
+ upon entry to a critical function and restore the interrupt enable to the
+ previous state before returning.
+ Nesting critical functions will need one additional byte on the stack
+\begin_inset LatexCommand index
+name "stack"
-Notes on supported Processors
-\layout Section
+\end_inset
-MCS51 variants
-\begin_inset LatexCommand \label{sub:MCS51-variants}
+ for each call.
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+int foo () __critical
+\begin_inset LatexCommand index
+name "critical"
-\begin_inset LatexCommand \index{MCS51 variants}
+\end_inset
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_critical"
-\layout Standard
+\end_inset
-MCS51 processors are available from many vendors and come in many different
- flavours.
- While they might differ considerably in respect to Special Function Registers
- the core MCS51 is usually not modified or is kept compatible.
-\layout Subsection
-
-pdata access by SFR
-\layout Standard
-
-With the upcome of devices with internal xdata and flash memory devices
- using port P2
-\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
-
-\end_inset
-
- as dedicated I/O port is becoming more popular.
- Switching the high byte for pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
-
-\end_inset
-
- access which was formerly done by port P2 is then achieved by a Special
- Function Register
-\begin_inset LatexCommand \index{sfr}
-
-\end_inset
-
-.
- In well-established MCS51 tradition the address of this
-\emph on
-sfr
-\emph default
- is where the chip designers decided to put it.
- Needless to say that they didn't agree on a common name either.
- So that the startup code can correctly initialize xdata variables, you
- should define an sfr with the name _XPAGE
-\family typewriter
-
-\begin_inset LatexCommand \index{\_XPAGE (mcs51)}
-
-\end_inset
-
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+}
+\end_layout
-\family default
- at the appropriate location if the default, port P2, is not used for this.
- Some examples are:
-\layout Verse
+\begin_layout Standard
+The critical attribute maybe used with other attributes like
+\emph on
+reentrant.
+\emph default
+\newline
+The keyword
+\emph on
+critical
+\emph default
+ may also be used to disable interrupts more locally:
+\end_layout
-\family typewriter
-__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family */
-\layout Verse
+\begin_layout Verse
+\family typewriter
+__critical{ i++; }
+\end_layout
-\family typewriter
-__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips */
-\layout Verse
+\begin_layout Standard
+More than one statement could have been included in the block.
+\end_layout
+\begin_layout Subsection
+Enabling and Disabling Interrupts directly
+\end_layout
-\family typewriter
-__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips */
-\layout Standard
+\begin_layout Standard
+Interrupts
+\begin_inset LatexCommand index
+name "interrupt"
-For more exotic implementations further customizations may be needed.
- See section
-\begin_inset LatexCommand \ref{sub:Startup-Code}
+\end_inset
-\end_inset
+ can also be disabled and enabled directly (8051):
+\end_layout
- for other possibilities.
-\layout Subsection
+\begin_layout Verse
-Other Features available by SFR
-\layout Standard
-\added_space_bottom bigskip
-Some MCS51 variants offer features like Double DPTR
-\begin_inset LatexCommand \index{DPTR}
+\family typewriter
+EA = 0;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+or:\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+EA_SAVE = EA;
+\end_layout
-\end_inset
+\begin_layout Verse
-, multiple DPTR, decrementing DPTR, 16x16 Multiply.
- These are currently not used for the MCS51 port.
- If you absolutely need them you can fall back to inline assembly or submit
- a patch to SDCC.
-\layout Section
-
-DS400 port
-\layout Standard
-\added_space_bottom bigskip
-The DS80C400
-\begin_inset LatexCommand \index{DS80C400}
+\family typewriter
+...\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+EA = 0;
+\end_layout
-\end_inset
+\begin_layout Verse
+\family typewriter
+EA = 1;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+\end_layout
-\begin_inset LatexCommand \index{DS400}
+\begin_layout Verse
-\end_inset
+\family typewriter
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+EA = EA_SAVE;
+\end_layout
- microcontroller has a rich set of peripherals.
- In its built-in ROM library it includes functions to access some of the
- features, among them is a TCP stack with IP4 and IP6 support.
- Library headers (currently in beta status) and other files are provided
- at
-\size footnotesize
+\begin_layout Standard
+On other architectures which have separate opcodes for enabling and disabling
+ interrupts you might want to make use of defines with inline assembly
+\begin_inset LatexCommand index
+name "Assembler routines"
-\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html}
+\end_inset
-\end_inset
+ (HC08
+\begin_inset LatexCommand index
+name "HC08!interrupt"
-.
-
-\layout Section
+\end_inset
-The Z80 and gbz80 port
-\layout Standard
+):
+\end_layout
-SDCC can target both the Zilog Z80
-\begin_inset LatexCommand \index{Z80}
+\begin_layout Verse
-\end_inset
+\family typewriter
+#define CLI _asm
+\begin_inset LatexCommand index
+name "\\_asm"
- and the Nintendo Gameboy's Z80-like gbz80
-\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)}
+\end_inset
-\end_inset
+\InsetSpace ~
+\InsetSpace ~
+cli\InsetSpace ~
+\InsetSpace ~
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
-.
- The Z80 port is passed through the same
-\emph on
-regressions tests
-\begin_inset LatexCommand \index{Regression test}
+\end_inset
-\end_inset
+;
+\end_layout
+\begin_layout Verse
-\emph default
- (see section
-\begin_inset LatexCommand \ref{sec:Quality-control}
+\family typewriter
+#define SEI _asm\InsetSpace ~
+\InsetSpace ~
+sei\InsetSpace ~
+\InsetSpace ~
+_endasm;
+\end_layout
-\end_inset
+\begin_layout Verse
-) as the MCS51 and DS390 ports, so floating point support, support for long
- variables and bitfield support is fine.
- See mailing lists and forums about interrupt routines.
-\layout Standard
-\added_space_bottom bigskip
-As always, the code is the authoritative reference - see z80/ralloc.c and
- z80/gen.c.
- The stack
-\begin_inset LatexCommand \index{Z80!stack}
+\family typewriter
+...
+\end_layout
-\end_inset
+\begin_layout Standard
+Note: it is sometimes sufficient to disable only a specific interrupt source
+ like f.e.
+ a timer or serial interrupt by manipulating an
+\emph on
+interrupt mask
+\begin_inset LatexCommand index
+name "interrupt mask"
- frame is similar to that generated by the IAR Z80 compiler.
- IX is used as the base pointer, HL and IY are used as a temporary registers,
- and BC and DE are available for holding variables.
- Return values
-\begin_inset LatexCommand \index{Z80!return value}
+\end_inset
-\end_inset
- for the Z80 port are stored in L (one byte), HL (two bytes), or DEHL (four
- bytes).
- The gbz80 port use the same set of registers for the return values, but
- in a different order of significance: E (one byte), DE (two bytes), or
- HLDE (four bytes).
-\layout Section
+\emph default
+ register.
+
+\end_layout
-The HC08 port
-\layout Standard
+\begin_layout Standard
+Usually the time during which interrupts are disabled should be kept as
+ short as possible.
+ This minimizes both
+\emph on
+interrupt latency
+\emph default
-The port to the Freescale/Motorola HC08
-\begin_inset LatexCommand \index{HC08}
+\begin_inset LatexCommand index
+name "interrupt latency"
-\end_inset
+\end_inset
- family has been added in October 2003, and is still undergoing some basic
- development.
- The code generator is complete, but the register allocation is still quite
- unoptimized.
- Some of the SDCC's standard C library functions have embedded non-HC08
- inline assembly and so are not yet usable.
-\layout Standard
-\added_space_bottom bigskip
-The HC08 port passes the regression test suite (see section
-\begin_inset LatexCommand \ref{sec:Quality-control}
+ (the time between the occurrence of the interrupt and the execution of
+ the first code in the interrupt routine) and
+\emph on
+interrupt jitter
+\emph default
-\end_inset
+\begin_inset LatexCommand index
+name "interrupt jitter"
-).
-\layout Section
-\pagebreak_top
-The PIC14 port
-\layout Standard
+\end_inset
-The 14bit PIC
-\begin_inset LatexCommand \index{PIC14}
+ (the difference between the shortest and the longest interrupt latency).
+ These really are something different, f.e.
+ a serial interrupt has to be served before its buffer overruns so it cares
+ for the maximum interrupt latency, whereas it does not care about jitter.
+ On a loudspeaker driven via a digital to analog converter which is fed
+ by an interrupt a latency of a few milliseconds might be tolerable, whereas
+ a much smaller jitter will be very audible.
+\end_layout
-\end_inset
+\begin_layout Standard
+You can reenable interrupts within an interrupt routine and on some architecture
+s you can make use of two (or more) levels of
+\emph on
+interrupt priorities
+\emph default
- port still requires a major effort from the development community.
- However it can work for simple code.
- It passes its (smaller set of) regression tests
-\begin_inset LatexCommand \index{Regression test (PIC14)}
+\begin_inset LatexCommand index
+name "interrupt priority"
-\end_inset
+\end_inset
- in the directory
-\shape italic
-sdcc/src/regression
-\shape default
.
-\layout Subsection
-
-C code and 14bit PIC code page
-\begin_inset LatexCommand \index{code page (pic14)}
-
-\end_inset
-
- and RAM banks
-\begin_inset LatexCommand \index{RAM bank (pic14)}
-
-\end_inset
-
-
-\layout Standard
-
-The linker organizes allocation for the code page and RAM banks.
- It does not have intimate knowledge of the code flow.
- It will put all the code section of a single asm file into a single code
- page.
- In order to make use of multiple code pages, separate asm files must be
- used.
- The compiler treats all functions of a single C file as being in the same
- code page unless it is non static.
- The compiler treats all local variables of a single C file as being in
- the same RAM bank unless it is an extern.
-\newline
-
-\newline
-To get the best follow these guide lines:
-\layout Enumerate
-
-make local functions static, as non static functions require code page selection
- overhead.
-\layout Enumerate
-
-Make local variables static as extern variables require RAM bank selection
- overhead.
-\layout Enumerate
-
-For devices that have multiple code pages it is more efficient to use the
- same number of files as pages, i.e.
- for the 16F877 use 4 separate files and i.e.
- for the 16F874 use 2 separate files.
- This way the linker can put the code for each file into different code
- pages and the compiler can allocate reusable variables more efficiently
- and there's less page selection overhead.
- And as for any 8 bit micro (especially for PIC 14 as they have a very simple
- instruction set) use 'unsigned char' whereever possible instead of 'int'.
-\layout Subsection
-
-Creating a device include file
-\layout Standard
+ On some architectures which don't support interrupt priorities these can
+ be implemented by manipulating the interrupt mask and reenabling interrupts
+ within the interrupt routine.
+ Check there is sufficient space on the stack
+\begin_inset LatexCommand index
+name "stack"
-For generating a device include file
-\begin_inset LatexCommand \index{PIC14!Header files}
+\end_inset
-\end_inset
+ and don't add complexity unless you have to.
+
+\end_layout
- use the support perl script inc2h.pl kept in directory support/script.
-\layout Subsection
+\begin_layout Subsection
+Semaphore
+\begin_inset LatexCommand index
+name "semaphore"
-Interrupt code
-\layout Standard
+\end_inset
-For the interrupt function, use the keyword 'interrupt'
-\begin_inset LatexCommand \index{PIC14!interrupt}
+ locking (mcs51/ds390)
+\end_layout
-\end_inset
+\begin_layout Standard
+Some architectures (mcs51/ds390) have an atomic
+\begin_inset LatexCommand index
+name "atomic"
- with level number of 0 (PIC14 only has 1 interrupt so this number is only
- there to avoid a syntax error - it ought to be fixed).
- E.g.:
-\layout Verse
+\end_inset
+ bit test and clear instruction.
+ These type of instructions are typically used in preemptive multitasking
+ systems, where a routine f.e.
+ claims the use of a data structure ('acquires a lock
+\begin_inset LatexCommand index
+name "lock"
-\family typewriter
-void Intr(void) interrupt 0
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-T0IF = 0; /* Clear timer interrupt */
-\newline
-}
-\layout Subsection
+\end_inset
-Linking and assembling
-\layout Standard
+ on it'), makes some modifications and then releases the lock when the data
+ structure is consistent again.
+ The instruction may also be used if interrupt and non-interrupt code have
+ to compete for a resource.
+ With the atomic bit test and clear instruction interrupts
+\begin_inset LatexCommand index
+name "interrupt"
-For assembling you can use either GPUTILS'
-\begin_inset LatexCommand \index{gputils (pic tools)}
+\end_inset
-\end_inset
+ don't have to be disabled for the locking operation.
+
+\end_layout
- gpasm.exe or MPLAB's mpasmwin.exe.
- GPUTILS is available from
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+\begin_layout Standard
+SDCC generates this instruction if the source follows this pattern:
+\end_layout
-\end_inset
+\begin_layout Verse
-.
- For linking you can use either GPUTIL's gplink or MPLAB's mplink.exe.
- If you use MPLAB and an interrupt function then the linker script file
- vectors section will need to be enlarged to link with mplink.
-\newline
+\family typewriter
+volatile
+\begin_inset LatexCommand index
+name "volatile"
-\newline
-Here is a
-\family typewriter
-Makefile
-\family default
- using GPUTILS:
-\layout Verse
+\end_inset
+ bit resource_is_free;
+\newline
-\family typewriter
-.c.o:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcc -S -V -mpic14 -p16F877 $<
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-gpasm -c $*.asm
-\newline
-
-\newline
-$(PRJ).hex: $(OBJS)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib
-\layout Standard
-
-Here is a
-\family typewriter
-Makefile
-\family default
- using MPLAB:
-\layout Verse
-
+\newline
+if (resource_is_free)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+resource_is_free=0;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+...
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+resource_is_free=1;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+}
+\end_layout
-\family typewriter
-.c.o:
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcc -S -V -mpic14 -p16F877 $<
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mpasmwin /q /o $*.asm
-\newline
+\begin_layout Standard
+Note, mcs51 and ds390 support only an atomic
+\begin_inset LatexCommand index
+name "atomic"
-\newline
-$(PRJ).hex: $(OBJS)
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib
-\layout Standard
+\end_inset
-Please note that indentations within a
-\family typewriter
- Makefile
-\family default
- have to be done with a tabulator character.
-\layout Subsection
+ bit test and
+\emph on
+clear
+\emph default
+ instruction (as opposed to atomic bit test and
+\emph on
+set).
+\end_layout
-Command-line options
-\layout Standard
+\begin_layout Section
+Functions using private register banks
+\begin_inset LatexCommand label
+name "sub:Functions-using-private-banks"
-Besides the switches common to all SDCC backends, the PIC14 port accepts
- the following options (for an updated list see sdcc -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ (mcs51/ds390)
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+Some architectures have support for quickly changing register sets.
+ SDCC supports this feature with the
+\emph on
+using
+\begin_inset LatexCommand index
+name "using (mcs51, ds390 register bank)"
--help):
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_using (mcs51, ds390 register bank)"
-\backslash
-/
-\end_inset
+\end_inset
--debug-extra
-\begin_inset LatexCommand \index{PIC14!Options!-\/-debug-extra}
-\end_inset
+\emph default
+ attribute (which tells the compiler to use a register bank
+\begin_inset LatexCommand index
+name "register bank (mcs51, ds390)"
- emit debug info in assembly output
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
+ other than the default bank zero).
+ It should only be applied to
+\emph on
+interrupt
+\begin_inset LatexCommand index
+name "interrupt"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
--no-pcode-opt
-\begin_inset LatexCommand \index{PIC14!Options!-\/-no-pcode-opt}
+\emph default
+ functions (see footnote below).
+ This will in most circumstances make the generated ISR code more efficient
+ since it will not have to save registers on the stack.
+\end_layout
-\end_inset
+\begin_layout Standard
+The
+\emph on
+using
+\emph default
+ attribute will have no effect on the generated code for a
+\emph on
+non-interrupt
+\emph default
+ function (but may occasionally be useful anyway
+\begin_inset Foot
+status open
- disable (slightly faulty) optimization on pCode
-\layout Subsection
+\begin_layout Standard
+possible exception: if a function is called ONLY from 'interrupt' functions
+ using a particular bank, it can be declared with the same 'using' attribute
+ as the calling 'interrupt' functions.
+ For instance, if you have several ISRs using bank one, and all of them
+ call memcpy(), it might make sense to create a specialized version of memcpy()
+ 'using 1', since this would prevent the ISR from having to save bank zero
+ to the stack on entry and switch to bank zero before calling the function
+\end_layout
-The library
-\layout Subsubsection
+\end_inset
-error: missing definition for symbol
-\begin_inset Quotes sld
-\end_inset
+).
+\newline
-__gptrget1
-\begin_inset Quotes srd
-\end_inset
+\emph on
+(pending: Note, nowadays the
+\emph default
+ using
+\emph on
+attribute has an effect on
+\emph default
+
+\emph on
+the generated code for a
+\emph default
+ non-interrupt
+\emph on
+function
+\emph default
+.
+\emph on
+)
+\end_layout
+\begin_layout Standard
+An
+\emph on
+interrupt
+\emph default
+ function using a non-zero bank will assume that it can trash that register
+ bank, and will not save it.
+ Since high-priority interrupts
+\begin_inset LatexCommand index
+name "interrupts"
-\layout Standard
+\end_inset
-The PIC14 port uses library routines to provide more complex operations
- like multiplication, division/modulus and (generic) pointer dereferencing.
- In order to add these routines to your project, you must link with PIC14's
-
-\family typewriter
-libsdcc.lib
-\family default
-.
- For single source file projects this is done automatically, more complex
- projects must add
-\family typewriter
-libsdcc.lib
-\family default
- to the linker's arguments.
- Make sure you also add an include path for the library (using the -I switch
- to the linker)!
-\layout Subsubsection
-Processor mismatch in file
-\begin_inset Quotes sld
-\end_inset
+\begin_inset LatexCommand index
+name "interrupt priority"
-XXX
-\begin_inset Quotes srd
-\end_inset
+\end_inset
-.
-\layout Standard
+ can interrupt low-priority ones on the 8051 and friends, this means that
+ if a high-priority ISR
+\emph on
+using
+\emph default
+ a particular bank occurs while processing a low-priority ISR
+\emph on
+using
+\emph default
+ the same bank, terrible and bad things can happen.
+ To prevent this, no single register bank should be
+\emph on
+used
+\emph default
+ by both a high priority and a low priority ISR.
+ This is probably most easily done by having all high priority ISRs use
+ one bank and all low priority ISRs use another.
+ If you have an ISR which can change priority at runtime, you're on your
+ own: I suggest using the default bank zero and taking the small performance
+ hit.
+\end_layout
-This warning can usually be ignored due to the very good compatibility amongst
- 14 bit PIC
-\begin_inset LatexCommand \index{PIC14}
+\begin_layout Standard
+It is most efficient if your ISR calls no other functions.
+ If your ISR must call other functions, it is most efficient if those functions
+ use the same bank as the ISR (see note 1 below); the next best is if the
+ called functions use bank zero.
+ It is very inefficient to call a function using a different, non-zero bank
+ from an ISR.
+
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
- devices.
-\layout Standard
+\end_layout
-You might also consider recompiling the library for your specific device
- by changing the ARCH=p16f877 (default target) entry in
-\family typewriter
-device/lib/pic/Makefile.in
-\family default
- and
-\family typewriter
-device/lib/pic/Makefile
-\family default
- to reflect your device.
- This might even improve performance for smaller devices as unneccesary
- BANKSELs migth be removed.
-\layout Subsection
+\begin_layout Section
+Startup Code
+\begin_inset LatexCommand label
+name "sub:Startup-Code"
-Known bugs
-\layout Subsubsection
+\end_inset
-initialized data
-\layout Standard
-Currently, data can only be initialized if it resides in the source file
- together with
-\emph on
-main()
-\emph default
-.
- Data in other source files will silently
-\series bold
-not
-\series default
- be initialized.
-\family typewriter
-\size footnotesize
+\begin_inset LatexCommand index
+name "Startup code"
-\begin_inset Marginal
-collapsed true
+\end_inset
-\layout Standard
+\end_layout
-\series bold
-\SpecialChar ~
-!
-\end_inset
+\begin_layout Subsection
+MCS51/DS390 Startup Code
+\end_layout
+\begin_layout Standard
+The compiler triggers the linker to link certain initialization modules
+ from the runtime library
+\begin_inset LatexCommand index
+name "Runtime library"
-\layout Section
-\pagebreak_top
-The PIC16
-\begin_inset LatexCommand \index{PIC16}
+\end_inset
-\end_inset
+ called crt.
+ Only the necessary ones are linked, for instance crtxstack.asm (GSINIT1,
+ GSINIT5) is not linked unless the -
+\series bold
- port
-\layout Standard
+\begin_inset ERT
+status open
-The PIC16
-\begin_inset LatexCommand \index{PIC16}
+\begin_layout Standard
-\end_inset
- port is the portion of SDCC that is responsible to produce code for the
- Microchip
-\begin_inset LatexCommand \index{Microchip}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
-(TM) microcontrollers with 16 bit core.
- Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx.
- Currently supported devices are:
-\layout Standard
-\align center
-\begin_inset Tabular
-
-
-
-
-
-
-
-
-
-
-\begin_inset Text
+\series default
+-xstack option is used.
+ These modules are highly entangled by the use of special segments/areas,
+ but a common layout is shown below:
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F242
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\series bold
+\size footnotesize
+(main.asm)
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F248
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area HOME (CODE)
+\newline
+__interrupt_vect:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ljmp __sdcc_gsinit_startup
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F252
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\series bold
+\size footnotesize
+(crtstart.asm)
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F258
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT0 (CODE)
+\newline
+__sdcc_gsinit_startup::
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov sp,#__start__stack - 1
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F442
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\series bold
+\size footnotesize
+(crtxstack.asm)
+\end_layout
-\layout Standard
+\begin_layout Verse
-18F448
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F452
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F458
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F1220
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F2220
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F2550
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F4331
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F4455
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F6520
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F6620
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F6680
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F6720
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F8520
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F8620
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F8680
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-18F8720
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-\end_inset
-
-
-
-
-\end_inset
-
-
-\layout Subsection
-
-Global Options
-\layout Standard
-
-PIC16 port supports the standard command line arguments as supposed, with
- the exception of certain cases that will be mentioned in the following
- list:
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--callee-saves
-\begin_inset LatexCommand \index{PIC16!Options!-\/-callee-saves}
-
-\end_inset
-
- See -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--all-callee-saves
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--all-callee-saves
-\begin_inset LatexCommand \index{PIC16!Options!-\/-all-callee-saves}
-
-\end_inset
-
- All function arguments are passed on stack by default.
-
-\emph on
-There is no need to specify this in the command line.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--fommit-frame-pointer
-\begin_inset LatexCommand \index{PIC16!Options!-\/-fommit-frame-pointer}
-
-\end_inset
-
- Frame pointer will be omitted when the function uses no local variables.
-\layout Subsection
-
-Port Specific Options
-\begin_inset LatexCommand \index{Options PIC16}
-
-\end_inset
-
-
-\layout Standard
-
-The port specific options appear after the global options in the sdcc --help
- output.
-\layout Subsubsection
-
-General Options
-\layout Standard
-
-General options enable certain port features and optimizations.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT1 (CODE)
+\newline
+__sdcc_init_xstack::
+\newline
+; Need to initialize in GSINIT1 in
+ case the user's __sdcc_external_startup uses the xstack.
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov __XPAGE,#(__start__x
+stack >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov _spx,#__start__xstack
+\end_layout
-\layout Standard
+\begin_layout Verse
-\backslash
-/
-\end_inset
+\family typewriter
+\series bold
+\size footnotesize
+(crtstart.asm)
+\end_layout
--stack-model=[model] Used in conjuction with the command above.
- Defines the stack model to be used, valid stack models are :
-\begin_deeper
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT2 (CODE)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+lcall __sdcc_external_startup
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,dpl
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+jz __sdcc_init_data
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ljmp
+ __sdcc_program_startup
+\newline
+__sdcc_init_data:
+\end_layout
-\emph on
-small
-\emph default
- Selects small stack model.
- 8 bit stack and frame pointers.
- Supports 256 bytes stack size.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
+\family typewriter
+\series bold
+\size footnotesize
+(crtxinit.asm)
+\end_layout
-\emph on
-large
-\emph default
- Selects large stack model.
- 16 bit stack and frame pointers.
- Supports 65536 bytes stack size.
-\end_deeper
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--preplace-udata-with=[kword] Replaces the default udata keyword for allocating
- unitialized data variables with [kword].
- Valid keywords are: "udata_acs", "udata_shr", "udata_ovr".
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--ivt-loc positions the Interrupt Vector Table at location .
- Useful for bootloaders.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--asm= sets the full path and name of an external assembler to call.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--link= sets the full path and name of an external linker to call.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--mplab-comp MPLAB
-\begin_inset LatexCommand \index{PIC16!MPLAB}
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT3 (CODE)
+\newline
+__mcs51_genXINIT::
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r1,#l_XINIT
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,r1
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+orl a,#(l_XINIT
+ >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+jz 00003$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r2,#((l_XINIT+255) >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov dptr,#s_XINIT
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r0,#s_XISEG
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov
+ __XPAGE,#(s_XISEG >> 8)
+\newline
+00001$:\InsetSpace ~
+clr a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movc a,@a+dptr
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movx @r0,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc dptr
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc
+ r0
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+cjne r0,#0,00002$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc __XPAGE
+\newline
+00002$:\InsetSpace ~
+djnz r1,00001$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz r2,00001$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov __XPAGE,#0
+xFF
+\newline
+00003$:
+\end_layout
-\end_inset
+\begin_layout Verse
- compatibility option.
- Currently only suppresses special gpasm directives.
-\layout Subsubsection
+\family typewriter
+\series bold
+\size footnotesize
+(crtclear.asm)
+\end_layout
-Optimization Options
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
--
-\begin_inset ERT
-status Collapsed
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT4 (CODE)
+\newline
+__mcs51_genRAMCLEAR::
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+clr a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r0,#(l_IRAM-1)
+\newline
+00004$:\InsetSpace ~
+mov
+ @r0,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz r0,00004$
+\newline
+; _mcs51_genRAMCLEAR() end
+\end_layout
-\layout Standard
+\begin_layout Verse
-\backslash
-/
-\end_inset
+\family typewriter
+\series bold
+\size footnotesize
+(crtxclear.asm)
+\end_layout
--optimize-goto Try to use (conditional) BRA instead of GOTO
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
-
--optimize-cmp Try to optimize some compares.
-\layout List
-\labelwidthstring 00.00.0000
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT4 (CODE)
+\newline
+__mcs51_genXRAMCLEAR::
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r0,#l_PSEG
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,r0
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+orl a,#(l_PSEG
+ >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+jz 00006$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r1,#s_PSEG
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov __XPAGE,#(s_PSEG >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+clr a
+\newline
+00005$:\InsetSpace ~
+movx
+ @r1,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc r1
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz r0,00005$
+\newline
+00006$:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r0,#l_XSEG
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov a,r0
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+orl a,#(l_XSEG >>
+ 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+jz 00008$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov r1,#((l_XSEG + 255) >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov dptr,#s_XSEG
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+clr a
+\newline
+00007$:\InsetSpace ~
+movx
+ @dptr,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc dptr
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz r0,00007$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz r1,00007$
+\newline
+00008$:
+\end_layout
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Verse
-\layout Standard
+\family typewriter
+\series bold
+\size footnotesize
+(crtxstack.asm)
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Verse
--optimize-df Analyze the dataflow of the generated code and improve it.
-\layout List
-\labelwidthstring 00.00.0000
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT5 (CODE)
+\newline
+; Need to initialize in GSINIT5 because __mcs51_genXINIT
+ modifies __XPAGE
+\newline
+; and __mcs51_genRAMCLEAR modifies _spx.
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov __XPAGE,#(__start__x
+stack >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov _spx,#__start__xstack
+\end_layout
--
-\begin_inset ERT
-status Collapsed
+\begin_layout Verse
-\layout Standard
+\family typewriter
+\series bold
+\size footnotesize
+(application modules)
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Verse
--obanksel=nn Set optimization level for inserting BANKSELs.
-\newline
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSINIT (CODE)
+\end_layout
-\begin_deeper
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
-0 no optimization
-\layout List
-\labelwidthstring 00.00.0000
+\family typewriter
+\series bold
+\size footnotesize
+(main.asm)
+\end_layout
-1 checks previous used register and if it is the same then does not emit
- BANKSEL, accounts only for labels.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Verse
-2 tries to check the location of (even different) symbols and removes BANKSELs
- if they are in the same bank.
-
-\newline
+\family typewriter
+\size footnotesize
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area GSFINAL (CODE)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ljmp __sdcc_program_startup
+\newline
+;---------------------------------
+-----------------------
+\newline
+; Home
+\newline
+;--------------------------------------------------
+------
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area HOME (CODE)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area CSEG (CODE)
+\newline
+__sdcc_program_startup:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+lcall _main
+\newline
+;
+ return from main will lock up
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sjmp .
+\end_layout
-\emph on
-Important: There might be problems if the linker script has data sections
- across bank borders!
-\end_deeper
-\layout Subsubsection
+\begin_layout Standard
+One of these modules (crtstart.asm) contains a call to the C routine
+\emph on
+_sdcc_external_startup()
+\begin_inset LatexCommand index
+name "\\_sdcc\\_external\\_startup()"
-Linking Options
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\emph default
+ at the start of the CODE area.
+ This routine is also in the runtime library
+\begin_inset LatexCommand index
+name "Runtime library"
-\backslash
-/
-\end_inset
+\end_inset
--nodefaultlibs do not link default libraries when linking
-\layout List
-\labelwidthstring 00.00.0000
+ and returns 0 by default.
+ If this routine returns a non-zero value, the static & global variable
+ initialization will be skipped and the function main will be invoked.
+ Otherwise static & global variables will be initialized before the function
+ main is invoked.
+ You could add an
+\emph on
+_sdcc_external_startup()
+\emph default
+ routine to your program to override the default if you need to setup hardware
+ or perform some other critical operation prior to static & global variable
+ initialization
+\begin_inset LatexCommand index
+name "Variable initialization"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+.
+ On some mcs51 variants xdata
+\begin_inset LatexCommand index
+name "xdata (mcs51, ds390 storage class)"
-\backslash
-/
-\end_inset
+\end_inset
--no-crt Don't link the default run-time modules
-\layout List
-\labelwidthstring 00.00.0000
+ memory has to be explicitly enabled before it can be accessed or if the
+ watchdog
+\begin_inset LatexCommand index
+name "watchdog"
+\end_inset
+
+ needs to be disabled, this is the place to do it.
+ The startup code clears all internal data memory, 256 bytes by default,
+ but from 0 to n-1 if
+\emph on
-
\begin_inset ERT
-status Collapsed
+status collapsed
-\layout Standard
+\begin_layout Standard
-\backslash
+
+\backslash
/
-\end_inset
+\end_layout
--use-crt= Use a custom run-time module instead of the defaults.
-\layout Subsubsection
+\end_inset
-Debugging Options
-\layout Standard
+-iram-size
+\begin_inset LatexCommand index
+name "-\\/-iram-size "
-Debugging options enable extra debugging information in the output files.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+
+n
+\emph default
+ is used.
+ (recommended for Chipcon CC1010).
+\end_layout
+\begin_layout Standard
+See also the compiler options
+\emph on
-
\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+status collapsed
--debug-xtra Similar to -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
-
--debug
-\begin_inset LatexCommand \index{-\/-debug}
-
-\end_inset
+\end_layout
-, but dumps more information.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+-no-xinit
+\emph default
-
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
+\emph on
+opt
+\emph default
-\backslash
-/
-\end_inset
+\begin_inset LatexCommand index
+name "-\\/-no-xinit-opt"
--debug-ralloc Force register allocator to dump .d file with debugging
- information.
- is the name of the file compiled.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+,
+\emph on
-
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
--pcode-verbose Enable pcode debugging information in translation.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
--
-\begin_inset ERT
-status Collapsed
+-main-return
+\emph default
-\layout Standard
+\begin_inset LatexCommand index
+name "-\\/-main-return"
-\backslash
-/
-\end_inset
+\end_inset
--denable-peeps Force the usage of peepholes.
- Use with care.
-\layout List
-\labelwidthstring 00.00.0000
+ and section
+\begin_inset LatexCommand ref
+reference "sub:MCS51-variants"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ about MCS51-variants.
+\newline
-\backslash
-/
-\end_inset
+\end_layout
--gstack Trace push/pops for stack pointer overflow
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+While these initialization modules are meant as generic startup code there
+ might be the need for customization.
+ Let's assume the return value of
+\emph on
+_sdcc_external_startup()
+\emph default
+ in
+\emph on
+crtstart.asm
+\emph default
+ should not be checked (or
+\emph on
+_sdcc_external_startup()
+\emph default
+ should not be called at all).
+ The recommended way would be to copy
+\emph on
+crtstart.asm
+\emph default
+ (f.e.
+ from
+\begin_inset LatexCommand url
+target "http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/device/lib/mcs51/crtstart.asm"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+) into the source directory, adapt it there, then assemble it with
+\emph on
+asx8051 -plosgff
+\begin_inset Foot
+status open
-\backslash
-/
-\end_inset
+\begin_layout Standard
+\begin_inset Quotes sld
+\end_inset
--call-tree dump call tree in .calltree file
-\layout Subsection
+-plosgff
+\begin_inset Quotes srd
+\end_inset
-Enviromental Variables
-\layout Standard
+ are the assembler options used in
+\begin_inset LatexCommand url
+target "http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/lib/mcs51/Makefile.in?view=markup "
-There is a number of enviromental variables that can be used when running
- SDCC to enable certain optimizations or force a specific program behaviour.
- these variables are primarily for debugging purposes so they can be enabled/dis
-abled at will.
-\layout Standard
+\end_inset
-Currently there is only two such variables available:
-\layout List
-\labelwidthstring 00.00.0000
-OPTIMIZE_BITFIELD_POINTER_GET when this variable exists reading of structure
- bitfields is optimized by directly loading FSR0 with the address of the
- bitfield structure.
- Normally SDCC will cast the bitfield structure to a bitfield pointer and
- then load FSR0.
- This step saves data ram and code space for functions that perform heavy
- use of bitfields.
- (ie.
- 80 bytes of code space are saved when compiling malloc.c with this option).
-
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-NO_REG_OPT do not perform pCode registers optimization.
- This should be used for debugging purposes.
- In some where bugs in the pcode optimizer are found, users can benefit
- from temporarily disabling the optimizer until the bug is fixed.
-\layout Subsection
+\end_inset
-Preprocessor Macros
-\layout Standard
+ crtstart.asm
+\emph default
+ and when linking your project explicitly specify
+\emph on
+crtstart.rel
+\emph default
+.
+ As a bonus a listing of the relocated object file
+\emph on
+crtstart.rst
+\emph default
+ is generated.
+\end_layout
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+\begin_layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-\end_inset
- port defines the following preprocessor macros while translating a source.
-\layout Standard
-\align center
+\end_layout
-\begin_inset Tabular
-
-
-
-
-
-
-\begin_inset Text
+\begin_layout Subsection
+HC08 Startup Code
+\end_layout
-\layout Standard
+\begin_layout Standard
+The HC08
+\begin_inset LatexCommand index
+name "HC08"
-Macro
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ startup code follows the same scheme as the MCS51 startup code.
+\begin_inset VSpace bigskip
+\end_inset
-Description
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
-SDCC_pic16
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Subsection
+Z80 Startup Code
+\end_layout
-\layout Standard
+\begin_layout Standard
+On the Z80
+\begin_inset LatexCommand index
+name "Z80"
-Port identification
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ the startup code is inserted by linking with crt0.o which is generated from
+ sdcc/device/lib/z80/crt0.s.
+ If you need a different startup code you can use the compiler option
+\emph on
+-
+\series bold
+\emph default
-_
\begin_inset ERT
-status Collapsed
+status collapsed
+
+\begin_layout Standard
-\layout Standard
-\backslash
+\backslash
/
-\end_inset
+\end_layout
-_pic16
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-Port identification (same as above)
-\end_inset
-
-
-
-
-\begin_inset Text
+\series default
+\emph on
+-no-std-crt0
+\emph default
-\layout Standard
+\begin_inset LatexCommand index
+name "-\\/-no-std-crt0"
-pic18fxxxx
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\end_inset
-MCU Identification.
+ and provide your own crt0.o.
-\emph on
-xxxx
-\emph default
- is the microcontrol identification number, i.e.
- 452, 6620, etc
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_inset VSpace bigskip
+\end_inset
-_
-\begin_inset ERT
-status Collapsed
-\layout Standard
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Section
+Inline Assembler Code
+\begin_inset LatexCommand index
+name "Assembler routines"
-_18Fxxxx
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-MCU Identification (same as above)
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Subsection
+A Step by Step Introduction
+\begin_inset LatexCommand label
+name "sub:A-Step-by Assembler Introduction"
-STACK_MODEL_nnn
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-nnn = SMALL or LARGE respectively according to the stack model used
-\end_inset
-
-
-
+\end_layout
-\end_inset
+\begin_layout Standard
+Starting from a small snippet of c-code this example shows for the MCS51
+ how to use inline assembly, access variables, a function parameter and
+ an array in xdata memory.
+ The example uses an MCS51 here but is easily adapted for other architectures.
+ This is a buffer routine which should be optimized:
+\end_layout
+\begin_layout Verse
-\layout Standard
+\family typewriter
+\size footnotesize
+unsigned char __far
+\begin_inset LatexCommand index
+name "far (storage class)"
-In addition the following macros are defined when calling assembler:
-\layout Standard
-\align center
+\end_inset
-\begin_inset Tabular
-
-
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_far (storage class)"
-Macro
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ __at
+\begin_inset LatexCommand index
+name "at"
-Description
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-__18Fxxxx
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "\\_\\_at"
-\layout Standard
+\end_inset
-MCU Identification.
-
-\emph on
-xxxx
-\emph default
- is the microcontrol identification number, i.e.
- 452, 6620, etc
-\end_inset
-
-
-
-
-\begin_inset Text
+(0x7f00) buf[0x100];
+\begin_inset LatexCommand index
+name "Aligned array"
-\layout Standard
+\end_inset
-SDCC_MODEL_nnn
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\newline
+unsigned char head, tail;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* if interrupts
+\begin_inset LatexCommand index
+name "interrupt"
-nnn = SMALL or LARGE respectively according to the memory model used for
- SDCC
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ are involved see
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+section
+\begin_inset LatexCommand ref
+reference "sub:Common-interrupt-pitfall-volatile"
-STACK_MODEL_nnn
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ about
+\family default
+
+\family typewriter
+\series bold
+volatile
+\family default
+\series default
+
+\family typewriter
+*/
+\newline
-nnn = SMALL or LARGE respectively according to the stack model used
-\end_inset
-
-
-
+\newline
+void to_buffer( unsigned char c )
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+if( head != (unsigned char)(tail-1)
+ )\InsetSpace ~
+/* cast
+\family default
+
+\family typewriter
+\series bold
+needed
+\family default
+\series default
+
+\family typewriter
+to avoid promotion
+\begin_inset LatexCommand index
+name "promotion to signed int"
-\end_inset
+\end_inset
-\layout Subsection
+\begin_inset LatexCommand index
+name "type promotion"
-Directories
-\layout Standard
+\end_inset
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+ to integer */
+\begin_inset Marginal
+status collapsed
-\end_inset
+\begin_layout Standard
- port uses the following directories for searching header files and libraries.
-\layout Standard
-\align center
+\series bold
+\InsetSpace ~
+!
+\end_layout
-\begin_inset Tabular
-
-
-
-
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-Directory
-\end_inset
-
-
-\begin_inset Text
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+buf[ head++ ] = c;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* access to a 256 byte aligned array */
+\newline
+}
+\end_layout
-\layout Standard
-
-Description
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-Target
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-Command prefix
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
+If the code snippet (assume it is saved in buffer.c) is compiled with SDCC
+ then a corresponding buffer.asm file is generated.
+ We define a new function
+\family typewriter
+to_buffer_asm()
+\family default
+ in file buffer.c in which we cut and paste the generated code, removing
+ unwanted comments and some ':'.
+ Then add
+\begin_inset Quotes sld
+\end_inset
-\layout Standard
-PREFIX/sdcc/include/pic16
-\end_inset
-
-
-\begin_inset Text
+\series bold
+_asm
+\series default
-\layout Standard
+\begin_inset Quotes srd
+\end_inset
-PIC16 specific headers
-\end_inset
-
-
-\begin_inset Text
+ and
+\begin_inset Quotes sld
+\end_inset
-\layout Standard
-Compiler
-\end_inset
-
-
-\begin_inset Text
+\series bold
+_endasm;
+\series default
-\layout Standard
+\begin_inset Quotes srd
+\end_inset
--I
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset Foot
+status open
-PREFIX/sdcc/lib/pic16
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+Note, that the single underscore form (_asm and _endasm) are not C99-compatible,
+ and for C-99 compatibility, the double-underscore form (__asm and __endasm)
+ has to be used.
+ The latter is also used in the library functions.
+\end_layout
-\layout Standard
+\end_inset
-PIC16 specific libraries
-\end_inset
-
-
-\begin_inset Text
+ to the beginning and the end of the function body:
+\end_layout
-\layout Standard
+\begin_layout Verse
-Linker
-\end_inset
-
-
-\begin_inset Text
+\family typewriter
+\size footnotesize
+/* With a cut and paste from the .asm file, we have something to start with.
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+The
+ function is not yet OK! (registers aren't saved) */
+\newline
+void to_buffer_asm(
+ unsigned char c )
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_asm
+\begin_inset LatexCommand index
+name "\\_asm"
-\layout Standard
+\end_inset
--L
-\end_inset
-
-
-
-\end_inset
+\begin_inset LatexCommand index
+name "\\_\\_asm"
+\end_inset
-\layout Subsection
-Pragmas
-\begin_inset LatexCommand \label{sub:PIC16_Pragmas}
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r2,dpl
+\newline
+;buffer.c if( head != (unsigned char)(tail-1) ) \InsetSpace ~
+/* cast
+\family default
+
+\family typewriter
+\series bold
+needed
+\family default
+\series default
+
+\family typewriter
+to avoid promotion
+\begin_inset LatexCommand index
+name "promotion to signed int"
-\end_inset
+\end_inset
-\layout Standard
+\begin_inset LatexCommand index
+name "type promotion"
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+\end_inset
-\end_inset
+ to integer */
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,_tail
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dec\InsetSpace ~
+\InsetSpace ~
+a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r3,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,_head
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+cjne a,ar3,00106$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ret
+\newline
+00106$:
+
+\newline
+;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */
+\begin_inset LatexCommand index
+name "Aligned array"
- port currently supports the following pragmas:
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-stack
-\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma stack}
-\end_inset
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r3,_head
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc\InsetSpace ~
+\InsetSpace ~
+_head
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+dpl,r3
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+dph,#(_buf >> 8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,r2
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movx @dptr,a
+
+\newline
+00103$:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ret
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
- pragma stack
-\begin_inset LatexCommand \index{PIC16!stack}
+\end_inset
-\end_inset
- forces the code generator to initialize the stack & frame pointers at a
- specific address.
- This is an adhoc solution for cases where no STACK directive is available
- in the linker script or gplink is not instructed to create a stack section.
-\newline
-The stack pragma should be used only once in a project.
- Multiple pragmas may result in indeterminate behaviour of the program.
-\begin_inset Foot
-collapsed false
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-\layout Standard
+\end_inset
-The old format (ie.
- #pragma stack 0x5ff) is deprecated and will cause the stack pointer to
- cross page boundaries (or even exceed the available data RAM) and crash
- the program.
- Make sure that stack does not cross page boundaries when using the SMALL
- stack model.
-\end_inset
+;
+\newline
+}
+\end_layout
+\begin_layout Standard
+The new file buffer.c should compile with only one warning about the unreferenced
+ function argument 'c'.
+ Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY
+ (1) and finally have:
+\end_layout
-\newline
-The format is as follows:
-\layout LyX-Code
+\begin_layout Verse
-#pragma stack bottom_address [stack_size]
-\layout Standard
+\family typewriter
+\size footnotesize
+unsigned char __far __at(0x7f00) buf[0x100];
+\newline
+unsigned char head, tail;
+\newline
+#define
+ USE_ASSEMBLY (1)
+\newline
+\newline
+#if !USE_ASSEMBLY
+\newline
-\emph on
-bottom_address
-\emph default
- is the lower bound of the stack section.
- The stack pointer initially will point at address (bottom_address+stack_size-1).
-\layout LyX-Code
+\newline
+void to_buffer( unsigned char c )
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+if(
+ head != (unsigned char)(tail-1) )
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+buf[ head++ ] = c;
+\newline
+}
+\newline
-Example:
-\layout LyX-Code
+\newline
+#else
+\newline
-\layout LyX-Code
+\newline
+void to_buffer(
+ unsigned char c )
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+c; // to avoid warning: unreferenced function argument
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_asm
+\begin_inset LatexCommand index
+name "\\_asm"
-/* initializes stack of 100 bytes at RAM address 0x200 */
-\layout LyX-Code
+\end_inset
-#pragma stack 0x200 100
-\layout Standard
-If the stack_size field is omitted then a stack is created with the default
- size of 64.
- This size might be enough for most programs, but its not enough for operations
- with deep function nesting or excessive stack usage.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand index
+name "\\_\\_asm"
-code
-\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma code}
+\end_inset
-\end_inset
- place a function symbol at static FLASH address
-\layout LyX-Code
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; save used registers here.
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; If we were still using r2,r3 we would have to push them here.
+
+\newline
+; if( head != (unsigned char)(tail-1) )
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+ a,_tail
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dec\InsetSpace ~
+ a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+xrl\InsetSpace ~
+ a,_head
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; we
+ could do an ANL a,#0x0f here to use a smaller buffer (see below)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+jz\InsetSpace ~
+\InsetSpace ~
+ t_b_end$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;
+\newline
+;
+ buf[ head++ ] = c;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+ a,dpl \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; dpl holds lower byte of function argument
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
-Example:
-\layout LyX-Code
+ dpl,_head \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; buf is 0x100 byte aligned so head can be used directly
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+ dph,#(_bu
+f>>8)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+movx @dptr,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc \InsetSpace ~
+_head
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; we could do an ANL _head,#0x0f here to use a
+ smaller buffer (see above)
+\newline
+t_b_end$:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; restore used registers here
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
-\layout LyX-Code
+\end_inset
-/* place function test_func at 0x4000 */
-\layout LyX-Code
-#pragma code test_func 0x4000
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-library instructs the linker to use a library module.
-\newline
-Usage:
-\layout LyX-Code
+;
+\newline
+}
+\newline
+#endif
+\end_layout
-#pragma library module_name
-\layout Standard
+\begin_layout Standard
+The inline assembler code can contain any valid code understood by the assembler
+, this includes any assembler directives and comment lines.
+ The assembler does not like some characters like ':' or ''' in comments.
+ You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html
+\begin_inset LatexCommand index
+name "asXXXX (as-gbz80, as-hc08, asx8051, as-z80)"
+\end_inset
-\emph on
-module_name
-\emph default
- can be any library or object file (including its path).
- Note that there are four reserved keywords which have special meaning.
- These are:
-\layout Standard
-\align center
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "Assembler documentation"
-\layout Standard
+\end_inset
-Keyword
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-Description
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
-
-Module to link
-\end_inset
-
-
-
-
-\begin_inset Text
-
-\layout Standard
+ or online at
+\begin_inset LatexCommand url
+target "http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html"
+\end_inset
-\series bold
-ignore
-\end_inset
-
-
-\begin_inset Text
+\InsetSpace ~
+.
+\end_layout
-\layout Standard
+\begin_layout Standard
+The compiler does not do any validation of the code within the
+\family typewriter
+_asm
+\begin_inset LatexCommand index
+name "\\_asm"
-ignore all library pragmas
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_asm"
-\emph on
-(none)
-\end_inset
-
-
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+ ...
+ _endasm
+\size footnotesize
+\begin_inset LatexCommand index
+name "\\_endasm"
-\series bold
-c
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-link the C library
-\end_inset
-
-
-\begin_inset Text
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-\layout Standard
+\end_inset
-\emph on
-libc18f
-\emph default
-.lib
-\end_inset
-
-
-
-
-\begin_inset Text
+\size default
+;
+\family default
+ keyword pair.
+ Specifically it will not know which registers are used and thus register
+ pushing/popping
+\begin_inset LatexCommand index
+name "push/pop"
-\layout Standard
+\end_inset
+ has to be done manually.
+
+\end_layout
-\series bold
-math
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+It is recommended that each assembly instruction (including labels) be placed
+ in a separate line (as the example shows).
+ When the -
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-link the Math libarary
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
+\end_inset
-\emph on
-libm18f
-\emph default
-.lib
-\end_inset
-
-
-
-
-\begin_inset Text
+-
+\emph on
+peep-asm
+\begin_inset LatexCommand index
+name "-\\/-peep-asm"
-\layout Standard
+\end_inset
-\series bold
-io
-\end_inset
-
-
-\begin_inset Text
+\emph default
+ command line option is used, the inline assembler code will be passed through
+ the peephole optimizer
+\begin_inset LatexCommand index
+name "Peephole optimizer"
-\layout Standard
+\end_inset
-link the I/O library
-\end_inset
-
-
-\begin_inset Text
+.
+ There are only a few (if any) cases where this option makes sense, it might
+ cause some unexpected changes in the inline assembler code.
+ Please go through the peephole optimizer rules defined in file
+\emph on
+SDCCpeeph.def
+\emph default
+ before using this option.
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Naked Functions
+\begin_inset LatexCommand label
+name "sub:Naked-Functions"
+\end_inset
-\emph on
-libio18f*
-\emph default
-.lib
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "Naked functions"
+\end_inset
-\series bold
-debug
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
-link the debug library
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+A special keyword may be associated with a function declaring it as
+\emph on
+_naked
+\begin_inset LatexCommand index
+name "\\_naked"
-\layout Standard
+\end_inset
-\emph on
-libdebug
-\emph default
-.lib
-\end_inset
-
-
-
+\begin_inset LatexCommand index
+name "\\_\\_naked"
-\end_inset
+\end_inset
+.
-\newline
-* is the device number, i.e.
- 452 for PIC18F452 MCU.
-\layout Standard
+\emph default
+ The
+\emph on
+_naked
+\emph default
+ function modifier attribute prevents the compiler from generating prologue
+\begin_inset LatexCommand index
+name "function prologue"
-This feature allows for linking with specific libraries withoug having to
- explicit name them in the command line.
- Note that the
-\noun on
-ignore
-\noun default
- keyword will reject all modules specified by the library pragma.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
-udata pragma udata instructs the compiler to emit code so that linker will
- place a variable at a specific memory bank
-\layout LyX-Code
+ and epilogue
+\begin_inset LatexCommand index
+name "function epilogue"
-Example:
-\layout LyX-Code
+\end_inset
-\layout LyX-Code
+ code for that function.
+ This means that the user is entirely responsible for such things as saving
+ any registers that may need to be preserved, selecting the proper register
+ bank, generating the
+\emph on
+return
+\emph default
+ instruction at the end, etc.
+ Practically, this means that the contents of the function must be written
+ in inline assembler.
+ This is particularly useful for interrupt functions, which can have a large
+ (and often unnecessary) prologue/epilogue.
+ For example, compare the code generated by these two functions:
+\end_layout
-/* places variable foo at bank2 */
-\layout LyX-Code
+\begin_layout Verse
-#pragma udata bank2 foo
-\layout LyX-Code
+\family typewriter
+volatile
+\begin_inset LatexCommand index
+name "volatile"
-char foo;
-\layout Standard
+\end_inset
-In order for this pragma to work extra SECTION directives should be added
- in the .lkr script.
- In the following example a sample .lkr file is shown:
-\layout LyX-Code
+ data unsigned char counter;
+\newline
-\layout LyX-Code
+\newline
+void simpleInterrupt(void) __interrupt
+\begin_inset LatexCommand index
+name "interrupt"
-// Sample linker script for the PIC18F452 processor
-\layout LyX-Code
+\end_inset
-LIBPATH .
-\layout LyX-Code
-CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "\\_\\_interrupt"
-CODEPAGE NAME=page START=0x2A END=0x7FFF
-\layout LyX-Code
+\end_inset
-CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
-\layout LyX-Code
+ (1)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+counter++;
+\newline
+}
+\newline
-CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
-\layout LyX-Code
+\newline
+void nakedInterrupt(void) __interrupt (2) __naked
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_asm
+\begin_inset LatexCommand index
+name "\\_asm"
-CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
-\layout LyX-Code
+\end_inset
-CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
-\layout LyX-Code
-ACCESSBANK NAME=accessram START=0x0 END=0x7F
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "\\_\\_asm"
-\layout LyX-Code
+\end_inset
-DATABANK NAME=gpr0 START=0x80 END=0xFF
-\layout LyX-Code
-DATABANK NAME=gpr1 START=0x100 END=0x1FF
-\layout LyX-Code
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_counter ; does not change flags, no need to save psw
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+reti\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; MUST explicitly
+ include ret or reti in _naked function.
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
-DATABANK NAME=gpr2 START=0x200 END=0x2FF
-\layout LyX-Code
+\end_inset
-DATABANK NAME=gpr3 START=0x300 END=0x3FF
-\layout LyX-Code
-DATABANK NAME=gpr4 START=0x400 END=0x4FF
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-DATABANK NAME=gpr5 START=0x500 END=0x5FF
-\layout LyX-Code
+\end_inset
-ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED
-\layout LyX-Code
+;
+\newline
+}
+\end_layout
-\layout LyX-Code
+\begin_layout Standard
+For an 8051 target, the generated simpleInterrupt looks like:
+\end_layout
-SECTION NAME=CONFIG ROM=config
-\layout LyX-Code
+\begin_layout Verse
-\layout LyX-Code
+\family typewriter
+Note, this is an
+\family default
+
+\family typewriter
+\emph on
+outdated
+\family default
+\emph default
+
+\family typewriter
+example, recent versions of SDCC generate
+\newline
+the
+\family default
+
+\family typewriter
+\emph on
+same
+\family default
+\emph default
+
+\family typewriter
+code for simpleInterrupt() and nakedInterrupt()!
+\newline
-SECTION NAME=bank0 RAM=gpr0 # these SECTION directives
-\layout LyX-Code
+\newline
+_simpleInterrupt:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+push\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+acc
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+push\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+b
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pus
+h\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dpl
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+push\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dph
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+push\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+psw
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+psw,#0x00
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_counter
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+psw
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dph
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dpl
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+b
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+acc
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+reti
+\end_layout
-SECTION NAME=bank1 RAM=gpr1 # should be added to link
-\layout LyX-Code
+\begin_layout Standard
+whereas nakedInterrupt looks like:
+\end_layout
-SECTION NAME=bank2 RAM=gpr2 # section name 'bank?' with
-\layout LyX-Code
+\begin_layout Verse
-SECTION NAME=bank3 RAM=gpr3 # a specific DATABANK name
-\layout LyX-Code
+\family typewriter
+_nakedInterrupt:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+inc\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_counter ; does not change flags, no need to save psw
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+reti\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;
+ MUST explicitly include ret or reti in _naked function
+\end_layout
-SECTION NAME=bank4 RAM=gpr4
-\layout LyX-Code
+\begin_layout Standard
+The related directive #pragma exclude
+\begin_inset LatexCommand index
+name "\\#pragma exclude"
-SECTION NAME=bank5 RAM=gpr5
-\layout Standard
+\end_inset
-The linker will recognise the section name set in the pragma statement and
- will position the variable at the memory bank set with the RAM field at
- the SECTION line in the linker script file.
-\layout Subsection
+ allows a more fine grained control over pushing & popping
+\begin_inset LatexCommand index
+name "push/pop"
-Header Files
-\begin_inset LatexCommand \label{sub:PIC16_Header-Files}
+\end_inset
-\end_inset
+ the registers.
+\end_layout
+\begin_layout Standard
+While there is nothing preventing you from writing C code inside a
+\family typewriter
+_naked
+\family default
+ function, there are many ways to shoot yourself in the foot doing this,
+ and it is recommended that you stick to inline assembler.
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Use of Labels within Inline Assembler
+\end_layout
-There is one main header file
-\begin_inset LatexCommand \index{PIC16!Header files}
+\begin_layout Standard
+SDCC allows the use of in-line assembler with a few restrictions regarding
+ labels.
+ All labels defined within inline assembler code have to be of the form
+
+\emph on
+nnnnn$
+\emph default
+ where nnnnn is a number less than 100 (which implies a limit of utmost
+ 100 inline assembler labels
+\emph on
+per function
+\emph default
+\noun on
+)
+\noun default
+.
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+This is a slightly more stringent rule than absolutely necessary, but stays
+ always on the safe side.
+ Labels in the form of nnnnn$ are local labels in the assembler, locality
+ of which is confined within two labels of the standard form.
+ The compiler uses the same form for labels within a function (but starting
+ from nnnnn=00100); and places always a standard label at the beginning
+ of a function, thus limiting the locality of labels within the scope of
+ the function.
+ So, if the inline assembler part would be embedded into C-code, an improperly
+ placed non-local label in the assembler would break up the reference space
+ for labels created by the compiler for the C-code, leading to an assembling
+ error.
+\end_layout
+
+\begin_layout Standard
+The numeric part of local labels does not need to have 5 digits (although
+ this is the form of labels output by the compiler), any valid integer will
+ do.
+ Please refer to the assemblers documentation for further details.
+\end_layout
-\end_inset
+\end_inset
- that can be included to the source files using the pic16
-\begin_inset LatexCommand \index{PIC16}
+
+\end_layout
-\end_inset
+\begin_layout Verse
- port.
- That file is the
-\series bold
-pic18fregs.h
-\series default
-.
- This header file contains the definitions for the processor special registers,
- so it is necessary if the source accesses them.
- It can be included by adding the following line in the beginning of the
- file:
-\layout LyX-Code
+\family typewriter
+_asm
+\begin_inset LatexCommand index
+name "\\_asm"
-#include
-\layout Standard
+\end_inset
-The specific microcontroller is selected within the pic18fregs.h automatically,
- so the same source can be used with a variety of devices.
-\layout Subsection
-Libraries
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_asm"
-The libraries
-\begin_inset LatexCommand \index{PIC16!Libraries}
+\end_inset
-\end_inset
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+b,#10
+\newline
+00001$:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+djnz\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+b,00001$
+\newline
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
- that PIC16
-\begin_inset LatexCommand \index{PIC16}
+\end_inset
-\end_inset
- port depends on are the microcontroller device libraries which contain
- the symbol definitions for the microcontroller special function registers.
- These libraries have the format pic18fxxxx.lib, where
-\emph on
-xxxx
-\emph default
- is the microcontroller identification number.
- The specific library is selected automatically by the compiler at link
- stage according to the selected device.
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-Libraries are created with gplib which is part of the gputils package
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+\end_inset
-\end_inset
+ ;
+\end_layout
-.
-\layout Subsubsection*
+\begin_layout Standard
+Inline assembler code cannot reference any C-labels, however it can reference
+ labels
+\begin_inset LatexCommand index
+name "Labels"
-Building the libraries
-\layout Standard
+\end_inset
-Before using SDCC/pic16 there are some libraries that need to be compiled.
- This process is not done automatically by SDCC since not all users use
- SDCC for pic16 projects.
- So each user should compile the libraries separately.
-\layout Standard
+ defined by the inline assembler, e.g.:
+\end_layout
-The steps to compile the pic16 libraries under Linux are:
-\layout LyX-Code
+\begin_layout Verse
-cd device/lib/pic16
-\layout LyX-Code
+\family typewriter
+foo() {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* some c code */
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_asm
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+; some assembler code
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ljmp 0003$
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_endasm;
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* some more c code */
+\newline
+clabel:\InsetSpace ~
+\InsetSpace ~
+/* inline assembler cannot reference this
+ label */
+\begin_inset Foot
+status open
-./configure
-\layout LyX-Code
+\begin_layout Standard
+Here, the C-label
+\family typewriter
+clabel
+\family default
+ is translated by the compiler into a local label, so the locality of labels
+ within the function is not broken.
+\end_layout
-make
-\layout LyX-Code
+\end_inset
-cd ..
-\layout LyX-Code
-make model-pic16
-\layout LyX-Code
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_asm
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+0003$: ;label (can be referenced by inline assembler only)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+_endasm
+\begin_inset LatexCommand index
+name "\\_endasm"
-su -c 'make install' # install the libraries, you need the root password
-\layout Standard
+\end_inset
-If you need to install the headers too, do:
-\layout LyX-Code
-cd device/include
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "\\_\\_endasm"
-su -c 'make install' # install the headers, you need the root password
-\layout Standard
-
-There exist a special target to build the I/O libraries.
- This target is not automatically build because it will build the I/O library
- for
-\emph on
-every
-\emph default
- supported device.
- This way building will take quite a lot of time.
- Users are advised to edit the
-\series bold
-device/lib/pic16/pics.build
-\series default
- file and then execute:
-\layout LyX-Code
-
-make lib-io
-\layout Subsection
+\end_inset
-Memory Models
-\layout Standard
+ ;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* some more c code */
+\newline
+}
+\end_layout
-The following memory models are supported by the PIC16 port:
-\layout Itemize
+\begin_layout Standard
+In other words inline assembly code can access labels defined in inline
+ assembly within the scope of the function.
+ The same goes the other way, i.e.
+ labels defines in inline assembly can not be accessed by C statements.
+\end_layout
-small model
-\layout Itemize
+\begin_layout Section
+Interfacing with Assembler Code
+\begin_inset LatexCommand index
+name "Assembler routines"
-large model
-\layout Standard
+\end_inset
-Memory model affects the default size of pointers within the source.
- The sizes are shown in the next table:
-\layout Standard
-\align center
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Global Registers used for Parameter Passing
+\begin_inset LatexCommand index
+name "Parameter passing"
-Pointer sizes according to memory model
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-small model
-\end_inset
-
-
-\begin_inset Text
+\end_layout
+
+\begin_layout Standard
+The compiler always uses the global registers
+\emph on
+DPL, DPH
+\begin_inset LatexCommand index
+name "DPTR, DPH, DPL"
-\layout Standard
+\end_inset
-large model
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "DPTR"
-code pointers
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+, B
+\begin_inset LatexCommand index
+name "B (mcs51, ds390 register)"
-16-bits
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-24-bits
-\end_inset
-
-
-
-
-\begin_inset Text
+\emph default
+ and
+\emph on
+ACC
+\begin_inset LatexCommand index
+name "ACC (mcs51, ds390 register)"
-\layout Standard
+\end_inset
-data pointers
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\emph default
+ to pass the first (non-bit) parameter to a function, and also to pass the
+ return value
+\begin_inset LatexCommand index
+name "return value"
-16-bits
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+of function; according to the following scheme: one byte return value in
+
+\emph on
+DPL
+\emph default
+, two byte value in
+\emph on
+DPL
+\emph default
+ (LSB) and
+\emph on
+DPH
+\emph default
+ (MSB).
+ three byte values (generic pointers) in
+\emph on
+DPH
+\emph default
+,
+\emph on
+DPL
+\emph default
+ and
+\emph on
+B
+\emph default
+, and four byte values in
+\emph on
+DPH
+\emph default
+,
+\emph on
+DPL
+\emph default
+,
+\emph on
+B
+\emph default
+ and
+\emph on
+ACC
+\emph default
+.
+ Generic pointers
+\begin_inset LatexCommand index
+name "generic pointer"
-16-bits
-\end_inset
-
-
-
+\end_inset
-\end_inset
+ contain type of accessed memory in
+\emph on
+B
+\emph default
+:
+\series bold
+0x00
+\series default
+ -- xdata/far,
+\series bold
+0x40
+\series default
+ -- idata/near -- ,
+\series bold
+0x60
+\series default
+ -- pdata,
+\series bold
+0x80
+\series default
+ -- code
+\begin_inset Note Note
+status collapsed
+\begin_layout Standard
+This might not be the case of certain memory models (medium???)
+\end_layout
-\layout Standard
+\end_inset
-It is advisable that all sources within a project are compiled with the
- same memory model.
- If one wants to override the default memory model, this can be done by
- declaring a pointer as
-\series bold
-far
-\series default
- or
-\series bold
-near
-\series default
.
- Far selects large memory model's pointers, while near selects small memory
- model's pointers.
-\layout Standard
+\end_layout
-The standard device libraries (see
-\begin_inset LatexCommand \ref{sub:PIC16_Header-Files}
+\begin_layout Standard
+The second parameter onwards is either allocated on the stack (for reentrant
+ routines or if -
+\begin_inset ERT
+status collapsed
-\end_inset
+\begin_layout Standard
-) contain no reference to pointers, so they can be used with both memory
- models.
-\layout Subsection
-Stack
-\layout Standard
+\backslash
+/
+\end_layout
-The stack
-\begin_inset LatexCommand \index{PIC16!stack}
+\end_inset
-\end_inset
+-stack-auto is used) or in data/xdata memory (depending on the memory model).
+\end_layout
- implementation for the PIC16 port uses two indirect registers, FSR1 and
- FSR2.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+Bit parameters are passed in a virtual register called 'bits' in bit-addressable
+ space for reentrant functions or allocated directly in bit memory otherwise.
+\end_layout
-FSR1 is assigned as stack pointer
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+Functions (with two or more parameters or bit parameters) that are called
+ through function pointers
+\begin_inset LatexCommand index
+name "function pointers"
-FSR2 is assigned as frame pointer
-\layout Standard
+\end_inset
-The following stack models are supported by the PIC16 port
-\layout Itemize
+ must therefor be reentrant so the compiler knows how to pass the parameters.
+\end_layout
+\begin_layout Subsection
+Registers usage
+\end_layout
-\noun on
-small
-\noun default
- model
-\layout Itemize
+\begin_layout Standard
+Unless the called function is declared as
+\family typewriter
+_naked
+\family default
+\begin_inset LatexCommand index
+name "naked"
-\noun on
-large
-\noun default
- model
-\layout Standard
+\end_inset
+, or the -
+\begin_inset ERT
+status collapsed
-\noun on
-Small
-\noun default
- model means that only the FSRxL byte is used to access stack and frame,
- while
-\emph on
-\noun on
-large
-\emph default
-\noun default
- uses both FSRxL and FSRxH registers.
- The following table shows the stack/frame pointers sizes according to stack
- model and the maximum space they can address:
-\layout Standard
-\align center
+\begin_layout Standard
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
-\layout Standard
+\backslash
+/
+\end_layout
-Stack & Frame pointer sizes according to stack model
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+-callee-saves
+\begin_inset LatexCommand index
+name "-\\/-callee-saves"
-small
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+/-
+\begin_inset ERT
+status collapsed
-large
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
-Stack pointer FSR1
-\end_inset
-
-
-\begin_inset Text
+\backslash
+/
+\end_layout
-\layout Standard
+\end_inset
-8-bits
-\end_inset
-
-
-\begin_inset Text
+-all-callee-saves command line option or the corresponding callee_saves
+ pragma are used, the caller will save the registers (
+\emph on
+R0-R7
+\emph default
+) around the call, so the called function can destroy they content freely.
+\end_layout
-\layout Standard
+\begin_layout Standard
+If the called function is not declared as
+\family typewriter
+_naked
+\family default
+, the caller will swap register banks around the call, if caller and callee
+ use different register banks (having them defined by the
+\family typewriter
+_using
+\family default
+ modifier).
+
+\end_layout
-16-bits
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Standard
+The called function can also use
+\emph on
+DPL
+\emph default
+,
+\emph on
+DPH
+\emph default
+,
+\emph on
+B
+\emph default
+ and
+\emph on
+ACC
+\emph default
+ observing that they are used for parameter/return value passing.
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Assembler Routine (non-reentrant)
+\end_layout
-Frame pointer FSR2
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+In the following example
+\begin_inset LatexCommand index
+name "reentrant"
-\layout Standard
+\end_inset
-8-bits
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\begin_inset LatexCommand index
+name "Assembler routines (non-reentrant)"
-16-bits
-\end_inset
-
-
-
+\end_inset
-\end_inset
+ the function c_func calls an assembler routine asm_func, which takes two
+ parameters
+\begin_inset LatexCommand index
+name "function parameter"
+\end_inset
-\layout Standard
+.
+\end_layout
+\begin_layout Verse
-\noun on
-Large
-\noun default
-stack model is currently not working properly throughout the code generator.
- So its use is not advised.
- Also there are some other points that need special care:
-\newline
+\family typewriter
+extern int asm_func(unsigned char, unsigned char);
+\newline
-\layout Enumerate
+\newline
+int c_func (unsigned char
+ i, unsigned char j)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return asm_func(i,j);
+\newline
+}
+\newline
-Do not create stack sections with size more than one physical bank (that
- is 256 bytes)
-\layout Enumerate
+\newline
+int main()
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return c_func(10,9);
+\newline
+}
+\end_layout
-Stack sections should no cross physical bank limits (i.e.
- #pragma stack 0x50 0x100)
-\layout Standard
+\begin_layout Standard
+The corresponding assembler function is:
+\end_layout
-These limitations are caused by the fact that only FSRxL is modified when
- using SMALL stack model, so no more than 256 bytes of stack can be used.
- This problem will disappear after LARGE model is fully implemented.
-\layout Subsection
+\begin_layout Verse
-Functions
-\layout Standard
+\family typewriter
+.globl _asm_func_PARM_2
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.globl _asm_func
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area OSEG
+\newline
+_asm_func_PARM_2:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.ds
+ 1
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+.area CSEG
+\newline
+_asm_func:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+a,dpl
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+add\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+a,_asm_func_PARM_2
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dpl,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+dph
+\begin_inset LatexCommand index
+name "DPTR, DPH, DPL"
-In addition to the standard SDCC function keywords, PIC16
-\begin_inset LatexCommand \index{PIC16}
+\end_inset
-\end_inset
+,#0x00
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ret
+\end_layout
- port makes available two more:
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+The parameter naming convention is __PARM_, where n is
+ the parameter number starting from 1, and counting from the left.
+ The first parameter is passed in
+\emph on
+DPH
+\emph default
+,
+\emph on
+DPL
+\emph default
+,
+\emph on
+B
+\emph default
+ and
+\emph on
+ACC
+\emph default
+ according to the description above.
+ The variable name for the second parameter will be __PARM_2.
+\newline
-wparam
-\begin_inset LatexCommand \index{PIC16!wparam}
+\newline
+Assem
+ble the assembler routine with the following command:
+\newline
-\end_inset
+\newline
- Use the WREG to pass one byte of the first function argument.
- This improves speed but you may not use this for functions with arguments
- that are called via function pointers, otherwise the first byte of the
- first parameter will get lost.
- Usage:
-\layout LyX-Code
+\family sans
+\series bold
+asx8051 -losg asmfunc.asm
+\newline
-void func_wparam(int a) wparam
-\layout LyX-Code
+\newline
-{
-\layout LyX-Code
+\family default
+\series default
+Then compile and link the assembler routine to the C source file with the
+ following command:
+\newline
- /* WREG hold the lower part of a */
-\layout LyX-Code
+\newline
- /* the high part of a is stored in FSR2+2 (or +3 for large stack model)
- */
-\layout LyX-Code
+\family sans
+\series bold
+sdcc cfunc.c asmfunc.rel
+\end_layout
-...
-\layout LyX-Code
+\begin_layout Subsection
+Assembler Routine (reentrant)
+\end_layout
-}
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+In this case
+\begin_inset LatexCommand index
+name "reentrant"
-shadowregs
-\begin_inset LatexCommand \index{PIC16!shadowregs}
+\end_inset
-\end_inset
- When entering/exiting an ISR, it is possible to take advantage of the PIC18F
- hardware shadow registers which hold the values of WREG, STATUS and BSR
- registers.
- This can be done by adding the keyword
-\emph on
-shadowregs
-\emph default
- before the
-\emph on
-interrupt
-\emph default
- keyword in the function's header.
-\layout LyX-Code
+\begin_inset LatexCommand index
+name "Assembler routines (reentrant)"
-void isr_shadow(void) shadowregs interrupt 1
-\layout LyX-Code
+\end_inset
-{
-\layout LyX-Code
+ the second parameter
+\begin_inset LatexCommand index
+name "function parameter"
-...
-\layout LyX-Code
+\end_inset
+
+ onwards will be passed on the stack, the parameters are pushed from right
+ to left i.e.
+ before the call the second leftmost parameter will be on the top of the
+ stack (the leftmost parameter is passed in registers).
+ Here is an example:
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+extern int asm_func(unsigned char, unsigned char, unsigned char) reentrant;
+\newline
+
+\newline
+int
+ c_func (unsigned char i, unsigned char j, unsigned char k) reentrant
+\newline
+{
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return asm_func(i,j,k);
+\newline
+}
+\newline
+\newline
+int main()
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return c_func(10,9,8);
+\newline
}
-\layout Standard
+\end_layout
+\begin_layout Standard
+The corresponding (unoptimized) assembler routine is:
+\end_layout
-\emph on
-shadowregs
-\emph default
- instructs the code generator not to store/restore WREG, STATUS, BSR when
- entering/exiting the ISR.
-\layout Subsection
+\begin_layout Verse
-Function return values
-\layout Standard
+\family typewriter
+.globl _asm_func
+\newline
+_asm_func:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+push\InsetSpace ~
+_bp
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+_bp,sp\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;stack contains: _bp, return
+ address, second parameter, third parameter
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r2,dpl
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,_bp
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+add\InsetSpace ~
+\InsetSpace ~
+a,#0xfd\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;calculate
+ pointer to the second parameter
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r0,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,_bp
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+add\InsetSpace ~
+\InsetSpace ~
+a,#0xfc\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;calculate pointer
+ to the rightmost parameter
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+r1,a
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+a,@r0
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+add\InsetSpace ~
+\InsetSpace ~
+a,@r1
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+add\InsetSpace ~
+\InsetSpace ~
+a,r2\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;calculate the
+ result (= sum of all three parameters)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+dpl,a\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;return value goes into dptr
+ (cast into int)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+dph,#0x00
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov\InsetSpace ~
+\InsetSpace ~
+sp,_bp
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+pop\InsetSpace ~
+\InsetSpace ~
+_bp
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ret
+\end_layout
-Return values from functions are placed to the appropriate registers following
- a modified Microchip policy optimized for SDCC.
- The following table shows these registers:
-\layout Standard
-\align center
+\begin_layout Standard
+The compiling and linking procedure remains the same, however note the extra
+ entry & exit linkage required for the assembler code, _bp is the stack
+ frame pointer and is used to compute the offset into the stack for parameters
+ and local variables.
+\begin_inset VSpace bigskip
+\end_inset
-\begin_inset Tabular
-
+
+\end_layout
+
+\begin_layout Section
+int (16 bit)
+\begin_inset LatexCommand index
+name "int (16 bit)"
+
+\end_inset
+
+ and long (32 bit)
+\begin_inset LatexCommand index
+name "long (32 bit)"
+
+\end_inset
+
+ Support
+\end_layout
+
+\begin_layout Standard
+For signed & unsigned int (16 bit) and long (32 bit) variables, division,
+ multiplication and modulus operations are implemented by support routines.
+ These support routines are all developed in ANSI-C to facilitate porting
+ to other MCUs, although some model specific assembler optimizations are
+ used.
+ The following files contain the described routines, all of them can be
+ found in /share/sdcc/lib.
+\newline
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+
-
-
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-size
-\end_inset
+\series bold
+Function
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-destination register
-\end_inset
+\series bold
+Description
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_mulint.c
+\end_layout
-8 bits
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+16 bit multiplication
+\end_layout
-WREG
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_divsint.c
+\end_layout
-16 bits
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+ signed 16 bit division (calls _divuint)
+\end_layout
-PRODL:WREG
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_divuint.c
+\end_layout
-24 bits
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+ unsigned 16 bit division
+\end_layout
-PRODH:PRODL:WREG
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_modsint.c
+\end_layout
-32 bits
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+signed 16 bit modulus (calls _moduint)
+\end_layout
-FSR0L:PRODH:PRODL:WREG
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_moduint.c
+\end_layout
->32 bits
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+unsigned 16 bit modulus
+\end_layout
-on stack, FSR0 points to the beginning
-\end_inset
+\end_inset
-
-
-\end_inset
-
-
-\layout Subsection
-
-Interrupts
-\layout Standard
-
-An interrupt
-\begin_inset LatexCommand \index{PIC16!interrupt}
-
-\end_inset
-
- service routine (ISR) is declared using the
-\emph on
-interrupt
-\emph default
- keyword.
-\layout LyX-Code
-
-void isr(void) interrupt
-\emph on
-n
-\layout LyX-Code
-
-{
-\layout LyX-Code
-
-...
-\layout LyX-Code
-
-}
-\layout Standard
-
-
-\emph on
-n
-\emph default
- is the interrupt number, which for PIC18F devices can be:
-\layout Standard
-\align center
-
-\begin_inset Tabular
-
-
-
-
-
-
-
-\begin_inset Text
-
-\layout Standard
-
-
-\emph on
-n
-\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_mullong.c
+\end_layout
-Interrupt Vector
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+32 bit multiplication
+\end_layout
-Interrupt Vector Address
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-0
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+_divslong.c
+\end_layout
-RESET vector
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+ signed 32 division (calls _divulong)
+\end_layout
-0x000000
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+_divulong.c
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+unsigned 32 division
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-1
-\end_inset
+\end_inset
+
+
\begin_inset Text
-\layout Standard
-
+\begin_layout Standard
+_modslong.c
+\end_layout
-\family roman
-\series medium
-\shape up
-\size normal
-\emph off
-\bar no
-\noun off
-\color none
-HIGH priority interrupts
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+ signed 32 bit modulus (calls _modulong)
+\end_layout
-0x000008
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-2
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+_modulong.c
+\end_layout
-LOW priority interrupts
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+unsigned 32 bit modulus
+\end_layout
-0x000018
-\end_inset
+\end_inset
-\end_inset
+\end_inset
-\layout Standard
+\newline
-When generating assembly code for ISR the code generator places a
-\noun on
-goto
-\noun default
-instruction at the
-\emph on
-Interrupt Vector Address
-\emph default
- which points at the genetated ISR.
- This single GOTO instruction is part of an automatically generated
-\emph on
-interrupt entry point
-\emph default
- function.
- The actuall ISR code is placed as normally would in the code space.
- Upon interrupt request, the GOTO instruction is executed which jumps to
- the ISR code.
- When declaring interrupt functions as _naked this GOTO instruction is
-\series bold
-not
-\series default
- generated.
- The whole interrupt functions is therefore placed at the Interrupt Vector
- Address of the specific interrupt.
- This is not a problem for the LOW priority interrupts, but it is a problem
- for the RESET and the HIGH priority interrupts because code may be written
- at the next interrupt´s vector address and cause undeterminate program
- behaviour if that interrupt is raised.
-\begin_inset Foot
-collapsed false
+\end_layout
-\layout Standard
+\begin_layout Standard
+Since they are compiled as
+\emph on
+non-reentrant
+\emph default
-This is not a problem when
-\layout Enumerate
+\begin_inset LatexCommand index
+name "reentrant"
-this is a HIGH interrupt ISR and LOW interrupts are
-\emph on
-disabled
-\emph default
- or not used.
-\layout Enumerate
+\end_inset
-when the ISR is small enough not to reach the next interrupt´s vector address.
-\end_inset
+, interrupt
+\begin_inset LatexCommand index
+name "interrupt"
+\end_inset
-\layout Standard
+ service routines should not do any of the above operations.
+ If this is unavoidable then the above routines will need to be compiled
+ with the
+\emph on
+-
+\begin_inset ERT
+status collapsed
+\begin_layout Standard
-\emph on
-n
-\emph default
- is possible to be omitted.
- This way a function is generated similar to an ISR, but it is not assigned
- to any interrupt.
-\layout Standard
-When entering an interrupt, currently the PIC16
-\begin_inset LatexCommand \index{PIC16}
+\backslash
+/
+\end_layout
-\end_inset
+\end_inset
- port automatically saves the following registers:
-\layout Itemize
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
-WREG
-\layout Itemize
+\end_inset
-STATUS
-\layout Itemize
-BSR
-\layout Itemize
+\emph default
+ option, after which the source program will have to be compiled with
+\emph on
+-
+\begin_inset ERT
+status collapsed
-PROD (PRODL and PRODH)
-\layout Itemize
+\begin_layout Standard
-FSR0 (FSR0L and FSR0H)
-\layout Standard
-These registers are restored upon return from the interrupt routine.
-\begin_inset Foot
-collapsed false
+\backslash
+/
+\end_layout
+
+\end_inset
-\layout Standard
+-int-long-reent
+\begin_inset LatexCommand index
+name "-\\/-int-long-reent"
-NOTE that when the _naked attribute is specified for an interrupt routine,
- then NO registers are stored or restored.
-\end_inset
+\end_inset
-\layout Subsection
+\emph default
+ option.
+ Notice that you don't have to call these routines directly.
+ The compiler will use them automatically every time an integer operation
+ is required.
+\end_layout
-Generic Pointers
-\layout Standard
+\begin_layout Section
+Floating Point Support
+\begin_inset LatexCommand index
+name "Floating point support"
-Generic pointers are implemented in PIC16 port as 3-byte (24-bit) types.
- There are 3 types of generic pointers currently implemented data, code
- and eeprom pointers.
- They are differentiated by the value of the 7th and 6th bits of the upper
- byte:
-\layout Standard
-\align center
+\end_inset
-\begin_inset Tabular
-
+
+\end_layout
+
+\begin_layout Standard
+SDCC supports IEEE (single precision 4 bytes) floating point numbers.
+ The floating point support routines are derived from gcc's floatlib.c and
+ consist of the following routines:
+\newline
+
+\end_layout
+
+\begin_layout Standard
+\align center
+
+\size footnotesize
+\begin_inset Tabular
+
-
-
-
-
-
+
+
\begin_inset Text
-\layout Standard
-
-pointer type
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+Function
+\end_layout
-7th bit
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+Description
+\end_layout
-6th bit
-\end_inset
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-rest of the pointer
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fsadd.c
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-description
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+add floating point numbers
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
-
-data
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fssub.c
+\end_layout
-1
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-0
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+subtract floating point numbers
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fsdiv.c
+\end_layout
-\family typewriter
-\shape slanted
-\emph on
-uuuuuu uuuuxxxx xxxxxxxx
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-a 12-bit data pointer in data RAM memory
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+divide floating point numbers
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-code
-\end_inset
-
-
-\begin_inset Text
-
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fsmul.c
+\end_layout
-0
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-0
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+multiply floating point numbers
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2uchar.c
+\end_layout
-\family typewriter
-\shape slanted
-\emph on
-uxxxxx xxxxxxxx xxxxxxxx
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-a 21-bit code pointer in FLASH memory
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to unsigned char
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
-
-eeprom
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2char.c
+\end_layout
-0
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-1
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to signed char
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2uint.c
+\end_layout
-\family typewriter
-\shape slanted
-\emph on
-uuuuuu uuuuuuxx xxxxxxxx
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-a 10-bit eeprom pointer in EEPROM memory
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to unsigned int
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
-
-(unimplemented)
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2int.c
+\end_layout
-1
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-1
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to signed int
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2ulong.
+\family default
+\series default
+\shape default
+\size default
+\emph default
+\bar default
+\noun default
+c
+\end_layout
-\family typewriter
-\shape slanted
-\emph on
-xxxxxx xxxxxxxx xxxxxxxx
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-unimplemented pointer type
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to unsigned long
+\end_layout
+
+\end_inset
-
-
-\end_inset
-
-
-\layout Standard
-
-Generic pointer are read and written with a set of library functions which
- read/write 1, 2, 3, 4 bytes.
-\layout Subsection
-
-PIC16 C Libraries
-\layout Subsubsection
-
-Standard I/O Streams
-\layout Standard
-
-In the
-\emph on
-stdio.h
-\emph default
- the type FILE is defined as:
-\layout LyX-Code
-
-typedef char * FILE;
-\layout Standard
-
-This type is the stream type implemented I/O in the PIC18F devices.
- Also the standard input and output streams are declared in stdio.h:
-\layout LyX-Code
-
-extern FILE * stdin;
-\layout LyX-Code
-
-extern FILE * stdout;
-\layout Standard
-
-The FILE type is actually a generic pointer which defines one more type
- of generic pointers, the
-\emph on
-stream
-\emph default
-pointer.
- This new type has the format:
-\layout Standard
-\align center
-
-\begin_inset Tabular
-
-
-
-
-
-
-
-
-
-
+
\begin_inset Text
-\layout Standard
-
-pointer type
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_fs2long.c
+\end_layout
-<7:6>
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
-
-<5>
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert floating point to signed long
+\end_layout
-<4>
-\end_inset
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
-
-<3:0>
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_uchar2fs.c
+\end_layout
-rest of the pointer
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-descrption
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert unsigned char to floating point
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
-
-stream
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
-\layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_char2fs.c
+\end_layout
-00
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-1
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert char to floating point number
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-0
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_uint2fs.c
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-nnnn
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert unsigned int to floating point
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_int2fs.c
+\end_layout
-\family typewriter
-\shape slanted
-\emph on
-uuuuuuuu uuuuuuuu
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-upper byte high nubble is 0x2n, the rest are zeroes
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert int to floating point numbers
+\end_layout
+
+\end_inset
-
-
-\end_inset
-
-
-\layout Standard
-
-Currently implemented there are 3 types of streams defined:
-\layout Standard
-\align center
-
-\begin_inset Tabular
-
-
-
-
-
-
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-stream type
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_ulong2fs.c
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-value
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert unsigned long to floating point number
+\end_layout
+
+\end_inset
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-module
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+_long2fs.c
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-description
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+convert long to floating point number
+\end_layout
+
+\end_inset
-
-
-\begin_inset Text
+
-\layout Standard
+\end_inset
-STREAM_USART
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\newline
+\end_layout
-\family typewriter
-0x200000UL
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Standard
+These support routines are developed in ANSI-C so there is room for space
+ and speed improvement
+\begin_inset Foot
+status open
-\layout Standard
+\begin_layout Standard
+These floating point routines (
+\emph on
+not
+\emph default
+ sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
+
+\end_layout
-USART
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
+.
+ Note if all these routines are used simultaneously the data space might
+ overflow.
+ For serious floating point usage the large model might be needed.
+ Also notice that you don't have to call this routines directly.
+ The compiler will use them automatically every time a floating point operation
+ is required.
+\begin_inset VSpace bigskip
+\end_inset
-Writes/Reads characters via the USART peripheral
-\end_inset
-
-
-
-
-\begin_inset Text
-\layout Standard
+\end_layout
-STREAM_MSSP
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Section
+Library Routines
+\begin_inset LatexCommand index
+name "Libraries"
-\layout Standard
+\end_inset
-\family typewriter
-0x210000UL
-\end_inset
-
-
-\begin_inset Text
+\end_layout
-\layout Standard
+\begin_layout Standard
-MSSP
-\end_inset
-
-
-\begin_inset Text
+\emph on
+
+\end_layout
-\layout Standard
+\begin_layout Subsection
+Compiler support routines (_gptrget, _mulint etc.)
+\end_layout
-Writes/Reads characters via the MSSP peripheral
-\end_inset
-
-
-
-
-\begin_inset Text
+\begin_layout Subsection
+Stdclib functions (puts, printf, strcat etc.)
+\end_layout
-\layout Standard
+\begin_layout Subsubsection
+
+\end_layout
-STREAM_USER
-\end_inset
-
-
-\begin_inset Text
+\begin_layout Paragraph
+getchar(), putchar()
+\end_layout
-\layout Standard
+\begin_layout Standard
+\begin_inset LatexCommand index
+name ""
+\end_inset
-\family typewriter
-0x2f0000UL
-\end_inset
-
-
-\begin_inset Text
+As usual on embedded systems you have to provide your own
+\family typewriter
+getchar()
+\begin_inset LatexCommand index
+name "getchar()"
-\layout Standard
+\end_inset
-(none)
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\family default
+ and
+\family typewriter
+putchar()
+\begin_inset LatexCommand index
+name "putchar()"
-Writes/Reads characters via used defined functions
-\end_inset
-
-
-
+\end_inset
-\end_inset
+\family default
+ routines.
+ SDCC does not know whether the system connects to a serial line with or
+ without handshake, LCD, keyboard or other device.
+ And whether a
+\family typewriter
+lf
+\family default
+ to
+\family typewriter
+crlf
+\family default
+ conversion within
+\family typewriter
+putchar()
+\family default
+ is intended.
+ You'll find examples for serial routines f.e.
+ in sdcc/device/lib.
+ For the mcs51 this minimalistic polling
+\family typewriter
+putchar()
+\family default
+ routine might be a start:
+\end_layout
-\layout Standard
+\begin_layout Verse
-The stream identifiers are declared as macros in the stdio.h header.
-\layout Standard
+\family typewriter
+void putchar (char c) {
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+while (!TI)\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ /* assumes UART is initialized */
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+TI
+ = 0;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SBUF = c;
+\newline
+}
+\end_layout
-In the libc library there exist the functions that are used to write to
- each of the above streams.
- These are
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Paragraph
+printf()
+\end_layout
-_
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+The default
+\family typewriter
+printf()
+\begin_inset LatexCommand index
+name "printf()"
-\layout Standard
+\end_inset
-\backslash
-/
-\end_inset
-_stream_usart_putchar writes a character at the USART stream
-\layout List
-\labelwidthstring 00.00.0000
+\family default
+ implementation in
+\family typewriter
+printf_large.c
+\family default
+ does not support float
+\begin_inset LatexCommand index
+name "Floating point support"
-_
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+ (except on ds390), only
+\begin_inset LatexCommand index
+name ""
-\backslash
-/
-\end_inset
+\end_inset
-_stream_mssp_putchar writes a character at the MSSP stream
-\layout List
-\labelwidthstring 00.00.0000
-putchar dummy function.
- This writes a character to a user specified manner.
-\layout Standard
+\begin_inset LatexCommand index
+name "printf floating point support"
-In order to increase performance
-\emph on
-putchar
-\emph default
-is declared in stdio.h as having its parameter in WREG (it has the wparam
- keyword).
- In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function
- in a user-friendly way.
-
-\emph on
-arg
-\emph default
- is the name of the variable that holds the character to print.
- An example follows:
-\layout LyX-Code
+\end_inset
-#include
-\newline
-#include
-\newline
+ will be printed instead of the value.
+ To enable floating point output, recompile it with the option
+\emph on
+-
+\begin_inset ERT
+status collapsed
-\newline
-PUTCHAR( c )
-\layout LyX-Code
+\begin_layout Standard
-{
-\layout LyX-Code
- PORTA = c; /* dump character c to PORTA */
-\layout LyX-Code
+\backslash
+/
+\end_layout
-}
-\newline
+\end_inset
-\newline
-void main(void)
-\layout LyX-Code
+DUSE_FLOATS=1
+\begin_inset LatexCommand index
+name "USE\\_FLOATS"
-{
-\layout LyX-Code
+\end_inset
- stdout = STREAM_USER; /* this is not necessary, since stdout points
-\layout LyX-Code
- * by default to STREAM_USER */
-\layout LyX-Code
+\emph default
+ on the command line.
+ Use
+\emph on
+-
+\begin_inset ERT
+status open
- printf (¨This is a printf test
-\backslash
-n¨);
-\layout LyX-Code
+\begin_layout Standard
-}
-\layout LyX-Code
-\layout Subsubsection
+\backslash
+/
+\end_layout
-Printing functions
-\layout Standard
+\end_inset
-PIC16 contains an implementation of the printf-family of functions.
- There exist the following functions:
-\layout LyX-Code
+-model-large
+\begin_inset LatexCommand index
+name "-\\/-model-large"
-extern unsigned int sprintf(char *buf, char *fmt, ...);
-\layout LyX-Code
+\end_inset
-extern unsigned int vsprintf(char *buf, char *fmt, va_list ap);
-\layout LyX-Code
-\layout LyX-Code
+\emph default
+ for the mcs51 port, since this uses a lot of memory.
+ To enable float support for the pic16 targets, see
+\begin_inset LatexCommand ref
+reference "sub:pic16Libraries"
-extern unsigned int printf(char *fmt, ...);
-\layout LyX-Code
+\end_inset
-extern unsigned int vprintf(char *fmt, va_lista ap);
-\layout LyX-Code
+.
+\end_layout
-\layout LyX-Code
+\begin_layout Standard
+If you're short on code memory you might want to use
+\family typewriter
+printf_small()
+\begin_inset LatexCommand index
+name "printf\\_small()"
-extern unsigned int fprintf(FILE *fp, char *fmt, ...);
-\layout LyX-Code
+\end_inset
-extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap);
-\layout Standard
-For sprintf and vsprintf
-\emph on
-buf
-\emph default
-should normally be a data pointer where the resulting string will be placed.
- No range checking is done so the user should allocate the necessery buffer.
- For fprintf and vfprintf
-\emph on
-fp
-\emph default
- should be a stream pointer (i.e.
- stdout, STREAM_MSSP, etc...).
-\layout Subsubsection
+\family default
+
+\emph on
+instead
+\emph default
+ of
+\family typewriter
+printf().
-Signals
-\layout Standard
+\family default
+ For the mcs51 there additionally are assembly versions
+\family typewriter
+printf_tiny()
+\begin_inset LatexCommand index
+name "printf\\_tiny() (mcs51)"
-The PIC18F family of microcontrollers supports a number of interrupt sources.
- A list of these interrupts is shown in the following table:
-\layout Standard
-\align center
+\end_inset
-\begin_inset Tabular
-
-
-
-
-
-
-
-
-\begin_inset Text
-\layout Standard
+\family default
+ (subset of printf using less than 270 bytes) and
+\family typewriter
+printf_fast()
+\begin_inset LatexCommand index
+name "printf\\_fast() (mcs51)"
-signal name
-\end_inset
-
-
-\begin_inset Text
+\end_inset
-\layout Standard
-description
-\end_inset
-
-
-\begin_inset Text
+\family default
+ and
+\family typewriter
+printf_fast_f()
+\begin_inset LatexCommand index
+name "printf\\_fast\\_f() (mcs51)"
-\layout Standard
+\end_inset
-signal name
-\end_inset
-
-
-\begin_inset Text
-\layout Standard
+\family default
+ (floating-point aware version of printf_fast) which should fit the requirements
+ of many embedded systems (printf_fast() can be customized by unsetting
+ #defines to
+\emph on
+not
+\emph default
+ support long variables and field widths).
+ Be sure to use only one of these printf options within a project.
+\newline
+
+\end_layout
+
+\begin_layout Standard
+Feature matrix of different
+\emph on
+printf
+\emph default
+ options on mcs51.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+
+
+
+
+
+
+
+
+
+
+
+\begin_inset Text
-descritpion
-\end_inset
+\begin_layout Standard
+
+\series bold
+\size large
+mcs51
+\end_layout
+
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+printf
+\begin_inset LatexCommand index
+name "printf()"
-SIG_RB
-\end_inset
+\end_inset
+
+
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+printf
+\size scriptsize
+USE_FLOATS=1
+\end_layout
-PORTB change interrupt
-\end_inset
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+printf_small
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+printf_fast
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+printf_fast_f
+\end_layout
-SIG_EE
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+printf_tiny
+\end_layout
-EEPROM/FLASH write complete interrupt
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+filename
+\end_layout
-SIG_INT0
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-INT0 external interrupt
-\end_inset
+\size scriptsize
+printf_large.c
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-SIG_BCOL
-\end_inset
+\size scriptsize
+printf_large.c
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-Bus collision interrupt
-\end_inset
+\size scriptsize
+printfl.c
+\end_layout
+
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-SIG_INT1
-\end_inset
+\size scriptsize
+printf_fast.c
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-INT1 external interrupt
-\end_inset
+\size scriptsize
+printf_fast_f.c
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-SIG_LVD
-\end_inset
+\size scriptsize
+printf_tiny.c
+\end_layout
+
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+\begin_inset Quotes sld
+\end_inset
-Low voltage detect interrupt
-\end_inset
+Hello World
+\begin_inset Quotes srd
+\end_inset
+
+ size
+\end_layout
+
+\begin_layout Standard
+small / large
+\end_layout
+
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.7k / 2.4k
+\end_layout
-SIG_INT2
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+4.3k / 5.6k
+\end_layout
-INT2 external interrupt
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.2k / 1.8k
+\end_layout
-SIG_PSP
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.3k / 1.3k
+\end_layout
-Parallel slave port interrupt
-\end_inset
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.9k / 1.9k
+\end_layout
-SIG_CCP1
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+0.44k / 0.44k
+\end_layout
-CCP1 module interrupt
-\end_inset
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+code size
+\end_layout
-SIG_AD
-\end_inset
+\begin_layout Standard
+small / large
+\end_layout
+
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.4k / 2.0k
+\end_layout
-AD convertion complete interrupt
-\end_inset
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+2.8k / 3.7k
+\end_layout
-SIG_CCP2
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+0.45k / 0.47k (+ _ltoa)
+\end_layout
-CCP2 module interrupt
-\end_inset
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+1.2k / 1.2k
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.6k / 1.6k
+\end_layout
-SIG_RC
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+0.26k / 0.26k
+\end_layout
-USART receive interrupt
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+formats
+\end_layout
-SIG_TMR0
-\end_inset
+\end_inset
-
+
+\begin_inset Text
+
+\begin_layout Standard
+cdi
+\emph on
+o
+\emph default
+psux
+\end_layout
+
+\end_inset
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-TMR0 overflow interrupt
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+cd
+\family default
+\series default
+\shape default
+\size default
+\emph default
+\bar default
+\noun default
+f
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+i
+\family default
+\series default
+\shape default
+\size default
+\emph on
+\bar default
+\noun default
+o
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+psux
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+c
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+d
+\family default
+\series default
+\shape default
+\size default
+\emph on
+\bar default
+\noun default
+o
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+s
+\family default
+\series default
+\shape default
+\size default
+\emph default
+\bar default
+\noun default
+x
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+cdsux
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+cdfsux
+\end_layout
-SIG_TX
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+cdsux
+\end_layout
-USART transmit interrupt
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+long (32 bit) support
+\end_layout
-SIG_TMR1
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+x
+\end_layout
-TMR1 overflow interrupt
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+x
+\end_layout
-SIG_MSSP
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+x
+\end_layout
-SSP receive/transmit interrupt
-\end_inset
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+x
+\end_layout
-SIG_TMR2
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
-TMR2 matches PR2 interrupt
-\end_inset
+\family roman
+\series medium
+\shape up
+\size normal
+\emph off
+\bar no
+\noun off
+\color none
+x
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-\end_inset
+\end_inset
-
+
+
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+byte arguments on stack
+\end_layout
-\end_inset
+\end_inset
-
-
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+b
+\end_layout
-SIG_TMR3
-\end_inset
+\end_inset
-
+
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+b
+\end_layout
-TMR3 overflow interrupt
-\end_inset
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+-
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+-
+\end_layout
+
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-\end_inset
+\end_inset
\begin_inset Text
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-\end_inset
+\end_inset
-
-
-\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+float format
+\begin_inset LatexCommand index
+name "Floating point support"
-\layout Standard
+\end_inset
-The prototypes for these names are defined in the header file
-\emph on
-signal.h
-\emph default
- .
-\layout Standard
-In order to simplify signal handling, a number of macros is provided:
-\layout List
-\labelwidthstring 00.00.0000
+\end_layout
-DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
- high priority interrupts.
-
-\emph on
-name
-\emph default
- is the function name to use.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+
+
+\begin_inset Text
-DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
- low priority interrupt.
-
-\emph on
-name
-\emph default
- is the function name to use.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_layout Standard
+-
+\end_layout
-DEF_HANDLER(sig,handler) define a handler for signal
-\emph on
-sig.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+
+
+\begin_inset Text
-END_DEF end the declaration of the dispatch table.
-\layout Standard
+\begin_layout Standard
+%f
+\end_layout
-Additionally there are two more macros to simplify the declaration of the
- signal handler:
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+
+
+\begin_inset Text
+\begin_layout Standard
+-
+\end_layout
-\series medium
-SIGHANDLER(handler)
-\series default
-this declares the function prototype for the
-\emph on
-handler
-\emph default
- function.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset
+
+
+\begin_inset Text
-SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function.
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-An example of using the macros above is shown below:
-\layout LyX-Code
+\end_inset
+
+
+\begin_inset Text
-#include
-\layout LyX-Code
+\begin_layout Standard
+%f
+\begin_inset Foot
+status collapsed
-#include
-\newline
+\begin_layout Standard
+Range limited to +/- 4294967040, precision limited to 8 digits past decimal
+\end_layout
-\newline
-DEF_INTHIGH(high_int)
-\layout LyX-Code
+\end_inset
-DEF_HANDLER(SIG_TMR0, _tmr0_handler)
-\layout LyX-Code
-DEF_HANDLER(SIG_BCOL, _bcol_handler)
-\layout LyX-Code
+\end_layout
-END_DEF
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-SIGHANDLER(_tmr0_handler)
-\layout LyX-Code
+\begin_layout Standard
+-
+\end_layout
-{
-\layout LyX-Code
+\end_inset
+
+
+
+
+\begin_inset Text
- /* action to be taken when timer 0 overflows */
-\layout LyX-Code
+\begin_layout Standard
+float formats %e %g
+\end_layout
-}
-\newline
+\end_inset
+
+
+\begin_inset Text
-\newline
-SIGHANDLERNAKED(_bcol_handler)
-\layout LyX-Code
+\begin_layout Standard
+-
+\end_layout
-{
-\layout LyX-Code
+\end_inset
+
+
+\begin_inset Text
- _asm
-\layout LyX-Code
+\begin_layout Standard
+-
+\end_layout
- /* action to be taken when bus collision occurs */
-\layout LyX-Code
+\end_inset
+
+
+\begin_inset Text
- retfie
-\layout LyX-Code
+\begin_layout Standard
+-
+\end_layout
- _endasm;
-\layout LyX-Code
+\end_inset
+
+
+\begin_inset Text
-}
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\series bold
-NOTES:
-\series default
- Special care should be taken when using the above scheme:
-\layout Itemize
+\begin_layout Standard
+-
+\end_layout
-do not place a colon (;) at the end of the DEF_* and END_DEF macros.
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-when declaring SIGHANDLERNAKED handler never forget to use
-\emph on
-retfie
-\emph default
- for proper returning.
-\layout Subsection
+\begin_layout Standard
+-
+\end_layout
-PIC16 Port -- Tips
-\layout Standard
+\end_inset
+
+
+
+
+\begin_inset Text
-Here you can find some general tips for compiling programs with SDCC/pic16.
-\layout Subsubsection
+\begin_layout Standard
+field width
+\end_layout
-Stack size
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-The default stack
-\begin_inset LatexCommand \index{PIC16!stack}
+\begin_layout Standard
+x
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- size (that is 64 bytes) probably is enough for many programs.
- One must take care that when there are many levels of function nesting,
- or there is excessive usage of stack, its size should be extended.
- An example of such a case is the printf/sprintf family of functions.
- If you encounter problems like not being able to print integers, then you
- need to set the stack size around the maximum (256 for small stack model).
- The following diagram shows what happens when calling printf to print an
- integer:
-\layout LyX-Code
+\begin_layout Standard
+x
+\end_layout
-printf () --> ltoa () --> ultoa () --> divschar ()
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-It is should be understood that stack is easily consumed when calling complicate
-d functions.
- Using command line arguments like -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+-
+\end_layout
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-\backslash
-/
-\end_inset
+\begin_layout Standard
+x
+\end_layout
--fommit-frame-pointer might reduce stack usage by not creating unnecessery
- stack frames.
- Other ways to reduce stack usage may exist.
-\layout Subsection
+\end_inset
+
+
+\begin_inset Text
-Known bugs
-\layout Standard
+\begin_layout Standard
+x
+\end_layout
-The PIC16 Port currently does not pass SDCC's regression test
-\begin_inset LatexCommand \index{Regression test (PIC16)}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+-
+\end_layout
- suite (see section
-\begin_inset LatexCommand \ref{sec:Quality-control}
+\end_inset
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+string speed
+\begin_inset Foot
+status collapsed
-) and thus the nightly regression tests for the PIC16 target are currently
- disabled for all hosts except for
-\emph on
-Linux on Opteron.
+\begin_layout Standard
+Execution time of printf("%s%c%s%c%c%c", "Hello", ' ', "World", '!', '
+\backslash
+r', '
+\backslash
+n'); standard 8051 @ 22.1184 MHz, empty putchar()
+\end_layout
-\emph default
- This means you can see the result of the PIC16 regression tests f.e.
- by checking the log files in
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/regression_test_results/amd64-unknown-linux2.3/}
+\end_inset
-\end_inset
+,
+\end_layout
- (pick the most up to date file there, scroll down, lend a hand).
-\layout Chapter
+\begin_layout Standard
+small / large
+\end_layout
-Debugging
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-There are several approaches to debugging your code.
- This chapter is meant to show your options and to give detail on some of
- them:
-\newline
+\begin_layout Standard
+1.52 / 2.59 ms
+\end_layout
-\newline
-When writing your code:
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-write your code with debugging in mind (avoid duplicating code, put conceptually
- similar variables into structs, use structured code, have strategic points
- within your code where all variables are consistent, ...)
-\layout Itemize
+\begin_layout Standard
+1.53 / 2.62 ms
+\end_layout
-run a syntax-checking tool like splint
-\begin_inset LatexCommand \index{splint (syntax checking tool)}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0.92 / 0.93 ms
+\end_layout
+\end_inset
+
+
+\begin_inset Text
-\begin_inset LatexCommand \index{lint (syntax checking tool)}
+\begin_layout Standard
+0.45 / 0.45 ms
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- (see -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+0.46 / 0.46 ms
+\end_layout
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-\backslash
-/
-\end_inset
+\begin_layout Standard
+0.45 / 0.45 ms
+\end_layout
--more-pedantic
-\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+\end_inset
+
+
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+int speed
+\begin_inset Foot
+status collapsed
-) over the code.
-\layout Itemize
+\begin_layout Standard
+Execution time of printf("%d", -12345); standard 8051 @ 22.1184 MHz, empty
+ putchar()
+\end_layout
-for the high level code use a C-compiler (like f.e.
- GCC) to compile run and debug the code on your host.
- See (see -
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+,
+\end_layout
-\backslash
-/
-\end_inset
+\begin_layout Standard
+small / large
+\end_layout
--more-pedantic
-\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+3.01 / 3.61 ms
+\end_layout
- ) on howto handle syntax extensions like __xdata, __at(), ...
-
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-use another C-compiler to compile code for your target.
- Always an option but not recommended:) And not very likely to help you.
- If you seriously consider walking this path you should at least occasionally
- check portability of your code.
- Most commercial compiler vendors will offer an evaluation version so you
- can test compile your code or snippets of your code.
-\layout Standard
+\begin_layout Standard
+3.01 / 3.61 ms
+\end_layout
-Debugging on a simulator:
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-there is a separate section about SDCDB (section
-\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
+\begin_layout Standard
+3.51 / 18.13 ms
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-) below.
-\layout Itemize
+\begin_layout Standard
+0.22 / 0.22 ms
+\end_layout
-or (8051 specific) use a freeware/commercial simulator which interfaces
- to the AOMF
-\begin_inset LatexCommand \index{AOMF, AOMF51}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0.23 / 0.23 ms
+\end_layout
- file (see
-\begin_inset LatexCommand \ref{OMF file}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0.25 / 0.25 ms
+\begin_inset Foot
+status collapsed
-) optionally generated by SDCC.
-\layout Standard
+\begin_layout Standard
+printf_tiny integer speed is data dependent, worst case is 0.33 ms
+\end_layout
-Debugging On-target:
-\layout Itemize
+\end_inset
-use a MCU port pin to serially output debug data to the RS232 port of your
- host.
- You'll probably want some level shifting device typically involving a MAX232
- or similar IC.
- If the hardware serial port of the MCU is not available search for 'Software
- UART' in your favourite search machine.
-\layout Itemize
-use an on-target monitor.
- In this context a monitor is a small program which usually accepts commands
- via a serial line and allows to set program counter, to single step through
- a program and read/write memory locations.
- For the 8051 good examples of monitors are paulmon and cmon51 (see section
-
-\begin_inset LatexCommand \ref{sec:Related-open-source-tools}
+\end_layout
-\end_inset
+\end_inset
+
+
+
+
+\begin_inset Text
-).
-\layout Itemize
+\begin_layout Standard
+long speed
+\begin_inset Foot
+status collapsed
-toggle MCU port pins at strategic points within your code and use an oscilloscop
-e.
- A
-\emph on
-digital oscilloscope
-\emph default
+\begin_layout Standard
+Execution time of printf("%ld", -123456789); standard 8051 @ 22.1184 MHz,
+ empty putchar()
+\end_layout
-\begin_inset LatexCommand \index{Oscilloscope}
+\end_inset
-\end_inset
+,
+\end_layout
- with deep trace memory is really helpful especially if you have to debug
- a realtime application.
- If you need to monitor more pins than your oscilloscope provides you can
- sometimes get away with a small R-2R network.
- On a single channel oscilloscope you could f.e.
- monitor 2 push-pull driven pins by connecting one via a 10\SpecialChar ~
-k
-\begin_inset Formula $\Omega$
-\end_inset
+\begin_layout Standard
+small / large
+\end_layout
- resistor and the other one by a 5\SpecialChar ~
-k
-\begin_inset Formula $\Omega$
-\end_inset
+\end_inset
+
+
+\begin_inset Text
- resistor to the oscilloscope probe (check output drive capability of the
- pins you want to monitor).
- If you need to monitor many more pins a
-\emph on
-logic analyzer
-\emph default
- will be handy.
-\layout Itemize
+\begin_layout Standard
+5.37 / 6.31 ms
+\end_layout
-use an ICE (
-\emph on
-i
-\emph default
-n
-\emph on
-c
-\emph default
-ircuit
-\emph on
-e
-\emph default
-mulator
-\begin_inset LatexCommand \index{ICE (in circuit emulator)}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+5.37 / 6.31 ms
+\end_layout
-).
- Usually very expensive.
- And very nice to have too.
- And usually locks you (for years...) to the devices the ICE can emulate.
-
-\layout Itemize
+\end_inset
+
+
+\begin_inset Text
-use a remote debugger.
- In most 8-bit systems the symbol information is not available on the target,
- and a complete debugger is too bulky for the target system.
- Therefore usually a debugger on the host system connects to an on-target
- debugging stub which accepts only primitive commands.
-
-\newline
-Terms to enter into your favourite search engine could be 'remote debugging',
- 'gdb stub' or 'inferior debugger'.
- (is there one?)
-\layout Itemize
+\begin_layout Standard
+8.71 / 40.65 ms
+\end_layout
-use an on target hardware debugger.
- Some of the more modern MCUs include hardware support for setting break
- points and monitoring/changing variables by using dedicated hardware pins.
- This facility doesn't require additional code to run on the target and
-
-\emph on
-usually
-\emph default
- doesn't affect runtime behaviour until a breakpoint is hit.
- For the mcs51 most hardware debuggers use the AOMF
-\begin_inset LatexCommand \index{AOMF, AOMF51}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0.40 / 0.40 ms
+\end_layout
- file (see
-\begin_inset LatexCommand \ref{OMF file}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+0.40 / 0.40 ms
+\end_layout
-) as input file.
-
-\layout Standard
+\end_inset
+
+
+\begin_inset Text
-Last not least:
-\layout Itemize
+\begin_layout Standard
+-
+\end_layout
-if you are not familiar with any of the following terms you're likely to
- run into problems rather sooner than later:
-\emph on
-volatile
-\emph default
-,
-\emph on
-atomic
-\emph default
-,
-\emph on
-memory map
-\emph default
-,
-\emph on
-overlay
-\emph default
-.
- As an embedded programmer you
-\emph on
-have
-\emph default
- to know them so why not look them up
-\emph on
-before
-\emph default
- you have problems?)
-\layout Itemize
+\end_inset
+
+
+
+
+\begin_inset Text
-tell someone else about your problem (actually this is a surprisingly effective
- means to hunt down the bug even if the listener is not familiar with your
- environment).
- As 'failure to communicate' is probably one of the job-induced deformations
- of an embedded programmer this is highly encouraged.
-\layout Section
+\begin_layout Standard
+float speed
+\begin_inset Foot
+status collapsed
-Debugging with SDCDB
-\begin_inset LatexCommand \label{cha:Debugging-with-SDCDB}
+\begin_layout Standard
+Execution time of printf("%.3f", -12345.678); standard 8051 @ 22.1184 MHz,
+ empty putchar()
+\end_layout
-\end_inset
+\end_inset
+,
+\end_layout
-\begin_inset LatexCommand \index{SDCDB (debugger)}
+\begin_layout Standard
+small / large
+\end_layout
-\end_inset
+\end_inset
+
+
+\begin_inset Text
-
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-SDCC is distributed with a source level debugger
-\begin_inset LatexCommand \index{Debugger}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+7.49 / 22.47 ms
+\end_layout
-.
- The debugger uses a command line interface, the command repertoire of the
- debugger has been kept as close to gdb
-\begin_inset LatexCommand \index{gdb}
+\end_inset
+
+
+\begin_inset Text
-\end_inset
+\begin_layout Standard
+-
+\end_layout
- (the GNU debugger) as possible.
- The configuration and build process is part of the standard compiler installati
-on, which also builds and installs the debugger in the target directory
- specified during configuration.
- The debugger allows you debug BOTH at the C source and at the ASM source
- level.
-\layout Subsection
+\end_inset
+
+
+\begin_inset Text
-Compiling for Debugging
-\layout Standard
+\begin_layout Standard
+-
+\end_layout
-The -
-\begin_inset ERT
-status Collapsed
+\end_inset
+
+
+\begin_inset Text
-\layout Standard
+\begin_layout Standard
+1.04 / 1.04 ms
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
+
+
+\begin_inset Text
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+\begin_layout Standard
+-
+\end_layout
-\end_inset
+\end_inset
+
+
+
- option must be specified for all files for which debug information is to
- be generated.
- The compiler generates a .adb file for each of these files.
- The linker creates the .cdb
-\begin_inset LatexCommand \index{.cdb}
+\end_inset
-\end_inset
- file from the .adb
-\begin_inset LatexCommand \index{.adb}
+\end_layout
-\end_inset
+\begin_layout Subsubsection
+
+\begin_inset LatexCommand index
+name "malloc.h"
- files and the address information.
- This .cdb is used by the debugger.
-\layout Subsection
+\end_inset
-How the Debugger Works
-\layout Standard
-When the -
-\begin_inset ERT
-status Collapsed
+\end_layout
-\layout Standard
+\begin_layout Standard
+As of SDCC 2.6.2 you no longer need to call an initialization routine before
+ using dynamic memory allocation
+\begin_inset LatexCommand index
+name "dynamic memory allocation (malloc)"
-\backslash
-/
-\end_inset
+\end_inset
--debug option is specified the compiler generates extra symbol information
- some of which are put into the assembler source and some are put into the
- .adb file.
- Then the linker creates the .cdb file from the individual .adb files with
- the address information for the symbols.
- The debugger reads the symbolic information generated by the compiler &
- the address information generated by the linker.
- It uses the SIMULATOR (Daniel's S51) to execute the program, the program
- execution is controlled by the debugger.
- When a command is issued for the debugger, it translates it into appropriate
- commands for the simulator.
- (Currently SDCDM only connects to the simulator but
-\emph on
-newcdb
-\emph default
- at
-\begin_inset LatexCommand \url{http://ec2drv.sf.net/}
+ and a default heap
+\begin_inset LatexCommand index
+name "heap (malloc)"
-\end_inset
+\end_inset
- is an effort to connect directly to the hardware.)
-\layout Subsection
+ space of 1024 bytes is provided for malloc to allocate memory from.
+ If you need a different heap size you need to recompile _heap.c with the
+ required size defined in HEAP_SIZE.
+ It is recommended to make a copy of this file into your project directory
+ and compile it there with:
+\end_layout
-Starting the Debugger SDCDB
-\layout Standard
+\begin_layout Verse
-The debugger can be started using the following command line.
- (Assume the file you are debugging has the file name foo).
-\newline
+\family typewriter
+sdcc -c _heap.c -D HEAP_SIZE=2048
+\end_layout
-\newline
+\begin_layout Standard
+And then link it with:
+\end_layout
-\family sans
-\series bold
-sdcdb foo
-\newline
+\begin_layout Verse
-\family default
-\series default
+\family typewriter
+sdcc main.rel _heap.rel
+\end_layout
-\newline
-The debugger will look for the following files.
-\layout Itemize
+\begin_layout Subsection
+Math functions (sinf, powf, sqrtf etc.)
+\end_layout
-foo.c - the source file.
-\layout Itemize
+\begin_layout Subsubsection
+
+\end_layout
-foo.cdb - the debugger symbol information file.
-\layout Itemize
+\begin_layout Standard
+See definitions in file .
+\end_layout
-foo.ihx - the Intel hex format
-\begin_inset LatexCommand \index{Intel hex format}
+\begin_layout Subsection
+Other libraries
+\end_layout
-\end_inset
+\begin_layout Standard
+Libraries
+\begin_inset LatexCommand index
+name "Libraries"
- object file.
-\layout Subsection
+\end_inset
-SDCDB Command Line Options
-\layout Itemize
+ included in SDCC should have a license at least as liberal as the GNU Lesser
+ General Public License
+\begin_inset LatexCommand index
+name "GNU Lesser General Public License, LGPL"
--
-\begin_inset ERT
-status Collapsed
+\end_inset
-\layout Standard
+
+\emph on
+LGPL
+\emph default
+.
+\end_layout
-\backslash
-/
-\end_inset
-
--directory= this option can used to specify the directory
- search list.
- The debugger will look into the directory list specified for source, cdb
- & ihx files.
- The items in the directory list must be separated by ':', e.g.
- if the source files can be in the directories /home/src1 and /home/src2,
- the -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash
-/
-\end_inset
+\begin_layout Standard
+\begin_inset Note Note
+status collapsed
--directory option should be -
-\begin_inset ERT
-status Collapsed
+\begin_layout Standard
+license statements for the libraries are missing.
+ sdcc/device/lib/ser_ir.c
+\end_layout
-\layout Standard
+\begin_layout Standard
+or _decdptr f.e.
+ come with a GPL (as opposed to LGPL) License - this will not be liberal
+ enough for many embedded programmers.
+\end_layout
-\backslash
-/
-\end_inset
+\end_inset
--directory=/home/src1:/home/src2.
- Note there can be no spaces in the option.
-
-\layout Itemize
--cd - change to the .
-\layout Itemize
+\end_layout
--fullname - used by GUI front ends.
-\layout Itemize
+\begin_layout Standard
+If you have ported some library or want to share experience about some code
+ which f.e.
+ falls into any of these categories Busses (I
+\begin_inset Formula $^{\textrm{2}}$
+\end_inset
--cpu - this argument is passed to the simulator please see the
- simulator docs for details.
-\layout Itemize
+C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory
+ cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel,
+ Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list
+\begin_inset LatexCommand url
+target "http://sourceforge.net/mail/?group_id=599"
--X this options is passed to the simulator please see
- the simulator docs for details.
-\layout Itemize
+\end_inset
--s passed to simulator see the simulator docs for details.
-\layout Itemize
+\InsetSpace ~
+would certainly like to hear about it.
+\end_layout
--S passed to simulator see the simulator docs for details.
-\layout Itemize
+\begin_layout Standard
+Programmers coding for embedded systems are not especially famous for being
+ enthusiastic, so don't expect a big hurray but as the mailing list is searchabl
+e these references are very valuable.
+ Let's help to create a climate where information is shared.
+\begin_inset VSpace bigskip
+\end_inset
--k passed to simulator see the simulator docs for details.
-\layout Subsection
-SDCDB Debugger Commands
-\layout Standard
+\end_layout
-As mentioned earlier the command interface for the debugger has been deliberatel
-y kept as close the GNU debugger gdb, as possible.
- This will help the integration with existing graphical user interfaces
- (like ddd, xxgdb or xemacs) existing for the GNU debugger.
- If you use a graphical user interface for the debugger you can skip this
- section.
-\layout Subsubsection*
+\begin_layout Section
+Memory Models
+\end_layout
-break [line | file:line | function | file:function]
-\layout Standard
+\begin_layout Subsection
+MCS51 Memory Models
+\begin_inset LatexCommand index
+name "Memory model"
-Set breakpoint at specified line or function:
-\newline
+\end_inset
-\newline
-\family sans
-\series bold
-sdcdb>break 100
-\newline
-sdcdb>break foo.c:100
-\newline
-sdcdb>break funcfoo
-\newline
-sdcdb>break foo.c:funcfoo
-\layout Subsubsection*
+\begin_inset LatexCommand index
+name "MCS51 memory model"
-clear [line | file:line | function | file:function ]
-\layout Standard
+\end_inset
-Clear breakpoint at specified line or function:
-\newline
-\newline
+\end_layout
-\family sans
-\series bold
-sdcdb>clear 100
-\newline
-sdcdb>clear foo.c:100
-\newline
-sdcdb>clear funcfoo
-\newline
-sdcdb>clear foo.c:funcfoo
-\layout Subsubsection*
+\begin_layout Subsubsection
+Small, Medium and Large
+\end_layout
-continue
-\layout Standard
+\begin_layout Standard
+SDCC allows three memory models for MCS51 code,
+\shape slanted
+small, medium
+\shape default
+ and
+\shape slanted
+large
+\shape default
+.
+ Modules compiled with different memory models should
+\emph on
+never
+\emph default
+ be combined together or the results would be unpredictable.
+ The library routines supplied with the compiler are compiled as small,
+ medium and large.
+ The compiled library modules are contained in separate directories as small,
+ medium and large so that you can link to the appropriate set.
+\end_layout
-Continue program being debugged, after breakpoint.
-\layout Subsubsection*
+\begin_layout Standard
+When the medium or large model is used all variables declared without a
+ storage class will be allocated into the external ram, this includes all
+ parameters and local variables (for non-reentrant
+\begin_inset LatexCommand index
+name "reentrant"
-finish
-\layout Standard
+\end_inset
-Execute till the end of the current function.
-\layout Subsubsection*
+ functions).
+ When the small model is used variables without storage class are allocated
+ in the internal ram.
+\end_layout
-delete [n]
-\layout Standard
+\begin_layout Standard
+Judicious usage of the processor specific storage classes
+\begin_inset LatexCommand index
+name "Storage class"
-Delete breakpoint number 'n'.
- If used without any option clear ALL user defined break points.
-\layout Subsubsection*
+\end_inset
-info [break | stack | frame | registers ]
-\layout Itemize
+ and the 'reentrant' function type will yield much more efficient code,
+ than using the large model.
+ Several optimizations are disabled when the program is compiled using the
+ large model, it is therefore recommended that the small model be used unless
+ absolutely required.
+\end_layout
-info break - list all breakpoints
-\layout Itemize
+\begin_layout Subsubsection
+External Stack
+\begin_inset LatexCommand label
+name "sub:External-Stack"
-info stack - show the function call stack.
-\layout Itemize
+\end_inset
-info frame - show information about the current execution frame.
-\layout Itemize
-info registers - show content of all registers.
-\layout Subsubsection*
+\begin_inset LatexCommand index
+name "stack"
-step
-\layout Standard
+\end_inset
-Step program until it reaches a different source line.
- Note: pressing repeats the last command.
-\layout Subsubsection*
-next
-\layout Standard
+\begin_inset LatexCommand index
+name "External stack (mcs51)"
-Step program, proceeding through subroutine calls.
-\layout Subsubsection*
+\end_inset
-run
-\layout Standard
-Start debugged program.
-\layout Subsubsection*
+\end_layout
-ptype variable
-\layout Standard
+\begin_layout Standard
+The external stack (-
+\begin_inset ERT
+status collapsed
-Print type information of the variable.
-\layout Subsubsection*
+\begin_layout Standard
-print variable
-\layout Standard
-print value of variable.
-\layout Subsubsection*
+\backslash
+/
+\end_layout
-file filename
-\layout Standard
+\end_inset
-load the given file name.
- Note this is an alternate method of loading file for debugging.
-\layout Subsubsection*
+-xstack option
+\begin_inset LatexCommand index
+name "-\\/-xstack"
-frame
-\layout Standard
+\end_inset
-print information about current frame.
-\layout Subsubsection*
+) is located in pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
-set srcmode
-\layout Standard
+\end_inset
-Toggle between C source & assembly source.
-\layout Subsubsection*
+ memory (usually at the start of the external ram segment) and uses all
+ unused space in pdata (max.
+ 256 bytes).
+ When -
+\begin_inset ERT
+status collapsed
-! simulator command
-\layout Standard
+\begin_layout Standard
-Send the string following '!' to the simulator, the simulator response is
- displayed.
- Note the debugger does not interpret the command being sent to the simulator,
- so if a command like 'go' is sent the debugger can loose its execution
- context and may display incorrect values.
-\layout Subsubsection*
-quit
-\layout Standard
+\backslash
+/
+\end_layout
-"Watch me now.
- Iam going Down.
- My name is Bobby Brown"
-\layout Subsection
+\end_inset
-Interfacing SDCDB with DDD
-\layout Comment
+-xstack option is used to compile the program, the parameters and local
+ variables
+\begin_inset LatexCommand index
+name "local variables"
-The screenshot was converted from png to eps with:
-\begin_inset Quotes sld
-\end_inset
+\end_inset
-bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps
-\begin_inset Quotes srd
-\end_inset
+ of all reentrant functions are allocated in this area.
+ This option is provided for programs with large stack space requirements.
+ When used with the -
+\begin_inset ERT
+status collapsed
- which produces a pretty compact eps file which is free from compression
- artifacts.
-\layout Comment
+\begin_layout Standard
-The screenshot was included in sdccman.lyx cvs version 1.120 but later removed
- as this broke the build system on Sourceforge (pdf-file was broken.
- pdflatex does not accept eps files).
-\layout Standard
-The
-\emph on
-p
-\emph default
-ortable
-\emph on
-n
-\emph default
-etwork
-\emph on
-g
-\emph default
-raphics File
-\size footnotesize
+\backslash
+/
+\end_layout
-\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png}
+\end_inset
-\end_inset
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
+\end_inset
-\size default
- shows a screenshot of a debugging session with DDD
-\begin_inset LatexCommand \index{DDD (debugger)}
+ option, all parameters and local variables are allocated on the external
+ stack (note: support libraries will need to be recompiled with the same
+ options.
+ There is a predefined target in the library makefile).
+\end_layout
-\end_inset
+\begin_layout Standard
+The compiler outputs the higher order address byte of the external ram segment
+ into port P2
+\begin_inset LatexCommand index
+name "P2 (mcs51 sfr)"
- (Unix only) on a simulated 8032.
- The debugging session might not run as smoothly as the screenshot suggests.
- The debugger allows setting of breakpoints, displaying and changing variables,
- single stepping through C and assembler code.
-
-\newline
-The source was compiled with
-\family sans
-\series bold
+\end_inset
-\newline
+ (see also section
+\begin_inset LatexCommand ref
+reference "sub:MCS51-variants"
-\newline
-sdcc -
-\family default
-\series default
+\end_inset
-\begin_inset ERT
-status Collapsed
+), therefore when using the External Stack option, this port
+\emph on
+may not
+\emph default
+ be used by the application program.
+\end_layout
-\layout Standard
+\begin_layout Subsection
+DS390 Memory Model
+\begin_inset LatexCommand index
+name "Memory model"
-\backslash
-/
-\end_inset
+\end_inset
-\family sans
-\series bold
--debug ddd_example.c
-\family default
-\series default
-
-\family sans
-\series bold
+\begin_inset LatexCommand index
+name "DS390 memory model"
-\newline
+\end_inset
-\family default
-\series default
-\newline
-and DDD was invoked with
-\family sans
-\series bold
+\end_layout
-\newline
+\begin_layout Standard
+The only model supported is Flat 24
+\begin_inset LatexCommand index
+name "Flat 24 (DS390 memory model)"
-\newline
-ddd -debugger 'sdcdb -cpu 8032 ddd_example'
-\layout Subsection
+\end_inset
-Interfacing SDCDB with XEmacs
-\begin_inset LatexCommand \index{XEmacs}
+.
+ This generates code for the 24 bit contiguous addressing mode of the Dallas
+ DS80C390 part.
+ In this mode, up to four meg of external RAM or code space can be directly
+ addressed.
+ See the data sheets at www.dalsemi.com for further information on this part.
+\newline
-\end_inset
+\newline
+Note
+ that the compiler does not generate any code to place the processor into
+ 24 bitmode (although
+\emph on
+tinibios
+\emph default
+ in the ds390 libraries will do that for you).
+ If you don't use
+\emph on
+tinibios
+\emph default
+\begin_inset LatexCommand index
+name "Tinibios (DS390)"
-\begin_inset LatexCommand \index{Emacs}
+\end_inset
-\end_inset
+, the boot loader or similar code must ensure that the processor is in 24
+ bit contiguous addressing mode before calling the SDCC startup code.
+\newline
+\newline
+Like
+ the
+\emph on
+-
+\begin_inset ERT
+status collapsed
-\layout Standard
+\begin_layout Standard
-Two files (in emacs lisp) are provided for the interfacing with XEmacs,
- sdcdb.el and sdcdbsrc.el.
- These two files can be found in the $(prefix)/bin directory after the installat
-ion is complete.
- These files need to be loaded into XEmacs for the interface to work.
- This can be done at XEmacs startup time by inserting the following into
- your '.xemacs' file (which can be found in your HOME directory):
-\newline
-\newline
+\backslash
+/
+\end_layout
-\family typewriter
-(load-file sdcdbsrc.el)
-\family default
+\end_inset
-\newline
+-model-large
+\emph default
+ option, variables will by default be placed into the XDATA segment.
+
+\newline
-\newline
-.xemacs is a lisp file so the () around the command is REQUIRED.
- The files can also be loaded dynamically while XEmacs is running, set the
- environment variable 'EMACSLOADPATH' to the installation bin directory
- (/bin), then enter the following command ESC-x load-file sdcdbsrc.
- To start the interface enter the following command:
-\newline
+\newline
+Segments may be placed anywhere in the 4 meg address space using the usual
+ -
+\begin_inset ERT
+status collapsed
-\newline
+\begin_layout Standard
-\family sans
-\series bold
-ESC-x sdcdbsrc
-\family default
-\series default
-\newline
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-*-loc options.
+ Note that if any segments are located above 64K, the -r flag must be passed
+ to the linker to generate the proper segment relocations, and the Intel
+ HEX output format must be used.
+ The -r flag can be passed to the linker by using the option
+\emph on
+-Wl-r
+\emph default
+ on the SDCC command line.
+ However, currently the linker can not handle code segments > 64k.
+\end_layout
+
+\begin_layout Section
+Pragmas
+\begin_inset LatexCommand label
+name "sec:Pragmas"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "Pragmas"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Pragmas are used to turn on and/or off certain compiler options.
+ Some of them are closely related to corresponding command-line options
+ (see section
+\begin_inset LatexCommand vref
+reference "sec:Command-Line-Options"
+
+\end_inset
+
+).
+\newline
+Pragmas should be placed before and/or after a function, placing pragmas
+ inside a function body could have unpredictable results.
+\newline
+
+\newline
+SDCC supports the
+ following #pragma directives:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+save
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma save"
+
+\end_inset
+
+ - this will save most current options to the save/restore stack.
+ See #pragma\InsetSpace ~
+restore.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+restore
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma restore"
+
+\end_inset
+
+ - will restore saved options from the last save.
+ saves & restores can be nested.
+ SDCC uses a save/restore stack: save pushes current options to the stack,
+ restore pulls current options from the stack.
+ See #pragma\InsetSpace ~
+save.
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+callee_saves
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma callee\\_saves"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "function prologue"
+
+\end_inset
+
+ function1[,function2[,function3...]]
+\begin_inset LatexCommand label
+name "ite:callee_saves-function1[,function2[,function3...]]--"
+
+\end_inset
+
+- The compiler by default uses a caller saves convention for register saving
+ across function calls, however this can cause unnecessary register pushing
+ and popping
+\begin_inset LatexCommand index
+name "push/pop"
+
+\end_inset
+
+ when calling small functions from larger functions.
+ This option can be used to switch off the register saving convention for
+ the function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code need to be manually inserted at the entry and exit for these functions
+ to save and restore the registers used by these functions, this can SUBSTANTIAL
+LY reduce code and improve run time performance of the generated code.
+ In the future the compiler (with inter procedural analysis) may be able
+ to determine the appropriate scheme to use for each function call.
+ If -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-callee-saves command line option is used (see page
+\begin_inset LatexCommand vpageref
+reference "lyx:--callee-saves-function1[,function2][,function3]..."
+
+\end_inset
+
+), the function names specified in #pragma\InsetSpace ~
+callee_saves
+\begin_inset LatexCommand index
+name "\\#pragma callee\\_saves"
+
+\end_inset
+
+ is appended to the list of functions specified in the command line.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+exclude
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma exclude"
+
+\end_inset
+
+ none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation
+ of pairs of push/pop
+\begin_inset LatexCommand index
+name "push/pop"
+
+\end_inset
+
+ instructions in
+\emph on
+I
+\emph default
+nterrupt
+\begin_inset LatexCommand index
+name "interrupt"
+
+\end_inset
-\newline
-You will prompted to enter the file name to be debugged.
-\newline
+\emph on
+S
+\emph default
+ervice
+\emph on
+R
+\emph default
+outines.
+ The directive should be placed immediately before the ISR function definition
+ and it affects ALL ISR functions following it.
+ To enable the normal register saving for ISR functions use #pragma\InsetSpace ~
+exclude\InsetSpace ~
+none
+\begin_inset LatexCommand index
+name "\\#pragma exclude"
-\newline
-The command line options that are passed to the simulator directly are bound
- to default values in the file sdcdbsrc.el.
- The variables are listed below, these values maybe changed as required.
-\layout Itemize
+\end_inset
-sdcdbsrc-cpu-type '51
-\layout Itemize
+.
+ See also the related keyword _naked
+\begin_inset LatexCommand index
+name "\\_naked"
-sdcdbsrc-frequency '11059200
-\layout Itemize
+\end_inset
-sdcdbsrc-serial nil
-\layout Standard
-The following is a list of key mapping for the debugger interface.
-\layout Standard
+\begin_inset LatexCommand index
+name "\\_\\_naked"
+
+\end_inset
-\SpecialChar ~
+.
+\end_layout
-\family typewriter
+\begin_layout Itemize
-\newline
-;;\SpecialChar ~
-Current Listing ::
-\newline
-;;key\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-binding\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Comment
-\newline
-;;---\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
--------\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
--------
-\newline
-;;
-\newline
-;;\SpecialChar ~
-n\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-next-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB next command
-\newline
-;;\SpecialChar ~
-b\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-back-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB back command
-\newline
-;;\SpecialChar ~
-c\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-cont-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB continue command
-\newline
-;;\SpecialChar ~
-s\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-step-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB step command
-\newline
-;;\SpecialChar ~
-?\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-whatis-c-sexp\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB ptypecommand for data at
-\newline
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-buffer point
-\newline
-;;\SpecialChar ~
-x\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdbsrc-delete\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB Delete all breakpoints if no arg
-\newline
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-given or delete arg (C-u arg x)
-\newline
-;;\SpecialChar ~
-m\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdbsrc-frame\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB Display current frame if no arg,
-\newline
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-given or display frame arg
-\newline
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-buffer point
-\newline
-;;\SpecialChar ~
-!\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdbsrc-goto-sdcdb\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Goto the SDCDB output buffer
-\newline
-;;\SpecialChar ~
-p\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcdb-print-c-sexp\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB print command for data at
-\newline
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+\series bold
+less_pedantic
+\series default
+
+\begin_inset LatexCommand index
+name "pedantic"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "\\#pragma less\\_pedantic"
+
+\end_inset
+
+
+\begin_inset LatexCommand label
+name "ite:less_pedantic"
+
+\end_inset
+
+- the compiler will not warn you anymore for obvious mistakes, you're on
+ your own now ;-( .
+ See also the command line option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-less-pedantic
+\begin_inset LatexCommand vpageref
+reference "lyx:--less-pedantic"
+
+\end_inset
+
+.
+
+\newline
+More specifically, the following warnings will be disabled:
+\shape italic
+comparison is always [true/false] due to limited range of data type
+\shape default
+ (94);
+\shape italic
+overflow in implicit constant conversion
+\shape default
+ (158); [the (in)famous]
+\shape italic
+conditional flow changed by optimizer: so said EVELYN the modified DOG
+\shape default
+ (110);
+\shape italic
+function '[function name]' must return value
+\shape default
+ (59).
+
+\newline
+Furthermore, warnings of less importance (of PEDANTIC and INFO warning
+ level) are disabled, too, namely:
+\shape italic
+constant value '[
+\begin_inset Note Note
+status collapsed
+
+\begin_layout Standard
+dunno what comes here - this warning appears to be unused altogether
+\end_layout
+
+\end_inset
+
+]', out of range
+\shape default
+ (81);
+\shape italic
+[left/right] shifting more than size of object changed to zero
+\shape default
+ (116);
+\shape italic
+unreachable code
+\shape default
+ (126);
+\shape italic
+integer overflow in expression
+\shape default
+ (165);
+\shape italic
+unmatched #pragma save and #pragma restore
+\shape default
+ (170);
+\shape italic
+comparison of 'signed char' with 'unsigned char' requires promotion to int
+\shape default
+ (185);
+\shape italic
+ISO C90 does not support flexible array members
+\shape default
+ (187);
+\shape italic
+extended stack by [number] bytes for compiler temp(s) :in function '[function\InsetSpace ~
+nam
+e]':\InsetSpace ~
+[
+\begin_inset Note Note
+status collapsed
+
+\begin_layout Standard
+appears to be always blank - what was supposed to be here?
+\end_layout
+
+\end_inset
+
+]
+\shape default
+ (114);
+\shape italic
+function '[function name]', # edges [number] , # nodes [number] , cyclomatic
+ complexity [number]
+\shape default
+ (121).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+disable_warning
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma disable\\_warning"
+
+\end_inset
+
+ - the compiler will not warn you anymore about warning number .
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+nogcse
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma nogcse"
+
+\end_inset
+
+ - will stop global common subexpression elimination.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noinduction
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noinduction"
+
+\end_inset
+
+ - will stop loop induction optimizations.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noinvariant
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noinvariant"
+
+\end_inset
+
+ - will not do loop invariant optimizations.
+ For more details see Loop Invariants in section
+\begin_inset LatexCommand ref
+reference "sub:Loop-Optimizations"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noiv
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noiv"
+
+\end_inset
+
+ - Do not generate interrupt
+\begin_inset LatexCommand index
+name "interrupt"
+
+\end_inset
+
+ vector table
+\begin_inset LatexCommand index
+name "interrupt vector table"
+
+\end_inset
+
+ entries for all ISR functions defined after the pragma.
+ This is useful in cases where the interrupt vector table must be defined
+ manually, or when there is a secondary, manually defined interrupt vector
+ table (e.g.
+ for the autovector feature of the Cypress EZ-USB FX2).
+ More elegantly this can be achieved by omitting the optional interrupt
+ number after the interrupt keyword, see section
+\begin_inset LatexCommand ref
+reference "sub:Interrupt-Service-Routines"
+
+\end_inset
+
+\InsetSpace ~
+about interrupts.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+nojtbound
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma nojtbound"
+
+\end_inset
+
+ - will not generate code for boundary value checking, when switch statements
+ are turned into jump-tables (dangerous).
+ For more details see section
+\begin_inset LatexCommand ref
+reference "sub:'switch'-Statements"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noloopreverse
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noloopreverse"
+
+\end_inset
+
+ - Will not do loop reversal optimization
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+nooverlay
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma nooverlay"
+
+\end_inset
+
+ - the compiler will not overlay the parameters and local variables of a
+ function.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+stackauto
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma stackauto"
+
+\end_inset
+
+- See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
+
+\end_inset
+
+ and section
+\begin_inset LatexCommand ref
+reference "sec:Parameters-and-Local-Variables"
+
+\end_inset
+
+ Parameters and Local Variables.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+opt_code_speed
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma opt\\_code\\_speed"
+
+\end_inset
+
+- The compiler will optimize code generation towards fast code, possibly
+ at the expense of code size.
+ Currently this has little effect.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+opt_code_size
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma opt\\_code\\_size"
+
+\end_inset
+
+- The compiler will optimize code generation towards compact code, possibly
+ at the expense of code speed.
+ Currently this has little effect.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+opt_code_balanced
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma opt\\_code\\_balanced"
+
+\end_inset
+
+- The compiler will attempt to generate code that is both compact and fast,
+ as long as meeting one goal is not a detriment to the other (this is the
+ default).
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_sdcc89
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_sdcc89"
+
+\end_inset
+
+- Generally follow the C89 standard, but allow SDCC features that conflict
+ with the standard (default).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_c89
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_c89"
+
+\end_inset
+
+- Follow the C89 standard and disable SDCC features that conflict with the
+ standard.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_sdcc99
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_sdcc99"
+
+\end_inset
+
+- Generally follow the C99 standard, but allow SDCC features that conflict
+ with the standard (incomplete support).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_c99
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_c99"
+
+\end_inset
+
+- Follow the C99 standard and disable SDCC features that conflict with the
+ standard (incomplete support).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+codeseg
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma codeseg"
+
+\end_inset
+
+- Use this name (max.
+ 8 characters) for the code segment.
+ See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-codeseg.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+constseg
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma constseg"
+
+\end_inset
+
+- Use this name (max.
+ 8 characters) for the const segment.
+ See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-constseg.
+\end_layout
+
+\begin_layout Standard
+The preprocessor SDCPP
+\begin_inset LatexCommand index
+name "sdcpp (preprocessor)"
+
+\end_inset
+
+ supports the following #pragma directives:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+pedantic_parse_number
+\series default
+
+\begin_inset LatexCommand index
+name "pedantic"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "\\#pragma pedantic\\_parse\\_number"
+
+\end_inset
+
+ (+ | -)
+\begin_inset LatexCommand label
+name "ite:pedantic_parse_number"
+
+\end_inset
+
+- Pedantic parse numbers so that situations like 0xfe-LO_B(3) are parsed
+ properly and the macro LO_B(3) gets expanded.
+ Default is off.
+ See also the -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-pedantic-parse-number command line option
+\begin_inset LatexCommand vpageref
+reference "lyx:-pedantic-parse-number"
+
+\end_inset
+
+.
+
+\newline
+Below is an example on how to use this pragma.
+
+\emph on
+Note: this functionality is not in conformance with standard!
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma pedantic_parse_number +
+\begin_inset LatexCommand index
+name "\\#pragma pedantic\\_parse\\_number"
+
+\end_inset
+
+
+\newline
+
+\newline
+#define LO_B(x) ((x) & 0xff)
+\newline
+
+\newline
+unsigned char foo(void)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+unsigned char c=0xfe-LO_B(3)
+;
+\newline
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return c;
+\newline
+}
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+preproc_asm
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma preproc\\_asm"
+
+\end_inset
+
+ (+ | -) - switch _asm _endasm block preprocessing on / off.
+ Default is on.
+ You use this pragma to define multilines of assembly code.
+ This will prevent the preprocessor from changing the formatting required
+ by assembly code.
+ Below is an example on how to use this pragma.
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma preproc_asm -
+\begin_inset LatexCommand index
+name "\\#pragma preproc\\_asm"
+
+\end_inset
+
+
+\newline
+#define MYDELAY _asm
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop ;my assembly comment...
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop
+\newline
+_endasm
+\newline
+#pragma preproc_asm
+ +
+\newline
+
+\newline
+void foo (void)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ ...
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ MYDELAY;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ ...
+
+\newline
+}
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+sdcc_hash
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma sdcc\\_hash"
+
+\end_inset
+
+ (+ | -) - Allow "naked" hash in macro definition, for example:
+\newline
+
+\family typewriter
+#define DIR_LO(x) #(x & 0xff)
+\family default
+
+\newline
+Default is off.
+ Below is an example on how to use this pragma.
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma preproc_asm +
+\newline
+#pragma sdcc_hash +
+\begin_inset LatexCommand index
+name "\\#pragma sdcc\\_hash"
+
+\end_inset
+
+
+\newline
+
+\newline
+#define ROMCALL(x)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov R6_B3, #(x & 0xff)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov R7_B3, #((x >> 8) & 0xff)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+lcall __romcall
+\newline
+
+\newline
+...
+\newline
+_asm
+\newline
+ROMCALL(72)
+\newline
+_endasm;
+\newline
+...
+\newline
+
+\end_layout
+
+\begin_layout Standard
+Some of the pragmas are intended to be used to turn-on or off certain optimizati
+ons which might cause the compiler to generate extra stack and/or data space
+ to store compiler generated temporary variables.
+ This usually happens in large functions.
+ Pragma directives should be used as shown in the following example, they
+ are used to control options and optimizations for a given function.
+
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma save
+\begin_inset LatexCommand index
+name "\\#pragma save"
+
+\end_inset
+
+ \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* save the current settings */
+\newline
+#pragma nogcse
+\begin_inset LatexCommand index
+name "\\#pragma nogcse"
+
+\end_inset
+
+ \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* turnoff global subexpression elimination */
+\newline
+#pragma noinduction
+\begin_inset LatexCommand index
+name "\\#pragma noinduction"
+
+\end_inset
+
+ /* turn off induction optimizations */
+\newline
+int foo ()
+\newline
+{
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ ...
+
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ /* large code */
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ ...
+
+\newline
+}
+\newline
+#pragma restore
+\begin_inset LatexCommand index
+name "\\#pragma restore"
+
+\end_inset
+
+ /* turn the optimizations back on */
+\end_layout
+
+\begin_layout Standard
+The compiler will generate a warning message when extra space is allocated.
+ It is strongly recommended that the save and restore pragmas be used when
+ changing options for a function.
+\newline
+
+\newline
+
+\newline
+
+\end_layout
+
+\begin_layout Section
+Defines Created by the Compiler
+\end_layout
+
+\begin_layout Standard
+The compiler creates the following #defines
+\begin_inset LatexCommand index
+name "\\#defines"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "Defines created by the compiler"
+
+\end_inset
+
+:
+\newline
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+
+
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+#define
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC
+\begin_inset LatexCommand index
+name "SDCC"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+Always defined.
+ Since version 2.5.6 the version number as an int (ex.
+ 256)
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_mcs51
+\begin_inset LatexCommand index
+name "SDCC\\_mcs51"
+
+\end_inset
+
+ or SDCC_ds390
+\begin_inset LatexCommand index
+name "SDCC\\_ds390"
+
+\end_inset
+
+ or SDCC_z80
+\begin_inset LatexCommand index
+name "SDCC\\_z80"
+
+\end_inset
+
+, etc.
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+depending on the model used (e.g.: -mds390)
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+__mcs51
+\begin_inset LatexCommand index
+name "\\_\\_mcs51"
+
+\end_inset
+
+, __ds390
+\begin_inset LatexCommand index
+name "\\_\\_ds390"
+
+\end_inset
+
+, __hc08
+\begin_inset LatexCommand index
+name "\\_\\_hc08"
+
+\end_inset
+
+, __z80
+\begin_inset LatexCommand index
+name "\\_\\_z80"
+
+\end_inset
+
+, etc
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+depending on the model used (e.g.
+ -mz80)
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_STACK_AUTO
+\begin_inset LatexCommand index
+name "SDCC\\_STACK\\_AUTO"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-auto
+\emph default
+ option is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_SMALL
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_SMALL"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-small
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_MEDIUM
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_MEDIUM"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-medium
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_LARGE
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_LARGE"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-large
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_USE_XSTACK
+\begin_inset LatexCommand index
+name "SDCC\\_USE\\_XSTACK"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-xstack
+\emph default
+ option is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_STACK_TENBIT
+\begin_inset LatexCommand index
+name "SDCC\\_STACK\\_TENBIT"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-mds390
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_FLAT24
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_FLAT24"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-mds390
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_REVISION
+\begin_inset LatexCommand index
+name "SDCC\\_REVISION"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+Always defined.
+ SDCC svn revision number
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_PARMS_IN_BANK1
+\begin_inset LatexCommand index
+name "SDCC\\_PARMS\\_IN\\_BANK1"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-parms-in-bank1
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_FLOAT_REENT
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_FLAT24"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-float-reent
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_INT_LONG_REENT
+\begin_inset LatexCommand index
+name "SDCC\\_INT\\_LONG\\_REENT"
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\begin_inset Text
+
+\begin_layout Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-int-long-reent
+\emph default
+ is used
+\end_layout
+
+\end_inset
+
+
+
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Notes on supported Processors
+\end_layout
+
+\begin_layout Section
+MCS51 variants
+\begin_inset LatexCommand label
+name "sub:MCS51-variants"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "MCS51 variants"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+MCS51 processors are available from many vendors and come in many different
+ flavours.
+ While they might differ considerably in respect to Special Function Registers
+ the core MCS51 is usually not modified or is kept compatible.
+
+\end_layout
+
+\begin_layout Subsection
+pdata access by SFR
+\end_layout
+
+\begin_layout Standard
+With the upcome of devices with internal xdata and flash memory devices
+ using port P2
+\begin_inset LatexCommand index
+name "P2 (mcs51 sfr)"
+
+\end_inset
+
+ as dedicated I/O port is becoming more popular.
+ Switching the high byte for pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
+
+\end_inset
+
+ access which was formerly done by port P2 is then achieved by a Special
+ Function Register
+\begin_inset LatexCommand index
+name "sfr"
+
+\end_inset
+
+.
+ In well-established MCS51 tradition the address of this
+\emph on
+sfr
+\emph default
+ is where the chip designers decided to put it.
+ Needless to say that they didn't agree on a common name either.
+ So that the startup code can correctly initialize xdata variables, you
+ should define an sfr with the name _XPAGE
+\family typewriter
+
+\begin_inset LatexCommand index
+name "\\_XPAGE (mcs51)"
+
+\end_inset
+
+
+\family default
+ at the appropriate location if the default, port P2, is not used for this.
+ Some examples are:
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+__sfr __at (0x85) _XPAGE; /* Ramtron VRS51 family a.k.a.
+ MPAGE */
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family, Texas Instruments (Chipcon)
+ a.k.a.
+ MPAGE */
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+__sfr __at (0x91) _XPAGE; /* Infineon (Siemens) C500 family a.k.a.
+ XPAGE */
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a.
+ EMI0CN */
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a.
+ EMI0CN */
+\end_layout
+
+\begin_layout Standard
+For more exotic implementations further customizations may be needed.
+ See section
+\begin_inset LatexCommand ref
+reference "sub:Startup-Code"
+
+\end_inset
+
+ for other possibilities.
+\end_layout
+
+\begin_layout Subsection
+Other Features available by SFR
+\end_layout
+
+\begin_layout Standard
+Some MCS51 variants offer features like Double DPTR
+\begin_inset LatexCommand index
+name "DPTR"
+
+\end_inset
+
+, multiple DPTR, decrementing DPTR, 16x16 Multiply.
+ These are currently not used for the MCS51 port.
+ If you absolutely need them you can fall back to inline assembly or submit
+ a patch to SDCC.
+\end_layout
+
+\begin_layout Subsection
+Bankswitching
+\end_layout
+
+\begin_layout Standard
+Bankswitching
+\begin_inset LatexCommand index
+name "Bankswitching"
+
+\end_inset
+
+ (a.k.a.
+ code banking
+\begin_inset LatexCommand index
+name "code banking"
+
+\end_inset
+
+) is a technique to increase the code space above the 64k limit of the 8051.
+\end_layout
+
+\begin_layout Subsubsection
+Hardware
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+
+
+
+
+
+
+
+