git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@5058
4a8a32a2-be11-0410-ad9d-
d568d2c75423
2008-02-28 Maarten Brock <sourceforge.brock AT dse.nl>
* src/mcs51/ralloc.c (fillGaps): fixed bug 1839671
2008-02-28 Maarten Brock <sourceforge.brock AT dse.nl>
* src/mcs51/ralloc.c (fillGaps): fixed bug 1839671
+ * doc/sdccman.lyx: fixed unmeant removal of spaces
2008-02-27 Borut Razem <borut.razem AT siol.net>
2008-02-27 Borut Razem <borut.razem AT siol.net>
linkcolor=blue] {hyperref}
%
\sloppy
linkcolor=blue] {hyperref}
%
\sloppy
-\tolerance=500
-\emergencystretch=30pt
+\tolerance=500
+\emergencystretch=30pt
\begin_layout Standard
into seperate sections/chapters/appendices (it is hard to document PIC or
\begin_layout Standard
into seperate sections/chapters/appendices (it is hard to document PIC or
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\size footnotesize
\newline
\size footnotesize
\newline
\newline
$Revision$
\end_layout
\newline
$Revision$
\end_layout
+C
+\emph default
+
+\emph on
+C
\emph default
ompiler) is free open source, retargettable, optimizing ANSI-C compiler
\emph default
ompiler) is free open source, retargettable, optimizing ANSI-C compiler
\series bold
Sandeep Dutta
\series default
\series bold
Sandeep Dutta
\series default
, an open source retargetable assembler & linker.
SDCC has extensive language extensions suitable for utilizing various microcont
rollers and underlying hardware effectively.
, an open source retargetable assembler & linker.
SDCC has extensive language extensions suitable for utilizing various microcont
rollers and underlying hardware effectively.
-In addition to the MCU specific
- optimizations SDCC also does a host of standard optimizations like:
+In addition to the MCU specific optimizations SDCC also does a host of
+ standard optimizations like:
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-global sub expression elimination,
+global sub expression elimination,
\end_layout
\begin_layout Itemize
loop optimizations (loop invariant, strength reduction of induction variables
\end_layout
\begin_layout Itemize
loop optimizations (loop invariant, strength reduction of induction variables
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-constant folding & propagation,
+constant folding & propagation,
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\emph on
switch
\emph default
\emph on
switch
\emph default
\begin_layout Standard
For the back-end SDCC uses a global register allocation scheme which should
be well suited for other 8 bit MCUs.
\begin_layout Standard
For the back-end SDCC uses a global register allocation scheme which should
be well suited for other 8 bit MCUs.
-The peep hole optimizer uses a rule
- based substitution mechanism which is MCU independent.
+The peep hole optimizer uses a rule based substitution mechanism which
+ is MCU independent.
+
-Supported data-types
- are:
+Supported data-types are:
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\family roman
\series medium
\shape up
\family roman
\series medium
\shape up
-The compiler also allows
+The compiler also allows
\emph on
inline assembler code
\emph default
\emph on
inline assembler code
\emph default
-cyclomatic) to report the relative complexity of a function.
These functions can then be further optimized, or hand coded in assembly
if needed.
-cyclomatic) to report the relative complexity of a function.
These functions can then be further optimized, or hand coded in assembly
if needed.
\newline
The latest SDCC version can be downloaded from
\newline
The latest SDCC version can be downloaded from
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
.
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
.
+
+\series bold
+
+\series default
\emph on
Please note: the compiler will probably always be some steps ahead of this
documentation
\emph on
Please note: the compiler will probably always be some steps ahead of this
documentation
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-All packages used in this compiler system are
+All packages used in this compiler system are
\emph on
open source
\emph default
\emph on
open source
\emph default
\emph on
freeware
\emph default
\emph on
freeware
\emph default
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve what
you give them.
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve what
you give them.
- Help stamp out software-hoarding!
+ Help stamp out software-hoarding!
\end_layout
\begin_layout Section
\end_layout
\begin_layout Section
\begin_layout Standard
Throughout this manual, we will use the following convention.
\begin_layout Standard
Throughout this manual, we will use the following convention.
- Commands you have to type in are printed in
+ Commands you have to type in are printed in
\family sans
\series bold
"sans serif"
\family sans
\series bold
"sans serif"
- Code samples are printed in
+ Code samples are printed in
\family typewriter
typewriter font.
\family default
\family typewriter
typewriter font.
\family default
- Interesting items and new terms are printed in
+ Interesting items and new terms are printed in
\emph on
italic.
\end_layout
\emph on
italic.
\end_layout
\begin_inset LatexCommand \ref{sub:ANSI-Compliance}
\end_inset
for ANSI-Compliance).
\begin_inset LatexCommand \ref{sub:ANSI-Compliance}
\end_inset
for ANSI-Compliance).
\begin_inset Note Note
status collapsed
\begin_inset Note Note
status collapsed
--short-is-8bits commandline option (see
+-short-is-8bits commandline option (see
\begin_inset LatexCommand \vref{lyx:--short-is-8bits}
\end_inset
\begin_inset LatexCommand \vref{lyx:--short-is-8bits}
\end_inset
\newline
\family typewriter
\newline
\family typewriter
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/}
\end_inset
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.
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
+ A pdf version of this document is available at
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf}
\end_inset
-If you can think of some more, please see the section
+If you can think of some more, please see the section
\begin_inset LatexCommand \ref{sub:Requesting-Features}
\end_inset
\begin_inset LatexCommand \ref{sub:Requesting-Features}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-For most users it is sufficient to skip to either section
+For most users it is sufficient to skip to either section
\begin_inset LatexCommand \ref{sub:Building-SDCC-on-Linux}
\end_inset
\begin_inset LatexCommand \ref{sub:Building-SDCC-on-Linux}
\end_inset
\begin_inset LatexCommand \ref{sub:Windows-Install}
\end_inset
\begin_inset LatexCommand \ref{sub:Windows-Install}
\end_inset
\labelwidthstring 00.00.0000
\InsetSpace ~
\InsetSpace ~
\labelwidthstring 00.00.0000
\InsetSpace ~
\InsetSpace ~
-sdccconf_h_dir_separator environment variable, either / or
+sdccconf_h_dir_separator environment variable, either / or
\newline
These configure options are compiled into the binaries,
and can only be changed by rerunning 'configure' and recompiling SDCC.
\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
+ The configure options are written in
\emph on
italics
\emph default
\emph on
italics
\emph default
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
This is needed for full relocatability of a binary package and to complete
search paths (see section search paths below):
\newline
This is needed for full relocatability of a binary package and to complete
search paths (see section search paths below):
\newline
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\newline
RANLIB=
\begin_inset Quotes srd
\newline
RANLIB=
\begin_inset Quotes srd
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\newline
include_dir_suffix=
\begin_inset Quotes srd
\newline
include_dir_suffix=
\begin_inset Quotes srd
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\size footnotesize
*compiler, preprocessor, assembler, and linker
\newline
\size footnotesize
*compiler, preprocessor, assembler, and linker
\newline
\shape italic
model
\shape default
\shape italic
model
\shape default
\begin_layout Standard
Some search paths or parts of them are determined by configure variables
\begin_layout Standard
Some search paths or parts of them are determined by configure variables
\emph on
italics
\emph default
, see section above).
Further search paths are determined by environment variables during runtime.
\emph on
italics
\emph default
, see section above).
Further search paths are determined by environment variables during runtime.
-The
- paths searched when running the compiler are as follows (the first catch
- wins):
+The paths searched when running the compiler are as follows (the first
+ catch wins):
\newline
\end_layout
\begin_layout Standard
\newline
\end_layout
\begin_layout Standard
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\shape italic
model
\shape default
is auto-appended by the compiler (e.g.
small, large, z80, ds390 etc.).
\shape italic
model
\shape default
is auto-appended by the compiler (e.g.
small, large, z80, ds390 etc.).
\series medium
bz2
\series default
\series medium
bz2
\series default
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
\begin_layout Enumerate
\series medium
\begin_layout Enumerate
\series medium
-Unpack the file using a command like:
+Unpack the file using a command like:
\family sans
\series bold
"tar -xvzf sdcc-src-yyyymmdd-rrrr.tar.bz2
\family sans
\series bold
"tar -xvzf sdcc-src-yyyymmdd-rrrr.tar.bz2
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
-Change directory into the main SDCC directory, for example type:
+Change directory into the main SDCC directory, for example type:
\family sans
\series bold
"cd sdcc
\family sans
\series bold
"cd sdcc
\begin_layout Enumerate
\series medium
\begin_layout Enumerate
\series medium
\family sans
\series bold
"./configure
\family sans
\series bold
"./configure
\begin_layout Enumerate
\series medium
\begin_layout Enumerate
\series medium
\family sans
\series bold
"make
\family sans
\series bold
"make
\begin_layout Enumerate
\series medium
\begin_layout Enumerate
\series medium
\family sans
\series bold
"make install"
\family sans
\series bold
"make install"
\series default
This copies the binary executables, the include files, the libraries and
the documentation to the install directories.
\series default
This copies the binary executables, the include files, the libraries and
the documentation to the install directories.
\begin_inset LatexCommand \ref{sec:Testing-the-SDCC}
\end_inset
\begin_inset LatexCommand \ref{sec:Testing-the-SDCC}
\end_inset
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
\backslash
\end_layout
\begin_layout LyX-Code
LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
\backslash
\end_layout
\begin_layout LyX-Code
LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
\backslash
\end_layout
\begin_layout LyX-Code
CXXFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
\backslash
\end_layout
\begin_layout LyX-Code
CXXFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\newline
In order to install
\newline
In order to install
- Cygwin on Windows download setup.exe from
+ Cygwin on Windows download setup.exe from
\begin_inset LatexCommand \url[www.cygwin.com]{http://www.cygwin.com/}
\end_inset
.
\begin_inset LatexCommand \url[www.cygwin.com]{http://www.cygwin.com/}
\end_inset
.
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-gdb ; the gnu debugger, together with the nice GUI
+gdb ; the gnu debugger, together with the nice GUI
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
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.
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.
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\series medium
Download the source package
\series default
\series medium
Download the source package
\series default
- either from the SDCC Subversion repository or from the
+ either from the SDCC Subversion repository or from the
\begin_inset LatexCommand \url[snapshot builds]{http://sdcc.sourceforge.net/snap.php}
\end_inset
\begin_inset LatexCommand \url[snapshot builds]{http://sdcc.sourceforge.net/snap.php}
\end_inset
bin_vc to sdcc
\backslash
bin before running SDCC.
bin_vc to sdcc
\backslash
bin before running SDCC.
-WARNING: Visual studio is very picky with line terminatio
-ns; it expects the 0x0d, 0x0a DOS style line endings, not the 0x0a Unix
- style line endings.
+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
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
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.
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
+ To do so you can use the
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\newline
In order to build SDCC with MSVC
you need win32 executables of bison.exe, flex.exe, and gawk.exe.
\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
+ One good place to get them is
\begin_inset LatexCommand \url[here]{http://unxutils.sourceforge.net}
\end_inset
\begin_inset LatexCommand \url[here]{http://unxutils.sourceforge.net}
\end_inset
\backslash
util
\backslash
\backslash
util
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\backslash
util
\backslash
\backslash
util
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\family sans
\series bold
find .
\family sans
\series bold
find .
-( -name '*.obj' -o -name '*.lib' -o -name '*.rul'
+( -name '*.obj' -o -name '*.lib' -o -name '*.rul'
\backslash
;
\family default
\backslash
;
\family default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
-Download the binary zip package from
+Download the binary zip package from
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Download the setup program
+Download the setup program
\emph on
sdcc-x.y.z-setup.exe
\emph default
\emph on
sdcc-x.y.z-setup.exe
\emph default
- for an official release from
+ for an official release from
\newline
\begin_inset LatexCommand \url{http://sf.net/project/showfiles.php?group_id=599}
\end_inset
\newline
\begin_inset LatexCommand \url{http://sf.net/project/showfiles.php?group_id=599}
\end_inset
- or a setup program for one of the snapshots
+ or a setup program for one of the snapshots
\emph on
sdcc-yyyymmdd-xxxx-setup.exe
\emph default
\emph on
sdcc-yyyymmdd-xxxx-setup.exe
\emph default
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\begin_layout Standard
\noindent
\begin_layout Standard
\noindent
\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.
\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.
\series bold
make
\series default
\series bold
make
\series default
file untouched in the source directory.
Simply copy it to the build directory, edit it, enter `make clean', `rm
Makefile.dep' and `make'.
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
\series bold
make
\series default
with all the other stuff.
You will need several tools (LyX, LaTeX, LaTeX2HTML, pdflatex, dvipdf,
dvips and makeindex) to get the job done.
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
+ Another possibility is to change to the doc directory and to type
\family sans
\series bold
\family sans
\series bold
there.
You're invited to make changes and additions to this manual (sdcc/doc/sdccman.ly
x).
there.
You're invited to make changes and additions to this manual (sdcc/doc/sdccman.ly
x).
\begin_inset LatexCommand \url{http://www.lyx.org}
\end_inset
as editor is straightforward.
\begin_inset LatexCommand \url{http://www.lyx.org}
\end_inset
as editor is straightforward.
- Prebuilt documentation in html and pdf format is available from
+ Prebuilt documentation in html and pdf format is available from
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/snap.php}
\end_inset
\newline
You'll find the pdf version
\begin_inset LatexCommand \index{PDF version of this document}
\end_inset
\newline
You'll find the pdf version
\begin_inset LatexCommand \index{PDF version of this document}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.pdf}
\end_inset
.
\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.pdf}
\end_inset
.
\newline
A html version
\begin_inset LatexCommand \index{HTML version of this document}
\end_inset
\newline
A html version
\begin_inset LatexCommand \index{HTML version of this document}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.html/index.html}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sf.net/doc/sdccman.html/index.html}
\end_inset
.
\newline
This documentation is in some aspects different from a commercial documentation:
.
\newline
This documentation is in some aspects different from a commercial documentation:
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
There are many references pointing away from this documentation.
Don't let this distract you.
If there f.e.
There are many references pointing away from this documentation.
Don't let this distract you.
If there f.e.
\begin_inset LatexCommand \url{http://www.opencores.org}
\end_inset
\begin_inset LatexCommand \url{http://www.opencores.org}
\end_inset
- together with a statement
+ together with a statement
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
-some processors which are targetted by SDCC can be implemented in a
+some processors which are targetted by SDCC can be implemented in a
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset LatexCommand \url{http://sf.net/projects/fpgac}
\end_inset
\begin_inset LatexCommand \url{http://sf.net/projects/fpgac}
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_layout Standard
The first thing you should do after installing your SDCC compiler is to
see if it runs.
\begin_layout Standard
The first thing you should do after installing your SDCC compiler is to
see if it runs.
\family sans
\series bold
"sdcc -
\family sans
\series bold
"sdcc -
\family default
\series default
at the prompt, and the program should run and output its version like:
\family default
\series default
at the prompt, and the program should run and output its version like:
\newline
\family typewriter
\newline
\family typewriter
Make sure that the sdcc bin directory is in your executable search path
defined by the PATH environment setting (
\series medium
Make sure that the sdcc bin directory is in your executable search path
defined by the PATH environment setting (
\series medium
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
-is commonly installed as described in section
+is commonly installed as described in section
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\series medium
Make sure the compiler works on a very simple example.
\series medium
Make sure the compiler works on a very simple example.
- Type in the following test.c program using your favorite
+ Type in the following test.c program using your favorite
\series medium
editor:
\end_layout
\series medium
editor:
\end_layout
\begin_layout Standard
\series medium
\begin_layout Standard
\series medium
-Compile this using the following command:
+Compile this using the following command:
\family sans
\series bold
"sdcc -c test.c".
\family sans
\series bold
"sdcc -c test.c".
\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.
\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.
\series medium
The next step is to try it with the linker.
\series medium
The next step is to try it with the linker.
\family sans
\series bold
"sdcc test.c
\family sans
\series bold
"sdcc test.c
.
If all goes well the compiler will link with the libraries and produce
a test.ihx output file.
.
If all goes well the compiler will link with the libraries and produce
a test.ihx output file.
- If this step fails(no test.ihx, and the linker generates warnings), then
- the problem is most likely that
+ 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
\series default
SDCC
\series medium
\series default
/
\series medium
\series default
/
\series medium
-usr/local/share/sdcc/lib directory(see
+usr/local/share/sdcc/lib directory
+
+\series medium
+(see
+\series default
+section
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
-The final test is to ensure
+The final test is to ensure
\series default
SDCC
\series medium
\series default
SDCC
\series medium
\series default
standard
\series medium
\series default
standard
\series medium
\begin_layout Standard
\series medium
\begin_layout Standard
\series medium
\family sans
\series bold
"sdcc test.c"
\family sans
\series bold
"sdcc test.c"
.
This should generate a test.ihx output file, and it should give no warnings
such as not finding the string.h file.
.
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
+ If it cannot find the string.h file, then the problem is that
\series default
SDCC
\series medium
\series default
SDCC
\series medium
- cannot find the /usr/local/share/sdcc/include directory(see the
+ cannot find the /usr/local/share/sdcc/include directory
+\series default
+
+\series medium
+(see the
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
\begin_inset LatexCommand \ref{sub:Install-Trouble-shooting}
\end_inset
Install trouble-shooting section for suggestions).
\series default
Install trouble-shooting section for suggestions).
\series default
\series bold
-
\begin_inset ERT
\series bold
-
\begin_inset ERT
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_layout Standard
This will install the compiler, other executables libraries and include
files into the appropriate directories.
\begin_layout Standard
This will install the compiler, other executables libraries and include
files into the appropriate directories.
\begin_inset LatexCommand \ref{sub:Install-paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Install-paths}
\end_inset
At the time of this writing, we find the following programs for gcc-builds:
\newline
At the time of this writing, we find the following programs for gcc-builds:
\newline
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\begin_layout Itemize
as-z80
\series bold
\begin_layout Itemize
as-z80
\series bold
\series default
as-gbz80 - The Z80 and GameBoy Z80 assemblers.
\end_layout
\series default
as-gbz80 - The Z80 and GameBoy Z80 assemblers.
\end_layout
\begin_layout Itemize
link-z80
\series bold
\begin_layout Itemize
link-z80
\series bold
\series default
link-gbz80 - The Z80 and GameBoy Z80 linkers.
\end_layout
\series default
link-gbz80 - The Z80 and GameBoy Z80 linkers.
\end_layout
\begin_inset LatexCommand \url{http://gcc.gnu.org/}
\end_inset
\begin_inset LatexCommand \url{http://gcc.gnu.org/}
\end_inset
is a free open source simulator developed by Daniel Drotos.
The simulator is built as part of the build process.
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:
+ For more information visit Daniel's web site at:
\begin_inset LatexCommand \url{http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51}
\end_inset
\begin_inset LatexCommand \url{http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51}
\end_inset
\end_inset
is the companion source level debugger.
\end_inset
is the companion source level debugger.
- More about SDCDB in section
+ More about SDCDB in section
\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
\end_inset
\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
\end_inset
\begin_layout Standard
For single source file 8051 projects the process is very simple.
\begin_layout Standard
For single source file 8051 projects the process is very simple.
- Compile your programs with the following command
+ Compile your programs with the following command
\family sans
\series bold
"sdcc sourcefile.c".
\family sans
\series bold
"sdcc sourcefile.c".
- If you need another format you might want to use
+ If you need another format you might want to use
\family sans
\shape italic
objdump
\family sans
\shape italic
objdump
\begin_inset LatexCommand \vref{sub:Postprocessing-the-Intel}
\end_inset
\begin_inset LatexCommand \vref{sub:Postprocessing-the-Intel}
\end_inset
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\begin_inset LatexCommand \label{OMF file}
\end_inset
\begin_inset LatexCommand \label{OMF file}
\end_inset
\begin_inset LatexCommand \ref{sub:Intermediate-Dump-Options}
\end_inset
\InsetSpace ~
\begin_inset LatexCommand \ref{sub:Intermediate-Dump-Options}
\end_inset
\InsetSpace ~
\begin_inset LatexCommand \ref{sub:The-anatomy-of}
\end_inset
\begin_inset LatexCommand \ref{sub:The-anatomy-of}
\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
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
\family typewriter
packihx
\family default
- which is part of the SDCC distribution:
+ which is part of the SDCC distribution:
of various flavours (crc, add, xor) and to perform other manipulations
(convert, split, crop, offset, ...).
of various flavours (crc, add, xor) and to perform other manipulations
(convert, split, crop, offset, ...).
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
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
+ will be interpreted as an
\family typewriter
lcall
\family default
\family typewriter
lcall
\family default
\family typewriter
0x1212
\family default
\family typewriter
0x1212
\family default
\family default
\series default
\family default
\series default
-The srecord package is available at
+The srecord package is available at
\begin_inset LatexCommand \url{http://sf.net/projects/srecord}
\end_inset
\begin_inset LatexCommand \url{http://sf.net/projects/srecord}
\end_inset
\size default
The first two files will need to be compiled separately with the commands:
\size default
The first two files will need to be compiled separately with the commands:
+\size footnotesize
+
+\size default
+
-Then compile the source file containing the
+Then compile the source file containing the
\emph on
main()
\emph default
\emph on
main()
\emph default
- the files together with the following command:
+ the files together with the following command:
-can be separately compiled as well:
+can be separately compiled as well:
\family sans
\series bold
\family sans
\series bold
\family default
\series default
\family default
\series default
\emph on
main()
\emph default
function
\emph on
main()
\emph default
function
+\emph on
+
+\emph default
\noun on
must
\noun default
\noun on
must
\noun default
\noun on
first
\noun default
\noun on
first
\noun default
\begin_layout Standard
Some reusable routines may be compiled into a library, see the documentation
for the assembler and linkage editor (which are in <installdir>/share/sdcc/doc)
\begin_layout Standard
Some reusable routines may be compiled into a library, see the documentation
for the assembler and linkage editor (which are in <installdir>/share/sdcc/doc)
\emph on
.lib
\begin_inset LatexCommand \index{<file>.lib}
\emph on
.lib
\begin_inset LatexCommand \index{<file>.lib}
Libraries created in this manner can be included in the command line.
Make sure you include the -L <library-path> option to tell the linker where
to look for these files if they are not in the current directory.
Libraries created in this manner can be included in the command line.
Make sure you include the -L <library-path> 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
+ Here is an example, assuming you have the source file
\emph on
foomain.c
\emph default
\emph on
foomain.c
\emph default
\emph on
foolib.lib
\emph default
\emph on
foolib.lib
\emph default
\emph on
mylib
\emph default
\emph on
mylib
\emph default
- For an example see the standard library file
+ For an example see the standard library file
\emph on
libsdcc.lib
\emph default
\emph on
libsdcc.lib
\emph default
\end_inset
processor (Not maintained, not complete).
\end_inset
processor (Not maintained, not complete).
- AVR users should probably have a look at winavr
+ AVR users should probably have a look at winavr
\begin_inset LatexCommand \url{http://sourceforge.net/projects/winavr}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/projects/winavr}
\end_inset
\begin_inset LatexCommand \url{http://www.avrfreaks.net/index.php?name=PNphpBB2&file=index}
\end_inset
\begin_inset LatexCommand \url{http://www.avrfreaks.net/index.php?name=PNphpBB2&file=index}
\end_inset
- The additional location where the preprocessor will look for <..h> or
+ The additional location where the preprocessor will look for <..h> or
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes eld
\end_inset
+\size large
+\bar under
+
+\size default
+\bar default
Like `-M' but the output mentions only the user header files included with
Like `-M' but the output mentions only the user header files included with
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes eld
\end_inset
+\size large
+\bar under
+
+\size default
+\bar default
Like `-dD' except that the macro arguments and contents are omitted.
Only `#define name' is included in the output.
\end_layout
Like `-dD' except that the macro arguments and contents are omitted.
Only `#define name' is included in the output.
\end_layout
\series default
\size default
\bar default
Pedantic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly
and the macro LO_B(3) gets expanded.
\series default
\size default
\bar 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
+ See also #pragma pedantic_parse_number
\begin_inset LatexCommand \vpageref{ite:pedantic_parse_number}
\end_inset
\begin_inset LatexCommand \vpageref{ite:pedantic_parse_number}
\end_inset
\emph on
Note: this functionality is not in conformance with C99 standard!
\end_layout
\emph on
Note: this functionality is not in conformance with C99 standard!
\end_layout
- Pass the preprocessorOption to the preprocessor
+ Pass the preprocessorOption to the preprocessor
\family typewriter
sdcpp
\family default
\family typewriter
sdcpp
\family default
- SDCC uses an adapted version of the preprocessor
+ SDCC uses an adapted version of the preprocessor
\emph on
cpp
\emph default
\emph on
cpp
\emph default
\emph on
gcc
\emph default
\emph on
gcc
\emph default
\begin_inset LatexCommand \url{http://gcc.gnu.org/}
\end_inset
\begin_inset LatexCommand \url{http://gcc.gnu.org/}
\end_inset
4.1.1\InsetSpace ~
CPP\InsetSpace ~
Manual
4.1.1\InsetSpace ~
CPP\InsetSpace ~
Manual
\begin_inset LatexCommand \htmlurl{http://www.gnu.org/software/gcc/onlinedocs/}
\end_inset
\begin_inset LatexCommand \htmlurl{http://www.gnu.org/software/gcc/onlinedocs/}
\end_inset
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 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.
\series bold
-
\begin_inset ERT
\series bold
-
\begin_inset ERT
\end_inset
option (which is now a default setting) will override this setting, so
\end_inset
option (which is now a default setting) will override this setting, so
- you should also specify the
+ you should also specify the
\series bold
-
\begin_inset ERT
\series bold
-
\begin_inset ERT
\end_inset
addressable internal ram of the 8051.
\end_inset
addressable internal ram of the 8051.
\emph on
not
\emph default
\emph on
not
\emph default
The linker output (final object code) is in Intel Hex format.
\begin_inset LatexCommand \index{Intel hex format}
The linker output (final object code) is in Intel Hex format.
\begin_inset LatexCommand \index{Intel hex format}
The linker output (final object code) is in Motorola S19 format
\begin_inset LatexCommand \index{Motorola S19 format}
The linker output (final object code) is in Motorola S19 format
\begin_inset LatexCommand \index{Motorola S19 format}
The linker output (final object code) is in ELF format
\begin_inset LatexCommand \index{ELF format}
The linker output (final object code) is in ELF format
\begin_inset LatexCommand \index{ELF format}
...
Pass the linkOption to the linker.
...
Pass the linkOption to the linker.
- If a bootloader is used an option like
+ If a bootloader is used an option like
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_inset
would be typical to set the start of the code segment.
\end_inset
would be typical to set the start of the code segment.
- See also #pragma constseg and #pragma codeseg in section
+ See also #pragma constseg and #pragma codeseg in section
\begin_inset LatexCommand \ref{sec:Pragmas}
\end_inset
\begin_inset LatexCommand \ref{sec:Pragmas}
\end_inset
+\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.
Generate code for Small Model programs, see section Memory Models for more
details.
This is the default model.
area (usually the first 256 bytes in the external ram) for allocating variables
and passing parameters.
area (usually the first 256 bytes in the external ram) for allocating variables
and passing parameters.
\begin_inset LatexCommand \ref{sub:External-Stack}
\end_inset
\begin_inset LatexCommand \ref{sub:External-Stack}
\end_inset
+
+\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
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
+ and is default when using
\emph on
-mds390
\emph default
\emph on
-mds390
\emph default
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
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
+ and is default when using
\emph on
-mds390
\emph default
\emph on
-mds390
\emph default
stack mode.
It is important to ensure that the processor is in this mode before calling
any re-entrant functions compiled with this option.
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
+ In principle, this should work with the
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\emph default
option, but that has not been tested.
\emph default
option, but that has not been tested.
- It is incompatible with the
+ It is incompatible with the
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\emph default
option.
It also only makes sense if the processor is in 24 bit contiguous addressing
\emph default
option.
It also only makes sense if the processor is in 24 bit contiguous addressing
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\series default
<nnnn> LibraryID used in -mTININative.
\series default
<nnnn> LibraryID used in -mTININative.
\end_layout
\begin_layout List
\end_layout
\begin_layout List
\series default
generate code for DS390 Arithmetic Accelerator.
\series default
generate code for DS390 Arithmetic Accelerator.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
+
+\size large
+\emph on
+
+\size default
+\emph default
Force a called function to always save BC.
\end_layout
Force a called function to always save BC.
\end_layout
+
+\size large
+\emph on
+
+\size default
+\emph default
Force a called function to always save BC.
\end_layout
Force a called function to always save BC.
\end_layout
\emph on
loc
\emph default
\emph on
loc
\emph 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
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
\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
\end_inset
\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
\end_inset
+\size large
+\bar under
+
+\size default
+\bar default
Will not generate boundary condition check when switch statements
\begin_inset LatexCommand \index{switch statement}
\end_inset
are implemented using jump-tables.
Will not generate boundary condition check when switch statements
\begin_inset LatexCommand \index{switch statement}
\end_inset
are implemented using jump-tables.
\begin_inset LatexCommand \ref{sub:'switch'-Statements}
\end_inset
\begin_inset LatexCommand \ref{sub:'switch'-Statements}
\end_inset
-Will not do loop reversal
+\size large
+
+\size default
+Will not do loop reversal
\begin_inset LatexCommand \index{Loop reversing}
\end_inset
\begin_inset LatexCommand \index{Loop reversing}
\end_inset
\series bold
nolabelopt
\series default
\series bold
nolabelopt
\series default
\begin_inset LatexCommand \index{-\/-nolabelopt }
\end_inset
\begin_inset LatexCommand \index{-\/-nolabelopt }
\end_inset
\InsetSpace ~
<filename> This option can be used to use additional rules to be used by
the peep hole optimizer.
\InsetSpace ~
<filename> This option can be used to use additional rules to be used by
the peep hole optimizer.
\begin_inset LatexCommand \ref{sub:Peephole-Optimizer}
\end_inset
\begin_inset LatexCommand \ref{sub:Peephole-Optimizer}
\end_inset
\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
\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.
+ for the Windows binaries) to be recognized as a path.
+
+\emph on
+
+\emph default
+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
The trailing backslash should be doubled in order to prevent escaping the
- final quote, for example:
+ final quote, for example:
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
- or put after the final quote, for example:
+ or put after the final quote, for example:
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\emph default
.
The path using slashes for directory delimiters can be used too, for example:
\emph default
.
The path using slashes for directory delimiters can be used too, for example:
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
-All functions in the source file will be compiled as
+\size large
+\emph on
+
+\size default
+\emph default
+All functions in the source file will be compiled as
\emph on
reentrant
\emph default
\emph on
reentrant
\emph default
\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
\end_inset
\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
\end_inset
\series default
-float-reent.
\series default
-float-reent.
\end_layout
\begin_layout List
\end_layout
\begin_layout List
\begin_inset LatexCommand \label{lyx:--callee-saves-function1[,function2][,function3]...}
\end_inset
\begin_inset LatexCommand \label{lyx:--callee-saves-function1[,function2][,function3]...}
\end_inset
-callee-saves option string.
Also see #pragma\InsetSpace ~
-callee-saves option string.
Also see #pragma\InsetSpace ~
\begin_inset LatexCommand \index{\#pragma callee\_saves}
\end_inset
\begin_inset LatexCommand \index{\#pragma callee\_saves}
\end_inset
\begin_inset LatexCommand \vpageref{ite:callee_saves-function1[,function2[,function3...]]--}
\end_inset
\begin_inset LatexCommand \vpageref{ite:callee_saves-function1[,function2[,function3...]]--}
\end_inset
+Function of
+\series bold
+
+\series default
+-
\begin_inset ERT
status collapsed
\begin_inset ERT
status collapsed
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.
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.
+\size large
+\bar under
+
+\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.
\end_layout
Stop after the stage of compilation proper; do not assemble.
The output is an assembler code file for the input file specified.
\end_layout
This option will cause the compiler to generate an information message for
each function in the source file.
This option will cause the compiler to generate an information message for
each function in the source file.
- The message contains some
+ 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
\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
+ graph of the function, and most importantly the
\emph on
cyclomatic complexity
\begin_inset LatexCommand \index{Cyclomatic complexity}
\emph on
cyclomatic complexity
\begin_inset LatexCommand \index{Cyclomatic complexity}
- For more details, see the less_pedantic pragma
+ For more details, see the less_pedantic pragma
\begin_inset LatexCommand \vpageref{ite:less_pedantic}
\end_inset
\begin_inset LatexCommand \vpageref{ite:less_pedantic}
\end_inset
\series bold
\emph on
not
\series default
\emph default
\series bold
\emph on
not
\series default
\emph default
- a SDCC compiler option but if you want
+ a SDCC compiler option but if you want
\emph on
more
\emph default
\emph on
more
\emph default
\begin_inset LatexCommand \url{http://www.splint.org}
\end_inset
.
To make your source files parseable by splint you will have to include
\begin_inset LatexCommand \url{http://www.splint.org}
\end_inset
.
To make your source files parseable by splint you will have to include
\family sans
lint.h
\family default
\family sans
lint.h
\family default
- in your source file and add brackets around extended keywords (like
+ in your source file and add brackets around extended keywords (like
\family sans
\begin_inset Quotes sld
\family sans
\begin_inset Quotes sld
\family sans
\begin_inset Quotes sld
\family sans
\begin_inset Quotes sld
-Splint has an excellent on line manual at
+Splint has an excellent on line manual at
\begin_inset LatexCommand \url{http://www.splint.org/manual/}
\end_inset
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
\begin_inset LatexCommand \url{http://www.splint.org/manual/}
\end_inset
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:
+ command line could look like this:
\end_inset
Treat short as 8-bit (for backward compatibility with older versions of
\end_inset
Treat short as 8-bit (for backward compatibility with older versions of
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
) generated by the compiler in human readable form at various stages of
the compilation process.
) generated by the compiler in human readable form at various stages of
the compilation process.
- More on iCodes see chapter
+ More on iCodes see chapter
\begin_inset LatexCommand \ref{sub:The-anatomy-of}
\end_inset
\begin_inset LatexCommand \ref{sub:The-anatomy-of}
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\series default
This option will cause the compiler to dump the intermediate code into
\series default
This option will cause the compiler to dump the intermediate code into
\emph on
<source filename>.dumpraw
\emph default
\emph on
<source filename>.dumpraw
\emph default
\emph on
<source filename>.dumpgcse.
\end_layout
\emph on
<source filename>.dumpgcse.
\end_layout
\emph on
<source filename>.dumpdeadcode.
\end_layout
\emph on
<source filename>.dumpdeadcode.
\end_layout
+\size large
+
+\size default
Will create a dump of iCodes, after loop optimizations
\begin_inset LatexCommand \index{Loop optimization}
\end_inset
Will create a dump of iCodes, after loop optimizations
\begin_inset LatexCommand \index{Loop optimization}
\end_inset
\emph on
<source filename>.dumploop.
\end_layout
\emph on
<source filename>.dumploop.
\end_layout
+\size large
+
+\size default
Will create a dump of iCodes, after live range analysis
\begin_inset LatexCommand \index{Live range analysis}
\end_inset
Will create a dump of iCodes, after live range analysis
\begin_inset LatexCommand \index{Live range analysis}
\end_inset
\emph on
<source filename>.dumprange.
\end_layout
\emph on
<source filename>.dumprange.
\end_layout
Will create a dump of iCodes, after register assignment
\begin_inset LatexCommand \index{Register assignment}
\end_inset
Will create a dump of iCodes, after register assignment
\begin_inset LatexCommand \index{Register assignment}
\end_inset
\emph on
<source filename>.dumprassgn.
\end_layout
\emph on
<source filename>.dumprassgn.
\end_layout
+\size large
+\bar under
+
+\size default
+\bar default
Will cause all the above mentioned dumps to be created.
\end_layout
Will cause all the above mentioned dumps to be created.
\end_layout
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-By default SDCC writes its error messages to
+By default SDCC writes its error messages to
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
- To force all messages to
+ To force all messages to
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\series bold
-
\series default
\series bold
-
\series default
\begin_inset LatexCommand \ref{sub:Install-paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Install-paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Search-Paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Search-Paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Search-Paths}
\end_inset
\begin_inset LatexCommand \ref{sub:Search-Paths}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\series bold
default
\series default
\series bold
default
\series default
\emph on
data
\emph default
\emph on
data
\emph default
\emph on
near
\emph default
\emph on
near
\emph default
- or the more ANSI-C compliant forms
+ or the more ANSI-C compliant forms
\emph on
__data
\emph default
\emph on
__data
\emph default
\emph on
__near
\emph default
\emph on
__near
\emph default
\begin_layout Standard
Variables declared with this storage class will be placed in the external
RAM.
\begin_layout Standard
Variables declared with this storage class will be placed in the external
RAM.
\series bold
default
\series default
\series bold
default
\series default
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
74\InsetSpace ~
01\InsetSpace ~
\newline
74\InsetSpace ~
01\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
F0\InsetSpace ~
\InsetSpace ~
\newline
F0\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
movx\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
movx\InsetSpace ~
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
256 bytes.
The following example writes 0x01 to the pdata variable.
Please note, pdata access physically accesses xdata memory.
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
+ The high byte of the address is determined by port P2
\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
\end_inset
(or in case of some 8051 variants by a separate Special Function Register,
\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
\end_inset
(or in case of some 8051 variants by a separate Special Function Register,
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
).
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
).
\series bold
default
\series default
\series bold
default
\series default
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
F2\InsetSpace ~
\InsetSpace ~
\newline
F2\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-__code char test_array[] = {'c','h','e','a','p'};
+__code char test_array[] = {'c','h','e','a','p'};
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Verse
\end_layout
\begin_layout Verse
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
\begin_layout Standard
The bit addressable memory consists of 128 bits which are located from 0x20
to 0x2f in data memory.
\begin_layout Standard
The bit addressable memory consists of 128 bits which are located from 0x20
to 0x2f in data memory.
-Apart from this 8051 specific storage class most
- architectures support ANSI-C bitfields
+Apart from this 8051 specific storage class most architectures support
+ ANSI-C bitfields
\begin_inset LatexCommand \index{bitfields}
\end_inset
\begin_inset LatexCommand \index{bitfields}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-sfr / sfr16 / sfr32 / sbit
+sfr / sfr16 / sfr32 / sbit
\emph default
signify both a data-type and storage class, they are used to describe the
\emph default
signify both a data-type and storage class, they are used to describe the
\emph on
bit
\emph default
\emph on
bit
\emph default
\newline
16 Bit and 32 bit special function
register combinations which require a certain access order are better not
\newline
16 Bit and 32 bit special function
register combinations which require a certain access order are better not
\emph on
sfr16
\emph default
\emph on
sfr16
\emph default
\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
\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
\emph default
compatible.
\emph default
compatible.
- Specifically the syntax
+ Specifically the syntax
\family typewriter
\InsetSpace ~
sfr P0 = 0x80;\InsetSpace ~
\family default
\family typewriter
\InsetSpace ~
sfr P0 = 0x80;\InsetSpace ~
\family default
\emph on
without warning
\emph default
\emph on
without warning
\emph default
- by SDCC to an assignment of 0x80 to a variable called P0
+ by SDCC to an assignment of 0x80 to a variable called P0
\family typewriter
\begin_inset Marginal
\family typewriter
\begin_inset Marginal
\family default
Nevertheless it is possible to write header files
\begin_inset LatexCommand \index{Header files}
\family default
Nevertheless it is possible to write header files
\begin_inset LatexCommand \index{Header files}
- which can be shared among different compilers (see section
+ which can be shared among different compilers (see section
\begin_inset LatexCommand \ref{sec:Porting-code-to-other-compilers}
\end_inset
).
\begin_inset LatexCommand \ref{sec:Porting-code-to-other-compilers}
\end_inset
).
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
\family typewriter
/* pointer physically in internal ram pointing to object in external ram
\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
\newline
__xdata unsigned char * __data p;
\newline
\newline
/* pointer physically in external ram
- pointing to object in internal ram */
+ pointing to object in internal ram */
\newline
__data unsigned char * __xdata p;
\newline
\newline
/*
\newline
__data unsigned char * __xdata p;
\newline
\newline
/*
- pointer physically in code rom pointing to data in xdata space */
+ pointer physically in code rom pointing to data in xdata space */
\newline
__xdata
unsigned char * __code p;
\newline
__xdata
unsigned char * __code p;
\newline
/* pointer physically in code space pointing to
\newline
/* pointer physically in code space pointing to
\newline
__code unsigned char * __code p;
\newline
\newline
__code unsigned char * __code p;
\newline
\begin_layout Standard
Well you get the idea.
\begin_layout Standard
Well you get the idea.
-All unqualified pointers are treated as 3-byte (4-byte
- for the ds390)
+All unqualified pointers are treated as 3-byte (4-byte for the ds390)
\emph on
generic
\emph default
pointers.
\emph on
generic
\emph default
pointers.
-The highest order byte of the
+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
\emph on
generic
\emph default
pointers contains the data space information.
Assembler support routines are called whenever data is stored or retrieved
\emph on
generic
\emph default
\emph on
generic
\emph default
\newline
- Bytes 00-1F - 32 bytes to hold
\newline
- Bytes 00-1F - 32 bytes to hold
- up to 4 banks of the registers R0 to R7,
+ up to 4 banks of the registers R0 to R7,
\newline
- Bytes 20-2F - 16 bytes to hold
128 bit
\newline
- Bytes 20-2F - 16 bytes to hold
128 bit
\newline
- Bytes 30-7F - 80 bytes for general purpose use.
\newline
\newline
- Bytes 30-7F - 80 bytes for general purpose use.
\newline
- Sometimes this built in
+ 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
\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
\begin_inset LatexCommand \ref{sub:Startup-Code}
\end_inset
\begin_inset LatexCommand \ref{sub:Startup-Code}
\end_inset
\end_inset
of registers (register bank 0), but it is possible to specify that other
\end_inset
of registers (register bank 0), but it is possible to specify that other
- banks of registers (keyword
+ banks of registers (keyword
+\emph default
+
+\emph on
+
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\end_inset
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\end_inset
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
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
\emph on
data
\emph default
\emph on
data
\emph default
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
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
\emph on
data
\emph default
\emph on
data
\emph default
- to specify the start address of the
+ to specify the start address of the
\emph on
data
\emph default
\emph on
data
\emph default
- family has separate address spaces for memory and
+ family has separate address spaces for memory and
sfr at 0x78 IoPort;\InsetSpace ~
\InsetSpace ~
/* define a var in I/O space at 78h called IoPort */
sfr at 0x78 IoPort;\InsetSpace ~
\InsetSpace ~
/* define a var in I/O space at 78h called IoPort */
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
banked
\emph default
\emph on
banked
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
ED 79\InsetSpace ~
\InsetSpace ~
\newline
ED 79\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
\end_inset
z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
\end_inset
z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
\family typewriter
in0/out0
\family default
\family typewriter
in0/out0
\family default
\family typewriter
in/out
\family default
\family typewriter
in/out
\family default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\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.
\end_layout
\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
\begin_inset VSpace bigskip
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Data items can be assigned an absolute address with the
+Data items can be assigned an absolute address with the
\emph on
at
\begin_inset LatexCommand \index{at}
\emph on
at
\begin_inset LatexCommand \index{at}
\begin_layout Standard
In the above example the variable chksum will be located at 0x7ffe and 0x7fff
of the external ram.
\begin_layout Standard
In the above example the variable chksum will be located at 0x7ffe and 0x7fff
of the external ram.
\emph on
not
\emph default
\emph on
not
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-__code __at (0x7ff0) char Id[5] =
+__code __at (0x7ff0) char Id[5] =
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-In case of memory mapped I/O devices the keyword
+In case of memory mapped I/O devices the keyword
\emph on
volatile
\emph default
\emph on
volatile
\emph default
\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
\end_inset
\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
\end_inset
*/
\newline
unsigned char spi_io(unsigned char out_byte)
*/
\newline
unsigned char spi_io(unsigned char out_byte)
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-/* _asm
- nop _endasm; */\InsetSpace ~
+/* _asm nop _endasm; */\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
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).
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
+ This in fact makes them similar to
\emph on
static
\begin_inset LatexCommand \index{static}
\emph on
static
\begin_inset LatexCommand \index{static}
\emph on
#pragma\InsetSpace ~
stackauto
\emph on
#pragma\InsetSpace ~
stackauto
\emph on
reentrant
\begin_inset LatexCommand \index{reentrant}
\emph on
reentrant
\begin_inset LatexCommand \index{reentrant}
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-unsigned char foo(char i) __reentrant
+unsigned char foo(char i) __reentrant
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
-Since stack space on 8051 is limited, the
+Since stack space on 8051 is limited, the
\emph default
keyword or the
\emph on
\emph default
keyword or the
\emph on
\emph default
option should be used sparingly.
Note that the reentrant keyword just means that the parameters & local
\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
+ variables will be allocated to the stack, it
\emph on
does not
\emph default
\emph on
does not
\emph default
\end_layout
\begin_layout Verse
\family typewriter
\end_layout
\begin_layout Verse
\family typewriter
\InsetSpace ~
\InsetSpace ~
...
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
-In the above example the variable
+In the above example the variable
- will be allocated in the external ram,
+ will be allocated in the external ram,
\emph on
bvar
\emph default
\emph on
bvar
\emph default
j
\emph default
in internal ram.
j
\emph default
in internal ram.
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
-stack-auto
\emph default
-stack-auto
\emph default
- or when a function is declared as
+ or when a function is declared as
\emph on
reentrant
\emph default
\emph on
reentrant
\emph default
\end_inset
of a function will be allocated to an overlayable segment if the function
\end_inset
of a function will be allocated to an overlayable segment if the function
\emph on
no other function calls and the function is non-reentrant and the memory
model
\emph on
no other function calls and the function is non-reentrant and the memory
model
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
#pragma nooverlay
\begin_inset LatexCommand \index{\#pragma nooverlay}
\end_inset
\newline
#pragma nooverlay
\begin_inset LatexCommand \index{\#pragma nooverlay}
\end_inset
-void set_error(unsigned char errcd)
+void set_error(unsigned char errcd)
\InsetSpace ~
P3 = errcd;
\newline
\InsetSpace ~
P3 = errcd;
\newline
-void some_isr
- () __interrupt
+void
+ some_isr () __interrupt
\begin_inset LatexCommand \index{interrupt}
\end_inset
\begin_inset LatexCommand \index{interrupt}
\end_inset
\InsetSpace ~
\InsetSpace ~
...
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
-In the above example the parameter
+In the above example the parameter
\emph on
errcd
\emph default
\emph on
errcd
\emph default
\emph on
set_error
\emph default
\emph on
set_error
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-void timer_isr (void) __interrupt (1) __using (1)
+void timer_isr (void) __interrupt (1) __using (1)
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
-The optional number following the
+The optional number following the
\emph on
interrupt
\begin_inset LatexCommand \index{interrupt}
\emph on
interrupt
\begin_inset LatexCommand \index{interrupt}
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
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
+ or included in the file that contains the function
\emph on
main
\emph default
.
\emph on
main
\emph default
.
- The optional (8051 specific) keyword
+ The optional (8051 specific) keyword
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\emph default
can be used to tell the compiler to use the specified register bank when
generating code for this function.
\emph default
can be used to tell the compiler to use the specified register bank when
generating code for this function.
-Interrupt service routines open the door
- for some very interesting bugs:
+Interrupt service routines open the door for some very interesting bugs:
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
-Common interrupt pitfall: variable not declared
+Common interrupt pitfall: variable not declared
\emph on
volatile
\end_layout
\begin_layout Standard
If an interrupt service routine changes variables which are accessed by
\emph on
volatile
\end_layout
\begin_layout Standard
If an interrupt service routine changes variables which are accessed by
- other functions these variables have to be declared
+ other functions these variables have to be declared
\emph on
volatile
\emph default
\emph on
volatile
\emph default
\begin_inset LatexCommand \url{http://en.wikipedia.org/wiki/Volatile_variable}
\end_inset
\begin_inset LatexCommand \url{http://en.wikipedia.org/wiki/Volatile_variable}
\end_inset
-Common interrupt pitfall:
+Common interrupt pitfall:
\emph on
non-atomic access
\end_layout
\begin_layout Standard
\emph on
non-atomic access
\end_layout
\begin_layout Standard
-If the access to these variables is not
+If the access to these variables is not
\emph on
atomic
\begin_inset LatexCommand \index{atomic}
\emph on
atomic
\begin_inset LatexCommand \index{atomic}
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.
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.
-Access to 16 or 32 bit variables
- is obviously not atomic on 8 bit CPUs and should be protected by disabling
- interrupts.
+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.
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
+ on the 8051 the harmless looking
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\family typewriter
flags
\family default
resides in xdata.
\family typewriter
flags
\family default
resides in xdata.
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
from within an interrupt routine might get lost if the interrupt occurs
at the wrong time.
from within an interrupt routine might get lost if the interrupt occurs
at the wrong time.
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
- is not atomic on the 8051 even if
+ is not atomic on the 8051 even if
\family typewriter
counter
\family default
\family typewriter
counter
\family default
\newline
Bugs like these are hard to reproduce and can
cause a lot of trouble.
\newline
Bugs like these are hard to reproduce and can
cause a lot of trouble.
\end_layout
\begin_layout Subsubsection
\end_layout
\begin_layout Subsubsection
-Common interrupt pitfall:
+Common interrupt pitfall:
\emph on
stack overflow
\end_layout
\emph on
stack overflow
\end_layout
so there must be sufficient stack space.
If there isn't variables or registers (or even the return address itself)
will be corrupted.
so there must be sufficient stack space.
If there isn't variables or registers (or even the return address itself)
will be corrupted.
\emph on
stack overflow
\emph default
\emph on
stack overflow
\emph default
- is most likely to happen if the interrupt occurs during the
+ is most likely to happen if the interrupt occurs during the
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
-Common interrupt pitfall:
+Common interrupt pitfall:
\emph on
use of non-reentrant functions
\end_layout
\emph on
use of non-reentrant functions
\end_layout
- option and the source file will need to be compiled using the
+ option and the source file will need to be compiled using the
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\end_inset
compiler option.
\end_inset
compiler option.
\newline
Note, the type promotion
\begin_inset LatexCommand \index{type promotion}
\newline
Note, the type promotion
\begin_inset LatexCommand \index{type promotion}
without the programmer being aware of it.
See f.e.
without the programmer being aware of it.
See f.e.
\family typewriter
(unsigned char)(tail-1)
\family default
\family typewriter
(unsigned char)(tail-1)
\family default
- within the if clause in section
+ within the if clause in section
\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
\end_inset
\begin_inset LatexCommand \ref{sub:A-Step-by Assembler Introduction}
\end_inset
\emph default
if all parameters are passed in registers.
\newline
\emph default
if all parameters are passed in registers.
\newline
\begin_inset LatexCommand \ref{sub:Overlaying}
\end_inset
\InsetSpace ~
\begin_inset LatexCommand \ref{sub:Overlaying}
\end_inset
\InsetSpace ~
-about Overlaying and section
+about Overlaying and section
\begin_inset LatexCommand \ref{sub:Functions-using-private-banks}
\end_inset
\begin_inset LatexCommand \ref{sub:Functions-using-private-banks}
\end_inset
numbers and the corresponding address & descriptions for the Standard 8051/8052
are listed below.
numbers and the corresponding address & descriptions for the Standard 8051/8052
are listed below.
- SDCC will automatically adjust the
+ SDCC will automatically adjust the
\begin_inset LatexCommand \index{interrupt vector table}
\end_inset
\begin_inset LatexCommand \index{interrupt vector table}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-If the interrupt service routine is defined without
+If the interrupt service routine is defined without
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\begin_layout Standard
If the interrupt service routine is defined to be using a specific register
\begin_layout Standard
If the interrupt service routine is defined to be using a specific register
\emph on
a, b, dptr
\emph default
\emph on
a, b, dptr
\emph default
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
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
+ this way; instead see section
\begin_inset LatexCommand \ref{sub:Startup-Code}
\end_inset
\begin_inset LatexCommand \ref{sub:Startup-Code}
\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
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
+ a RETN instruction instead, add the
\emph on
critical
\emph default
\emph on
critical
\emph default
\family typewriter
void nmi_isr (void) critical interrupt
\newline
\family typewriter
void nmi_isr (void) critical interrupt
\newline
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
However if you need to create a non-interruptable interrupt service routine
\newline
}
\end_layout
\begin_layout Standard
However if you need to create a non-interruptable interrupt service routine
- you would also require the
+ you would also require the
\emph on
critical
\emph default
\emph on
critical
\emph default
\begin_layout Standard
A special keyword may be associated with a block or a function declaring
\begin_layout Standard
A special keyword may be associated with a block or a function declaring
\emph on
critical
\emph default
\emph on
critical
\emph default
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
-The critical attribute maybe used with other attributes like
+The critical attribute maybe used with other attributes like
\emph on
reentrant.
\emph default
\newline
\emph on
reentrant.
\emph default
\newline
\emph on
critical
\emph default
\emph on
critical
\emph default
\end_layout
\begin_layout Verse
\end_layout
\begin_layout Verse
\InsetSpace ~
sei\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
sei\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Verse
\end_layout
\begin_layout Verse
\begin_layout Standard
Note: it is sometimes sufficient to disable only a specific interrupt source
like f.e.
\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
+ a timer or serial interrupt by manipulating an
\emph on
interrupt mask
\begin_inset LatexCommand \index{interrupt mask}
\emph on
interrupt mask
\begin_inset LatexCommand \index{interrupt mask}
\end_layout
\begin_layout Standard
Usually the time during which interrupts are disabled should be kept as
short as possible.
\end_layout
\begin_layout Standard
Usually the time during which interrupts are disabled should be kept as
short as possible.
\emph on
interrupt latency
\emph default
\emph on
interrupt latency
\emph default
\end_inset
(the time between the occurrence of the interrupt and the execution of
\end_inset
(the time between the occurrence of the interrupt and the execution of
- the first code in the interrupt routine) and
+ the first code in the interrupt routine) and
\emph on
interrupt jitter
\emph default
\emph on
interrupt jitter
\emph default
\begin_layout Standard
You can reenable interrupts within an interrupt routine and on some architecture
\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
+s you can make use of two (or more) levels of
\emph on
interrupt priorities
\emph default
\emph on
interrupt priorities
\emph default
\end_inset
and don't add complexity unless you have to.
\end_inset
and don't add complexity unless you have to.
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
- bit test andclearinstruction.
+ 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
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
\end_inset
don't have to be disabled for the locking operation.
\end_inset
don't have to be disabled for the locking operation.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
clear
\emph default
\emph on
clear
\emph default
- instruction (as opposed to atomic bit test and
+ instruction (as opposed to atomic bit test and
\emph on
set).
\end_layout
\emph on
set).
\end_layout
\begin_layout Standard
Some architectures have support for quickly changing register sets.
\begin_layout Standard
Some architectures have support for quickly changing register sets.
- SDCC supports this feature with the
+ SDCC supports this feature with the
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\emph on
using
\begin_inset LatexCommand \index{using (mcs51, ds390 register bank)}
\end_inset
other than the default bank zero).
\end_inset
other than the default bank zero).
- It should only be applied to
+ It should only be applied to
\emph on
interrupt
\begin_inset LatexCommand \index{interrupt}
\emph on
interrupt
\begin_inset LatexCommand \index{interrupt}
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
using
\emph default
\emph on
using
\emph default
- attribute will have no effect on the generated code for a
+ attribute will have no effect on the generated code for a
\emph on
non-interrupt
\emph default
\emph on
non-interrupt
\emph default
-(pending: Note, nowadays the
+(pending: Note, nowadays the
\emph default
using
\emph on
\emph default
using
\emph on
- attribute has an effect onthe generated code for a
+ attribute has an effect on
+\emph default
+
+\emph on
+the generated code for a
\emph default
non-interrupt
\emph on
\emph default
non-interrupt
\emph on
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
interrupt
\emph default
\emph on
interrupt
\emph default
\end_inset
can interrupt low-priority ones on the 8051 and friends, this means that
\end_inset
can interrupt low-priority ones on the 8051 and friends, this means that
\emph on
using
\emph default
\emph on
using
\emph default
- a particular bank occurs while processing a low-priority ISR
+ a particular bank occurs while processing a low-priority ISR
\emph on
using
\emph default
the same bank, terrible and bad things can happen.
\emph on
using
\emph default
the same bank, terrible and bad things can happen.
- To prevent this, no single register bank should be
+ To prevent this, no single register bank should be
\emph on
used
\emph default
\emph on
used
\emph default
called functions use bank zero.
It is very inefficient to call a function using a different, non-zero bank
from an ISR.
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
\begin_inset VSpace bigskip
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-One of these modules (crtstart.asm) contains a call to the C routine
+One of these modules (crtstart.asm) contains a call to the C routine
\emph on
_sdcc_external_startup()
\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
\emph on
_sdcc_external_startup()
\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
at the start of the CODE area.
This routine is also in the runtime library
\begin_inset LatexCommand \index{Runtime library}
at the start of the CODE area.
This routine is also in the runtime library
\begin_inset LatexCommand \index{Runtime library}
initialization will be skipped and the function main will be invoked.
Otherwise static & global variables will be initialized before the function
main is invoked.
initialization will be skipped and the function main will be invoked.
Otherwise static & global variables will be initialized before the function
main is invoked.
\emph on
_sdcc_external_startup()
\emph default
\emph on
_sdcc_external_startup()
\emph default
needs to be disabled, this is the place to do it.
The startup code clears all internal data memory, 256 bytes by default,
needs to be disabled, this is the place to do it.
The startup code clears all internal data memory, 256 bytes by default,
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-See also the compiler options
+See also the compiler options
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
\begin_layout Standard
While these initialization modules are meant as generic startup code there
might be the need for customization.
\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
+ Let's assume the return value of
\emph on
_sdcc_external_startup()
\emph default
\emph on
_sdcc_external_startup()
\emph default
\emph on
crtstart.asm
\emph default
\emph on
crtstart.asm
\emph default
- should not be checked (or
+ should not be checked (or
\emph on
_sdcc_external_startup()
\emph default
should not be called at all).
\emph on
_sdcc_external_startup()
\emph default
should not be called at all).
- The recommended way would be to copy
+ The recommended way would be to copy
\emph on
crtstart.asm
\emph default
(f.e.
\emph on
crtstart.asm
\emph default
(f.e.
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/device/lib/mcs51/crtstart.asm}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/device/lib/mcs51/crtstart.asm}
\end_inset
-) into the source directory, adapt it there, then assemble it with
+) into the source directory, adapt it there, then assemble it with
\emph on
asx8051 -plosgff
\begin_inset Foot
\emph on
asx8051 -plosgff
\begin_inset Foot
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
- are the assembler options used in
+ are the assembler options used in
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/lib/mcs51/Makefile.in?view=markup }
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/lib/mcs51/Makefile.in?view=markup }
\end_inset
crtstart.asm
\emph default
crtstart.asm
\emph default
- and when linking your project explicitely specify
+ and when linking your project explicitely specify
\emph on
crtstart.rel
\emph default
.
\emph on
crtstart.rel
\emph default
.
- As a bonus a listing of the relocated object file
+ As a bonus a listing of the relocated object file
\emph on
crtstart.rst
\emph default
\emph on
crtstart.rst
\emph default
the startup code is inserted by linking with crt0.o which is generated from
sdcc/device/lib/z80/crt0.s.
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
+ If you need a different startup code you can use the compiler option
\end_inset
and provide your own crt0.o.
\end_inset
and provide your own crt0.o.
\begin_inset VSpace bigskip
\end_inset
\begin_inset VSpace bigskip
\end_inset
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
\end_inset
\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
\end_inset
-void to_buffer( unsigned char c )
+void to_buffer( unsigned char c )
\InsetSpace ~
if( head != (unsigned char)(tail-1)
)\InsetSpace ~
\InsetSpace ~
if( head != (unsigned char)(tail-1)
)\InsetSpace ~
\series bold
needed
\series default
\series bold
needed
\series default
\InsetSpace ~
/* access to a 256 byte aligned array */
\newline
\InsetSpace ~
/* access to a 256 byte aligned array */
\newline
\end_layout
\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.
\end_layout
\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
+ 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 ':'.
\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 ':'.
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes srd
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\InsetSpace ~
\InsetSpace ~
The
\InsetSpace ~
\InsetSpace ~
The
- function is not yet OK! (registers aren't saved) */
+ function is not yet OK! (registers aren't saved) */
\newline
void to_buffer_asm(
\newline
void to_buffer_asm(
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
;buffer.c if( head != (unsigned char)(tail-1) ) \InsetSpace ~
\newline
;buffer.c if( head != (unsigned char)(tail-1) ) \InsetSpace ~
\series bold
needed
\series default
\series bold
needed
\series default
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
dec\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
dec\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-;buffer.c
- buf[ head++ ] = c; /* access to a 256 byte aligned array */
+;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */
\begin_inset LatexCommand \index{Aligned array}
\end_inset
\begin_inset LatexCommand \index{Aligned array}
\end_inset
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
inc\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
inc\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
movx @dptr,a
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
movx @dptr,a
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_inset LatexCommand \index{\_endasm}
\end_inset
\begin_inset LatexCommand \index{\_endasm}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\InsetSpace ~
\InsetSpace ~
; save used registers here.
\InsetSpace ~
\InsetSpace ~
; save used registers here.
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-; If we were still using r2,r3 we would have to
- push them here.
+; If we were still using r2,r3 we would have to push them here.
+
\newline
; if( head != (unsigned char)(tail-1) )
\newline
\newline
; if( head != (unsigned char)(tail-1) )
\newline
\InsetSpace ~
\InsetSpace ~
xrl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
xrl\InsetSpace ~
a,_head
\newline
\InsetSpace ~
a,_head
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-; we could do an ANL a,#0x0f here to use a smaller buffer (see below)
+; we
+ could do an ANL a,#0x0f here to use a smaller buffer (see below)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
jz\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
jz\InsetSpace ~
\InsetSpace ~
t_b_end$
\newline
\InsetSpace ~
t_b_end$
\newline
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-; dpl holds lower byte of function
- argument
+; dpl holds lower byte of function argument
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
dpl,_head \InsetSpace ~
\InsetSpace ~
\InsetSpace ~
dpl,_head \InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-m
-ov\InsetSpace ~
- dph,#(_buf>>8)
+mov\InsetSpace ~
+ dph,#(_bu
+f>>8)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-; we could do an ANL _head,#0x0f here
- to use a smaller buffer (see above)
+; we could do an ANL _head,#0x0f here to use a
+ smaller buffer (see above)
\newline
t_b_end$:
\newline
\newline
t_b_end$:
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-; restore used registers here
+; restore used registers here
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_inset LatexCommand \index{\_endasm}
\end_inset
\begin_inset LatexCommand \index{\_endasm}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The compiler does not do any validation of the code within the
+The compiler does not do any validation of the code within the
\family typewriter
_asm
\begin_inset LatexCommand \index{\_asm}
\family typewriter
_asm
\begin_inset LatexCommand \index{\_asm}
\end_inset
has to be done manually.
\end_inset
has to be done manually.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
.
There are only a few (if any) cases where this option makes sense, it might
cause some unexpected changes in the inline assembler code.
.
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
+ Please go through the peephole optimizer rules defined in file
\emph on
SDCCpeeph.def
\emph default
\emph on
SDCCpeeph.def
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-A special keyword may be associated with a function declaring it as
+A special keyword may be associated with a function declaring it as
\emph on
_naked
\begin_inset LatexCommand \index{\_naked}
\emph on
_naked
\begin_inset LatexCommand \index{\_naked}
\emph on
_naked
\emph default
\emph on
_naked
\emph default
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
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
\emph on
return
\emph default
\emph on
return
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\emph on
outdated
\emph default
example, recent versions of SDCC generate
\newline
\emph on
outdated
\emph default
example, recent versions of SDCC generate
\newline
\emph on
same
\emph default
\emph on
same
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-While there is nothing preventing you from writing C code inside a
+While there is nothing preventing you from writing C code inside a
\family typewriter
_naked
\family default
\family typewriter
_naked
\family default
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
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
\emph on
nnnnn$
\emph default
where nnnnn is a number less than 100 (which implies a limit of utmost
- 100 inline assembler labels
+ 100 inline assembler labels
\emph on
per function
\emph default
\emph on
per function
\emph default
\end_layout
\begin_layout Verse
\end_layout
\begin_layout Verse
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
_endasm
\begin_inset LatexCommand \index{\_endasm}
\newline
_endasm
\begin_inset LatexCommand \index{\_endasm}
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
_endasm;
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
_endasm;
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-/* some
- more c code */
\newline
clabel:\InsetSpace ~
\InsetSpace ~
\newline
clabel:\InsetSpace ~
\InsetSpace ~
-/* inline assembler cannot reference this label */
+/* inline assembler cannot reference this
+ label */
\begin_inset Foot
status open
\begin_layout Standard
\begin_inset Foot
status open
\begin_layout Standard
\family typewriter
clabel
\family default
\family typewriter
clabel
\family default
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-0003$: ;label (can be referenced by inline assembler only)
+0003$: ;label (can be referenced by inline assembler only)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The compiler always uses the global registers
+The compiler always uses the global registers
\emph on
DPL, DPH
\begin_inset LatexCommand \index{DPTR, DPH, DPL}
\emph on
DPL, DPH
\begin_inset LatexCommand \index{DPTR, DPH, DPL}
\emph default
and
\emph on
\emph default
and
\emph on
\emph default
to pass the first (non-bit) parameter to a function, and also to pass the
\emph default
to pass the first (non-bit) parameter to a function, and also to pass the
\begin_inset LatexCommand \index{return value}
\end_inset
of function; according to the following scheme: one byte return value in
\begin_inset LatexCommand \index{return value}
\end_inset
of function; according to the following scheme: one byte return value in
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
DPH
\emph default
(MSB).
\emph on
DPH
\emph default
(MSB).
- three byte values (generic pointers) in
+ three byte values (generic pointers) in
\emph on
DPH
\emph default
\emph on
DPH
\emph default
\emph on
DPL
\emph default
\emph on
DPL
\emph default
-, and four byte values in
+, and four byte values in
\emph on
DPH
\emph default
\emph on
DPH
\emph default
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
ACC
\emph default
\emph on
ACC
\emph default
- contain type of accessed memory in
+ contain type of accessed memory in
\series bold
0x00
\series default
\series bold
0x00
\series default
\series bold
0x40
\series default
\series bold
0x40
\series default
\series bold
0x60
\series default
\series bold
0x60
\series default
\series bold
0x80
\series default
\series bold
0x80
\series default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Unless the called function is declared as
+Unless the called function is declared as
\family typewriter
_naked
\family default
\family typewriter
_naked
\family default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-If the called function is not declared as
+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
\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
+ use different register banks (having them defined by the
\family typewriter
_using
\family default
modifier).
\family typewriter
_using
\family default
modifier).
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The called function can also use
+The called function can also use
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
DPH
\emph default
\emph on
DPH
\emph default
\emph on
ACC
\emph default
\emph on
ACC
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
_asm_func_PARM_2:
\newline
\newline
_asm_func_PARM_2:
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Standard
The parameter naming convention is _<function_name>_PARM_<n>, where n is
the parameter number starting from 1, and counting from the left.
\begin_layout Standard
The parameter naming convention is _<function_name>_PARM_<n>, where n is
the parameter number starting from 1, and counting from the left.
- The first parameter is passed in
+ The first parameter is passed in
\emph on
DPH
\emph default
\emph on
DPH
\emph default
\emph on
DPL
\emph default
\emph on
DPL
\emph default
\emph on
ACC
\emph default
\emph on
ACC
\emph default
- c_func (unsigned char i, unsigned char j, unsigned char k) reentrant
+ c_func (unsigned char i, unsigned char j, unsigned char k) reentrant
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-return
- asm_func(i,j,k);
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
push\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
push\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-;stack contains: _bp, return address,
- second parameter, third parameter
+;stack contains: _bp, return
+ address, second parameter, third parameter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
pop\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
pop\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Since they are compiled as
+Since they are compiled as
\emph on
non-reentrant
\emph default
\emph on
non-reentrant
\emph default
service routines should not do any of the above operations.
If this is unavoidable then the above routines will need to be compiled
service routines should not do any of the above operations.
If this is unavoidable then the above routines will need to be compiled
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
- option, after which the source program will have to be compiled with
+ option, after which the source program will have to be compiled with
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
-subtract floating point numbers
+subtract floating point numbers
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
-divide floating point numbers
+divide floating point numbers
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
\bar no
\noun off
\color none
-multiply floating point numbers
+multiply floating point numbers
not
\emph default
sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
not
\emph default
sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
-As usual on embedded systems you have to provide your own
+As usual on embedded systems you have to provide your own
\family typewriter
getchar()
\begin_inset LatexCommand \index{getchar()}
\end_inset
\family typewriter
getchar()
\begin_inset LatexCommand \index{getchar()}
\end_inset
\family typewriter
putchar()
\begin_inset LatexCommand \index{putchar()}
\family typewriter
putchar()
\begin_inset LatexCommand \index{putchar()}
routines.
SDCC does not know whether the system connects to a serial line with or
without handshake, LCD, keyboard or other device.
routines.
SDCC does not know whether the system connects to a serial line with or
without handshake, LCD, keyboard or other device.
\family typewriter
lf
\family default
\family typewriter
lf
\family default
\family typewriter
crlf
\family default
\family typewriter
crlf
\family default
\family typewriter
putchar()
\family default
is intended.
You'll find examples for serial routines f.e.
in sdcc/device/lib.
\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
+ For the mcs51 this minimalistic polling
\family typewriter
putchar()
\family default
\family typewriter
putchar()
\family default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
printf_large.c
\family default
does not support float (except on ds390).
printf_large.c
\family default
does not support float (except on ds390).
- To enable this recompile it with the option
+ To enable this recompile it with the option
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-If you're short on code memory you might want to use
+If you're short on code memory you might want to use
\family typewriter
printf_small()
\begin_inset LatexCommand \index{printf\_small()}
\family typewriter
printf_small()
\begin_inset LatexCommand \index{printf\_small()}
\emph on
instead
\emph default
\emph on
instead
\emph default
printf().
\family default
printf().
\family default
- For the mcs51 there additionally are assembly versions
+ For the mcs51 there additionally are assembly versions
\family typewriter
printf_tiny()
\begin_inset LatexCommand \index{printf\_tiny() (mcs51)}
\family typewriter
printf_tiny()
\begin_inset LatexCommand \index{printf\_tiny() (mcs51)}
- (subset of printf using less than 270 bytes) and
+ (subset of printf using less than 270 bytes) and
\family typewriter
printf_fast()
\begin_inset LatexCommand \index{printf\_fast() (mcs51)}
\end_inset
\family typewriter
printf_fast()
\begin_inset LatexCommand \index{printf\_fast() (mcs51)}
\end_inset
\family default
and
\family typewriter
\family default
and
\family typewriter
\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
\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
\emph on
not
\emph default
\emph on
not
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Feature matrix of different
+Feature matrix of different
\emph on
printf
\emph default
\emph on
printf
\emph default
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\size scriptsize
USE_FLOATS=1
\end_layout
\size scriptsize
USE_FLOATS=1
\end_layout
\emph on
LGPL
\emph default
\emph on
LGPL
\emph default
C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory
cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel,
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
+ Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list
\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-SDCC allows three memory models for MCS51 code,
+SDCC allows three memory models for MCS51 code,
\shape slanted
small, medium
\shape default
\shape slanted
small, medium
\shape default
\shape slanted
large
\shape default
.
\shape slanted
large
\shape default
.
- Modules compiled with different memory models should
+ Modules compiled with different memory models should
\emph on
never
\emph default
\emph on
never
\emph default
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
\begin_inset LatexCommand \ref{sub:MCS51-variants}
\end_inset
-), therefore when using the External Stack option, this port
+), therefore when using the External Stack option, this port
\emph on
may not
\emph default
\emph on
may not
\emph default
\newline
Note
that the compiler does not generate any code to place the processor into
\newline
Note
that the compiler does not generate any code to place the processor into
\emph on
tinibios
\emph default
in the ds390 libraries will do that for you).
\emph on
tinibios
\emph default
in the ds390 libraries will do that for you).
\emph on
tinibios
\emph default
\emph on
tinibios
\emph default
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
-model-large
\emph default
option, variables will by default be placed into the XDATA segment.
-model-large
\emph default
option, variables will by default be placed into the XDATA segment.
-Segments
- may be placed anywhere in the 4 meg address space using the usual -
+Segments may be placed anywhere in the 4 meg address space using the usual
+ -
\begin_inset ERT
status collapsed
\begin_inset ERT
status collapsed
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.
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
+ The -r flag can be passed to the linker by using the option
\emph on
-Wl-r
\emph default
\emph on
-Wl-r
\emph default
\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
\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
\begin_inset LatexCommand \vref{sec:Command-Line-Options}
\end_inset
\begin_inset LatexCommand \vref{sec:Command-Line-Options}
\end_inset
- function1[,function2[,function3...]]
+ function1[,function2[,function3...]]
\begin_inset LatexCommand \label{ite:callee_saves-function1[,function2[,function3...]]--}
\end_inset
\begin_inset LatexCommand \label{ite:callee_saves-function1[,function2[,function3...]]--}
\end_inset
--callee-saves command line option is used (see page
+-callee-saves command line option is used (see page
\begin_inset LatexCommand \vpageref{lyx:--callee-saves-function1[,function2][,function3]...}
\end_inset
\begin_inset LatexCommand \vpageref{lyx:--callee-saves-function1[,function2][,function3]...}
\end_inset
\begin_inset LatexCommand \label{ite:less_pedantic}
\end_inset
\begin_inset LatexCommand \label{ite:less_pedantic}
\end_inset
\begin_inset LatexCommand \vpageref{lyx:--less-pedantic}
\end_inset
.
\begin_inset LatexCommand \vpageref{lyx:--less-pedantic}
\end_inset
.
-More specifically, the following warnings will be disabled:
+More specifically, the following warnings will be disabled:
\shape italic
comparison is always [true/false] due to limited range of data type
\shape default
\shape italic
comparison is always [true/false] due to limited range of data type
\shape default
\shape italic
overflow in implicit constant conversion
\shape default
\shape italic
overflow in implicit constant conversion
\shape default
- (158); [the (in)famous]
+ (158); [the (in)famous]
\shape italic
conditional flow changed by optimizer: so said EVELYN the modified DOG
\shape default
\shape italic
conditional flow changed by optimizer: so said EVELYN the modified DOG
\shape default
\shape italic
function '[function name]' must return value
\shape default
(59).
\shape italic
function '[function name]' must return value
\shape default
(59).
\newline
Furthermore, warnings of less importance (of PEDANTIC and INFO warning
\newline
Furthermore, warnings of less importance (of PEDANTIC and INFO warning
- level) are disabled, too, namely:
+ level) are disabled, too, namely:
\shape italic
constant value '[
\begin_inset Note Note
\shape italic
constant value '[
\begin_inset Note Note
]', out of range
\shape default
]', out of range
\shape default
\shape italic
[left/right] shifting more than size of object changed to zero
\shape default
\shape italic
[left/right] shifting more than size of object changed to zero
\shape default
\shape italic
unreachable code
\shape default
\shape italic
unreachable code
\shape default
\shape italic
integer overflow in expression
\shape default
\shape italic
integer overflow in expression
\shape default
\shape italic
unmatched #pragma save and #pragma restore
\shape default
\shape italic
unmatched #pragma save and #pragma restore
\shape default
\shape italic
comparison of 'signed char' with 'unsigned char' requires promotion to int
\shape default
\shape italic
comparison of 'signed char' with 'unsigned char' requires promotion to int
\shape default
\shape italic
ISO C90 does not support flexible array members
\shape default
\shape italic
ISO C90 does not support flexible array members
\shape default
\shape italic
extended stack by [number] bytes for compiler temp(s) :in function '[function\InsetSpace ~
nam
\shape italic
extended stack by [number] bytes for compiler temp(s) :in function '[function\InsetSpace ~
nam
\shape italic
function '[function name]', # edges [number] , # nodes [number] , cyclomatic
complexity [number]
\shape italic
function '[function name]', # edges [number] , # nodes [number] , cyclomatic
complexity [number]
table (e.g.
for the autovector feature of the Cypress EZ-USB FX2).
More elegantly this can be achieved by obmitting the optional interrupt
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
+ number after the interrupt keyword, see section
\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines}
\end_inset
\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines}
\end_inset
- will not generate code for boundary value checking, when switch statements
are turned into jump-tables (dangerous).
- will not generate code for boundary value checking, when switch statements
are turned into jump-tables (dangerous).
- For more details see section
+ For more details see section
\begin_inset LatexCommand \ref{sub:'switch'-Statements}
\end_inset
\begin_inset LatexCommand \ref{sub:'switch'-Statements}
\end_inset
\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
\end_inset
\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
\end_inset
\series bold
opt_code_speed
\series default
\series bold
opt_code_speed
\series default
\begin_inset LatexCommand \index{\#pragma opt\_code\_speed}
\end_inset
\begin_inset LatexCommand \index{\#pragma opt\_code\_speed}
\end_inset
\series bold
opt_code_size
\series default
\series bold
opt_code_size
\series default
\begin_inset LatexCommand \index{\#pragma opt\_code\_size}
\end_inset
\begin_inset LatexCommand \index{\#pragma opt\_code\_size}
\end_inset
\series bold
opt_code_balanced
\series default
\series bold
opt_code_balanced
\series default
\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced}
\end_inset
\begin_inset LatexCommand \index{\#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).
- 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
\end_layout
\begin_layout Itemize
\series bold
std_sdcc89
\series default
\series bold
std_sdcc89
\series default
\begin_inset LatexCommand \index{\#pragma std\_sdcc89}
\end_inset
\begin_inset LatexCommand \index{\#pragma std\_sdcc89}
\end_inset
\series bold
std_c89
\series default
\series bold
std_c89
\series default
\begin_inset LatexCommand \index{\#pragma std\_c89}
\end_inset
\begin_inset LatexCommand \index{\#pragma std\_c89}
\end_inset
\series bold
std_sdcc99
\series default
\series bold
std_sdcc99
\series default
\begin_inset LatexCommand \index{\#pragma std\_sdcc99}
\end_inset
\begin_inset LatexCommand \index{\#pragma std\_sdcc99}
\end_inset
\series bold
std_c99
\series default
\series bold
std_c99
\series default
\begin_inset LatexCommand \index{\#pragma std\_c99}
\end_inset
\begin_inset LatexCommand \index{\#pragma std\_c99}
\end_inset
\begin_inset LatexCommand \label{ite:pedantic_parse_number}
\end_inset
\begin_inset LatexCommand \label{ite:pedantic_parse_number}
\end_inset
--pedantic-parse-number command line option
+-pedantic-parse-number command line option
\begin_inset LatexCommand \vpageref{lyx:-pedantic-parse-number}
\end_inset
.
\begin_inset LatexCommand \vpageref{lyx:-pedantic-parse-number}
\end_inset
.
\newline
Below is an example on how to use this pragma.
\newline
Below is an example on how to use this pragma.
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\InsetSpace ~
\InsetSpace ~
...
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-mov R7_B3, #((x >> 8) & 0xff)
+mov R7_B3, #((x >> 8) & 0xff)
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.
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
\end_layout
\begin_layout Verse
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-/* save the current settings */
+/* save the current settings */
\newline
#pragma nogcse
\begin_inset LatexCommand \index{\#pragma nogcse}
\newline
#pragma nogcse
\begin_inset LatexCommand \index{\#pragma nogcse}
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-/* turnoff global subexpression elimination */
+/* turnoff global subexpression elimination */
\newline
#pragma noinduction
\begin_inset LatexCommand \index{\#pragma noinduction}
\end_inset
\newline
#pragma noinduction
\begin_inset LatexCommand \index{\#pragma noinduction}
\end_inset
- /* turn off induction optimizations */
+ /* turn off induction optimizations */
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
#pragma restore
\begin_inset LatexCommand \index{\#pragma restore}
\newline
#pragma restore
\begin_inset LatexCommand \index{\#pragma restore}
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-mds390
\emph default
\emph on
-mds390
\emph default
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
-mds390
\emph default
\emph on
-mds390
\emph default
flavours.
While they might differ considerably in respect to Special Function Registers
the core MCS51 is usually not modified or is kept compatible.
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
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
- In well-established MCS51 tradition the address of this
+ In well-established MCS51 tradition the address of this
\emph on
sfr
\emph default
\emph on
sfr
\emph default
\begin_layout Standard
For more exotic implementations further customizations may be needed.
\begin_layout Standard
For more exotic implementations further customizations may be needed.
\begin_inset LatexCommand \ref{sub:Startup-Code}
\end_inset
\begin_inset LatexCommand \ref{sub:Startup-Code}
\end_inset
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
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
\size footnotesize
\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html}
\size footnotesize
\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html}
\begin_inset VSpace bigskip
\end_inset
\begin_inset VSpace bigskip
\end_inset
- The Z80 port is passed through the same
+ The Z80 port is passed through the same
\emph on
regressions tests
\begin_inset LatexCommand \index{Regression test}
\emph on
regressions tests
\begin_inset LatexCommand \index{Regression test}
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The HC08 port passes the regression test suite (see section
+The HC08 port passes the regression test suite (see section
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-An up-to-date list of currently supported devices can be obtained via
+An up-to-date list of currently supported devices can be obtained via
\family typewriter
sdcc -mpic14 -phelp foo.c
\family default
\family typewriter
sdcc -mpic14 -phelp foo.c
\family default
page.
In order to make use of multiple code pages, separate asm files must be
used.
page.
In order to make use of multiple code pages, separate asm files must be
used.
- The compiler assigns all
+ The compiler assigns all
\emph on
static
\emph default
\emph on
static
\emph default
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
-Adding New Devices to the Port
+Adding New Devices to the Port
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
These files primarily define SFRs, structs to access their bits, and symbolic
configuration options.
Both files can be generated from gputils' .inc files using the perl script
These files primarily define SFRs, structs to access their bits, and symbolic
configuration options.
Both files can be generated from gputils' .inc files using the perl script
\family typewriter
support/scripts/inc2h.pl
\family default
\family typewriter
support/scripts/inc2h.pl
\family default
\begin_layout Enumerate
Copy the .h file into SDCC's include path and either add the .c file to your
\begin_layout Enumerate
Copy the .h file into SDCC's include path and either add the .c file to your
\family typewriter
device/lib/pic/libdev
\family default
\family typewriter
device/lib/pic/libdev
\family default
\family typewriter
device/include/pic/
\family default
\family typewriter
device/include/pic/
\family default
\family typewriter
/usr/local/share/sdcc/include/pic
\family default
\family typewriter
/usr/local/share/sdcc/include/pic
\family default
\end_inset
gpasm.exe or MPLAB's mpasmwin.exe.
\end_inset
gpasm.exe or MPLAB's mpasmwin.exe.
- GPUTILS are available from
+ GPUTILS are available from
\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
\end_inset
\family typewriter
Makefile
\family default
\family typewriter
Makefile
\family default
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcc -V -mpic14 -p16f877 -c $<
+sdcc -V -mpic14 -p16f877 -c $<
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\family typewriter
Makefile
\family default
\family typewriter
Makefile
\family default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcc -S -V -mpic14 -p16f877 $<
+sdcc -S -V -mpic14 -p16f877 $<
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
$(PRJ).hex: $(OBJS)
\newline
$(PRJ).hex: $(OBJS)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-mplink
- /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib
+mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
The PIC14 library currently only contains support routines required by the
compiler to implement multiplication, division, and floating point support.
No libc-like replacement is available at the moment, though many of the
The PIC14 library currently only contains support routines required by the
compiler to implement multiplication, division, and floating point support.
No libc-like replacement is available at the moment, though many of the
- common sdcc library sources (in
+ common sdcc library sources (in
\family typewriter
device/lib
\family default
\family typewriter
device/lib
\family default
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
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
\family typewriter
libsdcc.lib
\family default
.
For single source file projects this is done automatically, more complex
\family typewriter
libsdcc.lib
\family default
\family typewriter
libsdcc.lib
\family default
\begin_layout Standard
You might also consider recompiling the library for your specific device
\begin_layout Standard
You might also consider recompiling the library for your specific device
- by changing the ARCH=p16f877 (default target) entry in
+ by changing the ARCH=p16f877 (default target) entry in
\family typewriter
device/lib/pic/Makefile.in
\family default
\family typewriter
device/lib/pic/Makefile.in
\family default
\family typewriter
device/lib/pic/Makefile
\family default
\family typewriter
device/lib/pic/Makefile
\family default
\labelwidthstring 00.00.0000
2 tries to check the location of (even different) symbols and removes BANKSELs
if they are in the same bank.
\labelwidthstring 00.00.0000
2 tries to check the location of (even different) symbols and removes BANKSELs
if they are in the same bank.
--ivt-loc=n Place the interrupt vector table at address
+-ivt-loc=n Place the interrupt vector table at address
of bitfields.
(i.e., 80 bytes of code space are saved when compiling malloc.c with this
option).
of bitfields.
(i.e., 80 bytes of code space are saved when compiling malloc.c with this
option).
\end_layout
\begin_layout Description
\end_layout
\begin_layout Description
\begin_layout Standard
MCU Identification.
\begin_layout Standard
MCU Identification.
\emph on
xxxx
\emph default
\emph on
xxxx
\emph default
\begin_layout Standard
MCU Identification.
\begin_layout Standard
MCU Identification.
\emph on
xxxx
\emph default
\emph on
xxxx
\emph default
\begin_layout Standard
This feature allows for linking with specific libraries withoug having to
explicit name them in the command line.
\begin_layout Standard
This feature allows for linking with specific libraries withoug having to
explicit name them in the command line.
\noun on
ignore
\noun default
\noun on
ignore
\noun default
\series bold
pic18fregs.h
\series default
\series bold
pic18fregs.h
\series default
port depends on are the microcontroller device libraries which contain
the symbol definitions for the microcontroller special function registers.
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
+ These libraries have the format pic18fxxxx.lib, where
\emph on
xxxx
\emph default
\emph on
xxxx
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Libraries are created with gplib which is part of the gputils package
+Libraries are created with gplib which is part of the gputils package
\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
\end_inset
\begin_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
\begin_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
\emph on
every
\emph default
supported device.
This way building will take quite a lot of time.
\emph on
every
\emph default
supported device.
This way building will take quite a lot of time.
- Users are advised to edit the
+ Users are advised to edit the
\series bold
device/lib/pic16/pics.build
\series default
\series bold
device/lib/pic16/pics.build
\series default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\family typewriter
/path/to/sdcc/device/lib/pic16/pics.all
\family default
\family typewriter
/path/to/sdcc/device/lib/pic16/pics.all
\family default
\family typewriter
.build
\family default
\family typewriter
.build
\family default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\family typewriter
/path/to/sdcc/device/lib/pic16/libio/*.ignore
\family default
\newline
\family typewriter
/path/to/sdcc/device/lib/pic16/libio/*.ignore
\family default
\newline
-Add your DEVICE if it does not compile in
+Add your DEVICE if it does not compile in
\family typewriter
adc
\family default
\family typewriter
adc
\family default
\family typewriter
i2c
\family default
\family typewriter
i2c
\family default
\family typewriter
usart
\family default
\family typewriter
usart
\family default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\family typewriter
/path/to/sdcc/device/include/pic16/pic18fregs.h
\family default
\family typewriter
/path/to/sdcc/device/include/pic16/pic18fregs.h
\family default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\family typewriter
/path/to/sdcc/src/pic16/devices.inc
\family default
\family typewriter
/path/to/sdcc/src/pic16/devices.inc
\family default
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
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
\series bold
far
\series default
\series bold
far
\series default
\series bold
near
\series default
\series bold
near
\series default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The standard device libraries (see
+The standard device libraries (see
\begin_inset LatexCommand \ref{sub:PIC16_Header-Files}
\end_inset
\begin_inset LatexCommand \ref{sub:PIC16_Header-Files}
\end_inset
Small
\noun default
model means that only the FSRxL byte is used to access stack and frame,
Small
\noun default
model means that only the FSRxL byte is used to access stack and frame,
\begin_layout Standard
\noun on
\begin_layout Standard
\noun on
\noun default
stack model is currently not working properly throughout the code generator.
So its use is not advised.
\noun default
stack model is currently not working properly throughout the code generator.
So its use is not advised.
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.
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
+ This can be done by adding the keyword
\emph on
shadowregs
\emph default
\emph on
shadowregs
\emph default
\emph on
interrupt
\emph default
\emph on
interrupt
\emph default
- service routine (ISR) is declared using the
+ service routine (ISR) is declared using the
\emph on
interrupt
\emph default
\emph on
interrupt
\emph default
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
-void isr(void) interrupt
+void isr(void) interrupt
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-When generating assembly code for ISR the code generator places a
+When generating assembly code for ISR the code generator places a
\emph on
Interrupt Vector Address
\emph default
which points at the genetated ISR.
\emph on
Interrupt Vector Address
\emph default
which points at the genetated ISR.
- This single GOTO instruction is part of an automatically generated
+ This single GOTO instruction is part of an automatically generated
\emph on
interrupt entry point
\emph default
\emph on
interrupt entry point
\emph default
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.
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
+ When declaring interrupt functions as _naked this GOTO instruction is
\series bold
not
\series default
\series bold
not
\series default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
-this is a HIGH interrupt ISR and LOW interrupts are
+this is a HIGH interrupt ISR and LOW interrupts are
\emph on
disabled
\emph default
\emph on
disabled
\emph default
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
stdio.h
\emph default
\emph on
stdio.h
\emph default
\begin_layout Standard
The FILE type is actually a generic pointer which defines one more type
\begin_layout Standard
The FILE type is actually a generic pointer which defines one more type
- of generic pointers, the
+ of generic pointers, the
\emph default
pointer.
This new type has the format:
\emph default
pointer.
This new type has the format:
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-In order to increase performance
+In order to increase performance
\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 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
\emph on
arg
\emph default
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-For sprintf and vsprintf
+For sprintf and vsprintf
\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.
\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
+ For fprintf and vfprintf
\emph on
fp
\emph default
\emph on
fp
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The prototypes for these names are defined in the header file
+The prototypes for these names are defined in the header file
\emph on
signal.h
\emph default
\emph on
signal.h
\emph default
\labelwidthstring 00.00.0000
DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
high priority interrupts.
\labelwidthstring 00.00.0000
DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
high priority interrupts.
\emph on
name
\emph default
\emph on
name
\emph default
\labelwidthstring 00.00.0000
DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
low priority interrupt.
\labelwidthstring 00.00.0000
DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
low priority interrupt.
\emph on
name
\emph default
\emph on
name
\emph default
\begin_layout List
\labelwidthstring 00.00.0000
\begin_layout List
\labelwidthstring 00.00.0000
-DEF_HANDLER(sig,handler) define a handler for signal
+DEF_HANDLER(sig,handler) define a handler for signal
\emph on
sig.
\end_layout
\emph on
sig.
\end_layout
\labelwidthstring 00.00.0000
\series medium
\labelwidthstring 00.00.0000
\series medium
-this declares the function prototype for the
+this declares the function prototype for the
\emph on
handler
\emph default
\emph on
handler
\emph default
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-when declaring SIGHANDLERNAKED handler never forget to use
+when declaring SIGHANDLERNAKED handler never forget to use
\emph on
retfie
\emph default
\emph on
retfie
\emph default
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\begin_inset LatexCommand \ref{sec:Quality-control}
\end_inset
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
) on how to handle syntax extensions like __xdata, __at(), ...
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
) on how to handle syntax extensions like __xdata, __at(), ...
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-there is a separate section about SDCDB (section
+there is a separate section about SDCDB (section
\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
\end_inset
\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
\end_inset
\begin_inset LatexCommand \ref{OMF file}
\end_inset
\begin_inset LatexCommand \ref{OMF file}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
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
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_inset
\begin_inset LatexCommand \ref{sec:Related-open-source-tools}
\end_inset
\begin_layout Itemize
toggle MCU port pins at strategic points within your code and use an oscilloscop
e.
\begin_layout Itemize
toggle MCU port pins at strategic points within your code and use an oscilloscop
e.
\emph on
digital oscilloscope
\emph default
\emph on
digital oscilloscope
\emph default
resistor to the oscilloscope probe (check output drive capability of the
pins you want to monitor).
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
+ If you need to monitor many more pins a
\emph on
logic analyzer
\emph default
\emph on
logic analyzer
\emph default
Usually very expensive.
And very nice to have too.
And usually locks you (for years...) to the devices the ICE can emulate.
Usually very expensive.
And very nice to have too.
And usually locks you (for years...) to the devices the ICE can emulate.
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
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.
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.
-Terms to enter into
- your favourite search engine could be 'remote debugging', 'gdb stub' or
- 'inferior debugger'.
+Terms to enter into your favourite search engine could be 'remote debugging',
+ 'gdb stub' or 'inferior debugger'.
(is there one?)
\end_layout
(is there one?)
\end_layout
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
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
\emph on
usually
\emph default
\begin_inset LatexCommand \ref{OMF file}
\end_inset
) as input file.
\begin_inset LatexCommand \ref{OMF file}
\end_inset
) as input file.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Itemize
if you are not familiar with any of the following terms you're likely to
\begin_layout Itemize
if you are not familiar with any of the following terms you're likely to
- run into problems rather sooner than later:
+ run into problems rather sooner than later:
\emph on
volatile
\emph default
\emph on
volatile
\emph default
\emph on
atomic
\emph default
\emph on
atomic
\emph default
\emph on
memory map
\emph default
\emph on
memory map
\emph default
\emph on
overlay
\emph default
.
\emph on
overlay
\emph default
.
- As an embedded programmer you
+ As an embedded programmer you
\emph on
have
\emph default
\emph on
have
\emph default
- to know them so why not look them up
+ to know them so why not look them up
\emph on
before
\emph default
\emph on
before
\emph default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
execution is controlled by the debugger.
When a command is issued for the debugger, it translates it into appropriate
commands for the simulator.
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
+ (Currently SDCDM only connects to the simulator but
\emph on
newcdb
\emph default
\emph on
newcdb
\emph default
\begin_inset LatexCommand \url{http://ec2drv.sf.net/}
\end_inset
\begin_inset LatexCommand \url{http://ec2drv.sf.net/}
\end_inset
- is an effort to connect directly to the hardware.)
+ is an effort to connect directly to the hardware.)
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
-directory=/home/src1:/home/src2.
Note there can be no spaces in the option.
-directory=/home/src1:/home/src2.
Note there can be no spaces in the option.
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\family sans
\series bold
\family sans
\series bold
\newline
sdcdb>break foo.c:100
\newline
\newline
sdcdb>break foo.c:100
\newline
\end_layout
\begin_layout Subsubsection*
\end_layout
\begin_layout Subsubsection*
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
status collapsed
\begin_layout Standard
status collapsed
\begin_layout Standard
-The screenshot was converted from png to eps with:
+The screenshot was converted from png to eps with:
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\size footnotesize
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png}
\size footnotesize
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png}
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.
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.
-The source was compiled with
+The source was compiled with
\family sans
\series bold
\family sans
\series bold
\family sans
\series bold
-debug ddd_example.c
\family sans
\series bold
-debug ddd_example.c
+\family default
+\series default
+
+\family sans
+\series bold
+
\newline
\family default
\series default
\newline
\newline
\family default
\series default
\newline
-and DDD was invoked with
+and DDD was invoked with
\family sans
\series bold
\family sans
\series bold
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
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):
+ your '.xemacs' file (which can be found in your HOME directory):
\newline
\newline
\family typewriter
\newline
\newline
\family typewriter
The files can also be loaded dynamically while XEmacs is running, set the
environment variable 'EMACSLOADPATH' to the installation bin directory
(<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
The files can also be loaded dynamically while XEmacs is running, set the
environment variable 'EMACSLOADPATH' to the installation bin directory
(<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
- To start the interface enter the following command:
+ To start the interface enter the following command:
\newline
You will prompted to enter the file name to be debugged.
\newline
You will prompted to enter the file name to be debugged.
-The command line
- options that are passed to the simulator directly are bound to default
- values in the file sdcdbsrc.el.
+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.
\end_layout
The variables are listed below, these values maybe changed as required.
\end_layout
\newline
;;key\InsetSpace ~
\InsetSpace ~
\newline
;;key\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;---\InsetSpace ~
\InsetSpace ~
\newline
;;---\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-------
\newline
\InsetSpace ~
-------
\newline
\newline
;;\InsetSpace ~
n\InsetSpace ~
\newline
;;\InsetSpace ~
n\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdb-next-from-s
-rc\InsetSpace ~
+sdcdb-next-fro
+m-src\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
b\InsetSpace ~
\newline
;;\InsetSpace ~
b\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
c\InsetSpace ~
\newline
;;\InsetSpace ~
c\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdb-cont-from-s
-rc\InsetSpace ~
+sdcdb-cont-f
+rom-src\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
?\InsetSpace ~
\newline
;;\InsetSpace ~
?\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdb-whatis-
-c-sexp\InsetSpace ~
+sdcdb-w
+hatis-c-sexp\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-SDCDB ptypecommand for data at
+SDCDB ptypecommand for data at
\newline
;;\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
x\InsetSpace ~
\newline
;;\InsetSpace ~
x\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-SDCDB
- Delete all breakpoints if no arg
+SDCD
+B Delete all breakpoints if no arg
\newline
;;\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-given or delete arg (C-u arg x)
+given or delete arg (C-u arg x)
\newline
;;\InsetSpace ~
m\InsetSpace ~
\newline
;;\InsetSpace ~
m\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdbsrc-fr
-ame\InsetSpace ~
+sdcdbsrc
+-frame\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-SDCDB Display current frame if no arg,
+SDCDB Display current frame if no arg,
\newline
;;\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
given or display frame arg
\InsetSpace ~
\InsetSpace ~
given or display frame arg
\newline
;;\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
!\InsetSpace ~
\newline
;;\InsetSpace ~
!\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-Goto the SDCDB output buffer
+Goto the SDCDB output buffer
\newline
;;\InsetSpace ~
p\InsetSpace ~
\newline
;;\InsetSpace ~
p\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdb-print-c-sexp\InsetSpace ~
+sdcdb-prin
+t-c-sexp\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-SDC
-DB print command for data at
+SDCDB print command for data at
\newline
;;\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
g\InsetSpace ~
\newline
;;\InsetSpace ~
g\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-Goto the
- SDCDB output buffer
+Got
+o the SDCDB output buffer
\newline
;;\InsetSpace ~
t\InsetSpace ~
\newline
;;\InsetSpace ~
t\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-Toggles Sdcdbsrc mode (turns it off)
+Toggles Sdcdbsrc mode (turns it
+ off)
\newline
;;\InsetSpace ~
C-c\InsetSpace ~
\newline
;;\InsetSpace ~
C-c\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
C-x\InsetSpace ~
\newline
;;\InsetSpace ~
C-x\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdb-break\InsetSpace ~
+sdcdb-brea
+k\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-Set break
- for line with point
+Set break for line with point
\newline
;;\InsetSpace ~
ESC\InsetSpace ~
\newline
;;\InsetSpace ~
ESC\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
;;\InsetSpace ~
ESC\InsetSpace ~
\newline
;;\InsetSpace ~
ESC\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-sdcdbsrc-srcmod
-e\InsetSpace ~
+sdc
+dbsrc-srcmode\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\family typewriter
uc * uc
\family default
\family typewriter
uc * uc
\family default
\family typewriter
(int) uc * (int) uc = (int) 0xfe * (int) 0xfe = (int) 0xfc04 = -1024
\family default
.
\family typewriter
(int) uc * (int) uc = (int) 0xfe * (int) 0xfe = (int) 0xfc04 = -1024
\family default
.
\newline
Another one:
\end_layout
\newline
Another one:
\end_layout
gcc uses 32 bit ints, while SDCC uses 16 bit ints.
Therefore the results are different.
\newline
gcc uses 32 bit ints, while SDCC uses 16 bit ints.
Therefore the results are different.
\newline
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-Have a look at the assembly listing to get a
+Have a look at the assembly listing to get a
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/include/mcs51/compiler.h?view=markup}
\end_inset
to allow using common header files.
(see f.e.
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/include/mcs51/compiler.h?view=markup}
\end_inset
to allow using common header files.
(see f.e.
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/include/mcs51/cc2510fx.h?view=markup}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/include/mcs51/cc2510fx.h?view=markup}
\end_inset
\emph on
first
\emph default
\emph on
first
\emph default
\emph on
last
\emph default
relate to time and not to lower/upper memory location here, so this is
\emph on
last
\emph default
relate to time and not to lower/upper memory location here, so this is
\emph on
not
\emph default
\emph on
not
\emph default
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-check whether the keyword
+check whether the keyword
\emph on
volatile
\emph default
\emph on
volatile
\emph default
The compilers might differ in their optimization characteristics (as different
versions of the same compiler might also use more clever optimizations
this is good idea anyway).
The compilers might differ in their optimization characteristics (as different
versions of the same compiler might also use more clever optimizations
this is good idea anyway).
\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
\end_inset
\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
\end_inset
\begin_layout Itemize
check for differences in type promotion.
\begin_layout Itemize
check for differences in type promotion.
- Especially check for math operations on
+ Especially check for math operations on
\family typewriter
char
\family default
\family typewriter
char
\family default
\family typewriter
unsigned char
\family default
variables.
\family typewriter
unsigned char
\family default
variables.
- For the sake of C99 compatibility SDCC will probably promote these to
+ For the sake of C99 compatibility SDCC will probably promote these to
\family typewriter
int
\family default
more often than other compilers.
\family typewriter
int
\family default
more often than other compilers.
- Eventually insert explicit casts to
+ Eventually insert explicit casts to
\family default
or
\family typewriter
\family default
or
\family typewriter
\family typewriter
bit
\begin_inset LatexCommand \index{bit}
\family typewriter
bit
\begin_inset LatexCommand \index{bit}
\family default
variables, use the !\InsetSpace ~
operator instead.
\family default
variables, use the !\InsetSpace ~
operator instead.
\begin_inset LatexCommand \ref{type promotion}
\end_inset
\begin_inset LatexCommand \ref{type promotion}
\end_inset
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
\family typewriter
int
\family default
\family typewriter
int
\family default
\family typewriter
char
\family default
.
\family typewriter
char
\family default
.
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
\begin_inset LatexCommand \ref{sec:Compatibility-with-previous}
\end_inset
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\begin_inset LatexCommand \index{packihx (tool)}
\end_inset
\begin_inset LatexCommand \index{packihx (tool)}
\end_inset
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
-sdcc/doc/test_suite_spec.pdf
+sdcc/doc/test_suite_spec.pdf
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\emph default
\bar default
\noun default
\emph default
\bar default
\noun default
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
\emph on
\InsetSpace ~
\InsetSpace ~
\emph on
\InsetSpace ~
\InsetSpace ~
\begin_inset Text
\begin_layout Standard
\begin_inset Text
\begin_layout Standard
-Statically checks c sources (see
+Statically checks c sources (see
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
\end_inset
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-and a dedicated wiki entry:
+and a dedicated wiki entry:
\begin_inset LatexCommand \url{http://www.cmake.org/Wiki/CmakeSdcc}
\end_inset
\begin_inset LatexCommand \url{http://www.cmake.org/Wiki/CmakeSdcc}
\end_inset
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-Installing and Configuring SDCC and Crimson Editor
+Installing and Configuring SDCC and Crimson Editor
\begin_layout Standard
Some questions answered, some pointers given - it might be time to in turn
\begin_layout Standard
Some questions answered, some pointers given - it might be time to in turn
\emph on
you
\emph default
\emph on
you
\emph default
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\begin_layout Standard
Maybe not all answers to these questions are known and some answers may
\begin_layout Standard
Maybe not all answers to these questions are known and some answers may
\emph on
no
\emph default
\emph on
no
\emph default
You can help by reporting the bugs and helping other SDCC users.
There are lots of ways to contribute, and we encourage you to take part
in making SDCC a great software package.
You can help by reporting the bugs and helping other SDCC users.
There are lots of ways to contribute, and we encourage you to take part
in making SDCC a great software package.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The SDCC project is hosted on the SDCC sourceforge site at
+The SDCC project is hosted on the SDCC sourceforge site at
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
\end_inset
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
\end_inset
\begin_layout Enumerate
Attach the code you are compiling with SDCC.
\begin_layout Enumerate
Attach the code you are compiling with SDCC.
\end_layout
\begin_layout Enumerate
Specify the exact command you use to run SDCC, or attach your Makefile.
\end_layout
\begin_layout Enumerate
Specify the exact command you use to run SDCC, or attach your Makefile.
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
\family default
\series default
"), your platform, and operating system.
\family default
\series default
"), your platform, and operating system.
\end_layout
\begin_layout Enumerate
Provide an exact copy of any error message or incorrect output.
\end_layout
\begin_layout Enumerate
Provide an exact copy of any error message or incorrect output.
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
chance that SDCC users and developers will be able to help you.
Some SDCC developers are frustrated by bug reports without code provided
that they can use to reproduce and ultimately fix the problem, so please
chance that SDCC users and developers will be able to help you.
Some SDCC developers are frustrated by bug reports without code provided
that they can use to reproduce and ultimately fix the problem, so please
- be sure to provide sample code if you are reporting a bug!
+ be sure to provide sample code if you are reporting a bug!
\end_layout
\begin_layout Standard
Please have a short check that you are using a recent version of SDCC and
the bug is not yet known.
\end_layout
\begin_layout Standard
Please have a short check that you are using a recent version of SDCC and
the bug is not yet known.
- This is the link for reporting bugs:
+ This is the link for reporting bugs:
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599}
\end_inset
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599}
\end_inset
there must be some users.
So it's not exactly easy to find a new bug.
there must be some users.
So it's not exactly easy to find a new bug.
- If you find one we need it:
+ If you find one we need it:
\emph on
reporting bugs is good
\emph default
\emph on
reporting bugs is good
\emph default
\begin_layout Standard
Like bug reports feature requests are forwarded to the developer mailing
list.
\begin_layout Standard
Like bug reports feature requests are forwarded to the developer mailing
list.
- This is the link for requesting features:
+ This is the link for requesting features:
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
\end_inset
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-You need to specify some parameters to the
+You need to specify some parameters to the
\family typewriter
diff
\family default
command for the patches to be useful.
If you modified more than one file a patch created f.e.
\family typewriter
diff
\family default
command for the patches to be useful.
If you modified more than one file a patch created f.e.
\family sans
\series bold
\family sans
\series bold
\family default
\series default
\family default
\series default
- will be fine, otherwise
+ will be fine, otherwise
\family sans
\series bold
\family sans
\series bold
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-These links should take you directly to the
+These links should take you directly to the
\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
\end_inset
\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
\end_inset
\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
\end_inset
\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
\end_inset
in the Subversion repository
\size footnotesize
in the Subversion repository
\size footnotesize
\begin_inset LatexCommand \htmlurl{http://sdcc.svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog}
\end_inset
\begin_inset LatexCommand \htmlurl{http://sdcc.svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\family sans
\series bold
sdcc -
\family sans
\series bold
sdcc -
number.
Subversion allows to download the source of recent or previous versions
number.
Subversion allows to download the source of recent or previous versions
\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599}
\end_inset
\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599}
\end_inset
but as this was fixed a while ago, the current problem is that another
excuse has to be found.
Kidding aside, we have to get better there! On the other hand there are
but as this was fixed a while ago, the current problem is that another
excuse has to be found.
Kidding aside, we have to get better there! On the other hand there are
- daily snapshots available at
+ daily snapshots available at
\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
\end_inset
, and you can always build the very last version (hopefully with many bugs
\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
\end_inset
, and you can always build the very last version (hopefully with many bugs
- fixed, and features added) from the source code available at
+ fixed, and features added) from the source code available at
\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
\end_inset
\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.wiki.sourceforge.net/}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.wiki.sourceforge.net/}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-You'll find some small examples in the directory
+You'll find some small examples in the directory
\emph on
sdcc/device/examples/.
\emph on
sdcc/device/examples/.
\emph default
More examples and libraries are available at
\emph on
\emph default
More examples and libraries are available at
\emph on
- The SDCC Open Knowledge Resource
+ The SDCC Open Knowledge Resource
\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/}
\end_inset
\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/}
\end_inset
\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/}
\end_inset
\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/}
\end_inset
\begin_layout Standard
The compiler is passed through snaphot build compile and build checks.
\begin_layout Standard
The compiler is passed through snaphot build compile and build checks.
\shape italic
regression tests
\shape default
\shape italic
regression tests
\shape default
The regression test suite comprises more than 100 files which expand to
more than 500 test cases which include more than 4500 tests.
The results of these tests are published daily on SDCC's snapshot page
The regression test suite comprises more than 100 files which expand to
more than 500 test cases which include more than 4500 tests.
The results of these tests are published daily on SDCC's snapshot page
- (click on the red or green symbols on the right side of
+ (click on the red or green symbols on the right side of
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-There is a separate document
+There is a separate document
\begin_inset LatexCommand \index{Test suite}
\end_inset
\shape default
\begin_inset LatexCommand \index{Test suite}
\end_inset
\shape default
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
\end_inset
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-You'll find the test code in the directory
+You'll find the test code in the directory
\shape italic
sdcc/support/regression
\shape default
.
\shape italic
sdcc/support/regression
\shape default
.
- You can run these tests manually by running
+ You can run these tests manually by running
\family sans
make
\family default
in this directory (or f.e.
\family sans
make
\family default
in this directory (or f.e.
\family sans
\series bold
\family sans
\series bold
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The PIC14 port uses a different set of regression tests
+The PIC14 port uses a different set of regression tests
\begin_inset LatexCommand \index{Regression test (PIC14)}
\end_inset
\begin_inset LatexCommand \index{Regression test (PIC14)}
\end_inset
-, you'll find them in the directory
+, you'll find them in the directory
\shape italic
sdcc/src/regression
\shape default
\shape italic
sdcc/src/regression
\shape default
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
highly
\emph default
\emph on
highly
\emph default
\end_layout
\begin_layout Enumerate
\end_layout
\begin_layout Enumerate
-give students a chance to understand the
+give students a chance to understand the
\emph on
complete
\emph default
\emph on
complete
\emph default
\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm}
\end_inset
\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm}
\end_inset
\begin_layout Enumerate
be able to insert excursions about skills like using a revision control
system, submitting/applying patches, using a type-setting (as opposed to
\begin_layout Enumerate
be able to insert excursions about skills like using a revision control
system, submitting/applying patches, using a type-setting (as opposed to
- word-processing) engine LyX/LaTeX, using
+ word-processing) engine LyX/LaTeX, using
\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net}
\end_inset
\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net}
\end_inset
\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette}
\end_inset
\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette}
\end_inset
\newline
And if there should be a shortage of ideas then you can always point students
\newline
And if there should be a shortage of ideas then you can always point students
- to the ever-growing feature request list
+ to the ever-growing feature request list
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
\end_inset
\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
\end_inset
\begin_layout Enumerate
not tie students to a specific host platform and instead allow them to use
\begin_layout Enumerate
not tie students to a specific host platform and instead allow them to use
\emph on
their
\emph default
choice (among them Alpha, i386, i386_64, Mac OS X, Mips, Sparc, Windows
\emph on
their
\emph default
choice (among them Alpha, i386, i386_64, Mac OS X, Mips, Sparc, Windows
\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org}
\end_inset
\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org}
\end_inset
\begin_layout Standard
SDCC performs a host of standard optimizations in addition to some MCU specific
optimizations.
\begin_layout Standard
SDCC performs a host of standard optimizations in addition to some MCU specific
optimizations.
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The compiler does local and
+The compiler does local and
\end_layout
\begin_layout Verse
\family typewriter
\end_layout
\begin_layout Verse
\family typewriter
\newline
j = x + y;
\end_layout
\newline
j = x + y;
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
j = iTemp;
\end_layout
\newline
j = iTemp;
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
a->b[i].d = 11;
\end_layout
\newline
a->b[i].d = 11;
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
iTemp.d = 11;
\end_layout
\newline
iTemp.d = 11;
\end_layout
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
global = 1;\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
global = 1;\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
global = 3;\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
global = 3;\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
}
\end_layout
\begin_layout Standard
\newline
}
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Verse
\family typewriter
\end_layout
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Two types of loop optimizations are done by SDCC
+Two types of loop optimizations are done by SDCC
\emph on
loop invariant
\emph default
\emph on
loop invariant
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-for (i = 0 ; i < 100 ; i ++)
+for (i = 0 ; i < 100 ; i ++)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-for (i = 0; i < 100; i++)
+for (i = 0; i < 100; i++)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_layout Standard
This optimization is done to reduce the overhead of checking loop boundaries
for every iteration.
\begin_layout Standard
This optimization is done to reduce the overhead of checking loop boundaries
for every iteration.
- Some simple loops can be reversed and implemented using a
+ Some simple loops can be reversed and implemented using a
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes eld
\end_inset
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-The 'for' loop is of the form
+The 'for' loop is of the form
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
-The <for body> does not contain
+The <for body> does not contain
\begin_inset Quotes eld
\end_inset
\begin_inset Quotes eld
\end_inset
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
i /= 2;\InsetSpace ~
\InsetSpace ~
\newline
i /= 2;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-i =
- j - j;\InsetSpace ~
+i
+ = j - j;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
i = j / 1;\InsetSpace ~
\InsetSpace ~
\newline
i = j / 1;\InsetSpace ~
\InsetSpace ~
.
It makes the decision based on an estimate of the generated code size.
.
It makes the decision based on an estimate of the generated code size.
- SDCC is quite liberal in the requirements for jump table generation:
+ SDCC is quite liberal in the requirements for jump table generation:
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 0: ...
\InsetSpace ~
\InsetSpace ~
case 0: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 1: ...
\InsetSpace ~
\InsetSpace ~
case 1: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 4: ...
\InsetSpace ~
\InsetSpace ~
case 4: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 5: ...
\InsetSpace ~
\InsetSpace ~
case 5: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 6: ...
\InsetSpace ~
\InsetSpace ~
case 6: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 7: ...
\InsetSpace ~
\InsetSpace ~
case 7: ...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-case
- 11: ...\InsetSpace ~
+case 11: ...\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
case 8: ...
\InsetSpace ~
\InsetSpace ~
case 8: ...
\newline
}\InsetSpace ~
\InsetSpace ~
\newline
}\InsetSpace ~
\InsetSpace ~
If the case labels are not in numerical sequence ('gaps' between cases)
SDCC checks whether a jump table with additionally inserted dummy cases
is still attractive.
If the case labels are not in numerical sequence ('gaps' between cases)
SDCC checks whether a jump table with additionally inserted dummy cases
is still attractive.
\end_layout
\begin_layout Itemize
\end_layout
\begin_layout Itemize
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
case 1: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 1: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 2: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 2: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 3: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 3: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 4: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 4: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 5: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 5: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 6: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 6: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 7: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 7: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
case 102: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 102: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 103: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 103: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 104: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 104: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 105: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 105: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 106: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 106: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 107: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 107: ...
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
case 1: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 1: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 2: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 2: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 3: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 3: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 4: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 4: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 5: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 5: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 6: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 6: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 7: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 7: ...
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
case 101: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 101: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 102: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 102: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 103: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 103: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 104: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 104: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 105: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 105: ...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
case 107: ...
\newline
\InsetSpace ~
\InsetSpace ~
case 107: ...
- can be used to turn off checking the
+ can be used to turn off checking the
\emph on
bound
\emph default
\emph on
bound
\emph default
unsigned char i;
\newline
...
unsigned char i;
\newline
...
\family typewriter
mov\InsetSpace ~
\family typewriter
mov\InsetSpace ~
\newline
anl\InsetSpace ~
\newline
anl\InsetSpace ~
\newline
mov\InsetSpace ~
_i,a
\newline
mov\InsetSpace ~
_i,a
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\family typewriter
mov\InsetSpace ~
\InsetSpace ~
\family typewriter
mov\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\newline
clr\InsetSpace ~
\InsetSpace ~
\newline
clr\InsetSpace ~
\InsetSpace ~
\newline
rrc\InsetSpace ~
\InsetSpace ~
\newline
rrc\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-/* unsigned is needed for rotation */
+/* unsigned is needed for rotation */
-i = ((i << 1) | (i >> 7));
+i = ((i << 1) | (i >> 7));
\family typewriter
mov\InsetSpace ~
\InsetSpace ~
\family typewriter
mov\InsetSpace ~
\InsetSpace ~
\newline
rl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
rl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\newline
mov\InsetSpace ~
\InsetSpace ~
\begin_layout Standard
SDCC uses pattern matching on the parse tree to determine this operation.Variatio
\begin_layout Standard
SDCC uses pattern matching on the parse tree to determine this operation.Variatio
-ns of this case will also be recognized as bit-rotation, i.e.:
+ns of this case will also be recognized as bit-rotation, i.e.:
\end_layout
\begin_layout Verse
\end_layout
\begin_layout Verse
\series default
\InsetSpace ~
\InsetSpace ~
\series default
\InsetSpace ~
\InsetSpace ~
\series default
\InsetSpace ~
\InsetSpace ~
\series default
\InsetSpace ~
\InsetSpace ~
-i = ((i << 4) | (i >> 4));
+i = ((i << 4) | (i >> 4));
\family default
\newline
\family typewriter
\family default
\newline
\family typewriter
-j = ((j << 8) | (j >> 8));
+j = ((j << 8) | (j >> 8));
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset Quotes sld
\end_inset
\begin_inset Quotes sld
\end_inset
\end_inset
example can be used to convert from little to big-endian or vice versa.
\end_inset
example can be used to convert from little to big-endian or vice versa.
- If you want to change the endianness of a
+ If you want to change the endianness of a
\emph on
signed
\emph default
\emph on
signed
\emph default
- integer you have to cast to
+ integer you have to cast to
\family typewriter
(unsigned int)
\family default
\family typewriter
(unsigned int)
\family default
\begin_layout Standard
Usually 8-bit processors don't care much about endianness.
This is not the case for the standard 8051 which only has an instruction
\begin_layout Standard
Usually 8-bit processors don't care much about endianness.
This is not the case for the standard 8051 which only has an instruction
\emph on
dptr
\emph default
\emph on
dptr
\emph default
--datapointerso little-endian is the more efficient byte order.
+-datapointer
+\emph on
+
+\emph default
+so little-endian is the more efficient byte order.
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-unsigned char hob1, aob1;
+unsigned char hob1, aob1;
\newline
\InsetSpace ~
\InsetSpace ~
bit hob2, hob3, aob2,
\newline
\InsetSpace ~
\InsetSpace ~
bit hob2, hob3, aob2,
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-hob1 = (gint >> 15) & 1;
+hob1 = (gint >> 15) & 1;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-hob2 = (gint >> 15) & 1;
+hob2 = (gint >> 15) & 1;
\newline
\InsetSpace ~
\InsetSpace ~
hob3 = gint & 0x8000;
\newline
\InsetSpace ~
\InsetSpace ~
hob3 = gint & 0x8000;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-aob1
- = (gint >> 9) & 1;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
..
\newline
\InsetSpace ~
\InsetSpace ~
..
\InsetSpace ~
\InsetSpace ~
61 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
61 ;\InsetSpace ~
\newline
000A E5*01\InsetSpace ~
\InsetSpace ~
\newline
000A E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
000C 23\InsetSpace ~
\InsetSpace ~
\newline
000C 23\InsetSpace ~
\InsetSpace ~
rl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
000D 54 01\InsetSpace ~
\InsetSpace ~
\newline
000D 54 01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
64\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
64\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
anl\InsetSpace ~
\InsetSpace ~
anl\InsetSpace ~
\InsetSpace ~
\newline
000F F5*02\InsetSpace ~
\InsetSpace ~
\newline
000F F5*02\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
66 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
66 ;\InsetSpace ~
\newline
0011 E5*01\InsetSpace ~
\InsetSpace ~
\newline
0011 E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
67\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
67\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
0013 33\InsetSpace ~
\InsetSpace ~
\newline
0013 33\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rlc\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rlc\InsetSpace ~
\InsetSpace ~
\newline
0014 92*00\InsetSpace ~
\InsetSpace ~
\newline
0014 92*00\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
_foo_hob2_1_1,c
mov\InsetSpace ~
\InsetSpace ~
_foo_hob2_1_1,c
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
66 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
66 ;\InsetSpace ~
\newline
0016 E5*01\InsetSpace ~
\InsetSpace ~
\newline
0016 E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
0018 33\InsetSpace ~
\InsetSpace ~
\newline
0018 33\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rlc\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rlc\InsetSpace ~
\InsetSpace ~
\newline
0019 92*01\InsetSpace ~
\InsetSpace ~
\newline
0019 92*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
69\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
69\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
70 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
70 ;\InsetSpace ~
\newline
001B E5*01\InsetSpace ~
\InsetSpace ~
\newline
001B E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rr\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rr\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
001E 54 01\InsetSpace ~
\InsetSpace ~
\newline
001E 54 01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
73\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
73\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
anl\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
anl\InsetSpace ~
\InsetSpace ~
\newline
0020 F5*03\InsetSpace ~
\InsetSpace ~
\newline
0020 F5*03\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
_foo_aob1_1_1,a
mov\InsetSpace ~
\InsetSpace ~
_foo_aob1_1_1,a
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
75 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
75 ;\InsetSpace ~
\newline
0022 E5*01\InsetSpace ~
\InsetSpace ~
\newline
0022 E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
76\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
76\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
0024 13\InsetSpace ~
\InsetSpace ~
\newline
0024 13\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rrc\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
rrc\InsetSpace ~
\InsetSpace ~
\newline
0025 92*02\InsetSpace ~
\InsetSpace ~
\newline
0025 92*02\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
78\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
78\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
- 79
- ;\InsetSpace ~
- hob.c 12
+ 79 ;\InsetSpace ~
+ hob.c 12
\newline
0027 E5*01\InsetSpace ~
\InsetSpace ~
\newline
0027 E5*01\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
+0029
+ A2 E3\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
-002B
- 92*03\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Other variations of these cases however will
+Other variations of these cases however will
\emph on
not
\emph default
\emph on
not
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-unsigned long int glong;
+unsigned long int glong;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-unsigned char hob1, hob2;
+unsigned char hob1,
+ hob2;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-unsig
-ned int how1, how2;
+unsigned int how1, how2;
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-hob1 = (gint >> 8) & 0xFF;
+hob1 = (gint >> 8) & 0xFF;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
-how1 = (glong
- >> 16) & 0xFFFF;
+how1 = (glong >> 16) & 0xFFFF;
+
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
..
\newline
\InsetSpace ~
\InsetSpace ~
..
\InsetSpace ~
\InsetSpace ~
91 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
91 ;\InsetSpace ~
\newline
0037 85*01*06\InsetSpace ~
\InsetSpace ~
\newline
0037 85*01*06\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
- _foo_hob1_1_1,(_gint + 1)
+ _foo_hob1_1_1,(_gint + 1)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
93 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
93 ;\InsetSpace ~
-003A
- 85*05*07\InsetSpace ~
+003A 85*05*07\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
- _foo_hob2_1_1,(_glong + 3)
+ _foo_hob2_1_1,(_glong + 3)
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
95 ;\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
95 ;\InsetSpace ~
\newline
003D 85*04*08\InsetSpace ~
\InsetSpace ~
\newline
003D 85*04*08\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
96\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
96\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
- _foo_how1_1_1,(_glong + 2)
+ _foo_how1_1_1,(_glong + 2)
\newline
0040 85*05*09\InsetSpace ~
\InsetSpace ~
\newline
0040 85*05*09\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
- (_foo_how1_1_1 + 1),(_glong
- + 3)
+ (_foo_how1_1_1 +
+ 1),(_glong + 3)
\newline
0043 85*03*0A\InsetSpace ~
\InsetSpace ~
\newline
0043 85*03*0A\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
- _foo_how2_1_1,(_glong + 1)
+ _foo_how2_1_1,(_glong + 1)
\newline
0046 85*04*0B\InsetSpace ~
\InsetSpace ~
\newline
0046 85*04*0B\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
99\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
99\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
mov\InsetSpace ~
\InsetSpace ~
-
- (_foo_how2_1_1 + 1),(_glong + 2)
+ (_foo_how2_1_1 + 1),(_glong + 2)
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Again, variations of these cases may
+Again, variations of these cases may
\emph on
not
\emph default
\emph on
not
\emph default
\begin_layout Standard
The compiler uses a rule based, pattern matching and re-writing mechanism
for peep-hole optimization.
\begin_layout Standard
The compiler uses a rule based, pattern matching and re-writing mechanism
for peep-hole optimization.
\emph on
copt
\emph default
\emph on
copt
\emph default
@\InsetSpace ~
microsoft.com).
A default set of rules are compiled into the compiler, additional rules
@\InsetSpace ~
microsoft.com).
A default set of rules are compiled into the compiler, additional rules
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
mov a,r1
\end_layout
\newline
mov a,r1
\end_layout
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Note: All occurrences of a
+Note: All occurrences of a
\emph on
%n
\emph default
\emph on
%n
\emph default
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
mov a,r2
\end_layout
\newline
mov a,r2
\end_layout
\newline
Other special case optimizations may be added by the
\newline
Other special case optimizations may be added by the
\emph on
-
\begin_inset ERT
\emph on
-
\begin_inset ERT
\family typewriter
ajmp
\family default
\family typewriter
ajmp
\family default
\family typewriter
acall
\family default
.
\family typewriter
acall
\family default
.
- The following two rules will change all
+ The following two rules will change all
\family typewriter
ljmp
\family default
\family typewriter
ljmp
\family default
\family typewriter
lcall
\family default
\family typewriter
lcall
\family default
\family typewriter
ajmp
\family default
\family typewriter
ajmp
\family default
\family typewriter
acall
\end_layout
\family typewriter
acall
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-replace { lcall %1 } by { acall %1 }
+replace { lcall %1 } by { acall %1 }
\newline
replace { ljmp %1 } by { ajmp %1 }
\end_layout
\newline
replace { ljmp %1 } by { ajmp %1 }
\end_layout
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\emph on
inline-assembler code
\emph default
\emph on
inline-assembler code
\emph default
\family typewriter
rule := replace [ restart ] '{' <assembly sequence> '
\backslash
\family typewriter
rule := replace [ restart ] '{' <assembly sequence> '
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
'}' by '{' '
\backslash
\InsetSpace ~
'}' by '{' '
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
<assembly sequence> '
\backslash
\InsetSpace ~
<assembly sequence> '
\backslash
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
'}' [if <functionName> ] '
\backslash
\InsetSpace ~
'}' [if <functionName> ] '
\backslash
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
push ar1
\end_layout
\newline
push ar1
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
push ar1
\end_layout
\newline
push ar1
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
; nop
\end_layout
\newline
; nop
\end_layout
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\begin_layout Standard
The optimizer does a look-up of a function name table defined in function
\begin_layout Standard
The optimizer does a look-up of a function name table defined in function
\emph on
callFuncByName
\emph default
\emph on
callFuncByName
\emph default
- in the source file SDCCpeeph.c, with the name
+ in the source file SDCCpeeph.c, with the name
\emph on
labelInRange
\emph default
.
If it finds a corresponding entry the function is called.
Note there can be no parameters specified for these functions, in this
\emph on
labelInRange
\emph default
.
If it finds a corresponding entry the function is called.
Note there can be no parameters specified for these functions, in this
\emph on
%5
\emph default
\emph on
%5
\emph default
- is crucial, since the function
+ is crucial, since the function
\emph on
labelInRange
\emph default
\emph on
labelInRange
\emph default
g the variable bindings is passed as a parameter).
If you want to code more such functions, take a close look at the function
labelInRange and the calling mechanism in source file SDCCpeeph.c.
g the variable bindings is passed as a parameter).
If you want to code more such functions, take a close look at the function
labelInRange and the calling mechanism in source file SDCCpeeph.c.
- Currently implemented are
+ Currently implemented are
\emph on
labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption,
\emph on
labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption,
- 24bitMode, portIsDS390, 24bitModeAndPortDS390
+ 24bitMode, portIsDS390, 24bitModeAndPortDS390
\emph default
and
\emph on
\emph default
and
\emph on
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-The latest publically available version of the standard
+The latest publically available version of the standard
- ISO/IEC 9899 - Programming languages - C
+ISO/IEC 9899 - Programming languages - C
- should be available at:
+ should be available at:
\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
\end_inset
\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
\end_inset
- unless explicitly declared as such or the
+ unless explicitly declared as such or the
\series bold
-
\begin_inset ERT
\series bold
-
\begin_inset ERT
\family typewriter
struct s { ...
\family typewriter
struct s { ...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-s1 = s2 ; /* is invalid in SDCC although allowed
- in ANSI */
+s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\series default
s parms) /* invalid in SDCC although allowed in ANSI */
\newline
\series default
s parms) /* invalid in SDCC although allowed in ANSI */
\newline
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
struct s rets;
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
struct s rets;
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
-return
- rets; /* is invalid in SDCC although allowed in ANSI */
+return rets; /* is invalid in SDCC although allowed in ANSI */
-' precision floating point
+' precision floating point
\begin_inset LatexCommand \index{Floating point support}
\end_inset
\begin_inset LatexCommand \index{Floating point support}
\end_inset
\begin_layout Verse
\family typewriter
\begin_layout Verse
\family typewriter
-foo(i,j) /* this old style of function declarations */
+foo(i,j) /* this old style of function declarations */
\newline
int i,j; /* is valid
\newline
int i,j; /* is valid
- in ANSI but not valid in SDCC */
+ in ANSI but not valid in SDCC */
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
\newline
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
...
int increment (int a) { return a+1; } /* inlines the increment without
function call overhead */
\newline
int increment (int a) { return a+1; } /* inlines the increment without
function call overhead */
\newline
\series bold
restrict
\begin_inset LatexCommand \index{inline (not supported)}
\series bold
restrict
\begin_inset LatexCommand \index{inline (not supported)}
\end_deeper
\begin_layout Itemize
Certain words that are valid identifiers in the standard may be reserved
\end_deeper
\begin_layout Itemize
Certain words that are valid identifiers in the standard may be reserved
- words in SDCC unless the
+ words in SDCC unless the
\begin_inset ERT
status collapsed
\begin_inset ERT
status collapsed
code in a function.
Large functions can have low complexity, and small functions can have large
complexity levels.
code in a function.
Large functions can have low complexity, and small functions can have large
complexity levels.
\begin_inset LatexCommand \url{http://sdcc.wiki.sourceforge.net/SDCC+internals+and+porting}
\end_inset
\begin_inset LatexCommand \url{http://sdcc.wiki.sourceforge.net/SDCC+internals+and+porting}
\end_inset
\begin_inset LatexCommand \url{http://sf.net/mailarchive/message.php?msg_id=13954144}
\end_inset
\begin_inset LatexCommand \url{http://sf.net/mailarchive/message.php?msg_id=13954144}
\end_inset
\shape italic
This is an excerpt from an article published in Circuit Cellar Magazine
\shape italic
This is an excerpt from an article published in Circuit Cellar Magazine
\series bold
August 2000
\series default
\series bold
August 2000
\series default
The current version of SDCC can generate code for Intel 8051 and Z80 MCU.
It is fairly easy to retarget for other 8-bit MCU.
Here we take a look at some of the internals of the compiler.
The current version of SDCC can generate code for Intel 8051 and Z80 MCU.
It is fairly easy to retarget for other 8-bit MCU.
Here we take a look at some of the internals of the compiler.
\end_layout
\begin_layout Paragraph*
\end_layout
\begin_layout Paragraph*
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
basic block being processed, if there are any found then it will push that
operand and use the registers in this block, the operand will then be popped
at the end of the basic block.
basic block being processed, if there are any found then it will push that
operand and use the registers in this block, the operand will then be popped
at the end of the basic block.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
example, the z80 port does not use registers to pass parameters so the
SEND and RECV iCode operations will not be generated, and it also does
not support JUMPTABLES.
example, the z80 port does not use registers to pass parameters so the
SEND and RECV iCode operations will not be generated, and it also does
not support JUMPTABLES.
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_inset Tabular
<lyxtabular version="3" rows="39" columns="4">
<features islongtable="true" headBottomDL="true">
\begin_inset Tabular
<lyxtabular version="3" rows="39" columns="4">
<features islongtable="true" headBottomDL="true">
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-Pop the operand from the stack
+Pop the operand from the stack
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-Call the function represented by IC_LEFT
+Call the function represented by IC_LEFT
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-Return the value in operand IC_LEFT
+Return the value in operand IC_LEFT
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_RESULT = IC_LEFT - IC_RIGHT
+IC_RESULT = IC_LEFT - IC_RIGHT
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_LEFT() IC_RIGHT() IC_RESULT()
+IC_LEFT() IC_RIGHT() IC_RESULT()
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_RESULT = IC_LEFT && IC_RIGHT;
+IC_RESULT = IC_LEFT && IC_RIGHT;
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_LEFT() IC_RIGHT() IC_RESULT()
+IC_LEFT() IC_RIGHT() IC_RESULT()
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_RESULT = IC_LEFT || IC_RIGHT;
+IC_RESULT = IC_LEFT || IC_RIGHT;
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_LEFT() IC_RIGHT() IC_RESULT()
+IC_LEFT() IC_RIGHT() IC_RESULT()
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_LEFT() IC_RIGHT() IC_RESULT()
+IC_LEFT() IC_RIGHT() IC_RESULT()
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_RESULT = IC_LEFT << IC_RIGHT
+IC_RESULT = IC_LEFT << IC_RIGHT
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-IC_RESULT = IC_LEFT >> IC_RIGHT
+IC_RESULT = IC_LEFT >> IC_RIGHT
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\size footnotesize
Conditional jump.
If true label is present then jump to true label if condition is true else
\size footnotesize
Conditional jump.
If true label is present then jump to true label if condition is true else
- jump to false label if condition is false
+ jump to false label if condition is false
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-if (IC_COND) goto IC_TRUE;
+if (IC_COND) goto IC_TRUE;
\newline
\InsetSpace ~
\InsetSpace ~
\newline
\InsetSpace ~
\InsetSpace ~
\newline
If (!IC_COND) goto IC_FALSE;
\end_layout
\newline
If (!IC_COND) goto IC_FALSE;
\end_layout
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-This is used for passing parameters in registers;
+This is used for passing parameters in registers;
\newline
move IC_LEFT to the next
available parameter register.
\newline
move IC_LEFT to the next
available parameter register.
This is used for receiving parameters passed in registers;
\newline
Move the values
This is used for receiving parameters passed in registers;
\newline
Move the values
- in the next parameter register to IC_RESULT
+ in the next parameter register to IC_RESULT
\shape slanted
\size footnotesize
see f.e.
\shape slanted
\size footnotesize
see f.e.
\family typewriter
gen51Code()
\family default
\family typewriter
gen51Code()
\family default
\family typewriter
src/mcs51/gen.c
\end_layout
\family typewriter
src/mcs51/gen.c
\end_layout
status collapsed
\begin_layout Standard
status collapsed
\begin_layout Standard
-In the original article Figure II was announced to be downloadable on
+In the original article Figure II was announced to be downloadable on
\shape italic
Circuit Cellar
\shape default
\shape italic
Circuit Cellar
\shape default
11.\InsetSpace ~
\InsetSpace ~
while (*x) *x++
11.\InsetSpace ~
\InsetSpace ~
while (*x) *x++
\newline
12.\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
12.\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\InsetSpace ~
\newline
13.\InsetSpace ~
\InsetSpace ~
\newline
13.\InsetSpace ~
\InsetSpace ~
\newline
14.\InsetSpace ~
\InsetSpace ~
\newline
14.\InsetSpace ~
\InsetSpace ~
-/* compiler detects i,j to be induction variables
- */
+/* compiler detects i,j to be induction
+ variables */
\newline
15.\InsetSpace ~
\InsetSpace ~
\newline
15.\InsetSpace ~
\InsetSpace ~
\newline
As mentioned earlier the live ranges are computed in terms of the execution
\newline
As mentioned earlier the live ranges are computed in terms of the execution
- sequence number of the iCodes, for example
+ sequence number of the iCodes, for example
\newline
the iTemp0 is live from (i.e.
first defined in iCode with execution sequence number 3, and is last used
\newline
the iTemp0 is live from (i.e.
first defined in iCode with execution sequence number 3, and is last used
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-Sample.c(11:3:2:0) iTemp0 [lr3:5]{_near * int}[r2] = recv
+Sample.c(11:3:2:0) iTemp0 [lr3:5]{_near * int}[r2] = recv
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-; iTemp0 [lr3:5]{_near * int}[r2] = recv
+; iTemp0 [lr3:5]{_near * int}[r2] = recv
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-; iTemp6 [lr5:16]{_near * int}[r0] =
+; iTemp6 [lr5:16]{_near * int}[r0] =
\end_layout
\begin_layout Standard
\size footnotesize
\end_layout
\begin_layout Standard
\size footnotesize
-; iTemp6 [lr5:16]{_near * int}[r0] +
+; iTemp6 [lr5:16]{_near * int}[r0] +
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-; iTemp2 [lr18:40]{short}[r2] = iTemp2 [lr18:40]{short}[r2] +
+; iTemp2 [lr18:40]{short}[r2] = iTemp2 [lr18:40]{short}[r2] +
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_layout Standard
\size footnotesize
\begin_layout Standard
\size footnotesize
-; iTemp11 [lr19:40]{short}[r3] = iTemp11 [lr19:40]{short}[r3] +
+; iTemp11 [lr19:40]{short}[r3] = iTemp11 [lr19:40]{short}[r3] +
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\begin_inset LatexCommand \url{http://www.sf.net}
\end_inset
\begin_inset LatexCommand \url{http://www.sf.net}
\end_inset
\end_inset
of their respective companies.
\end_inset
of their respective companies.
\end_layout
\begin_layout Section*
\end_layout
\begin_layout Section*